readline의 모드, 키맵, 기본 바인딩은 무엇입니까?

readline의 모드, 키맵, 기본 바인딩은 무엇입니까?

readline모드와 키맵의 차이점은 무엇입니까?

각 모드의 기본 키 바인딩을 어떻게 찾나요?

답변1

긴 이야기 짧게

emacs(기본값)에 대한 기본 키 바인딩을 보려면(예제) 다음을 사용하십시오.

INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$'

, vi그리고vi-commandvi-move하나이고 같은 것키 매핑.

둘 다 emacs-meta키맵 emacs-ctlx의 하위 집합 보기 입니다 emacs.

vi모드와 맵에 대해 더 알고 싶으시면 제목 editing-mode vi(마지막)으로 건너뛰세요.

하지만 기다려! 그러나 꽤 많은 배경 정보가 필요할 수 있습니다. 예를 들어 editing-modean 과 a 의 차이점이 있습니다 keymap.

emacs특히 유용한 것은 쉽게 변경할 수 있으면서도 텍스트를 삽입할 수 있는 하이브리드 키맵 개념입니다 vi-command.

editing-mode이들an그리고 a의 차이점은 무엇인가요 keymap?

가지다오직두 개의 editing-modes: ( emacs기본값) 및 vi.

이것GNU Readline 라이브러리 문서설명하다:

editing-mode
    The editing-mode variable controls which default set of key bindings is
    used. By default, Readline starts up in Emacs editing mode, where the
    keystrokes are most similar to Emacs. This variable can be set to either
    `emacs' or `vi'.

editing-mode와 : 사이의 차이점에 주목하세요 keymap. 이 두 가지(예, 두 개만 있습니다. 계속 읽으세요)에서는 editing-mode vi키맵이 서로 바뀌어 vi편집기의 다양한 모드를 시뮬레이션합니다.모두이는 emacs동시에 실행됩니다 editing-mode emacs(나중에 설명).

그렇다면 editing-mode실제로는 무엇을 합니까? 단순히 활성 키맵을 emacs또는 쉘이 시작될 때 설정합니다 vi-insert.

독특한 키맵은 무엇입니까?

Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx,
vi, vi-move, vi-command, and vi-insert.

vi is equivalent to vi-command; emacs is equivalent to emacs-standard.

문서화되지는 않았지만 vi/ vi-commandvi-move키맵도 동일합니다.

+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$ 

이로 인해 emacs, emacs-meta, emacs-ctlxvivi-insert고유한 키맵으로 해석됩니다. 키맵을 구별하는 것은 아마도 키맵을 검사하여 수행하는 것이 가장 좋습니다.

키맵 기본 바인딩은 무엇입니까?

예를 들어 emacs(기본값)에 대한 기본 키 바인딩을 보려면 다음을 사용하십시오.

INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#

emacs위의 예를 다른 키맵 이름으로 바꿀 수 있습니다 .

self-insert별로 유용하지 않다고 말하는 줄 이 많으 do-lowercase-version므로 삭제하세요.

INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort

다양한 키맵의 차이점은 무엇입니까 emacs?

핵심요약: 적용할 매핑 집합에 대한 서로 다른 관점입니다 editing-mode emacs.

emacs-standardemacs-meta두 번째 명령의 출력을 , , emacs-ctlx, vi-commandvi-insert해당 s 라는 파일에 넣으면 다음을 keymap찾을 수 있습니다.

매핑되지 않은 명령은 emacs-meta다음에 emacs-ctlx나타나지 않습니다 emacs-standard.

$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-ctlx|sort)
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-meta|sort)
$

따라서 emacs/ 는 emacs-standard두 가지 모두의 행동 기능적 상위 집합입니다 . 이는 다음을 emacs-ctlx의미합니다 .emacs-meta

keymap emacs
"\eg": glob-expand-word
"\C-x\C-r": re-read-init-file

기능적으로 다음과 동일합니다.

keymap emacs-meta
"g": glob-expand-word

