diff --git a/modules/module-cc.el b/modules/module-cc.el index e5f9ade51..a7bf8b6f2 100644 --- a/modules/module-cc.el +++ b/modules/module-cc.el @@ -23,12 +23,13 @@ (associate! objc-mode :match "\\.mm$") (add-hook 'c-initialization-hook 'narf|init-c/c++-settings) (add-hook 'c++-mode-hook 'highlight-numbers-mode) + (add-hook 'c++-mode-hook 'narf|init-c++-C11-highlights) :config (setq c-tab-always-indent nil c-electric-flag nil) - (map! (:map c-mode-base-map - (:localleader :nv ";" 'narf/append-semicolon))) + (map! :map c-mode-base-map + (:localleader :nv ";" 'narf/append-semicolon)) (define-text-object! "<" "<" ">") (sp-local-pair '(c-mode c++-mode) "<" ">" :when '(narf/sp-point-is-template-p narf/sp-point-after-include-p)) @@ -38,39 +39,37 @@ (sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC"))) (sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC")))) - (progn ;; C/C++ - (add-hook 'c++-mode-hook 'narf|init-c++-C11-highlights) - (add-hook! (c-mode c++-mode) - (electric-indent-local-mode +1) - (setq electric-indent-chars '(?\n ?}))) + (add-hook! (c-mode c++-mode objc-mode) + (electric-indent-local-mode +1) + (setq electric-indent-chars '(?\n ?}))) - ;; Fix enum and C++11 lambda indentation - (defadvice c-lineup-arglist (around c-lineup-arglist-indent-fix activate) - "Improve indentation of continued C++11 lambda function opened as argument." - (setq ad-return-value - (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 ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) - 0 ; no additional indent - ad-do-it)))) + ;; C/C++ + (advice-add 'c-lineup-arglist :around 'narf/c-lineup-arglist) + (defun narf/c-lineup-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 ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) + 0 ; no additional indent + (apply orig-fun args))) - (progn ;; Obj-C - (push `(,(lambda () - (and (f-ext? buffer-file-name "h") - (re-search-forward "@\\" - magic-mode-regexp-match-limit t))) - . objc-mode) - magic-mode-alist) + ;; C++ header files + (push `(,(lambda () (and (f-ext? buffer-file-name "h") + (or (f-exists? (f-swap-ext buffer-file-name "cpp")) + (awhen (car-safe (projectile-get-other-files (buffer-file-name) (projectile-current-project-files))) + (f-ext? it "cpp"))))) + . c++-mode) + magic-mode-alist) - (push `(,(lambda () - (and (f-ext? buffer-file-name "h") - (f-exists? (f-swap-ext buffer-file-name "cpp")))) - . c++-mode) - magic-mode-alist)) + ;; Obj-C + (push `(,(lambda () (and (f-ext? buffer-file-name "h") + (re-search-forward "@\\" magic-mode-regexp-match-limit t))) + . objc-mode) + magic-mode-alist) (use-package irony :config