【发布时间】: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