Tmux забывает каталог, в котором была создана сессия

8

Когда я создаю несколько сеансов в tmux, текущий каталог для каждого нового окна в последующих сеансах устанавливается как текущий каталог для первого.

Например:

-> cd /home/one && tmux new-session -n one\; new-window -n two
   # /home/one is the current directory for each window

-> cd /home/two && tmux new-session -n three\; new-window -n four #\; etc.
   # "/home/two" is the current directory for the window "three"
   # but for the window "four" and other created windows it is "/home/one"

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

Tmux 1.6

зш 4.3

Shamaoke
источник

Ответы:

21

Начиная с tmux 1.9 опция default-path была удалена .

Вы можете использовать следующее, чтобы открыть в каталоге, в котором открылся сеанс (имя «client» в имени будет указывать мне, что это текущий запуск tmux в вашей оболочке, но, похоже, он переключает пути при переключении между сеансами в тот же клиент):

bind-key c  new-window -c "#{client_cwd}"

В противном случае, чтобы скопировать путь текущей панели:

bind-key c  new-window -c "#{pane_current_path}"

Существует также pane_start_path, который может обратиться к некоторым рабочим процессам.

bind-key c  new-window -c "#{pane_start_path}"

Для команд разделенного окна.

bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"
Дэвид С. Бишоп
источник
1
Это правильный ответ. Конкретно 2 вариант в моем случае.
Майк Рападас
Кроме того, не забудьте закрыть все текущие рабочие терминалы tmux, включая фон, перед изменением файла конфигурации, иначе tmux не загрузит новые конфигурации.
randomness2077
@lightmanhk Вы должны иметь возможность просто: source ~ / .tmux.conf
Дэвид С. Бишоп
1
Любой способ обобщить это для разбиений панели? split-window -h "#{pane_current_path}"не будет работать ...
Бах
1
@ Бах Попробуйте с -c. split-window -h -c "#{pane_current_path}"
Дэвид С. Бишоп
3

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

Команда new-windowпринимает -cфлаг, который позволит вам указать текущий каталог нового окна. По умолчанию это пустая строка, которая будет использовать текущий рабочий каталог панелей в качестве каталога для нового окна. Передача в качестве -значения -cфлага установит каталог нового окна, в котором был открыт сеанс.

Вот выдержка из документов:

-c specifies the working directory in which the new window is created.  It may 
have an absolute path or one of the following values (or a subdirectory):

       Empty string    Current pane's directory
       ~               User's home directory
       -               Where session was started
       .               Where server was started

Если вы хотите изменить поведение <PREFIX> cсвязывания клавиш по умолчанию, чтобы отразить это, вот что я сделал в своем ~/.tmux.conf:

bind-key c   new-window -c -
nicklamuro
источник
0

здесь довольно много ответов: /unix/12032/create-new-window-with-current-directory-in-tmux

В итоге:

из FAQ по tmux один тупой (но очень общий и довольно независимый от оболочки) способ:

  • Как я могу открыть новое окно в той же директории, что и текущее окно?

Один из вариантов - просто запустить «TMUX = tmux» в окне. Однако это работает только в том случае, если ни одна из команд не запущена, поэтому вы можете ввести команду.

Обходной путь - сообщить tmux о текущем пути через переменную окружения. Для этого используйте следующую команду:

[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD

Который устанавливает TMUXPWD_i (где i - номер текущего окна) на путь текущего каталога. Эта команда может быть добавлена ​​в PS1, например:

PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '

Когда создается новое окно, оболочка должна попросить изменить каталог. Вы можете определить новую привязку (например, если используете GNU bash):

bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'

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

просто замените вызовы на оболочку в соответствии с вашими требованиями.

также, по-видимому, в более новых версиях tmux эта проблема решается с помощью команды

tmux new-window

старые версии работают так:

призвание

Tmux Neww

из вашей оболочки откроется tmux в этой директории.

если вы хотите иметь возможность открывать новые окна или панели из текущего рабочего каталога в tmux, тогда вам следует вместо этого:

tmux set-option default-path "$ PWD"

морж
источник
Спасибо за попытку помочь, Морж . Я видел этот вопрос на unix.stackexchange и читал FAQ. Тем не менее, это не ответы на мой вопрос.
Shamaoke
1
Посмотрите, когда вы создаете новый сеанс, текущий каталог для каждого нового окна или панели, которые вы открываете в этом сеансе, будет тем каталогом, где вы начинаете сеанс . Это правда, если я создаю один сеанс. Однако, когда я открываю новое окно терминала и запускаю в нем еще один сеанс, текущим рабочим каталогом для каждого нового окна будет тот каталог, в котором я запускаю первый сеанс, но не текущий. Это, очевидно, ошибка в tmux 1.6, так как, когда я понизил ее до версии 1.3, ошибка не появилась.
Shamaoke