+ Auto-add the nearest include/ folder to compiler header search path. + Remove unneeded fontification hooks (now covered by modern-cpp-font-lock). + Enable C++11 support by default
81 lines
2.8 KiB
EmacsLisp
81 lines
2.8 KiB
EmacsLisp
;;; lang/cc/autoload.el -*- lexical-binding: t; -*-
|
|
|
|
;;;###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/autoclose->-maybe ()
|
|
"For some reason smartparens won't autoskip >'s, this hack does."
|
|
(interactive)
|
|
(if (save-excursion
|
|
(backward-char)
|
|
(looking-at-p "[^ \t]>"))
|
|
(forward-char)
|
|
(call-interactively #'self-insert-command)))
|
|
|
|
;;;###autoload
|
|
(defun +cc-sp-point-is-template-p (id action context)
|
|
"Return t if point is in the right place for C++ angle-brackets."
|
|
(and (sp-in-code-p id action context)
|
|
(sp-point-after-word-p id action context)))
|
|
|
|
;;;###autoload
|
|
(defun +cc-sp-point-after-include-p (id action context)
|
|
"Return t if point is in an #include."
|
|
(and (sp-in-code-p id action context)
|
|
(save-excursion
|
|
(goto-char (line-beginning-position))
|
|
(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"))
|
|
'+
|
|
'++)))
|
|
'+))
|
|
|
|
|
|
;;
|
|
;; Hooks
|
|
;;
|
|
|
|
;;;###autoload
|
|
(defun +cc|fontify-constants ()
|
|
"Better fontification for preprocessor constants"
|
|
(font-lock-add-keywords
|
|
nil '(("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face)
|
|
("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face))
|
|
t))
|
|
|
|
;;;###autoload
|
|
(defun +cc|irony-add-include-paths ()
|
|
"Seek out and add the nearest include/ folders to clang's options."
|
|
(when-let (dir (locate-dominating-file buffer-file-name "include/"))
|
|
(cl-pushnew (concat "-I" (expand-file-name "include/" dir))
|
|
irony-additional-clang-options :test #'equal)))
|
|
|
|
;;;###autoload
|
|
(defun +cc|use-c++11 ()
|
|
"Enable C++11 support with clang (via irony)."
|
|
(cl-pushnew "-std=c++11" irony-additional-clang-options :test #'equal)
|
|
(when IS-MAC
|
|
;; NOTE beware: you'll get abi-inconsistencies when passing std-objects to
|
|
;; libraries linked with libstdc++ (e.g. if you use boost which wasn't
|
|
;; compiled with libc++)
|
|
(cl-pushnew "-stdlib=libc++" irony-additional-clang-options :test #'equal)))
|