Bạn cần hai chuỗi lệnh để dọn dẹp mớ hỗn độn:
Đầu tiên, chạy cái này trong cửa sổ bị cắt xén (cái này hoạt động ngay cả khi bạn đang ở trong ssh
):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Sau đó chạy cái này trên máy tính chạy tmux
(nó hoạt động bên trong và bên ngoài tmux
):
Lệnh sau ảnh hưởng đến tất cả các tmux
trường hợp, có thể thay đổi trạng thái bên trái nhiều hơn cửa sổ hiện tại. Nếu bạn không cần tính năng đó, hãy bỏ nó đi.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Giải thích chi tiết
Điều này đã được lắp ráp để giải quyết tất cả các bit được tìm thấy trong các câu trả lời và bình luận khác. Hiện tại dường như chỉ còn lại một chút với lệnh thứ hai. (Xem trong "bit thiếu" bên dưới).
Để hiểu cách thức hoạt động của nó, trước tiên chúng ta hãy giết dòng trạng thái tmux
và tty
. Sau đó, chúng tôi sửa lại một lần nữa, sử dụng một phương thức luôn luôn có sẵn (không giống như lệnh reset
).
Làm thế nào để làm cho một tmux
thiết bị đầu cuối (giả định UTF-8
) không thể sử dụng
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Cảnh báo: Sau khi chạy lệnh trên, vỏ trông có vẻ mù và điếc và dường như chỉ nói chuyện nhảm nhí bằng một số ngôn ngữ ngoài hành tinh không xác định. Xem bên dưới về cách sửa chữa này.
Giải thích:
stty -echo
giết phản ứng loại thiết bị đầu cuối
printf '\016'
làm một SO
, vì vậy bạn đang ở trong bộ ký tự thay thế
printf '\033]2;%s\007' 'right status text'
đặt trạng thái đúng, trong trường hợp này $'\355
', làm lộ ra lỗi trình bày
printf '\033k%2000s\033\\' $'\302\217'
đặt tên tiêu đề cửa sổ
Đây có thể là sự kết hợp mà bạn có thể thấy trên thiết bị đầu cuối sau khi một số lệnh tương tác bị hỏng và rơi trở lại vào trình bao. (Với /bin/cat
bạn không thể kích hoạt stty -echo
IMHO, nhưng các lệnh tương tác như vim
thường đặt điều này.)
Bây giờ dọn dẹp mớ hỗn độn này
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Lưu ý: Nếu bạn sử dụng bản sao và dán (có thể bạn cần giữ Shift
trong khi dán), có lẽ bạn không thể thấy dán của mình nếu bạn đã sử dụng lệnh trên để gây rối với tty
. Do đó, chỉ cần nhấn phím Enter một cách mù quáng sau khi dán này.
Giải thích:
stty sane
thiết lập các tham số đầu cuối "sane", để bạn lấy lại tiếng vang của mình trong khi gõ
printf '\033k%s\033\\' "$(basename "$SHELL")"
đặt tiêu đề cửa sổ trở lại bình thường. Bạn có thể sử dụng tmux rename-window "$(basename "$SHELL")"
thay thế, tuy nhiên tmux rename-window
bị giới hạn tmux
ở nơi trình tự thoát luôn hoạt động.
printf '\033]2;%s\007' "$(uname -n)"
Đặt lại quyền trạng thái được hiển thị như mặc định. (Lưu ý rằng bạn không nên sử dụng tmux set status-right "something"
, vì nó chỉ xuất ra pane title
cái bị hỏng, vì vậy status-right
chỉ lộ ra một số lỗi trình bày. Ngoài ra, tôi không tìm thấy tmux
lệnh để đặt tiêu đề khung trực tiếp.)
tput reset
Đặt lại thiết bị đầu cuối, chỉ trong trường hợp điều này đã bị rối với
tmux refresh
làm mới màn hình để loại bỏ các mảnh vụn khác có thể xuất hiện
Thiếu một chút
Việc printf '\033k%s\033\\' "$(basename "$SHELL")"
mất khả năng tiêu chuẩn tmux
để trình bày lệnh hiện tại trong khu vực trạng thái bên trái. Sau khi printf '\033k%s\033\\' "something"
được thực hiện, khả năng này bị mất và tôi không tìm thấy cách nào tốt, tuy nhiên, làm thế nào để đưa nó trở lại như trước.
Nhưng, như đã lưu ý trong các nhận xét bên dưới, bạn có thể kích hoạt một tính năng tương tự tmux
như thay thế với tmux
cài đặt sau :
set-window-option automatic-rename on
Hoặc làm điều này trong tmux
dòng lệnh, có thể đạt được trong cửa sổ hiện tại với "Escape" :
(trong đó "Escape" là tmux
phím lệnh của bạn ) và sau đó nhập lệnh.
Hoặc loại bỏ tmux set-window-option automatic-rename on
trong thiết bị đầu cuối hiện tại của bạn, nhưng điều này không thành công trong trường hợp bạn không trực tiếp ở cấp độ vỏ phải, ví dụ như nó không hoạt động trong sudo
hoặc ssh
.
Hoặc mở một cửa sổ khác trong tmux
phiên hiện tại và thực hiện lệnh sau:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Hoặc mở một shell khác cho máy tính đang chạy tmux
và thực thi lệnh sau (cái này nằm ngoài tmux):
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
PS: Cảm ơn tất cả những người đã giúp lắp ráp giải pháp này.