emacs:类和结构的不同缩进

2023-11-21

我试图在 emacs 中实现以下缩进:

class A
{
    // I ALWAYS use access labels in classes

    public: // access-label
        int member; // inclass
};

struct B
{
    // I NEVER use access labels in structs

    int member; // inclass
};

但是使用以下配置文件...

(defun my-cpp-mode ()
  "My C++ mode"
  (c++-mode)
  (c-set-style "K&R")
  (setq c-basic-offset 4)
  (c-set-offset 'access-label '-)
  (c-set-offset 'inclass '++)
  ;; ...
  (setq mode-name "My C++")
)
(add-to-list 'auto-mode-alist '("\\.[ch]p?p?\\'" . my-cpp-mode))

...我只实现:

class A
{
    public: // access-label
        int member; // inclass
};

struct B
{
        // this indentation is too long
        int member; // inclass
};

当然那是因为:

  • 对于缩进,“class”和“struct”之间显然没有区别(都是“inclass”),
  • “类内”内容的缩进不取决于访问标签是否存在。

知道如何使类内内容的缩进依赖于类/结构或访问标签的存在吗?


新答案

我遇到了您在问题中提到的确切要求。 我必须根据新项目的编码风格设置缩进。经过一番研究后,我使用以下方法实现了这一点自定义阵容功能.

修改你的my-cpp-mode看起来像这样:

