我希望能够在 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
- _........... 跳转到实际行的开头
- “哎/=^M... 将 = 拖入缓冲区 a
- o^[........... 新建一个空行
- !!..........启动一个 shell 程序将结果写入此新行
- ^拉..........在命令中插入缓冲区a的内容:回显 ^Ra \| bc^M
- 钾.............. 转到上一行
- J.............. 将下一行(结果)连接到当前行
- 也许你想删除空白从加入X
我希望你就是这样的人。
答案2
感谢 Horst 的建议,我能够解析如何让 Vim 使用任何具有“评估”命令行选项的语言来执行此操作。对于 JavaScript,我整理的命令如下:
imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi
nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ
具体细节如下:
- 对于
INSERT
模式映射,Escape (^[
) 返回正常模式。 _"ay$
将整行放入寄存器中a
。o//^[kJ
添加“//”作为注释。o^[
开始另一条新线。!!node -e "^Ra"^M
通过Node.js运行寄存器(该行)并在当前行返回结果。- 最后,
kJ
将这一新行拉回到第一行作为注释。 - (对于
INSERT
模式,再次返回从到的i
模式。)NORMAL
INSERT
只需进行少量修改即可对 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 中交互运行代码的人都能找到它,甚至可能改进它。巨大的“谢谢!”霍斯特回答这个问题并启动这个小项目!