diff --git a/.emacs b/.emacs index f16b73d..0f5944b 100644 --- a/.emacs +++ b/.emacs @@ -18,8 +18,6 @@ (other . "gnu"))) '(company-idle-delay 20.0) '(compilation-scroll-output 'first-error) - '(elpy-formatter 'black) - '(elpy-test-runner 'elpy-test-pytest-runner) '(global-auto-revert-mode t) '(global-display-line-numbers-mode t) '(gofmt-command "goimports") @@ -30,7 +28,7 @@ ("melpa" . "https://melpa.org/packages/"))) '(package-enable-at-startup nil) '(package-selected-packages - '(company-go zenburn-theme langtool smart-tabs-mode typescript-mode protobuf-mode opencl-mode glsl-mode go-mode elpy markdown-mode srefactor irony cmake-mode company magit use-package)) + '(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) @@ -83,12 +81,6 @@ :config (setq-default tab-width 4) ; or any other preferred value (setq cua-auto-tabify-rectangles nil) - ;; (defadvice align (around smart-tabs activate) - ;; (let ((indent-tabs-mode nil)) ad-do-it)) - ;; (defadvice align (around smart-tabs activate) - ;; (let ((indent-tabs-mode nil)) ad-do-it)) - ;; (defadvice align-regexp (around smart-tabs activate) - ;; (let ((indent-tabs-mode nil)) ad-do-it)) (defadvice indent-relative (around smart-tabs activate) (let ((indent-tabs-mode nil)) ad-do-it)) (defadvice indent-according-to-mode (around smart-tabs activate) @@ -146,19 +138,13 @@ ) (use-package cmake-mode + :hook + (cmake-mode . lsp-deferred) :config (setq cmake-tab-width 4) ) -(use-package srefactor - :bind (:map c-mode-map - ("M-RET" . srefactor-refactor-at-point) - :map c++-mode-map - ("M-RET" . srefactor-refactor-at-point)) - ) - - (use-package yasnippet :config (yas-global-mode) @@ -180,17 +166,21 @@ (projectile-mode +1) ) -(use-package cpputils-cmake +(use-package flycheck :config - (setq cppcm-write-flymake-makefile nil) - :bind ( "C-c C-f" . ff-find-other-file) - ) + (defvar-local atu/flycheck-local-cache nil) -(use-package flycheck) + (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) (use-package lsp-mode + :after (flycheck) :config (yas-minor-mode) (global-set-key (kbd "C-c C-n") 'flycheck-next-error) @@ -206,20 +196,16 @@ :init ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") (setq lsp-keymap-prefix "C-c l") - (require 'lsp-ltex) - :hook (;; replace XXX-mode with concrete major-mode(e. g. python-mode) - (c++-mode . lsp-deferred) - (c-mode . lsp-deferred) - (cmake-mode . lsp-deferred) - (go-mode . lsp-deferred) - (typescript-mode . lsp-deferred) - (html-mode . lsp-deferred) + :hook ( + ;; replace XXX-mode with concrete major-mode(e. g. python-mode) ;; if you want which-key integration (lsp-mode . lsp-enable-which-key-integration)) + :commands (lsp lsp-deferred)) (use-package lsp-ui + :after lsp-mode :config (setq lsp-ui-sideline-show-diagnostics nil) ) @@ -228,10 +214,135 @@ :init (setq lsp-ltex-version "15.2.0")) ; make sure you have set this, see below -(use-package ng2-mode) +(use-package ng2-mode + :hook + (html-mode . lsp-deferred) + (typescript-mode . 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) + ;; (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")) + (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 (concat (file-name-as-directory root-dir) ".venv")) + (venv-exists (file-exists-p venv)) + (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))) + (pyvenv-mode) + (pyvenv-workon 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/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/activate-venv) + ;(python-mode . atu/activate-flycheck) + (python-mode . atu/append-workspace-extra-paths) + (lsp-managed-mode . atu/flycheck-set-python-paths) + ) + + +(use-package lsp-jedi + :config + (with-eval-after-load "lsp-mode" + (add-to-list 'lsp-disabled-clients 'pyls) + (add-to-list 'lsp-enabled-clients 'jedi) + ) + ) + + +;; (use-package blacken +;; :commands blacken-mode blacken-buffer +;; :hook +;; (python-mode . blacken-mode) +;; ) + +;; (use-package py-isort +;; :commands py-isort-buffer +;; :hook +;; (before-save-hook . py-isort-before-save) +;; ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; C/C++ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -331,15 +442,6 @@ (use-package markdown-mode) -(use-package elpy - :init - (elpy-enable) - :config - (add-hook 'elpy-mode-hook (lambda () - (add-hook 'before-save-hook - 'elpy-format-code nil t))) - ) - (use-package go-mode :after (projectile) :config