gnome-terminal의 xterm에서 vim의 모바일 기능 키를 수정하는 방법은 무엇입니까?

gnome-terminal의 xterm에서 vim의 모바일 기능 키를 수정하는 방법은 무엇입니까?

<s-f2>매핑을 수행하기 위해 키를 누르면 nnoremap <s-f2> :set number!Vim은 위의 "삽입" 모드( )를 열고 문자열을 O입력합니다 . 1;2Q전체 터미널 키 코드를 보려면("일반" 모드에서 중간에 먹히지 않고) <c-v><s-f2>"삽입" 모드를 누르고 을 가져옵니다 ^[O1;2Q. 문자 ^[는 어디에 있습니까 <esc>?

읽은 후에도"터미널 Vim에서 바로가기 키코드 매핑"^[O1;2Q터미널 키 코드가 <s-f1>Vim 코드 에 매핑되지 않는 이유를 이해할 수 없습니다 . 그래서 내 파일 ~/.vimrc에 다음 함수를 정의했습니다 .

function! s:Mod_fix_shift_fkey()
  let a=0    
  let b='PQRS'    
  while a < 4    
    exec 'set <s-f' . (a + 1) . ">=\eO1;2" . b[a]    
    let a+=1    
  endwhile    
endfunction

<s-f1>이것을 호출하여 에서 로의 이동 기능 키를 수정했고 <s-f4>바인딩된 매핑이 <s-f2>갑자기 작동했습니다.

누군가 이것을 설명할 수 있나요?

<s-f5>또한 다음에서 이동된 기능 키를 수정해야 했습니다 <s-f12>.

  "...
  let a=5 
  let b='1517181920212324' 
  let c=0 
  while a < 16 
    exec 'set <s-f' . a . ">=\e[" . b[c : c + 1] . ';2~' 
    let a+=1 
    let c+=2
  endwhile
  "...

그리고 From <c-s-f1>to <c-s-f4><c-s-f5>To <c-s-f12>제어 전송 기능 키입니다. 예를 들면 다음과 같습니다.

" ...
exec 'map <esc>O1;6' . b[a] ' <c-s-f' . (a + 1) . '>'
" ...
exec 'map <esc>[' . b[c : c + 1] . ';6~ <c-s-f' . a . '>'
" ...

답변1

:set <Key>특별한 와일드카드 구문을 사용하여 Vim이 자동으로 인식하도록 할 수 있습니다.xterm-스타일 수정자 키:

if &term =~ '^gnome'
execute "set <xUp>=\e[1;*A"
execute "set <xDown>=\e[1;*B"
execute "set <xRight>=\e[1;*C"
execute "set <xLeft>=\e[1;*D"
execute "set <xHome>=\e[1;*H"
execute "set <xEnd>=\e[1;*F"
execute "set <PageUp>=\e[5;*~"
execute "set <PageDown>=\e[6;*~"
execute "set <F1>=\eOP"
execute "set <F2>=\eOQ"
execute "set <F3>=\eOR"
execute "set <F4>=\eOS"
execute "set <xF1>=\eO1;*P"
execute "set <xF2>=\eO1;*Q"
execute "set <xF3>=\eO1;*R"
execute "set <xF4>=\eO1;*S"
execute "set <F5>=\e[15;*~"
execute "set <F6>=\e[17;*~"
execute "set <F7>=\e[18;*~"
execute "set <F8>=\e[19;*~"
execute "set <F9>=\e[20;*~"
execute "set <F10>=\e[21;*~"
execute "set <F11>=\e[23;*~"
execute "set <F12>=\e[24;*~"
endif

:help xterm-function-keys및 을 참조하십시오 :help xterm-modifier-keys.

답변2

@chris-johnsen의 스크립트는 작동할 것 같지만 해석에 몇 가지 문제가 있습니다.

  • 우선, vim은용어 모자애플리케이션. ncurses 인터페이스와 같은 termcap 인터페이스를 사용합니다.
  • ncurses는 기능 키의 이름을 제공하지만 termcap 애플리케이션은 완전한 이름만 볼 수 있습니다.
  • 대부분의 Shift 기능 키는 다음과 같습니다.확장 기능, 터미널 데이터베이스에 설명된 대로.
  • 관심있는 콘텐츠는xterm 부분주석이 달린
    # 대부분의 xterm 확장은 기능 키용입니다. 패치 #94 이후(
    # 1999), xterm은 Shift/Control/Alt/메타 수정자를 지원합니다.
    # 추가 기능 키 문자열. 다른 개발자들이 이 기능을 복사했는데,
    # 패치 #167(2002)에서는 xterm을 따르지 않았지만,
    # 이러한 핵심 정의는 너무 모호하지 않습니다.
  • 언급된 변경 사항패치 #167교환 매개변수는 다음과 같습니다.수정자그리고키 코드수정자가 커서 키의 중복 개수로 오해될 수 있는 문제를 방지하기 위해( emacs다른 termcap 응용 프로그램에서)
  • xterm을 변경해도 vim은 "tcap-query"에 도입된 다른 확장을 사용하기 때문에 그다지 영향을 받지 않았습니다.패치 #148xterm.
  • gnome-terminal 또는 konsole에서 vim을 사용하면 "tcap-query" 기능이 부족하고 기능 키가 보내는 내용을 알 수 있는 방법이 없습니다(사용자가 키 바인딩 정보를 입력하는 것 외에는).
  • gnome-terminal과 konsole(잘 문서화되지 않았기 때문에 어느 것이 "첫 번째"인지 확실하지 않음)은 xterm의 초기 동작을 복사했기 때문에 이로 인해 최소 10년 동안 버그 보고서(예: 이 질문)가 생성되었습니다. 그런데 ncurses는 이러한 터미널에 대한 올바른 터미널 설명을 제공하지만 이러한 터미널은 대부분 사용되지 않습니다. 표준화가 너무 많습니다.

표준화의 일환으로:

  • 기능 키가 전송되는 "표준"은 없습니다.
  • xterm은 (어쨌든 1990년대 초반부터) vt220 키보드용 확장으로 시작되었습니다. vt220은 F6-F20을 정의합니다. F1-F5는 "로컬"입니다. 밖에서 일어난 일은 나중에 일어났습니다.
  • 확장의 동기는 원래 20개로 균등하게 나눌 수 없는 PC 키보드(12개의 기능 키가 있음)에서 나왔습니다. 따라서 xterm에는 24개의 키가 있고 Shift(원래)를 사용합니다.
  • F1-F4는 xterm의 vt100 에뮬레이션에 PF1-PF4를 제공하는 데에도 사용되기 때문에 특별합니다. 가 아닌 P, Q, R, S로 끝납니다 "~". 변환을 고려하면 이는 질문에 언급된 단점 중 하나를 추가합니다.
  • Control-, Meta-는 나중에 나타납니다.패치 #94. 12개의 실제 키가 24개처럼 보이는 대신 몇 개가 남고(terminfo/termcap 60 기능 키 제한을 수용하기 위해) 48개(control 및 Shift 키)를 얻습니다.
  • 처음에는 추가 키의 이름을 만들 이유가 없었지만 나중에 다른 특수 키(커서 및 편집 키보드)에 수정자가 추가되었습니다.
  • (거의 비슷한 시기에) 그런 일이 있었어요.ncurses 확장확장명을 제공하십시오.
  • AX일부 확장은 termcap에서 테스트를 수행할 수 있도록 설계되었지만(예 : )전혀특수 키 수 확장은 termcap 인터페이스를 사용하여 테스트할 수 있습니다.

관련 정보