<Esc>를 비활성화하지만 <C-[>는 유지


24

삽입 모드에서 다시 전환하는 데 익숙합니다 <Esc>. 이제 나는 <C-[>대신에 자신을 재교육하려고 합니다 <Esc>. 이를 위해 <Esc>재교육을 돕기 위해 비활성화해야합니다 .

문제는

:inoremap <Esc> <Nop>

또한 비활성화합니다 <C-[>. vim의 경우 동일한 것 같습니다.

다른 하나없이 비활성화 할 수있는 방법이 있습니까?


13
작업 환경에 따라 다릅니다. 대부분의 텍스트 터미널은 Esc또는 을 누를 때 응용 프로그램에 동일한 정보를 전송 C-[하므로 운이 좋지 않지만 GUI 버전의 Vim으로 또는 터미널을 재구성하여 무언가를 수행 할 수 있습니다.
Gilles 'SO- 악마 중지'

권리! vim 문제가 아닙니다. 키보드 매핑으로 해결 방법을 찾을 수 있습니다. 감사합니다
mxlian

3
@Gills 왜 대답에 넣지 않습니까? Google 직원과 Google 사이트 통계에 더 좋습니다.
로비 Wxyz 2016 년

2
@SuperScript 나는 이것을 조금 더 연구하고 답을 게시했습니다.
질 'SO-정지 존재 악마'

답변:


35

첫째, 약간의 역사. 예전에는 터미널에 텍스트를 입력 할 때 각 키가 응용 프로그램에 문자를 보냈습니다. 터미널이 연결된 기계가 더욱 강력 해짐에 따라 터미널은 제어 키로 표준화되어 인쇄되지 않았지만 어떤 종류의 기능을 가진 특수 문자를 보냅니다. 결국 승리 한 문자 집합은 ASCII 였으며 그 중 128 문자는 32 문자입니다. Ctrl문자 또는 10xxxxx₂ (2 진 표기법)으로 작성된 다른 기호와 함께 누르면 코드가 00xxxxx₂ 인 제어 문자를 전송합니다. 예를 들어 Ctrl+ [는 문자 번호 27₁₀ = 0011011₂을 전송하므로 [91₁₀ = 1011011₂입니다.

터미널의 일부 기능 키는 제어 문자를 보냈습니다.

  • Backspace= Ctrl-H(BS = 백 스페이스) ¹
  • Tab= Ctrl-I(HT = 수평 탭)
  • Linefeed= Ctrl-J(LF = 라인 피드) (이 터미널을 가진 터미널은 거의 없습니다)
  • Return또는 Enter= Ctrl-M(CR = 캐리지 리턴)
  • Escape= Ctrl-[(ESC = 탈출)

터미널에 더 많은 기능 키가있는 경우, 이들을 모두 표현하기에 충분한 제어 문자가 없습니다. 그래서 그들은 문자 시퀀스 를 보냈 으며, 보편적 인 규칙은이 문자 시퀀스가 ​​이스케이프 문자로 시작한다는 것 Ctrl-[입니다.

시간이 지남에 따라 하드웨어 터미널은 점점 더 어려워졌습니다. 요즘에는 키보드와 응용 프로그램간에 여러 수준의 번역이 있습니다. 사용 가능한 문자 수의 제한과 특정 키 조합과 특정 제어 문자 간의 하드 코딩 된 대응은 더 이상 관련이 없습니다. 그러나 응용 프로그램은 기존 터미널과 호환되는 상태를 유지하고 있으며 터미널은 기존 응용 프로그램과 호환 가능한 상태를 유지하므로 변경하기가 어렵습니다.

그래서 오늘날에도, 유닉스 계열 시스템, 터미널 에뮬레이터에서 실행되는 애플리케이션은 문자 수신에 Ctrl-I사용자가 누르는 Tab키, 문자 Ctrl-[사용자 프레스 Esc등의 경우 빔은 유닉스 터미널에서 실행되고, 그것을 구별 할 수 없습니다 <Esc>그리고 <Ctrl-[>상기 단말은 동일한 정보를 전송하기 때문이다.

다른 환경에서 실행되는 Vim에는 이러한 제한이 없으므로 원칙적으로 다른 정보를 보낼 수 있습니다. Vim은 Ctrl-[캐릭터를 사용하여 <Esc>많은 장소에서 표현 하기 때문에 변경하는 것은 비현실적입니다. 대신 Ctrl+ [는 다른 입력 이벤트를 보내도록 만들 수 있습니다.

나는 Vim 자체 EscCtrl+를 구별하는 어떤 버전도 알지 못합니다 [(그러나 내가 사용한 적이 없습니다). Gvim은 하나 의 정원 다양성 터미널모방 한 것으로 보인다 .

아이러니하게도 가장 좋은 방법은 터미널 에뮬레이터에서 Vim을 실행하는 것입니다. 일부 터미널 에뮬레이터를 사용하면 키 및 키 코드로 전송 된 이스케이프 시퀀스를 사용자 정의 할 수 있습니다. 따라서 Ctrl+ [가 ␛ ( Ctrl-[) 문자가 아닌 이스케이프 시퀀스 를 보내도록 정렬 할 수 있습니다 . 유닉스 계열 시스템을위한 "참조"터미널 에뮬레이터 인 Xterm은 두 가지 방식을 지원합니다. 예를 들면 다음과 같습니다.

  • Esc전송 Tab전송 모든 구성에서.
  • ?.VT100.modifyOtherKeys: 0(기본값) 또는 ?.VT100.modifyOtherKeys: 1, Ctrl+는 [전송 Ctrl+를 I보냅니다 . ?.VT100.modifyOtherKeys: 1ASCII 문자가없는 메타 조합 및 컨트롤 조합에만 영향을줍니다.
  • ?.VT100.modifyOtherKeys: 2?.VT100.formatOtherKeys: 0(기본값), Ctrl+는 [전송 ␛[27;5;91~Ctrl+를 I보냅니다 ␛[27;5;105~.
  • ?.VT100.modifyOtherKeys: 2하고 ?.VT100.formatOtherKeys: 1, Ctrl+는 [전송 ␛[91;5uCtrl+가 I전송합니다 ␛[105;5u.

xterm을 시작할 때 modifyOtherKeys 자원 을 설정하여 (및 formatOtherKeys두 체계 중에서 선택하여) 지원을 켜거나 응용 프로그램에서 동적으로 켜거나 끌 수 있습니다.

Vim은 내가 아는 내장 지원이 없습니다. 이스케이프 시퀀스에 대한 고유 한 바인딩을 작성할 수 있습니다. modifyOtherKeys수정 된 터미널 정의 를 제공하여 Vim이 터미널을 자동으로 모드로 설정하도록하는 것이 가능할 수 있지만 그렇게하는 것은이 답변의 범위를 벗어납니다.

Neovim 은 변형 중 하나를 기본적으로 지원합니다 . 내가 이해하는 한, 터미널이 지원하는 경우 지원을 켜지 않지만 사용자가 할 수 있습니다.

¹ 요즘에는 점점 더 일반적으로 Backspace문자 127을 보냅니다.

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