如何让Emacs自动缩进我的C代码?

22

我刚开始接触Emacs,但我很不满意它在按回车键时不自动缩进。我知道如果我按C-j,它会自动缩进,但我无法养成这个习惯。我只能按回车键,但每次都需要重新缩进让我很烦恼。

我进入选项并找到了C模式钩子、C++模式钩子等--它们定义了两个按键映射(10和13,而我还记得0A和0D是CR / LF,因为我在汇编语言中经常使用它们)--我想一个说“(lambda nil (define-key lisp-mode-map [13] (quote newline-and-indent))”,另一个一样但是用(quote newline)代替,所以我把-and-indent放在最后,认为它会起作用。

但是它没有起作用:我设置并保存了它,尝试了,但没有成功。重启Emacs,仍然没有成功。如何让它缩进我的代码?这太疯狂了,Emacs要求你具备Lisp的学位才能为你的基本需求进行配置。

另外,作为一个旁问:如何从剪贴板复制和粘贴?杀死/粘贴非常方便,但我讨厌每次想将某些内容粘贴到其他地方时都要进入编辑->复制。

-- 编辑 --

好的,我把以下行放入了我的.emacs文件中,它能够使用:

(add-hook 'c-mode-common-hook (lambda ()
      (local-set-key (kbd "RET") 'newline-and-indent)))

谢谢帮助。


4
为什么要抨击“Lisp学位”? 在Emacs中,你可以选择配置每一项(!)。考虑到这一点,在其时期内选择Lisp是一个非常好的决策。根据时间不同,当Emacs被发明时。现代的IDE会指示你可以更改哪些内容以及不可以更改哪些内容,因此你可能会决定自己的工作方式... - Peter Miehle
1
夸张地表达我的沮丧,我知道Emacs可以使用Lisp(或者Elisp或者其他什么)进行编程,但我没有预料到这是一个必要条件——我以为在窗口模式下可能会有一些简单设置的前端界面。比如按下回车键时自动缩进。 - Carson Myers
6
为什么发牢骚?Peter,你是认真地为elisp作为配置机制进行辩护吗?嘿嘿! - Cheeso
2
Elisp比大多数IDE和编辑器提供的配置机制更加实用。使用诸如M-x apropros之类的功能,比试图搜索大量对话框要容易得多,可以更轻松地找出如何配置和让其执行所需操作。 - Travis B. Hartwell
2
@TravisB.Hartwell 不要啊... 更可搜索并不意味着更易使用。如何在Emacs中更改选项卡宽度?您可以在.emacs文件中编写(setq tab-width 8)。换句话说,我需要知道命令是“setq”而不是“set”,我需要知道它是tab-width而不是“tab-size”,我需要知道在lisp中设置变量的语法,以及我需要了解应该在哪里编写这个.emacs文件。在IDE中做同样的事情需要知道什么?什么都不需要。我只需四处查找,直到找到类别逻辑下的下拉框,例如“编辑器”之类的东西。 - EpsilonVector
@EpsilonVector “Preferences > Editing > Indent > Standard Indent” 不够好吗? - Blaz
7个回答

19
我在我的~/.emacs文件中将回车键设置为全局换行和缩进:
(global-set-key "\C-m" 'newline-and-indent)

对我来说可行。


1
我把这个提升了,因为被接受的答案对我不起作用,而这个可以。我不知道是因为我使用的是Emacs 23还是其他原因,但是使用(kbd "RET")总是会得到“无效函数”。 - Matthew Talbert

17

请查看emacswiki - 自动缩进

如建议一样,在您的 .emacs 文件中添加以下代码

(defun set-newline-and-indent ()
  (local-set-key (kbd "RET") 'newline-and-indent))
(add-hook 'c-mode-hook 'set-newline-and-indent)

你可以定制变量C的默认风格。在你的emacs中,点击选项->定制Emacs->特定选项,然后输入c-default-style并设置为你选择的风格。这样做,你就不需要按TAB键了。从行首开始输入,当你按下“;”时,它将自动缩进。

希望这能帮到你。


c-default-style选项给了我一个语言列表,有复选框,在语言名称后面还有一次名称的输入... 我不明白这是如何使CR调用newline-and-indent。 - Carson Myers
那个变量设置了缩进风格;CC Mode 用于多种类似 C 的语言,您可以为每种语言设置缩进风格。请阅读友好的手册以了解这些风格是什么。 - Jouni K. Seppänen
@RNanthak不行,因为这个钩子是特定于c-mode的。为了使其适用于c ++,请将c-mode-hook替换为c ++ -mode-hook或c-mode-common-hook以设置所有从c继承的语言。有关详细信息,请参阅-https://www.gnu.org/software/emacs/manual/html_node/ccmode/CC-Hooks.html - Amol Gawai

11

如果您想缩进整个C/C++文件,则只需执行以下操作:

  1. 选中全部内容:CTRL-x h
  2. 按TAB键

顺便说一句,这也适用于XML、Python代码和其他类型的文件。


6
除了其他建议外,尝试使用C-c C-a切换自动换行功能,这样您的模式行将显示为C/la。然后,大多数情况下您甚至不需要按Enter键;相反,当您键入分号或大括号时,会插入新行并缩进您的代码。有时您确实需要按Enter键,但如果您只是开始键入下一行,您可能会注意到在键入某些标点符号时它会被正确缩进。
要开始您的"Lisp学位",请键入C-h i以查看Info浏览器,并转到"CC Mode"节点(它与Emacs节点分开;键入d以查找CC Mode)。

1

尝试使用 [enter]、(kbd "enter") 或 (read-kbd-macro "enter"),它们都有微妙的不同;)

此外,对我来说,复制/粘贴只是有效的。你可以尝试运行emacs -q,看看是否有效?如果有效,可能是你的 .emacs 文件出了问题。

我也有:

(when window-system
  ;; use extended compound-text coding for X clipboard
  (set-selection-coding-system 'compound-text-with-extensions))

但那可能会做其他的事情 ;)


0

做这件事的简单方法是使用electric-indent-mode。如果你想手动启用它,只需执行以下操作:

M-x electric-indent-mode

为了使其自动启用,请在您的.emacs中输入以下内容:
(electric-indent-mode)

这将是Emacs 24.4的默认设置。


0

复制:移动到开头,CTRL+空格,移动到结尾,ALT+W

粘贴:CTRL+Y

在Unix系统中:左键复制,右键粘贴


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