Ctrl-Backspace và Ctrl-Delete trong bash


14

Đưa lên Debian 8.3

stty werase '^H'

hoặc trên Arch Linux 2/2016

stty werase '^?'

trong .bashrc(ví dụ) làm Ctrl- Backspacexóa từ cuối cùng trong thiết bị đầu cuối. Tuy nhiên nó không phải là hành vi tương tự như trong các ứng dụng giao diện hiện đại (ví dụ như Firefox): Nó xóa cuối cùng khoảng trắng từ -separated, và không phải là từ cuối cùng cách nhau bởi khoảng trắng hoặc ký tự như . : , ; " ' & / ( ).

Có thể thực hiện Ctrl- Backspacehành xử trong thiết bị đầu cuối tương tự như các ứng dụng GUI hiện đại không? Ngoài ra, có cách nào để thực hiện Ctrl- Deletexóa từ ngay trước con trỏ không?


1
Shell của bạn có thể hỗ trợ các hành động đó, có thể được liên kết với một khóa nhất định.
Thomas Dickey

@ThomasDickey: Tôi đang sử dụng bash. Thật tốt nếu nó hoạt động chỉ trong bash.
sói-revo-mèo

Câu trả lời:


27

Có hai trình soạn thảo dòng đang chơi ở đây: trình chỉnh sửa dòng cơ bản được cung cấp bởi kernel (trình chỉnh sửa dòng tty line) và trình chỉnh sửa dòng của bash (được thực hiện thông qua thư viện readline). Cả hai đều có lệnh xóa từ-trước-từ được ràng buộc với Ctrl+ Wtheo mặc định. Khóa có thể được cấu hình cho trình soạn thảo dòng tty chế độ chính tắc thông qua stty werase; bash bắt chước ràng buộc chính mà nó tìm thấy trong cài đặt tty trừ khi bị ghi đè trong cấu hình của chính nó.

Các werasehành động trong trình soạn thảo dòng tty không thể được cấu hình. Nó luôn xóa các từ được phân tách bằng khoảng trắng (ASCII). Rất hiếm khi tương tác với trình chỉnh sửa dòng tty - đó là những gì bạn nhận được, ví dụ như khi bạn nhập catmà không có đối số. Nếu bạn muốn các ràng buộc khóa ưa thích ở đó, bạn có thể chạy lệnh dưới một công cụ như rlwrap sử dụng readline.

Bash cung cấp hai lệnh để xóa từ trước đó : unix-word-rubout( Ctrl+ whoặc như được đặt qua stty werase) và backward-kill-word( M-DEL, tức là Esc Backspace) coi một từ là một chuỗi các ký tự chữ và số trong ngôn ngữ hiện tại và_ . Nếu bạn muốn Ctrl+ Backspacexóa chuỗi ký tự chữ và số trước đó, đừng đặt stty werasevà thay vào đó hãy đặt dòng sau vào .inputrc:

"\C-h": backward-kill-word

Lưu ý rằng điều này giả định rằng thiết bị đầu cuối của bạn gửi ký tự Ctrl + H cho Ctrl+ Backspace. Thật không may, đó là một trong những khóa không có ràng buộc tiêu chuẩn (và Backspaceđặc biệt là một mớ hỗn độn vì lý do lịch sử).

Cũng có một lệnh đối xứng kill-wordđược ràng buộc với M-d( Alt+ D) theo mặc định. Để liên kết nó với Ctrl+ Delete, trước tiên bạn cần tìm ra chuỗi thoát nào mà thiết bị đầu cuối của bạn gửi, sau đó thêm một dòng tương ứng trong của bạn .inputrc. Gõ Ctrl+ Vrồi Ctrl+ Delete; cái này sẽ chèn cái gì đó giống như ^[[3;5~nơi ban đầu ^[là một đại diện trực quan của nhân vật thoát. Sau đó, ràng buộc là

"\e[3;5~": kill-word

Nếu bạn không hài lòng với định nghĩa của một từ, bạn có thể cung cấp từ riêng của bạn trong bash: xem hành vi khó hiểu của các phím bấm kiểu emacs trong bash


2
giải thích tuyệt vời! Các Ctrl+Delcông việc tốt. Tuy nhiên, tôi không thể Ctrl+Backspaceđi làm. Đối với Ctrl+v, Ctrl+Backspacethiết bị đầu cuối của tôi nói ^?. Tôi nên đặt cái .inputrcgì vào ? Cảm ơn bạn
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordhoặc bất kỳ chức năng đọc nào bạn muốn. Nhưng bạn chỉ có thể xác định ràng buộc cho Ctrl + Backspace khác với ràng buộc cho Backspace nếu chúng gửi các ký tự khác nhau. Nếu thiết bị đầu cuối của bạn gửi ^?cho cả Backspace và Ctrl + Backspace, thì ứng dụng đang chạy trong thiết bị đầu cuối không có cách nào để phân biệt chúng. Một số thiết bị đầu cuối có thể được cấu hình (ví dụ xterm, urxvt), một số khác (ví dụ: trình giả lập thiết bị đầu cuối dựa trên VTE) không thể.
Gilles 'SO- ngừng trở thành ác quỷ'

4
điều quan trọng cần lưu ý là việc xác định sẽ ~/.inputrcvô hiệu hóa mặc định /etc/inputrc. để khắc phục điều này, bạn phải bao gồm tệp đó: $include /etc/inputrc(từ đây )
Ciprian Tomoiagă

+1 cho Esc + Backspace
Celal Ergün

6

Thử

alt+backspace

Trong hệ điều hành cơ bản, nó hoạt động như cách bạn muốn (giống như ctrl+ backspace)


1

Hành vi của ký tự WERASE trong xử lý thiết bị đầu cuối chế độ nấu được mã hóa cứng , ít nhất là trong Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

Vì vậy, các từ là chữ cái, chữ số và gạch dưới. Đây là cách nó sẽ diễn ra mọi lúc trong một thiết bị đầu cuối trên Linux khi một ứng dụng tự xử lý chế độ nấu không hoạt động.

phiên bản của readline (được sử dụng bởi bash và những người khác) có vẻ hơi khác so với phiên bản của kernel, nhưng dường như nó cũng bị mã hóa cứng :

Các từ được bao gồm các chữ cái và chữ số.

Nhưng điều này dường như không phù hợp với những gì bashthực sự làm cho tôi: foo+bar^Wxóa tất cả mọi thứ, không chỉ bar. Có nhiều thông tin về điều đó ở đây .


1. người dùng vi có lẽ chỉ đang tìm kiếm backward-kill-word(ràng buộc mặc định M-DEL) thay vì unix-word-rubout.
Gilles 'SO- ngừng trở nên xấu xa'
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.