Emacs缩进功能

时间:2012-03-22 20:55:52

标签: c emacs indentation cc-mode

我在Emacs的cc-mode工作,我发现缩进非常烦人。

作为一名VIM用户,我已经习惯了更长时间的缩进,并且可以根据自己的需要随意选择标签。

在Emacs中,我的TAB映射到goto-line。首先,哪个函数设计用于缩进当前行(或者点之后的内容)? indent-region很烦人,因为您需要突出显示该区域。

第二,修复缩进的最佳方法是什么?

谢谢,

3 个答案:

答案 0 :(得分:8)

您可以看到M-x describe-variable RET c-indentation-style当前使用的标签类型(但正如文档所述,请勿直接设置此变量,而是使用M-x c-set-style)。

变量c-basic-offset控制cc-mode中的标签,默认为set-from-style,这意味着标签将继承自您使用{{1}设置的C样式这将允许您从一组built-in styles(见下文)中进行选择,或者您可以create your own style。您可以看到如何使用M-x set-c-style定义样式,然后您可以将其中一个用作M-x describe-variable RET c-style-alist的模板。

  • gnu - 自由软件基金会为GNU程序中的C代码祝福的编码风格。
  • k& r - C代码的经典Kernighan和Ritchie风格。
  • bsd - 在Eric Allman之后也被称为“Allman风格”。
  • whitesmith - 通过早期商业C编译器Whitesmiths C附带的示例推广。
  • stroustrup - C ++代码的经典Stroustrup样式。
  • ellemtel - “C ++编程,规则和建议”中定义的流行C ++编码标准,Erik Nyquist和Mats Henricson,Ellemtel ^ 1。
  • linux - Linux(内核)的C编码标准。
  • python - Python扩展模块的编码标准^ 2。
  • java - 编辑Java代码的样式。请注意,当您输入java-mode时,c-default-style的默认值将安装此样式。
  • awk - 用于编辑AWK代码的样式。请注意,当您输入awk-mode时,c-default-style的默认值将安装此样式。
  • 用户 - 这是您创建的特殊样式。它由所有样式变量的出厂默认值组成,这些变量由您使用Customization界面进行的自定义修改,或者通过在.emacs文件的顶层编写setqs和c-set-offsets来修改(请参阅Config Basics)。样式系统在初始化时创建此样式,之后不会对其进行修改。

<强>更新

其他人建议使用标签键插入M-x c-add-style标签字符,但请不要强制插入标签字符!正如StackOverflow的创建者之一所说"only a moron would use tabs to format their code"。现在这有点苛刻,但值得注意的是,即使是最强大的两个竞争对手GoogleMicrosoft也同意这一点(即使他们默认建议使用不同数量的空格)。

Google says

  

一次只使用空格,并一次缩进2个空格。

Microsoft says

  

不应在代码中使用制表符(\ 0x09)。所有缩进   应该用4个空格字符来完成。

此外,emacswiki有一个关于Tabs are Evil的部分。

So, go forth and untabify

答案 1 :(得分:0)

答案是:(setq-default c-basic-offset <value>)

答案 2 :(得分:-2)

我也喜欢emacs,但无法忍受为我管理标签的尝试。所以我在.emacs中使用了以下内容:

(global-set-key "\r" 'newline-and-indent)
(global-set-key "\C-m" 'newline-and-indent)
(global-set-key "\C-j" 'newline)

(defalias 'backward-delete-char-untabify 'backward-delete-char)
(defun indent-according-to-mode () (interactive)
  (save-excursion
    (goto-char (- (line-beginning-position) 1))
    (search-backward-regexp "^[         ]*")
  )
  (if (eq (point) (line-beginning-position))
    (insert (match-string 0))
    (save-excursion
      (goto-char (line-beginning-position))
      (insert (match-string 0))
    )
  )
)

(defun newline-and-indent () (interactive) (newline) (indent-according-to-mode))
(defun lisp-indent-line () (interactive) (insert "      "))
; Is there a way to fix this without a hook?
(defun my-c-hook ()
  (setq c-electric-flag nil)
  (defun c-indent-command (n) (interactive "*") (insert "       ")))
(add-hook 'c-mode-common-hook 'my-c-hook)
(defun my-perl-hook ()
  (defun perl-electric-terminator () (interactive "*") (self-insert-command 1))
  (defun perl-indent-command () (interactive "*") (insert "     ")))
(add-hook 'perl-mode-hook 'my-perl-hook)
(defun indent-for-tab-command () (interactive "*") (insert "    "))

结果行为:tab键纯粹是要插入的制表符,按enter键将当前行的精确前导空格(空格或制表符)复制到新行,这些模式中的所有特殊缩进行为是禁用。如果您使用其他语言,则可能必须扩展/调整上述语言以为它们添加挂钩。

注意:在上面,引号中的大多数空格实际上是文字制表符。如果没有通过SO并正确复制/粘贴,您可能必须自己手动修复它。