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
, перевірити , якщо перший рядок коментарів, якщо так, спробуйте розкоментувати всі виділені рядки, а якщо немає, додати додатковий шар символи коментаря до кожного рядка. Це моя бажана поведінка; Я не просто хотів, щоб він перемикав, коментували чи ні кожен рядок у блоці, тому він прекрасно працює для мене після того, як задав кілька запитань з цього приводу.
NERD Commenter
на мій погляд, це шлях піти сюди! +1 для цього