Emacs 调整D中UCFS链的对齐规则
有没有办法调整c派生模式中的对齐规则,在我的例子中是d模式,以缩进d样式的UFC链,例如Emacs 调整D中UCFS链的对齐规则,emacs,alignment,elisp,cc-mode,Emacs,Alignment,Elisp,Cc Mode,有没有办法调整c派生模式中的对齐规则,在我的例子中是d模式,以缩进d样式的UFC链,例如 foreach (file; dirPath.expandTilde() .buildNormalizedPath() .dirEntries(SpanMode.shallow)() 在这种情况下,我想在这一点上对齐,也就是说 有关详细信息,请参见您必须修改c-offsets-alist中的a
foreach (file; dirPath.expandTilde()
.buildNormalizedPath()
.dirEntries(SpanMode.shallow)()
在这种情况下,我想在这一点上对齐,也就是说
有关详细信息,请参见您必须修改
c-offsets-alist
中的arglist cont nonempty
键的值。此外,您可能还需要修改语句cont
键,以便在常规语句(例如赋值)中启用相同的缩进:
显然,您可以使用以下内容:
(add-hook 'd-mode-hook
'(lambda ()
(add-to-list 'c-offsets-alist '(arglist-cont-nonempty . c-lineup-cascaded-calls))
(add-to-list 'c-offsets-alist '(statement-cont . c-lineup-cascaded-calls))))
在每个d模式缓冲区中启用此对齐
如果您想考虑可选的括号,我相信您必须编写自己的“排队”函数,因为我想不出内置的解决方案。下面是c-lineup-cascaded-calls的肮脏重写:
(defun d-lineup-cascaded-calls (langelem)
"This is a modified `c-lineup-cascaded-calls' function for the
D programming language which accounts for optional parenthesis
and compile-time parameters in function calls."
(if (and (eq (c-langelem-sym langelem) 'arglist-cont-nonempty)
(not (eq (c-langelem-2nd-pos c-syntactic-element)
(c-most-enclosing-brace (c-parse-state)))))
;; The innermost open paren is not our one, so don't do
;; anything. This can occur for arglist-cont-nonempty with
;; nested arglist starts on the same line.
nil
(save-excursion
(back-to-indentation)
(let ((operator (and (looking-at "\\.")
(regexp-quote (match-string 0))))
(stmt-start (c-langelem-pos langelem)) col)
(when (and operator
(looking-at operator)
(or (and
(zerop (c-backward-token-2 1 t stmt-start))
(eq (char-after) ?\()
(zerop (c-backward-token-2 2 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
)
)
(setq col (current-column))
(while (or (and
(zerop (c-backward-token-2 1 t stmt-start))
(eq (char-after) ?\()
(zerop (c-backward-token-2 2 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
)
(setq col (current-column)))
(vector col))))))
它似乎也适用于可选括号和双括号调用(即
call!(type)(arg)
)。但可能会有一些极端情况,所以不要太依赖它,这只是一个可以合作的想法 是否可以在没有()
的情况下使其工作?在D()
中,对于没有参数的函数调用是可选的。我修复了regexp,因为D不使用->运算符。
(defun d-lineup-cascaded-calls (langelem)
"This is a modified `c-lineup-cascaded-calls' function for the
D programming language which accounts for optional parenthesis
and compile-time parameters in function calls."
(if (and (eq (c-langelem-sym langelem) 'arglist-cont-nonempty)
(not (eq (c-langelem-2nd-pos c-syntactic-element)
(c-most-enclosing-brace (c-parse-state)))))
;; The innermost open paren is not our one, so don't do
;; anything. This can occur for arglist-cont-nonempty with
;; nested arglist starts on the same line.
nil
(save-excursion
(back-to-indentation)
(let ((operator (and (looking-at "\\.")
(regexp-quote (match-string 0))))
(stmt-start (c-langelem-pos langelem)) col)
(when (and operator
(looking-at operator)
(or (and
(zerop (c-backward-token-2 1 t stmt-start))
(eq (char-after) ?\()
(zerop (c-backward-token-2 2 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
)
)
(setq col (current-column))
(while (or (and
(zerop (c-backward-token-2 1 t stmt-start))
(eq (char-after) ?\()
(zerop (c-backward-token-2 2 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
(and
(zerop (c-backward-token-2 1 t stmt-start))
(looking-at operator))
)
(setq col (current-column)))
(vector col))))))