your programing

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

lovepro 2020. 9. 27. 13:30
반응형

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


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에서이를 수행하는 효율적인 방법은 무엇입니까?

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


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

의견 에서 언급했듯이 :

사용법이 혼란 스러우면 기본 리더는 "\"이므로 10 \ cc는 10 줄에 주석을 달고 10 \ cu는 10 줄에 주석을 제거합니다.


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

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

주석을 달기 위해 텍스트 블록은 거의 동일합니다.

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

기본적으로 debian / ubuntu와 함께 제공되는 제거 된 vim 버전의 경우 : s/^/#대신 세 번째 단계를 입력합니다.

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

논평: 논평

주석 해제 : 주석 해제


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

  • 누르기 Esc(편집 또는 기타 모드를 종료하려면)
  • hit ctrl+ v(시각적 블록 모드)
  • 위 / 아래 화살표 키를 사용하여 원하는 줄을 선택합니다 (모든 항목이 강조 표시되지는 않습니다. 괜찮습니다!)
  • Shift+ i(대문자 I)
  • 원하는 텍스트를 삽입하십시오. %
  • 프레스 EscEsc

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

  • 누르기 Esc(편집 또는 기타 모드를 종료하려면)
  • hit ctrl+ v(시각적 블록 모드)
  • / 화살표 키를 사용하여 주석을 제거 할 줄을 선택합니다.

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

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

  • d또는 x눌러 필요한 경우 반복적으로 문자를 삭제합니다.

때로는 플러그인과 .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 : Bare-bones vim에는 때때로 norm명령이 컴파일되어 있지 않으므로 강화 된 버전을 사용해야합니다. 즉, 일반적으로 / bin / vi가 아닌 / usr / bin / vim입니다.

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


내 다음이 있습니다 .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에서 주석을 달 줄을 지정하십시오.

줄 번호를 표시합니다.

:set number

그때

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

아니면 이거:

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

방법은 다음과 같습니다.

  1. 주석 처리하려는 첫 번째 줄의 첫 번째 문자로 이동합니다.

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

  3. 그런 다음을 누르고 c주석 문자를 추가합니다.

주석 제거는 동일한 방식으로 작동하며 주석 문자 대신 공백을 입력하면됩니다.


.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>

노트 :

.vimrc정적 함수 / 맵 보다 Vim의 시작 속도가 더 느리다는 것을 알기 때문에 파일 유형 / 로딩에 콜백이나 후크를 사용하지 않습니다 . 나는 또한 그것을 단순하고 성능있게 유지하려고 노력했습니다. 자동 명령을 사용하는 경우 자동 명령 그룹에 넣어야합니다. 그렇지 않으면 콜백이 파일 당 여러 번로드되어 파일 유형에 추가되어 성능이 많이 저하됩니다.


댓글 전환

토글 주석 만 필요한 경우 에는 commentary.vim by tpope 로 이동하는 것이 좋습니다 .

여기에 이미지 설명 입력

설치

병원체 :

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

vim-plug :

Plug 'tpope/vim-commentary'

Vundle :

Plugin 'tpope/vim-commentary'

추가 사용자 정의

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

이제 Sublime 및 Atom과 마찬가지로 Leader+ 를 눌러 주석을 전환 할 수 있습니다 /.


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


다음은 내 섹션입니다 .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을 제거 할 수 있습니다 .


나는 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


tcomment 플러그인을 사용하고 싶습니다 : http://www.vim.org/scripts/script.php?script_id=1173

gc와 gcc를 매핑하여 한 줄이나 강조 표시된 코드 블록에 주석을 달았습니다. 파일 유형을 감지하고 정말 잘 작동합니다.


30 개의 대답을 앞두고 더 쉬운 해결책을 제시하겠습니다 #. 줄 시작 부분에 a 삽입하십시오 . 그런 다음 한 줄 아래로 이동하여 점 ( .)을 누릅니다 . 반복, 않습니다 j, ., j, ., 등 ... 주석하려면 제거 #(당신이 칠 수 x오버 #) 및 역 사용하여이 작업을 수행 k, .등 ...


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

#code code
#code
#code code code

커서를 왼쪽 상단 #기호 위에 놓고를 누릅니다 CtrlV. 이렇게하면 시각적 차단 모드가됩니다. 아래쪽 화살표 또는 J세 번을 눌러 세 줄을 모두 선택합니다. 그런 다음을 누릅니다 D. 모든 댓글이 사라집니다. 실행을 취소하려면을 누르십시오 U.

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

