Vim : 새로운 줄에 자동 주석


9

내가 설정했기 때문에 Vim은 주석 처리 된 행에서 새 행을 시작할 때 자동으로 주석을 삽입합니다 formatoptions=tcroql. 예를 들어 (커서는 *) :

// this is a comment*

그리고 <Enter>(삽입 모드) 또는 o(정상 모드)를 누른 후 나는 다음과 같이 남습니다.

// this is a comment
// *

이 기능은 긴 여러 줄 주석을 작성할 때 매우 유용하지만 종종 한 줄 주석 만 원합니다. 이제 코멘트 시리즈를 끝내려면 몇 가지 옵션이 있습니다.

  • 히트 <Esc>S
  • 공격 <BS>을 세 번

이 두 가지 모두 세 번의 키 입력을 제공하며, <Enter>이것 과 함께 새로운 줄에 대한 네 번의 키 입력을 의미합니다. 이상적으로, 나는 <Enter>두 번째로 두드리고 싶습니다 .

// this is a comment
*

솔루션이 다른 들여 쓰기 수준에서도 작동하는 것이 중요합니다. 즉

int main(void) {
    // this is a comment*
}

히트 <Enter>

int main(void) {
    // this is a comment
    // *
}

히트 <Enter>

int main(void) {
    // this is a comment
    *
}

몇 년 전에 일부 텍스트 편집기 에서이 기능을 보았지만 어떤 기능인지 기억하지 못합니다. Vim에서 나를 위해이 솔루션을 알고있는 사람이 있습니까? 내 솔루션을 롤링하는 올바른 방향의 포인터도 매우 환영합니다.


3
삽입 모드에서 ctrl-u를 사용하여 하나의 키 코드에서 자동으로 삽입 된 주석 마커를 삭제할 수 있습니다.
Etan Reisner

1
@EtanReisner 실제로 더 낫지 만, 일반적인 사용 사례이기 때문에 여전히 하나의 키 입력이 너무 많습니다. :)
Patrick Oscity

당신은 당신이 원하는 행동을 얻기 위해 엔터를 다시 칠 수 있기를 원했지만 ctrl-u가 너무 큽니까? 삽입 모드에서 <enter> <enter> 매핑을 시도하여 자동으로 ctrl-u를 수행 할 수는 있지만 <enter>를 한 번만 누른 경우 (다른 것을 치지 않고) 지연이 발생합니다.
Etan Reisner

또한 주석 처리 된 행이 비어있는 경우에만 트리거해야합니다. <Enter>를 칠 때 눈에 띄는 지연도 허용되지 않습니다.
패트릭 오스 시티

vim이 다른 키를 누르지 않으려면 기다릴 필요가 있기 때문에 다른 키를 누르지 않으면 지연됩니다. 그 검사를 수행하는 기능을 사용할 수도 있습니다. 특히 간단하지는 않지만 생각합니다.
Etan Reisner

답변:


4

이 시도:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()

고마워요! 집에 도착하면 시도합니다. 주석 마커 언어와 독립적으로 정규식을 확장하는 방법을 알고 있습니까? 정보는 구문 파일이나 다른 곳에 있어야합니다. 어쩌면 나는 이것에 대한 구문 기능을 활용할 수 있습니다 ...
Patrick Oscity

C에서는 //, / *, * (여러 줄 주석), 루비 번호 등이 일치해야합니다.
Patrick Oscity

분명히이 기능은 전혀 일반적인 것이 아닙니다. 참조 :h 'comment':h format-comment'.
romainl

클래식 외에 #루비 및 "vimscript 와 함께 작동하도록 수정되었습니다 //. 그것은 정말 아무것도 할 이해가되지 않습니다 *그것 때문에 C 스타일의 여러 줄의 코멘트를 해야한다 끝나지 */어쨌든.
romainl

흠, 아마 여러 <CR><CR>줄 주석을 마무리하는 데 사용될 수 있습니다 ...
romainl

3

Vim의 정규식을 생성하여 @romainl의 답변을 임의의 언어로 작업하도록 확장했습니다 &commentstring.

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

그러나 전혀 다시 매핑 할 수없는 것처럼 보이지만 <CR>작동하지 않습니다. 지금 <CR><CR>은이 문제가 해결 될 때까지 사용 합니다.


1
<Esc>S? <C-u>삽입 모드를 벗어나지 않고 동일하게 수행합니다. 어쨌든, 나는 많은 일을 <CR>하고 사용자 정의 기능을 가지고 SmartEnter()어제 ;-)를 게시 한 후 어제 이름을 바꿨습니다 . 또한 &commentstring일반적으로 하나의 양식 만 포함하고 "linewise"또는 "blockwise"( /*%s*/C, //%sJavascript 등) 일 수 있으므로 올바른 선택 인지 확실하지 않습니다 .
romainl

2

'formatoptions에서 r을 제거하십시오. 그것이 그 옵션이하는 일입니다. 이 기능을 끄면 vim을 사용하지 않을 수 있습니다. 즉, 실제로 주석 표시를 원할 때 주석 표시기를 추가해야하지만 이는 절충입니다.


2
나는 실제로 Vim이 나를 위해 주석 마커를 추가하기를 원합니다 . 그러나 나는 또한 의견을 끝내는 빠른 방법을 원합니다. 그래도 답변 주셔서 감사합니다.
패트릭 오스 시티

일반 모드 'o'명령의 경우 –r에서 'r'을 제거해야합니다.formatoptions
elig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.