vim에서 ESC
명령 모드로 돌아 가려고 누르면 커서가 한 문자 왼쪽으로 이동합니다. 이것은 내가 바라는 것이 아니며, 때때로 나는 즉시 l
그 자리로 돌아가서, 아마도 캐릭터를 삭제하기 위해 맞았습니다 .
이 동작에 대한 이유가 있습니까? 누락 된 사용법 패턴에 편리합니까?
vim에서 ESC
명령 모드로 돌아 가려고 누르면 커서가 한 문자 왼쪽으로 이동합니다. 이것은 내가 바라는 것이 아니며, 때때로 나는 즉시 l
그 자리로 돌아가서, 아마도 캐릭터를 삭제하기 위해 맞았습니다 .
이 동작에 대한 이유가 있습니까? 누락 된 사용법 패턴에 편리합니까?
답변:
삽입 모드에서 커서는 문자 사이 또는 첫 문자 앞이나 마지막 문자 앞입니다. 일반 모드에서 커서는 문자 위에 있습니다 (줄 바꾸기는이 목적을위한 문자가 아닙니다). 이것은 다소 이례적인 일이다 : 대부분의 편집자는 항상 문자 사이에 커서를 놓고, 대부분의 명령은 캐릭터에 따라 행동이 후 (하지, 엄밀히 말하면, 아래 ) 커서. 이 GUI를하기 전에, 텍스트 단자는 항상 아마 사실에 부분적으로 기인 했다 문자 (아마 깜박 블록 밑줄 또는)에 커서를. 이 추상화는 삽입 모드에서 실패합니다 (포스트 대 펜스).
모드를 전환하려면 커서를 반자 씩 움직여야합니다. i
왼쪽 명령 이동은 끝났다고 문자하기 전에 커서를 넣어. a
명령 바로 이동합니다. 삽입 모드를 종료하면 (을 누름 Esc) 커서가 가능한 경우 왼쪽으로 이동합니다 (행의 시작 부분에 있으면 대신 오른쪽으로 이동).
나는 Esc행동이 말이 된다고 생각합니다 . 종종 줄 끝에서 입력하고 Esc왼쪽으로 만 갈 수 있습니다. 따라서 일반적인 행동이 가장 일반적인 행동입니다.
커서 아래의 문자를 마지막으로 재미있는 문자로, insert 명령을로 생각하십시오 a
. a Esc비어 있지 않은 줄의 시작 부분에서 시작하면 한 위치에 충돌하는 것을 제외하고 커서를 움직이지 않고 반복 할 수 있습니다.
시각적으로 gvim에서 더 의미가 있습니다.
그래서 정말 그냥되는 것을, 문자를 다시하지 않는 사이 r
와 s
인에 에 r
m
가 일반 모드로 돌아올 때 강조 표시를 유지해야 한다고 말합니다 .
이 행동은 here 응답 된대로 편집 할 수 있지만 잠시 멈추고 생각 하십시오 . 삽입 모드에있을 때 실제로 문자 위에있는 것이 아니라 문자 사이에있는 것입니다. 무언가를 삽입하면 커서가 삽입 한 것의 끝으로 이동하여 다음에 삽입 된 것이 그 다음에옵니다. 이제 방금 편지를 입력 한 후 무언가를하고 싶었는지 생각해보십시오. 타격 Esc하면 선택 커서가 마지막으로 삽입 한 문자 바로 위에 놓입니다. 그렇게하지 않으면 실제로 어색 할 것입니다.
아마도 여러분이 생각하고있는 상황은 삽입 모드에있을 때 마치 일반 모드 인 것처럼 움직 인 다음 전환하는 것입니다. 이 경우 커서는 한 문자 뒤로 이동하는 것처럼 보이지만, 그렇게 생각하면 삽입 모드에 있고 마지막으로 삽입 한 것이 아니라고 표시됩니다. 일반 모드에서 더 많은 시간을 보내야합니까?
i
및 ESC
키 누르기 의 거꾸로 걷는 동작을 어떻게 설명 합니까?
i
다음 ESC
의 기능 i
이며 완전히 독립적입니다 ESC
. 구체적으로 말하면, i
당신이 vim에게 문자 를 삽입 하도록 요구 a
하는 것입니다. 이것은 문자 적으로 "이 문자 다음에 문자를 추가합니다" 와 반대로 "내가있는 문자 앞에 문자를 삽입합니다"를 의미 합니다.
Alt+ L를 입력 하여 명령 모드로 돌아갑니다.
다시 매핑 또는 vim 구성 변경이 필요하지 않습니다. 대부분의 터미널 에뮬레이터에 있기 때문에 작동 Alt+ KEY전송 Esc다음에 KEY(당신은 추가해야 할 수도 있습니다 xterm을에 Xterm*metaSendsEscape: true
당신의 ~ / .Xdefaults를 파일에 라인). 이 동작을 통해 Alt+ S에서 와 같이 상자에서 바로 작동하는 다른 삽입 모드 조합을 "생성"할 수도 있습니다 Backspace.
그런데 방금 쓴 캐릭터 위에 커서를두면 매우 불편할 수 있습니다. 예를 들어, Escdw방금 삽입 한 텍스트 다음에 나오는 단어는 삭제하지 않습니다.
Esc d e
한 단어를 앞에 삭제할 수 있습니다 . 머리에 이미 인코딩 된 다른 동작이 변경되었다고 느꼈기 때문에 기본 동작으로 되돌 렸습니다.
여기 내 해결책이 있습니다.
Wikia 페이지 에서 제공되는 솔루션의 더 간결한 버전입니다 .
au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])