在vim中将当前行发送到外部命令(不捕获)

时间:2011-08-11 09:55:13

标签: vim

目标是将当前行用作TODO并将其发送到某个外部程序。像这样:

:! /usr/bin/todo "content of current line"

我知道过滤命令,但这意味着我想编辑我不想要的当前缓冲区(:。!充当过滤器)。我知道如何使用'%'获取当前文件但是没有任何方法可以获取其他内容?也许通过使用:execute ...

3 个答案:

答案 0 :(得分:33)

:.!用作过滤器,但:.w !(请注意空格!)只是传递输出。见:help :w_c。即。

:.w !/usr/bin/todo -

答案 1 :(得分:3)

您可以将寄存器的内容插入命令行,所以执行以下操作:

"1y$  //yank current row to register 1
: CTRL-R 1  //CTRL-R followed by register id pastes register to command line

应该这样做。

答案 2 :(得分:0)

您可能喜欢这些映射(即保存在.vimrc或粘贴到:提示中):

cmap <C-R>'           <C-R>=shellescape(getline('.'))<CR>
cmap <C-R><C-R>' <C-R><C-R>=shellescape(getline('.'))<CR>

安装完成后,您可以像这样使用它们:

:!/usr/bin/todo ^R'

(输入一个实际的 Control - R ,上面的例子显示^R)。

您可以将它们视为基于registere的Control-R和Control-R Control-R(请参阅:help c_CTRL-R:help c_CTRL-R_CTRL-R)的命令行模式版本,其中“虚构”寄存器'始终包含当前行的shell引用内容。

由于这些映射使用与内置映射相同的前缀(请参阅上面提到的:help主题),因此必须在timeoutlen毫秒内输入最终单引号(请参阅:set timeoutlen?) ,或者它将默认为内置映射(请参阅:help map-typing)。