Linux 如何从Bash命令行在后台Vim中打开另一个文件?

Linux 如何从Bash命令行在后台Vim中打开另一个文件?,linux,vim,command-line,Linux,Vim,Command Line,我正在从使用Gvim过渡到控制台Vim 我在Vim中打开一个文件,然后挂起Vim,在命令行上运行一些命令,然后想返回Vim Ctrl+Z(在正常模式下)暂停Vim并返回控制台 fg可用于将焦点返回到Vim 作业列出了后台作业,可用于获取作业编号 将给定作业带到前台(例如,fg%2将作业2带到前台 前景) 但是,当Vim在后台时,我发布了Vim文件,该文件将在一个新的Vim实例中打开 我习惯于在Gvim中使用--remote选项来打开现有Gvim实例中的文件 问题: 如何从命令行在后台Vim

我正在从使用Gvim过渡到控制台Vim

我在Vim中打开一个文件,然后挂起Vim,在命令行上运行一些命令,然后想返回Vim

  • Ctrl+Z
    (在正常模式下)暂停Vim并返回控制台
  • fg
    可用于将焦点返回到Vim
  • 作业
    列出了后台作业,可用于获取作业编号 将给定作业带到前台(例如,
    fg%2
    将作业2带到前台 前景)
但是,当Vim在后台时,我发布了
Vim文件
,该文件将在一个新的Vim实例中打开

我习惯于在Gvim中使用
--remote
选项来打开现有Gvim实例中的文件

问题:
  • 如何从命令行在后台Vim中打开另一个文件
  • 这是在控制台和Vim之间移动的合理工作流吗
更新: 我刚刚读了这篇文章,其中提供了一些想法。他显示了以下代码片段:

vim --servername foo somefile.txt
:shell
<do stuff in your shell>
vim --servername foo --remote otherfile.txt
fg
vim--servername foo somefile.txt
:外壳
vim--servername foo--remote otherfile.txt
前景
但是,我必须考虑如何使它更易于使用,也许是与一些别名一起使用

  • 这是一个好办法吗
  • 如何使其有效使用

您需要将当前的vim进程带到前台(使用fg)并在vim中打开文件,而不是再次运行vim


我没有太多使用它,但您可能会发现“vim服务器”功能(请参阅--remote*、--servername等选项)允许您将shell中的文件打开到现有的、后台的vim中。但是,ctrl-z会挂起进程,而不是让它继续在后台运行,您需要将该vim放到后台,以便它可以作为“vim服务器”响应。使用shell的bg命令来实现这一点。

我只需要从
fg
调用vim,并在vim内部打开新文件,因为它看起来更快(尽管对我来说可能更快)。要在vim中处理多个文件,需要使用命令edit(在vim中):
:e[filepath/]filename
,然后使用
^I
(ctrl+I)和
^O
(ctrl+O)遍历真正的缓冲区(所有文件都将作为vim缓冲区)


它适用于GTK和shell版本。在工作流程上没有这么大的区别。我更喜欢shell版本,因为我在那里执行大多数命令(编译启动等)。

这也是我需要的。我发现这条线索,虽然没有令人满意的方法,但很高兴看到人们有和我一样的需求

我的方法是

将以下内容添加到.bashrc 将以下内容添加到.vimrc
nnoremap e:source$HOME/.vim\u swap/e.vim:call writefile([],$HOME./.vim\u swap/e.vim”)
然后
v foo.c
打开第一个文件,编辑…,ctrl-z暂停vim,执行shell操作,
v bar.h
将vim置于前台

在VIM中,按
e
以编辑栏.h


因此,我们的想法是从shell命令生成vim命令,将它们保存到temp.vim文件中。在VIM中,将键映射到.VIM文件的源代码并清除它。

谢谢。我知道我可以带回Vim并在Vim中打开文件。知道这可能是标准选项是很有帮助的。但在我看来,这有时可能不够有效。例如,我从Vim暂停到控制台,并移动到一个完全不同的目录,在那里我可以很容易地从命令行打开文件。如果我要打开Vim,我将回到以前的工作目录,并且必须再次浏览文件系统。@JeromyAnglim:如果我想从完全不同的东西开始,我通常会打开另一个Vim实例。否则,在同一个“东西”中,目录不会太远。vim附带的netrw插件(至少在我从源代码构建vim 7.3时是如此)允许您“编辑”目录(try“:e”)并以这种方式浏览。您可能还喜欢其他“查找文件”插件。刚才注意到我编写了
e:
而不是
:e
。修好了。这并不比只执行
fg
然后执行
:e foo.txt
短多少,但是如果您忘记使用fg,这将保存情况。我们是否可以在此处使用事件来代替手动
e
v() {
    vim_id=`jobs|sed -n "/vim/s/\[\([0-9]\)\]+.*/\1/p"`
    if [ -n "$vim_id" ]; then
        echo "tabedit $@" > ~/.vim_swap/e.vim && fg $vim_id
    else
        vim $@
    fi
}
nnoremap <silent> <space>e :source $HOME/.vim_swap/e.vim<Bar>:call writefile([], $HOME."/.vim_swap/e.vim")<CR>