Vim에서 줄을 주석 처리하거나 주석 처리를 해제하는 빠른 방법은 무엇입니까?


1167

vi에 Ruby 코드 파일이 열려 있는데 주석 처리 된 행이 있습니다 #.

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

첫 번째 def ... end섹션 의 모든 줄을 주석 해제하고 싶다고 가정 해보십시오 . Vim에서 효율적인 방법은 무엇입니까?

일반적으로 줄을 주석 처리하고 주석 처리를 제거하는 쉽고 유동적 인 방법을 찾고 있습니다. 여기서는 루비 코드를 다루고 있지만 JavaScript ( //) 또는 Haml ( -#) 일 수 있습니다.


20
수락 된 답변은 플러그인을 사용하지 않고 주석 / 언 코멘트 해제 블록을 수행하는 방법에 대한 자세한 지침이있는 답변 중 하나로 변경해야합니다. 현재 허용 대답은 기본적으로 타사 플러그인 그냥 링크입니다.
faintsignal

가장 좋은 평가의 답변은 어떤 플러그인도 언급하지 않았습니다, @rationalis 귀하의 의견이 잘못된 것입니다. 수정하거나 제거해 주셔서 감사합니다.
bonobo 2016 년

답변:


180

NERD Commenter 스크립트를 사용합니다 . 코드에서 주석을 쉽게 주석 처리하거나 주석을 해제하거나 토글 할 수 있습니다.

의견 에서 언급했듯이 :

사용법에 혼란을 겪는 사람이라면 기본 리더는 "\"이므로 10 \ cc는 열 줄을 주석 처리하고 10 \ cu는 열 줄을 주석 해제합니다


흥미 롭습니다! 문서를 읽고 "sexy comment"가 있다는 것을 알았습니다. "\ cs"만 사용하십시오. Ruby 의 경우 해시 태그 대신 여러 줄을 사용 =begin하고 =end주석을 추가합니다.
Hegwin

플러그인을 설치해야하기 때문에 vim을 사용하는 가장 빠른 방법은 아니라고 생각합니다. 또한 최고의 답변은 이미 더 많은 표를 받았지만 해결책으로 표시되지 않았습니다.
whirmill

136
여기서 멈추지 마십시오. 대부분의 투표 응답은 플러그인 필요없이 아래에 있습니다. stackoverflow.com/a/15588798/2117868stackoverflow.com/a/1676690/2117868
kuttumiah

@ whirmill "최고"가 실제로 사용 사례에 달려 있다고 생각합니다. 내 인생에서 한 번 주석을 토글하려는 경우 시각적 블록 모드가 더 빠릅니다. 그러나 플러그인 설치가 마음에 들지 않고 주석을 토글하기 위해 가능한 한 적은 키 입력을 원하고 주석을 추가하거나 제거하는 작업을 구분할 필요가없는 경우 여기에 "가장 좋은 대답"이 될 수 있습니다.
Carolus

@Carolus 질문이 "빠른 방법"대신 "가장 좋은 방법"으로 시작된 경우 동의했습니다.
whirmill

2541

이러한 작업에는 대부분의 시간 블록 선택을 사용 합니다.

첫 번째 #문자 에 커서를 놓고 CtrlV(또는 CtrlQgVim의 경우)를 누르고 마지막 주석 행까지 내려 가서를 누르면 x모든 #문자가 세로로 삭제됩니다 .

텍스트 블록을 주석 처리하는 것은 거의 동일합니다.

  1. 먼저 주석을 달고 싶은 첫 번째 줄로 이동하여을 누릅니다 CtrlV. 에디터가 VISUAL BLOCK모드 에 놓 입니다.
  2. 그런 다음 화살표 키를 사용하여 마지막 줄까지 선택하십시오.
  3. 이제을 누르면 ShiftI편집기가 INSERT모드로 전환되고을 누릅니다 #. 첫 번째 줄에 해시가 추가됩니다.
  4. 그런 다음 Esc(1 초만) 누르면 #선택한 다른 모든 줄에 문자 가 삽입 됩니다.

기본적으로 debian / ubuntu와 함께 제공되는 잘린 버전의 vim의 : s/^/#경우 세 번째 단계를 대신 입력하십시오 (각 줄의 첫 번째 문자의 나머지 강조 표시는으로 제거 할 수 있음 :nohl).

다음은 시각적 참조를위한 두 개의 작은 화면 녹화입니다.

논평: 논평

주석 해제 : 주석 해제


87
기본적으로 CTRL + V입니다. Ctrl + V는 붙여 넣기에 이미 사용되므로 Windows 버전의 gvim은 Ctrl + Q를 사용합니다.
R. Martinho Fernandes

8
@amindfv Ctrl + V n(여기서, n은 num line-1 임), j, n(n은 덧글 문자 시퀀스 길이-1)
michael.bartnett

27
'//'를 어떻게 사용 하시겠습니까?
AustinT

74
Esc를 두 번 클릭하여 두 번째 기다리지 않아도됩니다.)
Ahmed Hegazy

