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


88

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

if (some_condition) {[ ]return; }

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

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


INSERT 모드로 들어 가지 않고 무언가를 삽입하고 싶습니까?
Jeremy Cantrell

26
@ jeremy-cantrell 예, "J"가 다음 줄에 합류하고 INSERT 모드로 들어 가지 않고 공백을 삽입하는 것처럼 요!
awendt

답변:


107

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

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


1
이것이 가장 쉬운 해결책이라고 생각합니다. 감사합니다 그렉.
Mark A. Nicolosi

4
'f [space]'는 'W'와 동일해야합니다 (즉, 다음 whitepsace로 이동)
Nathan Fellman

4
'W'는 한 문자를 너무 멀리 이동 하면 다음 공백 의 다음 문자로 이동합니다.
Greg Hewgill

1
를 사용 하여 삽입 모드로 전환하지 않으려는 경우 >><<을 사용 하여 들여 쓰기를 도울 수도 있습니다 s.
Conner

12

삽입 모드가 아닌 상태 에서 '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"으로 시작됩니다.

즐겨!


게시물의 질문이 아니라 제목의 잘못된 질문에 답변했습니다. 그가 알고 싶은 것은 선이 끊어졌지만 더 이상 목적을 달성하지 못하는 지점에 있던 공백을 쉽게 제거하는 방법입니다.
Aristotle Pagaltzis

감사. 작성자가 요청한 작업을 수행하기 위해 "Tweaks"섹션을 업데이트했습니다. 테스트했을 때 vi는 자동으로 여분의 공간을 제거했습니다. 그렇지 않은 경우 'x'를 사용하여 삭제하십시오. 그리고 vi 명령이 모뎀 회선 잡음처럼 보이는 이유는 무엇입니까? :-)
Adam Liss

11

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

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

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

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


5

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

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

:s/{/{\r/

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

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

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

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

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


BTW : g두 번의 키 입력으로 구성된 많은 vim 매핑에 '네임 스페이스'키로 사용되기 때문에 매핑되지 않습니다 (참조 :h g). 따라서이 매핑은 실제로는 안됩니다.
Hotschke 2015

g이미 '네임 스페이스'키로 사용중인 것을보고하는 좋은 명령이 있습니까?
slothbear 2015-04-24

특별히 아닙니다. 내가 말했듯 :help g이 기본 g+ 무언가 매핑 목록을 보는 한 가지 방법 입니다. z, [ ]예를 들어, 참조, 더 '네임 스페이스'키입니다 :help index. :verbose map gg로 시작하는 현재 정의 된 모든 매핑을보기 위해 호출 할 수 있습니다 . 유용한 웹 리소스는 viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (슬라이드 : speakerdeck.com/nelstrom/follow-my -leader )
Hotschke

3

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

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

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


1

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

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


1

기본적으로 줄을 분할 할 때 캐리지 리턴을 삽입하거나 공백에있는 경우 캐리지 리턴으로 대체합니다. 글쎄, 왜 둘 중 하나에 만족합니까? 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명령에 대한 멋진 자매 키 맵이 있습니다.


이것은 꽤 매끄 럽습니다. 의도적으로 K를 사용한 적이 있는지 확실하지 않지만 다른 곳에서 제거하거나 다시 매핑 할 가치가 있습니다.
dragon788

0

vimrc에서이 키 매핑을 설정하십시오.

:map <C-m> i<CR><Esc>h

그런 다음 vim에서 사용하려면 Ctrl + m을 누릅니다.


0

IMHO, 내장 매핑 gs은 유용한 매핑 이 아닙니다 (vim을 절전 모드로 전환). 다음을 분할에 사용할 수 있습니다.

nmap gs i<CR><ESC>

0

Vrapper 에서는 삽입 모드로 들어 가지 않고 줄을 분할하는 gql을 사용할 수 있지만 항상 들여 쓰기를 유지하지는 않습니다.


0

실제로 다음과 같은 결합 된 작업이 필요합니다.

  1. 눌러서 v비주얼 모드로 들어갑니다.
  2. 분할하려는 라인을 선택하십시오
  3. 눌러서 :명령 모드로 들어갑니다.
  4. s/\s/\r/g
  5. 끝난

0

입력이있는 경우 :

aaa bbb ccc ddd

출력하고 싶다

aaa
bbb
ccc
ddd

다음 명령을 사용할 수 있습니다.

f r<ENTER>;.;.

0

나는 이것이 내가 반대 행동을 기대했던 것의 가장 충실한 구현이라는 것을 알았습니다. J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

커서에서 단순한 새 줄을 수행하고 이전 줄에있는 모든 후행 공백을 처리 한 다음 커서를 올바른 위치로 반환합니다.

i <cr> <esc> -이것은 제안 된 가장 일반적인 솔루션 중 하나이며 커서 아래의 공백이 아닌 문자를 삭제하지 않지만 후행 공백이 남습니다.

^mw -새 줄의 시작으로 이동하고 아래에 표시를 만듭니다. w

gk -한 줄 위로 이동

:silent! s/\v +$//<cr> -정규식은 줄 끝의 공백을 대체합니다.

:noh<cr> -정규식이 켜져있을 수있는 검색 강조 표시를 지 웁니다.

`w -아래 마크를 반환 w

본질적으로 결합 모두 최고의 r<esc><cr>i<cr><esc>

참고 : S유용한 키를 잠재적으로 덮어 쓰는 이 경계가 있지만 이는 동의어이며 cc분할하는만큼 자주 사용하지 않기 때문에 덮어 쓰는 것이 좋습니다.


0

o ESC 명령은 당신을 위해 그것을 할 것입니다.


-1

이 매핑은 사용자가 가지고있는 한 줄 함수를 분리합니다. 커서를 줄에 놓고 일반 모드에서 'g'를 누르기 만하면됩니다.

:map g ^f{malr<CR>`a%hr<CR>`a

여는 중괄호 뒤에 공백이 있고 닫는 중괄호 앞에 공백이 있다고 가정합니다. 그것이 당신을 위해 작동하는지 확인하십시오.

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