Как создать новое окно в текущей директории в tmux?

Вопрос или проблема

Можно ли открыть new-window с рабочей директорией, установленной в ту, в которой я сейчас нахожусь? Я использую zsh, если это важно.

Текущая (1.9a) man-страница Tmux перечисляет необязательный параметр -c start-directory для некоторых команд, включая new-window и split-window.
Она также содержит переменную формата pane_current_path, которая относится к
Текущий путь, если доступно.

Комбинируя их, мы можем открыть новое окно с текущей рабочей директорией, используя:
new-window -c "#{pane_current_path}"
Кавычки нужны в случае, если текущий путь содержит пробелы.

Если вы хотите разделить текущую панель вертикально, используйте:
split-window -c "#{pane_current_path}"
или для горизонтального разделения
split-window -h -c "#{pane_current_path}"

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

bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

Начиная с tmux 1.9, опция default-path была удалена, поэтому вам нужно использовать опцию -c с new-window и split-window (например, перебиндовав привязки c, " и % с добавлением
-c '#{pane_current_path}'). Подробности смотрите в некоторых других ответах на этот вопрос.


Соответствующая функциональность была добавлена в SVN trunk tmux в начале февраля 2012 года. В сборках tmux, которые включают этот код, клавишные привязки tmux, которые вызывают new-window, будут создавать новое окно с той же текущей рабочей директорией, что и активные процессы текущей панели (если опция сессии default-path пуста; по умолчанию она пуста). То же самое касается панели, созданной командой split-window, когда она вызывается через привязку.

Для этого используется специальный платформоспецифический код, поэтому на данный момент поддерживаются только определенные ОС: Darwin (OS X), FreeBSD, Linux, OpenBSD и Solaris.

Это должно быть доступно в следующем выпуске tmux (1.7?).


С tmux 1.4 я обычно просто использую

tmux neww

в оболочке, которая уже имеет нужную текущую рабочую директорию.

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

c), то я устанавливаю параметр сессии default-path через

tmux set-option default-path "$PWD"

в оболочке, которая уже имеет нужную текущую рабочую директорию (хотя, очевидно, вы можете сделать это из любого каталога и просто указать нужное значение).

Если default-path установлен в непустое значение, его значение будет использоваться вместо “унаследования” текущей рабочей директории из командной строки вызовов tmux neww.

FAQ tmux имеет запись под названием “Как я могу открыть новое окно в том же каталоге, что и текущее окно?”, которая описывает другой подход; однако, он немного запутанный.

Используйте new-window -c "#{pane_current_path}".

Вы можете добавить следующее в ваш ~/.tmux.conf, чтобы сделать это постоянным (при условии, что привязки клавиш по умолчанию):

bind  c  new-window      -c "#{pane_current_path}"
bind  %  split-window -h -c "#{pane_current_path}"
bind '"' split-window -v -c "#{pane_current_path}"

Настройка default-path была удалена из версии 1.9 (выпущенной в феврале 2014 года). В изменении автор рекомендовал использовать либо -c "#{pane_current_path}", либо -c "$PWD в командах new-window и split-window.

Также отвечено в этом дубликате вопроса.

В более новых версиях tmux (v1.8, вероятно, и в v1.7 тоже):

tmux new-window -c "$PWD"

Другие ответы не работают для меня, когда я пытаюсь использовать их как привязки (в частности, tmux split-window -c). Но я придумал свое собственное решение, которое использую уже более года, и которое работает как для new-window, так и для split-window:

~/.bashrc:

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

~/.tmux.conf:

unbind-key c
bind-key c run-shell 'tmux new-window "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key C new-window

bind-key - run-shell 'tmux split-window -v "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key | run-shell 'tmux split-window -h "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"

Работает, по крайней мере, с $(tmux -V) 1.8. Смотрите раскомментированные строки здесь для версии, работающей для более старых версий tmux, у которых нет команды show-environment.

tmux делал это в версии 1.8, но в 1.9 эта функция была удалена в пользу использования флага -c.

Это можно решить, перебиндовав new-window, но в случае, если вы хотите запустить что-то другое, это становится слишком многословно: вместо того, чтобы напечатать neww man tmux, вам придется набрать neww -c "#{pane_current_path}" man tmux, что, скорее всего, вы не захотите делать.

