Який швидкий спосіб коментувати / коментувати рядки у Vim?


1167

У мене відкритий файл коду Ruby in vi, є рядки, коментовані #:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

Скажіть, я хочу коментувати всі рядки в першому def ... endрозділі. Який ефективний спосіб зробити це у Vim?

Взагалі, я шукаю простий і чіткий спосіб коментувати і коментувати рядки. Тут я маю справу з кодом Ruby, але це може бути JavaScript ( //) або Haml ( -#).


20
Прийняту відповідь слід змінити на одну з відповідей, де є детальні інструкції щодо виконання блоків коментування / коментування без використання плагіна. Поточний прийнятий відповідь в основному тільки посилання на сторонній плагін.
фансигнал

Найкраще відповідь не містить жодних плагінів. @Rationalis ваш коментар вводить в оману, чи можете ви виправити його чи видалити, дякую.
bonobo

Відповіді:


180

Я використовую сценарій NERD Commenter . Це дозволяє вам легко коментувати, коментувати чи перемикати коментарі у своєму коді.

Як згадується в коментарях :

для тих, кого плутає використання, лідер за замовчуванням - "\", тому 10 \ cc коментуватиме десять рядків, а 10 \ cu - відменте ці десять рядків


Цікаво! Я читаю Doc і знаходжу "сексуальний коментар" - просто використовую "\ cs". Для Ruby вона використовуватиме =beginта =endкоментувати кілька рядків замість хеш-тегів.
Хегвін

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

136
Не зупиняйтесь тут. Більшість проголосованих відповідей наведено нижче, не вимагаючи жодних плагінів. stackoverflow.com/a/15588798/2117868 і stackoverflow.com/a/1676690/2117868
kuttumiah

@whirmill Я думаю, що "найкраще" дійсно залежить від випадку використання. Режим візуального блоку швидше, якщо я хочу перемикати коментарі один раз у житті. Але якщо я не проти встановити плагін і хочу зробити якомога менше натискань клавіш, щоб переключити коментарі і не потрібно розмежовувати операції між додаванням або видаленням коментарів - то це тут може бути "найкращою відповіддю".
Carolus

@Carolus Я б погодився з вами, якби питання почалося з "який найкращий спосіб" замість "який швидкий шлях".
кружляння

2540

Для цих завдань я використовую більшу частину вибору блоку часу .

Покладіть курсор на перший #символ, натисніть CtrlV(або CtrlQдля gVim) та спустіться до останнього коментованого рядка та натисніть x, що видалить усі #символи по вертикалі.

Текст блоку тексту майже такий самий:

  1. Спочатку перейдіть до першого рядка, який ви хочете прокоментувати, натисніть CtrlV. Це переведе редактор в VISUAL BLOCKрежим.
  2. Потім за допомогою клавіші зі стрілкою виберіть до останнього рядка
  3. Тепер натисніть ShiftI, щоб перевести редактор в INSERTрежим, а потім натисніть #. Це додасть хеш до першого рядка.
  4. Потім натисніть Esc(дайте йому секунду), і він вставить #символ у всі інші обрані рядки.

Для знятої версії vim, що постачається з debian / ubuntu за замовчуванням, наберіть : s/^/#натомість третій крок (будь-яке залишилося виділення першого символу кожного рядка можна видалити за допомогою :nohl).

Ось два невеликих екранні записи для візуального ознайомлення.

Коментар: Прокоментуйте

Відлучення: Відмінність


87
За замовчуванням це CTRL + V. У версії Windows gvim використовується Ctrl + Q, оскільки Ctrl + V вже використовується для вставки.
Р. Мартіньо Фернандес

8
@amindfv Ctrl + V, n(де n - рядки з цифрами - 1), j, n(де n число - довжина послідовності символів коментаря - 1), l, x.
michael.bartnett

27
Як би ти це зробив за допомогою "//"?
AustinT

74
Ви можете натиснути Esc два рази, щоб не дочекатися цієї секунди;)
Ахмед Гегазі

