Редактор Vim очень умен?

Я программирую на C++ или Java. Поэтому я хочу использовать редактор Vim, потому что он очень гибкий. Я слышал, что могу настроить редактор Vim так, чтобы он

  1. от объекта к определению
  2. от функции к определению
  3. от имени класса к определению

Есть ли у нас профессиональные специалисты по Vim, которые могли бы точно сказать мне, как настроить Vim для этого? Заранее спасибо.

P.S. На случай, если читатели посчитают, что этот вопрос не связан с программированием, я бы сказал, что это повышение скорости программирования. Так что это помощь программисту. Поэтому, пожалуйста, не закрывайте этот вопрос.

РЕДАКТИРОВАТЬ: Также я хотел бы знать, как vim работает с завершением кода, и может ли vim подсказать список методов, доступных для определенного объекта? Если да, то я хотел бы знать, как настроить и эти параметры?


person Narek    schedule 19.09.2009    source источник


Ответы (8)


То, что вы ищете, это файлы ctags и tags/TAGS. Ctags (я рекомендую Exuberant Ctags) — это программа, которая сканирует исходные файлы на наличие идентификаторов и создает файл, индексирующий их. Затем вы можете использовать ^], чтобы перейти к определению тега под курсором.

Могут потребоваться некоторые дополнительные сведения, чтобы сообщить vim, как найти файл тегов; Я не уверен, навскидку, что они из себя представляют. Но это общая идея — запустите ctags над вашим исходным кодом, а затем используйте ^].

В качестве альтернативы вы можете взглянуть на GNU Global. Это немного более сложно. Но ctags выполнит то, что вы описали.

person Michael Ekstrand    schedule 19.09.2009
comment
Чтобы сообщить vim, где находится файл тегов, используйте опцию tags. Введите :help 'tags' в vim для подробностей. - person Laurence Gonsalves; 19.09.2009

Vim, без тени сомнения, лучший редактор в мире (принесите мне emacs, ребята). Помимо флеймовых войн, то, что я нашел невероятно полезным как для программирования на C ++, так и для Java, — это eclipse (лучшая IDE в мире, да, теперь я тыкаю в Netbeans) с плагином vrapper. Вы получаете все преимущества полностью интегрированной среды разработки и возможности сочетаний клавиш vim.

Vrapper не дает вам полной эмуляции vim, но вы можете перемещаться по своему коду, используя ярлыки vim, и вы не теряете никаких преимуществ eclipse.

person John Oxley    schedule 19.09.2009
comment
На самом деле это для разных значений мира, но я понимаю вашу точку зрения! - person John Oxley; 17.04.2010

Использование ctags определенно является отправной точкой, но не забывайте cscope. В обоих случаях сначала cscope и ctags сканируют ваши исходные файлы и создают их базы данных, прежде чем запускать vim. Вам также необходимо время от времени обновлять базы данных по мере роста и изменения кода.

С ctags просто используйте команду «ctags» в вашем каталоге кода. Если у вас есть иерархия каталогов, начните сверху и используйте «ctags -R», чтобы просмотреть все каталоги ниже. Запустите vim в том же каталоге, что и результирующий файл тегов, и vim должен найти и загрузить его автоматически. Находясь в редакторе с курсором на имени функции или переменной, вы можете ввести '^]', и vim должен перейти к определению.

Точно так же с cscope используйте «cscope -b» или «cscope -b -R», чтобы получить более подробную информацию о теге. Vim и cscope работают вместе, чтобы предоставить вам гораздо больше информации, например, где используется идентификатор и откуда вызывается функция. Существует набор макросов, которые можно использовать для доступа к информации. Вы можете найти макросы и их значения в справочной информации vim cscope.

person Shannon Nelson    schedule 21.09.2009

В прошлый раз, когда я проверял, давным-давно, ctags был в порядке, но он пропускал некоторые идентификаторы, а cscope имел более полный вариант поиска, но все же пропускал некоторые идентификаторы.

grep это то, что я предпочитаю. Это исчерпывающий, но все же довольно быстрый, если база исходного кода имеет разумный размер или ПК быстр. Вы можете вызвать его из vim с помощью :grep. Вот упрощенная версия моего собственного _vimrc, чтобы показать, как я его настроил. Я добавляю комментарии, чтобы объяснить, какие клавиши что делают.

" for Windows, replace with the location of `grep.exe'
" not needed for Unix/Linux
:set grepprg=c:\prog\cygwin\bin\grep.exe\ -n\ $*\ /dev/null


