Подтвердить что ты не робот

Вкладки tmux с именем файла, открытым в vim

Я новичок в tmux и пытаюсь понять, как редактировать конфигурацию, чтобы окна с открытым vim отображались в панели задач не как #:vim, но как бы ни было открыто имя файла в vim, это
(ie "#:filename.php"). Похоже, это должно быть обычным делом, но мой поиск - foo терпит неудачу.

4b9b3361

Ответ 1

Вот частичный ответ. Это может быть улучшено, но у меня нет времени, чтобы разобраться с этим сейчас.

Поместите в .vimrc следующее:

autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%"))

Существуют другие события (см. :help autocmd-events в Vim), которые могут использоваться для обработки также. Одна вещь, которую я не понял, - это изменить имя окна, если вы иметь экземпляр vim, открытый в каждой из двух панелей, и вы переключаетесь с одной панели к другому. vim не знает о действии в tmux, поэтому не запускаются события vim.

Ответ 2

Это возможно! Я хотел поделиться этим ответом, потому что я искал его довольно долгое время. Наконец, настало время его реализовать. Поместите в .vimrc следующее:

autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
set title

Он установит заголовок терминала только в заголовке документа, находящемся в фокусе (%t означает название документа без пути). Благодаря событию BufEnter название терминала изменяется при каждом переключении фокуса на другой документ. Также при выходе из Vim он возвращается обратно в исходное состояние. Поместите (или замените) следующее в .tmux.conf:

set-window-option -g window-status-current-format "[#I #W#T]"
set-window-option -g window-status-format "[#I #W#T]"

Нет необходимости копировать его точно, но это выглядит так:

[1 vim .tmux.conf][2 bash]...

I обозначает номер окна. W означает, что текущее приложение запущено, а T - название терминала. Позднее мы используем для отображения текущего файла в vim. Заголовок терминала всегда задается (мой терминал bash всегда показывает имя хоста, которое мне не нужно видеть в описаниях строки состояния), поэтому, чтобы показывать это только в том случае, когда vim работает, добавьте следующее к вашему .bashrc:

PROMPT_COMMAND='echo -ne "\033]0;\007"'

Это верно для bash, оболочки, которую я использую. PROMPT_COMMAND оценивается непосредственно перед отображением подсказки в терминале. Команда echo устанавливает заголовок терминала в никуда. Таким образом, это действие происходит каждый раз, когда вы возвращаете запрос от приложений, которые могли бы изменить заголовок. Другие оболочки могут нуждаться в настройке по-разному...

Я бы не использовал tmux rename-window, поскольку он устанавливает заголовок до тех пор, пока существуют окна. Вам нужно будет вызвать его для каждого запуска приложения. Представленный подход сохраняет динамику, поскольку он работает с несколькими панелями в окне и несколькими разделенными экранами/файлами, открытыми в vim.

Ответ 3

Спасибо за отличные входные ребята, это экономит много ввода: -)

Я объединил два предыдущих ответа в один, который мне нравится.

autocmd BufEnter * call system("tmux rename-window " . expand("%:t"))
autocmd VimLeave * call system("tmux rename-window bash")
autocmd BufEnter * let &titlestring = ' ' . expand("%:t")                                                                 
set title

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

Ответ 4

И чтобы восстановить заголовок автоматического окна на выходе Vim:

autocmd VimLeave * call system("tmux setw automatic-rename")

Я также предлагаю проверить, запущены ли мы в tmux:

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

Ответ 5

Отличные ответы здесь, но я все еще не мог заставить его работать так, как я этого хотел, а именно: 1) Измените имя окна TMUX при открытии vim 2) Остановитесь. вернуть его к предыдущему имени Я достиг этого с помощью следующих 3 строк vimrc:

autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%:t"))
let tmuxtitle = system("tmux display-message -p '#W'")
autocmd VimLeave * call system("tmux rename-window " . shellescape(tmuxtitle))

Ответ 6

В качестве альтернативы другим ответам, которые задают имя окна tmux, вы можете вместо vim установить заголовок tmux. Это позволяет сохранить статическое имя окна, которое вы определяете с помощью tmux new-window -n <window-name>, когда vim меняет заголовок панели. Вы можете использовать #T в set-titles-string, чтобы отобразить заголовок панели, например. set-option -g set-titles-string "#W: #T" отобразит имя окна tmux и заголовок панели.

Пример конфигурации vim для изменения названия панели:

" Teach vim the tmux escape sequences for changing pane title
" Note the "^[" should be a literal escape code (use `^v<esc>` to enter it)
set t_ts=^[]2;
set t_fs=^[\\

" Turn on setting the title.
set title

" The following causes vim to refresh the title each time we change buffers.
" Otherwise it will only set the title once at startup.
augroup RefreshTitle
  autocmd!
  " The concatenation of the colon is a hack to prevent vim from
  " interpreting the string as a modeline.
  autocmd BufEnter * let &titlestring = "vim" . ":" . expand("%:t")
augroup END

Престижность vim.wikia.com для руководства t_ts и t_fs и флюки для автокоманды.