c++-mode 缩进风格

我当前项目的 C++ 代码缩进风格比较独特,以如下片段为例:

  return cache->get_extent_if_cached(t, addr, type
  ).si_then([this, FNAME, &t, type, addr, laddr, len](auto extent)
  // 上一行的 ) 保持要和当前同一级缩进保持一致
            -> get_extent_if_live_ret {
    if (extent) {
      return get_extent_if_live_ret (
        interruptible::ready_future_marker{},
        extent);
      // 函数调用的参数数量较多时换行,缩进一级
    }

现在用 emacs 写代码时的行为:

  return cache->get_extent_if_cached(t, addr, type
                                    ) // 回车后自动和括号对齐

  // 自动缩进问题:
      return get_extent_if_live_ret (
        interruptible::ready_future_marker{}
  // 键入 , 后自动缩进
      return get_extent_if_live_ret (
                                     interruptible::ready_future_marker{},

现在我想取消键入 , () :: 产生的自动缩进;回车、tab只缩进一级(两个空格)应该设置什么选项?

这是我开启的 minor mode:

Enabled minor modes: Abbrev Auto-Composition Auto-Compression
Auto-Encryption Company Company-Posframe Company-Prescient Eldoc
Electric-Indent File-Name-Shadow Font-Lock Gcmh Global-Auto-Revert
Global-Company Global-Eldoc Global-Font-Lock Global-Git-Commit
Global-Hl-Todo Hl-Todo Indent-Tabs Line-Number Lsp Lsp-Completion
Lsp-Diagnostics Lsp-Managed Lsp-Modeline-Workspace-Status Lsp-Ui
Marginalia Meow Meow-Global Meow-Normal Persp Prescient-Persist
Savehist Shell-Dirtrack Show-Paren Show-Smartparens
Show-Smartparens-Global Smartparens Smartparens-Global
Straight-Package-Neutering Straight-Use-Package Tooltip Transient-Mark
Tree-Sitter Tree-Sitter-Hl Vertico Which-Key Windmove
1 个赞

看起来像是google style, 先按google的格式化看看,和你以前代码有多少区别,稍微微调下吧

1 个赞

别人不用 format 这边单独用了也不合适。。

缩进这么奇怪主要是因为 future 全是 return。印象中 google style 没有类似的规定。

{
  return seastar::do_with(
    bufferlist(),
    [ctx, obj_offset, len](auto &ret) {
      return with_object_data(
        ctx,
        [ctx, obj_offset, len, &ret](const auto &object_data) {
          LOG_PREFIX(ObjectDataHandler::read);
          laddr_t loffset =
            object_data.get_reserved_data_base() + obj_offset;
          return ctx.tm.get_pins(
            ctx.t,
            loffset,
            len
          ).si_then([ctx, loffset, len, &ret](auto _pins) {
            return seastar::do_with(
              std::move(_pins),
              loffset,
              [ctx, loffset, len, &ret](auto &pins, auto &current) {
                return trans_intr::do_for_each(
1 个赞

简单调了调,应该是 electric indent 控制的自动缩进,cc mode 也有些变量。

如果使用 smartparens, 可以用下面的代码实现回车的的换行缩进

(use-package smartparens
  :init
  (smartparens-global-mode t)
  :config
    (sp-with-modes
        '(c++-mode objc-mode c-mode)
      (sp-local-pair "{" nil :post-handlers '(:add ("||\n[i]" "RET")))))

多人共同编辑的项目,最好大家约定统一代码规范,否则后面很难维护,可以提出大家一起改下

积重难返了 :joy: 整个项目 format 提交历史就乱掉了

确实,我一直想统一项目的 format,可惜一改 git blame 就失效。

1 个赞

关掉 electric indent ,我看看 smartparens 的文档应该就能解决了

我这边甚至 tab space 混用。。vscode缩进都显示不正确,只能 vim/emacs :rofl:

vscode 可以设定 tab 显示大小。

tab宽度8,缩进是 2 。vscode 不区分 tab 和 indent 。把 tab 设置为 8 显示正常但是回车默认 8 个缩进。 tab 设置为 2 回车缩进正确但是显示就错位了。

16年就有人提过这个但是一直没解决 :rofl: