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 ответа3

3

Попробуй это:

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

imap <expr> <CR> EnterEnter()
3

Я расширил ответ @ romainl для работы с произвольными языками, сгенерировав регулярное выражение из Vim's &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

Удалить r из 'formatoptions. Это то, что делает этот вариант. Отключение будет означать, что вы никогда не сделаете так, чтобы vim сделал это для вас, а это значит, что вам нужно будет добавлять ведущие маркеры комментариев, когда вы действительно их хотите, но это компромисс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .