Làm cách nào để tạo một cửa sổ mới trên thư mục hiện tại trong tmux?


208

Có thể mở một new-windowthư mục làm việc của nó được đặt thành thư mục tôi hiện đang sử dụng. Tôi đang sử dụng zsh , nếu có vấn đề.

Câu trả lời:


139

Bắt đầu từ năm tmux 1.9 các default-pathtùy chọn đã được gỡ bỏ, vì vậy bạn cần phải sử dụng các -ctùy chọn với new-window, và split-window(ví dụ bằng cách rebinding sự c, "%bindings để bao gồm
-c '#{pane_current_path}'). Xem một số câu trả lời khác cho câu hỏi này để biết chi tiết.


Một tính năng có liên quan đã hạ cánh trong thân cây tmux SVN vào đầu tháng 2 năm 2012. Trong các bản dựng tmux bao gồm mã này, các ràng buộc khóa tmux được gọi new-windowsẽ tạo ra một cửa sổ mới với cùng thư mục hoạt động hiện tại như các quy trình hoạt động của khung hiện tại (miễn là default-pathphiên tùy chọn trống, theo mặc định). Điều này cũng đúng với khung được tạo bởi split-windowlệnh khi nó được gọi thông qua một ràng buộc.

Điều này sử dụng mã dành riêng cho nền tảng đặc biệt, vì vậy chỉ có một số HĐH nhất định được hỗ trợ tại thời điểm này: Darwin (OS X), FreeBSD, Linux, OpenBSD và Solaris.

Điều này sẽ có sẵn trong phiên bản tiếp theo của tmux (1.7?).


Với tmux 1.4, tôi thường chỉ sử dụng

tmux neww

trong một shell đã có thư mục làm việc hiện tại mong muốn.

Tuy nhiên, nếu tôi dự đoán cần tạo nhiều cửa sổ với cùng thư mục làm việc hiện tại (hoặc tôi muốn có thể khởi động chúng bằng cliên kết phím <tiền tố> thông thường ), thì tôi đặt default-pathtùy chọn phiên thông qua

tmux set-option default-path "$PWD"

trong một shell đã có thư mục làm việc hiện tại mong muốn (mặc dù bạn rõ ràng có thể làm điều đó từ bất kỳ thư mục nào và chỉ cần chỉ định giá trị thay thế).

Nếu default-pathđược đặt thành một giá trị không trống, giá trị của nó sẽ được sử dụng thay vì truyền thừa kế của thư mục làm việc hiện tại từ các lệnh gọi dòng lệnh của tmux neww.

Câu hỏi thường gặp về tmux có một mục có tiêu đề là Làm thế nào tôi có thể mở một cửa sổ mới trong cùng thư mục với cửa sổ hiện tại? nó là một chút phức tạp mặc dù.


6
Có cách nào để tôi có thể ánh xạ <prefix>cđể đọc thư mục làm việc của thể hiện shell bên dưới (nếu có) và đặt default-pathtrước khi thực thi new-window. Hoặc là quá nhiều để hỏi về tmux :)
Shrikant Sharat

Một lưu ý khác, thậm chí có thể đọc thư mục làm việc của shell bên dưới không? Tôi sẽ giết để nó hiển thị trên thanh trạng thái của tôi.
Shrikant Sharat

2
Không có cách di động để trích xuất cwd của một quá trình khác (mặc dù có thể trên một số nền tảng (ví dụ: /proc/PID/cwdtrên Linux)). Có một giải pháp một phần có thể có trong một mục của Câu hỏi thường gặp về tmux (nó có vỏ ghi lại cwd của nó khi nó in một dấu nhắc, sau đó liên kết một khóa bắt đầu một vỏ mới trong thư mục được ghi).
Chris Johnsen

ok, đây là một chút ngoài phạm vi cho kiến ​​thức của tôi và không cảm thấy rất đáng tin cậy. Một cái gì đó cho tôi biết tôi có thể tốt hơn mà không cần tất cả điều này .. dù sao cũng cảm ơn.
Shrikant Sharat

