Как сделать так, чтобы tmux применил опцию только когда vim не работает? - PullRequest
2 голосов
/ 02 апреля 2019

Я бы хотел, чтобы опция в файле конфигурации tmux была активирована, только если vim не работает в текущей панели / окне. В частности, строка выглядит следующим образом:

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

, что позволяет мне использовать средний щелчок для вставки непосредственно из основного буфера обмена в tmux. Он отлично работает, единственная проблема в том, что он имеет странное поведение внутри vim (вставка в неправильном месте, странный пропуск строк ...). Если я закомментирую эту строку, вставка с помощью среднего щелчка в vim работает, как ожидается, но я теряю функциональность вставки в tmux, очевидно.

Итак, мой вопрос: как заставить tmux применять эту привязку ТОЛЬКО, если vim не работает?

Проведя некоторые исследования, я нашел следующий подход, который выглядит многообещающим, но я не могу заставить его работать.

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. Но это по какой-то причине выглядит более сложной задачей.

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Выше есть правильная идея, но было бы быстрее использовать pane_current_command вместо команды оболочки, что-то вроде:

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

Также я бы рекомендовал использовать "xclip ... | tmux loadb -" вместо set-buffer, потому что тогда у вас не возникнут проблемы со специальными символами оболочки в буфере обмена.

1 голос
/ 02 апреля 2019

Для первой части вашей проблемы вы можете использовать что-то вроде #{?#{m:\*vim\*,#{pane_current_command}},0,1}, чтобы инвертировать совпадение, или вы можете использовать второй аргумент if-shell вместо первого, поэтому вы должны сделать if -F '...' '' 'mycommand', где второй аргумент просто пуст.

if-shell аргументы являются командами 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 голос
/ 02 апреля 2019

Ваша попытка проверяет каждый раз при получении файла .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"

Что выглядит совершенно ужасно и может быть медленным, так как он должен запускать эту команду оболочки для проверки каждый раз, когда вы используете эту кнопку.

...