source: dotfiles/emacs/.emacs.d/.emacs-config.org@ 3ec75a9

Last change on this file since 3ec75a9 was 3ec75a9, checked in by Mikhail Kirillov <w96k@…>, on Sep 17, 2023 at 3:21:53 PM

Add exwm and clean config

  • Property mode set to 100644
File size: 52.8 KB
Line 
1#+TITLE: Конфигурация Emacs
2#+AUTHOR: Кириллов <w96k.dev> Михаил
3#+OPTIONS: toc:nil
4#+PROPERTY: header-args:elisp :results silent
5#+STARTUP: showeverything
6
7* Вклады
8Конфигурация составлена из моего кода, а также кода из конфигураций
9других людей. Их настолько, что все перечислять я не смогу, но оставлю
10интересные конфигурации других людей, в которые я время от времени
11заглядываю.
12
13* Лицензия
14Я выступаю против копирайта и интеллектуальной собственности в целом,
15поэтому стараюсь копирайт избегать. По этой причине свой код
16распространяю на правах общественного достояния вашей страны. Для этого
17используется лицензия [[https://creativecommons.org/publicdomain/zero/1.0/][CC0]]. Если кратко, то можете использовать без
18ограничений вплоть до полной приватизации всего контента. К сожалению за
19чужие сниппеты не могу ручаться, они распространяются по своим лицензиям
20и я их не указывал, впрочем всё равно никто это не проверяет и я бы не
21стал напрягаться из-за авторских прав на конфигурацию текстового
22редактора.
23
24* О конфигурации
25Минимальная конфигурация Emacs. Пакеты ставлю через Guix или package.el
26(elpa и melpa), для разделения ответственности использую грамотное
27программирование при помощи org-mode.
28
29Версия Emacs 28+.
30- В Guix пакет ~emacs-next~
31- В FreeBSD пакет ~emacs-devel~
32- В Ubuntu [[https://launchpad.net/~kelleyk/+archive/ubuntu/emacs][PPA emacs28]] и пакет ~emacs28-native~
33
34Из программирования поддерживаются /C/, Java, /Python/, /Common Lisp /
35Scheme/, Haskell, Idris, Ocaml, /Ruby/, PHP, /SML/, SQL, Erlang,
36редактирование веб-шаблонов и различных форматов конфигураций. Какие-то
37языки в лучшей мере настроены, какие-то хуже, но есть почти все
38плюс-минус популярные.
39
40Для систем контроля версий использую встроенный /VC/ и в некоторых случаях
41/Magit/. Для входа в виртуальные среды используется Direnv.
42
43Для ведения заметок использую методологию Zettelkasten при помощи
44org-roam. Для доступа к оффлайн википедии и другим ресурсам Kiwix
45клиент, который стучится на сервер, который стоит дома.
46
47Для коммуникаций клиент для Telegram /telega/, для IRC /erc/ и электронной
48почты /gnus/, для Mastodon mastodon.el.
49
50Для системного администрирования имеют пакеты для работы с Debian,
51NixOS, Guix. Также есть поддержка Docker, Docker-compose: можно
52запускать/стопать контейнеры, а также залетать в них через TRAMP.
53
54Для установки необходимо установить пакеты Emacs из ~../../guix/user.scm~
55и выполнить tangle файла при помощи /M-x org-babel-tangle-file/. В
56дальнейшем для развёртывания конфигурации можно использовать /M-x
57config-tangle/ или /M-x config-load/.
58
59Данная конфигурация доступна также в сети интернет по адресу, но так как
60сайт обновляется нечасто, то там может лежать старая версия:
61https://w96k.dev/emacs.html
62
63Исходники конфигурации лежат на Sourcehut:
64https://git.sr.ht/~w96k/dotfiles/tree/master/item/emacs
65
66Распространяется на условиях свободной лицензии [[https://gnu.org/licenses/gpl-3.0.ru.html][GNU GPL v3]],
67реиспользование одобряется пока распространяется под той же лицензией.
68
69* Пакеты
70Данная конфигурация использует следующие пакеты:
71
72- Avy :: Прыжки по тексту
73- Anaconda :: Поддержка Python
74- Auctex :: Поддержка Tex и LaTeX
75- Browse Kill Ring :: Обзор буфера обмена
76- Haskell Mode :: Поддержка языка Haskell
77- Idris Mode :: Поддержка языка Idris
78- Magit :: Интерфейс к git
79- Gitpatch :: Создание патчей
80- Goto Cgh :: Переход к последнему изменению в буфере
81- Debbuge :: Интерфейс debbugs (репорт багов Debian)
82- Deft :: Полнотекстовый поиск
83- Direnv :: Изменение окружения при "входе" в директорию
84- Docker и Docker Compose :: Моды для поддержки контейнерных технологий
85- Exec Path From Shell :: Синхронизация PATH переменной из шелла
86- Expand Region :: Семантическое расширение выделения на курсоре
87- Robe :: Прыжки по определениям Ruby
88- Geiser :: Repl для языка Scheme
89- Guix :: Интерфейс к Guix
90- Org Roam :: Zettelkasten заметки в org-mode
91- Gnuplot :: Программное рисование графиков
92- Nix Mode :: Поддержка языка Nix
93- Pdf Tools :: Рендер PDF файлов в Emacs
94- PHP Mode :: Поддержка языка PHP
95- Kiwix :: Чтение скачанных архивов веб-страниц
96- SML Mode :: Поддержка языка Standard ML
97- Sly/Slime :: REPL языка Common Lisp
98- Simple HTTPD :: HTTP Сервер на elisp
99- Telega :: Интерфейс к Telegram
100- Treemacs :: Сайдбар для навигации по проекту
101- Undo Tree :: Визуализация дерева отмен
102- Yasnippet и Yasnippet Snippets :: Сниппеты для текстов и ЯПов
103- Web Mode :: Поддержка шаблонов HTML и прочего
104
105Следующий блок нужен для тех, кто хочет использовать встроенный пакетный
106менеджер. Я использую Guix для большей части взаимодействий со сторонним
107кодом.
108#+begin_src elisp :tangle nil
109 (require 'package)
110
111 (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
112 ("melpa" . "http://melpa.org/packages/")))
113
114 (when (< emacs-major-version 27)
115 (package-initialize))
116
117 (require 'gnutls)
118
119 (when (not package-archive-contents)
120 (progn
121 (package-refresh-contents)
122 (package-install 'avy)
123 ;; (package-install 'anzu)
124 (package-install 'anaconda-mode)
125 (package-install 'auctex)
126 (package-install 'rmsbolt)
127 ;; (package-install 'beginend)
128 ;; (package-install 'composer)
129 (package-install 'cinspect)
130 (package-install 'debian-el)
131 (package-install 'dpkg-dev-el)
132 (package-install 'edebug-inline-result)
133 ;;(package-install 'haskell-mode)
134 ;;(package-install 'idris-mode)
135 (package-install 'magit)
136 (package-install 'git-timemachine)
137 (package-install 'git-dwim)
138 (package-install 'gitpatch)
139 (package-install 'goto-chg)
140 (package-install 'debbugs)
141 ;;(package-install 'deft)
142 ;; (package-install 'direnv)
143 (package-install 'dumb-jump)
144 (package-install 'docker)
145 (package-install 'docker-cli)
146 (package-install 'docker-tramp)
147 (package-install 'docker-compose-mode)
148 (package-install 'org-sql)
149 ;;(package-install 'eglot)
150 ;; (package-install 'eglot-java)
151 ;; (package-install 'mastodon)
152 ;; (package-install 'exec-path-from-shell)
153 (package-install 'expand-region)
154 ;; (package-install 'flymake-php)
155 (package-install 'flycheck)
156 (package-install 'flycheck-phpstan)
157 ;; (package-install 'phpactor)
158 ;;(package-install 'robe)
159 (package-install 'geiser)
160 (package-install 'geiser-guile)
161 (package-install 'guix)
162 ;; (package-install 'git-gutter)
163 ;; (package-install 'gnuplot)
164 ;;(package-install 'swiper)
165 ;;(package-install 'sqlite3)
166 (package-install 'org-roam)
167 ;; (package-install 'org-roam-ui)
168 ;; (package-install 'org-download)
169 ;; (package-install 'org-babel-eval-in-repl)
170 ;;(package-install 'ob-php)
171 ;; (package-install 'on-screen)
172 ;;(package-install 'nix-mode)
173 (package-install 'pdf-tools)
174 ;;(package-install 'phpactor)
175 ;; (package-install 'company-quickhelp)
176 ;;(package-install 'ac-php)
177 (package-install 'php-mode)
178 (package-install 'php-quickhelp)
179 (package-install 'phan)
180 ;;(package-install 'php-cs-fixer)
181 ;; (package-install 'company-php)
182 ;;(package-install 'php-eldoc)
183 ;;(package-install 'phps-mode)
184 (package-install 'realgud)
185 (package-install 'realgud-xdebug)
186 ;; (package-install 'kiwix)
187 ;;(package-install 'sml-mode)
188 (package-install 'sly)
189 (package-install 'simple-httpd)
190 (package-install 'sudo-edit)
191 ;;(package-install 'treemacs)
192 (package-install 'undo-tree)
193 ;; (package-install 'yasnippet)
194 ;; (package-install 'yasnippet-snippets)
195 ;; (package-install 'vimrc-mode)
196 ;; (package-install 'flymake-phpcs)
197 ;; (package-install 'flymake-phpstan)
198 ;; (package-install 'no-littering)
199 (package-install 'web-mode)
200 ;; (package-install 'which-key)
201 ;; (package-install 'reverse-im)
202 (package-install 'imenu-list)
203 ;; (package-install 'isearch-mb)
204 (package-install 'visual-fill-column)
205 ;; (package-install 'browse-kill-ring)
206 (package-install 'corfu)
207 ;; (package-install 'inf-ruby)
208 (package-install 'yaml-mode)
209 ;; (package-install 'geben)
210 (package-install 'link-hint)
211 (package-install 'whole-line-or-region)
212 (package-install 'quickrun)
213 ;; (package-install 'psysh)
214 ;; (package-install 'restclient)
215 ))
216#+end_src
217
218* Инициализация
219Следующие блоки кода выводят в файл early-init.el
220** Компиляция
221JIT компиляция elisp кода в машинный
222#+begin_src elisp :tangle nil
223 (when (eq window-system 'pgtk)
224 (pgtk-use-im-context t))
225
226 (when (fboundp 'native-compile-async)
227 (setq comp-async-compilation t
228 package-native-compile t
229
230 native-comp-speed 2
231 native-comp-async-jobs-number 1
232 comp-num-cpus 2
233 ;; JIT Compilation
234 native-comp-deferred-compilation t
235 ;; AOT Compilation
236 package-native-compile t
237 comp-async-report-warnings-errors nil))
238#+end_src
239
240*** Ручная компиляция
241#+begin_src elisp :tangle nil :results nil
242 ;; (native-compile-async "~/.emacs.d/elpa/" 'recursively)
243 (native-compile-async "~/.guix-profile/share/emacs/site-lisp" 'recursively)
244
245 ;; block until native compilation has finished
246 (while (or comp-files-queue
247 (> (comp-async-runnings) 0))
248#+end_src
249
250** Отключаем ненужные загрузки
251#+begin_src emacs-lisp :tangle nil
252 ;; Disable guix autoloading and x resources loading
253 (setq site-run-file nil)
254#+end_src
255
256** EXWM
257
258#+begin_src emacs-lisp :tangle init.el
259 (require 'exwm)
260 (require 'exwm-config)
261 (exwm-config-example)
262#+end_src
263
264
265** Редакируем GUI
266Удаляем ненужные бары, меняем шрифт и модлайн. Использую дефолтный для
267шрифт DeJavu или недефолтный Agave, так как он является одним из самых интернациональных
268шрифтов по количеству доступных символов после Unifont. Unifont я не
269стал использовать, потому что иксы замыливают этот пиксельный шрифт, что
270делает его использование крайне неприятным.
271
272#+begin_src emacs-lisp :tangle nil
273 ;; Change mode-line-modes to show only major mode
274 (defvar mode-line-major-mode
275 (let ((recursive-edit-help-echo "Recursive edit, type C-M-c to get out"))
276 (list (propertize "%[" 'help-echo recursive-edit-help-echo)
277 `(:propertize ("" mode-name)
278 help-echo "Major mode\n\
279 mouse-1: Display major mode menu\n\
280 mouse-2: Show help for major mode\n\
281 mouse-3: Toggle minor modes"
282 mouse-face mode-line-highlight
283 local-map ,mode-line-major-mode-keymap)
284 '("" mode-line-process)
285 (propertize "%n" 'help-echo "mouse-2: Remove narrowing from buffer"
286 'mouse-face 'mode-line-highlight
287 'local-map (make-mode-line-mouse-map
288 'mouse-2 #'mode-line-widen))
289 (propertize "%]" 'help-echo recursive-edit-help-echo)
290 " "))
291 "Mode line construct for displaying major and minor modes.")
292
293 (put 'mode-line-major-mode 'risky-local-variable t)
294
295 ;; Change mode-line-format
296 (setq-default mode-line-format
297 '("%e"
298 mode-line-front-space
299 mode-line-mule-info
300
301 mode-line-client
302 mode-line-modified
303 mode-line-remote
304 mode-line-frame-identification
305 ;; long-path
306 mode-line-buffer-identification
307 mode-line-misc-info
308 " "
309 mode-line-major-mode
310 " "
311 vc-mode
312 " "
313
314 mode-line-position
315 mode-line-end-spaces
316 ))
317#+end_src
318
319
320#+begin_src emacs-lisp :tangle nil
321 ;; Do not resize the frame at this early stage.
322 (setq frame-inhibit-implied-resize t)
323 (setq use-dialog-box nil)
324
325 ;;; Disable some gui
326 (scroll-bar-mode -1)
327 (tool-bar-mode -1)
328 (menu-bar-mode -1)
329 ;;(tooltip-mode -1)
330
331 ;;; Changing emacs default setting through customize
332 (custom-set-variables
333 '(fill-column 72)
334 '(git-gutter:added-sign " ")
335 '(git-gutter:deleted-sign " ")
336 '(git-gutter:modified-sign " ")
337 '(git-gutter:unchanged-sign " ")
338 '(lsp-headerline-breadcrumb-enable nil)
339 '(scroll-bar-mode 'nil)
340 '(scroll-bar-adjust-thumb-portion nil)
341 '(tool-bar-position 'bottom)
342 '(tool-bar-style 'both-horiz))
343
344 (custom-set-faces
345 '(default ((t (:height 140 :family "Jetbrains Mono" :embolden t))))
346 '(region ((t (:background "gray85"))))
347 '(mode-line ((t (:background "grey70" :foreground "grey10"))))
348 '(mode-line-inactive ((t (:inherit mode-line :background "grey90" :foreground "grey20" :box (:line-width (-2 . -2) :color "grey85") :weight light))))
349 '(mode-line-buffer-id ((t (:weight bold))))
350 '(mode-line-emphasis ((t (:weight bold))))
351 '(lsp-modeline-code-actions-face ((t :inherit mode-line :height 100)))
352 '(tool-bar ((t (:background "grey80" :foreground "grey10"))))
353 '(fill-column-indicator ((t (:foreground "grey95"))))
354 '(hl-line ((t (:background "gray95"))))
355 '(fringe ((t (:background "grey87"))))
356 '(header-line ((t (:inherit mode-line :background "grey90"))))
357 '(vertical-border ((t (:foreground "grey90"))))
358 '(window-divider ((t (:foreground "gray90")))))
359
360 (set-fringe-style (cons 7 7))
361
362 (defun switch-gui ()
363 "Disable/enable menu-bar and tool-bar."
364 (interactive)
365 (if menu-bar-mode
366 (progn
367 (menu-bar-mode -1)
368 (tool-bar-mode -1)
369 (scroll-bar-mode -1))
370 (progn
371 (menu-bar-mode 1)
372 (tool-bar-mode 1)
373 (scroll-bar-mode 1))))
374
375 (defun switch-scroll-bar ()
376 "Disable/enable scroll-bar."
377 (interactive)
378 (if scroll-bar-mode
379 (scroll-bar-mode -1)
380 (scroll-bar-mode)))
381
382 (define-key global-map (kbd "<f5>") 'switch-gui)
383 (define-key global-map (kbd "<f8>") 'switch-scroll-bar)
384
385 (provide 'early-init)
386 ;;; early-init.el ends here
387#+end_src
388
389** Инициализируем остальной конфиг
390Следующие блоки кода выводят в файл init.el.
391#+begin_src emacs-lisp :tangle init.el
392 ;; -*- lexical-binding: t -*-
393
394 ;; Show/Hide errors
395 ;; (setq debug-on-error nil)
396 ;; (setq debug-on-quit nil)
397
398 (require 'package)
399
400 (defun package-loaded? (string)
401 (if (or (cl-member string package-activated-list :test #'string=)
402 (ignore-errors (load (concat string "-autoloads"))))
403 t
404 (progn
405 (message (concat "Package " string " is not loaded"))
406 nil)))
407
408 ;; Timer
409 (add-hook 'emacs-startup-hook
410 (lambda ()
411 (message
412 "Emacs ready in %s with %d garbage collections."
413 (format "%.2f seconds"
414 (float-time
415 (time-subtract after-init-time before-init-time)))
416 gcs-done)))
417
418 ;; Dont ask when following symlinks
419 (setq vc-follow-symlinks t)
420
421 ;; Load your custom settings
422 (setq custom-file "~/.emacs.d/custom-settings.el")
423 (load custom-file t)
424#+end_src
425
426* Meta
427** Обо мне
428#+BEGIN_SRC emacs-lisp :tangle init.el
429 ;; Information about me
430 (setq user-full-name "Mikhail Kirillov"
431 user-mail-address "w96k@runbox.com")
432#+END_SRC
433
434** Конфигурация
435Базовые функции для манипулирования конфигом в дальнейшем, чтобы не
436приходилось танглить вручную.
437#+BEGIN_SRC emacs-lisp :tangle init.el
438 (setq config-dotfiles-path "~/projects/dotfiles/emacs/.emacs.d/"
439 config-path "~/.emacs.d/"
440 config-name ".emacs-config.org")
441
442 (defun config-visit ()
443 (interactive)
444 (find-file (concat config-path config-name)))
445
446 (defun config-tangle ()
447 (interactive)
448 (org-babel-tangle-file (concat config-dotfiles-path config-name))
449 ;; Configuration stored in another directory,
450 ;; so I need to move files .emacs.d manually
451 ;; (rename-file (concat config-dotfiles-path "early-init.el") config-path t)
452 (rename-file (concat config-dotfiles-path "init.el") config-path t))
453
454 (defun config-load ()
455 (interactive)
456 (org-babel-load-file (concat config-dotfiles-path config-name) t))
457
458#+END_SRC
459
460* Внешний вид
461
462** Отображение номера строк и пробелов
463Изначально они отключены, но можно вызвать по клавише F7.
464#+BEGIN_SRC emacs-lisp :tangle init.el
465 (define-key global-map
466 (kbd "<f7>") 'global-display-line-numbers-mode)
467
468 (define-key global-map
469 (kbd "<f6>") 'whitespace-mode)
470#+END_SRC
471
472* Редактирование
473** Файловый менеджер
474#+BEGIN_SRC emacs-lisp :tangle init.el
475 ;; Show files in KiB
476 (setq dired-listing-switches "-hlap"
477 dired-kill-when-opening-new-dired-buffer t)
478
479 (customize-set-variable 'global-auto-revert-non-file-buffers t)
480 (global-auto-revert-mode 1)
481#+END_SRC
482
483** Линтер
484Использую встроенный Flymake и Flycheck
485*** Flymake
486#+BEGIN_SRC emacs-lisp :tangle nil
487 ;;(add-hook 'prog-mode-hook 'flymake-mode)
488
489 (require 'psalm)
490
491 (define-prefix-command 'flymake-map)
492 (global-set-key (kbd "C-q") 'flymake-map)
493 (define-key flymake-map (kbd "n") 'flymake-goto-next-error)
494 (define-key flymake-map (kbd "p") 'flymake-goto-prev-error)
495 (define-key flymake-map (kbd "l") 'flymake-show-diagnostics-buffer)
496 (define-key flymake-map (kbd "e") 'flymake-show-diagnostic)
497#+END_SRC
498
499*** Flycheck
500#+BEGIN_SRC emacs-lisp :tangle nil
501 ;; (require 'psalm)
502
503 (when (package-loaded? "flycheck")
504
505 (defun flycheck-phanclient-start-daemon ()
506 "Start the phan daemon"
507 (interactive)
508 (let* ((default-directory (php-project-get-root-dir))
509 (phan-executable (or flycheck-phanclient--phan-executable
510 (if (file-exists-p "vendor/bin/phan")
511 (concat default-directory "vendor/bin/phan")
512 (executable-find "phan"))))
513 (cmd (list phan-executable "--daemonize-tcp-port" "4846" "--quick")))
514 (apply #'start-process "PhanDaemon" "*phan daemon*" cmd)))
515
516 (flycheck-define-checker php-phanclient
517 "Phan"
518 :command ("phan_client" "-l" source-original "-f" source)
519 :error-patterns
520 ((warning line-start (or "Parse" "Fatal" "syntax" "Phan") " error" (any ":" ",") " " (message) " in " (file-name) " on line " line line-end))
521 :modes (php-mode php+-mode))
522
523 (add-to-list 'flycheck-checkers 'php-phanclient)
524
525 (flycheck-add-next-checker 'php '(warning . php-phanclient))
526
527 (add-hook 'prog-mode-hook 'flycheck-mode))
528#+END_SRC
529
530** Дерево проекта
531Возможно в дальнейшем откажусь от этого пакета, так как по факту им
532пользуюсь нечасто. Он предоставляет дерево проектов, как в IDE.
533#+BEGIN_SRC emacs-lisp :tangle nil
534 (when (package-loaded? "treemacs")
535 (progn
536 (setq treemacs-width 50
537 treemacs-show-cursor t
538 treemacs-position 'right
539 treemacs-indentation 1
540 treemacs-tag-follow-mode t
541 treemacs-fringe-indicator-mode nil)
542
543 (define-key global-map
544 (kbd "C-x C-d") 'treemacs)))
545#+END_SRC
546
547** Дерево imenu
548#+begin_src emacs-lisp :tangle init.el
549 ;; (when (package-loaded? "imenu-list")
550 (setq imenu-list-focus-after-activation nil
551 imenu-list-auto-resize nil
552 imenu-list-mode-line-format '()
553 imenu-list-size 0.4)
554 (global-set-key (kbd "C-x C-d") #'imenu-list-smart-toggle)
555 ;; )
556#+end_src
557
558** Better Isearch
559#+begin_src emacs-lisp :tangle nil
560 (when (package-loaded? "isearch-mb")
561 (progn
562 (isearch-mb-mode t)
563 (global-set-key (kbd "C-s") 'isearch-forward-regexp)
564 (global-set-key (kbd "C-r") 'isearch-backward-regexp)))
565#+end_src
566
567** Система контроля версий
568Модуль VC + Magit.
569
570| Operation | VC | Magit |
571|----------------+-----------------------------------------+----------------------|
572| Project status | project-vc-dir (C-x p v) | magit-status (C-x g) |
573| Pull | vc-update (F, in my case) | magit-pull (F p) |
574| New branch | vc-retrieve-tag (C-u B s) | magit-branch (b c) |
575| Commit | vc-next-action (C-x v v) | magit-commit (c c) |
576| Rebase | shell-command (M-!) + git rebase master | magit-rebase (r p) |
577| Push | vc-push (P or C-u P) | magit-push (P p) |
578| Stash | mu-vc-git-stash (z) | magit-stash (z) |
579| Log | vc-print-root-log (L) | magit-log (l l) |
580https://www.manueluberti.eu//emacs/2021/11/27/vc/
581
582#+BEGIN_SRC emacs-lisp :tangle init.el
583 (setq vc-command-messages t)
584
585 (global-set-key "\C-xvB" 'git-branch-next-action)
586
587 ;; Use magit only when built-in VC fails
588 (when (package-loaded? "magit")
589 (progn
590 (setq magit-refresh-status-buffer nil)
591 (global-set-key (kbd "C-x g") 'magit-status)))
592
593 (package-loaded? "git-timemachine")
594#+END_SRC
595
596** Прыжки
597#+BEGIN_SRC emacs-lisp :tangle init.el
598 (when (package-loaded? "avy")
599 (progn
600 (define-key global-map (kbd "M-s M-s") 'avy-goto-char)
601 (define-key global-map (kbd "M-s s") 'avy-goto-char)
602 (define-key global-map (kbd "M-s g") 'avy-goto-line)
603 (define-key global-map (kbd "M-s l") 'avy-goto-char-in-line)
604 (define-key global-map (kbd "M-s M-l") 'avy-goto-char-in-line)
605
606 ;; Rewrite default bind to avy
607 (define-key global-map (kbd "M-g g") 'avy-goto-line)
608 (define-key global-map (kbd "M-g M-g") 'avy-goto-line)))
609
610 (when (package-loaded? "link-hint")
611 (progn
612 (define-key global-map (kbd "M-s j") 'link-hint-open-link)))
613
614 ;; Прыжок на последнее изменение
615 (when (package-loaded? "goto-chg")
616 (progn
617 (setq glc-default-span 2)
618 (define-key global-map (kbd "C-z") 'goto-last-change)
619 (define-key global-map (kbd "M-z") 'goto-last-change-reverse)))
620
621 ;; Dumb Jump
622 (when (package-loaded? "dumb-jump")
623 (progn
624 (define-key global-map (kbd "C-.") 'dumb-jump-go)))
625
626#+END_SRC
627
628** Проекты
629Использую встроенный project.el
630I use built-in project.el
631** Ограничение ширины строки
632#+BEGIN_SRC emacs-lisp :tangle init.el
633 (when (package-loaded? "visual-fill-column")
634 (progn
635 ;;; Column width limit highlighter
636 (add-hook 'prog-mode-hook 'display-fill-column-indicator-mode)
637
638 ;;; Set column width to 79 according to pep8 for python
639 (add-hook 'python-mode-hook
640 (lambda () (set-fill-column 79)))))
641#+END_SRC
642
643** Подсвечивание парных скобок
644** Ввод парных скобок и кавычек (electric)
645#+BEGIN_SRC emacs-lisp :tangle init.el
646 ;;; Input of pair delimiters
647 (electric-pair-mode)
648 (add-hook 'prog-mode-hook 'electric-pair-mode)
649 ;; (add-hook 'prog-mode-hook 'rainbow-identifiers-mode)
650#+END_SRC
651
652** Kill-ring
653#+BEGIN_SRC emacs-lisp :tangle nil
654 (when (package-loaded? "browse-kill-ring")
655 (define-key global-map (kbd "C-M-y") 'browse-kill-ring))
656#+END_SRC
657
658** Tags
659Для прыжков и поиска функций/классов и т.д.
660#+BEGIN_SRC emacs-lisp :tangle nil
661 (setq path-to-ctags "~/.guix-profile/bin/ctags")
662
663 (defun tags-create (dir-name)
664 "Create tags file."
665 (interactive "DDirectory: ")
666 (shell-command
667 (format "%s -f TAGS -e -R %s" path-to-ctags
668 (directory-file-name dir-name))))
669
670 (defun tags-create-python (dir-name)
671 "Create tags with python interpreter"
672 (interactive "DDirectory: ")
673 (shell-command
674 (format "%s -f TAGS -e -R --fields=+l --languages=python --python-kinds=-iv $(python -c \"import os, sys; print(' '.join('{}'.format(d) for d in sys.path if os.path.isdir(d)))\") %s" path-to-ctags
675 (directory-file-name dir-name))))
676#+END_SRC
677
678** Дополнение
679** Дебаггер
680#+begin_src emacs-lisp :tangle nil
681 (when (package-loaded? "realgud")
682 (load "~/.emacs.d/site-lisp/realgud-xdebug/realgud-xdebug.el"))
683#+end_src
684
685#+begin_src emacs-lisp :tangle nil
686 (when (package-loaded? "geben")
687 (setq geben-dbgp-default-port 9003))
688#+end_src
689
690*** Автодополнение кода и документация
691По большей части я использую дефолтный Completion Buffer и Corfu
692#+begin_src elisp :tangle nil
693 (when (package-loaded? "corfu")
694 (progn
695 (setq corfu-preview-current 'nil
696 corfu-popupinfo-delay t)
697 (corfu-mode 1)
698 (corfu-popupinfo-mode 1)
699 (defun show-default-completion-buffer ()
700 (interactive)
701 (corfu-quit)
702 (corfu-mode -1)
703 (completion-at-point)
704 (corfu-mode 1)
705 (corfu-popupinfo-mode 1))
706 (define-key corfu-map (kbd "M-TAB") 'show-default-completion-buffer)
707 (define-key corfu-map (kbd "TAB") 'show-default-completion-buffer)
708 (define-key corfu-map (kbd "C-M-i") 'show-default-completion-buffer)
709 (corfu-mode -1)
710 (add-hook 'prog-mode-hook 'corfu-mode)
711
712 (defun corfu-send-shell (&rest _)
713 "Send completion candidate when inside comint/eshell."
714 (cond
715 ((and (derived-mode-p 'eshell-mode) (fboundp 'eshell-send-input))
716 (eshell-send-input))
717 ((and (derived-mode-p 'comint-mode) (fboundp 'comint-send-input))
718 (comint-send-input))))
719
720 (advice-add #'corfu-insert :after #'corfu-send-shell)
721
722 (add-hook 'eshell-mode-hook 'corfu-mode)))
723
724#+end_src
725*** Модификация дефолта
726#+BEGIN_SRC emacs-lisp :tangle nil
727 (setq completion-styles '(basic partial-completion substring flex emacs22)
728 completion-ignore-case t
729 read-buffer-completion-ignore-case t
730 read-file-name-completion-ignore-case t)
731#+END_SRC
732*** Агрессивный дефолтный комплит
733#+BEGIN_SRC emacs-lisp :tangle nil
734 (setq aggressive-completion-delay 0.5)
735 (aggressive-completion-mode t)
736#+END_SRC
737** Полнотекстовый поиск
738Для выхода из поиска -- C-c C-q
739#+begin_src emacs-lisp :tangle nil
740 (load "deft-autoloads")
741
742 (define-key global-map
743 (kbd "C-c n s") 'deft)
744
745 (setq deft-recursive t
746 deft-use-filter-string-for-filename t
747 deft-default-extension "org md"
748 deft-directory "~/projects/at-w96k/content/digarden")
749#+end_src
750
751** Визуализирование откатов
752При помощи пакета undo-tree
753#+begin_src emacs-lisp :tangle init.el
754 (when (package-loaded? "undo-tree")
755 (progn
756 (add-hook 'prog-mode-hook #'undo-tree-mode)
757 (add-hook 'org-mode-hook #'undo-tree-mode)
758 (setq undo-tree-auto-save-history nil)))
759#+end_src
760
761** Сниппеты
762#+begin_src emacs-lisp :tangle nil
763 (when (package-loaded? "yasnippet")
764 (progn
765 (add-hook 'prog-mode-hook #'yas-minor-mode)))
766#+end_src
767
768** Клиент LSP
769#+begin_src emacs-lisp :tangle nil
770 (with-eval-after-load 'eglot
771 (add-to-list 'eglot-server-programs '((php-mode phps-mode) . ("~/projects/phpactor/bin/phpactor" "language-server" "-vvv")))
772 (add-to-list 'eglot-server-programs '((php-mode phps-mode) . ("intelephense" "--stdio")))
773
774 ;; No event buffers, disable providers cause a lot of hover traffic. Shutdown unused servers.
775 (setq eglot-events-buffer-size 0
776 eglot-ignored-server-capabilities '(:hoverProvider
777 :documentHighlightProvider)
778 eglot-autoshutdown t))
779
780 ;; Show all of the available eldoc information when we want it. This way Flymake errors
781 ;; don't just get clobbered by docstrings.
782 (add-hook 'eglot-managed-mode-hook
783 (lambda ()
784 "Make sure Eldoc will show us all of the feedback at point."
785 (setq-local eldoc-documentation-strategy
786 #'eldoc-documentation-compose)))
787#+end_src
788
789** Линтеры
790#+begin_src emacs-lisp :tangle nil
791 (defun my-php-mode-setup ()
792 "My PHP-mode hook."
793 (require 'flycheck-phpstan)
794 (flycheck-mode t))
795
796 (add-hook 'php-mode-hook 'my-php-mode-setup)
797#+end_src
798
799#+BEGIN_SRC emacs-lisp :tangle nil
800 ;; (add-hook 'php-mode-hook 'flymake-php-load)
801 ;; (add-hook 'php-mode-hook 'flymake-phpstan-turn-on)
802
803 ;; (require 'flycheck-phpstan)
804
805
806 ;;(add-to-list 'auto-mode-alist '("\\.\\(php\\|phtml\\)\\'" . phps-mode))
807
808 ;; (phps-mode-flycheck-setup)
809
810 ;; (setq phps-mode-async-process t)
811 ;; (setq phps-mode-async-process-using-async-el t)
812#+END_SRC
813
814** Выделение
815#+BEGIN_SRC emacs-lisp :tangle init.el
816 (when (package-loaded? "expand-region")
817 (global-set-key (kbd "C-=") 'er/expand-region))
818#+END_SRC
819
820** Сессия
821#+BEGIN_SRC emacs-lisp :tangle nil
822 (desktop-save-mode 1)
823#+END_SRC
824** Скроллинг
825#+BEGIN_SRC emacs-lisp :tangle init.el
826 (setq scroll-margin 0)
827#+END_SRC
828** Поиск
829*** Isearch
830#+begin_src emacs-lisp :tangle init.el
831 (with-eval-after-load 'isearch
832 (define-key isearch-mode-map "\C-h" 'isearch-delete-char)
833 (define-key isearch-mode-map "\C-ch" 'isearch-help-for-help))
834#+end_src
835
836*** Подсчёт кандидатов
837#+BEGIN_SRC emacs-lisp :tangle nil
838(global-anzu-mode t)
839#+END_SRC
840*** Swiper (не используется)
841#+BEGIN_SRC emacs-lisp :result nil :tangle nil
842 (load "swiper-autoloads")
843 (global-set-key (kbd "C-s") 'swiper)
844
845 (setq swiper-include-line-number-in-search t
846 swiper-use-visual-line t
847 swiper-stay-on-quit t)
848#+END_SRC
849** Подсказка биндов
850Пакет Which-key
851#+begin_src elisp :tangle nil
852 (load "which-key-autoloads")
853 (which-key-setup-side-window-right)
854 (which-key-mode)
855
856 (setq which-key-side-window-max-width 0.5
857 which-key-show-remaining-keys t
858 which-key-max-display-columns 50
859 which-key-max-description-length 35
860 which-key-sort-order 'which-key-local-then-key-order
861 which-key-idle-delay 0.25)
862#+end_src
863
864** Права суперпользователя
865Sudo-edit
866#+begin_src emacs-lisp
867 (package-loaded? "sudo-edit")
868#+end_src
869
870** Промежуточный код
871Показывает собранное состояние будь то собранный куски на ассемблере
872или байт-код при помощи пакета RMSbolt.
873#+begin_src emacs-lisp :tangle init.el
874 (add-hook 'prog-mode-hook 'rmsbolt-mode)
875#+end_src
876
877** Быстрый запуск программы
878#+begin_src emacs-lisp :tangle init.el
879 (when (package-loaded? "quickrun")
880 (define-key global-map (kbd "C-c C-c") 'quickrun))
881#+end_src
882
883
884* Языки программирования
885** Common Lisp
886*** REPL
887#+BEGIN_SRC emacs-lisp :tangle nil
888 (load "sly-autoloads")
889
890 (setq sly-lisp-implementations
891 '((clisp ("clisp"))
892 (cmucl ("cmucl" "-quiet"))
893 (sbcl ("/opt/sbcl/bin/sbcl") :coding-system utf-8-unix)))
894#+END_SRC
895
896** Erlang
897#+BEGIN_SRC emacs-lisp :tangle nil
898 (load "erlang-autoloads")
899#+END_SRC
900
901** Ruby
902#+BEGIN_SRC emacs-lisp :tangle nil
903 (when (package-loaded? "inf-ruby")
904 (add-hook 'ruby-mode-hook 'inf-ruby-minor-mode))
905
906 (when (package-loaded? "inf-ruby")
907 (add-hook 'ruby-mode-hook 'robe-mode))
908#+END_SRC
909
910** Scheme
911#+BEGIN_SRC emacs-lisp :tangle init.el
912 (setq geiser-active-implementations '("guile"))
913#+END_SRC
914
915** Python
916*** Автодополнение и линт
917#+BEGIN_SRC emacs-lisp :tangle nil
918 (when (package-loaded? "anaconda-mode")
919 (progn
920 (add-hook 'python-mode-hook 'anaconda-mode)
921 (add-hook 'python-mode-hook 'anaconda-eldoc-mode)))
922
923 ;; (when (load "flymake" t)
924 ;; (defun flymake-pylint-init ()
925 ;; (let* ((temp-file (flymake-init-create-temp-buffer-copy
926 ;; 'flymake-create-temp-inplace))
927 ;; (local-file (file-relative-name
928 ;; temp-file
929 ;; (file-name-directory buffer-file-name))))
930 ;; (list "epylint" (list local-file))))
931
932 ;; (add-to-list 'flymake-allowed-file-name-masks
933 ;; '("\\.py\\'" flymake-pylint-init)))
934
935 ;; (add-hook 'python-mode-hook 'flymake-mode)
936#+END_SRC
937*** Прыжки в функции стандартной библиотеки на си
938** SML
939#+BEGIN_SRC emacs-lisp :tangle nil
940 (add-hook 'sml-mode-hook 'sml-mode)
941#+END_SRC
942
943** PHP
944*** PHP-Mode
945Необходимо скачать и распаковать мануал PHP (в формате html) в
946директорию ~~/.emacs.d/php-manual/~.
947#+begin_src emacs-lisp :tangle nil
948 ;; (add-to-list 'load-path "~/.emacs.d/site-lisp/realgud-xdebug/")
949 ;; (require 'realgud-xdebug)
950
951 ;; (defun init-php-mode ()
952 ;; (eglot-ensure))
953
954 (with-eval-after-load 'php-mode
955 (custom-set-variables '(lsp-phpactor-path "/home/w96k/php/phpactor"))
956 ;; (add-hook 'php-mode-hook #'init-php-mode)
957 )
958
959 (when (package-loaded? "php-mode")
960 (progn
961 (add-hook 'php-mode-hook 'php-enable-symfony2-coding-style)
962 (setq lsp-intelephense-php-version "8.1.16")
963 (defvar phpactor-executable "~/.local/bin/phpactor")
964 (custom-set-variables '(lsp-phpactor-path "~/usr/local/bin/phpactor"))
965
966 (add-hook 'php-mode-hook
967 '(lambda ()
968 ;; (require 'yasnippet)
969 ;; (require 'yasnippet-snippets)
970
971 (set-fill-column 120)
972
973 ;; (make-local-variable 'eldoc-documentation-function)
974 ;; (setq eldoc-documentation-function
975 ;; 'phpactor-hover)
976 ;; (yas-minor-mode t)
977 (define-key php-mode-map (kbd "C-c h") 'php-quickhelp-at-point)))
978
979 (setq php-manual-path
980 "~/php/php-manual/"
981 php-quickhelp-dir "~/php/php-manual/"
982 php-quickhelp--dest "~/.emacs.d/php-manual/php_manual_en.json")
983
984
985 ;; (add-hook 'php-mode-hook
986 ;; '(lambda ()
987 ;; ;; (auto-complete-mode t)
988
989 ;; ;; (require 'ac-php)
990 ;; (require 'php-quickhelp)
991 ;; (require 'company)
992 ;; (company-mode t)
993 ;; (require 'company-php)
994 ;; (require 'company-quickhelp)
995
996 ;; (require 'yasnippet)
997 ;; (require 'yasnippet-snippets)
998
999 ;; (set (make-local-variable 'company-backends)
1000 ;; '((company-ac-php-backend company-dabbrev-code)
1001 ;; php-quickhelp-company-php
1002 ;; company-capf company-files))
1003
1004 ;; (company-quickhelp-mode t)
1005
1006 ;; (define-key php-mode-map (kbd "C-M-i") 'company-complete)
1007 ;; (define-key company-mode-map (kbd "M-TAB") 'company-complete)
1008
1009 ;; ;; (setq ac-sources '(ac-source-php php-quickhelp-company-php))
1010 ;; ;; (setq eldoc-documentation-function
1011 ;; ;; 'php-quickhelp-eldoc-func)
1012
1013 ;; (yas-minor-mode t)
1014
1015 ;; ;; (define-key php-mode-map (kbd "C-M-i") 'auto-complete)
1016 ;; ;; (define-key ac-mode-map (kbd "M-TAB") 'auto-complete)
1017
1018 ;; (define-key php-mode-map (kbd "C-c H")
1019 ;; 'php-local-manual-search)
1020
1021 ;; (define-key php-mode-map (kbd "C-c h") 'php-quickhelp-at-point)
1022 ;; (define-key company-mode-map (kbd "C-c h") 'php-quickhelp-at-point)
1023
1024 ;; ;; (define-key php-mode-map (kbd "C-c t") 'ac-php-show-tip)
1025
1026 ;; ;; Jump to definition (optional)
1027 ;; (define-key php-mode-map
1028 ;; (kbd "M-.") 'ac-php-find-symbol-at-point)
1029
1030 ;; ;; Return back (optional)
1031 ;; (define-key php-mode-map
1032 ;; (kbd "M-,") 'ac-php-location-stack-back)))
1033 ))
1034#+end_src
1035
1036*** Composer
1037*** Flymake PHP
1038*** REPL
1039*** LSP сервер
1040PHPactor
1041#+begin_src emacs-lisp :tangle nil
1042 (with-eval-after-load 'php-mode
1043 (define-key php-mode-map (kbd "M-.") #'phpactor-goto-definition)
1044 (define-key php-mode-map (kbd "M-?") #'phpactor-find-references))
1045#+end_src
1046
1047*** Transient меню
1048#+begin_src emacs-lisp :tangle nil
1049 (require 'transient)
1050 (define-transient-command php-menu ()
1051 "Php"
1052 [["Class"
1053 ("cc" "Copy" phpactor-copy-class)
1054 ("cn" "New" phpactor-create-new-class)
1055 ("cr" "Move" phpactor-move-class)
1056 ("ci" "Inflect" phpactor-inflect-class)
1057 ("n" "Namespace" phpactor-fix-namespace)]
1058 ["Properties"
1059 ("a" "Accessor" phpactor-generate-accessors)
1060 ("pc" "Constructor" phpactor-complete-constructor)
1061 ("pm" "Add missing props" phpactor-complete-properties)
1062 ("r" "Rename var locally" phpactor-rename-variable-local)
1063 ("R" "Rename var in file" phpactor-rename-variable-file)]
1064 ["Extract"
1065 ("ec" "constant" phpactor-extract-constant)
1066 ("ee" "expression" phpactor-extract-expression)
1067 ("em" "method" phpactor-extract-method)]
1068 ["Methods"
1069 ("i" "Implement Contracts" phpactor-implement-contracts)
1070 ("m" "Generate method" phpactor-generate-method)]
1071 ["Navigate"
1072 ("x" "List refs" phpactor-list-references)
1073 ("X" "Replace refs" phpactor-replace-references)
1074 ("." "Goto def" phpactor-goto-definition)]
1075 ["Phpactor"
1076 ("s" "Status" phpactor-status)
1077 ("u" "Install" phpactor-install-or-update)]])
1078#+end_src
1079* Языки декларирования
1080** SQL
1081Need to install lsp-server called sqls
1082https://emacs-lsp.github.io/lsp-mode/page/lsp-sqls/
1083#+BEGIN_SRC emacs-lisp :tangle nil
1084 ;; Empty for now (was using emacsql)
1085 (setq lsp-sqls-server "~/go/bin/sqls")
1086
1087 ;; (setq lsp-sqls-workspace-config-path nil)
1088
1089 (setq lsp-sqls-connections
1090 '(((driver . "mysql") (dataSourceName . "dbuser:mangoworms@tcp(localhost:3306)/profile24"))))
1091#+END_SRC
1092
1093The main way to interact with SQL is using org-mode
1094#+begin_src emacs-lisp :tangle nil
1095 (when (package-loaded? "org-sql")
1096 (setq org-sql-files "~/projects/profile24/org"))
1097
1098 (add-hook 'sql-interactive-mode-hook
1099 (lambda ()
1100 (sql-connect "profile24")
1101 (toggle-truncate-lines t)))
1102
1103 (setq sql-connection-alist
1104 '((profile24
1105 (sql-product 'mysql)
1106 (sql-server "localhost")
1107 (sql-user "dbuser")
1108 (sql-password "123456")
1109 (sql-database "testdb")
1110 (sql-port 3306))))
1111#+end_src
1112
1113
1114** Веб шаблоны
1115*** Web-mode
1116#+BEGIN_SRC emacs-lisp :tangle init.el
1117 (when (package-loaded? "web-mode")
1118 (progn
1119
1120 (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
1121 (add-to-list 'auto-mode-alist '("\\.twig.html\\'" . web-mode))
1122
1123 (setq web-mode-markup-indent-offset 2)
1124 (setq web-mode-enable-auto-pairing t)
1125 (setq web-mode-enable-css-colorization t)
1126 (setq web-mode-enable-block-face t)
1127 (setq web-mode-enable-current-element-highlight t)))
1128#+END_SRC
1129
1130** Org
1131*** Org-mode
1132#+BEGIN_SRC emacs-lisp :tangle init.el
1133 (org-babel-do-load-languages
1134 'org-babel-load-languages
1135 '((R . t)
1136 (ditaa . t)
1137 (dot . t)
1138 ;; (php . t)
1139 (emacs-lisp . t)
1140 (gnuplot . t)
1141 (haskell . nil)
1142 (latex . t)
1143 ;;(ledger . t)
1144 (ocaml . nil)
1145 (octave . t)
1146 (python . t)
1147 (ruby . t)
1148 (screen . nil)
1149 (shell . t)
1150 (sql . t)
1151 (js . t)))
1152
1153 (defun org-babel-edit-prep:sql (babel-info)
1154 (setq-local buffer-file-name (->> babel-info caddr (alist-get :tangle)))
1155 (setq-local lsp-buffer-uri (->> babel-info caddr (alist-get :tangle) lsp--path-to-uri))
1156 (setq-local lsp-headerline-breadcrumb-enable nil)
1157 (lsp))
1158
1159 (global-set-key (kbd "C-c l") 'org-store-link)
1160 (global-set-key (kbd "C-c a") 'org-agenda)
1161 (global-set-key (kbd "C-c c") 'org-capture)
1162 ;; (global-set-key (kbd "M-f") 'org-metaright)
1163 ;; (global-set-key (kbd "M-b") 'org-metaleft)
1164 ;; (global-set-key (kbd "M-p") 'org-metaup)
1165 ;; (global-set-key (kbd "M-n") 'org-metadown)
1166
1167 (setq org-default-notes-file "~/Documents/todo.org"
1168 system-time-locale "C"
1169 org-use-speed-commands t
1170 org-adapt-indentation nil
1171 org-return-follows-link t
1172 org-display-remote-inline-images 'download
1173 org-image-actual-width (list 400)
1174 org-hide-emphasis-markers t
1175 org-outline-path-complete-in-steps nil
1176 org-src-tab-acts-natively t
1177 org-id-track-globally t
1178 org-confirm-babel-evaluate nil)
1179
1180 (setq org-todo-keywords
1181 (quote ((sequence "TODO(t)"
1182 "MIGRATE(m)" "|"
1183 "IN PROGRESS(p)"
1184 "DONE(d)")
1185 (sequence "WAITING(w@/!)"
1186 "HOLD(h@/!)" "|"
1187 "CANCELLED(c@/!)"
1188 "PHONE"
1189 "MEETING"))))
1190 (setq org-todo-keyword-faces
1191 (quote (("TODO" :foreground "red" :weight bold)
1192 ("NEXT" :foreground "blue" :weight bold)
1193 ("DONE" :foreground "forest green" :weight bold)
1194 ("WAITING" :foreground "orange" :weight bold)
1195 ("HOLD" :foreground "magenta" :weight bold)
1196 ("CANCELLED" :foreground "forest green" :weight bold)
1197 ("MEETING" :foreground "forest cyan" :weight bold)
1198 ("PHONE" :foreground "blue" :weight bold))))
1199#+END_SRC
1200
1201*** Org-ref (не используется)
1202
1203#+begin_src emacs-lisp :tangle nil
1204 (load "org-ref-autoloads")
1205
1206 (setq reftex-default-bibliography '("~/Documents/bibliography/references.bib"))
1207
1208 ;; see org-ref for use of these variables
1209 (setq org-ref-bibliography-notes "~/Documents/bibliography/notes.org"
1210 org-ref-default-bibliography '("~/Documents/Bibliography/references.bib")
1211 org-ref-pdf-directory "~/Documents/bibliography/bibtex-pdfs/")
1212#+end_src
1213
1214*** Org-roam
1215#+begin_src emacs-lisp :tangle init.el
1216 (when (package-loaded? "org-roam")
1217 (progn
1218 (setq org-roam-directory (file-truename "~/projects/at-w96k/content/digarden/pages/")
1219 org-roam-v2-ack t
1220 org-roam-completion-everywhere t
1221 org-roam-index-file (concat org-roam-directory "/20210409054712-жизнь.org")
1222 org-roam-dailies-directory (concat org-roam-directory "journals/"))
1223
1224 (org-roam-db-autosync-mode t)
1225
1226 (defun org-roam-jump-to-index ()
1227 "Stub of recreating the function from V1"
1228 (interactive)
1229 (let
1230 ((org-roam-index org-roam-index-file))
1231 (find-file org-roam-index)))
1232
1233 (define-key global-map
1234 (kbd "C-c n l") 'org-roam-node-insert)
1235 (define-key global-map
1236 (kbd "C-c n f") 'org-roam-node-find)
1237 (define-key global-map
1238 (kbd "C-c n b") 'org-roam-buffer-toggle)
1239 (define-key global-map
1240 (kbd "C-c n t t") 'org-roam-tag-add)
1241 (define-key global-map
1242 (kbd "C-c n t r") 'org-roam-tag-remove)
1243 (define-key global-map
1244 (kbd "C-c n i") 'org-roam-jump-to-index)
1245 (define-key global-map
1246 (kbd "C-c n g") 'org-roam-graph)
1247 (define-key global-map
1248 (kbd "C-c n d") 'org-roam-db-build-cache)
1249 (define-key global-map
1250 (kbd "C-c n r") 'org-roam-node-random)
1251 (define-key global-map
1252 (kbd "C-c n j") 'org-roam-dailies-find-date)))
1253
1254 (customize-set-variable 'org-link-descriptive t)
1255#+end_src
1256
1257*** Агенда и Capture
1258#+begin_src emacs-lisp :tangle init.el
1259 (add-to-list 'org-agenda-files
1260 "~/Documents/todo.org")
1261
1262 (setq org-directory "~/Documents"
1263 org-default-notes-file (concat org-directory "/todo.org"))
1264#+end_src
1265
1266** YAML
1267#+begin_src emacs-lisp
1268 (package-loaded? "yaml-mode")
1269#+end_src
1270
1271* Коммуникации
1272** Telega
1273#+BEGIN_SRC emacs-lisp :tangle init.el
1274 (when (package-loaded? "telega")
1275 (setq telega-filter-custom-show-folders t
1276 telega-chat-fill-column 40
1277 telega-root-fill-column 60
1278 telega-url-shorten-use-images t)
1279
1280 (define-key global-map (kbd "C-c t") telega-prefix-map))
1281#+END_SRC
1282
1283** Mastodon
1284#+begin_src emacs-lisp :tangle nil
1285 (when (package-loaded? "mastodon")
1286 (setq mastodon-active-user "w96k"
1287 mastodon-instance-url "https://fosstodon.org/"))
1288#+end_src
1289
1290* Наука
1291* Разное
1292
1293** Минорные твики дефолтного имакса
1294*** Короткие ответы на вопросы
1295#+begin_src emacs-lisp :tangle init.el
1296 (if (boundp 'use-short-answers)
1297 (setq use-short-answers t)
1298 (advice-add 'yes-or-no-p :override #'y-or-n-p))
1299#+end_src
1300
1301*** Не сохранять дубликаты в killring
1302
1303*** Удалять выделенный регион при вводе текста
1304#+begin_src emacs-lisp :tangle init.el
1305 (delete-selection-mode 1)
1306#+end_src
1307
1308*** Подсвечивать текущую строку
1309#+begin_src emacs-lisp :tangle nil
1310 (global-hl-line-mode 1)
1311#+end_src
1312
1313*** Открывать список буферов в отдельном фрейме
1314#+begin_src emacs-lisp :tangle nil
1315 (add-to-list 'special-display-buffer-names "*Buffer List*")
1316 (setq Buffer-menu-files-only t)
1317#+end_src
1318
1319*** Автодополнение в echo при M-x и других командах
1320#+begin_src emacs-lisp :tangle init.el
1321 (icomplete-mode 1)
1322#+end_src
1323*** Проверять орфографию
1324#+begin_src emacs-lisp :tangle init.el
1325 (flyspell-mode 1)
1326#+end_src
1327
1328*** Не спрашивать о несуществующих буферах
1329#+BEGIN_SRC emacs-lisp :tangle init.el
1330 (setq-default confirm-nonexistent-file-or-buffer t)
1331#+END_SRC
1332
1333*** Переключение буферов
1334#+BEGIN_SRC emacs-lisp :tangle init.el
1335 (global-set-key (kbd "M-o") 'mode-line-other-buffer)
1336#+END_SRC
1337
1338*** Минорные твики
1339#+begin_src emacs-lisp :tangle init.el
1340 ;; (setq redisplay-dont-pause t)
1341
1342 (setq select-enable-clipboard t
1343 select-enable-primary t)
1344
1345 (setq completions-detailed nil)
1346
1347 (setq kill-buffer-delete-auto-save-files t)
1348 (setq next-error-message-highlight t)
1349
1350 (setq mode-line-compact 'long)
1351
1352 (setq completions-group t)
1353
1354 ;;(set-frame-parameter nil 'internal-border-width 0)
1355
1356 ;; (set-window-buffer nil (current-buffer))
1357
1358 (setq default-directory "~/"
1359 delete-seleciton-mode t
1360 inhibit-startup-message t
1361 initial-scratch-message nil
1362 custom-safe-themes t
1363 delete-old-versions t
1364 confirm-kill-processes nil
1365 enable-local-variables t)
1366#+end_src
1367
1368*** Shell
1369#+begin_src emacs-lisp :tangle init.el
1370 (setq ansi-color-for-comint-mode t)
1371 (setq shell-command-prompt-show-cwd t)
1372#+end_src
1373
1374*** Переменная PATH в eshell
1375#+BEGIN_SRC emacs-lisp :tangle nil
1376 (setq exec-path-from-shell-variables
1377 '("PATH" "MANPATH"))
1378
1379 (when (and (memq window-system '(mac ns x))
1380 (not (eq system-type 'berkeley-unix)))
1381 (exec-path-from-shell-initialize))
1382#+END_SRC
1383
1384*** Отображение номера колонки
1385#+BEGIN_SRC emacs-lisp :tangle init.el
1386 (column-number-mode)
1387#+END_SRC
1388
1389*** nobreak символы
1390#+BEGIN_SRC emacs-lisp :tangle init.el
1391 (setq nobreak-char-display nil)
1392#+END_SRC
1393
1394*** Меню
1395*** Сохранять временные файлы не в той же директории
1396#+BEGIN_SRC emacs-lisp :tangle init.el
1397 (defvar backup-dir "~/.emacs.d/backups/")
1398
1399 (setq
1400 backup-by-copying t
1401 backup-directory-alist
1402 '(("~/.emacs.d/backups/"))
1403 version-control nil)
1404#+END_SRC
1405
1406*** Календарь
1407Делаем начало недели в понедельник.
1408#+BEGIN_SRC emacs-lisp :tangle init.el
1409 (setq calendar-week-start-day 1)
1410#+END_SRC
1411
1412*** Вернуться в предыдущий буфер
1413#+BEGIN_SRC emacs-lisp :tangle nil
1414 (define-key global-map (kbd "C-q C-q") 'previous-buffer)
1415 (define-key global-map (kbd "C-S-q C-S-q") 'next-buffer)
1416#+END_SRC
1417*** Смена раскладки (EN / RU) и поддержка биндов на других языках
1418Работает на C-\
1419#+begin_src elisp :tangle init.el
1420 (set-input-method "russian-computer")
1421 (toggle-input-method)
1422#+end_src
1423
1424*** Требовать создания последней пустой строки
1425#+begin_src emacs-lisp :tangle init.el
1426 (setq require-final-newline t)
1427#+end_src
1428
1429*** Стирать текст на C-h как в Bash
1430И переназначаем старые бинды
1431#+begin_src emacs-lisp :tangle nil
1432 (define-key global-map (kbd "C-h") 'delete-backward-char)
1433 (define-key global-map (kbd "C-c h") 'help-command)
1434#+end_src
1435
1436*** Поддержка CamelCase в навигации
1437#+begin_src emacs-lisp :tangle init.el
1438 (global-subword-mode 1)
1439#+end_src
1440
1441*** Kills
1442#+begin_src emacs-lisp :tangle init.el
1443 (define-key global-map (kbd "C-k") 'kill-region)
1444
1445 (when (package-loaded? "whole-line-or-region")
1446 (whole-line-or-region-global-mode))
1447
1448 (define-key global-map (kbd "C-w") 'backward-kill-word)
1449#+end_src
1450
1451
1452** Браузер
1453#+begin_src emacs-lisp :tangle nil
1454 (setq browse-url-browser-function #'eww-browse-url)
1455
1456 (add-hook 'eww-mode-hook
1457 (lambda ()
1458 (set-fill-column 80)
1459 (display-fill-column-indicator-mode)
1460 (visual-fill-column-mode)))
1461#+end_src
1462
1463** Tramp
1464#+begin_src emacs-lisp :tangle nil
1465 (add-to-list 'tramp-remote-path 'tramp-own-remote-path)
1466#+end_src
1467
1468** Docker
1469#+begin_src emacs-lisp :tangle init.el
1470 (package-loaded? "docker")
1471 (package-loaded? "docker-compose-mode")
1472#+end_src
1473** Debian
1474Инструменты для работы с пакетным менеджером Debian'а apt'ом и смежными
1475инструментами.
1476#+begin_src elisp :tangle nil
1477 (load "debian-el-autoloads")
1478 (load "dpkg-dev-el-autoloads")
1479#+end_src
1480
1481** Guix
1482#+begin_src emacs-lisp :tangle init.el
1483 (package-loaded? "geiser-guile")
1484
1485 (package-loaded? "guix")
1486
1487 (setq geiser-guile-binary "guile")
1488
1489 (with-eval-after-load 'geiser-guile
1490 (progn
1491 (add-to-list 'geiser-guile-load-path "~/projects/guix/")))
1492
1493 (let ((guix-copyright "~/projects/guix/etc/copyright.el"))
1494 (if (file-exists-p guix-copyright)
1495 (load-file "~/projects/guix/etc/copyright.el")))
1496
1497 (setq copyright-names-regexp
1498 (format "%s <%s>" user-full-name user-mail-address))
1499#+end_src
1500
1501** Nix
1502#+begin_src emacs-lisp :tangle nil
1503 (package-loaded? "nix")
1504#+end_src
1505
1506** Direnv
1507#+BEGIN_SRC emacs-lisp :tangle nil
1508 (when (package-loaded? "direnv")
1509 (direnv-mode))
1510#+END_SRC
1511
1512** Баг-трекеры
1513*** Debbugs
1514** PDF
1515
1516** Увеличение/уменьшение шрифта
1517#+BEGIN_SRC emacs-lisp :tangle nil
1518 (defun zoom-in ()
1519 (interactive)
1520 (let ((x (+ (face-attribute 'default :height)
1521 10)))
1522 (set-face-attribute 'default nil :height x)
1523 (set-face-attribute 'mode-line nil :height x)
1524 (set-face-attribute 'mode-line-inactive nil :height x)
1525 (set-face-attribute 'mode-line-position-face nil :height x)))
1526
1527 (defun zoom-out ()
1528 (interactive)
1529 (let ((x (- (face-attribute 'default :height)
1530 10)))
1531 (set-face-attribute 'default nil :height x)
1532 (set-face-attribute 'mode-line nil :height x)
1533 (set-face-attribute 'mode-line-inactive nil :height x)
1534 (set-face-attribute 'mode-line-position-face nil :height x)))
1535
1536 (define-key global-map (kbd "C-=") 'zoom-in)
1537 (define-key global-map (kbd "C-+") 'zoom-out)
1538
1539#+END_SRC
1540
1541** Автокомплит у yes-or-no
1542** Полный экран
1543Открывать Emacs на полный экран
1544#+begin_src emacs-lisp :tangle nil
1545 (add-to-list 'default-frame-alist '(fullscreen . maximized))
1546#+end_src
1547
1548** Фуллскрин
1549Отображать ровно столько строчек, сколько вмещает экран.
1550
1551Не работает с native-comp.
1552
1553#+begin_src elisp :tangle nil
1554 (toggle-frame-fullscreen)
1555
1556 (defun fullscreen ()
1557 "Fullscreen."
1558 (interactive)
1559 (x-send-client-message nil 0 nil "_NET_WM_STATE" 32
1560 ;; if first parameter is '1', can't toggle fullscreen status
1561 '(1 "_NET_WM_STATE_FULLSCREEN" 0)))
1562#+end_src
1563** Удаление буфера и файла
1564#+begin_src elisp :tangle init.el
1565 (defun delete-file-and-buffer ()
1566 "Kill the current buffer and deletes the file it is visiting."
1567 (interactive)
1568 (let ((filename (buffer-file-name)))
1569 (if filename
1570 (if (y-or-n-p (concat "Do you really want to delete file " filename " ?"))
1571 (progn
1572 (delete-file filename)
1573 (message "Deleted file %s." filename)
1574 (kill-buffer)))
1575 (message "Not a file visiting buffer!"))))
1576#+end_src
1577
1578** Длинные строки
1579#+begin_src emacs-lisp :tangle nil
1580 ;; Better support for files with long lines
1581 (setq-default bidi-paragraph-direction 'left-to-right)
1582 (setq-default bidi-inhibit-bpa t)
1583 (global-so-long-mode 1)
1584#+end_src
1585
1586** Make shebang (#!) file executable when saved
1587#+begin_src emacs-lisp :tangle init.el
1588 (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p)
1589#+end_src
1590
1591** Enable savehist-mode for command history
1592#+begin_src emacs-lisp :tangle init.el
1593 (savehist-mode 1)
1594#+end_src
Note: See TracBrowser for help on using the repository browser.