如何使 emacs 的行为更接近常规编辑器?
Posted
技术标签:
【中文标题】如何使 emacs 的行为更接近常规编辑器?【英文标题】:How to make emacs behave closer to the regular editors? 【发布时间】:2011-01-09 06:59:23 【问题描述】:我在 Ubuntu 上使用 Emacs 23.1.1 和 Emacs starter kit。我主要在 lua 模式下工作。
有没有办法阻止 Emacs 对缩进如此聪明?我习惯了笨拙的编辑器,手动按下所有必需的键。
我想每个缩进使用两个空格,制表符到空格。
当我按下 RETURN 时,新行缩进必须与上一行匹配。
当我在前导空格上按 TAB 时,行内容必须缩进一个缩进单元。
当我在空行的开头按TAB时,光标必须向右移动一个缩进单位。
哦,我想在第 80th 列进行软换行,并在保存时修剪尾随空格。
更新:
(将其放在评论中,但需要格式化)
如果我使用 Thomas 的解决方案,RETURN 上的自动缩进是“固定的”,但 TAB 仍然会奇怪地缩进:
本地运行 = 函数(...) X"x" 标记在我键入第一行并按 RETURN、TAB 后光标出现的位置。
【问题讨论】:
为什么不使用其他编辑器?如果默认情况下没有执行您想要的操作,为什么要使用 emacs? 为什么不花点时间适应更智能的编辑器呢?让它做你想做的事情当然是可能的,但我发现 tabbing 行为是 emacs 开箱即用的事情之一。给它一点时间,并意识到它只是让你更容易做你想做的事情。 @Philip:因为我很好奇。 @Dustin:emacs 不符合我使用的编码指南。 Alexander,您可以调整 lua-specific 模式以满足您的编码标准。这不是你要求解决的问题。您的问题与缩进的距离无关,而是与它是否发生在特定位置有关。告诉 emacs 你想要缩进的位置,让它真正为你工作。 【参考方案1】:Emacs 有一个 modes 的概念,这意味着根据您正在编辑的文件类型,它会提供对该文件有用的特殊功能。每个缓冲区都有一个关联的主要模式和可选的一些次要模式。
缩进是通常与模式相关的事情之一。也就是说,您可能必须为每个主要模式单独配置缩进,因为否则当您加载新文件时,其关联的主要模式可能会覆盖您的缩进设置。不过,可以编写一个配置缩进的函数并设置 Emacs,以便在启动新的主要模式时调用该函数。
为了实现您想要的设置,您需要运行几行 elisp 代码。 (不幸的是,您对按 TAB 时会发生什么的描述遗漏了一些细节,我已经实现了下面我能想到的最简单的版本——如果它不是您想要的,当然可以更改。)
将以下代码放入您的主目录 (~
) 中名为 .emacs
的文件中:
(setq-default indent-tabs-mode nil) ; use spaces for indentation
(defvar my-indentation-width 2
"The number of spaces I prefer for line indentation.")
(defun my-enter ()
"Inserts a newline character then indents the new line just
like the previous line"
(interactive)
(newline)
(indent-relative-maybe))
(defun my-indent ()
"When point is on leading white-space of a non-empty line, the
line is indented `my-indentation-width' spaces. If point is at
the beginning of an empty line, inserts `my-indentation-width'
spaces."
(interactive)
(insert (make-string my-indentation-width ? )))
(defun my-indentation-setup ()
"Binds RETURN to the function `my-enter' and TAB to call
`my-indent'"
(local-set-key "\r" 'my-enter)
(setq indent-line-function 'my-indent))
(defun delete-trailing-whitespace-and-blank-lines ()
"Deletes all whitespace at the end of a buffer (or, rather, a
buffer's accessible portion, see `Narrowing'), including blank
lines."
(interactive)
(let ((point (point)))
(delete-trailing-whitespace)
(goto-char (point-max))
(delete-blank-lines)
(goto-char (min point (point-max)))))
;; make sure trailing whitespace is removed every time a buffer is saved.
(add-hook 'before-save-hook 'delete-trailing-whitespace-and-blank-lines)
;; globally install my indentation setup
(global-set-key "\r" 'my-enter)
(setq indent-line-function 'my-indent)
;; also override key setting of major-modes, if any
(add-hook 'after-change-major-mode-hook 'my-indentation-setup)
这在 Emacs 23 中对我有用,尽管我可能错过了一些边缘情况。然而,这些变化是如此根本,以至于我预测你迟早会遇到不兼容的一些主要模式,他们希望缩进能够工作,他们设置了它。如果您真的想进入 Emacs,那么将您从其他编辑器继承的习惯调整为 Emacs 的工作方式是值得的。
对于软自动换行,有一个名为“longlines”的次要模式,您可以从这里下载:http://www.emacswiki.org/cgi-bin/emacs/download/longlines.el我没有使用它,所以我无法告诉你它的效果如何。
【讨论】:
谢谢。关于适应习惯:我可以这样做,但是 emacs 缩进的方式(在 lua 模式下)与我的编码指南不兼容。我可能应该为此提出一个新问题。 为什么它不起作用,请参阅此处的讨论:***.com/questions/4643206/…【参考方案2】:修复 TAB 和 RETURN:
(global-set-key "\t" 'self-insert-command)
(global-set-key "\r" 'newline-and-indent)
填充列(没试过):说ESC x customize-var,输入fill-column,设置为80。
【讨论】:
@Alexander:将这两行放在~/.emacs
中(即您的主目录中名为.emacs
的文件),放在所有括号之外以确保安全。
请注意,全局键绑定可以被主要模式的本地键映射覆盖,而这两者都可以被次要模式的本地键映射覆盖。因此,如果任何活动模式绑定了这些键,上述将不再起作用。您可以定义自己的全局次要模式,以强制您的自定义键绑定优先于其他所有内容。见:***.com/questions/683425/…
@ShreevatsaR:谢谢。由于我使用 emacs 入门套件,我想,存储这些的正确位置是 ~/.emacs.d/<my-username>.el
。以上是关于如何使 emacs 的行为更接近常规编辑器?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Emacs 俄罗斯方块变得更难 | Linux 中国