2

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

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

4

3 回答 3

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 种样式中,没有一个与我想要的完全匹配,但是这个非常接近(只有函数实现左大括号是错误的)。

于 2013-10-05T17:09:37.360 回答
0

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

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

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

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

然后按回车。

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

当被问到用什么替换它时,输入" {"(不带引号——我必须把它们放在那里以显示花括号前的空格)。

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

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

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

编辑:

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

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

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

于 2013-10-05T04:21:50.330 回答
0

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

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

其次是:M-0C-xe

于 2013-09-25T05:50:43.220 回答