Emacs 是否可以在重新缩进缓冲区时将C++大括号转换为挂起

Could Emacs convert C++ braces to hanging while re-indenting buffer?

本文关键字:C++ 挂起 转换 缓冲区 是否 新缩进 缩进 Emacs      更新时间:2023-10-16

当我重新缩进C++缓冲区时,我想像这样转换代码:

void foo(int a)
{
    try
    {
        for (unsigned int i=0; i<10; ++i)
        {
            if (++a)
            {
                break;
            }
            else
            {
                continue;
            }
        }
    } catch (...)
    {
        ;
    }
}

像这样编码:

void foo(int a) {
    try {
        for (unsigned int i=0; i<10; ++i) {
            if (++a) {
                break;
            }
            else {
                continue;
            }
        }
    }
} catch (...) {
    ;
}

另外,我希望类定义和命名空间保持不变。这个功能在 Emacs 中存在吗?

我意识到这可以通过一堆正则表达式来完成,但是使用处理的现成函数会更好所有边缘情况和所有。

一个简单的宏可以完成这项工作,例如:

(setq last-kbd-macro
   "C-s{336C-e")

其次是:M-0C-xe

注意:请参阅下面的编辑。

您可以通过两种不同的方式使用 replace-regexp 执行此操作。

1.( 要使用 elisp 执行此操作,请转到缓冲区的开头并键入 M-:(这允许您给出一个要计算的 s 表达式(。然后键入

(replace-regexp "n.*{" " {")

,然后按回车键。

2.( 要以交互方式执行此操作,请运行 M-x replace-regexp 或键入 M-%(执行相同的操作(。当系统询问替换什么时,键入C-q C-j,后跟.*{

当被问及用什么替换它时,键入" {"(没有引号 - 我必须将它们放在那里以显示大括号前的空格(。

然后按回车键运行该功能。

您必须为换行符键入 C-q C-j 的原因是交互式替换正则表达式不允许您使用 n

另外,作为旁注,如果您要查找或找出正则表达式,请使用 re-builder .这是非常有帮助的。

编辑:

正如注释中指出的,如果代码与给定的输入示例样式不匹配,我的正则表达式可能会删除代码。这是一个不同的版本,有助于避免这种情况。它仍然不完美,但不应该盲目使用正则表达式。

(replace-regexp "ns *{" " {")

这将确保仅匹配和删除空格。

问题主要用 astyle 解决:

(defun cpp-astyle()
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (setq beg (region-beginning)
              end (region-end))
      (setq beg (point-min)
            end (point-max)))
    (shell-command-on-region beg end "astyle -A3 -U -p -k3" nil t)))

在它支持的 12 种样式中,没有一种与我想要的完全匹配,但是这个非常接近(只有函数实现左大括号是错误的(。