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.