我在Emacs的cc-mode
工作,我发现缩进非常烦人。
作为一名VIM用户,我已经习惯了更长时间的缩进,并且可以根据自己的需要随意选择标签。
在Emacs中,我的TAB映射到goto-line
。首先,哪个函数设计用于缩进当前行(或者点之后的内容)? indent-region
很烦人,因为您需要突出显示该区域。
第二,修复缩进的最佳方法是什么?
谢谢,
答案 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
的模板。
<强>更新强>
其他人建议使用标签键插入M-x c-add-style
标签字符,但请不要强制插入标签字符!正如StackOverflow的创建者之一所说"only a moron would use tabs to format their code"。现在这有点苛刻,但值得注意的是,即使是最强大的两个竞争对手Google和Microsoft也同意这一点(即使他们默认建议使用不同数量的空格)。
一次只使用空格,并一次缩进2个空格。
不应在代码中使用制表符(\ 0x09)。所有缩进 应该用4个空格字符来完成。
此外,emacswiki有一个关于Tabs are Evil的部分。
答案 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并正确复制/粘贴,您可能必须自己手动修复它。