完全禁用所有自动缩进


18

如何完全禁用Emacs中的所有自动缩进?我需要至少在基本模式下将其禁用,但是我可以在当前会话中全局禁用它。

在声明重复项之前,请阅读此问题的其余部分。 我发现的所有其他答案都是针对性更强的禁用缩进。我真的想完全禁用整个会话的所有自动缩进。

设置electric-layout-modenil无效。

细节

有时,我喜欢用Windows ASCII文本编辑器编写大型的Git提交消息。这些消息经常包含项目符号列表,代码块或其他在我的源文档中的准确格式有意义的内容。我的代码库是在Linux上的,并且我使用纯文本SSH客户端连接到该框。当Git进入Emacs来编辑提交消息时,我希望能够将源提交消息复制到Windows剪贴板,然后使用Windows粘贴命令将其粘贴。从Emacs的角度来看,我键入的是Windows文本文件中找到的内容。不幸的是,当Emacs看到缩进线时,它会添加自己的自动缩进,因此我沿着缓冲区的左边缘得到了这个巨大的空白三角形。

我正在使用GNU Emacs 24.3.1。

解决方法

我当前的解决方法是将Windows文本文件传输到由Linux主机安装的文件系统,将文件加载到Emacs,然后使用kill和yank传输内容。这有点笨拙。

这是一个示例文本块:

a

  - b
    c
    d

通过MSWin粘贴将其粘贴到Emacs-under-ssh时,它的显示方式如下:

a

  - b
      c
          d

如果我C-h l在粘贴后按,这就是我所看到的。请注意,换行是使用C-j而不是输入的RET

a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l

因为一些缩进相关变量被缓冲的地方,那里将需要的东西,主要的模式钩后运行-例如,也许 [?] hack-local-variables-hook-基本上撤消什么其他主要-模式设定为自己的一部分标准初始化。 fundamental-mode只是其中的一个小功能simple.el-即,(kill-all-local-variables) (run-mode-hooks)M-x find-function RET fundamental-mode RET-您可以根据需要修改/创建自己的;但是,如果您更改名称,则某些功能将不会使用它-因此请考虑保留相同的名称。
法律列表


emacs是否与vim等效:set paste?基本上就是说“不要以任何方式触摸粘贴的文本”。其中还包括自动缩进。
Omair Majid

Answers:


21

Emacs≤24.3

默认情况下,按RET不会缩进(某些编程模式除外,在某些编程模式下,您需要检查特定于模式的配置,例如“电”设置)。

当剪贴板内容包含换行符(由换行符表示)时,Unix终端通常会粘贴回车符。在Emacs中,回车符看起来像RET键(实际上RET 回车符),而换行符看起来像(is)C-j

但是,在您的情况下,粘贴换行符会导致C-j在Emacs中将其绑定到command newline-and-indent。顾名思义,此命令缩进。我不知道PuTTY是否有可以更改的设置。如果您想在Emacs端解决此问题,则有一个简单的解决方法,我认为您不介意:绑定C-jnewline(与相同RET)。

(global-set-key "\C-j" 'newline)

Emacs≥24.4

在Emacs 24.4中,默认情况会启用电子压痕模式。这是全局次要模式,因此您可以在任何地方通过调用将其关闭(electric-indent-mode 0),也可以使用进行交互切换M-x electric-indent-mode RET

您可以在手册中找到此信息,也可以通过按Return(按C-h k RET)查看所调用命令的文档。

您可以使用在特定的缓冲区中将其打开electric-indent-local-mode。某些编程模式(尤其是第三方编程模式)可能具有其自己的自动缩进功能,这些功能不遵循Electric Indent模式的设置。


electric-indent-mode默认情况下处于禁用状态(这与您所说的一致,因为我使用的是Emacs 24.3.1)。开启和关闭它无济于事。 electric-indent-local-mode无法通过来使用M-x。帮助上RET提到三个设置:use-hard-newlinesauto-fill-function,和fill-column。切换或通过修改这些M-x use-hard-linesM-x auto-fill-modeM-x set-fill-column RET 0 RET没有帮助。
福兹先生15年

@MrFooz哦,很抱歉,您的问题中我没有关注Emacs版本。但是,我想知道为什么您会自动缩进。嗯 会自动缩进emacs -q吗?请将一些包含换行符的简短文本(例如foonewline bar)粘贴到Emacs中,然后按C-h l,您会看到什么?… f o o RET b a r… f o o C-j b a r… f o o RET C-j bar或其他?您在哪个终端上运行SSH客户端?
吉尔(Gilles)'所以

我已经在原始帖子中添加了示例文字说明。添加-q没有帮助(例如emacs -q -nw --no-desktop)。我看到的C-j不是RET。我正在使用PuTTY 0.63作为SSH客户端。我看到相同的行为TERM设置为screenxterm
Fooz先生,2015年

@MrFooz好吧,由于PuTTY是发送LF而不是CR,因此您需要指示Emacs不要缩进LF。全局关闭很容易,我已经编辑了答案。
吉尔斯(Gilles)'所以别再邪恶了'

谢谢,global-set-key黑客解决了这个问题。我将找出一种方法来设置EDITOR别名,以便在启动Git提交消息时在启动时自动调用它。粘贴换行符而不是回车符是因为我已经将自己喜欢的Windows文本编辑器配置为使用UNIX样式的行尾而不是Windows的行尾。
Fooz先生,2015年

1

您也可以尝试使用括号粘贴模式。这是终端仿真器的功能(在本例中为PuTTY,版本为0.63及更高版本),该功能使用转义序列表示用户正在粘贴内容,然后在粘贴结束时再次发出信号。bracketed-paste您可以安装一个名为Emacs的软件包,它可以使Emacs识别转义序列并在粘贴期间过渡到更安全的键盘映射。这不仅可以防止缩进,还可以防止恶意粘贴使用来在emacs会话中运行命令M-x

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.