Index: emacs/.emacs.d/.emacs-config.org
===================================================================
--- emacs/.emacs.d/.emacs-config.org	(revision fe2941baeff0f28f4fd9a82ba516b94348361d9b)
+++ emacs/.emacs.d/.emacs-config.org	(revision fde9de8aaab787061625952015d69db18c82c878)
@@ -1,109 +1,27 @@
-﻿#+TITLE: Конфигурация Emacs
-#+AUTHOR: Кириллов <w96k.dev> Михаил
+﻿#+TITLE: Emacs configuration
+#+AUTHOR: Kirillov <w96k.dev> Mikhail
 #+OPTIONS: toc:nil
 #+PROPERTY: header-args:elisp :results silent
 #+STARTUP: showeverything
 
-* Вклады
-Конфигурация составлена из моего кода, а также кода из конфигураций
-других людей. Их настолько, что все перечислять я не смогу, но оставлю
-интересные конфигурации других людей, в которые я время от времени
-заглядываю.
-
-* Лицензия
-Я выступаю против копирайта и интеллектуальной собственности в целом,
-поэтому стараюсь копирайт избегать. По этой причине свой код
-распространяю на правах общественного достояния вашей страны. Для этого
-используется лицензия [[https://creativecommons.org/publicdomain/zero/1.0/][CC0]]. Если кратко, то можете использовать без
-ограничений вплоть до полной приватизации всего контента. К сожалению за
-чужие сниппеты не могу ручаться, они распространяются по своим лицензиям
-и я их не указывал, впрочем всё равно никто это не проверяет и я бы не
-стал напрягаться из-за авторских прав на конфигурацию текстового
-редактора.
-
-* О конфигурации
-Минимальная конфигурация Emacs. Пакеты ставлю через Guix или package.el
-(elpa и melpa), для разделения ответственности использую грамотное
-программирование при помощи org-mode.
-
-Версия Emacs 28+.
-- В Guix пакет  ~emacs-next~
-- В FreeBSD пакет ~emacs-devel~
-- В Ubuntu [[https://launchpad.net/~kelleyk/+archive/ubuntu/emacs][PPA emacs28]] и пакет ~emacs28-native~
-
-Из программирования поддерживаются /C/, Java, /Python/, /Common Lisp /
-Scheme/, Haskell, Idris, Ocaml, /Ruby/, PHP, /SML/, SQL, Erlang,
-редактирование веб-шаблонов и различных форматов конфигураций. Какие-то
-языки в лучшей мере настроены, какие-то хуже, но есть почти все
-плюс-минус популярные.
-
-Для систем контроля версий использую встроенный /VC/ и в некоторых случаях
-/Magit/. Для входа в виртуальные среды используется Direnv.
-
-Для ведения заметок использую методологию Zettelkasten при помощи
-org-roam. Для доступа к оффлайн википедии и другим ресурсам Kiwix
-клиент, который стучится на сервер, который стоит дома.
-
-Для коммуникаций клиент для Telegram /telega/, для IRC /erc/ и электронной
-почты /gnus/, для Mastodon mastodon.el.
-
-Для системного администрирования имеют пакеты для работы с Debian,
-NixOS, Guix. Также есть поддержка Docker, Docker-compose: можно
-запускать/стопать контейнеры, а также залетать в них через TRAMP.
-
-Для установки необходимо установить пакеты Emacs из ~../../guix/user.scm~
-и выполнить tangle файла при помощи /M-x org-babel-tangle-file/. В
-дальнейшем для развёртывания конфигурации можно использовать /M-x
-config-tangle/ или /M-x config-load/.
-
-Данная конфигурация доступна также в сети интернет по адресу, но так как
-сайт обновляется нечасто, то там может лежать старая версия:
+* About this Emacs configuration
+
+Configuration uses org-mode to tangle its contents to init.el and then
+be used by emacs. I use guix home for my emacs config on gnu guix
+system.
+
+If you see :tangle nil it means that snippet is not used anymore, but
+it is left because it might be valuable in a future for me.
+
+This configuration is available here:
 https://w96k.dev/emacs.html
 
-Исходники конфигурации лежат на Sourcehut:
+The git source code is hosted on Sourcehut:
 https://git.sr.ht/~w96k/dotfiles/tree/master/item/emacs
 
-Распространяется на условиях свободной лицензии [[https://gnu.org/licenses/gpl-3.0.ru.html][GNU GPL v3]],
-реиспользование одобряется пока распространяется под той же лицензией.
-
-* Пакеты
-Данная конфигурация использует следующие пакеты:
-
-- Avy :: Прыжки по тексту
-- Anaconda :: Поддержка Python
-- Auctex :: Поддержка Tex и LaTeX
-- Browse Kill Ring :: Обзор буфера обмена
-- Haskell Mode :: Поддержка языка Haskell
-- Idris Mode :: Поддержка языка Idris
-- Magit :: Интерфейс к git
-- Gitpatch :: Создание патчей
-- Goto Cgh :: Переход к последнему изменению в буфере
-- Debbuge :: Интерфейс debbugs (репорт багов Debian)
-- Deft :: Полнотекстовый поиск
-- Direnv :: Изменение окружения при "входе" в директорию
-- Docker и Docker Compose :: Моды для поддержки контейнерных технологий
-- Exec Path From Shell :: Синхронизация PATH переменной из шелла
-- Expand Region :: Семантическое расширение выделения на курсоре
-- Robe :: Прыжки по определениям Ruby
-- Geiser :: Repl для языка Scheme
-- Guix :: Интерфейс к Guix
-- Org Roam :: Zettelkasten заметки в org-mode
-- Gnuplot :: Программное рисование графиков
-- Nix Mode :: Поддержка языка Nix
-- Pdf Tools :: Рендер PDF файлов в Emacs
-- PHP Mode :: Поддержка языка PHP
-- Kiwix :: Чтение скачанных архивов веб-страниц
-- SML Mode :: Поддержка языка Standard ML
-- Sly/Slime :: REPL языка Common Lisp
-- Simple HTTPD :: HTTP Сервер на elisp
-- Telega :: Интерфейс к Telegram
-- Treemacs :: Сайдбар для навигации по проекту
-- Undo Tree :: Визуализация дерева отмен
-- Yasnippet и Yasnippet Snippets :: Сниппеты для текстов и ЯПов
-- Web Mode :: Поддержка шаблонов HTML и прочего
-
-Следующий блок нужен для тех, кто хочет использовать встроенный пакетный
-менеджер. Я использую Guix для большей части взаимодействий со сторонним
-кодом.
+The license of emacs config and dotfiles is CC0 which is Public Domain.
+
+** Packets
+Only needed when I need to install a package from Melpa and not GNU Guix
 #+begin_src elisp :tangle nil
   (require 'package)
@@ -116,119 +34,4 @@
 
   (require 'gnutls)
-
-  (progn
-      (package-refresh-contents)
-      (package-install 'avy)
-      (package-install 'php-mode)
-      (package-install 'phps-mode)
-      ;; (package-install 'anzu)
-      (package-install 'anaconda-mode)
-      (package-install 'auctex)
-      ;; (package-install 'rmsbolt)
-      ;; (package-install 'beginend)
-      ;; (package-install 'composer)
-      (package-install 'cinspect)
-      (package-install 'debian-el)
-      (package-install 'dpkg-dev-el)
-      (package-install 'edebug-inline-result)
-      ;;(package-install 'haskell-mode)
-      ;;(package-install 'idris-mode)
-      (package-install 'magit)
-      (package-install 'git-timemachine)
-      (package-install 'git-dwim)
-      (package-install 'gitpatch)
-      (package-install 'goto-chg)
-      (package-install 'debbugs)
-      ;;(package-install 'deft)
-      ;; (package-install 'direnv)
-      (package-install 'dumb-jump)
-      (package-install 'docker)
-      (package-install 'docker-cli)
-      (package-install 'docker-tramp)
-      (package-install 'docker-compose-mode)
-      (package-install 'org-sql)
-      ;;(package-install 'eglot)
-      ;; (package-install 'eglot-java)
-      ;; (package-install 'mastodon)
-      ;; (package-install 'exec-path-from-shell)
-      (package-install 'expand-region)
-      ;; (package-install 'flymake-php)
-      (package-install 'flycheck)
-      (package-install 'flycheck-phpstan)
-      (package-install 'phpactor)
-      ;;(package-install 'robe)
-      (package-install 'geiser)
-      (package-install 'geiser-guile)
-      (package-install 'guix)
-      ;; (package-install 'git-gutter)
-      ;; (package-install 'gnuplot)
-      ;;(package-install 'swiper)
-      ;;(package-install 'sqlite3)
-      (package-install 'org-roam)
-      ;; (package-install 'org-roam-ui)
-      ;; (package-install 'org-download)
-      ;; (package-install 'org-babel-eval-in-repl)
-      ;;(package-install 'ob-php)
-      ;; (package-install 'on-screen)
-      ;;(package-install 'nix-mode)
-      (package-install 'pdf-tools)
-      ;;(package-install 'phpactor)
-      ;; (package-install 'company-quickhelp)
-      ;;(package-install 'ac-php)
-      (package-install 'php-mode)
-      (package-install 'php-quickhelp)
-      (package-install 'phan)
-      ;;(package-install 'php-cs-fixer)
-      ;; (package-install 'company-php)
-      ;;(package-install 'php-eldoc)
-      ;;(package-install 'phps-mode)
-      (package-install 'realgud)
-      ;; (package-install 'realgud-xdebug)
-      ;; (package-install 'kiwix)
-      ;;(package-install 'sml-mode)
-      (package-install 'sly)
-      (package-install 'simple-httpd)
-      (package-install 'sudo-edit)
-      ;;(package-install 'treemacs)
-      (package-install 'undo-tree)
-      ;; (package-install 'yasnippet)
-      ;; (package-install 'yasnippet-snippets)
-      ;; (package-install 'vimrc-mode)
-      ;; (package-install 'flymake-phpcs)
-      ;; (package-install 'flymake-phpstan)
-      ;; (package-install 'no-littering)
-      (package-install 'web-mode)
-      ;; (package-install 'which-key)
-      ;; (package-install 'reverse-im)
-      (package-install 'imenu-list)
-      ;; (package-install 'isearch-mb)
-      (package-install 'visual-fill-column)
-      ;; (package-install 'browse-kill-ring)
-      (package-install 'corfu)
-      ;; (package-install 'inf-ruby)
-      (package-install 'yaml-mode)
-      ;; (package-install 'geben)
-      (package-install 'link-hint)
-      (package-install 'whole-line-or-region)
-      (package-install 'quickrun)
-      ;; (package-install 'psysh)
-      ;; (package-install 'restclient)
-      )
-#+end_src
-
-*** Ручная компиляция
-#+begin_src elisp :tangle nil :results nil
-  ;; (native-compile-async "~/.emacs.d/elpa/" 'recursively)
-  (native-compile-async "~/.guix-profile/share/emacs/site-lisp" 'recursively)
-
-  ;; block until native compilation has finished
-    (while (or comp-files-queue
-	       (> (comp-async-runnings) 0))
-#+end_src
-
-** Отключаем ненужные загрузки
-#+begin_src emacs-lisp :tangle nil
-  ;; Disable guix autoloading and x resources loading
-  (setq site-run-file nil)
 #+end_src
 
@@ -242,130 +45,5 @@
 
 
-** Редакируем GUI
-Удаляем ненужные бары, меняем шрифт и модлайн. Использую дефолтный для
-шрифт DeJavu или недефолтный Agave, так как он является одним из самых интернациональных
-шрифтов по количеству доступных символов после Unifont. Unifont я не
-стал использовать, потому что иксы замыливают этот пиксельный шрифт, что
-делает его использование крайне неприятным.
-
-#+begin_src emacs-lisp :tangle nil
-  ;; Change mode-line-modes to show only major mode
-  (defvar mode-line-major-mode
-    (let ((recursive-edit-help-echo "Recursive edit, type C-M-c to get out"))
-      (list (propertize "%[" 'help-echo recursive-edit-help-echo)
-	    `(:propertize ("" mode-name)
-			  help-echo "Major mode\n\
-      mouse-1: Display major mode menu\n\
-      mouse-2: Show help for major mode\n\
-      mouse-3: Toggle minor modes"
-			  mouse-face mode-line-highlight
-			  local-map ,mode-line-major-mode-keymap)
-	    '("" mode-line-process)
-	    (propertize "%n" 'help-echo "mouse-2: Remove narrowing from buffer"
-			'mouse-face 'mode-line-highlight
-			'local-map (make-mode-line-mouse-map
-				    'mouse-2 #'mode-line-widen))
-	    (propertize "%]" 'help-echo recursive-edit-help-echo)
-	    " "))
-    "Mode line construct for displaying major and minor modes.")
-
-  (put 'mode-line-major-mode 'risky-local-variable t)
-
-  ;; Change mode-line-format
-  (setq-default mode-line-format
-		'("%e"
-		  mode-line-front-space
-		  mode-line-mule-info
-
-		  mode-line-client
-		  mode-line-modified
-		  mode-line-remote
-		  mode-line-frame-identification
-		  ;; long-path
-		  mode-line-buffer-identification
-		  mode-line-misc-info
-		  "   "
-		  mode-line-major-mode
-		  " "
-		  vc-mode
-		  "  "
-
-		  mode-line-position
-		  mode-line-end-spaces
-		  ))
-#+end_src
-
-
-#+begin_src emacs-lisp :tangle nil
-  ;; Do not resize the frame at this early stage.
-  (setq frame-inhibit-implied-resize t)
-  (setq use-dialog-box nil)
-
-  ;;; Disable some gui
-  (scroll-bar-mode -1)
-  (tool-bar-mode -1)
-  (menu-bar-mode -1)
-  ;;(tooltip-mode -1)
-
-  ;;; Changing emacs default setting through customize
-  (custom-set-variables
-   '(fill-column 72)
-   '(git-gutter:added-sign " ")
-   '(git-gutter:deleted-sign " ")
-   '(git-gutter:modified-sign " ")
-   '(git-gutter:unchanged-sign " ")
-   '(lsp-headerline-breadcrumb-enable nil)
-   '(scroll-bar-mode 'nil)
-   '(scroll-bar-adjust-thumb-portion nil)
-   '(tool-bar-position 'bottom)
-   '(tool-bar-style 'both-horiz))
-
-  (custom-set-faces
-   '(default ((t (:height 140 :family "Jetbrains Mono" :embolden t))))
-   '(region ((t (:background "gray85"))))
-   '(mode-line ((t (:background "grey70" :foreground "grey10"))))
-   '(mode-line-inactive ((t (:inherit mode-line :background "grey90" :foreground "grey20" :box (:line-width (-2 . -2) :color "grey85") :weight light))))
-   '(mode-line-buffer-id ((t (:weight bold))))
-   '(mode-line-emphasis ((t (:weight bold))))
-   '(lsp-modeline-code-actions-face ((t :inherit mode-line :height 100)))
-   '(tool-bar ((t (:background "grey80" :foreground "grey10"))))
-   '(fill-column-indicator ((t (:foreground "grey95"))))
-   '(hl-line ((t (:background "gray95"))))
-   '(fringe ((t (:background "grey87"))))
-   '(header-line ((t (:inherit mode-line :background "grey90"))))
-   '(vertical-border ((t (:foreground "grey90"))))
-   '(window-divider ((t (:foreground "gray90")))))
-
-  (set-fringe-style (cons 7 7))
-
-  (defun switch-gui ()
-    "Disable/enable menu-bar and tool-bar."
-    (interactive)
-    (if menu-bar-mode
-	(progn
-	  (menu-bar-mode -1)
-	  (tool-bar-mode -1)
-	  (scroll-bar-mode -1))
-      (progn
-	(menu-bar-mode 1)
-	(tool-bar-mode 1)
-	(scroll-bar-mode 1))))
-
-  (defun switch-scroll-bar ()
-    "Disable/enable scroll-bar."
-    (interactive)
-    (if scroll-bar-mode
-	(scroll-bar-mode -1)
-      (scroll-bar-mode)))
-
-  (define-key global-map (kbd "<f5>") 'switch-gui)
-  (define-key global-map (kbd "<f8>") 'switch-scroll-bar)
-
-  (provide 'early-init)
-      ;;; early-init.el ends here
-#+end_src
-
-** Инициализируем остальной конфиг
-Следующие блоки кода выводят в файл init.el.
+** Init.el
 #+begin_src emacs-lisp :tangle init.el
   ;; -*- lexical-binding: t -*-
@@ -374,15 +52,4 @@
   ;; (setq debug-on-error nil)
   ;; (setq debug-on-quit nil)
-
-  (require 'package)
-  (package-initialize)
-
-  (defun package-loaded? (string)
-    (if (or (cl-member string package-activated-list :test #'string=)
-	    (ignore-errors (load (concat string "-autoloads"))))
-	t
-	(progn
-	  (message (concat "Package " string " is not loaded"))
-	  nil)))
 
   ;; Timer
@@ -405,5 +72,5 @@
 
 * Meta
-** Обо мне
+** About me
 #+BEGIN_SRC emacs-lisp :tangle init.el
   ;; Information about me
@@ -412,7 +79,5 @@
 #+END_SRC
 
-** Конфигурация
-Базовые функции для манипулирования конфигом в дальнейшем, чтобы не
-приходилось танглить вручную.
+** Configuration
 #+BEGIN_SRC emacs-lisp :tangle init.el
   (setq config-dotfiles-path "/home/w96k/projects/dotfiles/emacs/.emacs.d/"
@@ -431,14 +96,9 @@
     ;; (rename-file (concat config-dotfiles-path "early-init.el") config-path t)
     (rename-file (concat config-dotfiles-path "init.el") config-path t))
-
-  (defun config-load ()
-    (interactive)
-    (org-babel-load-file (concat config-dotfiles-path config-name) t))
-
-#+END_SRC
-
-* Внешний вид
-
-** Отображение номера строк и пробелов
+#+END_SRC
+
+* Appereance
+
+** Line numbers
 Изначально они отключены, но можно вызвать по клавише F7.
 #+BEGIN_SRC emacs-lisp :tangle init.el
@@ -450,6 +110,6 @@
 #+END_SRC
 
-* Редактирование
-** Файловый менеджер
+* Editing
+** Dired
 #+BEGIN_SRC emacs-lisp :tangle init.el 
   ;; Show files in KiB
@@ -461,9 +121,9 @@
 #+END_SRC
 
-** Линтер
-Использую встроенный Flymake и Flycheck
+** Linter
+I use Flymake and Flycheck
 *** Flymake
 #+BEGIN_SRC emacs-lisp :tangle nil
-  ;;(add-hook 'prog-mode-hook 'flymake-mode)
+  (add-hook 'prog-mode-hook 'flymake-mode)
 
   (require 'psalm)
@@ -508,42 +168,15 @@
 #+END_SRC
 
-** Дерево проекта
-Возможно в дальнейшем откажусь от этого пакета, так как по факту им
-пользуюсь нечасто. Он предоставляет дерево проектов, как в IDE.
-#+BEGIN_SRC emacs-lisp :tangle nil
-  (when (package-loaded? "treemacs")
-    (progn
-      (setq treemacs-width       50
-	    treemacs-show-cursor t
-	    treemacs-position    'right
-	    treemacs-indentation 1
-	    treemacs-tag-follow-mode t
-	    treemacs-fringe-indicator-mode nil)
-
-      (define-key global-map
-	(kbd "C-x C-d") 'treemacs)))
-#+END_SRC
-
-** Дерево imenu
-#+begin_src emacs-lisp :tangle init.el
-    ;; (when (package-loaded? "imenu-list")
-      (setq imenu-list-focus-after-activation nil
-	    imenu-list-auto-resize nil
-	    imenu-list-mode-line-format '()
-	    imenu-list-size 0.4)
-      (global-set-key (kbd "C-x C-d") #'imenu-list-smart-toggle)
-  ;; )
-#+end_src
-
-** Better Isearch
-#+begin_src emacs-lisp :tangle nil
-  (when (package-loaded? "isearch-mb")
-    (progn
-      (isearch-mb-mode t)
-      (global-set-key (kbd "C-s") 'isearch-forward-regexp)
-      (global-set-key (kbd "C-r") 'isearch-backward-regexp)))
-#+end_src
-
-** Система контроля версий
+** Imenu List
+#+begin_src emacs-lisp :tangle init.el
+  
+  (setq imenu-list-focus-after-activation nil
+	imenu-list-auto-resize nil
+	imenu-list-mode-line-format '()
+	imenu-list-size 0.4)
+  (global-set-key (kbd "C-x C-d") #'imenu-list-smart-toggle)
+#+end_src
+
+** Version Control System
 Модуль VC + Magit.
 
@@ -566,41 +199,40 @@
 
     ;; Use magit only when built-in VC fails
-    (when (package-loaded? "magit")
-      (progn
-	(setq magit-refresh-status-buffer nil)
-	(global-set-key (kbd "C-x g") 'magit-status)))
-
-  (package-loaded? "git-timemachine")
-#+END_SRC
-
-** Прыжки
-#+BEGIN_SRC emacs-lisp :tangle init.el
-  (when (package-loaded? "avy")
-    (progn
-      (define-key global-map (kbd "M-s M-s") 'avy-goto-char)
-      (define-key global-map (kbd "M-s s") 'avy-goto-char)
-      (define-key global-map (kbd "M-s g") 'avy-goto-line)
-      (define-key global-map (kbd "M-s l") 'avy-goto-char-in-line)
-      (define-key global-map (kbd "M-s M-l") 'avy-goto-char-in-line)
-
-      ;; Rewrite default bind to avy
-      (define-key global-map (kbd "M-g g") 'avy-goto-line)
-      (define-key global-map (kbd "M-g M-g") 'avy-goto-line)))
-
-  (when (package-loaded? "link-hint")
-    (progn
-      (define-key global-map (kbd "M-s j") 'link-hint-open-link)))
-
-  ;; Прыжок на последнее изменение
-  (when (package-loaded? "goto-chg")
-    (progn
-      (setq glc-default-span 2)
-      (define-key global-map (kbd "C-z") 'goto-last-change)
-      (define-key global-map (kbd "M-z") 'goto-last-change-reverse)))
-
-  ;; Dumb Jump
-  (when (package-loaded? "dumb-jump")
-    (progn
-      (define-key global-map (kbd "C-.") 'dumb-jump-go)))
+
+  (use-package magit
+    :defer t
+    :bind (("C-x g" . magit-status)))
+
+  (use-package git-timemachine :defer t)
+#+END_SRC
+
+** Jumps
+#+BEGIN_SRC emacs-lisp :tangle init.el
+  ;; Jumps by highlighting symbols on screen
+  (use-package avy
+    :defer t
+    :bind (("M-s M-s"	. avy-goto-char)
+	   ("M-s s"	. avy-goto-char)
+	   ("M-s g"	. avy-goto-line)
+	   ("M-s l"	. avy-goto-char-in-line)
+	   ("M-s M-l"	. avy-goto-char-in-line)
+
+	   ("M-g g"	. avy-goto-line)
+	   ("M-s M-g"	. avy-goto-line)))
+
+  (use-package link-hint
+    :defer t
+    :bind (("M-s j" . link-hint-open-link)))
+
+  ;; Jumps to last change
+  (use-package goto-chg
+    :defer t
+    :bind (("C-z" . goto-last-change)
+	   ("M-z" . goto-last-change-reverse)))
+
+  ;; Jumps using grep and similar tools
+  (use-package dumb-jump
+    :defer t
+    :bind (("C-." . dumb-jump-go)))
 
 #+END_SRC
@@ -611,15 +243,11 @@
 ** Ограничение ширины строки
 #+BEGIN_SRC emacs-lisp :tangle init.el
-  (when (package-loaded? "visual-fill-column")
-    (progn
-      ;;; Column width limit highlighter
-      (add-hook 'prog-mode-hook 'display-fill-column-indicator-mode)
-
-      ;;; Set column width to 79 according to pep8 for python
-      (add-hook 'python-mode-hook
-		(lambda () (set-fill-column 79)))))
-#+END_SRC
-
-** Подсвечивание парных скобок
+  (add-hook 'prog-mode-hook 'display-fill-column-indicator-mode)
+
+  ;;; Set column width to 79 according to pep8 for python
+  (add-hook 'python-mode-hook
+	    (lambda () (set-fill-column 79)))
+#+END_SRC
+
 ** Ввод парных скобок и кавычек (electric)
 #+BEGIN_SRC emacs-lisp :tangle init.el
@@ -627,11 +255,12 @@
   (electric-pair-mode)
   (add-hook 'prog-mode-hook 'electric-pair-mode)
-  ;; (add-hook 'prog-mode-hook 'rainbow-identifiers-mode)
+  (add-hook 'prog-mode-hook 'electric-indent-mode)
 #+END_SRC
 
 ** Kill-ring
-#+BEGIN_SRC emacs-lisp :tangle nil
-  (when (package-loaded? "browse-kill-ring")  
-    (define-key global-map (kbd "C-M-y") 'browse-kill-ring))
+#+BEGIN_SRC emacs-lisp :tangle init.el
+  (use-package browse-kill-ring
+    :defer t
+    :bind ("C-M-y" . browse-kill-ring))
 #+END_SRC
 
@@ -656,5 +285,4 @@
 #+END_SRC
 
-** Дополнение
 ** Дебаггер
 #+begin_src emacs-lisp :tangle nil
@@ -703,11 +331,4 @@
 
 #+end_src
-*** Модификация дефолта
-#+BEGIN_SRC emacs-lisp :tangle nil
-  (setq completion-styles '(basic partial-completion substring flex emacs22)
-	completion-ignore-case t
-	read-buffer-completion-ignore-case t
-	read-file-name-completion-ignore-case t)
-#+END_SRC
 *** Агрессивный дефолтный комплит
 #+BEGIN_SRC emacs-lisp :tangle nil
@@ -732,9 +353,9 @@
 При помощи пакета undo-tree   
 #+begin_src emacs-lisp :tangle init.el
-  (when (package-loaded? "undo-tree")
-    (progn
-      (add-hook 'prog-mode-hook #'undo-tree-mode)
-      (add-hook 'org-mode-hook #'undo-tree-mode)
-      (setq undo-tree-auto-save-history nil)))
+  (use-package undo-tree
+    :defer t
+    :hook
+    (prog-mode . undo-tree-mode)
+    (org-mode . undo-tree-mode))
 #+end_src
 
@@ -794,10 +415,11 @@
 ** Выделение
 #+BEGIN_SRC emacs-lisp :tangle init.el
-  (when (package-loaded? "expand-region")
-    (global-set-key (kbd "C-=") 'er/expand-region))
+  (use-package expand-region
+    :defer t
+    :bind (("C-=" . er/expand-region)))
 #+END_SRC
 
 ** Сессия
-#+BEGIN_SRC emacs-lisp :tangle nil
+#+BEGIN_SRC emacs-lisp :tangle init.el
   (desktop-save-mode 1)
 #+END_SRC
@@ -815,6 +437,8 @@
 
 *** Подсчёт кандидатов
-#+BEGIN_SRC emacs-lisp :tangle nil
-(global-anzu-mode t)
+#+BEGIN_SRC emacs-lisp :tangle init.el
+  (use-package anzu
+    :config
+    (global-anzu-mode t))
 #+END_SRC
 *** Swiper (не используется)
@@ -827,4 +451,9 @@
 	swiper-stay-on-quit t)
 #+END_SRC
+** Which function
+#+begin_src emacs-lisp :tangle init.el
+  (which-function-mode t)
+#+end_src
+
 ** Подсказка биндов
 Пакет Which-key
@@ -844,6 +473,7 @@
 ** Права суперпользователя
 Sudo-edit
-#+begin_src emacs-lisp
-  (package-loaded? "sudo-edit")
+#+begin_src emacs-lisp :tangle init.el
+  (use-package sudo-edit
+    :defer t)
 #+end_src
 
@@ -851,6 +481,8 @@
 Показывает собранное состояние будь то собранный куски на ассемблере
 или байт-код при помощи пакета RMSbolt.
-#+begin_src emacs-lisp :tangle nil
-  (add-hook 'prog-mode-hook 'rmsbolt-mode)
+#+begin_src emacs-lisp :tangle init.el
+  (use-package rmsbolt
+    :defer t
+    :hook (prog-mode . rmsbolt-mode))
 #+end_src
 
@@ -872,9 +504,4 @@
 	  (cmucl ("cmucl" "-quiet"))
 	  (sbcl ("/opt/sbcl/bin/sbcl") :coding-system utf-8-unix)))
-#+END_SRC
-
-** Erlang
-#+BEGIN_SRC emacs-lisp :tangle nil
-  (load "erlang-autoloads")
 #+END_SRC
 
@@ -1107,15 +734,14 @@
 *** Web-mode
 #+BEGIN_SRC emacs-lisp :tangle init.el
-  (when (package-loaded? "web-mode")
-    (progn
-
-      (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
-      (add-to-list 'auto-mode-alist '("\\.twig.html\\'" . web-mode))
-
-      (setq web-mode-markup-indent-offset 2)
-      (setq web-mode-enable-auto-pairing t)
-      (setq web-mode-enable-css-colorization t)
-      (setq web-mode-enable-block-face t)
-      (setq web-mode-enable-current-element-highlight t)))
+  (use-package web-mode
+    :defer t
+    :config
+    (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
+    (add-to-list 'auto-mode-alist '("\\.twig.html\\'" . web-mode))
+    (setq web-mode-markup-indent-offset 2)
+    (setq web-mode-enable-auto-pairing t)
+    (setq web-mode-enable-css-colorization t)
+    (setq web-mode-enable-block-face t)
+    (setq web-mode-enable-current-element-highlight t))
 #+END_SRC
 
@@ -1123,39 +749,27 @@
 *** Org-mode
 #+BEGIN_SRC emacs-lisp :tangle init.el
-  (org-babel-do-load-languages
-   'org-babel-load-languages
-   '((R . t)
-     (ditaa . t)
-     (dot . t)
-     ;; (php . t)
-     (emacs-lisp . t)
-     (gnuplot . t)
-     (haskell . nil)
-     (latex . t)
-     ;;(ledger . t)
-     (ocaml . nil)
-     (octave . t)
-     (python . t)
-     (ruby . t)
-     (screen . nil)
-     (shell . t)
-     (sql . t)
-     (js . t)))
-
-  (defun org-babel-edit-prep:sql (babel-info)
-    (setq-local buffer-file-name (->> babel-info caddr (alist-get :tangle)))
-    (setq-local lsp-buffer-uri (->> babel-info caddr (alist-get :tangle) lsp--path-to-uri))
-    (setq-local lsp-headerline-breadcrumb-enable nil)
-    (lsp))
-
-  (global-set-key (kbd "C-c l") 'org-store-link)
-  (global-set-key (kbd "C-c a") 'org-agenda)
-  (global-set-key (kbd "C-c c") 'org-capture)
-  ;; (global-set-key (kbd "M-f") 'org-metaright)
-  ;; (global-set-key (kbd "M-b") 'org-metaleft)
-  ;; (global-set-key (kbd "M-p") 'org-metaup)
-  ;; (global-set-key (kbd "M-n") 'org-metadown)
-
-  (setq org-default-notes-file "~/Documents/todo.org"
+  (use-package org
+    :defer t
+    :config
+    (org-babel-do-load-languages
+     'org-babel-load-languages
+     '((R . t)
+       (ditaa . t)
+       (dot . t)
+       ;; (php . t)
+       (emacs-lisp . t)
+       (gnuplot . t)
+       (haskell . nil)
+       (latex . t)
+       ;;(ledger . t)
+       (ocaml . nil)
+       (octave . t)
+       (python . t)
+       (ruby . t)
+       (screen . nil)
+       (shell . t)
+       (sql . t)
+       (js . t)))
+    (setq org-default-notes-file "~/Documents/todo.org"
 	system-time-locale "C"
 	org-use-speed-commands t
@@ -1171,6 +785,5 @@
 	org-id-track-globally t
 	org-confirm-babel-evaluate nil)
-
-  (setq org-todo-keywords
+    (setq org-todo-keywords
 	(quote ((sequence "TODO(t)"
 			  "MIGRATE(m)"
@@ -1184,5 +797,5 @@
 			  "NEED CLARIFICATION(t)"
 			  ))))
-  (setq org-todo-keyword-faces
+    (setq org-todo-keyword-faces
 	(quote (("TODO" :foreground "red" :weight bold)
 		("NEXT" :foreground "blue" :weight bold)
@@ -1193,8 +806,24 @@
 		("MEETING" :foreground "forest cyan" :weight bold)
 		("PHONE" :foreground "blue" :weight bold))))
-#+END_SRC
-
-*** Org-ref (не используется)
-  
+    :bind
+    ("C-c l" . org-store-link)
+    ("C-c a" . org-agenda)
+    ("C-c c" . org-capture)
+    )
+
+  (defun org-babel-edit-prep:sql (babel-info)
+    (setq-local buffer-file-name (->> babel-info caddr (alist-get :tangle)))
+    (setq-local lsp-buffer-uri (->> babel-info caddr (alist-get :tangle) lsp--path-to-uri))
+    (setq-local lsp-headerline-breadcrumb-enable nil)
+    (lsp))
+
+  ;; (global-set-key (kbd "M-f") 'org-metaright)
+  ;; (global-set-key (kbd "M-b") 'org-metaleft)
+  ;; (global-set-key (kbd "M-p") 'org-metaup)
+  ;; (global-set-key (kbd "M-n") 'org-metadown)
+#+END_SRC
+
+
+*** Org-ref
 #+begin_src emacs-lisp :tangle nil
   (load "org-ref-autoloads")
@@ -1210,57 +839,49 @@
 *** Org-roam
 #+begin_src emacs-lisp :tangle init.el
-  (when (package-loaded? "org-roam")
-    (progn
-      (setq org-roam-directory (file-truename "~/Zettelkasten")
-	    org-roam-v2-ack t
-	    org-roam-completion-everywhere t
-	    org-roam-index-file (concat org-roam-directory "/20210409054712-жизнь.org")
-	    org-roam-dailies-directory (concat org-roam-directory "journals/"))
-
-      (org-roam-db-autosync-mode t)
-
-      (defun org-roam-jump-to-index ()
-	"Stub of recreating the function from V1"
-	(interactive)
-	(let
-	    ((org-roam-index org-roam-index-file))
-	  (find-file org-roam-index)))
-
-      (define-key global-map
-		  (kbd "C-c n l") 'org-roam-node-insert)
-      (define-key global-map
-		  (kbd "C-c n f") 'org-roam-node-find)
-      (define-key global-map
-		  (kbd "C-c n b") 'org-roam-buffer-toggle)
-      (define-key global-map
-		  (kbd "C-c n t t") 'org-roam-tag-add)
-      (define-key global-map
-		  (kbd "C-c n t r") 'org-roam-tag-remove)
-      (define-key global-map
-		  (kbd "C-c n i") 'org-roam-jump-to-index)
-      (define-key global-map
-		  (kbd "C-c n g") 'org-roam-graph)
-      (define-key global-map
-		  (kbd "C-c n d") 'org-roam-db-build-cache)
-      (define-key global-map
-		  (kbd "C-c n r") 'org-roam-node-random)
-      (define-key global-map  
-		  (kbd "C-c n j") 'org-roam-dailies-find-date)))
-
-  (customize-set-variable 'org-link-descriptive t)
-#+end_src
-
-*** Агенда и Capture
-#+begin_src emacs-lisp :tangle init.el
-  (add-to-list 'org-agenda-files
-	       "~/Documents/todo.org")
-
-  (setq org-directory "~/Documents"
-	org-default-notes-file (concat org-directory "/todo.org"))
+  (use-package org-roam
+    :defer t
+    :bind
+    ("C-c n l" . org-roam-node-insert)
+    ("C-c n b" . org-roam-buffer-toggle)
+    ("C-c n f" . org-roam-node-find)
+    ("C-c n t t" . org-roam-tag-add)
+    ("C-c n t r" . org-roam-tag-remove)
+    ("C-c n i" . org-roam-jump-to-index)
+    ("C-c n g" . org-roam-graph)
+    ("C-c n d" . org-roam-db-build-cache)
+    ("C-c n r" . org-roam-node-random)
+    ("C-c n j" . org-roam-dailies-find-date)
+    :config
+    (setq org-roam-directory (file-truename "~/Zettelkasten")
+  	org-roam-v2-ack t
+  	org-roam-completion-everywhere t
+  	org-roam-index-file (concat org-roam-directory "/20210409054712-жизнь.org")
+  	org-roam-dailies-directory (concat org-roam-directory "journals/"))
+
+    (org-roam-db-autosync-mode t))
+
+  (defun org-roam-jump-to-index ()
+    "Stub of recreating the function from V1"
+    (interactive)
+    (let
+        ((org-roam-index org-roam-index-file))
+      (find-file org-roam-index)))
+
+  (use-package org
+    :defer t
+    :config
+    (customize-set-variable 'org-link-descriptive t)
+
+    (add-to-list 'org-agenda-files
+  	       "~/Documents/todo.org")
+
+    (setq org-directory "~/Documents"
+  	org-default-notes-file (concat org-directory "/todo.org")))
 #+end_src
 
 ** YAML
-#+begin_src emacs-lisp
-  (package-loaded? "yaml-mode")
+#+begin_src emacs-lisp :tangle init.el
+  (use-package yaml-mode
+    :defer t)
 #+end_src
 
@@ -1273,29 +894,23 @@
 ** Telega
 #+BEGIN_SRC emacs-lisp :tangle init.el
-  (when (package-loaded? "telega")
-    (setq telega-filter-custom-show-folders t
-	  telega-chat-fill-column 40
-	  telega-root-fill-column 60
-	  telega-url-shorten-use-images t)
-
-    (define-key global-map (kbd "C-c t") telega-prefix-map))
+  (use-package telega
+    :bind (("C-c t" . telega-prefix-map)))
 #+END_SRC
 
 ** Mastodon
-#+begin_src emacs-lisp :tangle nil
-  (when (package-loaded? "mastodon")
+#+begin_src emacs-lisp :tangle init.el
+  (use-package mastodon
+    :defer t
+    :config
     (setq mastodon-active-user "w96k"
 	  mastodon-instance-url "https://fosstodon.org/"))
 #+end_src
 
-** LLM
-#+begin_src emacs-lisp
-
-#+end_src
-
-
-* Наука
 * Разное
-
+** *Highlight
+#+BEGIN_SRC emacs-lisp :tangle init.el
+  (use-package highlight
+    :defer t)
+#+end_src
 ** Минорные твики дефолтного имакса
 *** Короткие ответы на вопросы
@@ -1310,20 +925,14 @@
 *** Подсвечивать текущую строку
 #+begin_src emacs-lisp :tangle nil
-  (global-hl-line-mode 1)
-#+end_src
-
-*** Открывать список буферов в отдельном фрейме
-#+begin_src emacs-lisp :tangle nil
-  (add-to-list 'special-display-buffer-names "*Buffer List*")
-  (setq Buffer-menu-files-only t)
+  (global-hl-line-mode t)
 #+end_src
 
 *** Автодополнение в echo при M-x и других командах
 #+begin_src emacs-lisp :tangle init.el
-  (icomplete-mode 1)
+  (icomplete-mode t)
 #+end_src
 *** Проверять орфографию
 #+begin_src emacs-lisp :tangle init.el
-  (flyspell-mode 1)
+  (flyspell-mode t)
 #+end_src
 
@@ -1359,10 +968,6 @@
 
   (setq default-directory "~/"
-	delete-seleciton-mode t
-	inhibit-startup-message t
-	initial-scratch-message nil
 	custom-safe-themes t
 	delete-old-versions t
-	confirm-kill-processes nil
 	enable-local-variables t)
 #+end_src
@@ -1443,10 +1048,9 @@
 *** Kills
 #+begin_src emacs-lisp :tangle init.el
-  (define-key global-map (kbd "C-k") 'kill-region)
-
-  (when (package-loaded? "whole-line-or-region")
+  (use-package whole-line-or-region
+    :bind (("C-k" . kill-region)
+	   ("C-w" . backward-kill-word))
+    :config
     (whole-line-or-region-global-mode))
-
-  (define-key global-map (kbd "C-w") 'backward-kill-word)
 #+end_src
 
@@ -1470,6 +1074,6 @@
 ** Docker
 #+begin_src emacs-lisp :tangle init.el
-  (package-loaded? "docker")
-  (package-loaded? "docker-compose-mode")
+  (use-package docker :defer t)
+  (use-package docker-compose-mode :defer t)
 #+end_src
 ** Debian
@@ -1483,25 +1087,25 @@
 ** Guix
 #+begin_src emacs-lisp :tangle init.el
-  (package-loaded? "geiser-guile")
-
-  (package-loaded? "guix")
-
-  (setq geiser-guile-binary "guile")
-
-  (with-eval-after-load 'geiser-guile
-    (progn
-      (add-to-list 'geiser-guile-load-path "~/projects/guix/")))
-
-  (let ((guix-copyright "~/projects/guix/etc/copyright.el"))
-    (if (file-exists-p guix-copyright)
-	(load-file "~/projects/guix/etc/copyright.el")))
-
-  (setq copyright-names-regexp
-	(format "%s <%s>" user-full-name user-mail-address))
+  ;; (use-package geiser-guile :defer t)
+
+  (use-package guix
+    :defer t
+    :config
+    (setq geiser-guile-binary "guile")
+    (with-eval-after-load 'geiser-guile
+      (progn
+        (add-to-list 'geiser-guile-load-path "~/projects/guix/")))
+
+    (let ((guix-copyright "~/projects/guix/etc/copyright.el"))
+      (if (file-exists-p guix-copyright)
+  	(load-file "~/projects/guix/etc/copyright.el")))
+
+    (setq copyright-names-regexp
+  	(format "%s <%s>" user-full-name user-mail-address)))
 #+end_src
 
 ** Nix
-#+begin_src emacs-lisp :tangle nil
-  (package-loaded? "nix")
+#+begin_src emacs-lisp :tangle init.el
+  (use-package nix)
 #+end_src
 
@@ -1598,4 +1202,24 @@
 ** Ignore case sensitive in completions, search and etc
 #+begin_src emacs-lisp :tangle init.el
-  (setq completion-ignore-case t)
-#+end_src
+  (setq completion-ignore-case t
+	read-buffer-completion-ignore-case t
+	read-file-name-completion-ignore-case t)
+#+end_src
+
+** Make scripts executable automatically
+#+begin_src emacs-lisp :tangle init.el
+  (add-hook 'after-save-hook
+	    'executable-make-buffer-file-executable-if-script-p)
+#+end_src
+
+** F1 for M-x shell and F2 for grep
+#+begin_src emacs-lisp :tangle init.el
+  (global-set-key (kbd "<f1>") 'shell)
+  (global-set-key (kbd "<f2>") 'rgrep)
+#+end_src
+
+** Hippie expand
+#+begin_src emacs-lisp :tangle init.el
+  (global-set-key [remap dabbrev-expand] 'hippie-expand)
+#+end_src
+
Index: guix/.dotfiles/home-configuration.scm
===================================================================
--- guix/.dotfiles/home-configuration.scm	(revision fe2941baeff0f28f4fd9a82ba516b94348361d9b)
+++ guix/.dotfiles/home-configuration.scm	(revision fde9de8aaab787061625952015d69db18c82c878)
@@ -4,4 +4,6 @@
 	     (gnu packages shells)
              (gnu services)
+	     (gnu services xorg)
+	     (gnu system keyboard)
              (guix gexp)
 	     (guix channels)
@@ -31,4 +33,13 @@
 					    "emacs-xterm-color"
                                             "emacs-lsp-mode"
+					    "emacs-helm"
+					    "emacs-magit"
+					    "emacs-git-timemachine"
+					    "emacs-browse-kill-ring"
+					    "emacs-anzu"
+					    "emacs-sudo-edit"
+					    "emacs-highlight"
+					    "emacs-mastodon"
+					    "emacs-org-roam"
 
 					    "guile"
@@ -38,5 +49,5 @@
 					    "emacs-geiser-guile"
 					    
-					    "emacs-telega"
+					    ;;"emacs-telega"
 					    "emacs-guix"
 					    "emacs-simple-httpd"
@@ -53,4 +64,5 @@
 					    "emacs-no-x-toolkit"
 					    "emacs-gptel"
+					    "emacs-nix-mode"
                                             "lm-sensors"
                                             "htop"
@@ -58,5 +70,4 @@
                                             "emacs-simple-httpd"
                                             "emacs-guix"
-                                            "emacs-telega"
                                             "gimp"
                                             "imagemagick"
@@ -85,4 +96,6 @@
 					    "xhost"
 
+					    "universal-ctags"
+					    "c-intro-and-ref"
 					    ;; "wkz-php"
 					    ;; "wkz-python"
Index: guix/config-desktop.scm
===================================================================
--- guix/config-desktop.scm	(revision fe2941baeff0f28f4fd9a82ba516b94348361d9b)
+++ guix/config-desktop.scm	(revision fde9de8aaab787061625952015d69db18c82c878)
@@ -50,4 +50,5 @@
       "ratpoison"
       "xterm"
+      "screen"
       ))
    %base-packages))
