비주얼 모드에서 선택된 라인 세트를 주석 처리하는 방법은 무엇입니까?


35

시각 모드에서 선택한 선으로 여러 개를 주석 처리하려면 어떻게해야합니까? 특정 언어로 만들려면 어떻게합니까?

예를 들어, 처음 4 줄을 선택한 경우 :

def foo(a,b):
    for each in (a,b):
        print each
    return a+b
print "2"

명령 / 매크로의 작동은 다음과 같습니다 (파이썬).

#def foo(a,b):
#    for each in (a,b):
#        print each
#    return a+b
print "2"

답변:


31

언어 별 설명을 원하면 nerdcommenter 와 같은 플러그인이 필요합니다 .

또는 실제 질문에 대한 답변은 아니지만 내장 vim 작업과 각 언어의 주석 문자에 대한 지식을 사용할 수 있습니다.

옵션 # 1 : V- 블록

  1. :1 Enter (1 행으로 이동)
  2. Ctrl-V (V- 블록 모드)
  3. jjj (3 줄 아래)
  4. Shift-I (블록 전에 삽입 모드로 들어갑니다)
  5. # ( '#'삽입)
  6. Esc (정상 모드로 돌아 가기)

옵션 # 2 : 대체

:1,4s/^/#/

고장:

  1. : Ex 명령은 다음과 같습니다
  2. 1,4 1 ~ 4 행
  3. s 대용품
  4. /대체 명령을 구분하는 구분 기호입니다.
    (예를 들어 다른 문자를 사용할 수도 있습니다 :)
  5. ^ 줄의 시작
  6. / 분리 기호
  7. # 파이썬의 주석 문자
  8. / 최종 분리기

