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모든 #
문자가 세로로 삭제됩니다 .
주석을 달기 위해 텍스트 블록은 거의 동일합니다.
- 먼저 주석을 달고 자하는 첫 번째 줄로 이동하여을 누릅니다 CtrlV. 그러면 편집기가
VISUAL BLOCK
모드로 전환됩니다. - 그런 다음 화살표 키를 사용하여 마지막 줄까지 선택하십시오.
- 이제를 누르면 ShiftI편집기가
INSERT
모드로 전환되고를 누릅니다 #. 이것은 첫 번째 줄에 해시를 추가합니다. - 그런 다음 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
방법은 다음과 같습니다.
주석 처리하려는 첫 번째 줄의 첫 번째 문자로 이동합니다.
히트 Ctrl+ qGVIM 또는 Ctrl+ vVIM에서 다음 주석 라인의 첫 번째 문자를 선택 아래로 이동합니다.
그런 다음을 누르고 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 . 기본 아이디어는을 입력하여 yip
2 줄을 입력하거나 삭제 하여 단락을 잡아 당기는 것과 동일한 방법을 사용하여 줄을 주석 처리하거나 주석 해제 하는 것 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
\
/
\
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
시각적 모드에서 다음 명령을 매핑하지만 재귀 적으로 매핑하지 않음을 의미합니다 (다른 방식으로 사용할 수있는 다른 명령을 변경하지 않음을 의미). 기본적으로 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
'your programing' 카테고리의 다른 글
디렉토리에 대한 심볼릭 링크 제거 (0) | 2020.09.27 |
---|---|
지정된 이름의 열을 포함하는 모든 테이블 찾기-MS SQL Server (0) | 2020.09.27 |
평범한 영어로 된 Ukkonen의 접미사 트리 알고리즘 (0) | 2020.09.27 |
iOS 6의 Safari가 $ .ajax 결과를 캐싱합니까? (0) | 2020.09.27 |
두 목록을 사전으로 변환 (0) | 2020.09.27 |