c++: improve indentation; fix clang/gcc include paths; electric-indent

This commit is contained in:
Henrik Lissner 2016-03-23 11:58:08 -04:00
parent d2823adce2
commit 3c72351220
2 changed files with 61 additions and 38 deletions

View file

@ -20,8 +20,24 @@
(c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too (c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too
(c-set-offset 'access-label '-) (c-set-offset 'access-label '-)
(c-set-offset 'inclass 'narf--c-lineup-inclass) (c-set-offset 'inclass 'narf--c-lineup-inclass)
;; DEL mapping interferes with smartparens and my custom DEL binding (c-set-offset 'arglist-intro '+)
(define-key c-mode-map (kbd "DEL") nil)) (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) (defun narf--copy-face (new-face face)
"Define NEW-FACE from existing FACE." "Define NEW-FACE from existing FACE."

View file

@ -21,52 +21,59 @@
:commands (c-mode c++-mode objc-mode java-mode) :commands (c-mode c++-mode objc-mode java-mode)
:init :init
(associate! objc-mode :match "\\.mm$") (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 :config
(setq c-basic-offset 4 (setq c-basic-offset 4
c-tab-always-indent nil c-tab-always-indent nil
c-electric-flag nil) c-electric-flag nil)
(progn ; C/C++ Settings ;; C/C++ Settings
(when IS-MAC (add-hook! (c-mode c++-mode)
(after! flycheck (electric-indent-local-mode +1)
(setq-default flycheck-c/c++-clang-executable "clang++" (setq electric-indent-chars '(?\n ?})))
flycheck-clang-include-path '("/usr/local/include")) (add-hook! c++-mode 'narf|init-c++-C11-highlights)
(add-hook! c++-mode (setq flycheck-clang-language-standard "c++11"
flycheck-clang-standard-library "libc++"))))
(when IS-MAC
(after! company (after! company
;; TODO Clang is *really* slow in larger projects, maybe replace it with (setq-default company-c-headers-path-system
;; irony-mode or ycmd? (append '("/usr/include/" "/usr/local/include")
(define-company-backend! c-mode (c-headers clang)) (f-directories "/usr/include/c++/")
(define-company-backend! c++-mode (c-headers clang)) (f-directories "/usr/local/include/c++/"))))
(define-company-backend! objc-mode (c-headers xcode))) (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 (after! company
(defadvice c-lineup-arglist (around c-lineup-arglist-indent-fix activate) ;; TODO Clang is *really* slow in larger projects, maybe replace it with
"Improve indentation of continued C++11 lambda function opened as argument." ;; irony-mode or ycmd?
(setq ad-return-value (define-company-backend! c-mode-common (c-headers clang xcode)))
(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))))
(progn ; Obj-C ;; Fix enum and C++11 lambda indentation
(add-to-list 'magic-mode-alist (defadvice c-lineup-arglist (around c-lineup-arglist-indent-fix activate)
`(,(lambda () "Improve indentation of continued C++11 lambda function opened as argument."
(and (string= (file-name-extension buffer-file-name) "h") (setq ad-return-value
(re-search-forward "@\\<interface\\>" (if (and (eq major-mode 'c++-mode)
magic-mode-regexp-match-limit t))) (ignore-errors
. objc-mode)) (save-excursion
(after! flycheck (add-hook! objc-mode (require 'flycheck-objc))))) (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 "@\\<interface\\>"
magic-mode-regexp-match-limit t)))
. objc-mode))
(after! flycheck (add-hook! objc-mode (require 'flycheck-objc))))
(provide 'module-cc) (provide 'module-cc)
;;; module-cc.el ends here ;;; module-cc.el ends here