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 в режимі вставки, щоб видалити автоматично вставлені маркери коментарів одним акордом клавіш.
Ітан Рейснер

1
@EtanReisner, що насправді краще, але все-таки одна клавіша занадто багато для мене, оскільки це такий звичайний випадок використання :)
Patrick Oscity

Ви припустили, що вам хочеться знову натиснути клавішу Enter, щоб отримати потрібну вам поведінку, але ctrl-u занадто багато? Ви можете спробувати зіставити <enter> <enter> у режимі вставки, щоб автоматично виконати ctrl-u для вас, але це призведе до затримки, якщо ви коли-небудь натискаєте <enter> лише один раз (не натискаючи нічого іншого).
Ітан Рейснер

Крім того, він повинен запускатися, лише якщо коментований рядок порожній. Помітна затримка при натисканні на <Enter> також неприйнятна.
Patrick Oscity

Це затримається лише в тому випадку, якщо ви не натиснете жодні інші клавіші, я вважаю, оскільки vim доведеться почекати, щоб переконатися, що ви ще не плануєте натиснути інший ключ. Ви можете використати функцію для виконання цієї перевірки, я думаю, хоча це може бути не особливо просто.
Ітан Рейснер

Відповіді:


4

Спробуйте це:

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

imap <expr> <CR> EnterEnter()

Спасибі виглядає чудово! Спробую, коли повернусь додому. Чи знаєте ви спосіб самостійного розширення регулярного виразу відповідно до мови маркерів коментарів? Інформація повинна бути там у файлах синтаксису чи щось. Можливо, я можу використати функцію синтаксису для цього ...
Патрік Осьміті

Я маю на увазі в C, він повинен відповідати // і / * і * (багаторядкові коментарі) і в рубіні № тощо
Патрік Осьміт

Очевидно, ця функція зовсім не є загальною. Дивіться :h 'comment'і :h format-comment'.
romainl

Функція модифікована для роботи з #рубіном та "vimscript на додаток до класичної //. Насправді немає сенсу робити що-небудь для *багатолінійних коментарів у стилі С, оскільки це все одно повинно закінчуватися */.
romainl

Гм, можливо, <CR><CR>можна було б використати для завершення багаторядкового коментаря ...
romainl

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
Чому <Esc>S? <C-u>робить те ж саме, не виходячи з режиму вставки. У всякому разі, у мене була спеціальна функція, яка робила купу речей <CR>і перейменовувала її SmartEnter()лише вчора після того, як я опублікувала свою відповідь ;-) Також я не впевнений, що &commentstringце правильний вибір, оскільки він, як правило, містить лише одну форму, і це може бути "лінійно" або "блочно" ( /*%s*/на C, //%sу Javascript тощо).
romainl

2

Видаліть r з 'форматувань. Ось що робить цей варіант. Якщо вимкнути це означає, що ви ніколи не будете робити це для вас, а значить, вам потрібно буде додати провідні маркери коментарів, коли ви насправді хочете їх, але це компроміс.


2
Я насправді хочу, щоб Вім додав для мене маркери коментарів, я це люблю. Але я також хочу швидкий спосіб вийти з коментаря. Дякую за вашу відповідь.
Патрік Осіті

Для звичайної команди 'o' команда повинна видалити 'r' зformatoptions
elig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.