Какой быстрый способ комментировать/раскомментировать строки в Vim?

У меня есть файл кода Ruby, открытый в 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 (-#).

Ответ 1

Я использую скрипт NERD Commenter. Это позволяет легко комментировать, раскомментировать или переключать комментарии в своем коде.

Как уже упоминалось в комментариях:

для любого, кто смущен использованием, лидер по умолчанию - "\", поэтому 10\cc прокомментирует десять строк, а 10\cu раскомментирует эти десять строк

Ответ 2

Для этих задач я чаще всего использую выбор блока.

Наведите курсор на первый символ #, нажмите Ctrl V (или Ctrl Q для gVim) и спуститесь до последней прокомментированной строки и нажмите x, что приведет к удалению всех # символы по вертикали.

Для комментирования текстовый блок почти такой же:

  1. Сначала перейдите к первой строке, которую вы хотите прокомментировать, нажмите Ctrl V. Это переведет редактор в режим VISUAL BLOCK.
  2. Затем с помощью клавиши со стрелкой и выберите до последней строки
  3. Теперь нажмите Shift I, чтобы перевести редактор в режим INSERT, а затем нажмите #. Это добавит хеш к первой строке.
  4. Затем нажмите Esc (дайте ему секунду), и он вставит символ # во все остальные выбранные строки.

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

Вот две небольшие записи экрана для наглядности.

Комментарий: Comment

Раскоментируйте: Uncomment

Ответ 3

Чтобы закомментировать блоки в vim:

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

Чтобы раскомментировать блоки в vim:

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

    Если вы хотите выбрать несколько символов, используйте один или объедините эти методы:

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

  • нажмите d или x, чтобы удалить символы, при необходимости несколько раз

Ответ 4

Иногда я лежу в удаленной коробке, где мои плагины и .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

Это удаляет первый символ каждой строки. Если бы я использовал комментарий из двух символов, такой как //, я бы просто сделал :norm xx, чтобы удалить оба символа.

Если комментарии имеют отступ, как в вопросе OP, вы можете закрепить удаление следующим образом:

:norm ^x

что означает "перейти к первому непробельному символу, а затем удалить один символ". Обратите внимание, что в отличие от выбора блока, этот метод работает, даже если комментарии имеют неравные отступы!

Примечание. Так как norm буквально просто выполняет обычные команды vim, вы не ограничены комментариями, вы также можете выполнить некоторое сложное редактирование каждой строки. Если вам нужен escape-символ как часть вашей последовательности команд, введите ctrl-v, затем нажмите клавишу escape (или даже проще, просто запишите быстрый макрос и затем используйте norm для выполнения этого макроса в каждой строке).

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

vnoremap <C-n> :norm

Примечание 3: Иногда в bim-bones vim не скомпилирована команда norm, поэтому обязательно используйте расширенную версию, т.е. обычно /usr/bin/vim, а не /bin/vi

(Спасибо @Manbroski и @rakslice за улучшения, включенные в этот ответ)

Ответ 5

У меня есть следующее в .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, чтобы раскомментировать строку (работает как в обычном, так и в визуальном режиме).

(Я украл его с какого-то веб-сайта много лет назад, поэтому я не могу полностью объяснить, как он работает больше:). Существует comment, где это объясняется.)

Ответ 6

Укажите, какие строки комментировать в vim:

Вывести номера строк:

:set number

то

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

или это:

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

Ответ 7

Вот как я это делаю:

  • Перейдите к первому символу в первой строке, которую вы хотите прокомментировать.

  • Нажмите Ctrl + q в GVIM или Ctrl + v в VIM, затем спуститесь, чтобы выбрать первый символ в строках для комментариев.

  • Затем нажмите c и добавьте комментарий.

Uncommenting работает одинаково, просто введите пробел вместо символа комментария.

Ответ 8