:function! RecursiveSearchIdentifierUnderCursor()
:   sp
:   let grep_cmd = "silent grep -r \"\\<" . expand("<cword>") . "\\>\" *"
:   exe grep_cmd
:endfunction


" CTRL-backslash to search for the identifier (or "word") under the cursor
"
" an identifier is in the form "xxx_123_yyy" but something in the form
" "xxx_123_yyy.aaa_999" would be two identifiers separated by a period
"
"
" this basically executes:
"
"       :grep -r "\<identifier\>" *
"
" for whatever `identifier' the cursor happens to be over
"
"
" to close the newly opened window, use:
"
"       :q
"
:map <C-\> :call RecursiveSearchIdentifierUnderCursor()<CR>


" cursor up/down to move to the previous/next search result
:map <Up> :cp<CR>zz
:map <Down> :cn<CR>zz


" jump up/down between horizontally split windows
:map <PageUp> <C-W>k
:map <PageDown> <C-W>j


" move to the previous/next enclosing brace
:map <Left> [{
:map <Right> ]}


" move to the previous/next enclosing parenthesis
:map <Home> [(
:map <End> ])


" move to the previous/next enclosing # preprocessor directive
:map <Insert> [#
:map <Del> ]#

Кроме того, не забудьте * (SHIFT-8) и # (SHIFT-3) для поиска вперед и назад текущего идентификатора под курсором в текущем файле. Я обнаружил, что они бесценны при перемещении по коду, особенно при поиске коротких имен переменных, таких как «i» и «j», которые в противном случае совпадали бы с частями других имен переменных при слепом поиске в обычном текстовом редакторе.

Вы также можете вызвать :make из vim, если хотите использовать make. Он остановится при первой ошибке компиляции, затем вы сможете отредактировать и снова запустить сборку изнутри vim.

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

person Matthew    schedule 16.04.2010

Завершение кода в vim доступно в виде vim-скриптов: http://www.vim.org/scripts/index.php

person Kartik Mistry    schedule 19.09.2009
comment
В версии 7.0 и выше вы можете автоматически заполнять имена и строки кода в режиме вставки, используя комбинации клавиш, такие как ctrl-P, ctrl-N и ctrl-X-ctrl-L. В онлайн-справке есть все подробности. - person Steve K; 19.09.2009

ctags в целом является ответом, как сказал Майкл Э. ctags *.c *.h — это простой запуск проекта, в котором все файлы находятся в одном каталоге. Затем, как сказал Майкл, вы можете использовать ^], чтобы перейти к определению, и ^T, чтобы вернуться туда, откуда вы пришли. Это те же клавиши, которые вы используете для перемещения внутри справки Vim.

В Java и C++ у вас может быть более одного метода с одним и тем же именем. :tn перейдет к следующему, а :ts перечислит альтернативы.

Для завершения кода в Vim я обычно использую ^P и ^N. Он не зависит от контекста, как эквивалент в Eclipse или MSVC, но обычно выполняет свою работу.

Другими инструментами, которые вы могли бы использовать, являются cscope и (конечно) Emacs или Eclipse.

person Community    schedule 19.09.2009

Как уже говорили другие, вам нужно создать индексный файл для vi(m).

Я просто хочу сказать, что использование vim для программирования Java вместо современной IDE похоже на использование vim плюс калькулятор вместо электронной таблицы для чисел. Оба подходят для небольших задач, но при увеличении масштаба вы достигаете точки, когда электронная таблица просто оставляет текстовый редактор позади.

Если вы зарабатываете на жизнь программированием на Java, сделайте себе и своему работодателю одолжение и научитесь пользоваться мощным инструментом.

person Thorbjørn Ravn Andersen    schedule 19.09.2009
comment
vim 7.2 поддерживает числа с плавающей запятой, поэтому калькулятор не нужен :) - person intuited; 16.04.2010
comment
Интригующий. Я просто не могу догадаться, для чего редактору нужны числа с плавающей запятой, так что, возможно, это просто еще один шаг к созданию специальной, неформально определенной, наполненной ошибками, медленной реализации половины Common Lisp? - person Thorbjørn Ravn Andersen; 16.04.2010

Да, инструмент, предоставляющий этот индекс символов, называется ctags, и его могут использовать многие редакторы Unix. vim хорош в командной строке, но я бы посоветовал потратить немного времени на то, чтобы привыкнуть к KATE. Это очень хороший, современный редактор с графическим интерфейсом, с просмотром файлов в стиле IDE, хорошей подсветкой синтаксиса, лучшим динамическим переносом слов, который я когда-либо использовал, и т. д. Однако для java стоит обратить внимание на eclipse и netbeans.

person Lee B    schedule 19.09.2009