;;; c++.el --- C++ settings. -*- lexical-binding: t; -*- ;; Time-stamp: <2020-05-09T17:42:59+0200> ;;; 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. (statement-cont . (c-lineup-assignments c-lineup-string-cont c-lineup-cascaded-calls c-lineup-class-decl-init-after-brace +))) ))) (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) ) (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/*")) ) (when (executable-find "clang-format") (use-package clang-format)) (provide 'programming/c++) ;;; c++.el ends here