Emacs 是否可以在重新缩进缓冲区时将C++大括号转换为挂起
Could Emacs convert C++ braces to hanging while re-indenting buffer?
当我重新缩进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 种样式中,没有一种与我想要的完全匹配,但是这个非常接近(只有函数实现左大括号是错误的(。
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- WTSFreeMemory在启动期间从服务调用时挂起-我应该省略吗
- C++HTTP客户端在GET请求后挂起read()调用