我希望只有在当前面板/窗口中没有运行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中粘贴时正常工作。但由于某种原因,这看起来像是一项更艰巨的任务。
对于你的问题的第一部分,你可以使用类似#{?#{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"'
每次.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命令进行测试。
上面有正确的想法,但使用pane_current_command而不是shell命令会更快,例如:
if -F'#{m:* vim *,#{pane_current_command}}'...
另外我建议使用“xclip ... | tmux loadb - ”而不是set-buffer,因为这样你就不会遇到剪贴板中shell特殊字符的问题。