Як прокоментувати набір рядків, вибраних у візуальному режимі?


35

Як я коментую кілька у вибраному рядку візуального режиму? Як зробити так, щоб мова була специфічною?

Наприклад, якщо вибрано перші 4 рядки:

def foo(a,b):
    for each in (a,b):
        print each
    return a+b
print "2"

Операція команди / макроса повинна призвести до цього (в python):

#def foo(a,b):
#    for each in (a,b):
#        print each
#    return a+b
print "2"

Відповіді:


31

Якщо ви хочете коментувати конкретні мови, вам знадобиться плагін, як nerdcommenter .

Крім того, хоча це не відповідає вашому актуальному питанню, ви можете використовувати вбудовані дії vim та свої знання персонажів коментарів кожної мови ...

Варіант №1: V-блоки

  1. :1 Enter (Перейти до рядка 1)
  2. Ctrl-V (режим V-блоку)
  3. jjj (Вниз ще 3 рядки)
  4. Shift-I (введіть режим вставки перед блоком)
  5. # (Вставте "#")
  6. Esc (Повернення до звичайного режиму)

Варіант №2: Заміна

:1,4s/^/#/

Зламатися:

  1. : Наступна команда Ex
  2. 1,4 на лініях з 1 по 4
  3. s замінник
  4. /роздільник для частин команди підстановки.
    (Ви також можете використовувати інший символ, наприклад :)
  5. ^ початок рядка
  6. / роздільник
  7. # символ коментаря для python
  8. / остаточний роздільник