keymap emacs-ctlx
"\C-r": re-read-init-file

두 번째 양식이 읽기 더 쉽다고 말할 수도 있습니다.

텍스트 삽입: emacsvi-insert

emacs-standardnot in에는 28개의 명령이 있습니다.vi-insert

+ravi@boxy:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
28
+ravi@boxy:~/lib/readline$

emacs/는 emacs-standard기본적으로 의 상위 집합입니다 vi-insert. 따라서 텍스트를 입력할 때는 가능한 한 오랫동안 emacs-standard키맵을 사용하는 것이 가장 좋습니다.vi-insert쉽게 전환 emacs하고vi-command.

vi-insertnot in의 유일한 추가 바인딩은 emacs-standard다음과 같습니다.

+ravi@boxy:~/lib/readline$ comm -23 vi-insert emacs-standard 
"\C-d": vi-eof-maybe
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\e": vi-movement-mode

이 네 가지 중 처음 세 가지는 emacs바인딩과 충돌합니다.

"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history

저는 다음과 같이 해결했습니다.

set keymap emacs
"\e": "kj" # see https://unix.stackexchange.com/questions/303631/how-can-i-setup-a-hybrid-readline-with-emacs-insert-mode-and-vi-command-mode
"\C-d": delete-char # eof-maybe: ^D does nothing if there is text on the line
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\C-y": previous-history # historY
"\e\C-y": previous-history

editing-mode vi

위에서 본 바와 같이 , vi, vi-commandvi-move하나이고 같은 것키맵:

+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$ 

총액은 그냥 참고만 해주세요기본적으로 와 연관된 다른 지도입니다 editing-mode vi.

에 있을 때 editing-mode vi사용 keymap되는 s는 vi// vi-command및 (시작 키맵) 입니다 vi-move. vi-insert이 두 맵 중 하나만 동시에 활성화됩니다.

editing-mode vi쉘이 시작될 때 로 표시된 기본 키맵을 설정합니다 vi-insert. 마찬가지로, 한 번에 하나의 키맵만 활성화됩니다. 이 vi-insert키맵은 대부분의 키를 매핑 self-insert하므로 키보드의 플라스틱 버튼을 누르면 그 버튼에 인쇄된 기호가 화면에 나타납니다.

키맵을 사용 하면 기본적으로 키맵의 키에 바인딩된 명령을 사용하여 vi-insert//라는 텍스트 작업 키맵으로 교체 할 수 있습니다 vi-command.vivi-movevi-movement-modeESCvi-insert

실제로 위에서 언급한 하이브리드 솔루션과 같이 명령을 사용하여 텍스트와 같은 작업에 대해 emacs키맵을 활성화하도록 설정할 수도 있습니다 .vivi-movement-mode

아니면 더 간단한 언어로...

기본적으로 키맵이 활성화된 경우 ESC키맵을 변경하려면 누르세요.vi-commandvi-insert

키맵은 편집기의 기본 모드나 명령 모드와 마찬가지로 vi-command표준 단일 키(예: a, 및 b) 를 사용하여 c텍스트를 이동하고 상호 작용합니다 . 일반적으로 + 조합 vi은 없습니다 . 이 모드에서는 문자 키가 편집/이동 명령에 매핑되어 텍스트를 삽입할 수 없습니다. 텍스트를 입력하려면 키맵으로 전환하면 됩니다(예: "삽입" 누르기).Ctrlkeyvi-inserti

vi-insert파일에 키맵이 있으면 쉘이 시작될 때 활성화되는 키맵을 사용하여 텍스트를 입력합니다 . 키맵으로 전환하려면 "삽입" 키를 누르십시오. (키맵으로 부팅하신 분들을 위해 다른 방법도 있습니다.)editing-mode vi.inputrcvi-insertivi-commandvi

vi에디터 에 익숙하지 않은 경우 vi-command처음에는 키 사용이 어려울 수 있지만, 능숙하게 사용하면 수염난 마법사처럼 텍스트를 편집할 수 있습니다.

관련 정보