44
이것은 나를 위해 작동하지 않았습니다. Shift-I가 간단한 삽입 모드로 들어갔습니다.
Geremia

826

vim에서 블록을 주석 처리하려면 :

  • Esc(편집 또는 다른 모드를 종료하려면)를 누릅니다.
  • 히트 ctrl+ v(시각적 블록 모드)
  • / 화살표 키를 사용하여 원하는 줄을 선택하십시오 (모든 것을 강조 표시하지는 않습니다-괜찮습니다!)
  • Shift+ i(자본 I)
  • 원하는 텍스트를 삽입하십시오. 예 : %
  • 프레스 EscEsc

vim에서 블록의 주석을 해제하려면 :

  • Esc(편집 또는 다른 모드를 종료하려면)를 누릅니다.
  • 히트 ctrl+ v(시각적 블록 모드)
  • 주석을 해제 할 줄을 선택하려면 / 화살표 키를 사용 하십시오.

    여러 문자를 선택하려면 하나를 사용하거나 다음 방법을 결합하십시오.

    • 더 많은 텍스트를 선택하려면 왼쪽 / 오른쪽 화살표 키를 사용하십시오
    • 텍스트 청크를 선택하려면 shift+ / 화살표 키를 사용하십시오.
    • 일반 삭제 버튼처럼 아래의 삭제 키를 반복해서 누를 수 있습니다.

  • 필요한 경우 d또는 x을 눌러 문자를 반복적으로 삭제하십시오

33
@amelia : 주석 달기 단축키가 작동하지 않습니다. Shift + i를 누르면 삽입 모드가됩니다. vim 버전에 의존합니까?
user3527975

7
왜 1 초가 걸립니까?
코너 패트릭

24
이 답변에 대한 유일한 문제는 화살표 키 를 사용하라는 것 입니다.
cozyconemotel

6
대신 Esc를 두 번 누르십시오. :)
Aaron Alphonsus 2012

21
처음에는 주석을 활성화하는 것이 효과가 없었지만 다시 읽은 후에는 잘 작동했습니다. 1. 선택을 위해 V가 아닌 Ctrl-V를 사용해야합니다. 당신은 결국 Esc 키를 쳤을 때 모든 삽입이 발생
timurb

333

때로는 플러그인과 .vimrc가 도움이되지 않는 원격 상자에 껍질을 벗기거나 때로는 NerdCommenter가 잘못 가져옵니다 (예 : HTML에 JavaScript가 포함되어 있음).

이러한 경우에는 최첨단 대안이 내장 norm명령으로, 지정된 범위의 각 줄에서 임의의 vim 명령 만 실행합니다. 예를 들면 다음과 같습니다.

댓글로 # :

1. visually select the text rows (using V as usual)
2. :norm i#

이렇게하면 각 줄의 시작 부분에 "#"이 삽입됩니다. 입력하면 범위가 채워 지므로 실제로는:'<,'>norm i#

주석 해제 # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

각 줄의 첫 문자가 삭제됩니다. //와 같은 2 자 주석을 사용한 경우 :norm xx두 문자를 모두 삭제하기 만하면 됩니다.

OP의 질문과 같이 주석이 들여 쓰기되면 다음과 같이 삭제를 고정시킬 수 있습니다.

:norm ^x

즉 "공백이 아닌 첫 번째 문자로 이동 한 다음 한 문자를 삭제하십시오"를 의미합니다. 블록 선택과 달리이 기법은 주석이 고르지 않은 경우에도 작동합니다!