(defun my-c-lineup-inclass (langelem)
  (let ((inclass (assoc 'inclass c-syntactic-context)))
    (save-excursion
      (goto-char (c-langelem-pos inclass))
      (if (or (looking-at "struct")
              (looking-at "typedef struct"))
          '+
        '++))))

(defun my-cpp-mode ()
  "My C++ mode"
  (c++-mode)
  (c-set-style "K&R")
  (setq c-basic-offset 4)
  (c-set-offset 'access-label '-)
  (c-set-offset 'inclass 'my-c-lineup-inclass)
  ;; ...
  (setq mode-name "My C++")
)

如果这个答案可以接受,我将继续删除旧答案。

旧答案

根据您想要实现的目标,我可以建议采用不同的方法吗?您似乎希望访问标签处于与类和类成员不同的缩进级别。使用以下方法来实现这一目标。

(access-label . /)

来自 Emacs 文档:

如果 OFFSET 是符号之一+',-', ++',--', *', or/' 然后将“c-basic-offset”的正倍数或负倍数添加到 基础压痕;分别为 1、-1、2、-2、0.5 和 -0.5。

这是我定义的自定义样式之一的片段。

(c-add-style
 "xyz-style"
 '((indent-tabs-mode . nil)
   (fill-column . 75)
   (c-basic-offset . 4)
   (c-offsets-alist . (
                       (access-label . /)
                       (inextern-lang . 0)
                       (innamespace . 0)
                       (member-init-intro . ++)
                       ))))

With c-basic-offset设置为 4,(access-label . /)向访问标签添加 2 个空格的负缩进。这是我在示例代码上的缩进模式的实际结果。

class A
{
    // I ALWAYS use access labels in classes

  public: // access-label
    int member; // inclass
};

struct B
{
    // I NEVER use access labels in structs

    int member; // inclass
};

我推荐这种模式,因为成员变量/结构成员的缩进级别是一致的。 FWIW,谷歌C风格遵循相同的方法。

据我所知,人们无法区分类成员或结构成员(inclass语法元素)。您可以使用M-x c-syntactic-information-on-region对一个区域进行句法分析。对您的示例进行的一项此类分析得出以下结果。从输出来看,如果您位于类中或结构中,则没有什么可区分的。

class A                                 // ((topmost-intro 1))
{                                       // ((class-open 1))
                                        // ((inclass 64) (topmost-intro 64) (comment-intro))I ALWAYS use access labels in classes
                                        // ((inclass 64) (topmost-intro 64))
  public:                               // ((inclass 64) (access-label 64))access-label
    int member;                         // ((inclass 64) (topmost-intro 64))inclass
};                                      // ((class-close 1))
                                        // ((topmost-intro 503))
struct B                                // ((topmost-intro 503))
{                                       // ((class-open 629))
                                        // ((inclass 694) (topmost-intro 694) (comment-intro))I NEVER use access labels in structs
                                        // ((inclass 694) (topmost-intro 694))
    int member;                         // ((inclass 694) (topmost-intro 694))inclass
};                                      // ((class-close 629))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

emacs:类和结构的不同缩进 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 使用 VBA 将单元格值范围分配给变量数组

    我对 VBA 很陌生 请耐心等待 我想为一组变量分配一组范围的值 即 运行一段简短的代码以简化以下操作 Dim Sample 1 as string Sample1 activeworksheet range C17 value Dim S
  • 创建一个 chrome 扩展,它获取页面上突出显示的文本并将其插入到 popup.html 中的文本区域中

    我花了几个小时在网上搜索解决方案 我想做的是将页面上突出显示的文本传输到 chrome 扩展的 popup html 中的文本区域 我想知道是否有人可以向我提供可以执行此操作的扩展的建议源代码 这是我看过的最相关的线程 我认为这是最有帮助的
  • 有什么方法可以用来增加字母?

    有谁知道 Javascript 库 例如 underscore jQuery MooTools 等 提供了递增字母的方法 我希望能够做类似的事情 a would return b 简单 直接的解决方案 function nextChar c
  • boost中path::string()和path::generic_string()有什么区别?

    有什么区别boost path string and boost path generic string 什么时候应该使用它们 这在文档 你只需要阅读文档获得知识和理解 请从现在开始养成这样做的习惯 升压 路径 字符串 返回一个std st
  • 如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?

    这就是源代码 我需要检测 ID 请参阅下面两个查询之间的标记位置 connection Yii app gt db transaction connection gt beginTransaction try q INSERT INTO s
  • 如何检查 UITextField 的文本是否是有效的电子邮件?

    我有一个带有 3 个 UITextFields 用户名 电子邮件和密码 的视图控制器 我需要一种方法 首先检查所有字段中是否都有文本 然后检查电子邮件的文本字段是否是有效的电子邮件 也许通过检查它是否有 登录它 有人能帮忙吗 以下代码用于使
  • OpenMP 令人尴尬的并行 for 循环,没有加速

    我有一个看起来非常简单的平行for循环 它只是将零写入整数数组 但事实证明 线程越多 循环就越慢 我认为这是由于一些缓存抖动造成的 所以我研究了时间表 块大小 restrict 将并行 for 嵌套在并行块内 然后刷新 然后我注意到读取数组
  • 如何访问命名空间“windows”

    include
  • 如何在 android studio 2.2 中添加预建的 *.so 库

    我尝试将库添加到项目中 但 android studio 忽略了我的库 我的 CmakeLists txtadd library mylib SHARED IMPORTED set target properties ffmpeg PROP
  • GitHub 页面生成器删除

    Context 我通常会建立快速的 GitHub 页面来记录我所做的一些开发 它们通常是非常简单的页面 是我使用页面生成器从存储库设置生成的 我想继续使用这种方法 因为对于如此简单的事情来说 使用 jekyll 转移到正确的 gh page
  • 将图像从剪贴板粘贴到网站

    我需要想出一个解决方案 让用户能够将图像粘贴到网站上 然后将该图像上传到网络服务器 我不确定正确的解决方案是什么 我很确定 javascript 是不可能的 因为我不认为它可以处理二进制剪贴板数据 或任何剪贴板数据 所以 我不确定该走哪条路
  • 如何在开发机器上测试从asp.net发送电子邮件?

    我该如何实现这个目标 SMTP 类在开发计算机上抛出有关找不到 SMTP 服务器的错误 有没有办法在开发机器上测试发送电子邮件 Shawn 直接来自我的 web config
  • R闪亮:如何构建动态UI(文本输入)

    我正在尝试使用 R闪亮构建动态textInput 用户应该在文本字段中写入 然后按添加按钮来填充另一个字段 但是 每次我按下按钮时 所有字段都会变空 就像我必须提前定义我想要多少个字段一样 任何帮助将不胜感激 谢谢 这是我的代码 libra
  • Ant——仅从树上的一个子目录复制文件和子目录

    我想使用 Ant 从单个子目录复制文件和子目录 而不复制其余的目录结构和内容 例如 我想复制 dir 3 其文件 file 1 到 file n 和子目录 dir 4 和 dir 5 但不复制 dir 1 或 dir 2 我可以使用一种模式
  • 使用 NSRegularExpression 命名捕获组

    Does NSRegularExpression支持命名捕获组吗 看起来不像是从文档 但我想在探索替代解决方案之前进行检查 iOS 中不支持命名分组 据我所知 您所能做的就是利用Enum Enum typedef enum kDayGrou
  • SQL Server:使用 FOR XML PATH 嵌套元素

    我想嵌套每个 XML 元素 举个例子 DECLARE TempTable TABLE Column1 char 10 Column2 char 10 INSERT INTO TempTable Column1 Column2 VALUES
  • 如何内爆数组索引?

    是否有可能破坏数组的索引 一个函数返回给我一个数组 我需要的是该数组的索引 所以我只想在数据库工作中使用逗号或任何其他字符来内爆 inexes 你的意思是这样的 implode array keys some arr 正确的 这是文档 fo
  • 修改 Django UserCreationForm

    我想向标准 Django UserCreationForm 添加更多字段 因此我继续将其子类化到我的应用程序的 forms py 文件中 最终得到以下结果 class CustomUserCreationForm UserCreationF
  • RabbitMQ C# 验证消息已发送

    我是 RabbitMQ 的新手 尝试写入队列并验证消息是否已发送 如果失败了 我需要知道它 我做了一个假队列来观察它失败 但无论我看到什么 都没有任何异常 当我寻找一个确认时 我总是得到一个 我从未见过 BasicNack 我什至不确定我是
  • emacs:类和结构的不同缩进

    我试图在 emacs 中实现以下缩进 class A I ALWAYS use access labels in classes public access label int member inclass struct B I NEVER