Варіант №3: Повторне застосування макросу ( джерело )

  1. :1 Enter (Перейти до рядка 1)
  2. qa(Почати запис у регістрі a)
  3. Shift-I (Введіть режим вставки на початку рядка
  4. # (Додайте "#" на початку рядка)
  5. Esc (Повернення до звичайного режиму)
  6. q (Зупинити запис)

  7. :2,4 normal @a(повторно запустіть макрос, записаний для реєстрації aна лініях між 2 і 4)

    АБО

    ви можете вибрати лінії у візуальному режимі та натиснути, :щоб автоматично заповнити рядок Ex :'<,'>(діапазон від початку до кінця візуального вибору), а потім набрати normal @aта натиснути Enter( джерело ).

Тепер, коли ви хочете коментувати деякі рядки, просто перезапустіть макрос, записаний для реєстрації aв цих рядках:

:9,22 normal @a (comment out lines 9-22)

1
Варіант 4: Плагін
опитування Коді

Я не розумію, чому ви використовуєте макрос для однієї команди, коли ви можете це зробити :9,22 normal I#відповідно до моєї відповіді.
Бен

Чому б ви використовували: 1 <enter>, коли ви можете використовувати gg?
Танат

@Tanath Коментування з першого рядка було специфічним для цього прикладу. Якби автор хотів прокоментувати від рядків 9 до 22, вони не змогли б використовувати gg.
bsmith89

@Ben я нічого не знав про normalкоманду, перш ніж писати цю відповідь. Ти правий; :9,22 normal I#також працюватиме.
bsmith89

26

Використовуючи режим візуального блоку ( CtrlV), виберіть початок рядків. Потім натисніть I#(це велика літера I), щоб вставити хеш-символ у кожному з цих рядків. Потім натисніть, Escщоб повернутися з режиму вставки в звичайний режим.


Це не працює для мене. Він вставляє коментар лише в першому рядку.
gon1332

Ви штовхаєте ctrl? Бо ctrl+vце річ від справедливої v.
опитування Коді

@CodyPoll Я знаю. Все нормально I. Коли я натискаю I, то #заголовок буде розміщений лише перед першим рядком.
gon1332

@CodyPoll Добре .. Я просто стаціонарний. Я не натискав Escпісля описаної процедури.
gon1332

@ gon1332, наскільки я знаю, потрібно натиснути Escнаприкінці.
Gonçalo Ribeiro

18

Якщо вам просто потрібне швидке рішення будь-якої мови, на якій ви зараз перебуваєте, і текст у вас уже вибраний у візуальному режимі

:norm 0i#

виконує роботу. (Для кожного рядка в звичайному режимі перейдіть до першого стовпчика та вставте #. Використання :norm I#буде вставляти його перед першим символом без пробілу, який може бути не тим, що ви хочете.) Використання :norm i#також буде працювати, оскільки :normпочинається на початку рядок, але це менш чітко і менш зрозуміло, якщо ви цього не знаєте.

Звичайно, якщо ви збираєтеся робити це часто, вам потрібно буде налаштувати відображення або шукати плагін.


1
0 не потрібен, оскільки за замовчуванням normalкоманда виконується курсором на початку рядка.
nitishch

1
Звичайно, номери рядків,%, позначки можуть бути встановлені за допомогою цієї команди. Приклад: 1,5norm i # (або): 'a,' bnorm i # (або): 10% норма i #
SibiCoder

9

Якщо це зробити автоматично, потрібно додати у vimrcфайл ( джерело ) щось на зразок наступного :

au FileType haskell,vhdl,ada let b:comment_leader = '-- '
au FileType vim let b:comment_leader = '" '
au FileType c,cpp,java let b:comment_leader = '// '
au FileType sh,make let b:comment_leader = '# '
au FileType tex let b:comment_leader = '% '
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR>
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR>

Використання ,cдля коментування регіону та для коментування ,uрегіону. Це вручну встановлює символи коментарів для різних мов.

Другий варіант - використовувати плагін типу tcomment , vim- comment або comments.vim . Я сам використовую tcomment. Будь ласка, прочитайте інструкції щодо використання та встановлення на їх сторінках, оскільки я вважаю, що це поза темою питання.

Я б запропонував вам використовувати плагін (один із зв'язаних вище чи інший), оскільки це набагато простіше, ніж підтримувати фрагмент коду у вашому vimrcфайлі.

Редагувати: Я видалив ручний спосіб, коли питання було змінено, а також правильний спосіб відповів 200_success.


Додаткова пропозиція для плагінів: NERD Commenter - vim.org/scripts/script.php?script_id=1218
надано

Примітка. Це підтримує лише рядкові коментарі. Наприклад, ANSI C не розпізнає //(лише /* */).
wchargin

Хоча мені подобається такий підхід, чи є спосіб зробити його перемиканням коментарів?
ideaman42

1
@ Ideman42 Вам слід було б зробити функцію і перевірити, чи починається поточний рядок з коментаря, а потім залежно від цього виклику будь-якої з :sкоманд, показаних у витязі у відповіді. Сам чек був би чимось на кшталт getline('.') =~ "^" . escape(b:comment_leader, '\/'). Якщо це справжній коментар, інакше коментуйте. Це не перевірено і повинно слугувати лише прикладом.
tokoyami

5

Для цього я використовую scrooloose / nerdcommenter .

За допомогою цього плагіна ви зможете візуально вибрати рядки та натиснути leader+, cщоб переключити коментарі. Залежно від типу файлу, він використовуватиме різні символи для коментування.


5

Вибравши рядки, просто введіть

:norm I#

:автоматично розміщується '<,'>у вашому командному рядку, що є діапазоном від початку вашого вибору до кінця; normвиконує команду в звичайному режимі і буде діяти в цьому діапазоні; I#- це команда звичайного режиму, яка вставляє "#" на початку рядка.


4

Я великий фанат TComment для цього; не тільки я можу робити певні стилі коментарів для файлів, але навіть вказувати блок проти рядка для мов, що підтримують блокування коментарів.

    gc{motion}   :: Toggle comments (for small comments within one line 
                    the &filetype_inline style will be used, if 
                    defined)
    gcc          :: Toggle comment for the current line

Explicit commenting/uncommenting:

    g<{motion}   :: Uncomment region
    g<c          :: Uncomment the current line
    g<b          :: Uncomment the current region as block

    g>{motion}   :: Comment region
    g>c          :: Comment the current line
    g>b          :: Comment the current region as block

In visual mode:

    gc           :: Toggle comments
    gC           :: Comment selected text

Дякую за вашу відповідь! Не могли б ви її розширити? Надання відповідей плагіна - це добре, але зараз це лише посилання на плагін. Принаймні, у відповіді очікується основний опис того, що він робить і як це використовувати. також дивіться цей мета-пост .
Мартін Турной

Здається, нерозумно копіювати / вставляти брелоки, але там ви йдете; Я вже описав, що це робить.
Collin Grady

3

Я вважаю, що плагін vim-comment - це найпростіший спосіб зробити це. Виберіть діапазон ліній, а потім просто натисніть gc. Він використовуватиме відповідний символ коментування для відкритого вами файлу. Можна навіть без візуального вибору відрекомендувати суміжні коментовані рядки з gcuабо gcgc.


2

Якщо припустити, що ви хочете додати префікс до 5 рядків на початку рядка, ви можете використовувати пошук та заміну :

:.,+5s/^/prefix_/g

або в кінці рядків:

:.,+5s/$/suffix_/g

Або скористайтеся візуальним режимом ( Ctrl+ v) для вибору вертикального блоку тексту, після чого введіть режим вставки ( I) і введіть щось і натисніть, Escщоб підтвердити та застосувати зміни до інших рядків.

Пов'язані:


2

Ця відповідь тут : 1) показати правильний код для вставки в , .vimrcщоб vim 7.4+зробити блок коментування / розкоментувати, зберігаючи при цьому рівня відступу з 1 ярликом в візуальному режимі і 2) , щоб пояснити це.

Ось код:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

Як це працює:

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

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