Как создать новое окно в текущем каталоге в tmux?

209

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

Шрикант Шарат
источник

Ответы:

140

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


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

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

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


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

tmux neww

в оболочке, которая уже имеет желаемый текущий рабочий каталог.

Однако, если я ожидаю создания множества окон с одним и тем же текущим рабочим каталогом (или я хочу иметь возможность запускать их с помощью обычной cпривязки клавиш <prefix> ), тогда я устанавливаю параметр default-pathсеанса через

tmux set-option default-path "$PWD"

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

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

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

Крис Джонсен
источник
6
Есть ли способ сопоставить, <prefix>cчтобы прочитать рабочий каталог базового экземпляра оболочки (если таковые имеются) и установить default-pathдо выполнения new-window. Или это слишком много, чтобы спросить tmux :)
Shrikant Sharat
С другой стороны, возможно ли прочитать рабочий каталог основной оболочки? Я убил бы, чтобы это отображалось в моей строке состояния.
Шрикант Шарат
2
Не существует переносимого способа извлечь cwd из другого процесса (хотя это возможно на некоторых платформах (например, /proc/PID/cwdв Linux)). Существует возможное частичное решение в записи часто задаваемых вопросов по tmux (в командной строке он записывает свой cwd, когда печатает приглашение, а затем связывает ключ, запускающий новую оболочку в записанном каталоге).
Крис Джонсен
хорошо, это немного выходит за рамки моих знаний и не очень надежно. Что-то подсказывает мне, что без всего этого мне может быть лучше .. в любом случае, спасибо.
Шрикант Шарат
1
@paradroid: все, что делается через привязку, будет (по умолчанию) использовать cwd сервера tmux или значение параметра default-pathсеанса (если оно установлено). В FAQ по tmux есть запись, которая описывает способ привязки ключа, который запускает новое окно с помощью cwd оболочки, запущенной в текущем окне («Как я могу открыть новое окно в том же каталоге, что и текущее окно?») , но метод довольно запутанный. То же самое, вероятно, можно сделать для split-windowи new-session(вместо neww).
Крис Джонсен
268

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

Комбинируя их, мы можем открыть новое окно с текущим рабочим каталогом, используя
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}"
Саймон Колмейер
источник
1
Разве это не работает на tmux 1.9? Я не могу заставить это сделать ожидаемую вещь.
Эрик Гаррисон
1
bind-key -r Войти в новое окно -c "# {pane_current_path}", работает для tmux 2.1
Marslo
5
Работает в tmux 2.3 на OSX. Не забудьте остановить / убить все существующие сеансы, чтобы увидеть применение этих привязок.
jmgarnier
1
@jmgarnier или повторно введите профиль: prefix- :, затем введитеsource ~/.tmux.conf
ijoseph
8
@jmgarnier или просто tmux source-file .tmux.conf.
phil294
37

Да, используйте new-window -c "#{pane_current_path}". Вы можете добавить следующее к своему, ~/.tmux.confчтобы сделать его постоянным (предполагая привязки клавиш по умолчанию):

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

default-pathПараметр пути был удален из вышестоящего кода и tmux автора рекомендованного в этом сообщении фиксации с использованием либо -c "#{pane_current_path}"или -c "$PWDв new-windowи split-windowкомандах.

Я также ответил в этом двойном вопросе .

mmoya
источник
10

В последних версиях tmux (v1.8, но, возможно, и в v1.7):

tmux new-window -c "$PWD"
mislav
источник
Это , кажется, работает с разбитым окном , а также, напримерtmux split-window -v -c "$PWD"
user7089
3
$PWDу меня не работает в tmux 1.9a. Я должен был использовать pane_current_pathкак предложено выше.
Джордельвер
3

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

~/.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.

Эрик Веструп
источник
0

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/

Юрий Ершов
источник