readline
모드와 키맵의 차이점은 무엇입니까?
각 모드의 기본 키 바인딩을 어떻게 찾나요?
답변1
긴 이야기 짧게
emacs
(기본값)에 대한 기본 키 바인딩을 보려면(예제) 다음을 사용하십시오.
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$'
, vi
그리고vi-command
vi-move
하나이고 같은 것키 매핑.
둘 다 emacs-meta
키맵 emacs-ctlx
의 하위 집합 보기 입니다 emacs
.
vi
모드와 맵에 대해 더 알고 싶으시면 제목 editing-mode vi
(마지막)으로 건너뛰세요.
하지만 기다려! 그러나 꽤 많은 배경 정보가 필요할 수 있습니다. 예를 들어 editing-mode
an 과 a 의 차이점이 있습니다 keymap
.
emacs
특히 유용한 것은 쉽게 변경할 수 있으면서도 텍스트를 삽입할 수 있는 하이브리드 키맵 개념입니다 vi-command
.
editing-mode
이들an그리고 a의 차이점은 무엇인가요 keymap
?
가지다오직두 개의 editing-mode
s: ( 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-command
및 vi-move
키맵도 동일합니다.
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
이로 인해 emacs
, emacs-meta
, emacs-ctlx
및 vi
가 vi-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-standard
emacs-meta
두 번째 명령의 출력을 , , emacs-ctlx
, vi-command
및 vi-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
두 번째 양식이 읽기 더 쉽다고 말할 수도 있습니다.
텍스트 삽입: emacs
대vi-insert
emacs-standard
not 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-insert
not 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-command
는vi-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
.vi
vi-move
vi-movement-mode
ESCvi-insert
실제로 위에서 언급한 하이브리드 솔루션과 같이 명령을 사용하여 텍스트와 같은 작업에 대해 emacs
키맵을 활성화하도록 설정할 수도 있습니다 .vi
vi-movement-mode
아니면 더 간단한 언어로...
기본적으로 키맵이 활성화된 경우 ESC키맵을 변경하려면 누르세요.vi-command
vi-insert
키맵은 편집기의 기본 모드나 명령 모드와 마찬가지로 vi-command
표준 단일 키(예: a, 및 b) 를 사용하여 c텍스트를 이동하고 상호 작용합니다 . 일반적으로 + 조합 vi
은 없습니다 . 이 모드에서는 문자 키가 편집/이동 명령에 매핑되어 텍스트를 삽입할 수 없습니다. 텍스트를 입력하려면 키맵으로 전환하면 됩니다(예: "삽입" 누르기).Ctrlkeyvi-insert
i
vi-insert
파일에 키맵이 있으면 쉘이 시작될 때 활성화되는 키맵을 사용하여 텍스트를 입력합니다 . 키맵으로 전환하려면 "삽입" 키를 누르십시오. (키맵으로 부팅하신 분들을 위해 다른 방법도 있습니다.)editing-mode vi
.inputrc
vi-insert
ivi-command
vi
vi
에디터 에 익숙하지 않은 경우 vi-command
처음에는 키 사용이 어려울 수 있지만, 능숙하게 사용하면 수염난 마법사처럼 텍스트를 편집할 수 있습니다.