如何在 Vim 中将“.w”评估的结果插入到行尾?

如何在 Vim 中将“.w”评估的结果插入到行尾?

我希望能够在 Vim 中评估一行 Javascript(或其他代码),并将结果显示在行末的注释中。

例如,如果我有如下文件:

console.log(4 + 5);

并且我的光标在该行上,并且我使用命令:.w !node -e,结果“ 9”将出现在下面的缓冲区中。如果我使用:. !node -e,则整行将被结果替换9

我怎样才能创建一个命令,将结果附加到注释中的行尾,如下所示:

console.log(4 + 5);    // 9

还要注意的是,使用:r将在下一行打印传递给它的任何内容。将在光标下方的行中r !echo "This is text."插入“ ”。但是像这样的命令...This is text.

:r ". !node -e"

...将尝试以文件而不是命令的形式读取". !node -e";我不太理解这种行为,但它让事情变得不那么直观。

我希望最终结果能让人联想到 Atom 文本编辑器处理 Hydrogen 内核的方式,代码 eval 的结果会出现在代码的左侧。计划是创建一个键绑定(<C-Enter><F5>)来自动评估当前行并显示结果。

答案1

如果你的行看起来像:4+5=你可以使用类似的东西:

 :map "_ay/=^Mo^[!!echo ^Ra \| bc^MkJ
  1. _........... 跳转到实际行的开头
  2. “哎/=^M... 将 = 拖入缓冲区 a
  3. o^[........... 新建一个空行
  4. !!..........启动一个 shell 程序将结果写入此新行
  5. ^拉..........在命令中插入缓冲区a的内容:回显 ^Ra \| bc^M
  6. .............. 转到上一行
  7. J.............. 将下一行(结果)连接到当前行
  8. 也许你想删除空白从加入X

我希望你就是这样的人。

答案2

感谢 Horst 的建议,我能够解析如何让 Vim 使用任何具有“评估”命令行选项的语言来执行此操作。对于 JavaScript,我整理的命令如下:

imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi
nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ

具体细节如下:

  1. 对于INSERT模式映射,Escape ( ^[) 返回正常模式。
  2. _"ay$将整行放入寄存器中a
  3. o//^[kJ添加“//”作为注释。
  4. o^[开始另一条新线。
  5. !!node -e "^Ra"^M通过Node.js运行寄存器(该行)并在当前行返回结果。
  6. 最后,kJ将这一新行拉回到第一行作为注释。
  7. (对于INSERT模式,再次返回从到的i模式。)NORMALINSERT

只需进行少量修改即可对 Python 进行同样的操作:

imap <F5> ^[_"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJi
nmap <F5> _"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJ

为此,//注释被替换为 Python 的#。此外,我自动导入math模块,因为这样对于快速计算非常有用。

我的建议是将每个映射放在各自的~/.vim/ftplugin/<language>.vim文件中,然后放在set ftplugin on你的 中.vimrc。这样可以根据您使用的语言更改映射!

我希望任何想要在 Vim 中交互运行代码的人都能找到它,甚至可能改进它。巨大的“谢谢!”霍斯特回答这个问题并启动这个小项目!

相关内容