답변:
언어 별 설명을 원하면 nerdcommenter 와 같은 플러그인이 필요합니다 .
또는 실제 질문에 대한 답변은 아니지만 내장 vim 작업과 각 언어의 주석 문자에 대한 지식을 사용할 수 있습니다.
:1
Enter (1 행으로 이동)jjj
(3 줄 아래)#
( '#'삽입):1,4s/^/#/
:
Ex 명령은 다음과 같습니다1,4
1 ~ 4 행s
대용품/
대체 명령을 구분하는 구분 기호입니다. :
)^
줄의 시작/
분리 기호#
파이썬의 주석 문자/
최종 분리기:1
Enter (1 행으로 이동)qa
(레지스터에 기록 시작 a
)#
(줄의 시작 부분에 '#'을 추가하십시오)q
(녹화 중지)
:2,4 normal @a
( a
2와 4 사이의 줄 에 등록하기 위해 기록 된 매크로를 다시 실행하십시오 )
또는
시각 모드에서 선을 선택하고 :
눌려 Ex 선을 자동으로 채우고 :'<,'>
(시각 선택의 시작부터 끝까지) 입력 normal @a
하고을 누르십시오 Enter( source ).
이제 일부 줄에 주석을 달 때마다 기록 된 매크로를 다시 실행하여 a
해당 줄 에 등록하십시오 .
:9,22 normal @a (comment out lines 9-22)
:9,22 normal I#
내 대답에 따라 할 수있을 때 단일 명령에 매크로를 사용하는 이유를 이해하지 못합니다 .
normal
이 답변을 작성하기 전에 명령 에 대해 아무것도 몰랐습니다 . 네가 옳아; :9,22 normal I#
잘 작동합니다.
비주얼 블록 모드 ( CtrlV)를 사용 하여 줄의 시작을 선택하십시오. 그런 다음 I#(이것은 대문자입니다 I
) 각 행에 해시 문자를 삽입하십시오. 그런 다음을 눌러 Esc삽입 모드에서 정상 모드로 돌아갑니다.
ctrl
있습니까? 왜냐하면 ctrl+v
다른 것과는 다른 것입니다 v
.
I
입니다. 나는 누르면 I
, 다음은 #
첫 번째 라인의 앞에 배치됩니다.
Esc
설명 된 절차 후에 눌리지 않았다 .
Esc
끝에서 눌러야 합니다.
현재 사용중인 언어에 대한 빠른 해결책이 필요하고 이미 시각적 모드에서 텍스트를 선택한 경우
:norm 0i#
일을한다. (각 행의 경우, 정상 모드에서, 첫 번째 열 및 삽입으로 이동합니다 #
. 사용 :norm I#
공백이 아닌 첫 번째 문자 전에 삽입합니다, 당신이 원하는 것이 아닐 수도있다.)를 사용하여 :norm i#
도 것이다 일을 때문에 :norm
의 시작 부분에서 시작 당신이 그것을 모르면 덜 명확하고 덜 명확합니다.
물론이 작업을 자주 수행하려는 경우 매핑을 설정하거나 플러그인을 찾고 싶을 것입니다.
normal
명령은 줄 시작시 커서로 실행됩니다.
자동으로 수행하려면 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가 올바른 방법으로 답변했습니다.
//
(에만 해당 /* */
).
:s
에 따라 답변의 발췌 부분에 표시된 명령 중 하나를 확인해야 합니다. 수표 자체는 다음과 같습니다 getline('.') =~ "^" . escape(b:comment_leader, '\/')
. 주석이없는 경우 주석 처리하십시오. 이것은 테스트되지 않았으며 예제로만 사용해야합니다.
나는 이것을 위해 scrooloose / nerdcommenter 를 사용합니다.
이 플러그인을 사용하면 라인을 시각적으로 선택하고 leader+ c를 눌러 주석을 토글 할 수 있습니다. 파일 유형에 따라 주석을 달기 위해 다른 기호를 사용합니다.
나는 이것을 위해 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
vim-commentary 플러그인 이 가장 쉬운 방법이라는 것을 알았습니다 . 줄 범위를 선택한 다음를 누르십시오 gc. 열린 파일 형식에 적절한 주석 문자를 사용합니다. 시각적으로 선택하지 않아도 gcu또는 로 주석 처리 된 인접한 줄의 주석을 해제 할 수 있습니다 gcgc.
줄의 시작 부분에 5 줄에 접두사를 추가한다고 가정하면 검색 및 바꾸기를 사용할 수 있습니다 .
:.,+5s/^/prefix_/g
또는 줄 끝에서 :
:.,+5s/$/suffix_/g
또는 시각 모드 ( Ctrl+ v)를 사용하여 수직 텍스트 블록을 선택한 다음 삽입 모드 ( I)를 입력하고 무언가를 입력 한 후을 눌러 Esc변경 내용을 확인하고 다른 줄에 적용하십시오.
관련 :
이 답변은 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
\
/
\
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
. if
0이 아닌 모든 숫자를 참으로 평가 하므로 출력이 -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
, 첫 번째 줄은 주석 선택하면 그렇다면, 모든 강조 라인의 주석을 해제하려고를, 그렇지 않은 경우, 각 라인에 주석 문자의 추가 레이어를 추가합니다. 이것은 내가 원하는 행동입니다. 그 후 나를 위해 완벽하게 작동, 그래서 난 그냥,이 블록의 각 행은 주석 아닌지 여부를 전환하고 싶지 않았다 요구하는 여러 주제에 대한 질문.