2012-10-31 38 views
2

我在我的vimrc以下:告訴屏幕窗口運行先前的命令

nnoremap <F1> :!screen -S foo -p run -X stuff '!!^M' 

然而,當點擊F1,我得到的錯誤:沒有前一個命令。

我想要的是在名爲'foo'的屏幕會話中告訴'run'窗口來運行我以前運行的任何程序。

+0

我沒有看到這種現象的一個原因,但你在這裏有兩個誤區:''的'開頭: !ls'將運行命令':!screen -S foo -p run -X stuff'lsls'(無尾隨'''!):1.兩個劉海產生兩個先前的命令和2.'^ M'原始''由''產生')執行':!'命令。你應該使用''! ''。 – ZyX

+1

你究竟跑了什麼? – ZyX

回答

3

如果你的意思是!!由bash的執行(因此「運行無論我在該屏幕的實例前跑」),那麼你要逃避它:

nnoremap <F1> :!screen -S foo -p run -X stuff $'\!\!\n'<CR> 

或使用system()

nnoremap <F1> :call system('screen -S foo -p run -X stuff $''!!\n''')<CR> 

。由於!任何爆炸的thingie的意思是「發生在這裏不管我使用其他爆炸的thingie在vim 跑前」

+0

謝謝。我不知道!在vim中也是以前的命令。使用system()還有一個很好的好處,就是不會強制我輸入額外的Enter。 –

+1

@DatChu可以修改第一個變體,以免強制您按下Enter:在''後面使用':silent!...和''。 – ZyX

0

我會嘗試使用節省一招這樣的歷史文件:http://www.cuberick.com/2008/11/update-bash-history-in-realtime.html

然後,一旦你有一個命令作爲參數的歷史,運行屏幕 - 發現screen dmesg將運行命令和終止。如果你不希望它終止,你會做screen bash -c "dmesg ; bash"(或者你運行的任何shell)。所以,一旦你知道這個技巧,關鍵是把`tail -n1 .bash_history`而不是dmesg。

編輯:

對不起,我後來發現的 「VIM」 的標題。這樣的工作對我來說是這樣的:

:nnoremap <F1> :!screen bash -c " '!!'" 
+0

該死的,對不起,這不是vim。 – d33tah