我cc-mode
在 Emacs 工作,我发现缩进非常烦人。
作为一个 VIM 用户,我已经习惯了更长的缩进,而且我可以随意地按标签键。
在 Emacs 中,我的 TAB 映射到goto-line
. 首先,哪个函数设计用于缩进当前行(或该点之后的内容)?indent-region
很烦人,因为您需要突出显示该区域。
其次,修复压痕的最佳方法是什么?
谢谢,
我cc-mode
在 Emacs 工作,我发现缩进非常烦人。
作为一个 VIM 用户,我已经习惯了更长的缩进,而且我可以随意地按标签键。
在 Emacs 中,我的 TAB 映射到goto-line
. 首先,哪个函数设计用于缩进当前行(或该点之后的内容)?indent-region
很烦人,因为您需要突出显示该区域。
其次,修复压痕的最佳方法是什么?
谢谢,
您可以查看当前正在使用哪种制表符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
。
更新:
其他人建议使用tab键插入\t
制表符,但请不要强行插入制表符!正如 StackOverflow 的一位创建者所说,“只有白痴才会使用制表符来格式化他们的代码”。现在这有点苛刻,但值得注意的是,即使是两个最大的竞争对手,谷歌和微软,也同意这一点(尽管他们默认推荐不同数量的空间)。
谷歌说:
仅使用空格,一次缩进 2 个空格。
微软说:
代码中不应使用制表符 (\0x09)。所有缩进都应使用 4 个空格字符。
此外,emacswiki 有一个关于Tabs are Evil的部分。
所以,去取消标签吧!
答案是:(setq-default c-basic-offset <value>)
我也喜欢 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 并正确复制/粘贴,您可能必须自己手动修复它。