44
Це не спрацювало для мене. Shift - я перейшов у простий режим вставки.
Геремія

826

Щоб коментувати блоки в vim:

  • натисніть Esc(щоб вийти з редагування чи іншого режиму)
  • хіт ctrl+ v(режим візуального блоку)
  • використовуйте / клавіші зі стрілками , щоб вибрати рядки , які ви хочете (це не буде виділити все - це нормально)
  • Shift+ i(капітал I)
  • вставте потрібний текст, напр %
  • натиснути EscEsc

Щоб коментувати блоки в vim:

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

    Якщо ви хочете вибрати кілька символів, використовуйте один або комбінуйте такі методи:

    • за допомогою клавіш зі стрілками вліво / вправо виберіть більше тексту
    • щоб вибрати шматки тексту, використовуйте клавішу shift+ /
    • ви можете кілька разів натиснути клавіші видалення нижче, як звичайну кнопку видалення

  • натисніть dабо, xщоб видалити символи, повторно, якщо це необхідно

33
@amelia: Ярлик для коментування не працює для мене. Shift + i переводить мене в режим вставки. Це залежить від версії vim?
користувач3527975

7
Чому це займає секунду?
Конор Патрік

24
Єдине питання, з яким я маю цю відповідь, - це те, що вона говорить вам про використання клавіш зі стрілками .
cozyconemotel

6
Натомість натисніть Esc двічі. :)
Аарон Альфонс

21
Спочатку включення коментарів не працювало для мене, але прочитавши, що в черговий раз спрацювало нормально: 1. переконайтеся, що ви використовуєте Ctrl-V, а не V для вибору 2. при вставці він з’явиться, коли ви змінюєте лише один рядок 3. всі вставки трапляються, коли ти
стискаєш

333

Іноді я потрапляю в віддалений ящик, де мої плагіни та .vimrc не можуть мені допомогти, або інколи NerdCommenter помиляється (наприклад, JavaScript, вбудований у HTML).

У цих випадках низькотехнологічною альтернативою є вбудована normкоманда, яка просто виконує будь-які довільні команди vim у кожному рядку у вказаному діапазоні. Наприклад:

Коментуючи # :

1. visually select the text rows (using V as usual)
2. :norm i#

Це вставляє "#" на початку кожного рядка. Зауважте, що при введенні: діапазон буде заповнений, тож він буде справді виглядати:'<,'>norm i#

Відміняє коментар # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

Це видаляє перший символ кожного рядка. Якби я використав 2-char коментар, такий як // тоді я просто зробив :norm xxби видалити обидва символи.

Якщо зауваження відступні, як у запитанні до ОП, ви можете прикріпити видалення таким чином:

:norm ^x

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

Примітка : Оскільки normбуквально виконується звичайна команда vim, ви не обмежуєтесь коментарями, ви також можете зробити складне редагування кожного рядка. Якщо вам потрібен символ втечі як частина вашої послідовності команд, введіть ctrl-v, а потім натисніть клавішу втечі (або ще простіше, просто запишіть швидкий макрос, а потім використовуйте норму для виконання цього макросу в кожному рядку).

Примітка 2 : Ви, звичайно, також можете додати картографування, якщо виявите, що використовуєте normбагато. Наприклад, введення наступного рядка в ~ / .vimrc дозволяє вводити ctrl-nзамість :normтого, щоб робити візуальний вибір

vnoremap <C-n> :norm

Примітка 3 : Vim з голими кістками іноді не містить normкоманду, скомпоновану до нього, тому обов'язково використовуйте розширену версію, тобто зазвичай / usr / bin / vim, не / bin / vi

(Дякуємо @Manbroski та @rakslice за покращення, включені до цієї відповіді)