옵션 # 3 : 매크로 적용 반복 ( source )

  1. :1 Enter (1 행으로 이동)
  2. qa(레지스터에 기록 시작 a)
  3. Shift-I (줄 시작 부분에 삽입 모드로 들어갑니다.
  4. # (줄의 시작 부분에 '#'을 추가하십시오)
  5. Esc (정상 모드로 돌아 가기)
  6. q (녹화 중지)

  7. :2,4 normal @a( a2와 4 사이의 줄 에 등록하기 위해 기록 된 매크로를 다시 실행하십시오 )

    또는

    시각 모드에서 선을 선택하고 :눌려 Ex 선을 자동으로 채우고 :'<,'>(시각 선택의 시작부터 끝까지) 입력 normal @a하고을 누르십시오 Enter( source ).

이제 일부 줄에 주석을 달 때마다 기록 된 매크로를 다시 실행하여 a해당 줄 에 등록하십시오 .

:9,22 normal @a (comment out lines 9-22)

1
옵션 4 : 플러그인
Cody Poll

:9,22 normal I#내 대답에 따라 할 수있을 때 단일 명령에 매크로를 사용하는 이유를 이해하지 못합니다 .
Ben

gg를 사용할 수 있는데 왜 : 1 <enter>를 사용 하시겠습니까?
Tanath

@Tanath 첫 번째 줄의 주석은이 예제에만 해당됩니다. 저자가 9 행에서 22 행까지 주석을 달고 싶다면 gg를 사용할 수 없습니다.
bsmith89

@Ben 나는 normal이 답변을 작성하기 전에 명령 에 대해 아무것도 몰랐습니다 . 네가 옳아; :9,22 normal I#잘 작동합니다.
bsmith89

26

비주얼 블록 모드 ( CtrlV)를 사용 하여 줄의 시작을 선택하십시오. 그런 다음 I#(이것은 대문자입니다 I) 각 행에 해시 문자를 삽입하십시오. 그런 다음을 눌러 Esc삽입 모드에서 정상 모드로 돌아갑니다.


그것은 나를 위해 작동하지 않습니다. 첫 번째 줄에만 주석을 삽입합니다.
gon1332

밀고 ctrl있습니까? 왜냐하면 ctrl+v다른 것과는 다른 것입니다 v.
코디 폴

@CodyPoll 알고 있습니다. 모든 것이 정상 I입니다. 나는 누르면 I, 다음은 #첫 번째 라인의 앞에 배치됩니다.
gon1332

@CodyPoll Ok .. 나는 단지 입원 환자였다. 나는 Esc설명 된 절차 후에 눌리지 않았다 .
gon1332

내가 아는 한 @ gon1332 Esc끝에서 눌러야 합니다.
Gonçalo Ribeiro

18

현재 사용중인 언어에 대한 빠른 해결책이 필요하고 이미 시각적 모드에서 텍스트를 선택한 경우

:norm 0i#

일을한다. (각 행의 경우, 정상 모드에서, 첫 번째 열 및 삽입으로 이동합니다 #. 사용 :norm I#공백이 아닌 첫 번째 문자 전에 삽입합니다, 당신이 원하는 것이 아닐 수도있다.)를 사용하여 :norm i#도 것이다 일을 때문에 :norm의 시작 부분에서 시작 당신이 그것을 모르면 덜 명확하고 덜 명확합니다.

물론이 작업을 자주 수행하려는 경우 매핑을 설정하거나 플러그인을 찾고 싶을 것입니다.


1
기본적으로 0은 필요하지 않습니다. normal명령은 줄 시작시 커서로 실행됩니다.
nitishch

1
물론이 명령으로 줄 번호, %, 표시를 접두사로 사용할 수 있습니다. 예 : 1,5norm 내가 # (또는) '는,'bnorm 내가 # (또는) : 10 % 규범 내가 번호
SibiCoder

9

자동으로 수행하려면 vimrc파일 ( source )에 다음과 같은 것을 추가해야합니다 .

au FileType haskell,vhdl,ada let b:comment_leader = '-- '
au FileType vim let b:comment_leader = '" '
au FileType c,cpp,java let b:comment_leader = '// '
au FileType sh,make let b:comment_leader = '# '
au FileType tex let b:comment_leader = '% '
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR>
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR>

사용 ,c영역을 언급하고 ,u영역을 주석을 해제 할 수 있습니다. 다른 언어의 주석 기호를 수동으로 설정합니다.

두 번째 옵션은 tcomment , vim-commentary 또는 comments.vim 과 같은 플러그인을 사용하는 것 입니다. 나는 나 자신을 사용한다. 질문의 주제를 벗어나는 것을 믿기 때문에 해당 페이지의 사용법 및 설치 지침을 읽으십시오.

vimrc파일 에 코드 조각을 유지하는 것보다 훨씬 쉬운 플러그인 (위의 링크 중 하나 또는 다른 링크 중 하나)을 사용하는 것이 좋습니다 .

편집 : 질문이 변경되어 수동으로 방법을 제거하고 200_success가 올바른 방법으로 답변했습니다.


추가 플러그인 제안 : NERD 주석 기 - vim.org/scripts/script.php?script_id=1218
gaveen

참고 : 이것은 줄 단위 주석 만 지원합니다. 예를 들어 ANSI C는 인식하지 못합니다 //(에만 해당 /* */).
wchargin

이 방법이 마음에 들지만 댓글을 전환 할 수있는 방법이 있습니까?
ideasman42

1
@ ideasman42 대신 함수를 작성하고 현재 줄이 주석으로 시작하는지 확인한 다음 해당 호출 :s에 따라 답변의 발췌 부분에 표시된 명령 중 하나를 확인해야 합니다. 수표 자체는 다음과 같습니다 getline('.') =~ "^" . escape(b:comment_leader, '\/'). 주석이없는 경우 주석 처리하십시오. 이것은 테스트되지 않았으며 예제로만 사용해야합니다.
tokoyami

5

나는 이것을 위해 scrooloose / nerdcommenter 를 사용합니다.

이 플러그인을 사용하면 라인을 시각적으로 선택하고 leader+ c를 눌러 주석을 토글 할 수 있습니다. 파일 유형에 따라 주석을 달기 위해 다른 기호를 사용합니다.


5

선을 선택한 후 다음을 입력하십시오.

:norm I#

:'<,'>선택의 시작부터 끝까지의 범위 인 명령 행에 자동으로 배치 됩니다. norm일반 모드 명령을 실행하고 해당 범위에서 작동합니다. I#줄 시작 부분에 '#'을 삽입하는 일반 모드 명령입니다.


4

나는 이것을 위해 TComment 의 큰 팬입니다 . 파일 형식 별 주석 스타일을 수행 할 수있을뿐만 아니라 블록 주석을 지원하는 언어에 대해 블록 대 행당을 지정할 수도 있습니다.

    gc{motion}   :: Toggle comments (for small comments within one line 
                    the &filetype_inline style will be used, if 
                    defined)
    gcc          :: Toggle comment for the current line

Explicit commenting/uncommenting:

    g<{motion}   :: Uncomment region
    g<c          :: Uncomment the current line
    g<b          :: Uncomment the current region as block

    g>{motion}   :: Comment region
    g>c          :: Comment the current line
    g>b          :: Comment the current region as block

In visual mode:

    gc           :: Toggle comments
    gC           :: Comment selected text

답변 주셔서 감사합니다! 당신은 아마 그것을 확장 할 수 있습니까? 플러그인 답변을 제공하는 것은 좋지만 지금은 플러그인에 대한 링크입니다. 최소한 그것이 무엇을하고 그것을 어떻게 사용하는지에 대한 기본적인 설명이 답에서 기대됩니다. 이 메타 포스트도 참조하십시오 .
Martin Tournoij

키 바인딩을 복사 / 붙여 넣기하는 것은 어리석은 것처럼 보이지만 거기에 있습니다. 나는 이미 그 일을 설명했다.
Collin Grady

3

vim-commentary 플러그인 이 가장 쉬운 방법이라는 것을 알았습니다 . 줄 범위를 선택한 다음를 누르십시오 gc. 열린 파일 형식에 적절한 주석 문자를 사용합니다. 시각적으로 선택하지 않아도 gcu또는 로 주석 처리 된 인접한 줄의 주석을 해제 할 수 있습니다 gcgc.


2

줄의 시작 부분에 5 줄에 접두사를 추가한다고 가정하면 검색 및 바꾸기를 사용할 수 있습니다 .

:.,+5s/^/prefix_/g

또는 줄 끝에서 :

:.,+5s/$/suffix_/g

또는 시각 모드 ( Ctrl+ v)를 사용하여 수직 텍스트 블록을 선택한 다음 삽입 모드 ( I)를 입력하고 무언가를 입력 한 후을 눌러 Esc변경 내용을 확인하고 다른 줄에 적용하십시오.

관련 :


2

이 답변은 1) 시각적 모드에서 1 개의 단축키로 들여 쓰기 수준을 유지하고 2) 설명하기 위해 주석 달기 / 주석 해제를 차단 .vimrc하기 위해 붙여 넣을 올바른 코드를 표시 vim 7.4+합니다.

