类似于vim中的paste-mode,Emacs有哪些命令?

29

当我试图从浏览器复制代码到Emacs中时,它会自动缩进代码,有没有一种方式可以像Vim中的:set paste命令一样暂时停止Emacs自动缩进?


5
你是将内容粘贴到终端中吗?如果你是在GUI Emacs中进行粘贴,那么这种情况就不应该出现,因为它可以“直接”获取粘贴的内容。但如果你是在终端中进行粘贴,那么实际上等同于逐个输入所有字符。 - ShreevatsaR
1
这种情况是在所有模式/缓冲区中都发生吗?还是只有某些情况下会出现?您是否尝试过在启动emacs时不使用自定义设置(例如emacs -q)并将其粘贴到Emacs中? - Trey Jackson
不知道有“粘贴”这个功能,谢谢! - andrewdotn
2
前缀 C-u C-y 应该不带缩进地粘贴。在 Emacs 25 中对我有效。 - 4e6
@4e6 为什么你把这个作为注释放进来了?这是一个有效的答案,比 Jouni K. Seppänen 的回答更容易理解,我第一次阅读时错过了它。 - Bae
5个回答

39

使用emacs24最简单的方法是:

M-x electric-indent-mode RET

这会禁用自动缩进。

粘贴您的内容。

重新启用

M-x electric-indent-mode RET

或者只需键入M-x UP-Arrow ;-)


我希望能够添加一个钩子,这样当我粘贴时,它会自动禁用然后重新启用。有人有什么想法吗? - mattsilver
我认为你可以通过拥有自己的键绑定来覆盖C-c并调用一个函数来实现这一点,该函数会调用CUA或其他https://www.emacswiki.org/emacs/CuaMode中的粘贴。 - Maresh

14

切换到*scratch*缓冲区(或者切换到一些不存在的缓冲区;它将处于基本模式,除非您已经配置它进行自动缩进,否则不应该进行任何自动缩进),按下C-SPC开始选定区域,粘贴您的文本,按下C-w在Emacs中剪切它,切换回您原来的缓冲区,按下C-y粘贴。


这是一个不错的解决方法,虽然并不完全相同。例如,我注意到当在终端中粘贴带有笑脸符号(:))的文本时,仍会出现括号不匹配的警告。(在基于终端的Emacs实例中)有一种“模式”(使用该术语非常宽泛),可以关闭所有这些东西(因为它们可能会使粘贴需要很长时间,如果是大块文本)。尽管如此,至少可以解决某些方面的问题,并且显然解决了最初提问者的主要问题。 - lindes
这对许多输入无效。原因是当您粘贴Windows / DOS编码的文本时,\r\n会强制出现一个制表符。如果可以,请在Windows上将文件切换为Unix行尾,并停止此问题。 - easytiger
将内容粘贴到 Scratch 缓冲区会删除所有缩进。我想保留原始复制文本中的缩进。禁用 electric-indent-mode 的解决方案可行。 - ishmael
@ishmael “scratch”缓冲区默认为Lisp交互模式。通过手动更改,可使用“M-x fundamental-mode”。 - Bae
这似乎是我唯一有效的解决方案。 - user989762

5
一个快速的Python解决方法是将文本粘贴到""" ... """块中。

5

在 Emacs 25 中,带前缀的 yank 命令 C-uC-y 可以不带缩进地粘贴。


@Bae 很高兴我的评论有所帮助,因此我从中制作了一个答案。 - 4e6
1
@4e6,两年后我在谷歌上搜索同样的问题,仍然找不到答案 :) 至少现在我已经点赞了它,所以两年后我还能找到它... - Bae

0

你可以尝试

c-toggle-syntactic-indentation

c-toggle-syntactic-indentation - PanCrit
感谢您发现了这个笔误。已经修复。 - mamboking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接