![从外部(在终端中)启动 vim 打开文件](https://linux22.com/image/78511/%E4%BB%8E%E5%A4%96%E9%83%A8%EF%BC%88%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%EF%BC%89%E5%90%AF%E5%8A%A8%20vim%20%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6.png)
我有一个开始vim
。我暂停了它(Ctrl+ Z)。所以我处于终端会话中,我想使用同一vim
会话(新选项卡)打开一些文件。我可以在新vim
会话中打开该文件。实际上,可以构建文件路径。例如,
vim `find $PWD -name build.xml`
是否可以在正在运行的 vim 会话中从托管终端会话中打开此文件?
答案1
问题在于Ctrl——Z
当您使用Ctrl-挂起一个进程时Z,该进程会收到一个SIGTSTP
信号,并且所有执行都将停止(即不再有 CPU 周期),直到SIGCONT
出现信号为止。vim
暂停期间您将无法发送任何命令或输入。
换句话说,不要使用Ctrl- Z。
然而,如果您已vim
启用该clientserver
功能进行编译,则可以使用--servername
和--remote-*
选项:
使用vim --remote
vim
第一次启动会话时,请使用vim --servername VIM [filename ...]
(如果您想从空白会话开始,文件名是可选的)。
让它在你的终端中运行。现在您可以通过命令从任何其他终端窗口、选项卡、机器等控制它vim --remote
。打开文件(例如,文件.txt在现有会话的新选项卡中vim
:
vim --remote-tab file.txt
要使用vim
的内部:tabfind
功能(请参阅 参考资料:help find
以获得更多信息):
vim --remote-send ":tabfind filename.txt<CR>"
要使用系统的find(1)
程序,正如您在问题中所问的那样:
vim --remote-tab `find $PWD -name build.xml`
多次会议
您还可以指定不同的--servername
,如果您愿意,这很有用多种的vim 会话。在这种情况下,您--servername
每次都需要提供参数:
vim --servername HAMBURGER # Start new session named "HAMBURGER"
vim --servername HAMBURGER --remote-tab `find $PWD -name BACON`
当然,您可以将所有这些都整合到一个或两个 shell 脚本中,以节省一些打字时间。
答案2
从内部vim
您可以使用:
:tabe `find $PWD -name build.xml`
答案3
尽管其他答案对我来说听起来更清晰,但作为黑客,您可以使用如下函数:
for-vim () {
printf %s "$@" > ~/.for-vim &&
perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_)
for split "", "\e:tabe `cat ~/.for-vim`\r"' &&
fg %vim
}
用作:
for-vim "$(find "$PWD" ...)"
它将文件路径存储在~/.for-vim
文件中,并<ESC>:tabe ~/.for-vm<CR>
在恢复之前使用 TIOCSTI ioctl() 将 a 注入终端的输入缓冲区vim
。