Liên kết ngược-giết-từ với Ctrl + w


23

Tôi đang cố gắng chuyển từ sử dụng Tcsh kéo dài sang khám phá Bash gần đây.

Tôi đã quản lý để chuyển qua tất cả các tính năng yêu thích của mình, ngoại trừ Ctrl + w coi khoảng trắng và dấu gạch chéo làm ranh giới từ, rất có thể là từ lùi-giết-từ. Tuy nhiên, trong Bash readline xóa tất cả các khoảng trống đến khoảng trống đầu tiên, xóa tất cả các dấu gạch chéo giữa.

Tôi đã thử nhiều kết hợp khác nhau của \ Cw: back-kill-word trong cả .inputrc và .bashrc bằng cách sử dụng liên kết nhưng tôi không thể làm cho nó hoạt động theo cách tôi muốn.

Thật thú vị, thông qua Putty từ Windows tại nơi làm việc, tôi có thể sử dụng Alt + Backspace, cũng là hướng dẫn sử dụng là ràng buộc mặc định, để tạo ra hành vi chính xác mà tôi muốn. Nhưng trong Terminal.app trên máy Mac của tôi ở nhà thì điều này không hoạt động. Điều tương tự cũng xảy ra với bất kỳ máy chủ FreeBSD hoặc Linux nào mà tôi tình cờ đăng nhập từ Terminal.app.

Vì vậy, tôi chuyển sang superuser để được giúp đỡ.

Câu trả lời:


40

readlinekhông liên kết qua Ctrl- Wvì nó được xử lý bởi trình điều khiển đầu cuối theo mặc định:

$ stty -a
(...) werase = ^W; (...)

Để tắt tính năng này, bạn phải chạy (trong ~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcsẽ không giúp đỡ ở đây vì nó được đọc khi Ctrl- Wvẫn được gán cho werase.

Cũng lưu ý rằng \C-wkeyseqs định dạng phải được đặt trong dấu ngoặc kép, như trên.


Thiết bị đầu cuối khác nhau có thể xử lý Alt- Backspacekhác nhau.

  • PuTTY và Gnome Terminal (có cài đặt mặc định) send 1b 7f( ESC DEL)
  • Xterm với metaSendsEscape: truesend 1b 08( ESC BS).
  • Xterm không metaSendsEscape gửi 88( HTShoặc BSvới tập bit cao nhất).

Xterm có một vài cài đặt để kiểm soát hành vi của Altkhóa ( Metanói chung trong Xterm và X11). Với metaSendsEscape, giữ Altsẽ tiền tố nhấn phím bằng một ESC(hex 1b). Nếu không có cài đặt (chế độ mặc định), Altsẽ đặt bit cao nhất của ký tự đầu vào, dẫn đến các ký tự đặc biệt. (Ví dụ, Alt- Nkết quả trong ESC nîtương ứng.)

Theo như tôi có thể nhớ, Terminal.app cũng có một cài đặt tương tự để kiểm soát hành vi của Meta / Alt / bất cứ thứ gì mà Mac sử dụng.


Đây không chỉ là câu trả lời tốt nhất mà còn cực kỳ nhiều thông tin, cảm ơn bạn!
Stefan M

1
@shurane: Các werase "từ xóa" hành động, như xóa bình thường (Backspace), được thực hiện bởi hệ điều hành riêng của mình, trong "thiết bị tty" tài xế - thông báo rằng họ đang có sẵn ngay cả trong các chương trình mà chỉ mù quáng đọc từ stdin, ví dụ: cat. Trên tất cả các Unix, sttyđược sử dụng để kiểm soát các tham số tty khác nhau bao gồm các khóa đặc biệt này. (Đây là phiên bản UNIX thứ 7stty trông như thế nào.)
grawity

1
@shurane: Trong khi đó, readline là một thư viện không gian người dùng ban đầu được viết cho bash shell (mặc dù hiện được nhiều chương trình sử dụng). Có thể là những hành động khác được thực hiện trong readline để tránh đầy hơi driver tty (mà đã có một số lượng đáng kể của cờ và Toggles, như đã thấy trong stty's bằng tay). Ngoài ra, bash ban đầu được dành cho hệ điều hành GNU và chỉ sau đó được chuyển sang các Unix khác; việc duy trì các tính năng chỉnh sửa trong một thư viện sẽ dễ dàng hơn nhiều so với một số nhân rất khác nhau.
grawity

3
@shurane: Về mặt kỹ thuật, tuy nhiên, tất cả những hành động này, bao gồm cả chữ xóa, được thực hiện bởi readline - khi kích hoạt, nó hoàn toàn vô hiệu hóa Backspace và Ctrl + W xử lý bởi trình điều khiển thiết bị đầu cuối. readline chỉ tôn trọng sttycấu hình cho đơn giản, nhưng nó có thể được ghi đè bằng các cài đặt riêng của readline (như được mô tả trong câu trả lời của Matt Day).
grawity

4
Đây là một câu trả lời tuyệt vời cho thông tin, upvote. Tuy nhiên, cần lưu ý rằng điều này sẽ vô hiệu hóa Ctrl-w cho tất cả các chương trình trừ khi chúng sử dụng readline, đây có thể không phải là điều mà bất cứ ai muốn ..., vì vậy hãy thử câu trả lời của @fjarlq.
0fnt

19

grawity đã viết rằng điều này không thể được kiểm soát trong .inputrctập tin, nhưng điều đó là không chính xác.

Nếu bạn set bind-tty-special-chars offở trong .inputrc, bạn có thể tùy chỉnh hành vi của các ký tự đầu cuối đặc biệt.

Ví dụ:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
Và điều này có lợi ích khi làm việc cho tất cả các chương trình sử dụng readline, ví dụ python.
wchargein

3

Đối với bản ghi, câu trả lời được áp dụng cho iTerm2 là đặt Alt- Backspace(hoặc Opt ⌥- trên Mac) để gửi Mã Hex 0xb10x7fđể thực hiện backward-kill-wordhành động coi các ký tự không phải là chữ và số dưới dạng dấu phân cách.

Để phân biệt, đây là hành vi tôi đang mô tả, trong đó nhấn Opt ⌥- một lần thay đổi điều này:

echo "/example/filepath/with_non-alpha.characters@blah:meh

đến đây:

echo "/example/filepath/with_non-alpha.characters@blah:

Và những lần nhấn tiếp theo của Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

Đây là cài đặt trông như thế nào trong iTerm2: nhập mô tả hình ảnh ở đây

Vì vậy, cụ thể đối với Putty và Terminal, câu trả lời của grawity là tuyệt vời. Nhưng đã dành một khoảng thời gian đáng xấu hổ để tìm cách áp dụng cài đặt trong iTerm2, bài đăng siêu người dùng này dường như xuất hiện thường xuyên nhất, vì vậy dường như có trách nhiệm cung cấp thông tin liên quan khi áp dụng cho iTerm2 như một Câu trả lời cho Câu hỏi này.


Tôi đã mất một thời gian dài để tìm ra điều này và giải pháp này thực sự hoạt động trên OS X (với iTerm2) khi đăng nhập vào vỏ bash từ xa. Cảm ơn!
Martijn
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.