首页 文章

Emacs缩进功能

提问于
浏览
4

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

作为一个VIM用户,我几乎习惯了更长的缩进,以及尽可能多地按Tab键选项卡 .

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

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

谢谢,

3 回答

  • -2

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

    变量c-basic-offset控制cc-mode中的标签,其默认值为 set-from-style ,这意味着标签将继承自您使用 M-x set-c-style 设置的C样式,这将允许您从一组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 - 在埃里克奥尔曼之后也被称为“奥尔曼风格” .

    • 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-mode时,c-default-style的默认值将安装此样式 .

    • user - 这是您创建的特殊样式 . 它由所有样式变量的出厂默认值组成,这些变量由您使用Customization界面进行的自定义修改,或者通过在.emacs文件的顶层编写setqs和c-set-offsets来修改(请参阅Config Basics) . 样式系统在初始化时创建此样式,之后不会对其进行修改 .

    UPDATE:

    其他人建议使用tab键插入 \t 制表符,但请 don't 强制插入制表符!正如StackOverflow的创建者之一所说"only a moron would use tabs to format their code" . 现在's a bit harsh, but it'值得注意的是,即使是两个最大的竞争对手GoogleMicrosoft也同意这一点(即使他们默认建议使用不同数量的空格) .

    Google says

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

    Microsoft says

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

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

    So, go forth and untabify

  • 8

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

  • 0

    我也喜欢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并正确复制/粘贴,您可能必须自己手动修复它 .

相关问题