인터넷 자원(1,2,삼) 는 터미널이 수정되지 않은 키 조합과 구별할 수 없기 때문에 Ctrl-Shift-letter, Ctrl-number, Ctrl-i/ Tab, Ctrl-m/ Enter, Esc/ 가 Vim에서 안정적으로 매핑될 수 없는 특정 키 조합을 주장합니다 (자세한 배경 정보는 참조).Ctrl-[이것은 Giles의 답변입니다.그리고이 ASCII 테이블 기사). 구체적인 예로 지도를 보면
nnoremap <Tab> :!echo A<CR>
noremap <C-S-X> :!echo B<CR>
noremap <C-1> :!echo C<CR>
noremap <C-F1> :!echo D<CR>
A(또한 Gvim에서도)를 발생시키고 Tab인쇄 하고 B를 인쇄하며 매핑 할 수 없으며 전자는 Gvim에서도 매핑할 수 없습니다.Ctrl-iCtrl-xCtrl-Shift-xCtrl-{1,2,...}Ctrl-{F1,F2,...}
이 답변"Ctrl-a와 Ctrl-Shift-a를 어떻게 다르게 매핑합니까?"에 Xterm의 솔루션이 간략하게 설명되어 있지만 일부 사람들이 놓칠 수 있는 까다로운 세부 사항이 누락되어 있습니다. 이는 보다 완전한 답변을 제공하려는 시도입니다.
이것은 Vim 중심의 질문이지만 사용자 정의 가능한 매핑이 있는 다른 터미널 응용 프로그램은 이로부터 이점을 얻을 수 있습니다. Vifm이 확실한 예입니다.
답변1
나는부터 시작할 것이다Xterm가장 복잡한 것이기 때문이다.고양이그리고Urkesft마침내 해결되었습니다.
XResources
이것~/.Xresources
파일은 Xterm(및 일부 다른 Xlib 응용 프로그램)을 구성합니다. 편집을 마칠 때마다
xrdb ~/.Xresources
새 Xterm을 발행하고 열어 변경 사항을 테스트하십시오. 에서 시작하다
XTerm*metaSendsEscape: true
XTerm*eightBitInput: false
를 참고 man xterm
하시거나Xterm 구성색상 및 글꼴과 같은 추가 옵션의 경우 기본 설정이 정말 보기 흉합니다.
키 코드 보내기
우리는 따를 것이다레너드의 기사제안을 하고 터미널에서 이를 보내도록 합니다
CSI codepoint;modifier u
. 여기서
CSIEsc 문자 뒤에 가 오는 것을 나타냅니다
[
.코드 포인트매핑할 문자의 10진수 유니코드 값입니다. ASCII 문자는 유니코드에서도 동일한 십진수 표현을 갖습니다.
수정자아래 표에서 선택하세요:
전혀 옮기다 대리자 Alt+Shift 제어 키 Ctrl+Shift Ctrl+Alt Ctrl+Alt+Shift 1 2 삼 4 5 6 7 8
Ctrl-Shift-x
찾기X
ASCII 테이블십진수 값은 88인 것으로 나타났습니다. 따라서 CSI 88;5 u
Vim으로 보내야 합니다. 이것은 다음과 같습니다 .Xresources
.
XTerm*Translations: #override\
Ctrl ~Meta Shift <Key>x :string("\033[88;5u")
Ctrl-Shift-x이제 따옴표로 묶인 시퀀스를 생성합니다. 물결표는 수정자를 무효화합니다. 이는 ~Meta
Alt를 누르지 않았음을 의미합니다(메타는 Alt를 의미함). 033
8진수 Esc입니다.
백슬래시 뒤에는 공백이 없어야 하며(Xrdb는 이 오류에 대해 경고합니다), 앞에서 본 것처럼 여러 바인딩은 서로 분리되어야 합니다 \n\
.
탭 및 Ctrl-i
i
는 십진수 105와 Tab
십진수 9이지만 둘 다 9를 Ctrl-i
보냅니다 .TabASCII 테이블 기사설명하다. 따라서
Ctrl-i이를 명확하게 하기 위해 서로 다른 시퀀스를 보내야 하며 이전과 동일한 추론을 통해 다음과 같은 결론을 내립니다 CSI 105;5 u
.
XTerm*Translations: #override\
Ctrl ~Meta ~Shift <Key>i :string("\033[105;5u")
추가할 수도 있지만 10진수 9(8진수 11)가 이미 전송되었으므로 ~Ctrl ~Meta ~Shift <Key>Tab :string("\011")
중복됩니다 .Tab
수정은 Tab
수정된 C0 컨트롤 아래에 나열된 것처럼 특별합니다.
XTerm*Translations: #override\
~Ctrl ~Meta Shift <Key>Tab :string("\033[Z") \n\
Ctrl ~Meta ~Shift <Key>Tab :string("\033[9;5u") \n\
Ctrl ~Meta Shift <Key>Tab :string("\033[1;5Z")
더 많은 특수 키
여기에 속합니다 F1- F12그리고 Home다른 것들도 있습니다. Xterm에는 이미 명시적인 코드가 있으므로 Ctrl-vKeyVim의 삽입 모드를 눌러 직접 확인할 수 있습니다. 예를 들어 Ctrl-vCtrl-F1생성합니다 <ESC>[1;5P
.
윔멜케
이제 바인딩을 다음에 추가하기만 하면 됩니다 .vimrc
.
" Disambiguate Tab and Ctrl-i
nnoremap <ESC>[105;5u <C-I>
nnoremap <Tab> :!echo A<CR>
noremap <ESC>[88;5u :!echo B<CR>
noremap <ESC>[49;5u :!echo C<CR>
noremap <ESC>[1;5P :!echo D<CR>
라인 5는 매우 중요합니다. Ctrl-i점프 목록에서 뒤로 이동하는 데 사용되며 Tab더 이상 Xterm에 존재하지 않으며 대신 Vim에 다른 시퀀스를 보냅니다.그 순서Vim 아래의 콘텐츠에 매핑되어야 합니다 Ctrl-i.
추가 지침
삽입 모드에서 키를 눌렀을 때 지연이 느껴진다면 EscVim의 시간 제한 설정을 조정하세요
set timeoutlen=1000 ttimeoutlen=20
.timeoutlen 및 ttimeoutlen).어떤 키 기호를 입력해야 할지 확실하지 않은 경우 를
.Xresources
사용하여xev
찾으세요. 예를 들어 왼쪽 Windows/Super 키를 눌러 출력합니다Super_L
.엑스텀에서는Ctrl-Q그리고Ctrl-S레거시 기능인 흐름 제어용으로 예약되어 있습니다. 매핑하려면 먼저 다음을 추가하여 흐름 제어를 비활성화하세요.
" Disable XOFF/XON silent !stty -ixon " Redraw screen silent !resize>/dev/null
도착하다
.vimrc
.다른 TUI 프로그램에서 지도를 보이지 않게 하려면 Vim을 다른 Xterm 클래스 이름으로 유지하면 됩니다. 예를 들어
xterm -name vimterm -e vim file
대신 파일에서 사용하세요
vimterm
.XTerm
.Xresources
동일한 Vim 인스턴스에서 새 파일을 여는 방법도움이 될 수도 있습니다.
기타 터미널 에뮬레이터: Urxvt 및 Kitty
Urkesft에서 다른 구문을 사용하십시오 .Xresources
. ISO 14755로 인한 간섭 바인딩도 비활성화해야 합니다.
URxvt*iso14755: false
URxvt*keysym.C-i: \033[105;5u
URxvt*keysym.C-X: \033[88;5u
URxvt*keysym.C-1: \033[49;5u
URxvt*keysym.C-F1: \033[1;5P
고양이사용하지 않는 경우 .Xresources
바인딩하여 다음을 입력합니다
~/.config/kitty/kitty.conf
.
map ctrl+shift+x send_text application \033[88;5u
map ctrl+i send_text application \033[105;5u
map ctrl+1 send_text application \033[49;5u
map ctrl+F1 send_text application \033[1;5P