let b:commentChar='//'
: Це створює змінну в vim. b
тут відноситься до області, яка в даному випадку міститься в буфер, тобто відкритий в даний момент файл. Персонажі ваших коментарів - це рядки, і їх потрібно загорнути в лапки, лапки не є частиною того, що буде замінено при зміні коментарів.
autocmd BufNewFile,BufReadPost *...
: Автокоманди спрацьовують у різних речах, у цьому випадку вони спрацьовують, коли новий файл чи файл читання закінчується певним розширенням. Після запуску виконайте наступну команду, яка дозволяє нам змінювати commentChar
залежно від типу файлу. Є й інші способи зробити це, але вони більш заплутані для новачків (як я).
function! Docomment()
: Функції оголошуються починаючи з function
і закінчуючи endfunction
. Функції повинні починатися з великої літери. що !
гарантує , що ця функція переопределяет всі попередні функції , визначені як Docomment()
з цією версією Docomment()
. Без цього у !
мене виникли помилки, але це може бути тому, що я визначав нові функції через командний рядок vim.
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Виконання викликів команди. У цьому випадку ми виконуємо substitute
, який може приймати діапазон (за замовчуванням це поточний рядок), наприклад, %
для всього буфера або '<,'>
для виділеного розділу. ^\s*
це регулярне вираження, щоб відповідати початку рядка з подальшим розміром пробілу, до якого потім додається (у зв'язку з &
). .
Тут використовується для конкатенації, так як escape()
не може бути загорнуті в лапки. escape()
дозволяє уникнути символу, commentChar
який відповідає аргументам (у цьому випадку \
та /
), попередньо додавши їх до а \
. Після цього ми знову з'єднуємося з кінцем нашої substitute
рядка, яка маєe
прапор. Цей прапор дозволяє нам мовчки провалюватися, це означає, що якщо ми не знайдемо відповідність на заданому рядку, ми не будемо на нього кричати. В цілому цей рядок дозволяє нам поставити символ коментаря, а потім пробіл перед першим текстом, тобто ми збережемо рівень відступу.
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Це схоже на нашу останню величезну довгу команду. Унікальний для нас цей \v
, що гарантує, що нам не доведеться уникати наших ()
, і 1
що стосується групи, яку ми створили з нашою ()
. В основному ми співставляємо рядок, який починається з будь-якої кількості пробілів, а потім наш символ коментаря, а потім будь-яка кількість пробілів, і ми зберігаємо лише перший набір пробілів. Знову ж таки, e
ми можемо мовчки провалюватися, якщо у нас немає символу коментарів у цьому рядку.
let l:line=getpos("'<")[1]
: це задає змінну так, як ми це робили з нашим характером коментарів, але l
стосується локальної області (локальної для цієї функції). getpos()
отримує позицію, в даному випадку, початку нашого підсвічування, і [1]
засоби, які ми дбаємо лише про номер рядка, а не про інші речі, такі як номер стовпця.
if match(getline(l:line), '^\s*'.b:commentChar)>-1
: ти знаєш, як if
працює. match()
перевіряє, чи містить перша річ друга, тому ми захоплюємо рядок, з якого ми розпочали виділення, і перевіряємо, чи не починається пробіл з подальшим позначенням коментаря. match()
повертає індекс там, де це правда, і -1
якщо не знайдено збігів. Оскільки if
оцінює всі ненульові числа справжніми, ми маємо порівняти результат, щоб побачити, чи більший він від -1. Порівняння у vim
поверненнях 0, якщо невірно, і 1, якщо істинно, і це те, що if
хоче бачити, щоб правильно оцінити.
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
: vnoremap
означає відобразити наступну команду у візуальному режимі, але не відображати її рекурсивно (тобто не змінюйте жодних інших команд, які можуть використовуватися іншими способами). В основному, якщо ви новачок у вим, завжди використовуйте, noremap
щоб переконатися, що ви не порушите справи. <silent>
означає "Я не хочу твоїх слів, а лише твоїх дій", і вказує йому не друкувати нічого в командному рядку. <C-r>
це те, що ми відображаємо, це ctrl + r в цьому випадку (зауважте, що ви все одно можете використовувати Cr для нормального режиму з цим відображенням у звичайному режимі). C-u
якась заплутана, але в основному вона гарантує, що ви не втратите свого візуального підсвічування (відповідно до цієї відповіді, це змушує вашу команду починати саме з '<,'>
того, що ми хочемо).call
тут просто вказує vim виконувати функцію, яку ми назвали, і <cr>
стосується натискання enter
кнопки. Нам потрібно одного разу натиснути його, щоб насправді викликати функцію (інакше ми просто набрали call function()
командний рядок, і нам доведеться натиснути її знову, щоб наші замінники пройшли весь шлях (не дуже впевнений, чому, але що б там не було).
У будь-якому випадку, сподіваємось, це допомагає. Це буде приймати що - або підсвічені v
, V
або C-v
, перевірити , якщо перший рядок коментарів, якщо так, спробуйте розкоментувати всі виділені рядки, а якщо немає, додати додатковий шар символи коментаря до кожного рядка. Це моя бажана поведінка; Я не просто хотів, щоб він перемикав, коментували чи ні кожен рядок у блоці, тому він прекрасно працює для мене після запиту кількох запитань з цього приводу.