【问题标题】:How to open another file in background Vim from Bash command-line?如何从 Bash 命令行在后台 Vim 中打开另一个文件?
【发布时间】:2011-08-25 09:12:57
【问题描述】:

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

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

  • Ctrl+Z(在正常模式下)暂停 Vim 并返回控制台
  • fg 可用于将焦点返回到 Vim
  • jobs 列出后台作业,可用于获取作业编号 将给定的工作带到前台(例如,fg %2 将工作 2 带到前台 前景)。

但是,当 Vim 在后台并且我发出 vim file 时,文件会在一个新的 Vim 实例中打开。

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

问题:

  • 如何从命令行在后台 Vim 中打开另一个文件?
  • 这是在控制台和 Vim 之间移动的合理工作流程吗?

更新:

我刚刚阅读了this answer by @jamessan,它提供了一些想法。他显示以下代码sn-p:

vim --servername foo somefile.txt
:shell
<do stuff in your shell>
vim --servername foo --remote otherfile.txt
fg

但是,我必须考虑如何使用一些别名使其更易于使用。

  • 这是一个好方法吗?
  • 如何提高使用效率?

【问题讨论】:

    标签: linux vim command-line


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我知道我可以带回 Vim 并在 Vim 中打开文件。知道这可能是标准选项会很有帮助。但在我看来,这有时可能效率不高。例如,我从 Vim 挂起到控制台并移动到一个完全不同的目录,在那里我很容易从命令行打开文件。如果我要打开 Vim,我会回到之前的工作目录,并且必须再次浏览文件系统。
    • @JeromyAnglim:如果我想从完全独立的东西开始,我通常会打开另一个 vim 实例。否则,在同一个“事物”中,目录不会太远。 vim 附带的 netrw 插件(至少在我从源代码构建 vim 7.3 时是这样),让您“编辑”目录(尝试“:e .”)并以这种方式浏览。还有其他你可能喜欢的“查找文件”插件。
    【解决方案2】:

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

    它适用于 GTK 和 shell 版本。工作流程没有如此巨大的差异。我更喜欢 shell 版本,因为我在那里执行大部分命令(编译启动等)。

    【讨论】:

    • 刚刚注意到我写的是e: 而不是:e。固定
    【解决方案3】:

    这也是我需要的。我找到了这个帖子,虽然没有令人满意的方法,但很高兴看到像我一样有同样要求的人。

    我的方法是

    将下面添加到 .bashrc

    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
    }
    

    将下面添加到 .vimrc

    nnoremap <silent> <space>e :source $HOME/.vim_swap/e.vim<Bar>:call writefile([], $HOME."/.vim_swap/e.vim")<CR>
    

    然后v foo.c 打开第一个文件,编辑...,按 ctrl-z 暂停 vim,做 shell 工作,v bar.h 将 vim 带到前台。

    然后在 VIM 中,按 &lt;Space&gt;e 到 tabedit bar.h。

    所以想法是从 shell 命令生成 vim 命令,将它们保存到临时 .vim 文件中。在 VIM 中,将键映射到源 .vim 文件并清除它。

    【讨论】:

    • 不错。这并不比只执行fg 后跟:e foo.txt 短很多,但是如果您忘记了 fg,这可以节省情况。
    • 会不会有一个我们可以在这里使用的事件来代替手册&lt;Space&gt;e
    • @trusktr 不,不止于此。如果你 vim 的当前目录和你 shell CWD 的目录不同,你可以用“readlink -f”来增强这个解决方案来获得绝对路径,效果很好。
    【解决方案4】:

    如果你使用tmux,并且如果你总是让你的 vim 实例作为第一个作业在后台运行,你可以在 csh 中设置如下所示的别名。

    alias v 'tmux send-keys fg Space +1 Enter :e Space `realpath \!:1` Enter'
    

    那么你可以这样称呼它

    v myfile.txt
    

    如果您的 vim 实例不是第一个后台作业,请使用 jobs 输出丰富别名。

    在 Bash 中,这可以通过一个函数来完成。

    function v() {
        local job=$(jobs | perl -ne 'print $1 if /\[(\d+)\].*vim/')
        if [[ -n $job ]]; then
            tmux send-keys fg Space $job Enter
            for f in $*; do
                tmux send-keys :e Space `realpath $f` Enter
            done
        else
            vim $*
        fi
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多