我是OS X下Aquamacs的用户,默认情况下不会将.m文件识别为Objective-C,而是将它们视为matlab文件 - 来自邮件列表,其原因是维护者感觉到在他向分销中添加解决方案之前,他想要一种清晰的方法来区分Obj-C文件和其他文件.
因此,我试图提出一个适当的魔术模式,有助于正确识别Objective-C文件并切换到正确的模式 - 经过一番思考,似乎所有我需要检查的是存在三个关键字之一:
@implementation @interface @protocol
任何Objectve-C文件都应该包含其中一个字符串,并且它们很可能不会出现在Matlab文件中.
然后我尝试用魔法模式alist变体来识别@implementation
,我的第一次尝试是:
(add-to-list 'magic-mode-alist '(".*^\@implementation.*" . objc-mode))
基本上 - 在行的开头检查文件中任何位置的@implementation.
将它放入我的.emacs文件之后,似乎没有任何效果 - 在其中打开带有@implementation的.m文件,没有切换到Obj-C模式.
有谁知道我的魔术模式alist条目可能是什么问题?我能找到的唯一例子只是在文件的最开头匹配文本(对于nxml模式),而不是文件中间的字符串.似乎我的正则表达式一定有问题,但正如所指出的,同一主题的一些变体似乎没有效果.
我的.emacs文件中的工作条目为auto-mode-alist提供了今天的正确模式所以我不需要任何关于如何做到这一点的建议,我想以"正确"的方式解决这个问题.
编辑:
感谢下面接受的响应,这是我在.Emacs文件中的最终代码:
(setq magic-mode-alist (append (list '("\\(.\\|\n\\)*\n@implementation" . objc-mode) '("\\(.\\|\n\\)*\n@interface" . objc-mode) '("\\(.\\|\n\\)*\n@protocol" . objc-mode)) magic-mode-alist))
请注意,我使用"\n"替换正则表达式中的"^"(行首),因为准确确定类型很重要 - 否则.emacs文件本身会以obj-c模式出现,因为@实施在那里.
我发现其他需要注意的事情是,魔术模式alist只在一个文件的开头被赋予一定数量的字符(由magic-mode-regexp-match-limit
默认的4000个字符定义),可能是出于性能原因.通常情况下,这足以找到开头@implementation
或@interface
块,但如果您像某些人一样在文件的标题中插入修订注释,则可能需要大幅增加.就像备份一样,我计划也包含使用auto-mode-alist使.m文件始终以obj模式打开的代码,因为我的Matlab时代远远落后于我 - 但希望这种魔法模式的改变可以进入官方发布的Aquamacs至少,如果不是Emacs 23本身(正则表达可能应该加强一点,为此发生).
在emacs 正则表达式中,.
与换行符不匹配.此外,^
字符不是特殊的(匹配行的开头),除非它是正则表达式中的第一个字符(由于历史原因,根据手册).
所以你需要这样的东西:
(add-to-list 'magic-mode-alist '("\\(.\\|\n\\)*@implementation" . objc-mode))