init.el 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. ;;; init.el --- initialization file -*- lexical-binding: t -*-
  2. ;;; Commentary:
  3. ;; `init.el'
  4. ;;; Code:
  5. (let ((normal-gc-cons-threshold (* 20 1024 1024)))
  6. (setq gc-cons-threshold most-positive-fixnum)
  7. (add-hook 'emacs-startup-hook
  8. (lambda ()
  9. (setq gc-cons-threshold normal-gc-cons-threshold)
  10. (message "%s" (emacs-init-time)))))
  11. (fset 'display-startup-echo-area-message 'ignore)
  12. (when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
  13. (when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
  14. (when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
  15. (when (fboundp 'tooltip-mode) (tooltip-mode -1))
  16. (prefer-coding-system 'utf-8)
  17. (set-language-environment "UTF-8")
  18. (setq-default
  19. auto-save-default nil
  20. backup-inhibited t
  21. calendar-week-start-day 1
  22. column-number-mode t
  23. completion-category-defaults nil
  24. completion-category-overrides '((file (styles partial-completion)))
  25. completion-styles '(basic flex partial-completion)
  26. create-lockfiles nil
  27. custom-file (locate-user-emacs-file "custom.el")
  28. default-input-method "russian-computer"
  29. display-line-numbers-type 't
  30. ediff-split-window-function 'split-window-sensibly
  31. ediff-window-setup-function 'ediff-setup-windows-plain
  32. epa-pinentry-mode 'loopback
  33. font-use-system-font t
  34. indent-tabs-mode nil
  35. indicate-empty-lines t
  36. inhibit-startup-buffer-menu t
  37. inhibit-startup-screen t
  38. initial-scratch-message nil
  39. kill-buffer-query-functions nil
  40. make-backup-files nil
  41. ;; mode-line-compact 'long
  42. mouse-wheel-flip-direction t
  43. mouse-wheel-follow-mouse t
  44. mouse-wheel-progressive-speed nil
  45. mouse-wheel-scroll-amount '(3 ((shift) . hscroll))
  46. mouse-wheel-tilt-scroll nil
  47. recentf-max-saved-items 200
  48. require-final-newline t
  49. scroll-conservatively 10000
  50. scroll-margin 5
  51. select-enable-clipboard nil
  52. select-enable-primary nil
  53. server-client-instructions nil
  54. tab-bar-close-button-show nil
  55. tab-bar-new-button-show nil
  56. tab-line-close-button-show nil
  57. tab-line-exclude-modes nil
  58. tab-line-new-button-show nil
  59. tab-width 4
  60. treesit-font-lock-level 2
  61. truncate-partial-width-windows 32
  62. use-dialog-box nil
  63. use-file-dialog nil
  64. use-short-answers t
  65. use-system-tooltips nil
  66. ;; vc-handled-backends nil
  67. visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow)
  68. whitespace-style '(face tabs trailing newline)
  69. word-wrap-by-category t)
  70. (load custom-file t)
  71. (set-face-attribute 'default nil :family "Monospace")
  72. (set-face-attribute 'fixed-pitch nil :family "Monospace")
  73. (set-face-attribute 'fixed-pitch-serif nil :family "Monospace")
  74. (set-face-attribute 'variable-pitch nil :family "Sans Serif")
  75. (electric-indent-mode 1)
  76. (electric-pair-mode 1)
  77. ;; (fido-vertical-mode 1)
  78. ;; (global-display-line-numbers-mode 1)
  79. (global-visual-line-mode 1)
  80. (global-whitespace-mode 1)
  81. (mouse-wheel-mode 1)
  82. (pixel-scroll-precision-mode 1)
  83. (recentf-mode 1)
  84. (xterm-mouse-mode 1)
  85. ;; (add-hook 'prog-mode-hook 'display-line-numbers-mode)
  86. ;; (define-key icomplete-minibuffer-map (kbd "TAB") 'icomplete-force-complete)
  87. ;; (define-key icomplete-minibuffer-map (kbd "C-h") 'icomplete-vertical-goto-first)
  88. ;; (define-key icomplete-minibuffer-map (kbd "C-j") 'icomplete-forward-completions)
  89. ;; (define-key icomplete-minibuffer-map (kbd "C-k") 'icomplete-backward-completions)
  90. ;; (define-key icomplete-minibuffer-map (kbd "C-l") 'icomplete-vertical-goto-last)
  91. (global-set-key (kbd "C-S-c") #'(lambda () (interactive)
  92. (let ((select-enable-clipboard t)) (kill-ring-save nil nil t))))
  93. (global-set-key (kbd "C-S-v") #'(lambda () (interactive)
  94. (let ((select-enable-clipboard t)) (yank))))
  95. (global-set-key (kbd "C-x C-b") #'(lambda () (interactive)
  96. (switch-to-buffer (other-buffer (current-buffer) 1))))
  97. (global-set-key (kbd "C-x j") 'kill-current-buffer)
  98. (global-set-key (kbd "C-<") 'bs-cycle-previous)
  99. (global-set-key (kbd "C->") 'bs-cycle-next)
  100. (global-set-key (kbd "<f7>") 'global-hl-line-mode)
  101. (global-set-key (kbd "<f8>") 'indent-tabs-mode)
  102. (global-set-key (kbd "<f9>") 'revert-buffer-with-coding-system)
  103. (defun insert-file-name (filename &optional args)
  104. ;; https://www.emacswiki.org/emacs/InsertFileName
  105. (interactive "*GInsert file name: \nP")
  106. (cond ((eq '- args) (insert (file-relative-name filename)))
  107. ((not (null args)) (insert (expand-file-name filename)))
  108. (t (insert filename))))
  109. (global-set-key (kbd "C-x M-i") 'insert-file-name)
  110. (require 'package)
  111. (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
  112. (package-initialize)
  113. (unless (package-installed-p 'use-package)
  114. (package-refresh-contents)
  115. (package-install 'use-package))
  116. (eval-when-compile
  117. (require 'use-package)
  118. (require 'use-package-ensure)
  119. (setq use-package-always-ensure t
  120. use-package-expand-minimally t))
  121. (use-package almost-mono-themes :demand t)
  122. (use-package circadian
  123. :init
  124. (setq
  125. circadian-themes
  126. '(("00:00" . almost-mono-black)
  127. ("04:00" . almost-mono-gray)
  128. ("08:00" . almost-mono-cream)
  129. ("12:00" . almost-mono-white)
  130. ("16:00" . almost-mono-cream)
  131. ("20:00" . almost-mono-gray)))
  132. :config (circadian-setup))
  133. (use-package evil
  134. :hook (after-init . evil-mode)
  135. :init
  136. (setq
  137. evil-move-beyond-eol t
  138. evil-search-module 'evil-search
  139. evil-undo-system 'undo-tree
  140. evil-want-keybinding nil
  141. evil-want-C-i-jump nil
  142. evil-want-C-u-scroll t))
  143. (use-package evil-collection :after evil
  144. :config (evil-collection-init))
  145. (use-package evil-easymotion :after evil
  146. :config (evilem-default-keybindings "SPC"))
  147. (use-package minions
  148. :hook (after-init . minions-mode)
  149. :init (setq minions-prominent-modes '(flymake-mode)))
  150. (use-package undo-tree
  151. :init (setq undo-tree-auto-save-history nil)
  152. :config (global-undo-tree-mode 1))
  153. (use-package consult
  154. :bind (("C-c M-x" . consult-mode-command)
  155. ("C-x b" . consult-buffer)
  156. ("C-x 4 b" . consult-buffer-other-window)
  157. ("C-x 5 b" . consult-buffer-other-frame)
  158. ("C-x r b" . consult-bookmark)
  159. ("C-x p b" . consult-project-buffer)
  160. ("M-g e" . consult-compile-error)
  161. ("M-g f" . consult-flymake)
  162. ("M-g g" . consult-goto-line)
  163. ("M-g i" . consult-imenu)
  164. ("M-g I" . consult-imenu-multi)
  165. ("M-g o" . consult-outline)
  166. ("M-s d" . consult-find)
  167. ("M-s f" . consult-fd)
  168. ("M-s g" . consult-grep)
  169. ("M-s G" . consult-git-grep)
  170. ("M-s r" . consult-ripgrep)
  171. ("M-s l" . consult-line)
  172. ("M-s L" . consult-line-multi)
  173. ("M-s k" . consult-keep-lines))
  174. :init (setq-default xref-show-xrefs-function #'consult-xref
  175. xref-show-definitions-function #'consult-xref)
  176. :config (consult-customize consult-buffer :preview-key "C-."))
  177. (use-package jinx
  178. :hook (text-mode . jinx-mode)
  179. :bind ([remap ispell-word] . jinx-correct)
  180. :init (setq-default jinx-languages "ru_RU en_GB en_US de_DE es_ES it_IT pl_PL")
  181. :config (add-to-list 'jinx-exclude-regexps '(t "[[:blank:]]*-[[:blank:]]*")))
  182. (use-package marginalia
  183. :hook (icomplete-minibuffer-setup . (lambda () (setq truncate-lines t)))
  184. :config (marginalia-mode 1))
  185. (use-package vertico :demand t
  186. :bind
  187. (:map vertico-map
  188. ("C-h" . vertico-first)
  189. ("C-j" . vertico-next)
  190. ("C-k" . vertico-previous)
  191. ("C-l" . vertico-last)
  192. ;; ("SPC" . minibuffer-complete-word)
  193. ("RET" . vertico-directory-enter)
  194. ("DEL" . vertico-directory-delete-char)
  195. ("M-DEL" . vertico-directory-delete-word))
  196. :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)
  197. :init
  198. (setq
  199. read-file-name-completion-ignore-case t
  200. read-buffer-completion-ignore-case t
  201. completion-ignore-case t)
  202. :config (vertico-mode 1))
  203. (setq-default
  204. auto-mode-alist
  205. (append
  206. '(("CMakeLists\\.txt\\'" . cmake-ts-mode)
  207. ("\\.cmake\\'" . cmake-ts-mode)
  208. ("Dockerfile\\'" . dockerfile-ts-mode)
  209. ("\\.go\\'" . go-ts-mode)
  210. ("/go\\.mod\\'" . go-mod-ts-mode)
  211. ;; ("\\.nix\\'" . nix-ts-mode)
  212. ("\\.rs\\'" . rust-ts-mode)
  213. ("\\.tsx\\'" . tsx-ts-mode)
  214. ("\\.ts\\'" . typescript-ts-mode)
  215. ("\\.y[a]?ml\\'" . yaml-ts-mode))
  216. auto-mode-alist)
  217. major-mode-remap-alist
  218. (append
  219. '((c-mode . c-ts-mode)
  220. (c++-mode . c++-ts-mode)
  221. (c-or-c++-mode . c-or-c++-ts-mode)
  222. (conf-toml-mode . toml-ts-mode)
  223. (csharp-mode . csharp-ts-mode)
  224. (css-mode . css-ts-mode)
  225. (java-mode . java-ts-mode)
  226. (js-mode . js-ts-mode)
  227. (js-json-mode . json-ts-mode)
  228. (python-mode . python-ts-mode)
  229. (ruby-mode . ruby-ts-mode)
  230. (sh-mode . bash-ts-mode))
  231. major-mode-remap-alist))
  232. (use-package haskell-mode :defer t
  233. :hook (haskell-mode . interactive-haskell-mode))
  234. (use-package markdown-mode :defer t)
  235. (use-package meson-mode :defer t)
  236. (use-package nix-mode :defer t)
  237. ;; (use-package nix-ts-mode :defer t)
  238. (use-package zig-mode :defer t)
  239. (use-package corfu
  240. :hook (eglot-managed-mode . corfu-mode)
  241. :init
  242. (setq
  243. corfu-auto t
  244. ;; corfu-auto-delay 0
  245. corfu-auto-prefix 2
  246. corfu-echo-delay 0
  247. corfu-popupinfo-delay 0)
  248. :config (corfu-echo-mode 1)
  249. (corfu-popupinfo-mode 1))
  250. (use-package eglot
  251. :after yasnippet
  252. :hook
  253. (c-mode . eglot-ensure)
  254. (c-ts-mode . eglot-ensure)
  255. (c++-mode . eglot-ensure)
  256. (c++-ts-mode . eglot-ensure)
  257. (c-or-c++-mode . eglot-ensure)
  258. (c-or-c++-ts-mode . eglot-ensure)
  259. (go-mode . eglot-ensure)
  260. (go-ts-mode . eglot-ensure)
  261. (haskell-mode . eglot-ensure)
  262. (nix-mode . eglot-ensure)
  263. (rust-mode . eglot-ensure)
  264. (rust-ts-mode . eglot-ensure)
  265. (zig-mode . eglot-ensure)
  266. :init
  267. (setq-default
  268. eglot-autoshutdown t
  269. eglot-confirm-server-initiated-edits nil
  270. read-process-output-max (* 1024 1024))
  271. (add-to-list 'completion-category-overrides '(eglot (styles flex)) t)
  272. :config
  273. (setq-default
  274. eglot-server-programs
  275. (append
  276. '(((nix-mode) . ("nil")))
  277. eglot-server-programs)))
  278. (use-package envrc
  279. :config (envrc-global-mode 1))
  280. (use-package yasnippet
  281. :hook (prog-mode . yas-minor-mode))
  282. (provide 'init)
  283. ;;; init.el ends here