Comments 73
Спасибо за статью! Давно пользуюсь Vim'ом. Но как IDE — NetBeans больше подходит.
Радует что свободный Vim обходит даже платные редакторы.
Радует что свободный Vim обходит даже платные редакторы.
что не говори, но VS эта вещь не заменит.
Есть мнение, что нужно не из vim делать IDE, а наоборот, к IDE прикручивать режим редактирования в стиле vim. Так целесообразнее. И, в общем, практически во всех IDE такой режим (хотя бы частично) есть, либо прямо из коробки, либо в виде плагина.
Ну так vim к тому же еще и шустрый, а IDE чаще всего такие прожорливые и не поворотливые.
Это неправильное мнение :)
Я не буду устраивать холивар об удобстве, но назовите хоть одну IDE, которая умеет работать с таким количеством форматов, как vim? Например, в каком другом редакторе вы нативно из коробки откроете файл типа changelog.gz без распаковки, отредактируете, и сохраните обратно? Какая IDE позволит вам одинаково удобно работать с html, ocaml, c++, tcl, <еще пара десятков языков>? Единственное, что приближается по функционалу — это эклипс, но сколько ресурсов он хавает, и как тормозит, если мне вдруг захочется переключиться с php на c++…
Я не буду устраивать холивар об удобстве, но назовите хоть одну IDE, которая умеет работать с таким количеством форматов, как vim? Например, в каком другом редакторе вы нативно из коробки откроете файл типа changelog.gz без распаковки, отредактируете, и сохраните обратно? Какая IDE позволит вам одинаково удобно работать с html, ocaml, c++, tcl, <еще пара десятков языков>? Единственное, что приближается по функционалу — это эклипс, но сколько ресурсов он хавает, и как тормозит, если мне вдруг захочется переключиться с php на c++…
Лучший эмулятор редактора vim — viper-mode и vimpulse для emacs, но даже он имеет недостатки и не имеет некоторых полезных функций.
В Qt-creator есть «vim-mode», но что-то пользоваться показалось не удобно. Сам текст вводить может и удобно, но панелей куча, а без мыши не нажать. Или все хоткеи Ctrl+ запоминать.
«Теперь вы сможете переместить курсор на название какой-либо функции, переменной и т.д., и, нажав g] или Ctrl-] (есть небольшие отличия), переместиться на объявление этой функции. Ctrl-t вернет вас обратно.»
Для этого не понядобится ваш плагин, это вполне себе приходит вместе с ctags.
Касательно проекта сильно распределенного — решается ":set tags=....." под конкретный проект.
Создание tag для всего проекта также дело 1 скрипта — описано к примеру тут — ctags.sourceforge.net/faq.html
project не пользовал, спасибо, возможно гляну, пока обходился ctags+csope+некоторые удобные мелочи с vimtips
Для этого не понядобится ваш плагин, это вполне себе приходит вместе с ctags.
Касательно проекта сильно распределенного — решается ":set tags=....." под конкретный проект.
Создание tag для всего проекта также дело 1 скрипта — описано к примеру тут — ctags.sourceforge.net/faq.html
project не пользовал, спасибо, возможно гляну, пока обходился ctags+csope+некоторые удобные мелочи с vimtips
«Для этого не понядобится ваш плагин»
ну, разумеется, не понадобится. Упомянули бы тогда еще и то, что мой плагин не понадобится для использования omnicppcomplete и code_complete — они ведь также работают с ctags.
Я просто сразу рассказал об одной из ключевых возможностей, появляющейся при использовании тегов. Рассказал для людей, которые вообще не имели дела с ctags. Или это неправильно?
ну, разумеется, не понадобится. Упомянули бы тогда еще и то, что мой плагин не понадобится для использования omnicppcomplete и code_complete — они ведь также работают с ctags.
Я просто сразу рассказал об одной из ключевых возможностей, появляющейся при использовании тегов. Рассказал для людей, которые вообще не имели дела с ctags. Или это неправильно?
UFO just landed and posted this here
Спасибо за code_complete (new update), посмотрю.
А вообще, code_complete это для меня временный вариант, т.к. мне больше нравится не подстановка параметров, а следующий вариант: вот я пишу «имя_функции(», и как только открываю скобку, появляется popup-окошко с перечислением аргументов функции, а текущий аргумент как-то выделен и снизу отображается комментарий для него (то есть надо будет сделать, например, парсинг комментариев по стандарту javadoc). Когда я указал один аргумент и поставил запятую, выделяется следующий аргумент и отображается комментарий для него. Ну, и т.д.
Ну и перегрузки метода можно менять стрелками вверх/вниз.
Такого плагина я тоже не нашел, так что в скором времени займусь.
А вообще, code_complete это для меня временный вариант, т.к. мне больше нравится не подстановка параметров, а следующий вариант: вот я пишу «имя_функции(», и как только открываю скобку, появляется popup-окошко с перечислением аргументов функции, а текущий аргумент как-то выделен и снизу отображается комментарий для него (то есть надо будет сделать, например, парсинг комментариев по стандарту javadoc). Когда я указал один аргумент и поставил запятую, выделяется следующий аргумент и отображается комментарий для него. Ну, и т.д.
Ну и перегрузки метода можно менять стрелками вверх/вниз.
Такого плагина я тоже не нашел, так что в скором времени займусь.
Речь пойдет о настройке Vim для использования в качестве IDE.
Ну ведь не об этом, на самом-то деле, а лишь об автоматической индексации файлов. Эта фраза вводит в заблуждение и даёт дубинку в руки тролям
Хм, возможно, Вы и правы, но…
вот список возможностей, появляющихся после установки плагинов, так или иначе описанных в статье:
* управление проектами и файлами, входящими в состав проектов (project)
* автоматическая индексация всех файлов проекта (indexer)
* отображение элементов структур, классов, проч. (omnicppcomplete)
* автодополнение аргументов функций (code_complete)
Чего не хватает для использования в качестве среды разработки?
вот список возможностей, появляющихся после установки плагинов, так или иначе описанных в статье:
* управление проектами и файлами, входящими в состав проектов (project)
* автоматическая индексация всех файлов проекта (indexer)
* отображение элементов структур, классов, проч. (omnicppcomplete)
* автодополнение аргументов функций (code_complete)
Чего не хватает для использования в качестве среды разработки?
рефакторинга в первую очередь (по-моему, иде нужны исключительно за этим), кодогенерации, дебаггера…
Ясно. Да, вы правы, рефакторинга пока нет.
Честно говоря, я писал с оглядкой на подобные статьи на самом Хабре. Взять хотя бы эту: vim, и как сделать из него полноценную IDE. Хотя в статье нет ничего из перечисленного вами, нет управления проектами, нет индексации файлов. Так что я решил, что моя реализация «IDE» даже более «IDEшная», чем в других просмотренных мною статьях, и не постеснялся употребить этот термин.
Если вы настаиваете, уберу :)
Честно говоря, я писал с оглядкой на подобные статьи на самом Хабре. Взять хотя бы эту: vim, и как сделать из него полноценную IDE. Хотя в статье нет ничего из перечисленного вами, нет управления проектами, нет индексации файлов. Так что я решил, что моя реализация «IDE» даже более «IDEшная», чем в других просмотренных мною статьях, и не постеснялся употребить этот термин.
Если вы настаиваете, уберу :)
Спасибо, я давно ждал подобного плагина.
Маленький feature request: я не пользуюсь project, а поиск папки .vim у меня будет неизменно находить оную папку, лежащую в $HOME (собственно, папку с конфигами). Можно сделать какой-нибудь режим работы плагина, когда без создания файлов типа .vimprojects или .indexer_files корнем проекта до выхода из вима будет считаться текущий каталог (cwd), а индексироваться будут просто все .h/.c/.cpp файлы в этом каталоге?
То есть, мне бы хотелось из ~/workspace/myproject/ выполнить vim src/file.cpp и получать автоматическую индексацию рекурсивно всего myproject. На мой взгляд, это было бы очень удобно и избавило от необходимости создавать дополнительные файлы для каждого проекта.
Маленький feature request: я не пользуюсь project, а поиск папки .vim у меня будет неизменно находить оную папку, лежащую в $HOME (собственно, папку с конфигами). Можно сделать какой-нибудь режим работы плагина, когда без создания файлов типа .vimprojects или .indexer_files корнем проекта до выхода из вима будет считаться текущий каталог (cwd), а индексироваться будут просто все .h/.c/.cpp файлы в этом каталоге?
То есть, мне бы хотелось из ~/workspace/myproject/ выполнить vim src/file.cpp и получать автоматическую индексацию рекурсивно всего myproject. На мой взгляд, это было бы очень удобно и избавило от необходимости создавать дополнительные файлы для каждого проекта.
Добавить-то несложно, но уточню: а если вам нужно отредактировать какой-нибудь отдельный файл, например, где-нибудь в /etc? Vim должен будет искать файлы-исходники в /etc и всех подпапках?
Или, допустим, на подключенной удаленной директории с помощью sshfs? — тогда пользователь устанет ждать, пока будет проходить индексация удаленной ФС.
Или нужно сделать какую-нибудь команду, которую надо будет вводить каждый раз при открытии Vim для работы над проектом? (ну или клавишу замапить, и нажимать эту клавишу)
По-моему все-таки лучше отключить поиск папки ".vim", добавив следующую строку в _vimrc:
и создать файл ~/.indexer_files следующего содержания:
Или, допустим, на подключенной удаленной директории с помощью sshfs? — тогда пользователь устанет ждать, пока будет проходить индексация удаленной ФС.
Или нужно сделать какую-нибудь команду, которую надо будет вводить каждый раз при открытии Vim для работы над проектом? (ну или клавишу замапить, и нажимать эту клавишу)
По-моему все-таки лучше отключить поиск папки ".vim", добавив следующую строку в _vimrc:
let g:indexer_lookForProjectDir = 0
и создать файл ~/.indexer_files следующего содержания:
[myProject]
~/workspace/myproject**/*
Хм, резонно.
С другой стороны, насколько я понимаю, предложенный indexer_files будет считать все проекты одним большим проектом. И каждый раз их переиндексировать. Не уверен насчёт производительности этого решения, но глюки еще могут возникнуть от перекрытия имён классов или функций из разных проектов.
Может, тогда лучше иметь возможность в indexer_files добавлять что-нибудь типа:
И каждый каталог в projects_dir считать проектом?
С другой стороны, насколько я понимаю, предложенный indexer_files будет считать все проекты одним большим проектом. И каждый раз их переиндексировать. Не уверен насчёт производительности этого решения, но глюки еще могут возникнуть от перекрытия имён классов или функций из разных проектов.
Может, тогда лучше иметь возможность в indexer_files добавлять что-нибудь типа:
[global]
projects_dir=~/workspace/
И каждый каталог в projects_dir считать проектом?
предложенный indexer_files будет считать одним проектом только директорию ~/workspace/myproject со всеми поддиректориями рекурсивно.
Допустим, у вас есть еще один проект, и лежит он в папке "~/workspace/my_second_project". Тогда нужно отредактировать файл ~/.indexer_files следующим образом:
теперь, когда вы откроете в Vim любой файл из директории ~/workspace/myproject (или любой поддиректории), то будут проиндексированы все файлы, находящиеся в ~/workspace/myproject и всех поддиректориях. А те файлы, которые лежат в ~/workspace/my_second_project, проиндексированы не будут, т.к. это другой проект.
т.е. для каждого проекта вам нужно в indexer_files создать секцию (в квадратных скобках), а ниже перечислить по аналогии с примером все директории, входящие в проект.
Допустим, у вас есть еще один проект, и лежит он в папке "~/workspace/my_second_project". Тогда нужно отредактировать файл ~/.indexer_files следующим образом:
[myProject]
~/workspace/myproject**/*
[myProject2]
~/workspace/my_second_project**/*
теперь, когда вы откроете в Vim любой файл из директории ~/workspace/myproject (или любой поддиректории), то будут проиндексированы все файлы, находящиеся в ~/workspace/myproject и всех поддиректориях. А те файлы, которые лежат в ~/workspace/my_second_project, проиндексированы не будут, т.к. это другой проект.
т.е. для каждого проекта вам нужно в indexer_files создать секцию (в квадратных скобках), а ниже перечислить по аналогии с примером все директории, входящие в проект.
Вот именно поэтому я и написал оный feature request :) Очень не хочется прописывать каждый проект (особенно, когда их под 30 штук), тем более, что часто, например, я скачиваю исходники какой-то программы или библиотеки, распаковываю их в тот же ~/workspace/ и хочется сразу иметь возможность ходить по этому коду.
Ясно. Я придумаю, как это можно сделать. Скорее всего, действительно что-то вроде
[global]
projects_dir=~/workspace/
Спасибо! Буду с нетерпением ждать :)
Готово, закачал новую версию 1.5. Вы можете указать в ~/.indexer_files следующее:
Это должно вам помочь :)
[PROJECTS_PARENT filter="*.c *.h *.cpp"]
~/workspace
Это должно вам помочь :)
Dziękuję bardzo :) Вы сделали меня счастливым)
Пара замечаний:
При попытке открыть исходники Qt, индексер думал минут 10, потом упал:
В .vimrc прописано:
При этом при ручном запуске индексации (
Второй интересный баг: все проекты всегда пишутся в один tags-файл. И если я, например, открою в терминале две вкладки, в одной открою один проект, а в другой — второй, то может случиться конфуз. Если проекты большие, то конфуз случится буквально сразу (например, я поставлю в одной вкладке открываться код Qt, а в другой — абсолютно любой другой проект, но до того, как в первой закончится индексация).
Пара замечаний:
При попытке открыть исходники Qt, индексер думал минут 10, потом упал:
torkvemada@inquisitia-nout ~/workspace/qt/qt4-x11-4.7.0~beta1+git20100522/src $ vim network/kernel/qnetworkproxy.cpp
Невозможно запустить оболочку /bin/bash
Обнаружена ошибка при обработке function <SNR>23_IndexerInit..<SNR>23_ParseProjectSettingsFile..<SNR>23_ApplyProjectSettings..<SNR>23_UpdateTags:
строка 53:
E484: Невозможно открыть файл /tmp/vR03spm/0
Press ENTER or type command to continue
В .vimrc прописано:
let g:indexer_indexerListFilename = $HOME."/.vim/indexer_files"
let g:indexer_enableWhenProjectDirFound = 1
let g:indexer_tagsDirname = $HOME."/.vim/tags"
let g:indexer_ctagsCommandLineOptions="-R --c++-kinds=+p --c-kinds=+p --fields=+iaS --extra=+q --languages=c++,c"
При этом при ручном запуске индексации (
au FileType c,cpp nmap <F10> <esc>:!ctags -R --c++-kinds=+p --c-kinds=+p --fields=+iaS --extra=+q --languages=c++,c .<cr>
) всё нормально.Второй интересный баг: все проекты всегда пишутся в один tags-файл. И если я, например, открою в терминале две вкладки, в одной открою один проект, а в другой — второй, то может случиться конфуз. Если проекты большие, то конфуз случится буквально сразу (например, я поставлю в одной вкладке открываться код Qt, а в другой — абсолютно любой другой проект, но до того, как в первой закончится индексация).
Насчет падения indexer: похоже, мне придется скачать исходники Qt и подебажить, потому что так мало что ясно. Однако я бы посоветовал убрать ключ -R из опций ctags, т.к. он тут бесполезен: в команде ctags перечисляются все найденные индексером файлы, а не директория проекта. Попробуйте, пожалуйста: может и ошибок тогда не будет, хотя вряд ли…
Насчет второго бага: правда ваша, самый что ни на есть баг. Спасибо, скоро поправлю.
Насчет второго бага: правда ваша, самый что ни на есть баг. Спасибо, скоро поправлю.
Убранный -R не помогает. После падения, кстати, :IndexerInfo сообщает, что 22439 файлов он-таки проиндексировал, а непроиндексированных вовсе нет.
Но при этом
Но при этом
$ du -bsh ~/.vim/tags/tags
37K /home/torkvemada/.vim/tags/tags
явно не отвечает действительности :)22439 файлов! Жесть какая.
Да, надо что-то менять в алгоритме :) Я, когда писал плагин, по неопытности не рассчитывал, что им будут индексировать такие огромные проекты.
А IndexerInfo возвращает кол-во найденных им файлов, которые он скормил ctags'у, а успешно ли все проиндексировалось, не проверяет.
Пожалуй, нужно сделать, чтобы в случае использования indexer_files, а не .vimprojects, ctags'у передавались не файлы, а папки проекта, и с ключом -R.
Да, надо что-то менять в алгоритме :) Я, когда писал плагин, по неопытности не рассчитывал, что им будут индексировать такие огромные проекты.
А IndexerInfo возвращает кол-во найденных им файлов, которые он скормил ctags'у, а успешно ли все проиндексировалось, не проверяет.
Пожалуй, нужно сделать, чтобы в случае использования indexer_files, а не .vimprojects, ctags'у передавались не файлы, а папки проекта, и с ключом -R.
Закачал новую версию.
Файл тегов для разных проектов будут называться по-разному.
А чтобы ctags запускался с ключом -R для всей директории проекта, добавьте в .vimrc
Минус этого варианта в том, что тогда indexer не будет сам сканировать дерево проекта и в переменной &path будет только корневая папка проекта.
Файл тегов для разных проектов будут называться по-разному.
А чтобы ctags запускался с ключом -R для всей директории проекта, добавьте в .vimrc
let g:indexer_ctagsDontSpecifyFilesIfPossible = 1
Минус этого варианта в том, что тогда indexer не будет сам сканировать дерево проекта и в переменной &path будет только корневая папка проекта.
Ага, я её уже обнаружил :)
Поправьте ещё при случае в 331-ой строке «tags=» на «tags+=». Багов это, насколько я могу видеть, не создаёт, зато не будут затираться подгруженные тэги для stl, qt и т.п.
Поправьте ещё при случае в 331-ой строке «tags=» на «tags+=». Багов это, насколько я могу видеть, не создаёт, зато не будут затираться подгруженные тэги для stl, qt и т.п.
а у меня та же ошибка, но новая версия не помогает ((
vim: 7.3
Indexer: 1.6
Описание ошибки:
Настройки .vimrc:
g:indexer_ctagsDontSpecifyFilesIfPossible пробовал и так и сяк
IndexerInfo:
vim: 7.3
Indexer: 1.6
Описание ошибки:
kuzma@kuzma-desktop:~/workspace/beehonest/trunk/application$ vim Bootstrap.php
Cannot execute shell /bin/bash
Error detected while processing function <SNR>8_IndexerInit..<SNR>8_ParseProjectSettingsFile..<SNR>8_ApplyProjectSettings..<SNR>8_UpdateTags:
line 55:
E484: Can't open file /tmp/vzrkw1I/0
Press ENTER or type command to continue
Press any key to continue...
Настройки .vimrc:
kuzma@kuzma-desktop:~$ cat ~/.vimrc
let g:indexer_tagsDirname = $HOME."/.vim/tags"
let g:indexer_ctagsCommandLineOptions="-h '.php' --exclude='\.svn' --totals=yes --tag-relative=yes --PHP-kinds=+cf --regex-PHP='/abstract class ([^ ]*)/\1/c/' --regex-PHP='/interface ([^ ]*)/\1/c/' --regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)/\2/f/'"
let g:indexer_ctagsDontSpecifyFilesIfPossible = 1
Press any key to continue...
g:indexer_ctagsDontSpecifyFilesIfPossible пробовал и так и сяк
IndexerInfo:
* Filelist: project file: /home/kuzma/.vimprojects
* Projects indexed: beehonest
* Files indexed: there's 2658 files. Type :IndexerFiles to list
* Files not found: there's 0 non-existing files.
<skip>
* Tags file: /home/kuzma/.vim/tags/beehonest
* Project root: not found (Project root is a directory which contains ".vimprj" directory)
Здравствуйте.
Да, об этой проблеме я уже тоже знаю, в скором времени доберусь. У вас используется файл .vimprojects, а при работе с ним плагин умеет запускать ctags только перечисляя все файлы проекта. У вас их много — 2658. Текст команды получается огромный, поэтому возникает ошибка. В скором времени я сделаю, чтобы если установлена опция g:indexer_ctagsDontSpecifyFilesIfPossible, то при работе с .vimprojects плагин будет перечислять не файлы, а папки.
А пока, чтобы плагин заработал, предлагаю временно создать файл ~/.indexer_files следующего содержания:
это даст плагину понять, что каждую папку в ~/workspace нужно воспринимать как отдельный проект. В том числе и beehonest будет отдельным проектом.
Да, об этой проблеме я уже тоже знаю, в скором времени доберусь. У вас используется файл .vimprojects, а при работе с ним плагин умеет запускать ctags только перечисляя все файлы проекта. У вас их много — 2658. Текст команды получается огромный, поэтому возникает ошибка. В скором времени я сделаю, чтобы если установлена опция g:indexer_ctagsDontSpecifyFilesIfPossible, то при работе с .vimprojects плагин будет перечислять не файлы, а папки.
А пока, чтобы плагин заработал, предлагаю временно создать файл ~/.indexer_files следующего содержания:
[PROJECTS_PARENT]
~/workspace
это даст плагину понять, что каждую папку в ~/workspace нужно воспринимать как отдельный проект. В том числе и beehonest будет отдельным проектом.
как-то не завелось (
1. создал ~/.indexer_files с указанным контентом
2. cd ~/workspace/beehonest/trunk
3. vim ./index.php
vim открылся без всяких ошибок и подозрительно быстро.
:IndexerInfo
1. создал ~/.indexer_files с указанным контентом
2. cd ~/workspace/beehonest/trunk
3. vim ./index.php
vim открылся без всяких ошибок и подозрительно быстро.
:IndexerInfo
* Filelist: indexer file: /home/kuzma/.indexer_files
* Projects indexed: beehonest
* Paths: .,/home/kuzma/workspace/beehonest
* Tags file: /home/kuzma/.vim/tags/beehonest
* Project root: not found (Project root is a directory which contains ".vimprj" directory)
IndexerInfo говорит все правильно, так и должно быть.
А по тегам не ходит? И посмотрите еще файл тегов /home/kuzma/.vim/tags/beehonest — в нем есть что-то похожее на теги?
А по тегам не ходит? И посмотрите еще файл тегов /home/kuzma/.vim/tags/beehonest — в нем есть что-то похожее на теги?
при этом в .vimrc прописано:
а если выставить в 0
то vim немножко думает и затем опять выкидывает ошибку
let g:indexer_ctagsDontSpecifyFilesIfPossible = 1
а если выставить в 0
let g:indexer_ctagsDontSpecifyFilesIfPossible = 0
то vim немножко думает и затем опять выкидывает ошибку
kuzma@kuzma-desktop:~/workspace/beehonest/trunk/docroot$ vim index.php
Cannot execute shell /bin/bash
Error detected while processing function <SNR>8_IndexerInit..<SNR>8_ParseProjectSettingsFile..<SNR>8_ApplyProjectSettings..<SNR>8_UpdateTags:
line 55:
E484: Can't open file /tmp/vZeN6mo/0
Press ENTER or type command to continue
Press any key to continue...
И это тоже правильно. Когда g:indexer_ctagsDontSpecifyFilesIfPossible == 0, то indexer будет перечислять все файлы при вызове ctags. Т.к. их у вас очень много, то команда получается слишком длинная, и ничего не выполняется.
Когда g:indexer_ctagsDontSpecifyFilesIfPossible == 1, то ctags будет вызван с ключом -R и только для одной директории — "~/workspace/beehonest". Это должно работать.
Когда g:indexer_ctagsDontSpecifyFilesIfPossible == 1, то ctags будет вызван с ключом -R и только для одной директории — "~/workspace/beehonest". Это должно работать.
а вот насчет того, что поиск папки .vim будет находить "~/.vim"… Знаете, похоже, я ступил. Пожалуй, нужно изменить название по умолчанию с ".vim" на какой-нибудь ".vim_indexer"
господи, я не понимаю, почему нельзя воспользоваться специально предназначенной средой разработки? ее ведь сейчас даже нетбук потянет
UFO just landed and posted this here
В нижней части скриншота — окно quickfix.
Очень удобен для быстрой навигации по коду (по ошибкам компиляции или, например, по результатам поиска grep или vimgrep). Можно почитать о нем в этой статье, ну и, конечно же, :help quickfix.
Ну а плагин project позволяет это дело еще больше автоматизировать: в окне плагина нажимаем <Leader>g (Если не знаете, что такое <Leader>, значит, вам нужно нажимать \g и почитать :help leader на досуге), вводим регулярку — наблюдаем результат поиска по всем файлам проекта (или подпроекта — в зависимости от того, в какой ветке проекта находился курсор).
На скриншоте в окне quickfix находятся как раз результаты поиска.
.vimrc — держи.
Очень удобен для быстрой навигации по коду (по ошибкам компиляции или, например, по результатам поиска grep или vimgrep). Можно почитать о нем в этой статье, ну и, конечно же, :help quickfix.
Ну а плагин project позволяет это дело еще больше автоматизировать: в окне плагина нажимаем <Leader>g (Если не знаете, что такое <Leader>, значит, вам нужно нажимать \g и почитать :help leader на досуге), вводим регулярку — наблюдаем результат поиска по всем файлам проекта (или подпроекта — в зависимости от того, в какой ветке проекта находился курсор).
На скриншоте в окне quickfix находятся как раз результаты поиска.
.vimrc — держи.
UFO just landed and posted this here
Залил новую версию Indexer 3.0, в которой, наконец, реализовал очень важные для меня «фичи»:
1. Теги генерируются в фоновом режиме. Это означает, что независимо от размера вашего проекта, вам не нужно будет ждать, пока весь проект проиндексируется: ctags генерит теги, вы продолжаете работать в vim.
2. Можно в одном сеансе vim открывать файлы из разных проектов, и теги будут сгенерированы корректно для всех нужных проектов. Теги из разных проектов не перемешаются. Это чертовски удобно, когда нужно работать с несколькими проектами одновременно. (например, проекты нескольких сущностей, взаимодействующих между собой)
1. Теги генерируются в фоновом режиме. Это означает, что независимо от размера вашего проекта, вам не нужно будет ждать, пока весь проект проиндексируется: ctags генерит теги, вы продолжаете работать в vim.
2. Можно в одном сеансе vim открывать файлы из разных проектов, и теги будут сгенерированы корректно для всех нужных проектов. Теги из разных проектов не перемешаются. Это чертовски удобно, когда нужно работать с несколькими проектами одновременно. (например, проекты нескольких сущностей, взаимодействующих между собой)
Спасибо за плагин, еще хочется пару мелких фич :)
1. Контролировать имя файла с тегами (лично я хотел бы видеть только название проэкта)
2. Генерировать файл подцветки для проэкта и применнять при открытии файла из проэкта.
3. Управлять либами (что бы делать подцветку для SDL например и потом в файле проэкта прописывать use SDL, SDL_images и все разукрасилось как новогодняя ёлочка)
*. PROFIT :)
1. Контролировать имя файла с тегами (лично я хотел бы видеть только название проэкта)
2. Генерировать файл подцветки для проэкта и применнять при открытии файла из проэкта.
3. Управлять либами (что бы делать подцветку для SDL например и потом в файле проэкта прописывать use SDL, SDL_images и все разукрасилось как новогодняя ёлочка)
*. PROFIT :)
1. А зачем вам это, если не секрет? Такой метод именования был сделан специально, т.к. одновременно в Vim можно открыть несколько проектов, описания которых могут лежать в разных .indexer_files или .vimprojects, и если открыть два проекта, находящихся в разных файлах, но имеющие одинаковые имена, то будет конфликт.
2, 3: няня, я у них поел. Что такое «файл подсветки для проекта»? Что значит «управлять либами», и что это за либы? Расскажите подробнее.
И еще.
Я на всякий случай извиняюсь, но смолчать не могу, мне глаза режет: пишется «подСветка», «проЕкт», а «чтобы» пишется слитно. :-[
2, 3: няня, я у них поел. Что такое «файл подсветки для проекта»? Что значит «управлять либами», и что это за либы? Расскажите подробнее.
И еще.
Я на всякий случай извиняюсь, но смолчать не могу, мне глаза режет: пишется «подСветка», «проЕкт», а «чтобы» пишется слитно. :-[
Ну как, смотрите вот делаю я проект
по нему проходит ctags, а в другом проекте я пишу
и в итоге грузится файл тегов для SDL, box2d, MyGame после чего по файлу тегов пробегается mktypes.py и создает файл для хайлайта функций, дефайнов, тейпдеф структур и счастэ палучать мая :є
P.S. У меня на «чтобы» проверка правописание ругалась — пришлось адаптироваться. А вот подсветка и подцветка и расцветка, разноцветка… я так и не выбрал как лучше, поэтому пока придерживаюсь подЦвет(ность)ка, простите если режу глаза; Ъ
[SDL]
/usr/include/SDL**/*.h
по нему проходит ctags, а в другом проекте я пишу
[MyGame include=SDL, box2d]
~/Dev/MyGame**/*.{c,h}
и в итоге грузится файл тегов для SDL, box2d, MyGame после чего по файлу тегов пробегается mktypes.py и создает файл для хайлайта функций, дефайнов, тейпдеф структур и счастэ палучать мая :є
P.S. У меня на «чтобы» проверка правописание ругалась — пришлось адаптироваться. А вот подсветка и подцветка и расцветка, разноцветка… я так и не выбрал как лучше, поэтому пока придерживаюсь подЦвет(ность)ка, простите если режу глаза; Ъ
Ясно.
Насчет этой синтаксической конструкции include=… в .indexer_files я сам давно думал, но руки не доходят, т.к. есть другое, более универсальное решение этой задачи.
В корне каждого проекта у меня есть папка .vimprj, в ней может находиться любое количество файлов *.vim, и когда Vim переключается на буфер с любым файлом из этого проекта, то все эти файлы *.vim запускаются.
У меня там есть только один файл my.vim с настройками проекта, например, tabstop, shiftwidth. И если нужно подключить какой-то файл тегов, то я добавляю в этот файл еще «set tags+=/path/to/tags»
То есть, решение вашей задачи: создать в корне проекта папку ".vimprj", создать в ней файл «my.vim», в этот файл поместить строку: «set tags+=/тут/путь/к/вашему/файлу/тегов»
Насчет этой синтаксической конструкции include=… в .indexer_files я сам давно думал, но руки не доходят, т.к. есть другое, более универсальное решение этой задачи.
В корне каждого проекта у меня есть папка .vimprj, в ней может находиться любое количество файлов *.vim, и когда Vim переключается на буфер с любым файлом из этого проекта, то все эти файлы *.vim запускаются.
У меня там есть только один файл my.vim с настройками проекта, например, tabstop, shiftwidth. И если нужно подключить какой-то файл тегов, то я добавляю в этот файл еще «set tags+=/path/to/tags»
То есть, решение вашей задачи: создать в корне проекта папку ".vimprj", создать в ней файл «my.vim», в этот файл поместить строку: «set tags+=/тут/путь/к/вашему/файлу/тегов»
Ошибка: шаблон не найден
С чем может быть связано? Как отлаживать?
С чем может быть связано? Как отлаживать?
Не припомню, чтобы мой плагин когда-нибудь выдавал мне такую ошибку. Расскажите поподробнее-то:
*) какая версия плагина;
*) используете с .vimprojects или .indexer_files? желательно выложите куда-нибудь используемый файл, я гляну;
*) Вим, наверное, еще сказал вам, в какой строке произошла эта ошибка. Напишите.
*) какая версия плагина;
*) используете с .vimprojects или .indexer_files? желательно выложите куда-нибудь используемый файл, я гляну;
*) Вим, наверное, еще сказал вам, в какой строке произошла эта ошибка. Напишите.
Не корректно описал я.
Omni completition (^O^N^P) Шаблон не найден (или pattern not found для англ)
То есть ошибка не в плагине, а в том что он не подключает теги к omnicppcomplete.
Использую с плагином project, как в первом разделе вашей статьи. Скачал последние версии.
Omni completition (^O^N^P) Шаблон не найден (или pattern not found для англ)
То есть ошибка не в плагине, а в том что он не подключает теги к omnicppcomplete.
Использую с плагином project, как в первом разделе вашей статьи. Скачал последние версии.
* Indexer version: 4.14
* Ctags version: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
* Filelist: project file: /home/victor/.vimprojects
* Index-mode: FILES. (option g:indexer_ctagsDontSpecifyFilesIfPossible is OFF)
* Filelist for ctags is USED (option g:indexer_ctagsWriteFilelist is ON)
* At file save: remove tags for saved file by SED, and just append tags
* Background tags generation: NO. (because of v:servername is empty (:help servername))
* Projects indexed: hist
* Root paths: /home/victor/development/hist
* Paths for ctags:
* Files for ctags: /home/victor/development/hist/CMakeLists.txt, /home/victor/development/hist/algorithm-list.cpp, /home/victor/development
/hist/bgfg-segm.cpp, /home/victor/development/hist/main.cpp, /home/victor/development/hist/viewer.cpp
* Files not found: there's 0 non-existing files.
* Paths (with all subfolders): .,/usr/include,,,/home/victor/development/hist,
* Tags file: ./tags,./TAGS,tags,TAGS,/home/victor/.vim/tags/osg,/home/victor/.vimprojects_tags/hist
* Ctags version: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
* Filelist: project file: /home/victor/.vimprojects
* Index-mode: FILES. (option g:indexer_ctagsDontSpecifyFilesIfPossible is OFF)
* Filelist for ctags is USED (option g:indexer_ctagsWriteFilelist is ON)
* At file save: remove tags for saved file by SED, and just append tags
* Background tags generation: NO. (because of v:servername is empty (:help servername))
* Projects indexed: hist
* Root paths: /home/victor/development/hist
* Paths for ctags:
* Files for ctags: /home/victor/development/hist/CMakeLists.txt, /home/victor/development/hist/algorithm-list.cpp, /home/victor/development
/hist/bgfg-segm.cpp, /home/victor/development/hist/main.cpp, /home/victor/development/hist/viewer.cpp
* Files not found: there's 0 non-existing files.
* Paths (with all subfolders): .,/usr/include,,,/home/victor/development/hist,
* Tags file: ./tags,./TAGS,tags,TAGS,/home/victor/.vim/tags/osg,/home/victor/.vimprojects_tags/hist
:IndexerDebugInfo
* Ctags executable: exuberant-ctags
* Ctags versionOutput: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
Compiled: Oct 23 2011, 12:45:36
Addresses:, ctags.sourceforge.net
Optional compiled features: +wildcards, +regex
* Ctags boolCtagsExists: 1
* Ctags boolPatched: 0
* Ctags versionFirstLine: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
* OS last command: ** no OS commands yet **
* Ctags last command: exuberant-ctags -f "/home/victor/.vimprojects_tags/hist_tmp" -a --sort=yes -L "/home/victor/.vimprojects_tags/hist_files" --c++-kinds
=+p+l --fields=+iaS --extra=+q
* Ctags last output:
* Ctags executable: exuberant-ctags
* Ctags versionOutput: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
Compiled: Oct 23 2011, 12:45:36
Addresses:, ctags.sourceforge.net
Optional compiled features: +wildcards, +regex
* Ctags boolCtagsExists: 1
* Ctags boolPatched: 0
* Ctags versionFirstLine: Exuberant Ctags 5.8, Copyright © 1996-2009 Darren Hiebert
* OS last command: ** no OS commands yet **
* Ctags last command: exuberant-ctags -f "/home/victor/.vimprojects_tags/hist_tmp" -a --sort=yes -L "/home/victor/.vimprojects_tags/hist_files" --c++-kinds
=+p+l --fields=+iaS --extra=+q
* Ctags last output:
Выглядит все хорошо. Должны быть проиндексированы следующие 4 файла:
Попробуйте навести курсор, например, на имя какого-нибудь метода из этих классов, и нажать
Если Вим перешел на определение данного метода — значит, миссия моего плагина выполнена (теги сгенерированы), и проблема где-то в настройке omnicppcomplete.
Если же нет (выдал ошибку E426, т.е. tag not found) — то это странно, и тогда приведите, пожалуйста, содержимое файла
algorithm-list.cpp, bgfg-segm.cpp, main.cpp, viewer.cpp
.Попробуйте навести курсор, например, на имя какого-нибудь метода из этих классов, и нажать
Ctrl+]
. Если Вим перешел на определение данного метода — значит, миссия моего плагина выполнена (теги сгенерированы), и проблема где-то в настройке omnicppcomplete.
Если же нет (выдал ошибку E426, т.е. tag not found) — то это странно, и тогда приведите, пожалуйста, содержимое файла
/home/victor/.vimprojects_tags/hist
.Да, находит. Буду с omnicppcoplete разбираться, к слову он у меня никогда не работал. Не подскажите с ним нужны какие-то особые танцы, кроме того, что описано в инсталяции?
Как сделать генерацию тегов для инклудов, не входящих в проект?
Как сделать генерацию тегов для инклудов, не входящих в проект?
Блин, опять ответил комментом к статье :-/ Читайте ниже.
И добавлю еще: вместо omnicppcomplete попробуйте clang_complete. Народ очень хвалит — автодополнение работает четко, без глюков, в отличие от omnicppcomplete. Для его работы не нужны теги вообще.
Я его только потестировал немного — понравилось, но использовать в своих задачах пока не могу, т.к. пишу под микроконтроллеры, и из-за специфики clang не понимает некоторые вещи. Пока руки не дошли приручить его, да и omnicppcomplete, хоть и неидеально, но работает.
И добавлю еще: вместо omnicppcomplete попробуйте clang_complete. Народ очень хвалит — автодополнение работает четко, без глюков, в отличие от omnicppcomplete. Для его работы не нужны теги вообще.
Я его только потестировал немного — понравилось, но использовать в своих задачах пока не могу, т.к. пишу под микроконтроллеры, и из-за специфики clang не понимает некоторые вещи. Пока руки не дошли приручить его, да и omnicppcomplete, хоть и неидеально, но работает.
Насчет omnicppcomplete: вроде у меня без проблем все заработало, когда я настраивал его впервые. Вот мои настройки, относящиеся к нему: тынц.
Насчет генерации тегов для файлов, не входящих в проект:
Если использовать плагин project, то на данный момент есть только один способ, который я всегда и использую: в вашем случае нужно создать файл
…
То есть, перечислить все файлы тегов для инклудов. Недостаток: если эти файлы тегов еще не сгенерированы, то работать, конечно, не будет. То есть, если, например, я настраиваю свое рабочее окружение на новом компе, то мне нужно открыть в виме каждую либу, чтобы indexer сгенерировал теги для всех них.
У меня в планах сделать возможность подключать другие проекты, чтобы теги для них генерировались автоматически, но пока — так.
Насчет генерации тегов для файлов, не входящих в проект:
Если использовать плагин project, то на данный момент есть только один способ, который я всегда и использую: в вашем случае нужно создать файл
/home/victor/development/hist/.vimprj
и поместить туда следующий код:set tags+=/path/to/my/first_lib/tags
set tags+=/path/to/my/second_lib/tags
…
То есть, перечислить все файлы тегов для инклудов. Недостаток: если эти файлы тегов еще не сгенерированы, то работать, конечно, не будет. То есть, если, например, я настраиваю свое рабочее окружение на новом компе, то мне нужно открыть в виме каждую либу, чтобы indexer сгенерировал теги для всех них.
У меня в планах сделать возможность подключать другие проекты, чтобы теги для них генерировались автоматически, но пока — так.
про этот файл
.vimprj
вы можете прочитать в доке к плагину vimprj.После добавления сгенерированных вручную тегов из ~/.vim/tags в hist/.vimproj для внешних либ omnicppcomplete заработал, но для классов из файлов проекта — нет.
Может индексер создает теги в директории, которую omni не видит? В ~/.vim/tags только то, что я генерил сам из консоли, без вима.
Может индексер создает теги в директории, которую omni не видит? В ~/.vim/tags только то, что я генерил сам из консоли, без вима.
Во-первых,
Во-вторых, omnicppcomplete видит ровно столько же, сколько видит сам Vim. Что видит Vim вы можете узнать, набрав
Единственное требование, насколько я знаю — это чтобы теги были сгенерированы с опциями
Я не являюсь знатоком omnicppcomplete, поэтому не смогу помочь. У меня проблем с этим не было.
.vimprj
, а не .vimproj
, так ведь?Во-вторых, omnicppcomplete видит ровно столько же, сколько видит сам Vim. Что видит Vim вы можете узнать, набрав
:set tags?
Единственное требование, насколько я знаю — это чтобы теги были сгенерированы с опциями
--c++-kinds=+p --fields=+iaS --extra=+q
— все это у вас тоже есть, насколько вижу.Я не являюсь знатоком omnicppcomplete, поэтому не смогу помочь. У меня проблем с этим не было.
.vimprj, конечно.
Прошу меня извинить за оффтоп. Вы мне помогли.
Прошу меня извинить за оффтоп. Вы мне помогли.
Sign up to leave a comment.
Автоматическая индексация файлов проекта