.emacs.d/init.d/programming/common.el

297 lines
7.6 KiB
EmacsLisp

;;; common.el --- Common programming settings. -*- lexical-binding: t; -*-
;; Time-stamp: <2020-02-04T03:09:04+0100>
;;; Commentary:
;;; Code:
(require 'basics/global-variables)
(use-package emacs
:ensure nil
:custom
(compilation-scroll-output 'first-error)
:config
(setq-default indent-tabs-mode nil ; Set default indentation.
tab-width 4)
(electric-pair-mode t) ; Auto-type closing brackets.
:hook
;; Wrap long lines in compilation output.
(compilation-mode . (lambda () (setq-local truncate-lines nil)))
:bind
;; Switch between header and implementation.
("C-:" . ff-find-other-file)
)
;; Guess indentation and if spaces or tabs are to be used.
(use-package dtrt-indent
:after (editorconfig)
:hook
(dtrt-indent-mode . editorconfig-apply)
(prog-mode . dtrt-indent-mode)
)
;; Online documentation mode.
(use-package eldoc
:hook
(prog-mode . turn-on-eldoc-mode)
)
;; Syntax checking with many plugins.
(unless slow-computer
(use-package flycheck
:defer nil
:functions (flycheck-add-mode)
:custom
(flycheck-cppcheck-checks '("style" "warning" "information"))
(flycheck-emacs-lisp-load-path 'inherit) ; Use load-path of Emacs.
:config
(global-flycheck-mode)
;; (setq flycheck-check-syntax-automatically '(save new-line mode-change))
(flycheck-add-mode 'html-tidy 'web-mode)
(flycheck-add-mode 'css-csslint 'web-mode)
:bind
(:map flycheck-mode-map
("<f5>" . flycheck-previous-error)
("<f6>" . flycheck-next-error)
("<f7>" . flycheck-list-errors)
)
)
) ; unless slow-computer.
;; Autocompletion mode with many plugins.
(unless slow-computer
(use-package company
:custom
;; Show suggestions after entering one character.
(company-minimum-prefix-length 1)
(company-selection-wrap-around t) ; Wrap around at end/beginning of list.
; Align annotation to the right border.
(company-tooltip-align-annotations t)
(company-idle-delay 0) ; No delay.
:bind
(:map company-active-map
("<return>" . nil) ; Disable completion on return.
("RET" . nil) ; https://emacs.stackexchange.com/a/13290
("<tab>" . company-complete-selection) ; Make tab work in lists (GUI).
("TAB" . company-complete-selection) ; Same in terminals.
)
:hook
(after-init . global-company-mode)
)
;; Fuzzy autocompletion for company.
(use-package company-flx
:after company
:config
(company-flx-mode +1)
)
(use-package company-statistics
:after company
:hook
(after-init . company-statistics-mode)
)
;; Documentation popups for completions.
(use-package company-quickhelp
:config
(company-quickhelp-mode)
)
) ; unless slow-computer.
;; Automatic project management.
(unless slow-computer
(use-package projectile
:after (treemacs ivy)
:functions (f-directory?
treemacs-collapse-other-projects
treemacs-toggle-node
my/projectile-kill-buffers)
:init
(defvar my/cmake-compile-command ; cmake command for compiling with 1
(concat "cmake --build . -- -j" ; core less than available.
(substring (shell-command-to-string "nproc --ignore=1") 0 -1)))
(defun my/switch-project ()
"Add project to treemacs."
(treemacs-add-and-display-current-project)
(treemacs-collapse-other-projects)
(treemacs-toggle-node))
(defun my/projectile-kill-buffers ()
"Kill project buffers and delete other windows."
(interactive)
(projectile-kill-buffers)
(delete-other-windows))
:custom
(projectile-project-compilation-dir "build")
(projectile-switch-project-action 'my/switch-project)
(projectile-project-configure-cmd
"cmake -GUnix\\ Makefiles -DCMAKE_BUILD_TYPE=Debug -DWITH_CLANG-TIDY=YES \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DWITH_TESTS=YES ..")
(projectile-completion-system 'ivy)
:config
(setq projectile-project-compilation-cmd
(concat my/cmake-compile-command " && cd tests && ctest -Q"))
(projectile-mode +1)
;; Mark variables as safe. This prevents prompts when using .dir-locals.el.
(put 'projectile-project-compilation-cmd 'safe-local-variable #'stringp)
(put 'projectile-project-configure-cmd 'safe-local-variable #'stringp)
;; Auto-search for projects.
(if (f-directory? "~/Projekte")
(setq projectile-project-search-path '("~/Projekte")))
:bind
("C-c p" . 'projectile-command-map)
(:map projectile-command-map
("k" . 'my/projectile-kill-buffers))
)
) ; unless slow-computer.
;; Highlight TODO, FIXME, NOTE and so on.
(use-package hl-todo
:bind
(:map hl-todo-mode-map
("C-c t" . hl-todo-occur))
:hook
(prog-mode . hl-todo-mode)
)
;; Better commenting.
(use-package smart-comment
:bind
("C-x c" . smart-comment)
)
;; Toggle betweeen beginning/end of line and beginning/end of code.
(use-package mwim
:bind
("<home>" . mwim-beginning-of-line-or-code)
("<end>" . mwim-end-of-line-or-code)
)
;; Fold code.
(use-package fold-dwim
:bind
("C-c f" . fold-dwim-toggle)
:hook
(prog-mode . hs-minor-mode)
)
;; Highlight indentation.
(use-package hl-indent
:custom-face
(hl-indent-face ((t (:inherit hl-indent-face ; Reversed whitespace.
:background "gray18"
:foreground "#1c1e1f"
))))
:hook
(prog-mode . hl-indent-mode)
)
;; Tries to find points of interest in buffer and jumps to them.
(use-package imenu
:custom
(imenu-auto-rescan t)
:bind
("M-i" . imenu)
)
;; Tries to find points of interest in all open buffers and jumps to them.
(use-package imenu-anywhere
:after (imenu ivy)
:bind
("C-M-i" . ivy-imenu-anywhere)
)
;; Jump to definition using grep.
(use-package dumb-jump
:after (ivy)
:custom
(dumb-jump-selector 'ivy)
:bind
("M-." . dumb-jump-go) ; Will be overwritten by more intelligent modes.
)
;; Support .editorconfig files.
(use-package editorconfig
:config
(editorconfig-mode 1)
)
(use-package smerge-mode
:defines (smerge-mode-map)
:bind
(:map smerge-mode-map
("<f5>" . smerge-prev)
("<f6>" . smerge-next)
("<f7>" . smerge-resolve)
)
)
(use-package copyright
:config
(defun my/maybe-copyright-update ()
"Update existing copyright notice to indicate the current
year if mode is derived from prog-mode."
(if (derived-mode-p 'prog-mode)
(copyright-update)))
:hook
(before-save . my/maybe-copyright-update)
)
;; Highlights parentheses, brackets or braces according to their depth.
(use-package rainbow-delimiters
:custom
(rainbow-delimiters-max-face-count 4)
:custom-face
(rainbow-delimiters-depth-1-face ((t
(:inherit rainbow-delimiters-base-face
:foreground "LightPink"))))
(rainbow-delimiters-depth-2-face ((t
(:inherit rainbow-delimiters-base-face
:foreground "LightGreen"))))
(rainbow-delimiters-depth-3-face ((t
(:inherit rainbow-delimiters-base-face
:foreground "MediumPurple1"))))
(rainbow-delimiters-depth-4-face ((t
(:inherit rainbow-delimiters-base-face
:foreground "LightSkyBlue"))))
:hook
(prog-mode . rainbow-delimiters-mode)
)
(provide 'programming/common)
;;; common.el ends here