vi / Vim에서 여러 줄을 선택할 때 텍스트를 삽입하는 방법


423

에서 , 어떻게 선택의 각 행의 처음에 문자 삽입합니까?

예를 들어, 나는 //언어의 주석 시스템이 같은 블록 주석을 허용하지 않는다고 가정하고 각 줄의 시작 부분 에 앞에 붙임으로써 코드 블록을 주석 처리하고 싶습니다 /* */. 어떻게해야합니까?

답변:


748
  • Esc'명령 모드'로 들어가려면 누르십시오
  • Ctrl+ V를 사용 하여 비주얼 블록 모드로 들어갑니다
  • 주석을 달고 자하는 행에서 텍스트 열을 선택하려면 Up/ Down을 이동 하십시오.
  • 그런 다음 Shift+를 i누르고 삽입하려는 텍스트를 입력하십시오.
  • 그런 다음를 누르고 Esc1 초 동안 기다리면 삽입 된 텍스트가 모든 줄에 나타납니다.

자세한 내용과 정보 는 Vim Tips Wiki에서 " 여러 줄에 텍스트 삽입하기 "를 확인하십시오 .


6
이것에 대한 유일한 문제는 Ctrl + V가 GVIM에서 재정의 된 것입니다.
Jordan Parmer

14
나를 위해 (Linux에서) 그렇지 않습니다
pixelbeat

23
gVim에서 Ctrl-Q를 대체로 사용할 수 있지만 (:: Ctrl-V가 설명하는 것처럼) hjkl을 사용하여 화살표 키 대신이 모드를 탐색해야합니다.
Gareth

9
ctrl-v가 windows gvim에서 재정의 된 경우 mswin.vim 포함을 중지하도록 전역 vimrc를 편집해야합니다.
graywh

18
esc를 누른 후에 왜 이것이 효과가 없는지 아십니까? 나는 작은 백보다는 라인에서 발생하는 일에 대한 십초처럼 기다렸다 - 절대 마음, 내가 밀어했다 Shift + v없습니다 CTRL + v. @ vkaul11 아마도 당신이 한 일과 똑같은 일
Tek

186

이렇게하면 각 줄 의 시작 부분이 "//"로 바뀝니다 .

:%s!^!//!

선택한 각 줄 의 시작 (비주얼 모드를 사용하여 선택)을 "//"로 바꿉니다 .

:'<,'>s!^!//!

참고 있음 gv(일반 모드)가 지난 시각적 선택을 복원, 이것은 때때로 유용합니다.


3
감사! 완전히 이해됩니다. 텍스트를 제거하면 '<,'> s! ^ // !!
Jordan Parmer

