2013-01-17 93 views
15

假設我正在編輯我的_vimrc文件,並且我剛剛添加了幾行,例如新的密鑰映射。我不想重新加載整個文件(:so %),因爲這會重置我正在嘗試的很多臨時性內容。我只想運行我目前正在使用的兩條線。如何以Vim EX命令的形式執行當前行?

我沒有試圖將行復制/粘貼到命令緩衝區,因爲我不能在那裏使用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> 
+3

。解決方法是將該行復制到註冊表中([c])' –

+0

的插入,也可以只執行選擇(可能是行的一部分)'vnoremap 「cy: exe getreg !很好的答案。 –

回答

4

剛發佈這個,我找到了一個解決辦法。我可以使用"*y將文本複製到剪貼板中,然後使用鼠標中鍵將該文本放入命令緩衝區。這對我來說很合適,但對於沒有剪貼板支持,鼠標支持或只是厭惡將手從Vim位置移開的人來說,這不太方便。

14

執行下光標線作爲Ex命令:

:execute getline(".") 

方便夠2行。 (我想知道用區域做什麼,但我不是vim用戶) 。而對於當前選擇的區域,下面似乎做的工作:

:execute getreg("*") 

正如Peter Rincker評論說,這個映射可用於執行當前選定的線路:

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

+1確實非常方便,只需要執行[CTRL] + [r] – Hubro

+0

':執行getreg(「。」)似乎不起作用。我嘗試過視覺模式,視覺線,視覺模塊以及帶有和不帶領先的'<,'>'。如果沒有前導''<,'>',則不會發生錯誤,但似乎也沒有執行任何命令。 – Hubro

+0

@Codemonkey'getreg(「*」)'適用於我(不是'getreg(「。」)'!) –

5

對於我定義了以下命令和映射:

":[range]Execute Execute text lines as ex commands. 
"     Handles |line-continuation|. 
" The same can be achieved via "[email protected] (or [email protected]" 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> 
1

如果喲我做了很多試驗(嘗試一下,你可能想添加到你的vimrc中,我假設?)它可能有助於在像trial.vim這樣的臨時文件中這樣做,所以你不僅僅依賴於你的歷史知道你在試用什麼。既然你有了這些優秀的映射,那麼從實驗或者vimrc重新運行一些東西就很容易,而不需要找到整個文件。

而且(很抱歉,我不能解答發表評論,看來),我試過彼得的這種映射:

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> 

我想有一個六或者爲什麼<BAR>方法不能在函數上工作(也許甚至有一些設置我已經在?),我很好奇聽到如果有人知道它是什麼。

1

我不想重新加載整個文件(:so%),因爲這將重置我正在嘗試的很多臨時性的東西。我只想運行我目前正在使用的兩條線。

如果你想,因爲你想提交它_.vimrc之前使之完善,執行命令,那麼你應該啓動一個命令行窗口的防爆模式Q指令:

在啓動時,命令行窗口被命令行歷史內容緩衝。這是一個正常的Vim窗口,其內容可以作爲任何文本緩衝區進行編輯,除了在該行上執行該命令的任何行上按下外。當你想稍微改變你之前編寫的一個長而複雜的命令並重新運行它時,它非常有用。

要爲搜索字符串啓動「命令行窗口」,請按q/

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爲「搜索\ N:EXE」:簽訂地點...等

29

要執行當前行作爲Ex命令,你也可以使用:

yy:@" 

這將當前行猛拉到「-register並執行它,我不認爲這是太多打字

+4

'Y:@「'更短,您可以在Shift鍵上保留一個小指針;) – Wildcard