Альтернативы Ctags/Cscope с Objective-c?
Существуют ли альтернативы ctags и cscope с поддержкой Objective-c. Это относится к разработке какао, поэтому неизбежно кажется, что я буду использовать Xcode (и, вероятно, должен). Мне было просто интересно, каковы мои варианты Vim.
Может быть, есть какой-то тип системы плагинов, например eclim, но для xcode?
РЕДАКТИРОВАТЬ
Так что, похоже, кроме обновления ctags для поддержки target-c, мне не повезло. Кто-нибудь знает, если cscope такой же?
9 ответов
Долгое время после этого вопроса, "играя" с vim, я хотел поддержки ObjC, особенно с плагином taglist. Я нашел этот вопрос, потом немного покопался, и вот не очень грязное решение:
- Парсер ObjectiveC был добавлен в ствол Exuberant CTags, он еще не выпущен (пока?)
Вы можете легко установить его на OSX с помощью homebrew:
$ brew install ctags --HEAD
Обратите внимание, что при использовании ctags,
.m
рассматривается как Matlab и.h
рассматривается как C++. Чтобы переопределить, используйте:$ ctags --langmap=ObjectiveC:.m.h
Затем я добавил что-то подобное в мой
.vimrc
для поддержки taglist:let tlist_objc_settings = 'ObjectiveC;P:protocols;i:interfaces;types(...)'
добавьте интересующий вас тип из этого списка:
ctags --list-kinds=all ObjectiveC i class interface I class implementation p Protocol m Object's method c Class' method v Global variable F Object field f A function p A property t A type alias s A type structure e An enumeration M A preprocessor macro
Я надеюсь, что это поможет кому-то!
Universal-ctags ( https://ctags.io/) может захватывать свойства Objective-C.
[jet@localhost objectivec_property.h.d]$ cat input.h
@interface Person : NSObject {
@public
NSString *m_name;
@private
int m_age;
}
@property(copy) NSString *personName;
@property(readonly) int personAge;
-(id)initWithAge:(int)age;
@end
[jet@localhost objectivec_property.h.d]$ ../../../ctags -x -o - input.h
Person interface 2 input.h @interface Person : NSObject {
initWithAge: method 12 input.h -(id)initWithAge:(int)age;
m_age field 6 input.h int m_age;
m_name field 4 input.h NSString *m_name;
personAge property 10 input.h @property(readonly) int personAge;
personName property 9 input.h @property(copy) NSString *personName;
Существует возможность использовать ctags для target-c. Вы можете использовать etags в режиме ctags. etags, полученные из ctags некоторое время назад, и в своем исходном коде ctags-совместимые теги будут сгенерированы определением определенного макропереключателя.
Фактически, справочная страница в Mac Os уже документирует etags и ctags на одной странице. В нем говорится, что target-c поддерживается в ctags. Вы должны иметь возможность сгенерировать файл тегов с помощью следующей команды: ctags -l objc *.[Mh]
К сожалению, программа ctags в Mac OS ведет себя не так, как описано в документации, так как Apple все испортила. Однако мне удалось установить этот вид ctags с использованием Ubuntu Linux, и он прекрасно работает!!! Там вы должны установить пакет emacs22-bin-common.
Таким образом, в Mac OS все, что вам нужно сделать, это скомпилировать этот пакет для себя.
- Загрузите соответствующий пакет исходного кода, например, с сервера Debian ( ссылка).
- извлечь его и перейти в исходный каталог
- запустить./configure
- configure возвращает с ошибкой, потому что не может найти lispref
- Я удалил все цели в переменных config_files в созданном файле config.status, несмотря на те, что были в lib-src
- запустить./config.status
- cd lib-src
- делать
- Скопируйте ctags, например, в / usr / local / bin и измените разрешения
- sudo cp ctags / usr / local / bin
- chmod a + rx / usr / local / bin / ctags
Вы сделали. Удачной маркировки!!!
Вы также можете попробовать objcscope, который написан мной.
AFAIK, ctags помогают вам определить некоторые правила для нового языка, я сделал это, когда делал некоторые разработки, используя laszlo(similiar to flex). Вы можете прочитать man-страницу ctags, чтобы получить более подробную информацию, это не сложно сделать.
Я считаю, что здесь есть плагин vim filetype, который поддерживает разработку под какао, надеюсь, он вам пригодится.
Вы можете попробовать форк Фишмана из Exuberant Ctags, который поддерживает Objective C и CSS.
По поводу другого ответа: вы можете установить EMACS с MacPorts довольно легко, и он будет включать в себя версию etags в /opt/local/bin, в которой скомпилирована поддержка Objective-C.
% sudo port install emacs
% find . -name ‘*.[hm]’ -print0 | xargs −0 /opt/local/bin/etags
А потом внутри VIM:
:setlocal tags=TAGS
Это хорошо работает для меня с MacVim.
Если я не ошибаюсь
Самый последний
ctags
сейчас разбирает@property
ключевое слово неправильно, что может привести к тому, что все слова после@property
в исходном коде разбираются на свойства, что приводит к путанице в файлеtags
,
Я должен перекомпилировать ctags ( https://sourceforge.net/p/ctags/code/HEAD/tree/), комментируя всю обработку ключевого слова свойства в ObjC.c
как обходной путь. Хотя это только помогает немного лучше читать исходный код в Taglist.
Он все еще не может перейти (например, к методам реализации с параметрами) правильно.
Я также попробовал это ( https://github.com/mcormier/ctags-ObjC-5.8.1), но, к сожалению, это не может прыгнуть вообще.
Резюме: кажется, что ctags для ObjC не так работоспособны, как для C/C++.
Мне было трудно заставить ctags генерировать теги для tagbar. Было проще использовать плагин vim для редактора Objective-C. XVim работает с XCode. Если вы используете Appcode, как я, IdeaVim хорошо интегрирован.
Хотя с плагином вы не получите полной функциональности Vi/Vim. Я считаю, что использование смеси с собственными командами IDE достаточно для компенсации.