Я подумав, що це шлях, поки я не прокручую, щоб прочитати цю відповідь stackoverflow.com/a/1676690/850996 Вибір блоку за допомогою CTRL + V (на відміну від вибору рядка з SHIFT + V) дає набагато приємніший контроль над тим, де коментар відбувається вставка символів.
Shyam Habarakada

2
@Shyam Техніка ctrl-v у поєднанні зі спеціальними командами лише для вибору блоку - це те, що рекомендує більшість інших відповідей; однак я особисто вважаю, що описана нами методика «норма» є легшою, оскільки вона не вводить жодного нового синтаксису, крім самої команди norm, тому я можу повторно використовувати те, що вже знаю про vim.
Магнус

2
Про коментар з відступним блоком корисно сказати :norm ^x. Цей метод, як правило, має перевагу в роботі з виділенням регіону (наприклад vi{, виберемо всередині фігурних дужок). Такі селектори текстових об'єктів не працюють Visual Block.
ivan-k

1
Ах, я щойно це зрозумів - на centos 6 /bin/viце vim 7.2, але це інша збірка, ніж /usr/bin/vimі у нього є такі функції, як вимкнено.
rakslice

3
Це, безумовно, найкраща відповідь. Особливо в поєднанні з vipдля вибору цілого абзацу.
meh

121

У мене є таке .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

Тепер ви можете набрати ,ccкоментар до рядка та коментувати ,cuрядок (працює як у звичайному, так і у візуальному режимі).

(Я вкрав його з якогось веб-сайту багато років тому, тому я не можу повністю пояснити, як це працює більше :). Там є коментар, де це пояснено.)


який ярлик я повинен використовувати? Я не можу повністю переконатися в самому коді vim!
gideon

у звичайному або візуальному режимі використовуйте ", cc" (3 послідовності символів), щоб коментувати поточний рядок, та ", cu", щоб коментувати поточний рядок.
День

8
мені це подобається :)! Дякую! На стороні записки мені не важко пояснити. а) вона перезаписує команду (не рекурсивно [див. це] ( stackoverflow.com/questions/3776117/… ), тож тепер, коли ви натискаєте, cc: ... річ виконується. b) тепер це в основному sed (s) / what / towhat / where) команда, що змінює ^ (початок рядка) на правильно встановлений символ коментаря, виходячи з типу файлу, який ви відкрили; г): nohlsearch зупиняє це на виділенні пошуку sed
ramrunner

14
Зауважте, це не правильний спосіб завантаження автокоманд. Вони повинні знаходитися всередині аугрупи, інакше їх додаватимуть до vim декілька разів і спричинять багато сповільнень. Дивіться: learnvimscriptthehardway.stevelosh.com/chapters/14.html . Я додав свою відповідь на це питання.

Приємно. Це фактична відповідь на питання, яке я мав про те, як (не) коментувати, коли у вас є вибір блоку.
Erwin Rooijakkers

119

Укажіть, які рядки коментувати vim:

Розкрийте номери рядків:

:set number

тоді

:5,17s/^/#/     this will comment out line 5-17

або це:

:%s/^/#/        will comment out all lines in file

11
Оскільки ви просто змінюєте першу таблицю кожного рядка, вам не знадобиться "г" в кінці
Магнус

1
Деякі вими на вбудованих коробках (як, наприклад, openwrt) не мають візуального режиму. Тож це чудово
диво

Ви можете пояснити, чому :%s/^/#/gкоментуватимуть усі рядки? Мені було цікаво знаком відсотків%
Бін

18
І щоб прокоментувати ці рядки, ви можете написати: 5,17s / ^ # /
Iraklis Moutidis