참고 : norm문자 그대로 일반 vim 명령을 실행하기 때문에 주석에 국한되지 않고 각 행에 대해 복잡한 편집을 수행 할 수도 있습니다. 명령 시퀀스의 일부로 이스케이프 문자가 필요한 경우 ctrl-v를 입력 한 다음 이스케이프 키를 누르십시오 (또는 더 빠른 매크로를 기록한 다음 norm을 사용하여 각 행에서 해당 매크로를 실행).

참고 2 : 물론 norm많이 사용 하는 경우 매핑을 추가 할 수도 있습니다 . 예를 들어 ~ / .vimrc에 다음 줄을 넣으면 시각적으로 선택한 후 입력 ctrl-n하지 않아도 됩니다.:norm

vnoremap <C-n> :norm

참고 3 : 베어 본 vim에는 때때로 norm컴파일 된 명령 이 없으므로 강화 된 버전 (예 : / bin / vi가 아닌 / usr / bin / vim)을 사용해야합니다.

(이 답변에 통합 된 개선 사항에 대해 @Manbroski 및 @rakslice에게 감사드립니다)


나는이 대답 읽고 스크롤 할 때까지 나는이 길을 가야하는 것이라고 생각 stackoverflow.com/a/1676690/850996 주석을 통해 훨씬 좋네요 제어 할 수 있습니다 CTRL + V를 (SHIFT + V와 라인 선택에 반대)를 사용하여 블록 선택 문자 삽입이 발생합니다.
Shyam Habarakada

2
@Shyam 특수 블록 선택 전용 명령과 결합 된 ctrl-v 기술은 대부분의 다른 답변에서 권장하는 사항입니다. 그러나 나는 개인적으로 norm 명령 자체 외에 새로운 구문을 도입하지 않기 때문에 더 쉬운 것으로 설명 된 "norm"기술을 발견하므로 vim에 대해 이미 알고있는 것을 재사용 할 수 있습니다.
Magnus

2
들여 쓰기 된 블록의 주석을 해제하려면을 사용하는 것이 :norm ^x좋습니다. 이 방법은 일반적으로 영역 선택 작업 (예 : vi{중괄호 내부 선택) 작업의 이점이 있습니다. 이러한 텍스트 개체 선택기 는 작동하지 않습니다 Visual Block.
ivan-k December

1
아, 방금 알아 냈습니다-centos 6에서는 /bin/vivim 7.2이지만,와는 다른 빌드이며 /usr/bin/vim이와 같은 기능이 해제되어 있습니다.
rakslice

3
이것이 가장 좋은 대답입니다. 특히 vip전체 단락을 선택하기 위해 결합 할 때 .
meh

121

내 안에 다음이 있습니다 .vimrc.

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

이제 ,cc,cu을 주석으로 처리하고 주석을 해제하기 위해 입력 할 수 있습니다 (일반 모드와 시각적 모드 모두에서 작동).

(몇 년 전 일부 웹 사이트에서 훔쳤으므로 더 이상 어떻게 작동하는지 완전히 설명 할 수 없습니다.). 이 주석 이 설명되어 있습니다.)


사용해야하는 지름길은 무엇입니까? vim 코드 자체에서 확실히 확인할 수는 없습니다!
기드온

일반 또는 시각적 모드에서 ", cc"(3 문자 시퀀스)를 사용하여 현재 행을 주석으로 처리하고 ", cu"를 사용하여 현재 행의 주석을 해제하십시오.
Dan

8
나는 그것을 좋아한다 :)! 감사! 참고로 설명하기가 어렵습니다. a) 명령을 재 매핑합니다 (비재 귀적으로 [이것 참조] ( stackoverflow.com/questions/3776117/… ). 이제 cc를 누르면 cc :: ...가 실행됩니다. b) 이제 기본적으로 sed입니다. / what / towhat / where) 명령 ^ (행의 시작)을 사용자가 연 파일 유형에 따라 올바르게 설정된 주석 문자로 변경 c) 명령의 출력 만 억제하는 자동 항목에 대해 c). d) : nohlsearch는 sed 검색을 강조 표시하지 않습니다
ramrunner

