8

我是 emacs 的新手,它的缩进让我难以接受。它太聪明了。它(错误地)认为它知道我想如何格式化我的源代码,但是我没有时间为我编写代码的每种不同语言的每种模式逐个设置;并且其中许多语言根本没有启用任何模式。

这是我想要的行为:

  • TAB 插入缩进
  • RET 插入一个新行,然后将空白字符从前一行的开头复制到第一个非空白字符或行尾,以先到者为准
  • 行开头和第一个非空白字符/行尾之间的空白文本中的 DEL(退格键)如果可能,删除一个缩进,否则像正常的单个字符
  • { 没有自动缩进
  • } 上没有自动取消缩进
  • 事实上,任何时候都没有智能缩进行为,只需在 RET 上复制上一行的缩进即可。
  • 每个源文件格式要配置两个变量:display tab width和 content of indent。最好可以将这些配置为随机源代码格式,而不必为它们编写主要模式,除非编写主要模式是 .emacs 中的单行代码,由两个setqs 组成。

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

以上可能吗?以前肯定有人这样做过吗?是否有一些次要模式可以做到这一点?

4

1 回答 1

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)))
于 2013-09-22T17:25:38.377 回答