【问题标题】:How to get auto indent (not smart indent) in emacs in all modes如何在所有模式下在 emacs 中获取自动缩进(不是智能缩进)
【发布时间】:2013-09-22 15:18:48
【问题描述】:

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

这是我想要的行为:

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

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

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

【问题讨论】:

  • 如果你不喜欢摆弄,那么 Emacs 不适合你:)。但说真的,让您的问题更具信息性:添加不起作用的模式。我为 Emacs 使用了至少 15 种不同的编程模式,它们大多都很棒。或者,如果您想放弃所有模式并坚持使用基础模式,请概述不适合您的基础模式的特定功能。
  • @abo-abo 我不想失去语法高亮或插入诸如自动完成之类的功能。但是在过去的两个周末我花了超过 15 个小时试图将 emacs bash 成一个合理的形状,它仍然不适合在基础模式下在编辑 C 和大括号分隔的语言之间切换。
  • 令人沮丧的是,完成例程也是选项卡例程。我将 TAB 反弹到 self-insert-command 并将 C- (C-@) 反弹到 indent-for-tab-command,并将 tab-always-indent 设置为完成,所以我可以得到例如在 .emacs 中省略完成,但这也意味着 C- 尝试自动格式化。将补全和代码格式化绑定到同一个函数中是谁的绝妙主意?
  • 首先,重新绑定C-<space> 是一个非常糟糕的主意,因为它在标记区域方面起着非常重要的作用。其次,没有理由花 15 个小时来改造 Emacs。当前状态是 30 年演变和成千上万程序员使用的结果。问题是您正试图让 Emacs 的行为与您之前使用的一样。一步一步来。我可以在下面写一些代码,为您指定的所有模式重新绑定键。如果需要,您可以稍后重新自定义。
  • 我已经在其他地方反弹了 set-mark-command,但我不经常使用那种标记样式,因为我使用的是瞬态标记模式。至于30年,成千上万的程序员等;这对我来说并不重要,因为我不像 99% 的程序员那样工作;编译器工程师、Dvorak 用户等。我使用 emacs 的主要原因是为了获得一个可编程的终端编辑器,而不是因为它混杂了半生不熟的 UI 模式。它在 Cygwin 上的默认状态下被破坏,并且一半的键绑定在屏幕内不起作用,只是为了正确设置 terminfo 设置需要做很多工作,更不用说修复其他所有内容了。

标签: emacs elisp indentation auto-indent


【解决方案1】:

代码如下:

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

【讨论】:

  • +1 让我知道很多有用的表格。我将把它的大部分合并到我的次要模式中,并进行更改;例如一些文件使用制表符而不是空格;我将使用钩子而不是要求影响其他模式,因为 emacs 无法立即启动;它需要影响 bash、Haskell、OCaml、Ruby、Python、Go、JS、css、html、xml、xsd、scss、coffeescript、elisp、C#、yaml、erb、puppet、yacc、lex、awk、lua和 makefile,作为我在过去一个月中编辑过的一组不完整的文件类型,不包括使用自定义解析器的文件格式。
  • 我根本没有时间找到所有这些格式的主要模式并正确配置它们。
  • 我猜你必须写一个小模式来记录你使用的所有模式:)
  • 您可以定义一个重新绑定tab' to plain-tab' 等的全局次要模式...然后您无需关心列出您使用的主要模式。
  • 你说得对,@Stefan,我实际上还没有开始编写次要模式,因为我写的大部分内容都特定于一种模式。
猜你喜欢
  • 2012-07-10
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多