vim 에서 블럭 주석처리 매크로

송지석의 이미지

visual block을 설정해서 주석으로 만드는 게 emacs에선 참 쉽더군요.
그런데 vi에서는 잘 못 찾아서 불만이었습니다. 몇몇 매크로나 함수들이 있긴 한데, 라인 단위로는 되지만 블럭 단위로-라인 중간에 끝나도- 되는 경우는 없는 것 같았습니다.

그래서 c 전용으로 허접하게 짠 매크로로 버텨오다가 오늘 버그 픽스를 해서 필요하신 분들이 있을까 해서 올립니다.

---수정---
더 쉬운 방법을 찾아서 내용을 추가합니다.
밑에 함수를 사용한 버전보다 간단하고 잘 동작하며, block을 yank하지 않기 때문에 복사해뒀던 내용이 바뀌지 않습니다.
(<ESC>로 ctrl+v 입력후 esc 입력보다 더 쉽게 표현할 수 있어서 다시 수정합니다.)

" block comment
vm <ESC>c <ESC>`>a */<ESC>`<i/* <ESC>`<
" line commentify
nm <ESC>c ^i/* <ESC>$a */<ESC>^

gvim에서는 alt가 저렇게 안먹을 겁니다. 아래와 같이 gvimrc에 넣어 주시면 됩니다.
vm <M-c> <ESC>`>a */<ESC>`<i/* <ESC>`<
nm <M-c> ^i/* <ESC>$a */<ESC>^

---------------------------------------

vimrc에 다음을 추가하시면 됩니다.

function MySetCursor()
    let s_len = strlen(@@)
    let line_c = 0
    let idx = stridx(@@, "\n")
    let str = @@
    while idx >= 0
        let line_c = line_c + 1
        let s_len = strlen(str)
        let str = strpart( str, idx+1 )
        let idx = stridx(str, "\n")
    endwhile
    echo line_c
    let Myl=line(".")
    if strlen(str) == 0
        let line_c = line_c - 1
        let Myc= s_len
    else
        let Myc= strlen(str)
    endif
    if line_c == 0
        let Myc =  col(".") + Myc + 3 " /*
    endif
    call cursor(Myl+line_c, Myc)
    echo Myc
endfunction

