-
Notifications
You must be signed in to change notification settings - Fork 1
/
про-код.el
315 lines (241 loc) · 12 KB
/
про-код.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
;;; про-код.el --- Конфигурация среды программирования -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
;; Файл `про-код.el` содержит конфигурацию для настройки среды программирования в Emacs. Он использует
;; пакетный менеджер `use-package` для организации конфигурации и управления различными модулями,
;; которые обеспечивают поддержку различных языков программирования и улучшение функциональности редактора.
(require 'загрузить)
(require 'use-package)
(require 'установить-из)
;;;; Синтаксис
;; Генератор инкрементальных парсеров tree sitter
;; - `treesit` — это модуль для работы с инкрементальными парсерами, который обеспечивает поддержку современных
;; языков программирования, облегчая анализ и обработку их синтаксиса.
(use-package treesit
:when (and (fboundp 'treesit-available-p)
(treesit-available-p))
:custom (major-mode-remap-alist
;; - `major-mode-remap-alist` устанавливает соответствие между стандартными режимами редактирования
;; и их версиями на базе `tree-sitter`.
'((c-mode . c-ts-mode)
(c++-mode . c++-ts-mode)
(cmake-mode . cmake-ts-mode)
(conf-toml-mode . toml-ts-mode)
(css-mode . css-ts-mode)
(js-mode . js-ts-mode)
(js-json-mode . json-ts-mode)
(python-mode . python-ts-mode)
(sh-mode . bash-ts-mode)
(typescript-mode . typescript-ts-mode)))
:config)
;;;; Cинтаксис для открытого файла
;; - `treesit-auto` автоматически добавляет режимы для поддержки различных языков, используя парсеры
;; `tree-sitter`, что позволяет значительно улучшить редакторский опыт.
(use-package treesit-auto
:ensure t
:functions (treesit-auto-add-to-auto-mode-alist global-treesit-auto-mode)
:custom
(treesit-auto-install 'prompt) ; Спрашивать при установке
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode))
;;;; Языковой сервер
;; Языковой сервер
;; - `eglot` — это языковой сервер, интегрированный в Emacs, который предоставляет функции автозавершения,
;; рефакторинга и проверки кода. Настройки клавиш позволяют быстро вызывать различные функции,
;; такие как переименование переменных и получение контекста кода.
(require 'jsonrpc)
(use-package eglot
:functions (eglot-rename eglot-code-actions)
:bind (:map eglot-mode-map
("C-c r" . eglot-rename)
("M-'" . eglot-inlay-hints-mode)
("C-<down-mouse-1>" . xref-find-definitions)
("M-." . xref-find-definitions)
("C-M-." . xref-find-references)
("C-S-<down-mouse-1>" . xref-find-references)
("C-c ." . eglot-code-actions))
:custom
(eglot-autoshutdown t)
(eglot-sync-connect 3)
(eglot-events-buffer-size '(:size 2000 :format full))
(eglot-send-changes-idle-time 0)
:config
;; Выключим лог, что увеличивает производительность
(fset #'jsonrpc--log-event #'ignore))
;;;; Подсказки поверх кода
(use-package coverlay :ensure t)
;;;; Скобки
;;;;; Подсвечивать все скобки
;; - Модуль `paren-face` добавляет подсветку скобок в коде, что помогает проще визуально отслеживать структуру кода.
(use-package paren-face
:ensure t
:if window-system
:functions (global-paren-face-mode)
:custom ((paren-face-regexp
"[][(){}]"))
:config (global-paren-face-mode t))
;;;;; Парные скобки
;; Прыгать между парными скобками
(defun forward-or-backward-sexp (&optional arg)
"Go to the matching parenthesis character if one is adjacent to point.
ARG - backward"
(interactive "^p")
(cond
((looking-at "\\s(") (forward-sexp arg))
((looking-back "\\s)" 1) (backward-sexp arg))
((looking-at "\\s)") (forward-char) (backward-sexp arg))
((looking-back "\\s(" 1) (backward-char) (forward-sexp arg))))
;;;;; Умные скобки
;; TODO: Возможно, заменить пакетом, основанным на tree-sitter ?
(use-package electric-pair
:hook
(after-init . electric-pair-mode)
(emacs-lisp . electric-pair-mode)
(minibuffer-setup . (lambda () (electric-pair-local-mode 0))))
;;;;; Подсветка глубины скобок
(defvar my/hl-paren-face)
(setq my/hl-paren-face (face-foreground 'default))
(use-package highlight-parentheses
:ensure t
:defines (global-highlight-parentheses-mode)
:custom ((hl-paren-colors
`("MediumOrchid2" "MediumAquamarine" "CornflowerBlue" ,my/hl-paren-face ,my/hl-paren-face ,my/hl-paren-face
,my/hl-paren-face ,my/hl-paren-face ,my/hl-paren-face))
(hl-paren-background-colors '(nil nil nil nil nil)))
:config (global-highlight-parentheses-mode t)
:init
(add-hook 'after-load-theme-hook
(lambda ()
(global-highlight-parentheses-mode -1)
(sleep-for 0 100)
(global-highlight-parentheses-mode t))))
;;;; Подсветка глубины идентации
(use-package highlight-indent-guides
:ensure t
:custom
(highlight-indent-guides-method 'character)
:hook
(css-base-mode . highlight-indent-guides-mode)
(python-mode . highlight-indent-guides-mode)
(yaml-ts-mode . highlight-indent-guides-mode))
;;;; Идентификаторы
;; - `color-identifiers-mode` подсвечивает идентификаторы в коде разными цветами, делая код более читабельным и упрощая процесс отладки.
(use-package color-identifiers-mode
:if window-system
:defines (color-identifiers:modes-alist color-identifiers:re-not-inside-class-access)
:ensure t
:hook ((typescript-ts-mode . color-identifiers-mode)
(js-ts-mode . color-identifiers-mode))
:custom ((color-identifiers-coloring-method
'hash)
(color-identifiers:num-colors 16)
(color-identifiers:color-luminance 0.3)
(color-identifiers:min-color-saturation 0.2)
(color-identifiers:max-color-saturation 0.7))
:config
(add-to-list
'color-identifiers:modes-alist
'(js-ts-mode "" "\\_<\\([a-zA-Z_$]\\(?:\\s_\\|\\sw\\)*\\)"
(nil font-lock-variable-name-face tree-sitter-hl-face:variable)))
)
;; Альтернативный алгоритм подсветки идентификаторов
(use-package rainbow-identifiers
:if window-system
:ensure t
:defer t
:hook ((emacs-lisp-mode . rainbow-identifiers-mode)))
;;;; Форматирование
;; - `format-all` автоматически форматирует код в различных языках, используя специфичные для них инструменты (например, `black` для Python). Это гарантирует, что код будет выглядеть аккуратно и эстетично.
(use-package format-all
:ensure t
:hook ((ess-r-mode . format-all-mode)
(python-mode . format-all-mode)
;; (emacs-lisp-mode . format-all-mode)
(format-all-mode-hook . format-all-ensure-formatter))
:config (custom-set-variables '(format-all-formatters (quote (("Python" black)
("R" styler))))))
;; Альтернативный форматтер
(use-package apheleia
:ensure t
:hook ((js-ts-mode . apheleia-mode)
(typescript-ts-mode . apheleia-mode))
:config)
;;;; Подсветка цветов
;; - `rainbow-mode` позволяет видеть цвета в коде CSS и HTML, что облегчает визуальный контроль за цветами, используемыми в приложении.
(use-package rainbow-mode
:ensure t
:hook (prog-mode))
;;;; Статическая проверка кода
;; - `flymake` отвечает за статическую проверку кода в режиме реального времени, подсказывая о возможных синтаксических ошибках.
(use-package flymake
:ensure t
:custom ((flymake-no-changes-timeout 0.01)
(elisp-flymake-byte-compile-load-path load-path))
:hook (emacs-lisp-mode . flymake-mode)
:bind (:map flymake-mode-map
("M-]" . flymake-goto-next-error)
("M-[" . flymake-goto-prev-error)
("M-\\" . flymake-show-buffer-diagnostics))
)
;;;; Дебаггер
;; - `dape` — это модуль для отладки, который предоставляет удобный интерфейс для запуска и отладки программ в Emacs.
(require 'projectile)
(use-package dape
:ensure t
:init
:defines (dape-buffer-window-arrangment dape-cwd-fn)
:config
(setq dape-buffer-window-arrangement 'gud)
(setq dape-key-prefix "C-.")
(add-hook 'dape-on-start-hooks
(defun dape--save-on-start ()
(save-some-buffers t t)))
(setq dape-cwd-fn (lambda (&optional skip-tramp-trim)
(let ((root (projectile-project-root)))
(if (and (not skip-tramp-trim) (tramp-tramp-file-p root))
(tramp-file-name-localname (tramp-dissect-file-name root))
root)))))
;;;; Конструктор регулярных выражений
;; Замечательный инструмент, позволяющий визуально контролировать создание поисковых выражений
(загрузить 're-builder)
;; Используем синтаксис string (так меньше экранировать спец. символы)
(setq reb-re-syntax 'read)
;;;; Свёртка кода
(use-package treesit-fold
:init (установить-из :repo "abougouffa/treesit-fold"))
;; (use-package treesit-fold-indicators
;; :init (установить-из :repo "emacs-tree-sitter/treesit-fold"))
(use-package origami
:ensure t
;;:hook ((json-ts-mode . origami-mode))
:bind
(:map origami-mode-map
("C-<tab>" . origami-recursively-toggle-node)
("C-TAB" . origami-recursively-toggle-node)
("C-S-<tab>" . origami-recursively-toggle-node)
("C-M-<tab>" . origami-toggle-all-nodes)))
;; (use-package yafolding
;; :ensure t
;; :hook
;; (prog-mode-hook . yafolding-mode)
;; :bind ("C-c C-f" . yafolding-toggle-element))
;;;; Zen-кодинг
(use-package emmet-mode
:ensure t
:hook ((web-mode tsx-ts-mode typescript-ts-mode) . emmet-mode)
:defines (emmet-indent-after-insert
emmet-indentation
emmet-expand-jsx-className?
emmet-move-cursor-between-quotes
emmet-self-closing-tag-style
emmet-jsx-major-modes)
:config
(setq emmet-indent-after-insert nil
emmet-indentation 2
emmet-expand-jsx-className? t
emmet-move-cursor-between-quotes t
emmet-self-closing-tag-style " /")
(add-to-list 'emmet-jsx-major-modes 'tsx-ts-mode))
(provide 'про-код)
;;; про-код.el ends here