2012-03-22 80 views
4

我在Emacs的cc-mode中工作,我发现缩进非常非常恼人。Emacs缩进功能

作为一名VIM用户,我非常习惯更长的缩进,以及尽可能多地按下Tab键以实现标签的奢华。

在Emacs中,我的TAB映射到goto-line。首先,哪个函数是为了缩进当前行而设计的(或者是什么点)?由于您需要突出显示该区域,因此很烦人。

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

谢谢

+1

正常情况下TAB被绑定到缩进当前行的c-indent-line-or-region;它可以在你陈述的时候多次命中(只有第一个有效)。您是否使用重新绑定TAB键的init文件?请注意,c-c,c-q缩进了当前的功能。另外alt-x,describe-bindings显示了当前的模式键绑定。 – 2012-03-23 02:00:46

回答

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设置可以让你从一组built-in styles选择继承(见下文)或者你可以create your own 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 style”。
  • whitesmith - 通过与早期商业C编译器Whitesmiths C一起提供的示例进行推广。
  • stroustrup - C++代码的经典Stroustrup风格。
  • ellemtel - “C++编程规则和建议”中定义的流行C++编码标准,Erik Nyquist和Mats Henricson,Ellemtel^1。
  • linux - 针对Linux(内核)的C编码标准。
  • python - Python扩展模块的C编码标准^ 2。
  • java - 编辑Java代码的风格。请注意,当您输入java-mode时,c-default-style的默认值会安装此样式。
  • awk - 编辑AWK代码的样式。请注意,当您输入awk模式时,c-default-style的默认值会安装此样式。
  • 用户 - 这是您创建的特殊风格。它由所有样式变量的出厂默认值组成,您可以使用自定义界面进行自定义修改,也可以在您的.emacs文件顶层编写setqs和c-set-offset(请参阅“配置基础”)。样式系统创建此样式作为其初始化的一部分,并且之后不进行修改。

UPDATE:

也有人建议使用标签钥匙插入\t制表符,但请不要制表符力插入!作为StackOverflow的创建者之一说"only a moron would use tabs to format their code"。现在这有些苛刻,但值得注意的是,即使两个最大的对手GoogleMicrosoft也同意这一点(即使他们默认推荐不同数量的空间)。

Google says

仅使用空间,并且每次缩进2个空格。

Microsoft says

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

另外,emacswiki在Tabs are Evil上有一节。

So, go forth and untabify

0

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

-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键纯粹是要插入一个制表符,按进入副本从当前行的确切前导空格(空格或制表符)到新行,并且这些模式下的所有特殊凹痕行为都被禁用。如果您使用其他语言,您可能需要扩展/修改上述内容以添加钩子。

注意:在上面,大多数引号中的空格实际上是文字标签。如果它不能通过SO并复制/粘贴,你可能需要自己手动修复它。

+0

这听起来不错!但在使用它之前,我不明白你的最后一张纸条。在我真正使用它之前,请您解释一下吗?此外,这是否保持'setq-default c-basic-offset'调用的大小为4的缩进?大括号怎么样?这是否处理他们? – darksky 2012-03-23 01:47:31

+0

此代码禁用* all *自动缩进,但复制前一行的前导空白。您必须按下标签或空格键才能获得所需的缩进。我的注意事项是,不是使用'\ t'或任何制表符的转义符,我在上面的代码中编写了文字标签(在引号内),我不确定它们是否能够在复制和粘贴后继续存在。 .. – 2012-03-23 02:39:18

+0

@R ..请不要强制插入制表符!正如StackOverflow的创建者之一所说[“只有白痴才会使用制表符来格式化他们的代码”](http://www.codinghorror.com/blog/2009/04/death-to-the-space-infidels.html )。现在这有点苛刻,但值得注意的是,即使是两个最大的竞争对手[Google](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Spaces_vs._Tabs)和[Microsoft] (http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx),就这一点达成一致(即使他们默认推荐不同数量的空格)。 – aculich 2012-03-23 14:46:20