从 gvim 在现有 shell 中运行命令
Posted
技术标签:
【中文标题】从 gvim 在现有 shell 中运行命令【英文标题】:Running command in existing shell from gvim 【发布时间】:2012-08-23 09:47:49 【问题描述】:这一切都始于一个外壳。例如,我使用urxvt
和zsh
。在那里,我用gvim
打开了一些文件。在这种情况下,它是一个LaTeX
文件。现在我需要执行一些命令(用于编译文档,例如pdflatex
)。
我怎样才能让原来的shell,从gvim
开始,执行那个命令?
如果gvim
必须打开一个新的 shell 一次,然后在该 shell 中执行指定命令 (pdflatex
) 的每个未来调用,这也是可以接受的,而我仍然可以手动输入。
直接运行:!pdflatex
的问题是,输出显示出来了,但是如果太长滚动是不可能的,当我按下回车后,一切都消失了。
使用 shell 的想法是,默认情况下不必切换窗口焦点。所以通常我的命令的输出是可见的,但除非发生错误,否则我可以继续在gvim
中工作。现在,如果每次我运行命令时都生成一个新的 shell,那么这种工作流程肯定是不可能的。
【问题讨论】:
我猜gedit有控制台的这个功能。请看一看。将回来提供更多详细信息。 你能进一步解释一下使用单一外壳的必要性吗? @mtk: 抱歉,我不会切换到其他编辑器。 @canaa 是一个想法,我也坚持使用 VIM,没有其他人像它一样舒适 :) @canaaerus:如果我理解正确的话,最后的需要是能够看到您之前执行的编译文档的命令的结果。 Vim 有几个功能可以帮助完成这项任务,如quickfix
- 在vim-faq 上有一些参考资料。这将允许您在 Vim 中查看编译结果。以前的结果仍然可以通过:cp
命令获得,它还允许您跳转到错误引用的特定行,尽管能够使用 Vim 的惊人功能浏览结果。
【参考方案1】:
GVIM 不会为启动它的 shell 保留一个“句柄”,以允许它向它发送命令。由于它们是同步执行的,因此您也无法从 GVIM 启动 shell,在继续向其输入命令的同时继续在 GVIM 中工作。
恐怕您必须使用窗口管理器的功能来启动(然后重新激活)shell 窗口,并将命令作为击键发送给它。在 Windows 上,这可以通过 WshShell
的 Run()
、AppActivate()
和 SendKeys()
方法来完成(例如在 VBScript 中); Linux 上的窗口控制可能也有类似的机制。
如果您不介意在您的 GVIM(模拟,具有所有缺点)中内使用该外壳,那么可以使用插件来实现它。
【讨论】:
我希望能够在启动gvim
时传递一个句柄,也许是gvim -c
。好吧,我就试试conque
,看看缺点是否可以接受。【参考方案2】:
您可能想使用Conque。它有一些缺点(可能很慢,更新不那么频繁等),但至少它可以满足您的期望。
【讨论】:
【参考方案3】:this recipe, 的 Vim Wiki,我认为它将通过完全消除对外部 shell 的需要来解决您的问题。在这里,以防源变暗:
let b:tex_flavor = 'pdflatex'
compiler tex
set makeprg=pdflatex\ \-file\-line\-error\ \-interaction=nonstopmode
set errorformat=%f:%l:\ %m
基本上,您使用:make
进行编译,使用快速修复窗口 (:copen
) 列出错误。
【讨论】:
【参考方案4】:您可以通过调用!command
在vim 中运行shell 命令。
对于您运行 pdflatex 的特定用例,我在 /etc/vimrc
中添加了以下快捷方式:
:nmap <F5> :w<CR>:make<CR>
:make
将在当前目录中调用gnu make,最终将调用pdflatex
。这是非常灵活的,因为相同的快捷方式会根据您所在的目录执行不同的操作(如果您使用 C 进行编码,它通常会调用 gcc
)。但是你必须精通make :)。
所以按 F5 可以保存我的文档并编译它,并且现在已经为我节省了多年的打字时间:)。
【讨论】:
感谢您的回答。不幸的是,您错过了问题的要点。该命令不应在临时 shell 中运行,其输出应打印在gvim
窗口中,而应在专用控制台窗口中。
然后使用 !urxvt "whatever" 启动这个专用控制台窗口以上是关于从 gvim 在现有 shell 中运行命令的主要内容,如果未能解决你的问题,请参考以下文章
Linux Gvim shell 替换:变量替换,命令替换,转义字符