Emacs modeline在文件末尾的一行中

时间:2011-03-21 19:18:38

标签: 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: 4
// indent-tabs-mode: t
// truncate-lines: 1
// End:
// vim:set ft=cpp ts=4 sw=4 sts=4 nowrap: cindent:

问题是:如何在“一行”代码中转换emacs部分(如vim可以)?并将其保留在源文件的末尾(不在顶部)。

(可能这可以作为Lisp问题重新编写,但我不熟悉它)

6 个答案:

答案 0 :(得分:6)

目录本地变量可能是更好的方法。

每个人都会处理单个.dir-locals.el文件,根本不需要文件局部变量。

vim可能有类似的机制吗?

答案 1 :(得分:5)

您可以使用eval:声明,但Emacs会要求您确认评估是否安全。如果你告诉Emacs永久接受它,它将不再询问该表达式(它将它存储在你的init文件的custom-set-variables部分的safe-local-variable-values中)。

;;; Local Variables:
;;; eval:(setq c-basic-offset 4 tab-width 4 indent-tabs-mode t truncate-lines 1)
;;; End:

您可以在progn中包装多个表达式:

;;; Local Variables:
;;; eval:(progn (setq c-basic-offset 4) (message "hello"))
;;; End:

或者使用任何其他结构(我认为没有任何限制)。

答案 2 :(得分:1)

您需要使用// Local Variables:// End:。其余部分可以像// eval: (setq c-basic-offset 4 tab-width 4 indent-tabs-mode t truncate-lines 1)一样制作成一行。

答案 3 :(得分:0)

(setq c-basic-offset 4 tab-width 4 indent-tabs-mode t truncate-lines 1)将此添加到您的.emacs中。如果您希望针对特定文件类型执行此操作,则可以始终使用add-hook调用,例如(add-hook 'c-mode-common-hook 'your-func-here),其中-func-here可以是仅设置这些变量的函数。

请参阅使用局部变量和eval的phils方法,以使用上面给出的第一行代码完成此操作。抱歉,我不太明白这仅适用于单个文件或极少数文件。

答案 4 :(得分:0)

答案 5 :(得分:0)

我要转过来问这个问题?你真的需要任何文件局部变量吗?如果在所有源文件中使用相同的样式,最好定义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)