Окончательный сценарий переименования окна Vim / Tmux

#vim #tmux

#vim #tmux

Вопрос:

Я пытаюсь добиться согласованного поведения при установке имени окна tmux на имя текущего открытого файла в vim.

Вот что у меня есть в моем .vimrc

 augroup tmux
  autocmd!
  if exists('$TMUX')
    autocmd BufReadPost,FileReadPost,BufNewFile,FocusGained * call system("tmux rename-window " . expand("%:t"))
    autocmd VimLeave,FocusLost * call system("tmux set-window-option automatic-rename")
  endif
augroup END

  

Я столкнулся с двумя ситуационными проблемами:

Переключение панелей

Это почти работает. Для перехода между панелями он переименовывает каждое изменение фокуса, но иногда это не удается и выполняется сброс по умолчанию… Я понятия не имею, почему.

Переключение окон

То же поведение, что и при переключении панелей, иногда он сбрасывает имя окна, которое вы только что оставили по умолчанию

Мне нужно улучшить этот скрипт, чтобы он вел себя так:

  • Переключение панелей переименовывает текущее окно tmux в filename (работает плохо)
  • При переключении из окна сохраняется его название
  • Транкейтировать большие имена файлов (возможно ли это вообще?)

Интересно, связано ли это с интервалом обновления моей строки состояния или с некоторыми настройками в my .tmux.conf, так что вот оно my_tmuxconf

Вот несколько GIF-файлов о странном поведении: переключение окон
переключение панелей

Обновить

Эта реализация дает лучшие результаты:

 if exists('$TMUX')
  autocmd BufEnter,FocusGained * call system("tmux rename-window " . expand("%:t"))
  autocmd VimLeave * call system("tmux rename-window zsh")
endif
  

Но недостатком является то, что он не может переименовываться при переключении с панели, на которой работает vim, на панель, на которой работает что-то другое, например, обычный bash.

Недостающая часть заключается в том, чтобы сделать Tmux autorename для каждого переключателя панели, но только если на сфокусированной панели не запущен vim. Можно ли это сделать?

Комментарии:

1. Для переключения панелей у вас есть условие гонки. Нет гарантии, что предыдущая панель vim запустит свои команды раньше, чем следующая панель vim, что означает, что иногда вы получите имя, установленное для нового файла, а затем получите сброс к имени по умолчанию. Это не та проблема, которую vim может решить. В Vim есть вкладки и буферы, если вам нужно решение, которое является встроенным в vim.

2. Возможно, проблема в функции очистки? Есть ли у вас какие-либо обходные идеи, например, для проверки, является ли это переключением панели, и не очищать предыдущее имя файла?

3. Я этого не делаю. Экземпляр vim, который вы покидаете, не может знать, куда вы направляетесь, или в каком эмуляторе терминала он находится, или что делают его системные вызовы. Он просто выполняет команду, которую вы сказали ему выполнить, когда вы уходите.

4. Пожалуйста, проверьте мое обновление. Я думаю, что это сработало бы, если бы с дополнительным скриптом tmux