假设我正在编辑我的_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>
答案 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,因此可以直接使用。