屏幕:将所有 vim 调用分组到一个窗口下

屏幕:将所有 vim 调用分组到一个窗口下

在屏幕上,是否可以在一个窗口中打开 vim 的所有实例?(例如窗口 2)最初,窗口将切换到指定窗口并打开缓冲区中的文件。随后调用 vim(从其他窗口)将在该窗口的新 vim 选项卡中打开文件。我正在运行 cygwin。

答案1

这是一个很棒的问题,也是一个很棒的想法!我迫不及待地想将其纳入我的工作流程中。

无论如何,在我看来,实现此目的的最佳方法是使用 vim 的服务器功能,它允许您使用 vim 命令控制正在运行的 vim 实例。

这个想法是,第一次运行 vim 时,你将按如下方式运行它:

vim --servername $VIM_SERVER_NAME

然后每次你想在这个实例中打开一个新标签时,你都可以运行:

vim --servername $VIM_SERVER_NAME --remote-tab $PATH_TO_FILE_TO_OPEN

除此之外,您唯一需要添加的是识别和切换到 vim 窗口的逻辑(可以使用窗口标题完成)。

我把所有这些放在以下 shell 函数中:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  else
    vim $@
  fi
}

如果您添加了此函数定义~/.profile(或者~/.bash_profile如果您使用 bash),那么每当您想使用 vim 时,只需使用v即可。它将检查您当前是否处于屏幕会话中,如果是,它将使用指定的 vim 窗口并切换到它(或者如果不存在,则将当前窗口设为指定的 vim 窗口),否则它将恢复正常使用 vim。即使您同时使用多个屏幕会话并v在所有会话中使用,它也应该可以工作。

请注意,如果/当您退出 vim 服务器时,我还会将窗口标题重置为 shell 名称,这是为了避免在v关闭一个窗口后在另一个窗口中使用时出现两个或多个标题为“vim”的窗口。

因为我更喜欢 tmux,所以这是我实际上计划使用的 shell 函数:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  elif [ $TMUX ]; then
    # tmux
    VIM_SERVER_NAME="VIM-TMUX-`tmux list-windows -F '#{session_name}' | head -1`"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      tmux rename-window vim
      vim --servername $VIM_SERVER_NAME "$@"
      tmux rename-window `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      tmux select-window -t vim
    fi
  else
    vim "$@"
  fi
}

此版本的功能可适用于 tmux 和 screen(任意数量的不同会话),如果不在其中,则回退到普通 vim。

答案2

您无法在不同的屏幕窗口中运行两个 vim 实例,这样您就无法同时从两个实例编辑同一个文件。如果您尝试打开第二个 vim 实例来编辑同一个文件,您将收到一条消息,警告您该文件已被编辑。

话虽如此,你通过在 vim 中执行此命令,在新屏幕窗口中打开 vim 的第二个实例以查看当前文件:

:!screen screen vim -R %

-R选项以只读模式启动 vim。

相关内容