vm ^[c y^[i/* ^[:call MySetCursor()^Ma */^[

vm 부분은 ^[이 ctrl+v 입력후 esc키, ^M은 ctrl+v 입력후 엔터 임을 주지.

ALT-c를 누르면 설정한 블럭이 /* */ 주석 처리 됩니다.
원리는 사람이 입력하는 대로 따라했습니다.
블럭 설정한 것의 길이를 알기 위해 일단 yank 하고 먼저 /* 입력,
yank한 레지스터로 부터 길이를 알아내서 커서를 옮기고(라인과 컬럼)
뒤에 */ 입력 입니다.
yank를 한번 하기 때문에 레지스터 내용이 바뀜을 주의하세요.

참고로 블럭 모드 아닐 때 한 라인을 주석 처리하려면 다음 맵으로 됩니다.
nm ^[c ^v$hda/* */^[hhhp
역시 ^[이 ctrl+v 입력후 esc키 임을 주지하세요.

File attachments: 
첨부파일 크기
Image icon visual_comment1.jpg43.05 KB
Image icon visual_comment0.jpg43.53 KB
Forums: 
noohgnas의 이미지

EnhancedCommentify 라는 플러그인은 라인별로 /* */ 처리를 해줍니다.

http://vim.sourceforge.net/scripts/script.php?script_id=23


----
I think, therefore I am.

inhosens의 이미지

라인별로 해주는 것이 더 정확해 보입니다.
Ctrl+V 로 블럭을 지정해 준다면 라인별로 주석처리를 해줘야 제대로 되지 않나 싶네요.

송지석의 이미지

제가 필요한 것은 라인 단위로가 아니라 라인 중간에서 시작해서 중간에 끝나게 블럭 잡으면 그 블럭만 주석처리하는 겁니다. 그런 게 필요한 때가 있더군요. ansi 형태로만 주석 쓸 수 있는데 같은 줄에 이미 주석이 하나 있는 경우 등요.
그럴 때 쓸 수 있는 매크로입니다.
EnhancedCommentify 는 써보았습니다만 그런 기능이 없었습니다. 라인단위로만 쓰시려면야 그걸 쓰시면 되겠습니다.

랜덤여신의 이미지

주제와 약간 안맞는 이야기입니다만, 저의 경우는에는 라인별로 코멘트 지정할때 이렇게 합니다.

일단 V 눌러서 줄 비주얼 모드로 들어가서 지정해놓고,

:norm i//

이렇게 칩니다.

해제할때는

:norm xx

송지석의 이미지

더 쉬운 매크로를 찾았습니다. 커서 이동이 키 두개로 쉽게 되네요.
vm ^[c ^[`>a */^[`<i/* ^[`<
^[이 ctrl+v 후에 esc입니다.

hey의 이미지

^[c가 ALT-C를 의미하나요? 그것 때문인지 gvim에선 안되는군요. :]
vim에선 잘 되구요.
uncomment 기능도 있으면 좋겠습니다.


----------------------------
May the F/OSS be with you..


송지석의 이미지

hey wrote:
^[c가 ALT-C를 의미하나요? 그것 때문인지 gvim에선 안되는군요. :]
vim에선 잘 되구요.
uncomment 기능도 있으면 좋겠습니다.
아 사실 저도 그거 때문에 고민중인데 어디 남는 단축키 없을까요? 제가 윈도에서 작업하느라 보통 cygiwn sshd띄워 putty 접속으로 쓰는데 gvim에서도 된다면 탐색기에서 띄워 쓸 수 있으니 좋을 것 같네요.
ham의 이미지

위의 함수을 실행 시커보니까..
주석이 되는데 처음 주석(/*) 만 되고 끝 주석(*/)은 되지가 안네요
에러가 뜨는데 cursor 함수가 undefine function 이다고 하네요
솔라리스 8에서 테스트 해보았습니다.

좋은 하루 보내세요

송지석의 이미지

ham wrote:
위의 함수을 실행 시커보니까..
주석이 되는데 처음 주석(/*) 만 되고 끝 주석(*/)은 되지가 안네요
에러가 뜨는데 cursor 함수가 undefine function 이다고 하네요
솔라리스 8에서 테스트 해보았습니다.

좋은 하루 보내세요

음, 그러시다면 vim 버전 문제가 아닐까요? cursor는 vim 내장 함수입니다.

제가 나중에 올린
vm ^[c ^[`>a */^[`<i/* ^[`<
로 해보세요. 어쩌면 이걸로는 잘 될 지도 모르겠습니다.
이건 함수를 안쓰고 `> , `< 키를 쓰는 건데 visual 선택 영역의 처음, 끝으로 가는 겁니다. 역시 vi에선 안되고 vim에서 지원되는 걸로 기억하네요.

깊은바다의 이미지

hey wrote:
^[c가 ALT-C를 의미하나요? 그것 때문인지 gvim에선 안되는군요. :]
vim에선 잘 되구요.
uncomment 기능도 있으면 좋겠습니다.

저 같은 경우는

Quote:
^[geshifilter-c 대신에 ,// 를 사용을 합니다.
[/geshifilter-c]
송지석의 이미지

깊은바다 wrote:
hey wrote:
^[c가 ALT-C를 의미하나요? 그것 때문인지 gvim에선 안되는군요. :]
vim에선 잘 되구요.
uncomment 기능도 있으면 좋겠습니다.

저 같은 경우는

Quote:
^[geshifilter-c 대신에 ,// 를 사용을 합니다.
gvim에서 단축키는 더 쉽더군요. vm &lt;M-c&gt; ^&#91;`&gt;a */^&#91;`&lt;i/* ^&#91;`&lt; nm &lt;M-c&gt; ^i/* ^&#91;$a */^&#91;^ 이렇게 하시면 됩니다. ^[은 역시 Ctrl+v 후에 esc입니다. 디폴트로 까셨다면 C:\Vim 아래에 _vimrc에 추가하시면 됩니다.[/geshifilter-c]
xster의 이미지

^[ 가 Ctrl+V 후 Esc 인거군요
해보면 Esc키를 입력한 것으로 작동하는데 <Esc>를 써도 될 것같습니다.
<F1>이 F1키, <Esc>가 Esc 키, <C->가 Ctrl + ,
그냥 입력하면 되고 이해하기도 더 쉽지 않을까요?

송지석의 이미지

ESC가 있는 줄 몰랐네요. 그렇게 쓰면 되겠습니다.
사실은 Alt-C를 입력하려고 ctrl+v후에 alt+C를 눌렀더니 ^[c저렇게 입력되더군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.