4

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

作为一个 VIM 用户,我已经习惯了更长的缩进,而且我可以随意地按标签键。

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

其次,修复压痕的最佳方法是什么?

谢谢,

4

3 回答 3

8

您可以查看当前正在使用哪种制表符M-x describe-variable RET c-indentation-style(但正如文档所述,不要直接设置此变量,而是使用M-x c-set-style)。

变量c-basic-offset是控制选项卡的cc-mode,它的默认值是set-from-style这意味着选项卡将从您设置的 C 样式继承,M-x set-c-style这将允许您从一组内置样式中进行选择(见下文),或者您可以创建您的自己的风格。您可以查看样式是如何定义的M-x describe-variable RET c-style-alist,然后您可以将其中之一用作模板M-x c-add-style

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

更新:

其他人建议使用tab键插入\t制表符,但请不要强行插入制表符!正如 StackOverflow 的一位创建者所说,“只有白痴才会使用制表符来格式化他们的代码”。现在这有点苛刻,但值得注意的是,即使是两个最大的竞争对手,谷歌微软,也同意这一点(尽管他们默认推荐不同数量的空间)。

谷歌说

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

微软说

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

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

所以,去取消标签吧!

于 2012-03-22T22:22:54.630 回答
0

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

于 2012-03-22T22:00:23.150 回答
-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 "    "))

结果行为:制表键纯粹是要插入的制表符,按回车键会将当前行的确切前导空格(空格或制表符)复制到新行,并且这些模式下的所有特殊缩进行为都被禁用。如果您使用其他语言,您可能需要扩展/调整上面的内容来为它们添加钩子。

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

于 2012-03-23T01:17:20.093 回答