14
이것은 자동 명령을로드하는 올바른 방법이 아닙니다. 그들은 augroup 안에 있어야합니다 그렇지 않으면 여러 번 vim에 추가되어 많은 속도 저하를 일으킬 것입니다. learnvimscriptthehardway.stevelosh.com/chapters/14.html을 참조하십시오 . 이 질문에 대한 답변을 추가했습니다.

좋은. 이것은 당신이 블록 선택을하는 동안 주석 처리를 취소하는 방법에 대한 질문에 대한 실제 답변입니다.
Erwin Rooijakkers

119

vim에서 주석을 달 줄을 지정하십시오.

줄 번호를 공개하십시오 :

:set number

그때

:5,17s/^/#/     this will comment out line 5-17

아니면 이거:

:%s/^/#/        will comment out all lines in file

11
각 줄의 첫 번째 문자를 변경하기 때문에 끝에 "g"가 필요하지 않습니다.
Magnus

1
이 괴물이 최고입니다 :) 그래서 (openwrt와 같은) 임베디드 상자의 일부 VIMS은 .. 비주얼 모드가없는
kim0은

:%s/^/#/g모든 줄을 주석으로 처리 할 것인지 설명 할 수 있습니까? 나는 퍼센트 부호를 궁금해했다%
Bin

18
그리고이 줄을 주석 해제하려면 다음과 같이 쓸 수 있습니다 : 5,17s / ^ # /
Iraklis Moutidis

