Hlavní navigace

Minimalistická IDE konfigurace GNU Emacsu

22. 2. 2018 14:09 (aktualizováno) | ggl

Konfigurace je založena na Language Server Protokolu a jeho implementaci v Emacsu, což nám umožní omezit množství konfigurace specifické pro jednotlivé jazyky na minimum.

Předpokládám, že čtenáři nejsou úplní začátečníci. Pokud nevytváříte konfiguraci od nuly, první část můžete přeskočit.


Příprava

Začneme vytvořením adresáře obsahujícího soubory init.el a custom.el. Do init.el vložíme

(setq user-init-file (or load-file-name (buffer-file-name)))
(setq user-emacs-directory (file-name-directory user-init-file))

pro nastavení konfiguračního adresáře na adresář, ve kterém se nachází init.el.

Dále přidáme repozitáře a inicializujeme správce balíčků

(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
                         ("marmalade" . "https://marmalade-repo.org/packages/")
                         ("melpa" . "https://melpa.org/packages/")))
(package-initialize)

Nastavíme custom-file na custom.el

(setq custom-file (concat user-emacs-directory "custom.el"))
(load custom-file)

Pokud vytváříme konfiguraci v jiném adresáři než ~/.emacs.d, spustíme Emacs s parametry -q –load FILE, kde FILE je náš init.el.


Instalace závislostí

Nainstalujeme závislosti ručně nebo následujícím kódem

(setq package-list '(flycheck company-lsp lsp-ui lsp-mode lsp-python counsel ivy swiper crux))

(unless package-archive-contents
  (package-refresh-contents))


(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

Po instalaci můžeme kód odstanit. Zrychlí to start. Seznam nainstalovaných balíčků se ukládá do custom.el.

nainstalujeme python-language-server a flake8.

pip install python-language-server flake8


Zprovoznění IDE funkcionalit

Nastavení lsp módu je společné pro všechny jazyky

(require 'lsp-mode)
(require 'company-lsp)

(push 'company-lsp company-backends)

(add-hook 'lsp-mode-hook #'(lambda ()
                 (customize-set-variable 'lsp-enable-eldoc nil)
                 (flycheck-mode 1)
                 (company-mode 1)))

lsp-enable-eldoc nemusíte vypínat. Mě osobně zobrazování dokumentace ruší. Když chci vidět docstring, použiji skok na definici.

aktivace lsp-python

(require 'lsp-python)
(add-hook 'python-mode-hook #'lsp-python-enable)

flycheck použije backend lsp, který v defaultním nastavení IMHO za moc nestojí. Doporučuji aktivovat flake8 vytvořením konfiguračního souboru ~/.config/flake8. Nebo nastavením flake8 backendu příkazem (flycheck-select-checker 'python-flake8) v python-mode hooku.

lsp-mode pro ostatní jazyky, pro které máme nainstalován server, aktivujeme obdobným způsobem. Instalací lsp-jazyk módu a jeho aktivací v hooku.

GUI

pár vylepšení GUI

(setq inhibit-startup-screen 1)
(tool-bar-mode 0)

aktivace ivy

(require 'counsel)
(ivy-mode 1)
(counsel-mode 1)

Ovládání

Dvě malé změny defaultního ovlání, které používám.

když není vybrán region, pracuj s celou řádkou

(require 'crux)
(crux-with-region-or-line kill-region)
(crux-with-region-or-line kill-ring-save)

c-a skáče střídavě na začátek řádky a na první neprázdný znak

(global-set-key [remap move-beginning-of-line] #'crux-move-beginning-of-line)


Celý soubor init.el

(setq user-init-file (or load-file-name
                         (buffer-file-name)))
(setq user-emacs-directory (file-name-directory user-init-file))

(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
                         ("marmalade" . "https://marmalade-repo.org/packages/")
                         ("melpa" . "https://melpa.org/packages/")))
(package-initialize)

(setq custom-file (concat user-emacs-directory "custom.el"))
(load custom-file)

;;; lsp ide

(require 'lsp-mode)
(require 'company-lsp)

(push 'company-lsp company-backends)
(add-hook 'lsp-mode-hook #'(lambda ()
                             (customize-set-variable 'lsp-enable-eldoc nil)
                             (flycheck-mode 1)
                             (company-mode 1)))

;;; python

(require 'lsp-python)
(add-hook 'python-mode-hook #'(lambda ()
              (lsp-python-enable)
               (flycheck-select-checker 'python-flake8)))

;;; ui

(setq inhibit-startup-screen 1)
(tool-bar-mode 0)

(require 'counsel)
(ivy-mode 1)
(counsel-mode 1)

;;; controls

(require 'crux)

(crux-with-region-or-line kill-region)
(crux-with-region-or-line kill-ring-save)
(global-set-key [remap move-beginning-of-line] #'crux-move-beginning-of-line)