如何使 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" 标记在我键入第一行并按 RETURNTAB 后光标出现的位置。

【问题讨论】:

为什么不使用其他编辑器?如果默认情况下没有执行您想要的操作,为什么要使用 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 再次火起来

如何让 Emacs 俄罗斯方块变得更难 | Linux 中国

Emacs:删除空格或单词

使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件

21天学会 Emacs 之第 18 天

Vim 和 Emacs 文本编辑器:你更喜欢哪个?