当我重新缩进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中是否存在此功能?
我意识到这可以通过一堆正则表达式完成, 但是使用现成的处理功能会更好 所有边缘情况和所有。
答案 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种风格完全不符合我的要求, 但是这个非常接近(只有函数实现开括号错误)。