Чудово! Це дійсно чудово працює з вибором блоку типу: va{або з varрубіном.
Артур Малецький

58

Ось як я це роблю:

  1. Перейдіть до першого символу в першому рядку, який ви хочете прокоментувати.

  2. Натисніть Ctrl+ qу GVIM або Ctrl+ vу VIM, а потім перейдіть донизу, щоб вибрати перший символ у рядках для коментування.

  3. Потім натисніть cі додайте символ коментаря.

Комментирование працює так само, просто введіть пробіл замість символу коментаря.


44
cтакож видаляє перший символ. Відповідь CMS має право, тобто натискання, Iа потім введення символу (s) коментарів, а потім Esc(це на Windows vim)
Samaursa

6
Це працює, за винятком випадків, коли 'r' потрібно натискати на кроці третьому, а не 'c'.
Девід Баукум

Ви також можете натиснути ESCдвічі після натискання, cі це повинно зробити трюк
nihiser

Усі ці параметри є руйнівними для першого символу на рядку.
Йосія

36

Я придумав просте доповнення до мого .vimrc-файлу, який працює досить добре і може бути легко розширений. Ви просто додаєте новий тип файлу до коментаря_мапи та її лідера коментарів.

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

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

Примітка:

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


1
Я абсолютно новий vim, яку кнопку слід натиснути, щоб переключити відображену функцію? Що це за <leader><Space>декларація внизу?
Єнс Кол

2
Ви можете замінити <leader> на ключ, як <,>. Потім ви натискаєте, SPACE, і це переключить стан коментаря рядка. Лідер, що б не був вашим лідером, за замовчуванням <liader> Vim - \, але ви можете встановити своє, як "нехай mapleader = '," "

Чудова відповідь, одна роздратованість, однак, коментуючи блоки, у яких уже є деякі коментарі, буде розміщено коментарі на не коментовані рядки. QtCreator, наприклад, видаляє коментарі лише у тому випадку, якщо всі не порожні рядки мають провідні коментарі, в іншому додайте головний коментар.
ideaman42

1
Я зробив трохи іншу версію, використовуючи трюк \zsі \zeрегекс, код став трохи меншим. ви можете побачити це тут
SergioAraujo

33

Увімкнення коментарів

Якщо все, що вам потрібно, - це перемикання коментарів, я б краще піти з коментарем.vim від tpope .

введіть тут опис зображення

Установка

Збудник:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim-plug:

Plug 'tpope/vim-commentary'

Вундл:

Plugin 'tpope/vim-commentary'

Подальше налаштування

Додайте це до файлу .vimrc: noremap <leader>/ :Commentary<cr>

Тепер ви можете перемикати коментарі, натискаючи Leader+ /, як і Sublime та Atom.


Дякую! чи буде він підтримувати коментування css всередині html колись у майбутньому?
Дан Дуб

25

Використовуйте Control-V для вибору прямокутників тексту: перейдіть до першого #символу, введіть Ctrl+ V, перемістіться праворуч один раз, а потім вниз, до кінця коментарів. Тепер введіть x: ви видаляєте всі #символи, після яких пробіл.


18

Ось розділ мого .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

У звичайному та візуальному режимі це дозволяє мені натискати, ,icщоб вставити коментарі та ,rcвидалити коментарі.


Це дуже корисно для початківця, як навчитися писати самостійно .vimrc.
охолодження

3
mapохоплює звичайний та візуальний режими, тож вам не потрібні vmapлінії
подвійнеDown

Краще місце в after/ftplugin/ruby.vim.
Сантош Кумар

також використовуйте <leader>icі<leader>rc
Ганс Крістіан

15

Я використовую vim 7.4, і це працює для мене.
Припустимо, що ми коментуємо / коментуємо 3 рядки.

До коментаря:

якщо в рядку немає вкладки / пробілу на початку:
ctrl + Vто jjjтоді, shift + I (cappital i)то //тоді, esc esc
якщо в початку є вкладка / пробіл, ви все одно можете зробити вищезазначене або поміняти на нього c:
ctrl + Vто jjjтоді, cто //тоді esc esc

на коментар:

якщо лінії не мають вкладки / простір на початку:
ctrl + Vто jjjпотім ll (lower cap L)потімc

якщо лінії мають вкладки / простір на початку, то простір над одним і esc
ctrl + Vпотім jjjпотім ll (lower cap L)потім cпотім spaceпотімesc


9

Мені подобається використовувати плагін tcomment: http://www.vim.org/scripts/script.php?script_id=1173

Я зіставив gc та gcc, щоб прокоментувати рядок або виділений блок коду. Він виявляє тип файлу і працює дуже добре.


9

Маючи 30 відповідей попереду, я спробую дати ще простіше рішення: Вставте "a" #на початку рядка. Потім спустіться вниз по лінії і натисніть крапку ( .). Щоб повторити, що не j, ., j, .і т.д. ... розкоментувати, видалити #(ви можете натиснути xнад #), і зробити зворотне з допомогою k, .і т.д. ...


1
Це дуже проста відповідь, яку навіть початківець може зрозуміти та використати. Однак він працює досить повільно у великих кількостях рядків для коментарів. Щоб обійти те, що ви можете I#<Esc>jзаписати в буфер - скажімо, c- і потім зробити 10@c, або будь-яка кількість рядків вам підходить.
Daerdemandt

9

Як коментувати наступні три рядки в vi:

#code code
#code
#code code code

Покладіть курсор на верхній лівий #символ і натисніть CtrlV. Це переводить вас у режим візуального блоку. Натисніть стрілку вниз або Jтри рази, щоб вибрати всі три рядки. Потім натисніть D. Усі коментарі зникають. Щоб скасувати, натисніть U.

Як коментувати наступні три рядки в vi:

code code
code
code code code

Наведіть курсор на верхній лівий символ, натисніть CtrlV. Це переводить вас у режим візуального блоку. Натисніть або Jтри рази, щоб вибрати всі три рядки. Потім натисніть:

I//Esc

Це столиця I, // і Escape.

Після натискання ESCвсі вибрані рядки отримають вказаний вами символ коментаря.


1
якщо ви пропустили хеш "верхній лівий", ви можете натиснути o , щоб перемістити курсор на "іншу сторону" у візуальному режимі.
dylnmc

Я думаю, що це найкраще використовувати. Не потрібно жодних сторонніх осіб, просто використовуйте рідний vim
Арді Нусаван

найкраща відповідь, проста та без жодних сторонніх
азі

8

Так, вже 33 (в основному повторювані) відповіді на це питання.

Ось ще один підхід до того, як коментувати рядки у Vim: мотиви . Основна ідея - коментувати або коментувати рядки, використовуючи той самий метод, що й янку абзацу, набравши yipабо видаливши два рядки, набравши текст dj.

Цей підхід дозволить вам робити такі дії:

  • ccjкоментувати наступні 2 рядки та коментувати cukїх;

  • cci{коментувати блок та коментувати cui{його;

  • ccipпрокоментувати цілий абзац і коментувати cuipйого.

  • ccGпрокоментувати все до останнього рядка та прокоментувати все cuggдо першого рядка.

Все, що вам потрібно, це 2 функції, які працюють над рухами , і 2 відображення для кожної функції. По-перше, відображення:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(Дивіться посібник про g@оператор та operatorfuncзмінну.)

А тепер функції:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

Змініть наведені вище регулярні вирази відповідно до вашого смаку щодо того, де #має бути:


"Повністю нові [...] рухи" здаються трохи вгорі: плагіни t_comment та vim-коментарі, обидва з яких передували цій відповіді, дозволяють коментувати, використовуючи рухи.
Багатий

Хороший матеріал! Отримано. (Я також думаю, що я можу почати використовувати цей підхід замість плагіна, яким я користувався раніше, тому дякую, що написав його!)
Rich

7

Якщо ви вже знаєте номери рядків, то n,ms/# //працювали б.


насправді це, мабуть, повинно бути: n, ms / ^ \ s. # // Тому що у вас може бути пробіл білого простору і ви не можете дотримуватися хешу з одним
Пропустити Хаффман

7

Я позначаю перший і останній рядки (ma і mb), а потім виконую: 'a,' bs / ^ # //


6

Я використовую EnhancedCommentify . Він коментує все, що мені потрібно (мови програмування, скрипти, файли налаштувань). Я використовую це з прив'язками у візуальному режимі. Просто виберіть текст, який хочете коментувати, і натисніть co / cc / cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

5

Я поєднав відповідь Філа та jqno і прокоментував коментарі пробілами:

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

5

Є цей плагін, що змінює життя, за допомогою tpopecallvim-commentary

https://github.com/tpope/vim-commentary

Цей плагін забезпечує :

  • Розсудливість
  • Правильно відступні коментарі
  • Не коментує порожні / непотрібні рядки

Використання :

  • Встановити через Vundle (або Патоген, я думаю).
  • Виділіть текст і натисніть, :що відображатиметься як:<,'>
  • Введіть тут коментар :<,'>Commentaryі натисніть Enter.
  • Бум. Ваш готовий бутон.

vim-commentary(як і всі плагіни tpope) має бонус бути ідіоматичним vim. gc= "перейти до коментаря", gcap= "перейти до коментаря до абзацу" і т. д.
goldenratio

Чи могла це бути лише редакція відповіді Тіма Папи Джима Стюарта?
jdk1.0

5

Ця відповідь є найбільш корисною, якщо ви не можете встановити плагіни, але ви все ще хочете, щоб ваші символи коментарів відповідали існуючим рівням відступу.

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



3

Ви можете використовувати vim-коментар від tpope ( https://github.com/tpope/vim-commentary ). Ви можете використовувати його наступним чином:

Перейдіть у візуальний режим натисканням кнопки

'v'

Потім натисніть

'j' repeatedly or e.g 4j to select 4 row

Тепер все, що вам потрібно зробити з вибором, це клавіші введення:

'gc'

Це дозволить прокоментувати весь вибір, щоб відмінити повторення клавіш:

'gc'

3

Ось базовий однокласник на основі C-vнаступногоI методом , описаним вище.

Ця команда ( :Comment) додає вибраний рядок до початку будь-яких вибраних рядків.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

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

Наприклад, якщо обрано наступний текст:

1
2

і ви запускаєте це:, :Comment //результат буде:

//1
//2

3

Починаючи з ідей у ​​відповідях тут, я запустив власну функцію коментування. Він перемикає або вимикає коментарі. Він може обробляти такі речі, як //print('blue'); //this thing is blueі просто перемикає перший коментар. Крім того, він додає коментарі та єдиний пробіл саме там, де є перший пробіл, а не на самому початку рядка. Додатково він не надмірно копіює пробіли, але використовує зуми ((h \ zs для допомоги), щоб уникнути цієї додаткової роботи, коментуючи та відступ рядка. Сподіваюся, це допомагає деяким мінімалістам там. Пропозиції вітаються.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>

1
Я створив трохи іншу версію вашого рішення, яка також відновлює позицію курсору, я хотів би, щоб ваша думка з цього приводу. on github
SergioAraujo

Класно. Ви можете відредагувати мою публікацію та додати своє рішення (через подібність)!
Майк

Він змінився, щоб уникнути зворотної косої риски c, cpp, java та використання іншого сепаратора для заміни, щоб уникнути E488. Також зміни інтервалу для java, cpp, оскільки коментарі мають три символи, // плюс пробіл, це робиться l: space.
SergioAraujo

3

Я використовую comments.vim від Jasmeet Singh Anand (знайдений на vim.org),

Він працює з C, C ++, Java, PHP [2345], proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel та звичайні файли

Він коментує та скасовує рядки для коментарів у різних вихідних файлах як у звичайному, так і у візуальному режимі

Використання:

  • CtrlCщоб прокоментувати один рядок
  • CtrlXдля ООН-коментарі в один рядок
  • ShiftVі виберіть кілька рядків, а потім CtrlCпрокоментуйте вибрані кілька рядків
  • ShiftVі виберіть кілька рядків, а потім CtrlXскасувати коментар до вибраних кількох рядків

3

Найшвидший і найінтуїтивніший з них метод - це перезапис )для коментування рядків, що йде вниз, а потім( для прогулянкового . Спробуйте, і ви не повернетесь.

У Ruby або Bash з 2-ма пробілами:

map ) I# <Esc>j
map ( k^2x

У C / C ++ або PHP , з 4-ма пробілами:

map ) I//  <Esc>j
map ( k^4x

Недоліки полягають у тому, що ви втрачаєте (і )за переміщення вироку (але dasможете заповнити там), і ви будете час від часу потрапляти назад на вибір-і-замінити абоCtrlV для обробки довгих розділів. Але це досить рідко.

А для стилю С найкраще обробляти довгі коментарі:

set cindent
set formatoptions=tcqr

... Що добре поєднується з використанням V[move]gqдля повторного переносу слів.


2

Цей простий фрагмент з мого .vimrc:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

Це для // - коментарів, але ви можете легко адаптувати його для інших персонажів. Ви можете використовувати autocmd для встановлення лідера, як запропонував jqno.

Це дуже простий та ефективний спосіб природної роботи з діапазонами та візуальним режимом.


2

Мені подобається /* ... */(коментарі C ansi), тож ось це для мене моя хитрість. Ви, звичайно, можете адаптувати його до використання у різних випадках.


Прокоментувати з / * ... * /

Виберіть текст (перейдіть до початку, запустіть візуальний блок, стрибайте з }):

<c-V>}

Введіть команду, яку слід застосувати до вибору

:norm i/* <c-v><esc>$a */

Команда буде мати вигляд: :'<,'>norm i /* ^[$a */

Детальніше див. У (i *).


Відмінити коментар / * ... * /

Виберіть текст (як раніше або іншим способом):

<c-V>}

Введіть команду, яку слід застосувати до вибору

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

Команда буде мати вигляд: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Докладніше див. (Ii *).


Результат

Ефект - це коментарі рядок:

Comment block
Comment block
Comment block

Стає (і навпаки):

/* Comment block */
/* Comment block */
/* Comment block */

Краще зберегти його як деякий mapабо @regу своєму .vimrc, тому що це дуже багато, щоб набрати. Якщо ви віддаєте перевагу одному /*та */цілому блоку, використовуйте:

Прокоментуйте один / * * / весь блок

Збережіть його в регістрі, записавши, скажімо qc, потім на початку абзацу коментар:

v}di/*  */<esc>hhhp

і не забудьте qзнову, щоб закінчити запис.

Докладніше див. (Iii *).


Відлучення одного / * * / від блоку

Зберегти його в реєстрі, скажімо, @u. Помістіть курсор будь-де всередині блоку та:

?/\*<enter>xx/\*/<enter>xx

Збережіть регістр, закінчивши q команду.

Докладніше див. (Iv *).


Результат

Ефект - це єдиний коментар для декількох рядків:

Comment block
Comment block
Comment block

Стає (і навпаки):

/* Comment block
Comment block
Comment block */

Пояснення

(i *) Це працює, використовуючи normяку застосовує одну і ту ж команду кілька разів у кожному вибраному рядку. Команда просто вставити a /*, знаходить кінець цього рядка і закінчується, вставляючи a*/

:norm i/* <c-v><esc>$a */

(ii *) Він також використовує normдля повторення пошуку / заміни в кожному рядку. Шукайте spaces /* spacesі замінюйте нічим. Після цього знаходить кінець рядка, поверніть два слова, праворуч букву, видаліть до кінця.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Вибирає абзац за допомогою v}, видаляє його, вставляє коментар відкритим і закритим, переходить до його середини та вставляє видалений блок.

v}di/*  */<esc>hhhp

(iv *) Де-небудь посередині, знаходить назад a /*, видаляє його; знаходить вперед a */, видаляє його.

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