diff --git a/modules/defuns/defuns-cc.el b/modules/defuns/defuns-cc.el index fe5be372b..b3ceb1b6d 100644 --- a/modules/defuns/defuns-cc.el +++ b/modules/defuns/defuns-cc.el @@ -20,8 +20,24 @@ (c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too (c-set-offset 'access-label '-) (c-set-offset 'inclass 'narf--c-lineup-inclass) - ;; DEL mapping interferes with smartparens and my custom DEL binding - (define-key c-mode-map (kbd "DEL") nil)) + (c-set-offset 'arglist-intro '+) + (c-set-offset 'arglist-close '0) + ;; Certain mappings interfere with smartparens and custom bindings + (define-key c-mode-map (kbd "DEL") nil) + (define-key c-mode-base-map "#" 'self-insert-command) + (define-key c-mode-base-map "{" 'self-insert-command) + (define-key c-mode-base-map "}" 'self-insert-command) + (define-key c-mode-base-map "/" 'self-insert-command) + (define-key c-mode-base-map "*" 'self-insert-command) + (define-key c-mode-base-map ";" 'self-insert-command) + (define-key c-mode-base-map "," 'self-insert-command) + (define-key c-mode-base-map ":" 'self-insert-command) + (define-key c-mode-base-map "(" 'self-insert-command) + (define-key c-mode-base-map ")" 'self-insert-command) + + (define-key c++-mode-map "}" nil) + (define-key c++-mode-map ">" nil) + (define-key c++-mode-map "<" nil)) (defun narf--copy-face (new-face face) "Define NEW-FACE from existing FACE." diff --git a/modules/module-cc.el b/modules/module-cc.el index 16a8280fb..d183e3636 100644 --- a/modules/module-cc.el +++ b/modules/module-cc.el @@ -21,52 +21,59 @@ :commands (c-mode c++-mode objc-mode java-mode) :init (associate! objc-mode :match "\\.mm$") - (add-hook! (c-mode c++-mode) '(flycheck-mode 'narf|init-c/c++-settings)) + (add-hook! (c-mode c++-mode) '(flycheck-mode narf|init-c/c++-settings)) :config (setq c-basic-offset 4 c-tab-always-indent nil c-electric-flag nil) - (progn ; C/C++ Settings - (when IS-MAC - (after! flycheck - (setq-default flycheck-c/c++-clang-executable "clang++" - flycheck-clang-include-path '("/usr/local/include")) - - (add-hook! c++-mode (setq flycheck-clang-language-standard "c++11" - flycheck-clang-standard-library "libc++")))) + ;; C/C++ Settings + (add-hook! (c-mode c++-mode) + (electric-indent-local-mode +1) + (setq electric-indent-chars '(?\n ?}))) + (add-hook! c++-mode 'narf|init-c++-C11-highlights) + (when IS-MAC (after! company - ;; TODO Clang is *really* slow in larger projects, maybe replace it with - ;; irony-mode or ycmd? - (define-company-backend! c-mode (c-headers clang)) - (define-company-backend! c++-mode (c-headers clang)) - (define-company-backend! objc-mode (c-headers xcode))) + (setq-default company-c-headers-path-system + (append '("/usr/include/" "/usr/local/include") + (f-directories "/usr/include/c++/") + (f-directories "/usr/local/include/c++/")))) + (after! flycheck + (setq-default flycheck-clang-include-path '("/usr/local/include") + flycheck-gcc-include-path '("/usr/local/include")))) - (add-hook! c++-mode 'narf|init-c++-C11-highlights) + (after! flycheck + (add-hook! c++-mode (setq flycheck-clang-language-standard "c++11" + flycheck-clang-standard-library "libc++"))) - ;; 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 (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)))) + (after! company + ;; TODO Clang is *really* slow in larger projects, maybe replace it with + ;; irony-mode or ycmd? + (define-company-backend! c-mode-common (c-headers clang xcode))) - (progn ; Obj-C - (add-to-list 'magic-mode-alist - `(,(lambda () - (and (string= (file-name-extension buffer-file-name) "h") - (re-search-forward "@\\" - magic-mode-regexp-match-limit t))) - . objc-mode)) - (after! flycheck (add-hook! objc-mode (require 'flycheck-objc))))) + ;; 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))) + + ;; Obj-C + (add-to-list 'magic-mode-alist + `(,(lambda () + (and (string= (file-name-extension buffer-file-name) "h") + (re-search-forward "@\\" + magic-mode-regexp-match-limit t))) + . objc-mode)) + (after! flycheck (add-hook! objc-mode (require 'flycheck-objc)))) (provide 'module-cc) ;;; module-cc.el ends here