diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 929d5af02..2c58ff265 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -19,19 +19,6 @@ (when (and (featurep 'irony) irony-mode) (+cc|irony-init-compile-options))) -;;;###autoload -(defun +cc*align-lambda-arglist (orig-fun &rest args) - "Improve indentation of continued C++11 lambda function opened as argument." - (if (and (eq 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-p ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) - 0 ; no additional indent - (apply orig-fun args))) - ;;;###autoload (defun +cc-sp-point-is-template-p (id action context) "Return t if point is in the right place for C++ angle-brackets." @@ -50,17 +37,26 @@ (looking-at-p "[ ]*#include[^<]+")))) ;;;###autoload -(defun +cc-c-lineup-inclass (_langelem) - "Indent privacy keywords at same level as class properties." - (if (memq major-mode '(c-mode c++-mode)) - (let ((inclass (assq 'inclass c-syntactic-context))) - (save-excursion - (goto-char (c-langelem-pos inclass)) - (if (or (looking-at "struct") - (looking-at "typedef struct")) - '+ - '++))) - '+)) +(defun +cc-c++-lineup-inclass (langelem) + "Indent inclass lines one level further than access modifier keywords." + (when (and (eq major-mode 'c++-mode) + (or (assoc 'access-label c-syntactic-context) + (save-excursion + (save-match-data + (re-search-backward + "\\(?:p\\(?:ublic\\|r\\(?:otected\\|ivate\\)\\)\\)" + (c-langelem-pos langelem) t))))) + '++)) + +;;;###autoload +(defun +cc-lineup-arglist-close (langlem) + "Line up the closing brace in an arglist with the opening brace IF cursor is +preceded by the opening brace or a comma (disregarding whitespace in between)." + (when (save-excursion + (save-match-data + (skip-chars-backward " \t\n" (c-langelem-pos langelem)) + (memq (char-before) (list ?, ?\( ?\;)))) + (c-lineup-arglist langlem))) ;; diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 502bc82dc..94b3ab162 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -48,7 +48,8 @@ compilation database is present in the project.") :init (setq-default c-basic-offset tab-width - c-backspace-function #'delete-backward-char) + c-backspace-function #'delete-backward-char + c-default-style "doom") :config (set! :electric '(c-mode c++-mode objc-mode java-mode) @@ -61,24 +62,41 @@ compilation database is present in the project.") ;; C/C++ style settings (c-toggle-electric-state -1) (c-toggle-auto-newline -1) - (c-set-offset 'substatement-open '0) ; don't indent brackets - (c-set-offset 'inline-open '+) - (c-set-offset 'block-open '+) - (c-set-offset 'brace-list-open '+) - (c-set-offset 'case-label '+) - (c-set-offset 'access-label '-) - (c-set-offset 'arglist-intro '+) - (c-set-offset 'arglist-close '0) - ;; Indent privacy keywords at same level as class properties - ;; (c-set-offset 'inclass #'+cc-c-lineup-inclass) ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! (c-mode c++-mode) #'highlight-numbers-mode) (add-hook! (c-mode c++-mode) #'+cc|fontify-constants) - ;; Improve indentation of inline lambdas in C++11 - (advice-add #'c-lineup-arglist :around #'+cc*align-lambda-arglist) + ;; Custom style, based off of linux + (map-put c-style-alist "doom" + `((c-basic-offset . ,tab-width) + (c-comment-only-line-offset . 0) + (c-hanging-braces-alist (brace-list-open) + (brace-entry-open) + (substatement-open after) + (block-close . c-snug-do-while) + (arglist-cont-nonempty)) + (c-cleanup-list brace-else-brace) + (c-offsets-alist + (statement-block-intro . +) + (knr-argdecl-intro . 0) + (substatement-open . 0) + (substatement-label . 0) + (statement-cont . +) + (case-label . +) + ;; align args with open brace OR don't indent at all (if open brace + ;; is at eolp and close brace is after arg with no trailing comma) + (arglist-intro . +) + (arglist-close +cc-lineup-arglist-close 0) + ;; don't over-indent lambda blocks + (inline-open . 0) + (inlambda . 0) + ;; indent access keywords +1 level, and properties beneath them + ;; another level + (access-label . -) + (inclass +cc-c++-lineup-inclass +) + (label . 0)))) ;;; Keybindings ;; Completely disable electric keys because it interferes with smartparens and