Як створити нове вікно в поточному каталозі в tmux?


208

Можна відкрити new-windowсвій робочий каталог, встановлений для того, в якому я зараз перебуваю. Я використовую zsh , якщо це має значення.

Відповіді:


139

Починаючи з tmux 1.9 default-pathваріант був видалений, так що вам потрібно використовувати -cопцію new-window, і split-window(наприклад , шляхом підміни c, "і %прив'язки включити
-c '#{pane_current_path}'). Докладніше див. Деякі інші відповіді на це запитання.


Відповідна функція висадилась у магістраль tmux SVN на початку лютого 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прив'язки клавіш <prefix> ), тоді я встановлюю параметр default-pathсеансу через

tmux set-option default-path "$PWD"

в оболонці, яка вже має бажаний поточний робочий каталог (хоча, очевидно, ви могли це зробити з будь-якого каталогу та просто вказати значення замість цього).

Якщо default-pathвстановлено не порожнє значення, його значення буде використовуватися замість "успадкування" поточного робочого каталогу від викликів командного рядка tmux neww.

У FAQ для tmux є запис під назвою "Як я можу відкрити нове вікно в тій же папці, що й поточне вікно?", Що описує інший підхід; це трохи заплутано, хоча.


6
Чи є спосіб я <prefix>cскласти карту, щоб прочитати робочий каталог базового екземпляра оболонки (якщо такий є) і встановити default-pathперед виконанням new-window. Або це занадто багато, щоб просити tmux :)
Шрікант Шарат

З іншого боку, чи можна навіть прочитати робочий каталог оболонки? Я б убив, щоб він відображався в моєму рядку стану.
Шрікант Шарат

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.
Blauhirn

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.

Я також відповів на це повторне запитання .


10

З останніми версіями tmux (v1.8, але, можливо, і в v1.7):

tmux new-window -c "$PWD"

Здається, це працює і з розділеним вікном, наприкладtmux split-window -v -c "$PWD"
user7089

3
$PWDне працює для мене в tmux 1.9a. Довелося використовувати, pane_current_pathяк було запропоновано вище.
jordelver

3

Інші відповіді не спрацьовують для мене, коли я намагаюсь поставити їх як прив'язки (конкретно tmux split-window -c). Але я створив власне рішення, яке використовую вже більше року, яке працює як для нового вікна, так і для розбиття:

~/.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. Дивіться тут коментовані рядки для версії, що працює для старих tmuxes, у яких немає команди 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.