如何以Vim EX命令执行当前行?

时间:2013-01-17 18:47:16

标签: vim

假设我正在编辑我的_vimrc文件,我刚刚添加了几行,例如新的键映射。我不想重新加载整个文件(:so %),因为这会重置我正在尝试的很多临时内容。我只想运行我目前正在处理的两行。

我没有运气试图将行复制/粘贴到命令缓冲区,因为我不能在那里使用put命令。有什么办法可以将当前行(或当前选择)作为EX命令运行吗?


要点:

Anton Kovalenko的回答和Peter Rincker的评论之后,我最终得到了这些关键地图,如果处于可视模式,则会执行当前行或当前选定的行:

" Execute current line or current selection as Vim EX commands.
nnoremap <F2> :exe getline(".")<CR>
vnoremap <F2> :<C-w>exe join(getline("'<","'>"),'<Bar>')<CR>

8 个答案:

答案 0 :(得分:33)

要将当前行作为ex命令执行,您还可以使用:

yy:@"

这会将当前行拉到“-register并执行它。我不认为输入太多。

答案 1 :(得分:16)

将光标下的行作为Ex命令执行:

:execute getline(".")

方便2行。 (我想弄出一些与地区有关的东西,但我不是vim用户)。对于目前选定的地区,以下似乎可以完成这项工作:

:execute getreg("*")

Peter Rincker所述,此映射可用于执行当前选定的行:

:vnoremap <f2> :<c-u>exe join(getline("'<","'>"),'<bar>')<cr>

答案 2 :(得分:5)

为此,我定义了以下命令和映射:

":[range]Execute    Execute text lines as ex commands.
"                   Handles |line-continuation|.
" The same can be achieved via "zyy@z (or yy@" through the unnamed register);
" but there, the ex command must be preceded by a colon (i.e. :ex)
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z

" [count]<Leader>e  Execute current [count] line(s) as ex commands, then
" {Visual}<Leader>e jump to the following line (to allow speedy sequential
"                   execution of multiple lines).
nnoremap <silent> <Leader>e :Execute<Bar>execute 'normal! ' . v:count1 . 'j'<CR>
xnoremap <silent> <Leader>e :Execute<Bar>execute 'normal! ' . v:count1 . 'j'<CR>

答案 3 :(得分:4)

发布此消息后,我找到了解决办法。我可以使用"*y将文本复制到剪贴板中,然后使用鼠标中键将该文本放入命令缓冲区。这对我有用,但对于没有剪贴板支持,鼠标支持或只是厌恶将手从Vim位置移开的人来说,这几乎不是一个方便的解决方案。

答案 4 :(得分:2)

接受的答案不处理延续部分。另外,令人惊讶的是,不需要条形图,换行也没问题。这将有效,首先将文本拖入寄存器x:

vno <c-x> "xy:exe substitute(@x,"\n\\",'','g')<cr>

正如某人已经提到过的,唯一的例外是“吃掉”新行的命令。例如,执行以上映射:

:sign define piet text=>> texthl=Search 
:exe ":sign place 2 line=23 name=piet file=" . expand("%:p")

会导致vim认为用户正在尝试将textl定义为“Search \ n:exe”:sign place ... etc。

答案 5 :(得分:1)

如果你正在进行大量的实验(尝试将你想要添加到你的vimrc中的东西,我认为?)它可能有助于在像experimental.vim这样的临时文件中这样做,所以你不仅仅是依靠你的历史来了​​解你正在尝试的东西。现在您已经拥有了这些出色的映射,很容易从实验或vimrc重新运行,而无需获取整个文件。

另外(对不起,我似乎无法对答案发表评论),我试过Peter的这个映射:

vnoremap <Leader>es :<c-u>exec join(getline("'<","'>"),'<BAR>')<CR>

这在大多数情况下都有效,但它在功能定义方面失败。

function! TestMe()
  echo "Yay!"
endfunction

此映射将行连接成单个字符串,由<BAR>分隔,然后执行它们。

我不完全确定原因,但如果我尝试在正常模式下使用函数定义:

:exec 'function! TestMe()|  echo "Yay!"|endfunction'
-> E488: Trailing characters

经过一些测试后,我发现它适用于换行分隔符:

:exec "function! TestMe()\n  echo 'Yay!'\nendfunction"
:call TestMe()
-> Yay!

所以,我已将我的映射改为:

vnoremap <Leader>es :<c-u>exec join(getline("'<","'>"),"\n")<CR>

我想有一个vim或ex原因为什么<BAR>方法对函数不起作用(甚至可能是我的一些设置?),我很想知道如果有人知道它是什么

答案 6 :(得分:1)

  

我不想重新加载整个文件(:so%),因为这会重置我正在尝试的很多临时内容。我只想运行我目前正在处理的两行。

如果要执行命令是因为要在将其提交到_.vimrc之前对其进行优化,那么应该使用 q:为Ex模式命令启动命令行窗口。

在启动时,命令行窗口将使用命令行历史记录的内容进行缓冲。它是一个普通的Vim窗口,其内容可以编辑为任何文本缓冲区,除了按下在该行上执行命令的任何行。当你想稍微改变你之前写的长而复杂的命令并重新运行它时,它非常有用。

要为搜索字符串启动“命令行窗口”,请按 q /

答案 7 :(得分:0)

您也可以尝试 :<C-R><C-L><CR>

根据vim文档,该组合会将当前行放入命令行中。从那里,按Enter键即可解决问题。我意识到这不能处理多行情况,但是它不需要.vimrc,因此可以直接使用。