Я придумал простое дополнение к моему .vimrc файлу, который работает очень хорошо и может быть легко расширен. Вы просто добавляете новый тип файла в комментарий_map и его комментарий.

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

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, но это только мои предпочтения. Я также старался держать его простым и исполнительным. Если вы используете автокоманды, вам нужно обязательно поместить их в группу autocommand, иначе обратные вызовы будут добавлены в тип файла несколько раз за загруженный файл и вызовет много ухудшения производительности.

Ответ 9

Переключить комментарии

Если вам нужно только toggle comments, я предпочитаю commentary.vim tpope.

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

Установка

Возбудитель:

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

ВИМ-штепсельная вилка:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Дополнительная настройка

Добавьте это в свой .vimrc файл: noremap <leader>/ :Commentary<cr>

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

Ответ 10

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

Ответ 11

Вот раздел моего .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, чтобы удалить комментарии.

Ответ 12

Первое нажатие → clt + v

Нажмите стрелку вверх или вниз по мере необходимости

Затем нажмите → shift + i

Затем вставьте комментарий, используя → shift + #

Esc

Ответ 13

Я использую 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

Ответ 14

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

Я сопоставил gc и gcc, чтобы прокомментировать строку или выделенный блок кода. Он определяет тип файла и работает очень хорошо.

Ответ 15

Как раскомментировать следующие три строки в vi:

#code code
#code
#code code code

Поместите курсор на верхний левый символ # и нажмите Ctrl V. Это переводит вас в режим визуального блока. Нажмите стрелку вниз или J три раза, чтобы выбрать все три строки. Затем нажмите D. Все комментарии исчезают. Чтобы отменить, нажмите U.

Как прокомментировать следующие три строки в vi:

code code
code
code code code

Поместите курсор на верхний левый символ, нажмите Ctrl V. Это переводит вас в режим визуального блока. Нажмите или J три раза, чтобы выбрать все три строки. Затем нажмите:

I / / Esc

Это столица, которую я,//и бежать.

Когда вы нажимаете ESC, все выделенные строки получат обозначенный вами комментарий.

Ответ 16

CLT + V

с помощью клавиши со стрелкой

ФМСП + I

SHIFT + #

Esc

затем ждите  и сделано

Ответ 17

С 30 ответами впереди меня я попытаюсь дать еще более простое решение: Вставьте # в начале строки. Затем опустите линию и нажмите точку (.). Чтобы повторить, сделайте j, ., j, . и т.д. Чтобы раскомментировать, удалите # (вы можете нажать x по #) и сделать обратное используя k, . и т.д.

Ответ 18

Если вы уже знаете номера строк, то n,ms/# // будет работать.

Ответ 19

Да, есть уже 33 (в основном повторяющиеся) ответы на этот вопрос.

Вот еще один подход к тому, как комментировать строки в Vim: движения. Основная идея состоит в том, чтобы прокомментировать или раскомментировать строки, используя тот же метод, что и захват абзаца, набрав yip или удалив 2 строки, набрав dj.

