doomemacs/modules/lang/cc/config.el

170 lines
5.4 KiB
EmacsLisp
Raw Normal View History

2017-02-20 07:57:16 +08:00
;;; lang/cc/config.el --- C, C++, and Objective-C
2015-06-15 15:06:10 +08:00
(def-package! cc-mode
2015-06-15 15:06:10 +08:00
:commands (c-mode c++-mode objc-mode java-mode)
:mode ("\\.mm" . objc-mode)
2015-06-15 15:06:10 +08:00
:init
2017-02-20 07:57:16 +08:00
;; Auto-detect C++ header files
(push (cons (lambda ()
(and buffer-file-name
(equal (file-name-extension buffer-file-name) "h")
2017-02-20 07:57:16 +08:00
(or (file-exists-p (expand-file-name
(concat (file-name-sans-extension buffer-file-name)
".cpp")))
(when-let (file (car-safe (projectile-get-other-files
buffer-file-name
(projectile-current-project-files))))
(equal (file-name-extension file) "cpp")))))
'c++-mode)
2016-04-19 14:42:07 +08:00
magic-mode-alist)
2017-02-20 07:57:16 +08:00
;; Auto-detect Obj-C header files
(push (cons (lambda ()
(and buffer-file-name
(equal (file-name-extension buffer-file-name) "h")
(re-search-forward "@\\<interface\\>" magic-mode-regexp-match-limit t)))
'objc-mode)
2016-04-19 14:42:07 +08:00
magic-mode-alist)
:config
(setq c-tab-always-indent nil
c-electric-flag nil)
2015-06-15 15:06:10 +08:00
(add-hook 'c-mode-common-hook #'rainbow-delimiters-mode)
2017-02-20 07:57:16 +08:00
;; extra highlights for numbers in C (`modern-cpp-font-lock' offers something better for C++)
(add-hook 'c-mode-hook #'highlight-numbers-mode)
2017-02-20 07:57:16 +08:00
;; Fontification of C++11 string literals
(add-hook 'c++-mode-hook #'+cc|extra-fontify-c++)
2017-02-20 07:57:16 +08:00
(set! :electric '(c-mode c++-mode objc-mode java-mode)
2017-02-21 09:55:21 +08:00
:chars '(?\n ?\}))
2017-02-20 07:57:16 +08:00
(set! :company-backend
2017-02-20 07:57:16 +08:00
'(c-mode c++-mode objc-mode)
#'(company-irony-c-headers company-irony))
(sp-with-modes '(c-mode c++-mode objc-mode java-mode)
2017-02-20 07:57:16 +08:00
(sp-local-pair "<" ">" :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p))
(sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC")))
;; Doxygen blocks
(sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC")))
(sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC"))))
;; Improve indentation of inline lambdas in C++11
(advice-add #'c-lineup-arglist :around #'+c-lineup-arglist)
2017-02-20 07:57:16 +08:00
;; C/C++ style settings
(c-toggle-electric-state -1)
(c-toggle-auto-newline -1)
(c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
(c-set-offset 'inline-open '+)
(c-set-offset 'block-open '+)
(c-set-offset 'brace-list-open '+) ; all "opens" should be indented by the c-indent-level
(c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too
(c-set-offset 'access-label '-)
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close '0)
(defun +cc--c-lineup-inclass (langelem)
(let ((inclass (assoc 'inclass c-syntactic-context)))
(save-excursion
(goto-char (c-langelem-pos inclass))
(if (or (looking-at "struct")
(looking-at "typedef struct"))
'+
'++))))
(c-set-offset 'inclass #'+cc--c-lineup-inclass)
2017-02-20 07:57:16 +08:00
;; Certain mappings interfere with smartparens and custom bindings,
;; so unbind them
(map! :map c-mode-map
2017-02-20 07:57:16 +08:00
"DEL" nil
"#" #'self-insert-command
"{" #'self-insert-command
"}" #'self-insert-command
"/" #'self-insert-command
"*" #'self-insert-command
";" #'self-insert-command
"," #'self-insert-command
":" #'self-insert-command
"(" #'self-insert-command
")" #'self-insert-command
2017-02-20 07:57:16 +08:00
:map c++-mode-map
"}" nil
;; Smartparens and cc-mode both try to autoclose
;; angle-brackets intelligently. The result isn't very
;; intelligent (causes redundant characters), so we just do it
;; ourselves.
"<" nil
:map (c-mode-base-map c++-mode-map)
:i ">" #'+cc/autoclose->-maybe))
2017-02-20 07:57:16 +08:00
(def-package! modern-cpp-font-lock
:commands modern-c++-font-lock-mode
:init (add-hook 'c++-mode-hook #'modern-c++-font-lock-mode))
2017-02-20 07:57:16 +08:00
(def-package! irony
:after cc-mode
:init (add-hook 'c-mode-common-hook #'irony-mode)
:config
(setq irony-server-install-prefix (concat doom-etc-dir "irony-server/"))
(add-hook! 'irony-mode-hook #'(irony-eldoc flycheck-mode))
(add-hook! 'c++-mode-hook
2016-06-09 02:43:40 +08:00
(make-local-variable 'irony-additional-clang-options)
2017-04-09 11:37:40 +08:00
(push "-std=c++11" irony-additional-clang-options))
(map! :map irony-mode-map
[remap completion-at-point] #'counsel-irony
[remap complete-symbol] #'counsel-irony))
(def-package! irony-eldoc :after irony)
(def-package! flycheck-irony
:when (featurep! :feature syntax-checker)
:after irony
:config (flycheck-irony-setup))
;;
2017-02-20 07:57:16 +08:00
;; Tools
;;
(def-package! disaster :commands disaster)
2017-02-20 07:57:16 +08:00
;;
;; Plugins
;;
(when (featurep! :completion company)
(def-package! company-cmake :after cmake-mode)
2017-02-20 07:57:16 +08:00
(def-package! company-irony :after irony)
2017-02-20 07:57:16 +08:00
(def-package! company-irony-c-headers :after company-irony))
2017-02-20 07:57:16 +08:00
2017-02-20 07:57:16 +08:00
;;
;; Major modes
;;
(def-package! cmake-mode
2017-02-20 07:57:16 +08:00
:mode "CMakeLists\\.txt$"
:config
(set! :company-backend 'cmake-mode '(company-cmake company-yasnippet)))
2015-06-15 15:06:10 +08:00
2017-03-17 11:39:35 +08:00
(def-package! glsl-mode :mode ("\\.glsl$" "\\.vert$" "\\.frag$" "\\.geom$"))
2015-06-15 15:06:10 +08:00
(def-package! cuda-mode :mode "\\.cuh?$")
2015-06-15 15:06:10 +08:00
(def-package! opencl-mode :mode "\\.cl$")
(def-package! demangle-mode
:commands demangle-mode
:init (add-hook 'llvm-mode-hook #'demangle-mode))