Существует модификация tmux (я являюсь автором), чтобы добавить в tmux полноценный скриптовый язык, позволяющий использовать алиасы, связывать несколько команд в ‘режиме’, переменные, циклы и так далее…
А также, он возвращает это поведение: новые окна и панели открываются в текущем каталоге.

Его можно собрать из источников здесь: http://ershov.github.io/tmux/

Это слегка хакерское решение, но другие ответы, похоже, не работают на новейшей версии tmux (3.4) по состоянию на апрель 2024 года. Добавьте это в ваш файл ~/.tmux.conf и вставьте ваш горячую клавишу:

bind-key -n INSERT_YOUR_DESIRED_KEYBINDING send-keys C-a C-k tmux Space new-window Space -c Space `pwd` Enter

Недостатком этого решения является то, что терминал не должен находиться под управлением какого-либо приложения, такого как vim, и что оно очищает текущую строку в активной панели, используя сочетания клавиш C-a и C-k, которые могут конфликтовать с другими.

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

В MacOS я использую следующую команду:

pwd | pbcopy Ctrl+bc cd Cmd+v ; clear

и это приведет меня туда.

Что-то подобное можно сделать и в Linux (я думаю) с помощью:

pwd | xclip Ctrl+bc cd Ctrl+v ;clear

В моей работе с tmux 3.5a переменная #{pane_current_path}, похоже, работает только для некоторых команд, но не для других. new-window — одна из тех, что не работает, и, похоже, захватывает каталог, в котором была запущена сессия tmux, а не текущий каталог панели. Вот, что работает для меня в ~/.tmux.conf, если это может быть полезным:

# разделить окно вертикально
bind '"' split-window -v -c "#{pane_current_path}"

# разделить окно горизонтально
bind % split-window -h -c "#{pane_current_path}"

# создать новое окно с тем же каталогом
bind c split-window -Z \; break-pane

Команда split-window действительно захватывает каталог текущей панели, поэтому мы создаем увеличенную панель, которая сохраняет первоначальную раскладку панелей под увеличенной панелью, а затем используем команду break-pane, чтобы переместить эту новую увеличенную панель в ее собственное окно. Дополнительные аргументы могут быть переданы команде split-window, такие как выполнение команды оболочки в новом окне.

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

bind c split-window -Z \; break-pane \; \
  run-shell "sleep 0.01 ; tmux kill-session -C"

.

Ответ или решение

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

Современные подходы для решения задачи

С внедрением новых версий tmux (#версии начиная с 1.9) поддержка параметра -c позволила задать стартовую директорию для новых окон и панелей. Это особенно полезно, поскольку позволяет настроить tmux для работы с новой панелью или окном, привязанным к текущему каталогу, что упрощает процессы навигации и управления.

Использование параметра -c:

  • Создание нового окна:

    tmux new-window -c "#{pane_current_path}"

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

  • Скриптовые установка привязок:

    Чтобы применить команду для всех сеансов tmux, добавьте в конфигурации .tmux.conf:

    bind c new-window -c "#{pane_current_path}"
    bind % split-window -h -c "#{pane_current_path}"
    bind '"' split-window -v -c "#{pane_current_path}"

Эти настройки изменят стандартное поведение клавиши c для создания нового окна, а также для разделения панели горизонтально/вертикально с сохранением текущей рабочей директории.

Альтернативные подходы для версий до 1.9

С появлением версии 1.9 и удалением возможности задания default-path, многие пользователи испытывали дискомфорт из-за необходимости новых подходов. Ранее можно было использовать следующее:

Установка default-path:

До выхода tmux 1.9, можно было установить default-path, чтобы автоматически наследовать путь:

tmux set-option default-path "$PWD"

Дополнительные решения и советы

Существует множество креативных и нестандартных подходов, интегрирующих команды unix с использованием pbcopy и xclip, особенно удобных на MacOS и Linux:

Примеры на macOS и Linux:

Для MacOS:

pwd | pbcopy && tmux new-window && tmux send-keys "cd \"$(pbpaste)\"" Enter

Аналогично для Linux:

pwd | xclip -selection clipboard && tmux new-window && tmux send-keys "cd \"$(xclip -selection clipboard -o)\"" Enter

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...