如何配置vim,使得当我向该进程发送USR1信号时,它会保存并退出(而不是创建.swp恢复文件)?

14

这是我的情况。我有很多个vim进程正在打开。不想一个个地保存并退出(:x!),我想发送一个信号(比如USR1)给所有进程,让它们不创建恢复.swp文件,而是将文件保存并正常退出。

有可能吗?

3个回答

14

并不像简单地向每个vim进程发送信号那么容易,但是您可以利用vim的客户端/服务器特性来实现您想要的结果:

:help remote.txt

(您需要使用已编译了+clientserver选项的vim版本。)

以下是来自vim帮助文档的示例:

vim --servername BLA --remote-send '<C-\><C-N>:wqa<CR>'    

这会向运行为远程服务器 "BLA" 的vim实例发送命令,告诉它保存所有文件并退出。

由于您运行多个vim实例,您可能希望使用--serverlist选项获取所有注册的服务器实例列表,然后可以迭代每个实例发送保存和退出命令。


2
我曾经尝试过这个,似乎需要运行XServer - 这是真的吗还是我错过了什么? - jmetz

3
我从来没有尝试过在vim中处理信号。我不知道是否可以完成。这里有一个可能的替代方案:
选项:只使用一个vim进程
也许,你可以打开gvim(或vim)中的一堆标签页,而不是打开大量的vim进程。这样,当你想退出时,你可以执行:wqa命令(写入并退出所有文件)。
如果在vimrc文件中进行以下设置,则更容易在vim中打开标签页:
:map <C-Insert> :tabnew<C-M>
:map <C-Delete> :tabclose<C-M>
:map <C-PgUp> :tabprev<C-M>
:map <C-PgDown> :tabnext<C-M>

上述绑定将允许使用Ctrl-insert和Ctrl-delete打开和关闭标签,以及使用Ctrl-pgup/pgdown在标签之间移动,就像在Firefox中一样。
如果您想要这些绑定在插入模式下也起作用,可以在您的vimrc文件中添加以下内容。
:imap <C-Insert> <C-o>:tabnew<C-M>
:imap <C-Delete> <C-o>:tabclose<C-M>
:imap <C-PgUp> <C-o>:tabprev<C-M>
:imap <C-PgDown> <C-o>:tabnext<C-M>

1
这个方法可以行得通,但在我的情况下,我倾向于在同一台服务器上打开4-5个屏幕会话(用于不同的项目)。每个屏幕会话可能会有7个vim会话打开... - Philip Hallstrom

0

我只想补充一下,你可以通过使用以下方法使make在后台异步运行

 nnoremap <leader>m : call setqflist([]) \| cclose \| silent execute ":! (make &>~/.vim/cpperr  \|\| vimx --servername DEFAULT --remote-send '\    <C-\\>\<C-N\>:cgetfile ~/.vim/cpperr\<CR\>')&" \| redraw!<CR> 

为了使其正常工作,您必须使用以下方式打开您的文件

vim --servername DEFAULT --remote-silent FILE..

我实际上在我的bashrc中将其设置为vim的别名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接