큰! 실제로 다음과 같은 블록 선택 va{또는 var루비 와 함께 잘 작동합니다 .
Artur Małecki

58

내가하는 방법은 다음과 같습니다.

  1. 주석을 달고 싶은 첫 번째 줄의 첫 번째 문자로 이동하십시오.

  2. 히트 Ctrl+ qGVIM 또는 Ctrl+ vVIM에서 다음 주석 라인의 첫 번째 문자를 선택 아래로 이동합니다.

  3. 그런 다음을 누르고 c주석 문자를 추가하십시오.

주석 해제는 동일한 방식으로 작동합니다. 주석 문자 대신 공백을 입력하십시오.


44
c첫 번째 문자도 삭제합니다. CMS의 대답은 바로 누르는 것입니다.I , 주석 문자를 다음 입력하십시오 ( EscWindows vim에 있음)
Samaursa

6
'c'가 아닌 3 단계에서 'r'을 눌러야한다는 점을 제외하면 작동합니다.
David Baucum

또는 누르신 후 ESC두 번 누를 c수 있으며 트릭을 수행해야합니다
nihiser

이 모든 옵션은 라인의 첫 번째 문자를 파괴합니다.
요시야

36

나는 잘 작동하고 쉽게 확장 할 수있는 .vimrc 파일에 간단한 추가 기능을 고안했습니다. comment_map 및 주석 지시선에 새 파일 유형을 추가하기 만하면됩니다.

일반 및 시각적 모드에 대한 매핑을 추가했지만 원하는대로 다시 매핑 할 수 있습니다. 나는 '토글'스타일 기능을 선호합니다. 하나는 여러 매핑을 갖는 곰

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

노트 :

콜백이나 파일 유형 /로드에 대한 후크를 사용하지 않습니다. 왜냐하면 Vim의 시작이 .vimrc정적 함수 / 맵 보다 느리게 느껴지기 때문 입니다.하지만 그것은 단지 내 선호 사항입니다. 또한 단순하고 성능을 유지하려고 노력했습니다. 자동 명령을 사용하는 경우 자동 명령 그룹에 배치해야합니다. 그렇지 않으면 파일 당로드 된 파일 유형에 콜백이 파일 유형에 여러 번 추가되어 성능이 크게 저하됩니다.


1
vim을 처음 접했을 때 매핑 된 기능을 전환하려면 어떤 버튼을 눌러야합니까? <leader><Space>맨 아래에 그 선언은 무엇입니까 ?
Jens Kohl 2016 년

2
<leader>를 <,>와 같은 키로 바꿀 수 있습니다. 그런 다음, SPACE를 누르면 라인의 주석 상태가 토글됩니다. 리더는 당신의 리더가 무엇이든, Vim의 기본 <leader>는 \이지만 "let mapleader = ','"와 같이 자신을 설정할 수 있습니다

그럼에도 불구하고 큰 답변, 한 가지 성가심은 이미 주석이 달린 블록에 주석을 달고 주석 처리되지 않은 행으로 주석을 바꿉니다. 예를 들어 QtCreator는 비어 있지 않은 모든 행에 선행 주석이있는 경우에만 주석을 제거하고 그렇지 않으면 선행 주석을 추가합니다.
ideasman42

1
내가 사용 약간 다른 버전을 만들었습니다 \zs\ze정규식 트릭, 코드가 좀 작은되었다. 여기서
SergioAraujo

33

댓글 전환

당신이 필요로하는 모든 인 경우 의견 토글 차라리 함께 가고 싶어 commentary.vim 에 의해 tpope .

여기에 이미지 설명을 입력하십시오

설치

병원체 :

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim- 플러그 :

Plug 'tpope/vim-commentary'

뭉치 :

Plugin 'tpope/vim-commentary'

추가 사용자 정의

이것을 .vimrc 파일에 추가하십시오 : noremap <leader>/ :Commentary<cr>

이제 Sublime 및 Atom과 같이 Leader+ 를 눌러 주석을 토글 할 수 있습니다 /.


감사! 나중에 HTML에서 CSS 주석을 지원할 예정입니까?
Dan Oak

25

Control-V를 사용하여 텍스트의 사각형을 선택하십시오. 첫 #문자 로 이동하여 Ctrl+를 입력 V하고 한 번 오른쪽으로 이동 한 다음 아래로 댓글 끝까지 이동하십시오. 이제 입력 x: 모든 #문자 다음에 공백이 하나 삭제됩니다 .


18

내 섹션은 다음과 같습니다 .vimrc.

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

일반 및 시각 모드에서이 버튼을 누르면 ,ic주석을 삽입하고 주석 ,rc을 제거 할 수 있습니다 .


이것은 초보자 자신의 작문을 배우는 방법에 매우 도움이됩니다 .vimrc.
coolesting

3
map노멀 모드와 비주얼 모드를 vmap
다루므로

더 좋은 곳은입니다 after/ftplugin/ruby.vim.
Santosh Kumar

또한 사용 <leader>ic하고<leader>rc
한스 크리스티안

15

나는 vim 7.4를 사용하며 이것은 나를 위해 작동합니다.
우리가 3 줄을 주석 처리 / 주석 해제한다고 가정합니다.

의견을 남기다:

선이 처음에 탭 / 공간이없는 경우 :
ctrl + V다음 jjj다음 shift + I (cappital i)다음 //다음 esc esc
라인이에서 탭 / 공간이 경우 위 또는 교환을 위해 할 수있는 여전히 당신을 시작 c:
ctrl + V다음 jjj다음 c다음 //다음 esc esc

의 주석 :

: 라인은 처음에 탭 / 공간이없는 경우
ctrl + V다음 jjj다음 ll (lower cap L)다음c

라인은 처음에 탭 / 공간을 통해 다음 공간 하나가있는 경우 esc
ctrl + V다음을 jjj다음 ll (lower cap L)다음 c다음 space다음esc



9

30 가지 답변을 통해 훨씬 쉬운 솔루션을 제공하려고 노력할 것 #입니다. 줄의 시작 부분에 a 를 삽입하십시오 . 그런 다음 줄을 내려 가서 점 ( .)을 누르십시오 . 반복, 않습니다 j, ., j, ., 등 ... 주석하려면 제거 #(당신이 칠 수 x오버 #) 및 역 사용하여이 작업을 수행 k, .등 ...


1
초보자도 이해하고 사용할 수있는 매우 간단한 답변입니다. 그러나 주석을 달려면 많은 줄에서 꽤 느리게 작동합니다. 당신이 쓸 수 있는지를 해결하려면 I#<Esc>j말하자면, - 버퍼에 c- 다음 할 10@c, 또는 라인 정장 당신의 어떤 수.
Daerdemandt

9

vi에서 다음 세 줄의 주석 처리를 제거하는 방법 :

#code code
#code
#code code code

왼쪽 상단 #심볼 위에 커서를 놓고을 누릅니다 CtrlV. 시각적 블록 모드가됩니다. 아래쪽 화살표를 J세 번 눌러 세 줄을 모두 선택하십시오. 그런 다음를 누릅니다 D. 모든 주석이 사라집니다. 취소하려면을 누릅니다 U.

vi에서 다음 세 줄을 주석 처리하는 방법 :

code code
code
code code code

왼쪽 상단 문자 위에 커서를 놓고을 누릅니다 CtrlV. 시각적 블록 모드가됩니다. 보도 또는 J세 번 모두 세 줄을 선택합니다. 그런 다음

I//Esc

그것은 자본 I, // 및 탈출입니다.

를 누르면 ESC선택한 모든 행에 지정한 주석 기호가 표시됩니다.


1
"왼쪽 위"해시가 누락 된 경우 시각 모드에서 o 를 눌러 커서를 "다른 쪽"으로 이동할 수 있습니다 .
dylnmc

나는 이것이 사용하는 것이 가장 좋다고 생각합니다. 제 3 자, 그냥 기본 정력을 사용할 필요가 없습니다
Ardi Nusawan

간단하고 타사가없는 최상의 답변
aze

8

그렇습니다.이 질문에 33 개의 답이 있습니다.

여기 빔에 줄을 주석하는 방법에 대한 또 다른 접근 방법은 다음과 같습니다 움직임 . 기본 아이디어는을 입력하여 yip두 줄을 입력하거나 삭제 하여 단락을 잡아 당기는 것과 같은 방법을 사용하여 줄을 주석 처리하거나 주석을 해제 하는 것 dj입니다.

이 방법을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

  • ccj다음 두 줄 cuk을 주석 처리하고 주석 처리를 제거합니다.

  • cci{블록 cui{을 주석 처리하고 주석 처리를 제거합니다.

  • ccip전체 단락 cuip을 주석 처리하고 주석을 제거합니다.

  • ccG마지막 줄 cugg까지 모든 것을 주석 처리하고 첫 번째 줄까지 주석 처리를 제거합니다.

모션을 통해 작동하는 2 개의 기능 과 각 기능에 대해 2 개의 매핑 만 있으면됩니다. 먼저 매핑 :

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

( g@연산자와 operatorfunc변수 에 대한 설명서를 참조하십시오 .)

그리고 이제 기능 :

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

위치에 따라 취향에 맞게 위의 정규식을 수정하십시오 #.


"완전히 새로운 [...] 모션"은 약간 위에있는 것 같습니다. t_comment 및 vim-commentary 플러그인은이 답변보다 이전에 모션을 사용하여 주석을 달 수 있습니다.
Rich

좋은 물건! 공감. (또한 이전에 사용했던 플러그인 대신이 방법을 사용할 수 있다고 생각합니다. 작성해 주셔서 감사합니다!)
Rich

7

줄 번호를 이미 알고 있다면 n,ms/# //작동합니다.


n, ms / ^ \ s. # // 앞 공백이 있고 해시를 따르지 않을 수 있기 때문에
Skip Huffman

7

첫 번째와 마지막 줄 (ma 및 mb)을 표시 한 다음 수행하십시오 : 'a,'bs / ^ # //


6

EnhancedCommentify 사용 합니다. 필요한 모든 것을 설명합니다 (프로그래밍 언어, 스크립트, 구성 파일). 비주얼 모드 바인딩과 함께 사용합니다. 댓글을 달고 싶은 텍스트를 선택하고 co / cc / cd를 누르십시오.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

5

필과 jqno의 대답을 결합하고 공백으로 의견을 토글했습니다.

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

5

에 의해 플러그인이 생활 변화가있다 tpope라고는vim-commentary

https://github.com/tpope/vim-commentary

이 플러그인은 다음을 제공합니다 .

  • 제정신
  • 제대로 들여 쓰기 된 주석
  • 비어 있거나 불필요한 줄을 주석 처리하지 않습니다

사용법 :

  • Vundle을 통해 설치하십시오 (또는 병원체라고 생각합니다).
  • 텍스트를 눌러 강조 표시 :로 표시됩니다:<,'>
  • 해설을 여기에 입력하고을 :<,'>Commentary누릅니다 Enter.
  • 팔. 너의 새싹.

vim-commentary(tpope의 모든 플러그인과 마찬가지로) 관용적 vim이라는 보너스가 있습니다. gc= "go comment", gcap= "go comment a 단락"등
goldenratio

Jim Stewart의 Tim Pope 답변을 편집 한 것일 수 있습니까?
jdk1.0

5

이 답변은 플러그인을 설치할 수 없지만 주석 문자가 기존 들여 쓰기 수준을 따르도록하려는 경우에 가장 유용합니다.

이 답변은 1) 시각적 모드에서 1 개의 바로 가기로 들여 쓰기 수준을 유지하고 설명하기 위해 들여 쓰기 수준을 유지하면서 주석 달기 / 주석 해제를 차단 .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\/\substitute 는 문자열 .e깃발. 이 플래그를 사용하면 조용히 실패 할 수 있습니다. 즉, 주어진 줄에서 일치하는 항목을 찾지 못하면 소리를 내지 않습니다. 전체적으로이 줄은 첫 글자 바로 앞에 공백과 주석 문자를 넣을 수있게하여 들여 쓰기 수준을 유지합니다.

  • 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보다 큰지 확인해야합니다. in의 비교는 vimfalse 인 경우 0을, true 인 경우 1을 반환합니다. 이것이 if올바르게 평가되기를 원하는 것입니다.

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

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



3

tpope ( https://github.com/tpope/vim-commentary )로 vim-commentary를 사용할 수 있으며 다음과 같이 사용할 수 있습니다.

를 눌러 시각 모드로 들어가십시오

'v'

그런 다음

'j' repeatedly or e.g 4j to select 4 row

이제 선택과 관련하여 Enter 키만 있으면됩니다.

'gc'

이것은 repead 키를 주석 해제하기 위해 모든 선택을 주석 처리합니다.

'gc'

3

여기에 기초하여 기본 한 줄의 C-v다음 I위에서 설명한 방법.

이 명령 ( :Comment)은 선택한 문자열을 선택한 줄의 시작 부분에 추가합니다.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

.vimrc단일 행을 허용하고 현재 선택에서 모든 행의 시작 부분에 인수를 배치하는 명령을 작성 하려면이 행을에 추가하십시오 .

예를 들어 다음 텍스트가 선택된 경우 :

1
2

이것을 실행 :Comment //하면 결과는 다음과 같습니다.

//1
//2

3

여기 답변의 아이디어로 시작하여 내 의견 기능을 시작했습니다. 주석을 켜거나 끕니다. //print('blue'); //this thing is blue첫 번째 주석과 같은 것을 처리 하고 토글 할 수 있습니다 . 또한 첫 번째 공백이 아닌 줄의 시작 부분에 주석과 단일 공백을 추가합니다. 또한 공백을 불필요하게 복사하지 않지만 주석을 추가하고 들여 쓰기 할 때이 추가 작업을 피하기 위해 확대 / 축소 (: h \ zs)를 사용합니다. 그것이 일부 미니멀리스트에게 도움이되기를 바랍니다. 제안은 환영합니다.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>

1
커서 위치를 복원하는 솔루션의 약간 다른 버전을 만들었습니다. on github
SergioAraujo

멋있는. 내 게시물을 편집하고 (유사하기 때문에) 솔루션을 추가 할 수 있습니다!
mike

c, cpp, java의 백 슬래시를 피하고 E488을 피하기 위해 다른 분리자를 대체로 사용하지 않도록 변경되었습니다. 주석에 공백이 있고 문자가 세 개이기 때문에 java, cpp의 간격도 변경됩니다. // l : space로 수행됩니다.
SergioAraujo

3

Jasmeet Singh Anand의 comments.vim을 사용합니다 . (vim.org에 있음)의

C, C ++, Java, PHP [2345], proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel 및 일반 파일

일반 및 시각적 모드에서 다른 소스 파일의 행을 주석 처리하고 주석 처리를 제거합니다.

용법:

  • CtrlC하는 의견을 단 한 줄의
  • CtrlX한 줄의 주석해제 하려면
  • ShiftV여러 줄을 선택한 다음 CtrlC선택한 여러 줄을 주석 처리하십시오.
  • ShiftV여러 줄을 선택한 다음 CtrlX선택한 여러 줄의 주석 처리를 제거하십시오

3

가장 빠르고 직관적 인 방법은 줄 )을 걸어서 주석 처리 하기 위해 다시 매핑하는 것 입니다.( 을 걸어서 주석 처리 . 시도해 보시면 다시 가지 않을 것입니다.

에서 루비 또는 배쉬 이 공간 들여 쓰기와, :

map ) I# <Esc>j
map ( k^2x

에서 C / C ++ 또는 PHP , 4 공간 들여 쓰기와 :

map ) I//  <Esc>j
map ( k^4x

단점은 잃게됩니다 ()문장 운동 (그러나 das거기에 채울 수), 당신은 가끔 다시 떨어질 것이다 선택 및 바꾸기 또는CtrlV 긴 섹션을 처리. 그러나 그것은 매우 드 rare니다.

그리고 C 스타일의 경우 긴 주석이 가장 잘 처리됩니다.

set cindent
set formatoptions=tcqr

... V[move]gq단어 줄 바꿈을 다시 사용 하는 것과 잘 결합 됩니다.


2

이 간단한 스 니펫은 .vimrc에서 가져온 것입니다.

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

//-코멘트 용이지만 다른 캐릭터에 쉽게 적용 할 수 있습니다. autocmd를 사용하여 jqno가 제안한대로 리더를 설정할 수 있습니다.

이것은 범위와 시각적 모드로 자연스럽게 작업하는 매우 간단하고 효율적인 방법입니다.


2

나는 /* ... */(C ansi 의견)을 좋아 하므로 여기가 당신을위한 나의 트릭입니다. 물론 다른 경우에 사용하도록 조정할 수 있습니다.


/ * ... * /로 주석

텍스트를 선택하십시오 (시작으로 이동, 시각적 블록 시작,으로 이동 }).

<c-V>}

선택에 적용 할 명령을 입력하십시오

:norm i/* <c-v><esc>$a */

명령은 다음과 같습니다. :'<,'>norm i /* ^[$a */

자세한 내용은 (i *)를 참조하십시오.


/ * ... * / 주석 해제

이전과 같이 또는 원하는 다른 방식으로 텍스트를 선택하십시오.

<c-V>}