1
@paradroid: Mọi thứ được thực hiện thông qua một ràng buộc sẽ (theo mặc định) sử dụng cwd của máy chủ tmux hoặc giá trị của default-pathtùy chọn phiên (nếu điều đó được đặt). Câu hỏi thường gặp về tmux có một mục mô tả cách liên kết khóa bắt đầu một cửa sổ mới với cwd của shell đang chạy trong cửa sổ hiện tại (. Làm thế nào tôi có thể mở một cửa sổ mới trong cùng thư mục với cửa sổ hiện tại? , nhưng phương pháp này khá phức tạp. Điều tương tự có thể được thực hiện cho split-windownew-session(thay vì neww).
Chris Johnsen

268

Trang man Tmux (1.9a) hiện tại liệt kê một -c start-directorytham số tùy chọn cho một số lệnh, bao gồm new-windowsplit-window. Nó cũng chứa biến định dạng pane_current_path, trong đó đề cập đến Current path if available.

Bằng cách kết hợp những thứ này, chúng ta có thể mở một cửa sổ mới với thư mục làm việc hiện tại bằng cách sử dụng
new-window -c "#{pane_current_path}"
Báo giá trong trường hợp đường dẫn hiện tại chứa khoảng trắng.

Nếu bạn muốn chia ngăn hiện tại theo chiều dọc, hãy sử dụng
split-window -c "#{pane_current_path}"
hoặc, để phân chia theo chiều ngang
split-window -h -c "#{pane_current_path}"

Để làm cho các ràng buộc chính mở các phân chia và cửa sổ mới với thư mục làm việc hiện tại theo mặc định, hãy thêm các mục sau vào .tmux.conf. Các "trích dẫn xung quanh là để nói với Tmux rằng nó không nên bắt đầu một chuỗi mà chỉ ràng buộc "khóa.

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

1
Điều này không hoạt động trên tmux 1.9? Tôi không thể làm cho nó để làm điều mong đợi.
Erik Garrison

1
bind-key -r Nhập new-window -c "# {pane_civerse_path}", hoạt động cho tmux 2.1
Marslo

5
Hoạt động trong tmux 2.3 trên OSX. Đừng quên dừng / hủy tất cả các phiên hiện có để xem các ràng buộc này được áp dụng.
jmgarnier

1
@jmgarnier hoặc nguồn lại hồ sơ: prefix- :, sau đó nhậpsource ~/.tmux.conf
ijoseph

8
@jmgarnier hay chỉ tmux source-file .tmux.conf.
phil294

37

Có, sử dụng new-window -c "#{pane_current_path}". Bạn có thể thêm các mục sau vào ~/.tmux.confđể làm cho nó bền bỉ (giả định các phím bấm mặc định):

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

Các default-paththiết lập con đường đã được lấy ra từ mã thượng nguồn và tác giả tmux đề nghị trong đó cam kết thông báo bằng cách sử dụng -c "#{pane_current_path}"hoặc -c "$PWDtrong new-windowsplit-windowlệnh.

Tôi cũng đã trả lời trong câu hỏi trùng lặp này .


10

Với các phiên bản gần đây của tmux (v1.8, nhưng có thể trong v1.7 cũng vậy):

tmux new-window -c "$PWD"

Điều này dường như làm việc với chia cửa sổ là tốt, ví dụtmux split-window -v -c "$PWD"
user7089

3
$PWDkhông xuất hiện để làm việc cho tôi trong tmux 1.9a. Tôi đã phải sử dụng pane_current_pathnhư đề xuất ở trên.
jordelver

3

Các câu trả lời khác không hiệu quả với tôi khi tôi thử đặt chúng làm ràng buộc (cụ thể tmux split-window -c). Nhưng tôi đã tạo ra giải pháp của riêng mình mà tôi đã sử dụng trong hơn một năm hoạt động cho cả cửa sổ mới và chia nhỏ:

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

Hoạt động, ít nhất, với $ (tmux -V) 1.8. Xem các dòng nhận xét ở đây để biết phiên bản hoạt động cho các tmux cũ không có lệnh hiển thị môi trường.


0

tmux đã làm điều đó trong phiên bản 1.8 nhưng trong 1.9, tính năng này đã bị loại bỏ vì sử dụng -ccờ.

Điều này có thể được giải quyết nhưng ràng buộc new-windowlại nhưng trong trường hợp bạn muốn chạy một cái gì đó thì nó trở nên quá dài dòng: thay vì gõ neww man tmuxbạn sẽ phải gõ neww -c "#{pane_current_path}" man tmuxmà bạn có lẽ không muốn làm.

Có một mod của tmux (Tôi là tác giả) để thêm ngôn ngữ kịch bản phù hợp vào tmux để cho phép sử dụng bí danh, liên kết nhiều lệnh trong 'mode', biến, vòng lặp, v.v ... Và cũng, nó mang lại hành vi đó : cửa sổ mới và panes được mở trong thư mục hiện tại.

Nó có thể được xây dựng từ các nguồn ở đây: http://ershov.github.io/tmux/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.