2012-07-19 42 views
6

我想定義一個在特定時間爲用戶輸入而打破的vim宏,這可能嗎?你可以在vim中做交互宏或錄音嗎?

編輯:原來我彪錄音(Q),而不是宏

有可能在一個記錄使用輸入命令,但它更多的麻煩比它的價值。

我第一映射插入輸入逃逸到鑰匙

:map <F2> a<C-R>=input('input: ')<CR> 

然後我在Q寄存器

name: 

使這個記錄,並將其粘貼到一個新的標籤

iname: ^[ 

在最後的逃生之後,我按下了<C-V><F2>使得該行:

iname ^[^[OQ 

我抽回到q緩衝區,然後使用宏,讓我使用輸入函數。 它的工作,但非常可怕。

回答

3

是的。請參閱功能input({prompt}, [, {text} [, {completion}] ])。對話框彈出窗口甚至有 inputdialog({prompt} [, {text} [, {cancelreturn}]])

+0

vim簡直太棒了!是否有任何問題,如「我可以在vim做xxx」,並且沒有答案? :) – moritz 2012-07-19 19:09:53

+0

input()在宏中似乎不可用(甚至不通過'Ctrl-R = input('prompt:')'),但如果你對正常的映射或函數沒有問題,它會很好地完成這項工作。 – mogelbrod 2012-07-19 19:09:55

+0

@VictorHallberg:嗯。只是(重新)嘗試。適用於我(Vim 7.3.547)。以防萬一,_macro_是什麼意思?不是':help macro'解釋了什麼? – fork0 2012-07-19 19:14:05

1

不幸的是,它似乎不可能。您可以在宏內觸發input(),但之後繼續似乎不可能,因爲任何記錄的附加輸入都會插入到輸入提示中。

將該行放入已命名的寄存器("qY)並運行它(@q)以進行嘗試。
注意:用Ctrl-V Ctrl-R/M替換^R^M(請參閱:help i_CTRL-V)。

  • oBEFORE ^R=input('prompt> ')- 工程
  • oBEFORE ^R=input('prompt> ')^Mitest- 作品,但插入itest到提示
  • oBEFORE ^R=input('prompt> ')<CR>test- 如果使用input()映射或宏內部故障
+0

我注意到同樣的事情。如果實現此功能將會很好。 – everett1992 2012-07-19 20:50:32

+0

@ everett1992:它的形式是'inputsave()'和'inputrestore()';看看我的答案。 – 2012-07-20 06:49:17

2

,其餘的字符將被視爲輸入,這不是什麼 你要。 Vim提供了inputsave()inputrestore()函數來暫時從映射字符流中暫停讀取。

根據mogelbrod的回答,這是行不通的;該itest被讀入作爲輸入:

oBEFORE ^R=input('prompt> ')^Mitest 

但這:

function! Input() 
    call inputsave() 
    let text = input('prompt> ') 
    call inputrestore() 
    return text 
endfunction 
oBEFORE ^R=Input()^Mitest 

不幸的是,因爲<C-R>需要一個表達,我們不能把命令行內,但必須定義一個單獨的Input()功能。

相關問題