重新缩进缓冲区时,Emacs可以将C ++大括号转换为挂起吗?

时间:2013-09-24 16:16:56

标签: c++ emacs elisp indentation

当我重新缩进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中是否存在此功能?

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

3 个答案:

答案 0 :(得分:0)

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

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

后跟: M-0 C-x e

答案 1 :(得分:0)

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

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

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

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

然后按返回。

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

当被问到要替换它时,键入" {"(不带引号 - 我必须将它们放在那里以显示大括号前的空格)。

然后按返回运行该功能。

您必须为换行符键入C-q C-j的原因是因为交互式replace-regexp不允许您使用\n

另外,作为附注,如果您正在尝试查找或找出正则表达式,请使用re-builder。这非常有帮助。

修改

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

(replace-regexp "\n\s *{" " {")

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

答案 2 :(得分:0)

问题主要通过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种风格完全不符合我的要求, 但是这个非常接近(只有函数实现开括号错误)。