从 gvim 在现有 shell 中运行命令

Posted

技术标签:

【中文标题】从 gvim 在现有 shell 中运行命令【英文标题】:Running command in existing shell from gvim 【发布时间】:2012-08-23 09:47:49 【问题描述】:

这一切都始于一个外壳。例如,我使用urxvtzsh。在那里,我用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 上,这可以通过 WshShellRun()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 函数

Linux Gvim shell while循环

如何以最大化窗口启动 gvim?

Linux Gvim shell 替换:变量替换,命令替换,转义字符

Linux Gvim shell break和continue命令

Linux Gvim shell echo命令