Làm cách nào để chuyển sang chế độ chỉnh sửa vi trong readline?


16

Tôi muốn chuyển sang chế độ chỉnh sửa vi trong môi trường đọc. Nhưng tôi không muốn sử dụng 'set -o vi'. Tôi muốn tạm thời chuyển bằng phím tắt. Trang người đàn ông nói tôi có thể làm điều này với M-C-j. Nhưng điều đó không làm việc cho tôi.

Tôi đang sử dụng Ubuntu và một xterm. Không hoạt động dưới gnome-terminal.

Câu trả lời:


12

Tôi xác nhận rằng ánh xạ bàn phím Meta+ Control+ jtrên thực tế là chính xác trên hệ thống của bạn. Bạn có thể sử dụng lệnh này để liệt kê tất cả các tổ hợp phím cho các chế độ khác nhau của Bash. Trên hệ thống của tôi cũng không có khóa phím.

$ bind -P| grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode is not bound to any keys

Bạn có thể làm như sau để khi bạn gõ Esc+ enó sẽ chuyển đổi giữa 2 chế độ.

$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'

Các bindlệnh bây giờ thấy điều này:

ở chế độ vi

$ bind -P |grep edit
edit-and-execute-command is not bound to any keys
emacs-editing-mode can be found on "\ee".
vi-editing-mode is not bound to any keys

trong chế độ emacs

$ bind -P |grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode can be found on "\ee".

Bây giờ bạn có thể sử dụng Esc+ eđể chuyển đổi giữa 2 chế độ khác nhau.


Lưu ý rằng bạn phải nhanh chóng khi gõ ESC E. Nếu bạn tạm dừng, bạn sẽ chuyển từ chế độ vi-insert sang chế độ vi-lệnh hoặc chỉ hủy lệnh vi hiện tại.
gameufo 20/2/2015

6

Bash rõ ràng vô hiệu hóa điều này và một vài phím tắt Readline khác. Xem initialize_readline()chức năng trong mã nguồn bash ( http://www.catonmat.net/doad/bashline.c ):

   /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
      so it is not necessary to allow C-M-j for context switching.  Turn
      off this occasionally confusing behaviour. */
   rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
   rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
#if defined (VI_MODE)
  rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
#endif

Tôi dường như không thể ghi đè hành vi này bằng tệp cấu hình Readline (.inputrc).


6

Đây là những gì tôi đã sử dụng cho tôi ~/.inputrc, dựa trên câu trả lời của slm.

set show-mode-in-prompt on

set keymap emacs
"\ea": vi-editing-mode

set keymap vi-command
"k": history-search-backward
"j": history-search-forward
"z": emacs-editing-mode
"\ea": emacs-editing-mode

set keymap vi-insert
"\ea": emacs-editing-mode
"\C-l": clear-screen
"\C-e": end-of-line
"\C-k": kill-line

set editing-mode vi

Tôi đã thử $if mode=cú pháp, nhưng tôi nghĩ rằng nó được giải quyết tĩnh (một lần, khi đọc tệp), vì vậy nó không hoạt động như tôi mong đợi. Vì vậy, chúng ta cần chuyển sang từng sơ đồ bàn phím và sửa đổi các ràng buộc chính của nó, ngay cả khi trước đó được đặt trên một keymap khác. Cuối cùng tôi nói tôi muốn bắt đầu với chế độ nào.


2

Tôi đã cố gắng để ánh xạ theo kiểu emacs được sử dụng trong chế độ vi. Tôi đã kết thúc với:

set keymap vi-command
"k": history-search-backward
"j": history-search-forward

set keymap vi-insert
"\C-A": beginning-of-line
"\C-B": backward-char
"\C-D": delete-char
"\C-E": end-of-line
"\C-F": forward-char
"\C-K": kill-line
"\C-L": clear-screen
"\C-N": next-history
"\C-P": previous-history
"\C-O": operate-and-get-next

# Enable Readline not waiting for additional input when a key is pressed.
# Needed for the mappings below.
set keyseq-timeout 0

# `yank-last-arg` does not work exactly as in emacs mode
"\e.": yank-last-arg
"\e\177": backward-kill-word
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\eb": backward-word
"\ec": capitalize-word
"\ed": kill-word
"\ef": forward-word
"\el": downcase-word
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\et": transpose-words
"\eu": upcase-word
"\ey": yank-pop

# some other useful mappings

"\e/": complete-filename
"\ek": kill-whole-line
"\eo": "\C-v\C-j"
# quickly switch to "normal" mode
"\C-[": vi-movement-mode
# perserve the currently editing line so that we can 
# do something else before restoring it.
"\eg": insert-comment
"\er": "\C-R#\C-A\C-D\C-E"

set editing-mode vi

Nó rất hữu ích để đọc trang người đàn ông cho readlineREADLINEphần trên bashtrang người đàn ông.

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.