Этот подход позволит вам делать такие вещи, как:

  • ccj, чтобы прокомментировать следующие 2 строки и cuk раскомментировать их;

  • cci{, чтобы прокомментировать блок, и cui{, чтобы раскомментировать его;

  • ccip, чтобы прокомментировать весь абзац, и cuip, чтобы раскомментировать его.

  • ccG, чтобы прокомментировать все до последней строки и cugg раскомментировать все до первой строки.

Все, что вам нужно, это 2 функции, которые работают с движениями, и 2 отображения для каждой функции. Во-первых, отображения:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>[email protected]
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>[email protected]
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(см. руководство по оператору [email protected] и переменной 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

Измените правильные выражения выше, чтобы удовлетворить ваш вкус относительно того, где # должно быть:

Ответ 20

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

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

Ответ 21

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

Ответ 22

Я использую плагин Tim Pope vim-commentary.

Ответ 23

Я объединил фил и 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>

Ответ 24

tpope есть этот плагин, который меняет жизнь и называется vim-commentary.

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

Этот плагин предоставляет:

  • здравомыслие
  • Комментарии с правильными отступами
  • Не комментирует пустые/ненужные строки

Использование:

  • Установите через Vundle (или, я думаю, Pathogen).
  • Выделите текст и нажмите :, который будет отображаться как :<,'>
  • Напечатайте Комментарий здесь :<,'>Commentary и нажмите Enter.
  • Boom. Твой готовый бутон.

Ответ 25

Этот ответ здесь: 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 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 означает сопоставление следующей команды в визуальном режиме, но не отображать ее рекурсивно (то есть не изменяйте никакие другие команды, которые могут использоваться другими способами). По сути, если вы новичок в Vim, всегда используйте noremap, чтобы убедиться, что вы ничего не сломаете. <silent> означает "Я не хочу ваших слов, только ваши действия" и говорит, что ничего не печатать в командной строке. <C-r> - это то, что мы отображаем, в данном случае это ctrl + r (обратите внимание, что вы все равно можете использовать C-r в обычном режиме для "повтора" в этом режиме). C-u немного сбивает с толку, но в основном он гарантирует, что вы не потеряете свою визуальную подсветку (в соответствии с этим ответом ваша команда начинается с '<,'>, чего мы и хотим). call здесь просто говорит vim выполнить функцию, которую мы назвали, а <cr> ссылается на нажатие кнопки enter. Мы должны нажать ее один раз, чтобы фактически вызвать функцию (в противном случае мы просто набрали call function() в командной строке, и нам нужно нажать ее снова, чтобы наши заменители прошли весь путь (не совсем понятно, почему, но что угодно).

В любом случае, надеюсь, это поможет. Для этого потребуется все, что выделено с помощью v, V или C-v, проверить, прокомментирована ли первая строка, если да, попытаться раскомментировать все выделенные строки, а если нет, добавить дополнительный слой символов комментария к каждому линия. Это мое желаемое поведение; Я не просто хотел, чтобы он переключался независимо от того, была ли прокомментирована каждая строка в блоке, поэтому он отлично работает после того, как задает несколько вопросов по теме.

Ответ 26

Я использую 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 и обычные файлы

Он комментирует и не комментирует строки в разных исходных файлах как в обычном, так и в визуальном режиме

Использование:

  • Ctrl C чтобы прокомментировать одну строку
  • Ctrl X чтобы удалить комментарий в одну строку
  • Shift V и выберите несколько строк, затем Ctrl C, чтобы прокомментировать выбранные несколько строк
  • Shift V и выберите несколько строк, затем Ctrl X, чтобы откомментировать выбранные несколько строк

Ответ 27

Начав с идей в ответах здесь, я запустил собственную функцию комментирования. Он включает и выключает комментарии. Он может обрабатывать такие вещи, как //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>

Ответ 28

Самый быстрый и интуитивно понятный из всех этих методов - переназначить ) для комментирования строк при переходе вниз, а затем ( для комментирования при переходе вверх. Попробуйте, и вы не вернетесь.

В Ruby или Bash с двумя пробелами:

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

В C/C++ или PHP с 4 пробелами:

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

Недостатками являются то, что вы теряете ( и ) из-за перемещения предложения (но das может заполнить его), и вы время от времени прибегаете к выбору и замене или Ctrl V для обработки длинных участков. Но это довольно редко.

А для стиля C длинные комментарии лучше всего обрабатывать с помощью:

set cindent
set formatoptions=tcqr

... Что хорошо сочетается с использованием V[move]gq для повторения переноса слов.

Ответ 29

Здесь основной однострочник, основанный на C-v, за которым следует метод I, описанный выше.

Эта команда (:Comment) добавляет выбранную строку в начало любых выбранных строк.

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

Добавьте эту строку в .vimrc, чтобы создать команду, которая принимает один аргумент и размещает аргумент в начале каждой строки в текущем выделении.

Например. если выбран следующий текст:

1
2

и вы запустите это: :Comment //, результат будет:

//1
//2

Ответ 30

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

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

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

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

Это очень простой и эффективный способ работы с диапазонами и визуальным режимом.