Bagaimana cara membuat jendela baru pada direktori saat ini di tmux?


209

Apakah mungkin untuk membuka new-windowdengan direktori kerjanya diatur ke yang saya saat ini masuk. Saya menggunakan zsh , jika itu penting.

Jawaban:


140

Mulai di tmux 1.9 default-pathopsi telah dihapus, sehingga Anda perlu menggunakan -cpilihan dengan new-window, dan split-window(misalnya dengan rebinding c, "dan %binding untuk memasukkan
-c '#{pane_current_path}'). Lihat beberapa jawaban lain untuk pertanyaan ini untuk perincian.


Fitur yang relevan mendarat di tmux SVN trunk pada awal Februari 2012. Dalam tmux build yang menyertakan kode ini, binding kunci tmux yang dipanggil new-windowakan membuat jendela baru dengan direktori kerja saat ini yang sama dengan proses aktif panel saat ini (selama default-pathsesi opsi kosong; ini secara default). Hal yang sama berlaku untuk panel yang dibuat oleh split-windowperintah ketika dipanggil melalui pengikatan.

Ini menggunakan kode khusus platform khusus, jadi hanya OS tertentu yang didukung saat ini: Darwin (OS X), FreeBSD, Linux, OpenBSD, dan Solaris.

Ini harus tersedia dalam rilis tmux berikutnya (1,7?).


Dengan tmux 1.4, saya biasanya hanya menggunakan

tmux neww

dalam sebuah shell yang sudah memiliki direktori kerja saat ini yang diinginkan.

Namun, jika saya mengantisipasi perlu membuat banyak jendela dengan direktori kerja saat ini yang sama (atau saya ingin dapat memulainya dengan cpenjilidan kunci <prefix> yang biasa ), maka saya mengatur default-pathopsi sesi melalui

tmux set-option default-path "$PWD"

di shell yang sudah memiliki direktori kerja saat ini yang diinginkan (meskipun Anda jelas bisa melakukannya dari direktori mana saja dan cukup tentukan nilainya).

Jika default-pathdiatur ke nilai non-kosong, nilainya akan digunakan alih-alih "mewarisi" direktori kerja saat ini dari permintaan baris perintah tmux neww.

The tmux FAQ memiliki sebuah entri berjudul “Bagaimana saya bisa membuka jendela baru di direktori yang sama sebagai jendela saat ini?” Yang menggambarkan pendekatan lain; itu agak berbelit-belit.


6
Apakah ada cara saya bisa memetakan <prefix>cuntuk membaca direktori kerja instance shell yang mendasarinya (jika ada) dan mengatur default-pathsebelum dieksekusi new-window. Atau terlalu banyak bertanya tentang tmux :)
Shrikant Sharat

Pada catatan lain, apakah mungkin membaca direktori kerja shell yang mendasarinya? Saya akan membunuh untuk ditampilkan di bilah status saya.
Shrikant Sharat

2
Tidak ada cara portabel untuk mengekstraksi cwd dari proses lain (meskipun dimungkinkan pada beberapa platform (misalnya /proc/PID/cwddi Linux)). Ada solusi parsial yang mungkin dalam entri dari FAQ tmux (ia memiliki catatan shell cwd ketika mencetak prompt, kemudian mengikat kunci yang memulai shell baru di direktori yang direkam).
Chris Johnsen

ok, ini sedikit di luar jangkauan untuk pengetahuan saya dan tidak merasa sangat dapat diandalkan. Sesuatu memberi tahu saya bahwa saya mungkin lebih baik tanpa semua ini .. terima kasih.
Shrikant Sharat

1
@paradroid: Apa pun yang dilakukan melalui penjilidan akan (secara default) menggunakan cwd dari server tmux atau nilai default-pathopsi sesi (jika itu diatur). The tmux FAQ memiliki entri yang menggambarkan cara untuk mengikat kunci yang dimulai jendela baru dengan cwd dari shell berjalan di jendela ( “Bagaimana saya bisa membuka jendela baru di direktori yang sama sebagai jendela saat ini?”) , tetapi metode ini cukup berbelit-belit. Hal yang sama mungkin bisa dilakukan untuk split-windowdan new-session(bukan neww).
Chris Johnsen

