'ESC'가 커서를 vim으로 다시 이동시키는 이유는 무엇입니까?


62

vim에서 ESC명령 모드로 돌아 가려고 누르면 커서가 한 문자 왼쪽으로 이동합니다. 이것은 내가 바라는 것이 아니며, 때때로 나는 즉시 l그 자리로 돌아가서, 아마도 캐릭터를 삭제하기 위해 맞았습니다 .

이 동작에 대한 이유가 있습니까? 누락 된 사용법 패턴에 편리합니까?


1
나는 지금까지 이것조차도 눈치 채지 못했습니다 ... 그리고 매일 vim을 사용합니다. 왜 그런지 모르겠지만 답을 듣는 데 관심이 있습니다.
개브.

5
삽입 모드로 돌아 가면 삽입을 위해 'i'대신 'a'를 눌러 추가 할 수 있습니다. 그런 다음 이스케이프 키를 누르기 전에 원래 위치로 돌아갑니다.
penguin359

답변:


40

삽입 모드에서 커서는 문자 사이 또는 첫 문자 앞이나 마지막 문자 앞입니다. 일반 모드에서 커서는 문자 위에 있습니다 (줄 바꾸기는이 목적을위한 문자가 아닙니다). 이것은 다소 이례적인 일이다 : 대부분의 편집자는 항상 문자 사이에 커서를 놓고, 대부분의 명령은 캐릭터에 따라 행동이 (하지, 엄밀히 말하면, 아래 ) 커서. 이 GUI를하기 전에, 텍스트 단자는 항상 아마 사실에 부분적으로 기인 했다 문자 (아마 깜박 블록 밑줄 또는)에 커서를. 이 추상화는 삽입 모드에서 실패합니다 (포스트 대 펜스).

모드를 전환하려면 커서를 반자 씩 움직여야합니다. i왼쪽 명령 이동은 끝났다고 문자하기 전에 커서를 넣어. a명령 바로 이동합니다. 삽입 모드를 종료하면 (을 누름 Esc) 커서가 가능한 경우 왼쪽으로 이동합니다 (행의 시작 부분에 있으면 대신 오른쪽으로 이동).

나는 Esc행동이 말이 된다고 생각합니다 . 종종 줄 끝에서 입력하고 Esc왼쪽으로 만 갈 수 있습니다. 따라서 일반적인 행동이 가장 일반적인 행동입니다.

커서 아래의 문자를 마지막으로 재미있는 문자로, insert 명령을로 생각하십시오 a. a Esc비어 있지 않은 줄의 시작 부분에서 시작하면 한 위치에 충돌하는 것을 제외하고 커서를 움직이지 않고 반복 할 수 있습니다.


21

시각적으로 gvim에서 더 의미가 있습니다.

편집 할 때 커서는 문자 사이에 있습니다.
여기에 이미지 설명을 입력하십시오

일반 모드에서는 마지막 문자 위에 있습니다.
여기에 이미지 설명을 입력하십시오

그래서 정말 그냥되는 것을, 문자를 다시하지 않는 사이 rs인에 r


1
멋진 사진. 솔직히 말해서, 나는 캠프에 있는데 캐릭터 m가 일반 모드로 돌아올 때 강조 표시를 유지해야 한다고 말합니다 .
Steven Lu

죄송합니다. 사진 링크가 이제 죽었습니다.
Steven Lu

1
이미지 링크가 이제 죽었습니다.
Steven Lu

1
예, 이미지를 수동으로 호스팅하는 것은이 사이트의 마크 다운 편집기에있는 도구를 사용하는 것보다 더 많은 작업과 안정성을 제공합니다.
Steven Lu

1
그들 모두 다시 괜찮아요? 입력 한 내용이 "커서"이고 텍스트에 "j"가 언급되어 있습니다.
poige

15

이 행동은 here 응답 된대로 편집 할 수 있지만 잠시 멈추고 생각 하십시오 . 삽입 모드에있을 때 실제로 문자 위에있는 것이 아니라 문자 사이에있는 것입니다. 무언가를 삽입하면 커서가 삽입 한 것의 끝으로 이동하여 다음에 삽입 된 것이 그 다음에옵니다. 이제 방금 편지를 입력 한 후 무언가를하고 싶었는지 생각해보십시오. 타격 Esc하면 선택 커서가 마지막으로 삽입 한 문자 바로 위에 놓입니다. 그렇게하지 않으면 실제로 어색 할 것입니다.

