Emacs、Objective-C 和自动完成

Posted

技术标签:

【中文标题】Emacs、Objective-C 和自动完成【英文标题】:Emacs, Objective-C, and autocomplete 【发布时间】:2010-10-14 16:49:01 【问题描述】:

我最近切换到 emacs 进行代码编辑,而且大部分情况下效果很好。

但是,对于 Objective-C,我发现自己缺少 Xcode 的自动完成功能,因为我无法记住长函数名称,例如

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen;

有没有办法在 emacs 上获得 Xcode 样式的自动完成功能?

另外,我应该有什么好的包来帮助 Cocoa 或 Objective-C?

【问题讨论】:

我会注意到您可以在 Xcode 中使用 Emacs 键绑定,这样您就可以在 Xcode 中获得 Emacs 的一些优势。 取消标记 cocoa,因为它与 Objective-C 更相关,并且因为“Cocoa 自动完成”是完全不同的东西。 【参考方案1】:

编辑文件auto-complete.el(当然是在你安装“auto-complete”包的文件夹中查找):

转到第 165 行,我保证你已经知道该做什么了。 :)

【讨论】:

我更喜欢 M-xcustom-variable RETac-mode RET。或者甚至更好的 .emacs 添加 (setq ac-mode (cons 'objc-mode ac-mode))【参考方案2】:

我写了一个脚本来导出 Cocoa SDK 中的函数定义为 yasn-p sn-ps:http://github.com/zegal/yasobjc

在 ETAGS 和自动完成的帮助下,完成体验非常接近 XCode。你可以试一试。

【讨论】:

非常聪明,超级有用,我喜欢它!谢谢zegal 干得好!但是,我想知道是否有可能将其与语义联系起来?如果我知道消息名称,yasn-p+yasobjc 可以完成,但如果我需要先找到正确的消息怎么办?语义可以确定所讨论对象的类型,并从 yasn-ps 呈现有效消息。【参考方案3】:

在clang svn 中找到的clang-completion-mode.el 是一个有点bug 和hacky 但非常好的解决方案。

【讨论】:

【参考方案4】:

我还没有尝试过,但是 company-mode 有一个 xcode 后端可能会很有帮助:

http://nschum.de/src/emacs/company-mode/

【讨论】:

【参考方案5】:

我没有使用过 XCode,但是 emacs 带有几种自动完成模式。

见:

内置 dabbrev-expand(M-/ 运行命令 dabbrev-expand “自动完成”部分写入的文本) AutoComplete HippieExpand

还有cedet 用于更复杂的东西 - 但不幸的是我认为它不适用于objective-c。

【讨论】:

谢谢,我不确定这些中的任何一个是否能很好地工作(看起来没有足够的上下文敏感),我想我可能只是坚持使用 XCode for Objective-C。

以上是关于Emacs、Objective-C 和自动完成的主要内容,如果未能解决你的问题,请参考以下文章

使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件

Emacs 启动时自动完成模式

Emacs,自动完成模式,CSS,痛苦。 (插图!)

Emacs 补全:自动补全还是公司? [关闭]

理解 Emacs 完成模式选择

emacs 选项卡宽度与自动完成冲突