通过Shell脚本退出或关闭Vim

4

我正在编写一个脚本文件,需要关闭已打开的vim文件。那么,如何通过shell脚本关闭或退出文件?我尝试了这个解决方案,但没有成功。我是这样尝试的:

vim path_to_file/abc +qa

1
vim 不是一个服务器。它不会监听随机 shell 脚本给出的命令。 - n. m.
1
请提供更多背景信息;你的最终目标是什么?当一个问题只涉及一个小的技术步骤时,很难提供一个好的答案。如果你不告诉我们为什么你想要这个,那么很容易陷入XY问题(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 - Ingo Karkat
我假设你有充分的理由这么做,尽管我认为这并没有太多意义。如果你的 vim 已经打开了 10 个文件,但是它们全部都处于 "已修改但未保存" 的状态,那该怎么办呢?vim 可以执行一些自动文本处理,接受来自 cmd-line 的命令,但这并不是它擅长的。毕竟它只是一个编辑器。如果你真的想这么做,我想(没有测试过),你可以获取 vim 打开你的文件的 pid(使用 lsof),然后杀掉 vim 进程。 - Kent
@n.m. 抱歉——我肯定是误解了什么。我意识到那是从问题中链接过来的;那就是我的观点。 :) 我只是想说那个答案描述了这个问题所要求的内容,但我可能又误解了。 - Ben Klein
@ebenezer 我认为Ingo Karkat的回答是OP所需的(因为vim 显然是一个服务器)。 - n. m.
显示剩余4条评论
1个回答

5
为了从外部shell脚本关闭正在运行的Vim,你需要要么告诉该Vim实例退出,要么让操作系统完成任务。
与Vim通信:
Vim内置了客户端-服务器功能,请参阅::help remote.txt。如果你知道服务器名称(可以使用vim --serverlist获取列表),则可以向其发送命令。例如,这个命令会告诉名为GVIM的Vim实例退出:
$ vim --servername GVIM --remote-send '<C-\><C-N>:quitall!<CR>'

通过操作系统

暴力破解:杀死所有正在运行的Vim实例 :-)

$ killall vim

要查找打开特定文件的Vim实例,可以使用工具。因为Vim仅在< :write>时打开文件本身,所以我们必须搜索其(永久打开的)交换文件(即<.file.swp>而不是)。
$ kill `lsof -t /path/to/.file.swp`

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