c++ 11 lambda函数的Emacs缩进(cc-mode)
Emacs indenting of C++11 lambda functions (cc-mode)
默认的Emacs c++模式(cc-mode
)仍然不能识别许多c++ 11特性。一个恼人的问题是,它对使用的lambda函数应用了太多的缩进作为函数参数:
std::vector<int> ar(4);
std::generate_n(std::begin(ar), 4, [] {
static int g_i;
return g_i++;
});
std::for_each(std::begin(ar), std::end(ar), [](int i) {
std::cout << " " << i;
});
bool b = std::is_sorted(std::begin(ar), std::end(ar), [&](int l, int r) {
return l<r;
});
std::cout << " " << b << "n";
理想情况下,人们更愿意:
std::vector<int> ar(4);
std::generate_n(std::begin(ar), 4, [] {
static int g_i;
return g_i++;
});
std::for_each(std::begin(ar), std::end(ar), [](int i) {
std::cout << " " << i;
});
bool b = std::is_sorted(std::begin(ar), std::end(ar), [&](int l, int r) {
return l<r;
});
std::cout << " " << b << "n";
有好的解决方案吗?
在Emacs26中,接受的答案不再适用于我了。我只是把'inlambda'设置为0。
(c-offsets-alist . ((case-label . 0)
(inline-open . 0)
(substatement-open . 0)
(inlambda . 0) ; no extra indent for lambda
(block-open . 0) ; no space before {
(knr-argdecl-intro . -)))
讨论了使用c++ 0x枚举类修复enum class
的Emacs cc模式缩进问题格式化问题。
这启发了下面的通知函数。它检测一个开放的c++ lambda函数在开放参数列表中,并取消一级缩进以在问题中产生"理想"结果:
(defadvice c-lineup-arglist (around my activate)
"Improve indentation of continued C++11 lambda function opened as argument."
(setq ad-return-value
(if (and (equal major-mode 'c++-mode)
(ignore-errors
(save-excursion
(goto-char (c-langelem-pos langelem))
;; Detect "[...](" or "[...]{". preceded by "," or "(",
;; and with unclosed brace.
(looking-at ".*[(,][ t]*\[[^]]*\][ t]*[({][^}]*$"))))
0 ; no additional indent
ad-do-it))) ; default behavior
对Hugues的解决方案进行了轻微的修改,以将lambda函数识别为嵌套在另一个lambda函数中的参数,并将lambda函数识别为类内初始化值:
(defun vr-c++-looking-at-lambda_as_param ()
"Return t if text after point matches '[...](' or '[...]{'"
(looking-at ".*[,(][ t]*\[[^]]*\][ t]*[({][^}]*?[ t]*[({][^}]*?$"))
(defun vr-c++-looking-at-lambda_in_uniform_init ()
"Return t if text after point matches '{[...](' or '{[...]{'"
(looking-at ".*{[ t]*\[[^]]*\][ t]*[({][^}]*?[ t]*[({][^}]*?$"))
(defun vr-c++-indentation-examine (langelem looking-at-p)
(and (equal major-mode 'c++-mode)
(ignore-errors
(save-excursion
(goto-char (c-langelem-pos langelem))
(funcall looking-at-p)))))
(defun vr-c++-indentation-setup ()
(require 'google-c-style)
(google-set-c-style)
(c-set-offset
'block-close
(lambda (langelem)
(if (vr-c++-indentation-examine
langelem
#'vr-c++-looking-at-lambda_in_uniform_init)
'-
0)))
(c-set-offset
'statement-block-intro
(lambda (langelem)
(if (vr-c++-indentation-examine
langelem
#'vr-c++-looking-at-lambda_in_uniform_init)
0
'+)))
(defadvice c-lineup-arglist (around my activate)
"Improve indentation of continued C++11 lambda function opened as argument."
(setq ad-return-value
(if (vr-c++-indentation-examine
langelem
#'vr-c++-looking-at-lambda_as_param)
0
ad-do-it))))
相关文章:
- clang格式:宏的缩进
- C++setiosflags函数操纵器-未确定的缩进
- VSCode 中带有 C/C++ 扩展名的多行注释缩进错误
- 如何使用c++调整文本文件中代码的缩进?
- 如何在C++中制作 clang 格式的缩进 extern C 块?
- 在 vscode 中使用特定缩进/对齐 C/C++ 自动格式化
- "If Else"语句缩进在C++中是否重要?
- CLion 行注释的不一致自动缩进
- 如何在用户按Enter键时控制wxStyledTextCtrl中的行缩进
- 如何在 QLabel 中将缩进设置为 QImage
- 如何使 clang 格式将所有详细信息命名空间缩进一个
- 是否可以更改 Xcode 缩进注释行的方式
- 用libxml2缩进合并的XML文件
- 精美的C 容器,具有级别的缩进
- 如何在使用clang-format访问修饰符后缩进
- 如何使用Visual Studio轻松缩进标头声明
- 禁止 emacs 中的 c++ 命名空间缩进
- 我怎样才能让 Emacs 用我的代码缩进我的 // 注释
- c++ 11 lambda函数的Emacs缩进(cc-mode)
- C++0x枚举类的Emacs cc模式缩进问题