;(toggle-debug-on-error) (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") ;lsp performances (setq gc-cons-threshold (* 100 1024 1024));; 100MB (setq read-process-output-max (* 3 1024 1024));; 3MB (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(c-basic-offset 4) '(c-default-style '((c++-mode . "tuleu-c++") (java-mode . "java") (awk-mode . "awk") (other . "gnu"))) '(company-idle-delay 20.0) '(compilation-scroll-output 'first-error) '(custom-safe-themes '("162201cf5b5899938cfaec99c8cb35a2f1bf0775fc9ccbf5e63130a1ea217213" "e3daa8f18440301f3e54f2093fe15f4fe951986a8628e98dcd781efbec7a46f2" "6622bb651e72d8ebd66454bd86db6c3990324243ff4325c1b6df252aba63b13e" "2f8eadc12bf60b581674a41ddc319a40ed373dd4a7c577933acaff15d2bf7cc6" "f458b92de1f6cf0bdda6bce23433877e94816c3364b821eb4ea9852112f5d7dc" "016f665c0dd5f76f8404124482a0b13a573d17e92ff4eb36a66b409f4d1da410" "13096a9a6e75c7330c1bc500f30a8f4407bd618431c94aeab55c9855731a95e1" "8b148cf8154d34917dfc794b5d0fe65f21e9155977a36a5985f89c09a9669aa0" "bf948e3f55a8cd1f420373410911d0a50be5a04a8886cabe8d8e471ad8fdba8e" "680f62b751481cc5b5b44aeab824e5683cf13792c006aeba1c25ce2d89826426" "631c52620e2953e744f2b56d102eae503017047fb43d65ce028e88ef5846ea3b" default)) '(display-time-24hr-format t) '(display-time-default-load-average nil) '(doom-modeline-github t) '(doom-modeline-indent-info t) '(doom-modeline-minor-modes t) '(doom-modeline-total-line-number t) '(fill-column 80) '(global-auto-revert-mode t) '(global-display-line-numbers-mode t) '(global-subword-mode t) '(gofmt-command "goimports") '(inhibit-startup-screen t) '(org-agenda-files '("~/org/1.TODO.org")) '(package-enable-at-startup nil) '(package-selected-packages '(doom-themes company-go zenburn-theme langtool smart-tabs-mode typescript-mode protobuf-mode opencl-mode glsl-mode go-mode markdown-mode srefactor irony cmake-mode company magit use-package)) '(safe-local-variable-values '((vc-follow-symlinks . t) (TeX-master . t) (TeX-parse-self . t))) '(tab-width 4) '(warning-suppress-log-types '((comp))) '(whitespace-style '(face trailing tabs lines-tail newline space-before-tab::tab space-before-tab::space space-before-tab tab-mark))) (if (display-graphic-p) (progn (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) ) (progn (if (fboundp 'toggle-scroll-bar) (toggle-scroll-bar -1)) (menu-bar-mode -1) (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) ) ) (add-to-list 'default-frame-alist '(fullscreen . maximized)) (add-hook 'before-save-hook 'delete-trailing-whitespace) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; package.el and use-package bootstrap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("gnu" . "https://elpa.gnu.org/packages/"))) (package-initialize) (eval-when-compile (unless (package-installed-p 'use-package) (unless package-archive-contents (package-refresh-contents)) (package-install 'use-package)) (require 'use-package)) (require 'use-package) (require 'use-package-ensure) (setq use-package-always-ensure t) (use-package doom-modeline :init (doom-modeline-mode 1) (display-time-mode 1)) (use-package delight :config (delight '((eldoc-mode nil "eldoc") (subword-mode nil "subword"))) ) (use-package multiple-cursors :bind (("C-c m >" . 'mc/mark-next-like-this) ("C-c m <" . 'mc/mark-previous-like-this) ("C-c m a" . 'mc/mark-all-like-this) ("C-c m e" . 'mc/edit-lines) ) ) ;; (use-package ansi-color ;; :config ;; (defun atu/colorize-compilation-buffer () ;; (when (eq major-mode 'compilation-mode) ;; (ansi-color-apply-on-region compilation-filter-start (point-max)))) ;; :hook ;; (compilation-filter . atu/colorize-compilation-buffer)) (use-package smart-tabs-mode :config (setq-default tab-width 4) ; or any other preferred value (setq cua-auto-tabify-rectangles nil) (defadvice indent-relative (around smart-tabs activate) (let ((indent-tabs-mode nil)) ad-do-it)) (defadvice indent-according-to-mode (around smart-tabs activate) (let ((indent-tabs-mode indent-tabs-mode)) (if (memq indent-line-function '(indent-relative indent-relative-maybe)) (setq indent-tabs-mode nil)) ad-do-it)) (smart-tabs-advice c-indent-line c-basic-offset) (smart-tabs-advice c-indent-region c-basic-offset) (smart-tabs-add-language-support cmake cmake-mode-hook ( (cmake-indent . cmake-tab-width) ) ) (smart-tabs-add-language-support protobuf protobuf-mode-hook ( (c-indent-line . c-basic-offset) (c-indent-region . c-basic-offset) ) ) (smart-tabs-add-language-support html html-mode-hook ( (sgml-indent-line . sgml-basic-offset) ) ) (smart-tabs-add-language-support glsl glsl-mode-hook ( (c-indent-line . c-basic-offset) (c-indent-region . c-basic-offset) ) ) (smart-tabs-add-language-support opencl opencl-mode-hook ( (c-indent-line . c-basic-offset) (c-indent-region . c-basic-offset) ) ) (smart-tabs-insinuate 'c 'c++ 'cmake 'nxml 'protobuf 'html 'glsl) ) (use-package magit :commands (magit-status) :bind ("C-x g" . magit-status) :hook (magit-mode . (lambda () (setq-local whitespace-style nil))) :custom (magit-credential-cache-daemon-socket nil) ) (use-package company :delight :bind ( ("M-TAB" . company-complete) ) :config (global-company-mode t) ) (use-package cmake-mode :hook (cmake-mode . lsp-deferred) :config (setq cmake-tab-width 4) ) (use-package yasnippet :delight yas-minor-mode :config (yas-global-mode) :after (company) :bind ( :map yas-minor-mode-map ("TAB" . nil) ) ) (use-package yasnippet-snippets :after (yasnippet) ) (use-package projectile :bind ( :map projectile-mode-map ( "C-c p" . 'projectile-command-map) ) :delight :config (projectile-mode +1) (setq projectile-per-project-compilation-buffer t) (projectile-register-project-type 'ng2 '("angular.json" "package.json" "tsconfig.json") :project-file "angular.json" :compile "npm install" :test "ng test --progress=false" :run "ng serve" :test-suffix ".spec") ) (use-package vterm) (use-package flycheck :delight :bind (("C-c C-n" . 'flycheck-next-error)) :config (defvar-local atu/flycheck-local-cache nil) (defun atu/flycheck-checker-get (fn checker property) (or (alist-get property (alist-get checker atu/flycheck-local-cache)) (funcall fn checker property))) (advice-add 'flycheck-checker-get :around 'atu/flycheck-checker-get) ) (use-package which-key :delight :config (which-key-mode)) (use-package lsp-mode :delight :after (flycheck) :config (yas-minor-mode) (if (display-graphic-p) (setq lsp-ui-doc-use-webkit t) ) (add-to-list 'lsp-language-id-configuration '("\\.postcss\\'" . "css")) (advice-add 'lsp :before (lambda (&rest _args) (eval '(setf (lsp-session-server-id->folders (lsp-session)) (ht) ) ) ) ) :bind ( ("C-c C-d" . lsp-ui-doc-toggle) ) :init ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") (setq lsp-keymap-prefix "C-c l") :hook ( ;; replace XXX-mode with concrete major-mode(e. g. python-mode) ;; if you want which-key integration (c++-mode . lsp-deferred) (lsp-mode . lsp-enable-which-key-integration)) :commands (lsp lsp-deferred)) (use-package lsp-ui :commands lsp-ui-mode :config (setq lsp-ui-sideline-show-diagnostics nil) :custom-face (lsp-ui-doc-background ((t (:background "#373B41")))) ) (use-package treemacs :bind (("C-x t t" . treemacs) ("M-0" . treemacs-select-window)) :config (add-hook 'treemacs-mode-hook (lambda () (display-line-numbers-mode -1))) (treemacs-project-follow-mode t) ) (use-package treemacs-projectile) (use-package nerd-icons ) (use-package treemacs-nerd-icons :config (treemacs-load-theme "nerd-icons")) ;; (use-package lsp-treemacs ;; :after lsp-mode ;; ) (use-package lsp-ltex :init (setq lsp-ltex-version "15.2.0")) ; make sure you have set this, see below (use-package ng2-mode :hook (typescript-mode . lsp-deferred) ) (use-package lsp-pyright :hook (python-mode . (lambda () (require 'lsp-pyright) (lsp-deferred))) ; or lsp-deferred ) (use-package yaml-mode) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PYTHON ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package python :custom (python-shell-interpreter "ipython") (python-shell-interpreter-args "-i --simple-prompt") (python-indent-guess-indent-offset-verbose nil) :hook (python-mode . (lambda () (setq-local company-prescient-sort-length-enable nil))) (python-mode . (lambda () (setq-local fill-column 88))) (python-mode . lsp-deferred) (python-mode . atu/activate-venv) (lsp-managed-mode . (lambda () (when (derived-mode-p 'python-mode) (setq atu/flycheck-local-cache '((lsp . ((next-checkers . (python-flake8))))))))) ) (use-package pyvenv :after (projectile) :config (defun atu/get-direnv-venv () "Gets .direnv from project root python venv if any" (when-let* ((root-dir (projectile-project-root)) (direnv (concat (file-name-as-directory root-dir) ".direnv")) (direnv-exists (file-directory-p direnv)) (venvs (directory-files direnv t "python-.*"))) (car (last venvs))) ) (defun atu/get-dotvenv () "Gets .venv from project root if any" (when-let* ((root-dir (projectile-project-root)) (venv-file (concat (file-name-as-directory root-dir) ".venv")) (venv-exists (file-exists-p venv-file)) (venv-name (with-temp-buffer (insert-file-contents venv-file) (nth 0 (split-string (buffer-string)))))) venv-name) ) (defun atu/get-venv-name () "Gets venv name from project root. Support .venv and .direnv structure" (or (atu/get-dotvenv) (atu/get-direnv-venv)) ) (defun atu/activate-venv () "Activate python environment according to the project root" (when-let ((venv-name (atu/get-venv-name))) (setenv "WORKON_HOME" venv-name) (pyvenv-mode) (pyvenv-workon venv-name) (pyvenv-activate venv-name) (message (format "Using python: %s" venv-name)) ) ) (defun atu/get-venv-python () "returns python executable from current venv" (when-let* ((venv-name (atu/get-venv-name)) (python-exec (concat (file-name-as-directory venv-name) "bin/python3")) (python-exists (file-executable-p python-exec)) ) python-exec) ) (defun atu/activate-flycheck () "Activate flycheck unless its in the venv" (if-let ((venv-name (atu/get-venv-name))) (unless (and buffer-file-name (file-in-directory-p buffer-file-name venv-name)) (flycheck-mode)) (flycheck-mode)) ) (defun atu/pyls-set-jedi-environment () "Sets the jedi environment according to the discovered venv" (when-let ((venv-name (atu/get-venv-name))) (setq lsp-pylsp-plugins-jedi-environment venv-name)) ) (defun atu/append-workspace-extra-paths () "Appends needed extra-paths to lsp-jedi workspace if found" (when-let* ((venv-name (atu/get-venv-name)) (site-packages (file-expand-wildcards (concat (file-name-as-directory venv-name) "lib/python*/site-packages"))) (site-package (car site-packages))) (setq lsp-jedi-workspace-extra-paths (vconcat lsp-jedi-workspace-extra-paths (vector site-package)) ) ) ) (defun atu/flycheck-set-python-paths () "Sets the rights executable for flycheck" (when-let ((python-exec (atu/get-venv-python))) (flycheck-set-checker-executable 'python-flake8 python-exec) (flycheck-set-checker-executable 'python-pylint python-exec) (flycheck-set-checker-executable 'python-mypy python-exec) (flycheck-reset-enabled-checker 'python-flake8) (flycheck-reset-enabled-checker 'python-pylint) (flycheck-add-next-checker 'lsp 'python-pylint) ) ) :hook (python-mode . atu/pyls-set-jedi-environment) ;(python-mode . atu/activate-flycheck) ;(python-mode . atu/append-workspace-extra-paths) (lsp-managed-mode . atu/flycheck-set-python-paths) ) (use-package blacken :commands blacken-mode blacken-buffer :hook (python-mode . blacken-mode) ) (use-package py-isort :commands py-isort-buffer :hook (python-mode . (lambda () (add-hook 'before-save-hook 'py-isort-before-save))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; C/C++ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (add-to-list 'auto-mode-alist '("\\.h\\'" . c-c++-header)) (defconst tuleu-cc-style '("gnu" (c-offsets-alist . ((innamespace . [0]))) ) ) (c-add-style "tuleu-c++" tuleu-cc-style) (defun my-c-common-hook () (smart-tabs-mode) (if (derived-mode-p 'c-mode 'c++-mode) (cppcm-reload-all) ) ) (add-hook 'c-mode-common-hook 'my-c-common-hook) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TeX/LaTeX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (use-package auctex ;; :hook (LaTeX-mode TeX-mode) ;; ) ;; (use-package auctex-latexmk ;; :hook (LaTeX-mode TeX-mode) ;; :bind ( ;; ("C-x f" . find-file-at-point) ;; :map LaTeX-mode-map ;; ([remap reftex-citation] . my-latex-insert-cite) ;; ("M-q" . my-latex-fill-paragraph) ;; ) ;; :config ( ;; (add-to-list 'TeX-command-list ;; '("latexmk" "latexmk -pdf -interaction=nonstopmode -shell-escape %s" TeX-run-TeX nil t ;; :help "Run latexmk on file")) ;; (setq TeX-command-default "latexmk") ;; (setq LaTeX-includegraphics-read-file 'LaTeX-includegraphics-read-file-relative) ;; (setq LaTeX-includegraphics-strip-extension-flag nil) ;; (add-to-list 'LaTeX-includegraphics-extensions '"tikz") ;; ;; use Okular as default pdf viewer ;; (setq TeX-view-program-selection '((output-pdf "Okular PDF Viewer"))) ;; (add-to-list 'TeX-expand-list '("%(dir)" (lambda nil (expand-file-name (TeX-master-directory))))) ;; (setq TeX-view-program-list ;; '(("Okular PDF Viewer" "okular --unique %o#src:%n%(dir)./%b"))) ;; ;; (setq auctex-latexmk-inherit-TeX-PDF-mode t) ;; ;; launch server if not launched ;; (load "server") ;; (unless (server-running-p) (server-start)) ;; (setq reftex-plug-into-AUCTeX t) ;; (turn-on-reftex) ;; (setq TeX-parse-self t) ;; (setq TeX-auto-save t) ;; (TeX-PDF-mode) ;; (setq reftex-ref-macro-prompt nil) ;; (defun my-latex-insert-cite (&optional P) ;; "" ;; (interactive "P") ;; (TeX-insert-macro "cite") ;; ) ;; (setq-default TeX-master nil) ;; (defun my-latex-fill-paragraph (&optional P) ;; "When called with prefix argument call `fill-paragraph'. ;; Otherwise split the current paragraph into one sentence per line." ;; (interactive "P") ;; (if (not P) ;; (save-excursion ;; (let ((fill-column 12345678)) ;; relies on dynamic binding ;; (fill-paragraph) ;; this will not work correctly if the paragraph is ;; ;; longer than 12345678 characters (in which case the ;; ;; file must be at least 12MB long. This is unlikely.) ;; (let ((end (save-excursion ;; (forward-paragraph 1) ;; (backward-sentence) ;; (point-marker)))) ;; remember where to stop ;; (beginning-of-line) ;; (while (progn (forward-sentence) ;; (<= (point) (marker-position end))) ;; (just-one-space) ;; leaves only one space, point is after it ;; (delete-char -1) ;; delete the space ;; (insert " %");; insert a % ;; (newline) ;; and insert a newline ;; (LaTeX-indent-line) ;; I only use this in combination with late, so this makes sense ;; )))) ;; ;; otherwise do ordinary fill paragraph ;; (fill-paragraph P)) ;; ) ;; ) ;; ) (use-package markdown-mode) (use-package go-mode :after (projectile) :config (unbind-key "C-c C-d" go-mode-map) (defun go-compile-command () "returns a string to compile a go project" (setq project-makefile (concat (file-name-as-directory (projectile-project-root)) "Makefile")) (if (file-exists-p project-makefile) "make" "go build && go test && go vet" ) ) (projectile-update-project-type 'go :compile 'go-compile-command) :hook (go-mode . lsp-deferred) (go-mode . (lambda () (add-hook 'before-save-hook #'lsp-format-buffer t t) (add-hook 'before-save-hook #'lsp-organize-imports t t) )) ) (use-package glsl-mode) (use-package opencl-mode) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Protobuf ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package protobuf-mode :mode "\\.proto\\'" :config (defconst my-protobuf-style '((c-basic-offset . 4) (indent-tabs-mode . t)) ) ;; (c-add-style "my-style" my-protobuf-style t) ) (use-package typescript-mode :config (progn (setq create-lockfiles nil) (add-to-list 'compilation-error-regexp-alist '("^Error: \\(.*?\\):\\([0-9]+\\):\\([0-9]+\\)" 1 2 3)) ) ) (use-package json-mode) (use-package prettier :delight "PR" :config (setq prettier-mode-sync-config-flag nil) :hook (web-mode . prettier-mode) (typescript-mode . prettier-mode) ) (use-package web-mode :mode "\\.html?\\'" "\\.svelte\\'" "\\.\\(post\\)?css\\'" :interpreter "html" "css" "svelte" :config (setq web-mode-content-types-alist '(("css" . "\\.\\(post\\)?css\\'"))) :hook (web-mode . lsp-deferred) ) (use-package dockerfile-mode :hook (dockerfile-mode . lsp-deferred) ) (use-package doom-themes :config (setq doom-themes-enable-bold t ; if nil, bold is universally disabled doom-themes-enable-italic t) ; if nil, italics is universally disabled (load-theme 'doom-spacegrey t) ;; Enable flashing mode-line on errors (doom-themes-visual-bell-config ) ;; or for treemacs users ;(setq doom-themes-treemacs-theme "doom-atom") ; use "doom-colors" for less minimal icon theme ;(doom-themes-treemacs-config) ;; Corrects (and improves) org-mode's native fontification. (doom-themes-org-config) (defun atu/toggle-display-line-mode () "toggle between relative and absolute display-line-mode" (interactive) (if (eq display-line-numbers 'relative) (setq display-line-numbers 'absolute) (setq display-line-numbers 'relative) ) ) :init (global-whitespace-mode 1) :bind ( ("C-c d l" . 'atu/toggle-display-line-mode) ) ) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) ;; Local Variables: ;; vc-follow-symlinks: t ;; End: