[vim] Vim에서 삽입 모드로 들어 가지 않고 커서가있는 곳에 줄 바꿈을 삽입하려면 어떻게해야합니까?

삽입 모드로 들어 가지 않고 커서가 Vim에있는 곳에 줄 바꿈을 삽입 할 수 있습니까? 다음은 예입니다 ( [x]커서가 켜져 있음을 의미 함 x).

if (some_condition) {[ ]return; }

가끔 더 많은 코드를 입력하고 싶을 수도 있습니다. 그래서를 눌러 i삽입 모드로 들어가고를 눌러 Enter줄 바꿈을 삽입 한 다음 여분의 공백을 삭제합니다. 다음으로 일반 모드로 들어가서 닫는 중괄호 앞에 커서를 놓은 다음 동일한 작업을 수행하여 자체 줄에 표시합니다.

나는 이것을 한동안 해왔지만 확실히 더 좋은 방법이 있습니까?



답변

예를 들어 rEnter, 단일 문자 (공백)를 Enter로 바꾸는 데 사용할 수 있습니다 . 그런 fspace.다음 다음 공간으로 이동하고 마지막 명령을 반복합니다.

자동 들여 쓰기 설정에 따라 위의 내용은 return 문을 제대로 들여 쓰기 할 수도 있고 그렇지 않을 수도 있습니다. 그렇지 않은 경우 sEnterTabEsc대신을 사용 하여 공백을 개행으로 바꾸고, 줄을 들여 쓴 다음 삽입 모드를 종료하십시오. ‘.’를 사용할 수 없도록 두 번째 공백을 다른 명령으로 바꿔야합니다. 이 경우.


답변

삽입 모드가 아닌 상태 에서 ‘g’를 누를 때마다 커서에 개행 문자를 삽입하는 매크로를 만드는 방법은 다음과 같습니다 .

vim 내에서 다음을 입력하십시오.

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

어디:

  • [Ctrl + V] 는 Ctrl 키를 누른 상태에서 ‘v’를 누르는 것을 의미 합니다.
  • [Enter] 는 Enter 키를 누르는 것을 의미 합니다.
  • [Esc] 는 Esc 키를 누르는 것을 의미 합니다.

마지막 Enter 키를 누를 때까지 vim 창 하단에 다음이 표시됩니다.

:map g i^M^[

설명:

[Ctrl + V]는 “다음 문자 인용”을 의미합니다. 명령에 개행 문자와 이스케이프 문자를 포함 할 수 있습니다.

따라서 ‘g’키를 시퀀스에 매핑합니다.

i [Enter] [Escape]

이것은 커서 앞에 개행삽입 한 다음 삽입 모드를 종료하는 vim입니다 .

조정 :

  • 사용하는 명령에 아직 연결되지 않은 문자로 ‘g’를 바꿀 수 있습니다.
  • 명령, 더 추가 f}i^M^[O -이됩니다 F 산업사 }내가 다른 줄 바꿈 nsert, 다음 삽입 모드에서 탈출 O 펜 더 많은 코드를 입력 할 빈 줄.
  • 명령을 .vimrc 또는 .exrc 파일에 추가하여 영구적으로 만들 수 있습니다. 처음부터 콜론을 생략하면 명령이 “map”으로 시작됩니다.

즐겨!


답변

Ctrl + Enter를 눌러 커서에서 줄을 끊는 간단한 매핑 :

:nmap <c-cr> i<cr><Esc>

기본적으로 ‘삽입’모드로 들어가고 줄 바꿈을 삽입하고 일반 모드로 돌아갑니다.

나중에 사용할 수 있도록 .vimrc 파일에 넣으십시오.


답변

일반적으로 한 줄 블록을 세 줄로 확장하는 경우 대체를 시도하십시오. 여는 브래킷을 브래킷 / 리턴으로 변경하고 닫는 브래킷을 리턴 / 브래킷으로 변경하십시오.

대괄호를 대괄호 / 반환으로 대체하는 명령은 다음과 같습니다.

:s/{/{\r/

이것을 자주 사용하고 싶기 때문에 다음과 같이 전체 시퀀스를 사용하지 않는 키 입력에 매핑 할 수 있습니다.

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

^ M 이 표시된 곳에 [Ctrl-V]입력 한 다음 Enter 를 누릅니다 .

이제 샘플 라인의 아무 곳에 나 커서를 놓고 매핑 된 키를 누르면 캐리지 리턴이 추가됩니다.

:help map-which-keys매핑 할 사용하지 않는 키 입력 선택에 대한 조언을 확인하십시오 .


답변

K다른 것에 매핑해도 괜찮다고 가정하고 (원하는 다른 키 선택) 마커 '를 임시 마커로 사용하는 것은 괜찮다고 가정합니다.

:nmap K m'a<CR><Esc>`'

이제 일반 모드에서 줄 바꿈이 발생하려는 문자 위에 K를 누르면 줄이 분할되고 커서가 있던 자리에 남게됩니다.


답변

Vim은 autoindent(또는 다른 들여 쓰기 보조 기능)이 활성화 된 상태에서 두 줄로 나누면 커서 오른쪽에있는 공백을 자동으로 제거합니다 .

당신이 그 설정을 사용하지 않을 경우, 사용 s대신 i하기 위해 S는 단지 삽입하는 대신 빈에 대한 새로운 텍스트를 ubstitute. (공백이 여러 개인 경우 커서를 맨 왼쪽에 놓고 cw대신 사용하십시오.)


답변

기본적으로 줄을 분할 할 때 캐리지 리턴을 삽입하거나 공백에있는 경우 캐리지 리턴으로 대체합니다. 글쎄, 왜 둘 중 하나에 만족합니까? K에 대한 내 매핑은 다음과 같습니다.

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

삼항 연산자를 사용하여 두 작업을 하나의 키 맵으로 압축합니다. 분석 <expr>하면 키 맵의 출력이 동적 일 수 있으며,이 경우 getline('.')[col('.')-1]==' '커서 아래의 문자가 공백인지 여부를 vim에 묻는 조건에 따라 달라집니다. 마지막으로, 익숙한 삼항 연산자는 ? :LINEBREAK (공간 대체하거나 r<CR>() 또는 삽입 새를 i<CR><Esc>)

이제 J명령에 대한 멋진 자매 키 맵이 있습니다.