(use-package clang-format :ensure t) (use-package projectile :ensure t) ;;; Code: (defun setup-c() "Set up c common mode." (setq c++-tab-always-indent 0) (setq c-basic-offset 4) ;; Default is 2 (setq c-indent-level 4) ;; Default is 2 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60)) (setq tab-width 4) (c-set-offset 'brace-list-open 0) (c-set-offset 'substatement-open 0) (c-set-offset 'arglist-intro '+) (c-set-offset 'arglist-cont-non-empty '+) (c-set-offset 'arglist-close '+) (c-set-offset 'statement-cont 0) (c-set-offset 'statement-case-open 0) ) (setup-c) (add-hook 'c-mode-common-hook 'setup-c) (defun mk/cpp/generate-compile-commands-cmake() "Regenerates a compile_commands.json database" (interactive) (shell-command (format "cd %s && cmake -S . -B build -D CMAKE_EXPORT_COMPILE_COMMANDS=1" (projectile-project-root))) ) (defun mk/cpp/maybe-regenerate-compile-commands() (if (string= (buffer-file-name) "CMakeLists.txt") (mk/cpp/generate-compile-commands-cmake))) (defun mk/cpp/clang-format-buffer-if-project-file () "Run clang-format-buffer only if a .clang-format exists in the Projectile project." (when (and (projectile-project-p) ; inside a projectile project (locate-dominating-file (buffer-file-name) ".clang-format")) (clang-format-buffer))) ;; Add this hook to C/C++/ObjC modes (add-hook 'c-mode-common-hook (lambda () (add-hook 'before-save-hook #'mk/cpp/clang-format-buffer-if-project-file nil 'local))) (add-hook 'after-save-hook 'mk/cpp/maybe-regenerate-compile-commands) (provide 'cpp) ;;; cpp.el ends here