4
위의 답변에서 느낌표의 의미는 무엇입니까? (: % s! ^! //!)
Henrik K

19
@HKK, 일반적으로 슬래시 문자 /를 검색 및 바꾸기 명령의 델리 미터로 사용합니다. 이 경우 검색의 일부로 슬래시를 삽입하고 교체하여 대체 델리 미터, 즉 느낌표 문자를 사용합니다!
사이버 스님

+1 (Ctrl + V) (Shiift + I) Esc가없는 VsVim에서 작동합니다.
세스 리노

4
+1, (내가 사용하고 여기에 당신이 정규식 구분 기호로 다른 것을 사용할 수 몰랐다 /과 탈출하는 데 //:s/^/\/\/쓰는 대신 :s!^!//)
Hashbrown

83

검색 및 바꾸기의 일반적인 패턴은 다음과 같습니다.

:s/search/replace/

현재 행에 대해 처음으로 나타나는 'search'를 'replace'로 바꿉니다.

:s/search/replace/g

현재 행의 모든 ​​'검색'항목을 '바꾸기'로 바꿉니다. 'g'는 '전역'의 줄임말입니다.

이 명령은 현재 행에 대해서만 각 'search'를 'replace'로 바꿉니다. %는 전체 파일을 검색하는 데 사용됩니다. 각 교체를 대화식으로 확인하려면 확인을 위해 'c'를 추가하십시오.

:%s/search/replace/c

전체 파일에 대해 '검색'을 '바꾸기'로 바꾸는 대화식 확인

% 문자 대신 행 번호 범위를 사용할 수 있습니다 ( '^'문자는 행 시작에 대한 특수 검색 문자입니다) .

:14,20s/^/#/

14-20 줄의 시작 부분에 '#'문자를 삽입합니다

//와 같은 다른 주석 문자를 사용하려면 명령 구분 기호를 변경하십시오.

:14,20s!^!//!

14-20 행의 시작 부분에 '//'문자 시퀀스를 삽입합니다

또는 항상 다음과 같이 // 문자를 이스케이프 처리 할 수 ​​있습니다.

:14,20s/^/\/\//

14-20 행의 시작 부분에 '//'문자 시퀀스를 삽입합니다

편집기에 줄 번호가 표시되지 않으면 다음을 입력하십시오.

:set nu

시작 #을 제거합니다 : 대신 : 14,20s / # / ^ / 당신이 사용해야합니다 14,20s / # //
cn1h

1
@ cn1h 나는 이것이 #라인의 다른 것을 대체 할 것이라고 생각합니다 . ^#대신 사용해야 합니다.
ankush981

기본 사항을 설명해 주셔서 감사합니다. 왜 이런 일이 발생하는지 아는 것이 좋습니다.
didierCH

38

새로 온 사람들에게 더 쉬운 또 다른 방법 :

 some█
 code
 here

첫 번째 줄에 커서를 놓습니다 (예 :

gg

삽입 모드로 들어가서 텍스트를 추가하려면 다음을 입력하십시오.

I / / Space

 // █some
 code
 here

Esc명령 모드로 돌아가서 digraph를 사용하려면 누릅니다 .

j . j .

 // some
 // code
 //█here

j한 줄 아래로 내려 가고 .마지막으로 편집 한 명령을 반복 하는 동작 명령 입니다.


3
정말 간단합니다 :). 문제가 |있는 경우 대문자 대신 막대 (\가있는 다른 기호)를 입력하기 때문일 수 있습니다 I. 나는 |처음에 생각했다 .
cokedude

1
"5"를하면 같은 줄에서 5자를 삭제합니다. 각 줄에서 한 번에 5자를 삭제하려면 어떻게합니까?
Rahul Prasad

1
@RahulPrasad 25 줄을 가지고 있고 첫 번째 줄의 앞쪽에서 5xj를 레지스터에 기록하고 24 번 그 레지스터를 재생한다고 가정 해 봅시다. 그것이 존재하지 않으면 ...
ninegrid

26

그리고 또 다른 방법 :

  • 줄의 시작으로 이동
  • 비주얼 블록 모드로 들어가기 ( CTRL- v)
  • 당신이 원하는 라인을 선택 (아래로 / 위로 이동 j/ k[온라인]와 라인에, 또는 점프 G)
  • 언론 I(자본 i)
  • 주석 문자를 입력하십시오
  • 프레스 ESC

20

이것은 #모든 줄의 시작 부분에 추가 됩니다.

:%s/^/#/

그리고 사람들은 적절하게 주석을 달지 않는 스크립트에 대해 불평하지 않을 것입니다.


2
선택한 (또는 적은 수) 줄에만 #을 추가하려면 어떻게해야합니까
Rahul Prasad

15

그것에 대해 멋진 생각을하고 싶다면 이것을 .vimrc에 넣으십시오.

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

그런 다음, 비주얼 모드에서, 당신은 칠 수마다 \cC 블록을 omment과 \uU 를 ncomment. 물론 바로 가기 키 입력을 무엇이든 변경할 수 있습니다.


새로운 것을 소개했기 때문에 공감-- vmap!
ankush981

11

또 다른 방법 :

:'<,'>g/^/norm I//

/^/모든 라인과 일치하는 더미 패턴입니다. norm다음 일반 모드 명령을 실행할 수 있습니다. I//커서를 줄의 시작 부분으로 이동하는 동안 삽입 모드로 들어가라고 말한 후 다음 텍스트 (두 슬래시)를 삽입하십시오.

:g 여러 모드 사이를 이동하거나, 여러 줄을 삭제하거나 추가하거나, 커서를 움직이거나, 여러 매크로를 실행하는 등 여러 줄에서 복잡한 작업을 수행하는 데 종종 편리합니다. 패턴과 일치합니다.


1
실제로 : g 명령은 필요하지 않습니다. : '<,'> norm I //
Cyber ​​Oliveira

1
이 경우에도 : s를 사용하는 것이 좋습니다.
graywh

가장 유용한 답변입니다.
Peaceful

3

코드 블록에 주석을 달기 위해 NERD Commenter 플러그인을 좋아합니다 .

일부 텍스트를 선택하십시오.

Shift-V
...select the lines of text you want to comment....

논평:

,cc

주석 해제 :

,cu

또는 라인 또는 블록의 주석 상태를 토글하십시오.

,c<space>

2

EnhCommentify 플러그인을 추천 할 수 있습니다 .

예. 이것을 vimrc에 넣으십시오.

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

그런 다음 ', c'로 (선택한) 줄을 주석 처리하거나 주석 처리를 제거 할 수 있습니다



1

주석이있는 영역을 시각적 블록으로 표시합니다 ( <C-V).

하고 c#<ESC>p

  1. c"#"에 걸다
  2. 다시 넣어

자주 수행하는 경우 \q.vimrc에서 바로 가기 (예 :)를 정의 하십시오.

:vmap \q c#<ESC>p

1

누군가의 다중 행 선택이 실제로 단락 인 경우 수동으로 행을 선택할 필요가 없습니다. vim은 당신을 위해 그것을 할 수 있습니다 :

  1. vip: 전체 단락을 선택하고 표시하십시오.
  2. shift-i: 줄 시작에 텍스트 삽입
  3. escape: 삽입 모드 종료 / 정상 모드 입력 [행 시작이 여전히 선택됨]
  4. escape: 줄 시작 선택 해제

0

각 줄의 시작 부분에 "ABC"를 삽입하려면

1) 명령 모드로 이동

2) : % 표준 I ABC


이렇게하면 줄의 첫 번째 공백이 아닌 문자 왼쪽에 텍스트가 추가됩니다.
Kingsley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.