아마도 여러분이 생각하고있는 상황은 삽입 모드에있을 때 마치 일반 모드 인 것처럼 움직 인 다음 전환하는 것입니다. 이 경우 커서는 한 문자 뒤로 이동하는 것처럼 보이지만, 그렇게 생각하면 삽입 모드에 있고 마지막으로 삽입 한 것이 아니라고 표시됩니다. 일반 모드에서 더 많은 시간을 보내야합니까?


15
그건 말이되지 않습니다. 반복 iESC키 누르기 의 거꾸로 걷는 동작을 어떻게 설명 합니까?
워렌 영

4
삽입 모드로 들어가서 아무것도 삽입하지 않고 그대로 두는 것은 공정한 테스트가 아닙니다. 삽입하지 않은 경우 왜 삽입 모드에 있습니까? 무언가를 삽입하면 일반 모드로 돌아가서 삽입 한 문자가 선택된 상태로 유지됩니다. 매우 직관적입니다.
Caleb

4
"공정"에 관한 것이 아니라 설명력에 관한 것입니다. 작동 이론이 모든 동작을 설명하지 못하는 경우, 동작이 불완전하거나 vi의 동작이 일치하지 않습니다. 나는 vi가 모든면에서 완벽하기 때문에 일관성이 있다고 믿고 싶습니다. :)
Warren Young

9
@Warren "뒤로 걷기"동작은 i다음 ESC의 기능 i이며 완전히 독립적입니다 ESC. 구체적으로 말하면, i당신이 vim에게 문자 를 삽입 하도록 요구 a하는 것입니다. 이것은 문자 적으로 "이 문자 다음에 문자를 추가합니다" 와 반대로 "내가있는 문자 앞에 문자를 삽입합니다"를 의미 합니다.
Kromey

3
일반적으로 각 변경 후, 해당 변경을 종료하면 해당 변경이 완료되고 다음으로 수행하려는 작업은 다른 변경을 수행하는 것입니다. 따라서 삽입 모드를 종료 할 때 (어떻게 입력했는지에 관계없이) 일반적으로 커서를 다음 문자 에두기를 선호하므로 원하는 것을 변경할 준비가되지 않고 다음 변경을 준비합니다. 삽입되었습니다.
Kyle Strand

6

Alt+ L를 입력 하여 명령 모드로 돌아갑니다.

다시 매핑 또는 vim 구성 변경이 필요하지 않습니다. 대부분의 터미널 에뮬레이터에 있기 때문에 작동 Alt+ KEY전송 Esc다음에 KEY(당신은 추가해야 할 수도 있습니다 xterm을에 Xterm*metaSendsEscape: true당신의 ~ / .Xdefaults를 파일에 라인). 이 동작을 통해 Alt+ S에서 와 같이 상자에서 바로 작동하는 다른 삽입 모드 조합을 "생성"할 수도 있습니다 Backspace.

그런데 방금 쓴 캐릭터 위에 커서를두면 매우 불편할 수 있습니다. 예를 들어, Escdw방금 삽입 한 텍스트 다음에 나오는 단어는 삭제하지 않습니다.


이스케이프하기 전에 항상 삽입 모드에서 공백을 입력하면 불편을 피할 수 있습니다. 그런 다음 삽입 모드를 떠나는 커서가 공백 위에 놓이고 입력 Esc d e한 단어를 앞에 삭제할 수 있습니다 . 머리에 이미 인코딩 된 다른 동작이 변경되었다고 느꼈기 때문에 기본 동작으로 되돌 렸습니다.
mljrg

4

여기 내 해결책이 있습니다.

Wikia 페이지 에서 제공되는 솔루션의 더 간결한 버전입니다 .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

사용자가 실제로이 동작을 변경하는 방법을 요구하지 않았더라도 위키 페이지를 인용하여 +1하십시오.
Kyle Strand

Vim을 충분히 파헤 치면 많은 플러그인이 기본 (약간 직관적이지 않은) 동작에 의존하므로 임의의 물건을 무작위로 먹거나 맹 글링하면 단일 문자를 볼 수 있습니다. 이 자동 명령을 직접 사용하지는 않습니다. 그래도 잘 작동합니다.
Steven Lu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.