선택에 적용 할 명령을 입력하십시오

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

명령은 다음과 같습니다. :'<,'>norm :s-\s*/\*\s*-^M$bbld$

자세한 내용은 (ii *)를 참조하십시오.


결과

효과는 한 줄씩 주석입니다.

Comment block
Comment block
Comment block

다음과 같이됩니다 (또는 그 반대).

/* Comment block */
/* Comment block */
/* Comment block */

입력하기가 많기 때문에 일부 map또는 @reg에 저장하는 것이 좋습니다 .vimrc. 단일 /**/전체 블록 을 선호하는 경우 다음을 사용하십시오.

단일 / * * / 전체 블록으로 주석

qc다음과 같이 단락 시작 부분에 다음 과 같이 기록하여 레지스터에 저장하십시오 .

v}di/*  */<esc>hhhp

q다시 한 번 잊지 말고 기록을 마무리하십시오.

자세한 내용은 (iii *)를 참조하십시오.


블록에서 단일 / * * / 주석 처리를 제거하십시오

레지스터에 저장하십시오 (예 :) @u. 블록 안의 아무 곳에 나 커서를 놓고

?/\*<enter>xx/\*/<enter>xx

완료하여 레지스터를 저장하십시오 q명령 .

자세한 내용은 (iv *)를 참조하십시오.


결과

효과는 여러 줄에 대한 단일 주석입니다.

Comment block
Comment block
Comment block

다음과 같이됩니다 (또는 그 반대).

/* Comment block
Comment block
Comment block */

설명

(i *)norm 선택된 모든 라인에서 동일한 명령을 반복적으로 적용하는 을 사용하여 작동 합니다. 이 명령은 단순히를 삽입하고 /*해당 줄의 끝을 찾은 다음*/

:norm i/* <c-v><esc>$a */

(ii *) 또한 norm모든 줄에서 검색 / 바꾸기를 반복하는 데 사용 됩니다. spaces /* spaces아무것도 찾아서 바꾸지 마십시오. 그 후, 줄의 끝을 찾고, 두 단어를 뒤로, 글자를 바로 찾으십시오.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) 으로 단락을 선택하고 v}삭제하고 주석을 열고 닫은 다음 가운데로 이동하여 삭제 된 블록을 붙여 넣습니다.

v}di/*  */<esc>hhhp

(iv *) 가운데 어딘가에서 뒤로 찾고 a /*를 삭제합니다. 앞으로 a를 찾아 */삭제합니다.

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