2

我的 vimrc 中有以下内容:

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

但是,当单击 F1 时,我收到错误:没有先前的命令。

我想要的是告诉屏幕会话中名为“foo”的“运行”窗口运行我之前运行的任何内容。

4

2 回答 2

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>

. 因为在任何 bang thingie 中的意思是“将我之前在 vim 中使用其他 bang thingie!跑过的任何东西放在这里”</p>

于 2012-10-31T19:34:52.063 回答
0

我会尝试使用这样的技巧保存历史文件:http ://www.cuberick.com/2008/11/update-bash-history-in-realtime.html

然后,一旦你有了历史,运行 screen 并将命令作为参数 - 注意screen dmesg将运行命令并终止。如果您不希望它终止,您会这样做screen bash -c "dmesg ; bash"(或您运行的任何外壳程序)。所以,一旦你知道了诀窍,重点是放置 `tail -n1 .bash_history` 而不是 dmesg。

编辑:

抱歉,我后来注意到“vim”标题。这种方式对我有用:

:nnoremap <F1> :!screen bash -c " '!!'"
于 2012-10-31T19:22:01.470 回答