readline에서 vi 편집 모드로 전환하려면 어떻게합니까?


16

readline 환경에서 vi 편집 모드로 전환하고 싶습니다. 그러나 'set -o vi'를 사용하고 싶지 않습니다. 키보드 단축키를 사용하여 일시적으로 전환하고 싶습니다. 매뉴얼 페이지에이 작업을 수행 할 수 있다고 M-C-j합니다. 그러나 그것은 나를 위해 작동하지 않습니다.

우분투와 xterm을 사용하고 있습니다. 그놈 터미널에서도 작동하지 않습니다.

답변:


12

키보드 매핑 Meta+ Control+ j가 실제로 시스템에서 올바른지 확인했습니다. 이 명령을 사용하여 다양한 Bash 모드에 대한 모든 키 바인드를 나열 할 수 있습니다. 내 시스템에는 키 바인딩이 없었습니다.

$ 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

Esc+ 를 입력 할 때 e2 개의 모드간에 전환 되도록 다음을 수행 할 수 있습니다 .

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

bind명령은 지금이 보여줍니다

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

이맥스 모드에서

$ 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".

이제 Esc+ e를 사용 하여 두 가지 모드간에 전환 할 수 있습니다.


입력 할 때 빠르지 않아야 ESC E합니다. 일시 중지하면 vi-insert에서 vi-command 모드로 이동하거나 현재 vi 명령을 취소 할 수 있습니다.
spelufo

6

Bash는 명시 적으로 이것과 다른 Readline 단축키를 비활성화합니다. initialize_readline()bash 소스 코드 ( http://www.catonmat.net/download/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

Readline 구성 파일 (.inputrc)을 사용하여이 동작을 재정의 할 수없는 것 같습니다.


6

다음 ~/.inputrc은 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

$if mode=구문을 시도했지만 파일을 읽을 때 정적으로 해결되었으므로 예상대로 작동하지 않습니다. 따라서 이전에 다른 키맵에서 설정 한 경우에도 각 키맵으로 전환하고 키 바인딩을 수정해야합니다. 마지막으로 시작하려는 모드를 말합니다.


2

vi 모드에서 emacs 스타일 매핑을 사용하려고했습니다. 나는 결국 :

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

매뉴얼 페이지 readline와 매뉴얼 페이지 의 READLINE섹션 을 읽는 것이 도움이됩니다 bash.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.