init.el 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. (setq custom-file (concat user-emacs-directory "custom.el"))
  2. (when (file-exists-p custom-file)
  3. (load custom-file))
  4. (setq inhibit-startup-message t)
  5. (scroll-bar-mode -1) ; Disable visible scrollbar
  6. (tool-bar-mode -1) ; Disable the toolbar
  7. (tooltip-mode -1) ; Disable tooltips
  8. (set-fringe-mode 0) ; Disable fringes
  9. (menu-bar-mode -1) ; Disagel menubar
  10. (setq visual-bell t)
  11. (column-number-mode)
  12. (setq display-line-numbers-type 'relative) ;; Display relative line numbers
  13. (add-hook 'prog-mode-hook #'display-line-numbers-mode) ;; Enable line numbers only when programming
  14. (defvar my/default-font "JetBrains Mono")
  15. (defvar my/default-font-size 130)
  16. (defvar my/default-variable-font-size 130)
  17. (set-face-attribute 'default nil :font my/default-font :height my/default-font-size)
  18. (set-face-attribute 'fixed-pitch nil :font my/default-font :height my/default-font-size)
  19. (set-face-attribute 'variable-pitch nil :font "DejaVu Sans Mono" :height my/default-variable-font-size)
  20. (require 'package)
  21. (when (version< emacs-version "28")
  22. (add-to-list 'package-archives '("nongnu" . "https://elpa.nongnu.org/nongnu/")))
  23. (add-to-list 'package-archives '("stable" . "https://stable.melpa.org/packages/"))
  24. (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
  25. (customize-set-variable 'package-archive-priorities
  26. '(("gnu" . 99) ; prefer GNU packages
  27. ("nongnu" . 80) ; use non-gnu packages if
  28. ; not found in GNU elpa
  29. ("stable" . 70) ; prefer "released" versions
  30. ; from elpa
  31. ("melpa" . 0))) ; if all else fails, get it
  32. ; from melpa
  33. (package-initialize)
  34. (defun toggle-transparency ()
  35. (interactive)
  36. (let ((alpha (frame-parameter nil 'alpha)))
  37. (set-frame-parameter
  38. nil 'alpha
  39. (if (eql (cond ((numberp alpha) alpha)
  40. ((numberp (cdr alpha)) (cdr alpha))
  41. ;; Also handle undocumented (<active> <inactive>) form.
  42. ((numberp (cadr alpha)) (cadr alpha)))
  43. 100)
  44. '(85 . 50) '(100 . 100)))))
  45. (global-set-key (kbd "C-c t") 'toggle-transparency)
  46. (defadvice find-file (before make-directory-maybe (filename &optional wildcards) activate)
  47. "Create parent directory if not exists while visiting file."
  48. (unless (file-exists-p filename)
  49. (let ((dir (file-name-directory filename)))
  50. (unless (file-exists-p dir)
  51. (make-directory dir t)))))
  52. (defvar auto-save-directory (expand-file-name "autosaves/" user-emacs-directory))
  53. (when (not (file-exists-p auto-save-directory))
  54. (make-directory auto-save-directory))
  55. (setq auto-save-file-name-transforms
  56. `((".*" ,auto-save-directory t)))
  57. (set-language-environment 'Russian)
  58. (global-set-key (kbd "C-c w h") 'windmove-left)
  59. (global-set-key (kbd "C-c w l") 'windmove-right)
  60. (global-set-key (kbd "C-c w k") 'windmove-up)
  61. (global-set-key (kbd "C-c w j") 'windmove-down)
  62. ;; No need to put :ensure t
  63. (unless (package-installed-p 'use-package)
  64. (package-refresh-contents)
  65. (package-install 'use-package))
  66. (require 'use-package)
  67. (setq use-package-always-ensure t)
  68. (defun meow-setup ()
  69. (setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty)
  70. (meow-motion-overwrite-define-key
  71. '("j" . meow-next)
  72. '("k" . meow-prev)
  73. '("<escape>" . ignore))
  74. (meow-leader-define-key
  75. ;; SPC j/k will run the original command in MOTION state.
  76. '("j" . "H-j")
  77. '("k" . "H-k")
  78. ;; Use SPC (0-9) for digit arguments.
  79. '("1" . meow-digit-argument)
  80. '("2" . meow-digit-argument)
  81. '("3" . meow-digit-argument)
  82. '("4" . meow-digit-argument)
  83. '("5" . meow-digit-argument)
  84. '("6" . meow-digit-argument)
  85. '("7" . meow-digit-argument)
  86. '("8" . meow-digit-argument)
  87. '("9" . meow-digit-argument)
  88. '("0" . meow-digit-argument)
  89. '("/" . meow-keypad-describe-key)
  90. '("?" . meow-cheatsheet))
  91. (meow-normal-define-key
  92. '("0" . meow-expand-0)
  93. '("9" . meow-expand-9)
  94. '("8" . meow-expand-8)
  95. '("7" . meow-expand-7)
  96. '("6" . meow-expand-6)
  97. '("5" . meow-expand-5)
  98. '("4" . meow-expand-4)
  99. '("3" . meow-expand-3)
  100. '("2" . meow-expand-2)
  101. '("1" . meow-expand-1)
  102. '("-" . negative-argument)
  103. '(";" . meow-reverse)
  104. '("," . meow-inner-of-thing)
  105. '("." . meow-bounds-of-thing)
  106. '("[" . meow-beginning-of-thing)
  107. '("]" . meow-end-of-thing)
  108. '("a" . meow-append)
  109. '("A" . meow-open-below)
  110. '("b" . meow-back-word)
  111. '("B" . meow-back-symbol)
  112. '("c" . meow-change)
  113. '("d" . meow-delete)
  114. '("D" . meow-backward-delete)
  115. '("e" . meow-next-word)
  116. '("E" . meow-next-symbol)
  117. '("f" . meow-find)
  118. '("g" . meow-cancel-selection)
  119. '("G" . meow-grab)
  120. '("h" . meow-left)
  121. '("H" . meow-left-expand)
  122. '("i" . meow-insert)
  123. '("I" . meow-open-above)
  124. '("j" . meow-next)
  125. '("J" . meow-next-expand)
  126. '("k" . meow-prev)
  127. '("K" . meow-prev-expand)
  128. '("l" . meow-right)
  129. '("L" . meow-right-expand)
  130. '("m" . meow-join)
  131. '("n" . meow-search)
  132. '("o" . meow-block)
  133. '("O" . meow-to-block)
  134. '("p" . meow-yank)
  135. '("q" . meow-quit)
  136. '("Q" . meow-goto-line)
  137. '("r" . meow-replace)
  138. '("R" . meow-swap-grab)
  139. '("s" . meow-kill)
  140. '("t" . meow-till)
  141. '("u" . meow-undo)
  142. '("U" . meow-undo-in-selection)
  143. '("v" . meow-visit)
  144. '("w" . meow-mark-word)
  145. '("W" . meow-mark-symbol)
  146. '("x" . meow-line)
  147. '("X" . meow-goto-line)
  148. '("y" . meow-save)
  149. '("Y" . meow-sync-grab)
  150. '("z" . meow-pop-selection)
  151. '("'" . repeat)
  152. '("<escape>" . ignore)))
  153. (use-package meow
  154. :config
  155. (meow-setup)
  156. (meow-global-mode 1))
  157. (use-package doom-themes
  158. :config
  159. ;; Global settings (defaults)
  160. (setq doom-themes-enable-bold t ; if nil, bold is universally disabled
  161. doom-themes-enable-italic t) ; if nil, italics is universally disabled
  162. (load-theme 'doom-monokai-classic t)
  163. ;; Enable flashing mode-line on errors
  164. (doom-themes-visual-bell-config)
  165. ;; Enable custom neotree theme (all-the-icons must be installed!)
  166. ;;(doom-themes-neotree-config)
  167. ;; or for treemacs users
  168. ;;(setq doom-themes-treemacs-theme "doom-atom") ; use "doom-colors" for less minimal icon theme
  169. ;;(doom-themes-treemacs-config)
  170. ;; Corrects (and improves) org-mode's native fontification.
  171. (doom-themes-org-config))
  172. (use-package all-the-icons)
  173. (use-package doom-modeline
  174. :init (doom-modeline-mode 1))
  175. (use-package org-faces
  176. :ensure nil
  177. :after org
  178. :custom-face
  179. (org-block ((nil (:inherit fixed-pitch :foreground nil))))
  180. (org-code ((nil (:inherit (shadow fixed-pitch)))))
  181. (org-table ((nil (:inherit fixed-pitch))))
  182. (org-verbatim ((nil (:inherit (shadow fixed-pitch)))))
  183. (org-special-keyword ((nil (:inherit (font-lock-comment-face fixed-pitch)))))
  184. (org-meta-line ((nil (:inherit (font-lock-comment-face fixed-pitch)))))
  185. (org-checkbox ((nil (:inherit fixed-pitch)))))
  186. (defun my/org-mode-setup ()
  187. (org-indent-mode)
  188. (org-hide-block-all) ;; Collapse all blocks
  189. (variable-pitch-mode 1)
  190. (visual-line-mode 1))
  191. (use-package org
  192. :hook (org-mode . my/org-mode-setup))
  193. (use-package org-superstar
  194. :after org
  195. :hook (org-mode . (lambda () (org-superstar-mode 1))))
  196. (defun my/org-mode-visual-fill ()
  197. (setq visual-fill-column-width 120
  198. visual-fill-column-center-text t)
  199. (visual-fill-column-mode 1))
  200. (use-package visual-fill-column
  201. :after org
  202. :hook (org-mode . my/org-mode-visual-fill))
  203. (use-package corfu
  204. :custom
  205. (corfu-auto t)
  206. (corfu-separator ?\s)
  207. (corfu-quit-no-match 'separator)
  208. :init
  209. (global-corfu-mode)
  210. :bind (:map corfu-map ([remap isearch-forward] . corfu-insert-separator)))
  211. (use-package emacs
  212. :init
  213. (setq tab-always-indent 'complete))
  214. (use-package corfu-popupinfo
  215. :ensure nil
  216. :after corfu
  217. :custom
  218. (corfu-popupinfo-delay 0)
  219. :init
  220. (corfu-popupinfo-mode)
  221. :bind (:map corfu-popupinfo-map
  222. ("M-p" . corfu-popupinfo-scroll-down)
  223. ("M-n" . corfu-popupinfo-scroll-up)))
  224. (use-package kind-icon
  225. :ensure t
  226. :after corfu
  227. :custom
  228. (kind-icon-use-icons nil)
  229. (kind-icon-default-face 'corfu-default) ; to compute blended backgrounds correctly
  230. :config
  231. (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))
  232. (use-package orderless
  233. :custom
  234. (completion-styles '(orderless basic))
  235. (completion-category-defaults nil)
  236. (completion-category-overrides '((file (styles basic partial-completion))
  237. (eglot (styles orderless)))))
  238. (use-package cape
  239. :init
  240. (dolist (capf (list #'cape-dabbrev
  241. #'cape-file))
  242. (add-to-list 'completion-at-point-functions capf)))
  243. (use-package yasnippet
  244. :diminish
  245. :config
  246. (yas-reload-all)
  247. (yas-global-mode))
  248. (use-package yasnippet-snippets)
  249. (use-package company)
  250. (use-package company-yasnippet
  251. :ensure nil
  252. :config
  253. (add-to-list 'completion-at-point-functions (cape-company-to-capf #'company-yasnippet)))
  254. (use-package vertico
  255. :init (vertico-mode))
  256. ;; Persist history over Emacs restarts. Vertico sorts by history position.
  257. (use-package savehist
  258. :init
  259. (savehist-mode))
  260. ;; A few more useful configurations...
  261. (use-package emacs
  262. :init
  263. ;; Add prompt indicator to `completing-read-multiple'.
  264. ;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma.
  265. (defun crm-indicator (args)
  266. (cons (format "[CRM%s] %s"
  267. (replace-regexp-in-string
  268. "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
  269. crm-separator)
  270. (car args))
  271. (cdr args)))
  272. (advice-add #'completing-read-multiple :filter-args #'crm-indicator)
  273. ;; Do not allow the cursor in the minibuffer prompt
  274. (setq minibuffer-prompt-properties
  275. '(read-only t cursor-intangible t face minibuffer-prompt))
  276. (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
  277. ;; Emacs 28: Hide commands in M-x which do not work in the current mode.
  278. ;; Vertico commands are hidden in normal buffers.
  279. ;; (setq read-extended-command-predicate
  280. ;; #'command-completion-default-include-p)
  281. ;; Enable recursive minibuffers
  282. (setq enable-recursive-minibuffers t))
  283. (use-package vertico-directory
  284. :after vertico
  285. :ensure nil
  286. :bind (:map vertico-map
  287. ("RET" . vertico-directory-enter)
  288. ("DEL" . vertico-directory-delete-char)
  289. ("M-DEL" . vertico-directory-delete-word))
  290. :hook (rfn-eshadow-update-overlay . vertico-directory-tidy))
  291. (use-package marginalia
  292. ;; Either bind `marginalia-cycle' globally or only in the minibuffer
  293. :bind (("M-A" . marginalia-cycle)
  294. :map minibuffer-local-map
  295. ("M-A" . marginalia-cycle))
  296. ;; The :init configuration is always executed (Not lazy!)
  297. :init
  298. ;; Must be in the :init section of use-package such that the mode gets
  299. ;; enabled right away. Note that this forces loading the package.
  300. (marginalia-mode))
  301. (defun my/eglot-capf ()
  302. (setq-local completion-at-point-functions
  303. (list (cape-super-capf
  304. #'eglot-completion-at-point
  305. (cape-company-to-capf #'company-yasnippet)
  306. #'cape-dabbrev
  307. #'cape-file))))
  308. (use-package eglot
  309. :config
  310. (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
  311. :bind (("C-c l a a" . eglot-code-actions)
  312. ("C-c l a i" . eglot-code-actions-inline)
  313. ("C-c l a q" . eglot-code-actions-quickfix)
  314. ("C-c l a e" . eglot-code-actions-extract)
  315. ("C-c l a r" . eglot-code-actions-rewrite)
  316. ("C-c l r" . elot-rename)
  317. ("C-c l s d" . xref-find-definitions)
  318. ("C-c l s i" . eglot-find-implementation)
  319. ("C-c l s c" . eglot-find-declaration)
  320. ("C-c l s t" . eglot-find-typeDefinition))
  321. :hook
  322. (eglot-managed-mode . my/eglot-capf))
  323. (use-package magit)
  324. (use-package helpful
  325. :bind
  326. (([remap describe-function] . helpful-callable)
  327. ([remap describe-variable] . helpful-variable)
  328. ([remap describe-key] . helpful-key)
  329. ([remap describe-command] . helpful-command)))
  330. (use-package no-littering
  331. :init
  332. (setq no-littering-etc-directory
  333. (expand-file-name "config/" user-emacs-directory))
  334. (setq no-littering-var-directory
  335. (expand-file-name "data/" user-emacs-directory))
  336. (setq backup-directory-alist
  337. `(("\\`/tmp/" . nil)
  338. ("\\`/dev/shm/" . nil)
  339. ("." . ,(no-littering-expand-var-file-name "backup/")))))
  340. (use-package fish-mode)
  341. (use-package haskell-mode)
  342. (use-package clojure-mode)
  343. (use-package cider)
  344. (defun my/clojure-mode-hook ()
  345. (clj-refactor-mode 1)
  346. (yas-minor-mode 1) ; for adding require/use/import statements
  347. ;; This choice of keybinding leaves cider-macroexpand-1 unbound
  348. (cljr-add-keybindings-with-prefix "C-c C-m"))
  349. (use-package clj-refactor
  350. :hook (clojure-mode . my/clojure-mode-hook))
  351. (use-package telega)