Emacs modeline位于文件末尾的一行中
我正在从事一个项目,其中一些人使用vi,一些人使用emacs,还有一些人(包括gedit)。强制(至少是视觉)样式的最简单但全局的方法(虽然不是完美的)是在每个文件的末尾添加以下行:Emacs modeline位于文件末尾的一行中,emacs,Emacs,我正在从事一个项目,其中一些人使用vi,一些人使用emacs,还有一些人(包括gedit)。强制(至少是视觉)样式的最简单但全局的方法(虽然不是完美的)是在每个文件的末尾添加以下行: ... return 0; } // Editor modelines - generated by http://www.wireshark.org/tools/modelines.html // Local variables: // c-basic-offset: 4 // tab-width:
...
return 0;
}
// Editor modelines - generated by http://www.wireshark.org/tools/modelines.html
// Local variables:
// c-basic-offset: 4
// tab-width: 4
// indent-tabs-mode: t
// truncate-lines: 1
// End:
// vim:set ft=cpp ts=4 sw=4 sts=4 nowrap: cindent:
问题是:如何在“一行”代码中转换emacs部分(就像vim一样)?但仍将其保留在源文件的末尾(而不是顶部)
(这可能会被改写为Lisp问题,但我不熟悉)(setq c-basic-offset 4制表符宽度4缩进制表符模式t截断行1)
将此添加到.emacs。如果您希望对特定文件类型执行此操作,您可以始终使用add hook调用,例如(在此处为func添加hook'c-mode-common-hook)
,其中func可以是一个简单设置这些变量的函数
请参考phils使用局部变量和eval的方法,使用上面给出的第一行代码完成此操作。很抱歉,我不太明白这仅适用于单个文件或极少数文件。您可以使用
eval:
声明,但Emacs会要求您确认评估是安全的。如果您告诉Emacs永久接受它,它将不再询问该表达式(它将其存储在init文件的“自定义设置变量”部分的safe local variable values
)
您可以在progn
中包装多个表达式:
;;; Local Variables:
;;; eval:(progn (setq c-basic-offset 4) (message "hello"))
;;; End:
或者使用任何其他构造(我认为没有任何限制)。看起来您可能是: 指定文件变量: Emacs中的变量:
除非您使用Phils的eval样式。您将需要使用
//局部变量:
和//结束:
。其余部分可以做成一行,如//eval:(setq c-basic-offset 4制表符宽度4缩进制表符模式t截断行1)
我要把问题转过来?您真的需要任何文件局部变量吗?如果您在所有源文件中使用相同的样式,那么最好定义一个C缩进设置并将其分发给所有开发人员
(defconst my-c-style
'((c-basic-offset . 2)
(c-offsets-alist
. ((substatement-open . 0)
(statement-case-open . +)
(inline-open . 0)
(arglist-cont-nonempty . (c-indent-operator-lineup-arglist-operators
c-lineup-arglist)))))
"My indentation style")
(defun my-c-mode-common-hook ()
(interactive)
(c-add-style "my" my-c-style t))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
目录局部变量可能是更好的方法
.dir locals.el
文件将由每个人处理,并且根本不需要文件局部变量
vim很可能有类似的机制?没有。这将使它成为所有文件的标准。仍然无法工作。这将在该模式下为的所有文件设置它。OP只想把它设置成一个文件。哦,我想,我认为这是一个项目,它可能是所有的C文件或C++文件等等…谢谢,我现在正在使用这个。如果在文件的末尾,modeline的长度似乎不能短于三行。在看过Lindydancer的答案后,我突然意识到没有提到目录局部变量。您可能更喜欢使用这些选项(请参阅我较新的答案)。我只是想补充一点,至少在我的案例中,emacs从未标记这些选项是安全的,即使在询问是否应将它们标记为安全并回答“安全”后也是如此(永久添加)。长语法是可以接受的。阿尔夫:这很奇怪。我只在未设置
user init file
时遇到过这种行为(例如,由于使用-q
参数运行Emacs),phils:我在另一个系统中进行了尝试,并按预期工作(Ubuntu/GNU Emacs 22.2.1)。在第一个系统(Ubuntu/GNU Emacs 23.1.50.1)中,即使删除.Emacs和.Emacs.d,也无法工作。这可能仍然是个谜。谢谢。感谢您的代码不能短于三行,谢谢您的推荐,我会考虑的。另外,您如何在LocalVariables/End块中设置示例中的选项?我不知道。我只需将我发布的代码放入~/.emacs
。或者更确切地说,我会将它放在一个版本控制的文件中,分发给所有用户,并要求他们从自己的init文件中包含它。这样你就可以调整缩进样式,轻松地将更改推给每个人。我知道~/.emacs
的代码,我只是想在单个文件中测试这些选项。我从来不知道如何将一种语法转换成另一种语法,您的代码看起来与我在LocalVariables/End块中看到的非常不同(例如点和嵌套括号)。好提示。这是一个很好的选择,特别是对于一个已经启动了大量文件的项目。(尽管作为隐藏文件可能会让人困惑,…或不是)
(defconst my-c-style
'((c-basic-offset . 2)
(c-offsets-alist
. ((substatement-open . 0)
(statement-case-open . +)
(inline-open . 0)
(arglist-cont-nonempty . (c-indent-operator-lineup-arglist-operators
c-lineup-arglist)))))
"My indentation style")
(defun my-c-mode-common-hook ()
(interactive)
(c-add-style "my" my-c-style t))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)