如何让tmux仅在vim未运行时应用选项?

问题描述 投票:2回答:3

我希望只有在当前面板/窗口中没有运行vim时才能激活tmux配置文件中的选项。特别是,该行如下:

bind-key -n MouseDown2Pane run "tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"

这允许我使用中间点击直接从主剪贴板粘贴到tmux。它工作得很好,唯一的问题是它在vim内部有一种奇怪的行为(在错误的地方粘贴,奇怪的跳线......)。如果我注释掉那一行,用中间点击粘贴到vim就可以正常工作,但显然我在tmux中丢失了粘贴功能。

所以,我的问题是:如果vim没有运行,我如何使tmux仅应用键绑定?

通过做一些研究,我发现以下方法看起来很有希望,但我无法使其发挥作用。

is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

if-shell "$is_vim" {command here}

编辑:或者,我也很乐意让"tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"命令在vim中粘贴时正常工作。但由于某种原因,这看起来像是一项更艰巨的任务。

bash vim terminal vi tmux
3个回答
1
投票

对于你的问题的第一部分,你可以使用类似#{?#{m:\*vim\*,#{pane_current_command}},0,1}的东西来反转匹配,或者你可以使用if-shell的第二个参数而不是第一个,所以你会做第二个参数为空的if -F '...' '' 'mycommand'

if-shell参数是are tmux命令,但它们确实需要是一个参数。所以你需要把它们放在引号中 - 你会想要这样的东西:

bind -n MouseDown2Pane if -F '#{?#{m:\*vim\*,#{pane_current_command}},0,1}' 'run "xclip -o -sel primary | tmux load-buffer - ; tmux paste-buffer"'


1
投票

每次.tmux.conf文件的来源时,您的尝试都会进行检查,这通常仅在首次进行tmux会话时进行。

每次运行命令时都需要检查它。幸运的是,这就像重新排列订单一样简单。这是一个例子:

bind-key -n C-k if-shell 'test #{window_panes} -gt 1' 'select-pane -t :.-1' 'next-window'

在这里,Ctrl+k检查我的窗口中是否有多个窗格。如果我这样做,我会转到下一个窗格。如果我不这样做,我会进入下一个窗口。

我不是正面的$is_vim可以是你的绑定中的一个变量而不是完全写出来,你必须测试它,但它应该是这样的:

bind-key -n MouseDown2Pane if-shell "ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" \
'<whatever it should do when vim is running' \
"tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"

这看起来非常糟糕,可能很慢,因为每次使用该按钮时都必须运行该shell命令进行测试。


1
投票

上面有正确的想法,但使用pane_current_command而不是shell命令会更快,例如:

if -F'#{m:* vim *,#{pane_current_command}}'...

另外我建议使用“xclip ... | tmux loadb - ”而不是set-buffer,因为这样你就不会遇到剪贴板中shell特殊字符的问题。

© www.soinside.com 2019 - 2024. All rights reserved.