繁体   English   中英

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

[英]How to open another file in background Vim from Bash command-line?

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

我在Vim打开一个文件,然后挂起Vim,在命令行运行几个命令然后想回到Vim。

  • Ctrl+Z (普通模式下)挂起 Vim 回落到控制台
  • fg可用于将焦点返回到 Vim
  • jobs列出后台作业,可用于获取作业编号以将给定作业带到前台(例如, fg %2将作业 2 带到前台)。

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

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

问题:

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

更新:

我刚刚阅读了@jamessan 的回答,其中提供了一些想法。 他展示了以下代码片段:

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

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

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

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

我的方法是

将以下内容添加到.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中,按<Space>e到tabedit bar.h.

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

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

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

我只是从fg调用vim并在vim中打开新文件,因为它似乎更快(虽然它可能对我来说更快)。 要在vim中使用多个文件,你需要使用命令编辑(在vim中):: :e [filepath/]filename和你走^I true(所有文件将作为vim缓冲区)与^I (ctrl + I)和^O (CTRL + O)

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

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

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

那么你可以这样称呼它

v myfile.txt

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

在 Bash 中,这可以通过 function 来完成。

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM