;;; c++.el --- C++ settings. -*- lexical-binding: t; -*- ;; Time-stamp: <2020-03-27T20:28:58+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 (nil)))) ; Disable background-color. :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 C-g" . my/launch-gdb) ("M-" . nil) ; Disabled, because I use them for scrolling. ("M-" . 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-c 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