code code
code
code code code

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

I//Esc

그것은 대문자 I, // 및 Escape입니다.

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


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


예,이 질문에 이미 33 개 (대부분 반복) 답변이 있습니다.

Vim에서 줄을 주석 처리하는 또 다른 방법은 다음과 같습니다. motions . 기본 아이디어는을 입력하여 yip2 줄을 입력하거나 삭제 하여 단락을 잡아 당기는 것과 동일한 방법을 사용하여 줄을 주석 처리하거나 주석 해제 하는 것 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

위의 정규식을 원하는 위치에 맞게 수정하십시오 #.


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

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

첫 번째와 마지막 줄 (ma와 mb)을 표시하고 다음을 수행합니다. : 'a,'bs / ^ # //


Tim Pope의 vim-commentary 플러그인을 사용합니다.


Phil과 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>

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

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

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

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

사용법 :

  • Vundle (또는 내가 추측하는 Pathogen)을 통해 설치하십시오.
  • 텍스트를 강조 표시하고 다음과 :같이 표시됩니다.:<,'>
  • 여기에 Commentary를 입력 :<,'>Commentary하고를 누릅니다 Enter.
  • 팔. 당신의 꽃 봉오리.

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

다음은 코드입니다.

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': Execute는 명령을 호출합니다. 이 경우, 전체 버퍼 또는 강조 표시된 섹션 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시각적 모드에서 다음 명령을 매핑하지만 재귀 적으로 매핑하지 않음을 의미합니다 (다른 방식으로 사용할 수있는 다른 명령을 변경하지 않음을 의미). 기본적으로 vim 초보자라면 항상을 사용 noremap하여 물건을 부수 지 않도록하십시오. <silent>"나는 당신의 말이 아니라 당신의 행동만을 원합니다"를 의미하며 명령 줄에 아무것도 인쇄하지 말라고 명령합니다. <C-r>우리가 매핑하는 것입니다.이 경우 ctrl + r입니다 (이 매핑을 사용하여 일반 모드에서 "redo"를 위해 Cr을 정상적으로 사용할 수 있습니다). C-u다소 혼란 스럽지만 기본적으로 시각적 강조 표시를 잃지 않도록합니다 ( 이 답변 에 따르면 명령 '<,'>이 원하는대로 시작됩니다 ).call여기서는 vim에게 우리가 명명 한 함수를 실행하도록 지시 <cr>하고 enter버튼을 누르는 것을 나타냅니다 . 실제로 함수를 호출하려면 한 번 눌러야합니다 (그렇지 않으면 방금 call function()명령 줄에 입력 했고 대체 항목을 끝까지 통과 시키려면 다시 눌러야합니다 (정말 이유는 모르겠지만)).

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


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

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

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

이 줄을에 추가 .vimrc하여 단일 인수를 받아들이고 현재 선택 항목의 모든 줄 시작 부분에 인수를 배치하는 명령을 만듭니다.

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

1
2

그리고 이것을 실행하십시오 : :Comment //, 결과는 다음과 같습니다.

//1
//2

여기 답변의 아이디어를 시작으로 내 자신의 댓글 기능을 시작했습니다. 댓글을 켜고 끕니다. 같은 것을 처리 할 수 //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>

Jasmeet Singh Anand (vim.org에서 찾았습니다)의 comments.vim을 사용합니다 .

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선택한 여러 줄의 주석 처리를 제거하려면

가장 빠르고 가장 직관적 인 방법 )은 라인의 워크 다운 주석 처리를 위해 다시 매핑 한 다음 (워크 업 주석 해제 위해 다시 매핑하는 것 입니다 . 그것을 시도하고 당신은 돌아 가지 않을 것입니다.

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

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

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

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

단점은 패배 (하고 )문장 이동 (하지만 das거기에 채워 넣을 수 있음)에 대한 것이며, 때때로 선택 및 교체 또는 CtrlV긴 섹션 처리 로 대체 될 수 있다는 것 입니다. 그러나 그것은 매우 드뭅니다.

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

set cindent
set formatoptions=tcqr

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


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

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

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

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

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


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

눌러서 시각 모드로 들어갑니다

'v'

그런 다음

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

이제 선택과 관련된 모든 작업은 Enter 키입니다.

'gc'

반복 키의 주석 처리를 제거하기 위해 모든 선택 항목을 주석 처리합니다.

'gc'

나는 /* ... */(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

참고 URL : https://stackoverflow.com/questions/1676632/whats-a-quick-way-to-comment-uncomment-lines-in-vim

반응형