2012-09-28 75 views
3

我有時會發現自己正在編寫文本,其中部分文件是由外部程序生成的。例如,考慮包含vim:執行光標後的其餘行作爲vim命令

/* 
* To regenerate the following data, place the cursor at the beginning 
* of the next line after this comment, then run 
* ma:r!find /foo -name '*.in' | xargs whatever | some complicated processing 
* and merge the result with 
* 'a!}sort -u 
*/ 
some 
generated 
stuff 
here 

我最終使用鼠標來選擇第一命令(ma:...),粘貼&運行它C源文件,等待命令完成,選擇'a!}sort -u並粘貼&運行它。這是不雅的,因爲它只是半自動的,我認爲它可以是全自動的。我閱讀:execute和朋友的vim在線幫助,但它看起來像沒有做我想做的事。我正在考慮用適當的命令填充vim寄存器,然後執行寄存器內容。在線:help registers到目前爲止沒有給出線索。

理想的情況下,新的評論會說像

/* 
* To regenerate the following data, place the cursor on the 'j' on the 
* next line in this comment, then execute it with <SHORT-MAGIC-VIM-INCANTATION> 
* jjma:r!find /foo -name '*.in' | xargs whatever | ...<CR>'a!}sort -u<CR> 
*/ 

如何才能實現這一目標?

回答

4

我會讓防爆處理命令,而不是普通模式命令(例如ma在你的例子中);通過:normal ma很容易執行後者,但是將Ex命令送入普通模式有問題(例如,你如何編碼輸入必須得出結論Ex命令?)

這裏有一個自定義命令:

command! -bar -range ExecuteFromCursor execute 'normal! "zy$' | @z 

而這裏的一個映射:

nnoremap <Leader>e "zy$:@z<CR> 
+1

哦aha。':@ z'用於寄存器比'^ R'寄存器'完成'更容易(也可以描述)+1 – sehe

+0

'nnoremap'不會將光標移動到適當的行。修改修復了這個問題:'「zy $ 2j:@z '。 – Jens

3

編輯 Ingo的執行寄存器的方法比我的更容易(@"而不是<^R>")。

與我的方法相比,我的方法的優點是您有機會在按Enter鍵執行之前像任何其他人一樣交互編輯命令行。

我做

y$:<^R>" 
  • y$猛拉到行尾的
  • :啓動命令模式
  • C-R插入炎ked文本

按Enter鍵,獲利。


我曾經有過類似的東西。但我很懶,經常只做Y並編輯命令行。在Windows中,我發現按住Shift鍵插入 vim的命令行有點順暢,所以我會再使用「+ Y複製到Windows剪貼板上。但是,我離題

+0

難道說在C-v是錯在這裏?當我執行'y $:'''時,被抽出的文本被粘貼到命令模式。 – Jens

+0

@Jens你是對的,我正在做一個映射與'live'執行混淆,修復它。謝謝你的提示 – sehe