自动缩进老是出问题

配置如下

(defun eye-setup-c++ ()
  (setq-default tab-width 4)
  (setq tab-width 4)
  ;; 用k&r风格经常会突然变成tab为5个空格长度,换成stroustrup
  (setq-default c-default-style "stroustrup")
  (setq c-default-style "stroustrup")
  ;; outline fold
  (outline-minor-mode 1)
  (setq outline-regexp "^class\\|^struct\\|^enum\\|^[a-zA-Z][a-zA-Z0-9 _&\*]+::")
  (build-command)
  (yas-minor-mode 1)
  (define-key c++-mode-map (kbd "<M-up>") 'beginning-of-defun)
  (define-key c++-mode-map (kbd "<M-down>") 'end-of-defun)
  (define-key c++-mode-map (kbd "<f5>") 'make-without-asking)
  )

(add-hook 'c++-mode-hook #'eye-setup-c++)
(add-hook 'c-mode-hook #'eye-setup-c++)

图片

c-default-style 原来是用的k&r,好不容易换成 stroustrup,稳定了一段时间,今天又出现这样的情况

你看看当前buffer中的值是多少

当前还是 stroustrup

每次缩进出问题后,都要revert-buffer一下,重新按tab或者重新输入,才正常。

可以参考一下我的配置,手工设置了 c-offset-alist

看看是否还有其他插件影响了缩进

光标处输入个字符,按tab,就是对应的锁进命令呢?

是手输,还是yas展开的?

在{的地方按tab呢?

提供一个思路参考:可以C-h,k 检查一下回车(RET)按键绑定的是哪个命令,也许是该命令配置中加了其他的indent。
我遇到过类似的情况,然后恢复回车为 newline ,缩进就好了。

C-h k RET 绑定的是newline没错

在 { 处按tab,也是前面缩进两个空格

在 { 的下一行输入字符,按tab,有缩进4个空格

用你这个配置可以了

我的设置,用了很久了

1, 默认开启 google-c-style

;;; google-c-style
(use-package google-c-style
  :after cc-mode
  :defer nil
  :config
  (defun my/google-c-style-c/c++-mode-hook()
    (c-toggle-auto-hungry-state 1)
    "because php-mode derived from c-mode, makesure major-mode is c-mode or c++-mode before apply google-c-style"
    (when (or (c-major-mode-is 'c-mode) (c-major-mode-is 'c++-mode))
      (google-set-c-style)
      (google-make-newline-indent)))
  (add-hook 'c-mode-common-hook 'my/google-c-style-c/c++-mode-hook))

2, 编辑别人的代码的时候手工开启dtrt-indent-mode,遵循当前代码缩进风格

3, 使用 format-all-mode 按项目的 .clang-format 设置统一代码风格

1 个赞

好,抽空试下

原来还有这样的包。你说的是下面的这个项目吗?

是的,除了像写 go 之类强制自动格式化的语言,dtrt-indent 还是很有用处的,毕竟真的不想因为改了几行代码结果由于自动格式化导致 git 的提交出现太多莫名其妙的改动。

1 个赞