Хобрук: Ваш путь к мастерству в программировании

Вставьте переменные vim в текст для быстрого доступа к комментариям

У меня есть простая цель: сопоставить Ctrl-C, команду, которую я никогда не использовал для уничтожения vim, для автоматической вставки в начале строки правильного символа (символов), чтобы закомментировать эту строку в соответствии с тип файла файла.

Я подумал, что могу использовать автокоманду, чтобы распознать тип файла и установить для переменной vim правильный символ комментария, когда файл открыт. Итак, я попробовал что-то вроде:

" Control C, which is NEVER used. Now comments out lines!
autocmd BufNewFile,BufRead *.c let CommentChar = "//"
autocmd BufNewFile,BufRead *.py let CommentChar = "#"
map <C-C> mwI:echo &CommentChar<Esc>`wll

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

Выделенная курсивом часть - это та часть, с которой у меня возникли проблемы; он существует только в качестве заполнителя для представления того, что я хочу сделать. Можете ли вы помочь мне понять, как этого добиться? Бонусные баллы, если вы используете strlen(CommentChar) для шага вправо на правильное количество пробелов! Дополнительные бонусные баллы за vim-master, который включает в себя, как делать комментарии в стиле блока, если вы находитесь в визуальном режиме!

Я все еще новичок в написании сценариев vim; мой .vimrc состоит всего лишь из 98 строк, так что не могли бы вы помочь мне, объяснив любые ответы, которые вы даете! Спасибо.


Ответы:


1

Вы можете использовать <C-r> здесь:

noremap <C-c> mwI<C-r>=g:CommentChar<CR><Esc>`wll

см. :h i_CTRL-R.

Также обратите внимание на плагин NERDCommenter, с ним сопоставление будет выглядеть так:

" By default, NERDCommenter uses /* ... */ comments for c code.
" Make it use // instead
let NERD_c_alt_style=1
noremap <C-c> :call NERDComment(0, "norm")<CR>

И вам не придется самостоятельно определять символы комментария.

06.10.2010
  • регистр = потрясающий :) 06.10.2010
  • Спасибо, что объяснили все это. Я читал об i_CTRL-R, но ничего не понял. Благодаря вам мой маленький скрипт заработал (но я изменил wll to w:exe normal .strlen(CommentChar).l‹CR›, чтобы вернуть курсор в нужное место). Также благодаря вам я отказался от своего скрипта и теперь использую NERDCommenter! Но, по крайней мере, я узнал больше о vim в процессе. 06.10.2010

  • 2

    В какой-то момент я вытащил это из вики с советами по vim и использую сам. Единственным недостатком является то, что по какой-то причине он добавляет пробел в конец строки (строк), возможно, что-то маленькое, что я пропустил.

    " Set comment characters for common languages
    autocmd FileType python,sh,bash,zsh,ruby,perl,muttrc let StartComment="#" | let EndComment=""
    autocmd FileType html let StartComment="<!--" | let EndComment="-->"
    autocmd FileType php,cpp,javascript let StartComment="//" | let EndComment=""
    autocmd FileType c,css let StartComment="/*" | let EndComment="*/"
    autocmd FileType vim let StartComment="\"" | let EndComment=""
    autocmd FileType ini let StartComment=";" | let EndComment=""
    
    " Toggle comments on a visual block
    function! CommentLines()
        try
            execute ":s@^".g:StartComment." @\@g"
            execute ":s@ ".g:EndComment."$@@g"
        catch
            execute ":s@^@".g:StartComment." @g"
            execute ":s@$@ ".g:EndComment."@g"
        endtry
    endfunction
    
    " Comment conveniently
    vmap <Leader>c :call CommentLines()<CR>
    
    06.10.2010
  • Спасибо за настрой StartComment и EndComment. Это будет полезно и для других задач. 06.10.2010
  • Хотел бы я проголосовать за это дважды! Кстати, пробелы в конце связаны с жестко закодированными пробелами в строке выполнения до и после символа @. Просто удалите их и, если хотите, добавьте компенсирующие пробелы к фактическим переменным StartComment и EndComment. 18.02.2013
  • Одно небольшое улучшение, которое я нашел полезным: используйте b:StartComment и b:EndComment (как для инициализации, так и для использования). Это позволяет вам иметь разные значения в разных буферах. Это важно, если у вас открыто несколько типов файлов, в которых используются разные символы комментариев. 23.02.2013
  • Новые материалы

    Краткое руководство для начинающих по простому сквозному тестированию с помощью Cypress
    Автоматизированное тестирование, требующее только базовых навыков JavaScript. Цель этой статьи - показать, как с минимальными усилиями вы можете добавить полезные сквозные (E2E) тесты в свой..

    Руководство по быстрой разработке рекомендательной системы промышленного уровня
    В этой статье я намерен предоставить краткий обзор методов, которые можно использовать для разработки хорошо работающей рекомендательной системы. Я начал работать над Recommender Systems около 6..

    Arshaw FullCalendar для AngularJS — проблемы, с которыми столкнулись, и найденные решения для их устранения
    Arshaw FullCalendar — это полноразмерный календарь событий с возможностью перетаскивания, использующий jQuery. Подробнее об этом можно узнать здесь . Директива ui-calendar — это полная..

    Простое руководство по Redux для разработчиков React
    Понимание строительных блоков Redux Redux — это инструмент управления состоянием, который чаще всего используется с React или React Native. Когда я впервые начал использовать его год назад,..

    присоединение к атрисмаркетингу
    присоединение к атрисмаркетингу И много дополнительных привилегий. маркетинг — реклама-хорошие отзывы клиентов-доверие-счастье-лояльность и опытные сотрудники устойчивые лесозаготовительные..

    КОВАРИАНТНОСТЬ И КОРРЕЛЯЦИЯ
    ВВЕДЕНИЕ В этом посте мы обсудим ковариацию и корреляцию. Это играет важную роль при выборе функций. Статистические корреляции говорят нам как о силе связи между двумя переменными, так..

    Использование матриц Вигнера в случаях машинного обучения, часть 8
    Равномерный локальный закон для матриц Вигнера (arXiv) Автор: Джорджо Чиполлони , Ласло Эрдеш , Доминик Шредер . Аннотация: Мы доказываем общий локальный закон для матриц Вигнера, который..