如何在所有模式下的emacs中获得自动缩进(非智能缩进)

时间:2013-09-22 15:18:48

标签: emacs elisp indentation auto-indent

我是emacs的新手,它的缩进让我不知所措。它对自己的好处太聪明了;它(错误地)认为它知道我想如何格式化我的源代码,但是我没有时间为我编写代码的每种不同语言追逐每种模式的每个设置;其中许多语言都没有启用任何模式。

这是我想要的行为:

  • TAB插入缩进
  • RET插入一个新行,然后将空白字符从上一行的开头复制到第一个非空白字符或行尾,以较早者为准
  • 行开头和第一个非空白字符/行尾之间的空白文本中的DEL(退格键)删除一个缩进,如果可能,否则单个字符就像正常
  • {
  • 上没有自动缩进
  • 没有自动取消}}
  • 事实上,任何时候都没有智能屁股缩进行为,只需在RET上复制上一行的缩进。
  • 每个源文件格式要配置两个变量:显示标签宽度,以及缩进的内容。优选地,这些可以被配置为随机源代码格式而不必为它们编写主模式,除非写入主模式是.emacs中的单行,包括两个setq

这将使我在所有语言中获得逻辑和一致的行为。它会把代码格式化的工作留给我,但是没关系,我已经这样做了20年了,而且我知道如何制作其他宏来使它变得高效。更重要的是,它使我免于摆弄配置设置,试图让自动行为符合我的喜好。我的宏可以依赖于一致的行为,因此它们可以在所有模式下正常工作。

以上可能吗?当然其他人以前做过这个吗?那里有一些小模式吗?

1 个答案:

答案 0 :(得分:6)

以下是代码:

(setq tab-width 4)
(defun plain-tab ()
  (interactive)
  (insert (make-string tab-width ?\ )))
(defun plain-ret ()
  (interactive)
  (looking-back "^\\( +\\).*")
  (newline)
  (insert (match-string 1)))
(defun plain-del ()
  (interactive)
  (backward-delete-char
   (if (looking-back (format " \\{%d\\}" tab-width)) tab-width 1)))
(defvar all-the-mode-maps
  '(c-mode-map c++-mode-map java-mode-map
    js-mode-map emacs-lisp-mode-map
    clojure-mode-map))
(require 'cc-mode)
(require 'js)
(require 'clojure-mode)
(eval `(mapc 
        (lambda(map)
          (define-key map [tab] 'plain-tab)
          (define-key map [return] 'plain-ret)
          (define-key map [backspace] 'plain-del)
          (define-key map "{" (lambda()(interactive)(insert "{")))
          (define-key map "}" (lambda()(interactive)(insert "}"))))
        (list ,@all-the-mode-maps)))