코드는 다음과 같습니다.

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

작동 방식 :

  • let b:commentChar='//': vim에 변수를 만듭니다. 은 b여기 경우 현재 열려있는 파일을 의미하는 버퍼를 포함하는 범위를 말한다. 주석 문자는 문자열이며 따옴표로 묶어야하며 따옴표는 주석을 토글 할 때 대체되는 문자의 일부가 아닙니다.

  • autocmd BufNewFile,BufReadPost *...: 자동 명령은 여러 가지를 트리거하며,이 경우 새 파일 또는 읽기 파일이 특정 확장자로 끝날 때 트리거됩니다. 일단 트리거되면 다음 명령을 실행하여 commentChar파일 유형에 따라 변경할 수 있습니다 . 이 작업을 수행하는 다른 방법이 있지만 초보자와 더 혼란 스럽습니다 (나 같은).

  • function! Docomment():로 시작 function하고 끝나는 함수가 선언됩니다 endfunction. 함수는 대문자로 시작해야합니다. !이 함수로 정의 이전 기능 덮어 보장하지만 Docomment()이 버전을 Docomment(). 이 없으면 !오류가 있었지만 vim 명령 줄을 통해 새 기능을 정의했기 때문일 수 있습니다.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': 실행은 명령을 호출합니다. 이 경우 전체 버퍼 또는 강조 표시된 섹션 substitute과 같은 범위 (기본적으로 현재 줄임)를 취할 수 있는을 실행 합니다. 줄의 시작 부분에 공백이 오는 정규 표현식으로, 뒤에 추가됩니다 . 때문에 여기가, 문자열 연결에 사용되는 캔은 따옴표로 포장 할 수 없습니다. 을 앞에 붙여서 인수 (이 경우 및 ) 와 일치하는 문자를 이스케이프 할 수 있습니다 . 이 후, 우리 는 문자열 의 끝과 다시 연결됩니다 .%'<,'>^\s*&.escape()escape()commentChar\/\substitutee깃발. 이 플래그를 사용하면 조용히 실패 할 수 있습니다. 즉, 주어진 줄에서 일치하는 항목을 찾지 못하면 소리를 내지 않습니다. 전체적으로이 줄은 첫 글자 바로 앞에 공백과 주석 문자를 넣을 수있게하여 들여 쓰기 수준을 유지합니다.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': 이것은 우리의 마지막 큰 명령과 비슷합니다. 이 고유 한, 우리는, 우리가 \v우리를 피할 필요가 없도록 ()하고 1, 우리와 함께 만든 그룹을 의미합니다 (). 기본적으로 우리는 공백으로 시작하는 줄과 일치하고 주석 문자 다음에 공백이 따르며 첫 번째 공백 세트 만 유지합니다. 다시 말하지만, e우리는 그 줄에 주석 문자가없는 경우 우리가 자동으로 실패 할 수 있습니다.

  • let l:line=getpos("'<")[1]: 이것은 주석 문자와 마찬가지로 변수를 설정하지만 l로컬 범위 (이 함수의 로컬)를 나타냅니다. getpos()이 경우 강조 표시의 시작 위치와 [1]열 번호와 같은 다른 항목이 아닌 행 번호에만 관심 이 있다는 의미입니다.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: 당신은 어떻게 if작동 하는지 알고 있습니다. match()첫 번째 것이 두 번째 것을 포함하는지 확인하므로 강조 표시를 시작한 줄을 잡고 공백으로 시작하고 주석 문자가 오는지 확인합니다. 일치 match()하는 인덱스가없는 경우 인덱스를 반환합니다 -1. if0이 아닌 모든 숫자를 참으로 평가 하므로 출력이 -1보다 큰지 확인해야합니다. 의 비교는 vim거짓이면 0을, 참이면 1을 반환합니다. 이것이 if올바르게 평가되기를 원합니다.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremap다음 명령을 시각적 모드로 매핑하지만 재귀 적으로 매핑하지 마십시오 (다른 방법으로 사용할 수있는 다른 명령은 변경하지 않음). 기본적으로, 당신이 독창적 인 초보자라면 항상 noremap물건을 깨지 않도록하십시오. <silent>"나는 당신의 말을 원치 않고 단지 당신의 행동"을 의미하며 명령 행에 아무것도 인쇄하지 말라고 지시합니다. <C-r>우리가 매핑하는 것입니다.이 경우에는 ctrl + r입니다 (이 매핑을 사용하여 일반 모드에서 "재실행"을 위해 Cr을 정상적으로 사용할 수 있습니다). C-u다소 혼란 스럽지만 기본적으로 시각적 강조 표시를 잃지 않도록합니다 ( 이 답변 에 따르면 명령 '<,'>이 원하는대로 시작됩니다 ).call여기에서 vim에게 우리가 명명 한 기능을 실행하도록 지시 <cr>하고 enter버튼을 누르는 것을 말합니다 . 실제로 함수를 호출하려면 한 번만 누르십시오 (그렇지 않으면 call function()명령 줄에 방금 입력 한 것입니다. 대체 대체물을 완전히 찾으려면 다시 칠해야합니다 (실제로 확실하지는 않지만 무엇이든).

어쨌든, 이것이 도움이되기를 바랍니다. 이 강조 아무것도 걸릴 것입니다 v, V또는 C-v, 첫 번째 줄은 주석 선택하면 그렇다면, 모든 강조 라인의 주석을 해제하려고를, 그렇지 않은 경우, 각 라인에 주석 문자의 추가 레이어를 추가합니다. 이것은 내가 원하는 행동입니다. 그 후 나를 위해 완벽하게 작동, 그래서 난 그냥,이 블록의 각 행은 주석 아닌지 여부를 전환하고 싶지 않았다 요구하는 여러 주제에 대한 질문.

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