.emacs.d/init.d/programming/c++.el

173 lines
5.6 KiB
EmacsLisp

;;; c++.el --- C++ settings. -*- lexical-binding: t; -*-
;; Time-stamp: <2020-03-27T13:52:06+0100>
;;; Commentary:
;;; Code:
(require 'basics/package-management)
(require 'basics/global-variables)
(require 'programming/common)
(unless slow-computer
(when (and (executable-find "clang-tidy")
;; clang-tidy is built into clangd >= 9.
(< (my/clangd-version) 9.0))
(use-package flycheck-clang-tidy
:after (flycheck projectile lsp-ui)
:defines (lsp-mode)
:config (progn
(defun my/clang-tidy-off ()
"Disable c/c++-clang-tidy."
(when (or (eq major-mode 'c++-mode)
(eq major-mode 'c-mode))
(add-to-list 'flycheck-disabled-checkers
'c/c++-clang-tidy)))
(defun my/clang-tidy-on ()
"Enable c/c++-clang-tidy."
(when (or (eq major-mode 'c++-mode)
(eq major-mode 'c-mode))
(setq-local flycheck-disabled-checkers
(remove 'c/c++-clang-tidy
flycheck-disabled-checkers))))
(defun my/flycheck-clang-tidy-setup ()
(flycheck-clang-tidy-setup)
;; Run clang-tidy after the lsp-ui checker.
(when lsp-mode
(unless (equal (flycheck-get-next-checker-for-buffer
'lsp-ui) 'c/c++-clang-tidy)
(flycheck-add-next-checker
'lsp-ui '(warning . c/c++-clang-tidy))))))
:hook ((flycheck-mode . my/flycheck-clang-tidy-setup)
(first-change . my/clang-tidy-off) ; Disable when file is modified.
(before-save . my/clang-tidy-on)))) ; Enable if file is saved.
) ; unless slow-computer.
;; Highlight Doxygen comments.
(use-package highlight-doxygen
:custom-face
(highlight-doxygen-comment ((t (:inherit font-lock-comment-face
:foreground "#667788"))))
(highlight-doxygen-code-block ((t (:inherit highlight-doxygen-comment-face))))
:hook
(prog-mode . highlight-doxygen-mode)
)
;; Set coding style.
(use-package cc-mode
:commands (cc-mode)
:config
(c-add-style ; Construct own coding style definition.
"tastytea"
'("bsd"
(c-basic-offset . 4) ; Indent with 4 spaces.
(c-offsets-alist . ((innamespace . [0]))) ; Don't indent in namespaces.
))
(c-add-style
"tastytea-legacy" ; For old code.
'("bsd"
(c-basic-offset . 4)))
(defun my/get-builddir ()
(if (member 'projectile-mode minor-mode-list)
(concat (projectile-project-root) "build")
nil))
:custom
(c-default-style "tastytea")
)
;; Highlighting, indentation and documentation for CMake.
;; The CMake ebuild installs and activates the mode.
(unless (string-match-p "gentoo" operating-system-release)
(use-package cmake-mode
:mode (("CMakeLists\\.txt$" . cmake-mode)
("\\.cmake$" . cmake-mode))))
;; CMake reference.
(use-package eldoc-cmake
:after cmake-mode
:hook
(cmake-mode . eldoc-cmake-enable)
)
;; GUI for gdb and other debuggers.
(use-package realgud
:after (cc-mode)
:functions (realgud:gdb)
:config
(defun my/launch-gdb ()
"Load realgud and launch gdb."
(interactive)
(load-library "realgud")
(realgud:gdb))
:bind
(:map c-mode-base-map
("C-c g" . my/launch-gdb)
("M-<down>" . nil) ; Disabled, because I use them for scrolling.
("M-<up>" . nil)) ; ^ FIXME: Does not work. ^
)
;; Extra highlighting.
(use-package modern-cpp-font-lock
:diminish modern-c++-font-lock-mode
:hook
(c++-mode . modern-c++-font-lock-mode)
)
;; Add #include directives for missing symbols.
(use-package clang-include-fixer
:straight nil ; Installed by clang.
:if (executable-find "clang-include-fixer")
:functions (clang-include-fixer--start clang-include-fixer--add-header)
:init
(defvar my/llvm-path
(concat (file-name-directory (executable-find "clang-include-fixer")) ".."))
(add-to-list 'load-path (concat my/llvm-path "/share/clang"))
:config
(defun my/clang-find-all-symbols ()
"Invokes run-find-all-symbols.py."
(interactive)
(shell-command (concat "cd " (my/get-builddir) " && "
my/llvm-path "/share/clang/run-find-all-symbols.py"
" -b " my/llvm-path "/bin/find-all-symbols")))
(defun my/clang-include-fixer ()
"Invoke clang-include-fixer with -p=build."
(interactive)
(message (concat "Calling the include fixer. "
"This might take some seconds. Please wait."))
(clang-include-fixer--start #'clang-include-fixer--add-header
"-output-headers"
(concat "-p=" (my/get-builddir))))
:bind
("C-x M-i" . my/clang-include-fixer)
)
(use-package find-file
:custom
(cc-search-directories '("." ; Set directories for ff-find-other-file.
"../src"
"../include"
"../../src"
"../../include"
"../src/*"
"../include/*"
"../../src/*"
"../../include/*"
"/usr/include"
"/usr/local/include/*"))
)
(provide 'programming/c++)
;;; c++.el ends here