Emacs modeline位于文件末尾的一行中

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:

我正在从事一个项目,其中一些人使用vi,一些人使用emacs,还有一些人(包括gedit)。强制(至少是视觉)样式的最简单但全局的方法(虽然不是完美的)是在每个文件的末尾添加以下行:

  ...
  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)