268

Halaman manual Tmux saat ini (1.9a) mencantumkan -c start-directoryparameter opsional untuk beberapa perintah, termasuk new-windowdan split-window. Ini juga berisi variabel format pane_current_path, yang merujuk ke Current path if available.

Dengan menggabungkan ini, kita dapat membuka jendela baru dengan direktori kerja saat ini menggunakan
new-window -c "#{pane_current_path}"
Kutipan diperlukan jika jalur saat ini berisi spasi.

Jika Anda ingin membagi panel saat ini secara vertikal, gunakan
split-window -c "#{pane_current_path}"
atau, untuk pemisahan horizontal
split-window -h -c "#{pane_current_path}"

Untuk membuat binding kunci membuka pemisahan baru dan jendela dengan direktori kerja saat ini secara default, tambahkan berikut ini ke .tmux.conf. Tanda "kutip di sekelilingnya adalah untuk memberi tahu Tmux bahwa itu tidak seharusnya memulai sebuah string melainkan mengikat "kunci.

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

1
Apakah ini tidak berfungsi pada tmux 1.9? Saya tidak bisa melakukannya untuk melakukan hal yang diharapkan.
Erik Garrison

1
bind-key -r Masukkan new-window -c "# {pane_current_path}", berfungsi untuk tmux 2.1
Marslo

5
Bekerja di tmux 2.3 di OSX. Jangan lupa untuk menghentikan / membunuh semua sesi yang ada untuk melihat binding ini diterapkan.
jmgarnier

1
@jmgarnier atau sumber ulang profil: prefix- :, lalu ketiksource ~/.tmux.conf
ijoseph

8
@ jmgarnier atau adil tmux source-file .tmux.conf.
phil294

37

Ya, gunakan new-window -c "#{pane_current_path}". Anda dapat menambahkan yang berikut ini ke Anda ~/.tmux.confuntuk membuatnya tetap (dengan asumsi keybindings default):

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

The default-pathpengaturan jalur itu dihapus dari kode hulu dan penulis tmux direkomendasikan dalam pesan komit baik menggunakan -c "#{pane_current_path}"atau -c "$PWDdalam new-windowdan split-windowperintah.

Saya juga menjawab dalam pertanyaan rangkap ini .


10

Dengan versi terbaru tmux (v1.8, tapi mungkin juga di v1.7):

tmux new-window -c "$PWD"

Ini tampaknya bekerja dengan jendela terpisah juga, misalnyatmux split-window -v -c "$PWD"
user7089

3
$PWDtampaknya tidak berfungsi untuk saya di tmux 1.9a. Saya harus menggunakan pane_current_pathseperti yang disarankan di atas.
jordelver

3

Jawaban lain tidak berfungsi untuk saya ketika saya mencoba meletakkannya sebagai binding (khusus tmux split-window -c). Tetapi saya telah membuat solusi saya sendiri yang telah saya gunakan selama lebih dari setahun yang bekerja baik untuk jendela baru dan pemisahan:

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

Paling tidak berfungsi dengan $ (tmux -V) 1.8. Lihat baris komentar di sini untuk versi yang berfungsi untuk tuxedo lama yang tidak memiliki perintah show-environment.


0

tmux melakukan itu dalam versi 1.8 tetapi pada 1.9 fitur ini dihapus karena menggunakan -cflag.

Ini bisa diselesaikan tetapi mengikat kembali new-windowtetapi jika Anda ingin menjalankan sesuatu yang lain itu menjadi terlalu bertele-tele: alih-alih mengetik neww man tmuxAnda harus mengetik neww -c "#{pane_current_path}" man tmuxyang paling tidak ingin Anda lakukan.

Ada mod tmux (saya penulis) untuk menambahkan bahasa scripting yang tepat ke tmux untuk memungkinkan menggunakan alias, mengikat beberapa perintah dalam 'mode', variabel, loop, dll ... Dan juga, itu mengembalikan perilaku itu : jendela dan panel baru dibuka di direktori saat ini.

Dapat dibangun dari sumber di sini: http://ershov.github.io/tmux/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.