【问题标题】:Switching panes within Git's Vimdiff in Tmux在 Tmux 的 Git 的 Vimdiff 中切换窗格
【发布时间】:2015-08-31 15:49:43
【问题描述】:

我将 vim 与 tmux 一起使用。

我设置seemless pane switching between Vim splits and Tmux splits

使用这样的命令:

bind -n C-h run "(tmux display-message -p '#{pane_current_command}' | grep -iq vim && tmux send-keys C-h) || tmux select-pane -L"

在我的 tmux 配置中,它运行良好。

但是,当我使用 git 启动 vim 时它会中断。例如:

git difftool --tool=vimdiff --no-prompt filename.rb

此命令启动 vim,但由于它是通过 git,所以无缝窗格切换不起作用,因为它看起来是窗格正在运行进程 "vim" 而不是(它注册为 "git")。

有人知道解决这个问题的方法吗?

【问题讨论】:

    标签: git vim tmux vimdiff


    【解决方案1】:

    这是我的解决方案,它有点 hacky,但它有效

    我创建了一个名为 ~/vdif 的文件

    然后是别名alias vdif="~/vdif,这样我就可以从任何地方调用它

    在这个文件中我放了以下内容:

    printf "\033]2;%s\033\\" "vim"
    git difftool --no-prompt --tool=vimdiff $1 $2
    printf "\033]2;%s\033\\" "bash"
    

    第一行设置pane_title为“vim”,第二行打开git diff,第三行设置页面标题为“bash”退出。

    然后在我的 tmux 配置中,我添加了以下内容以检查 pane_title 和 pane_current_command 选项以查看 vim 是否存在:

    is_vim='echo "#{pane_current_command}#{pane_title}" | grep -iqE "vim"'
    bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
    bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
    bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
    bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
    bind -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"
    

    【讨论】:

    • 您是如何想出这个解决方案的?原创思想/作品?这真的很酷! - 我第一次在这里读到它:bugsnag.com/blog/tmux-and-vim
    【解决方案2】:

    如果你使用https://github.com/christoomey/vim-tmux-navigator

    并自己设置绑定。你可以换行 is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?x?)(diff)?$"' is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(git|view|n?vim?x?)(diff)?$"'

    注意到正则表达式中添加了git| 吗?这将有助于检查您是否正在使用 git difftool。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2015-11-05
      相关资源
      最近更新 更多