Guest User

init.el

a guest
Dec 20th, 2025
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 34.86 KB | Software | 0 0
  1. ;;; init.el --- Emacs from scratch config -*- lexical-binding: t; -*-
  2. ;;; Commentary:
  3. ;;; Настройки Emacs для тех, кто не знает с чего начать.
  4.  
  5. ;;; Code:
  6.  
  7.  
  8. ;; Использовать клавиши y и n для подтверждения команд. По умолчанию
  9. ;; нужно ввести yes или no и нажать Enter.
  10. (defalias 'yes-or-no-p 'y-or-n-p)
  11.  
  12. ;; Укажите нужный размер шрифта, если этот слишком большой или
  13. ;; маленький.
  14. (defconst init-el-font-height 16 "Размер шрифта по умолчанию.")
  15.  
  16. ;; Некоторые настройки можно сделать с помощью `customize'. Чтобы не
  17. ;; замусоривать `init.el', будем хранить их в файле `custom.el`.
  18. (require 'custom)
  19. (customize-set-variable custom-file
  20.         (expand-file-name
  21.          (convert-standard-filename "custom.el")
  22.          user-emacs-directory))
  23.  
  24.  
  25. ;; Загрузим настройки, сделанные через `customize', сразу, чтобы они
  26. ;; не переопределяли параметры из `init.el'.
  27. (when (file-exists-p custom-file)
  28.   (load custom-file))
  29.  
  30.  
  31. (defun init-el-set-font-height ()
  32.   "Установка размера шрифта.
  33. Размер шрифта устанавливается в типографских пунктах, а значит, должен
  34. быть в 10 раз больше чем указано в `init-el-font-height'."
  35.   (set-face-attribute 'default nil :height (* init-el-font-height 10)))
  36.  
  37.  
  38. (defun init-el-set-font (font-family)
  39.   "Эта функция устанавливает семейство шрифтов FONT-FAMILY как основное.
  40. Настройки задаются в формате X Logical Font Description Conventions,
  41. XLFD: https://www.x.org/releases/X11R7.7/doc/xorg-docs/xlfd/xlfd.html"
  42.   (set-frame-font (format "-*-%s-normal-normal-normal-*-%d-*-*-*-m-0-iso10646-1"
  43.                           font-family
  44.                           init-el-font-height)
  45.                   nil ;; Не сохранять установленный ранее размер
  46.                   t   ;; Применить ко всем фреймам
  47.                   t)  ;; Игнорировать настройки, сделанные через `customize'
  48.   (set-face-attribute
  49.    'default ;; Font Face по умолчанию
  50.    nil      ;; Применить ко всем фреймам
  51.    ;; Атрибуты шрифта
  52.    :height (* init-el-font-height 10)
  53.    :family font-family))
  54.  
  55.  
  56. ;; Настройки, специфичные для графического режима
  57. (defun setup-gui-settings (&optional frame-name)
  58.   "Параметры шрифта во фрейме FRAME-NAME."
  59.   ;; Мы точно в GUI?
  60.   (when (display-graphic-p frame-name)
  61.     ;; Кешируем список семейств шрифтов
  62.     (let ((font-families (font-family-list)))
  63.       ;; Выбираем шрифт по умолчанию.
  64.       ;; Впишите на первое место своё любимое семейство шрифтов.
  65.       ;; Только убедитесь, что оно установлено в вашей системе.
  66.       (let ((preferred-font-family (cond ((member "Lilex" font-families) "Lilex")
  67.                                          ((member "SauceCodePro NFP" font-families) "SauceCodePro NFP")
  68.                                          ((member "FiraCode Nerd Font Mono" font-families) "FiraCode Nerd Font Mono")
  69.                                          ((member "Fira Code" font-families) "Fira Code")
  70.                                          ((member "DejaVu Sans Mono Nerd" font-families) "DejaVu Sans Mono Nerd")
  71.                                          ((member "DejaVu Sans Mono" font-families) "DejaVu Sans Mono")
  72.                                          ((member "Source Code Pro" font-families) "Source Code Pro")
  73.                                          ((member "Consolas" font-families) "Consolas")
  74.                                          ('t nil))))
  75.         ;; Шрифт по умолчанию доступен в системе?
  76.         (when preferred-font-family
  77.           (progn
  78.             (message (format "Семейство шрифтов по умолчанию: %s" preferred-font-family))
  79.             ;; Используем желаемый шрифт для оформления текста во всех
  80.             ;; буферах.
  81.             (init-el-set-font preferred-font-family)))))))
  82.  
  83. ;; Настройка шрифтов для обычного режима
  84. (add-hook 'after-init-hook (lambda ()(setup-gui-settings (selected-frame))))
  85.  
  86. ;; Настройка шрифтов при работе в режиме сервера
  87. (add-hook 'server-after-make-frame-hook (lambda ()(setup-gui-settings (selected-frame))))
  88.  
  89. ;; Настройка шрифтов в новых фреймах в любом режиме
  90. (add-to-list 'after-make-frame-functions 'setup-gui-settings)
  91.  
  92. ;; Отображать шрифты красиво, используя Font Face's
  93. (global-font-lock-mode t)
  94.  
  95.  
  96. ;; Определение пути к кЧто-то в названии вызвало вьетнамских флешбеки аталогу с исходным кодом
  97. ;; Исходный код может понадобиться для просмотра документации
  98. ;; некоторых функций и переменных.
  99. ;; Впрочем, это не обязательно.
  100. (when (string-equal system-type "gnu/linux")
  101.   (message "Используется ОС на базе GNU/Linux")
  102.   (defvar init-el-emacs-source-path "Путь к каталогу с исходным кодом Emacs")
  103.   (setq init-el-emacs-source-path
  104.         (format "/usr/share/emacs/%d.%d/src/"
  105.                 emacs-major-version
  106.                 emacs-minor-version))
  107.   (if (file-exists-p init-el-emacs-source-path)
  108.       ;; Каталог существует
  109.       (if (directory-empty-p init-el-emacs-source-path)
  110.           ;; Каталог пуст
  111.           (message (format "Каталог %s пуст." init-el-emacs-source-path))
  112.         ;; Каталог не пуст
  113.         (progn
  114.           (customize-set-variable source-directory init-el-emacs-source-path)
  115.           (message (format "Исходный код обнаружен в каталоге %s" init-el-emacs-source-path))))
  116.     ;; Каталог не существует
  117.     (message (format "Каталог %s не существует." init-el-emacs-source-path))))
  118.  
  119. (customize-set-variable
  120.  completion-ignore-case t ;; Игнорировать регистр при автодополнении
  121.  create-lockfiles nil ;; Не создавать lock-файлы
  122.  cursor-in-non-selected-windows nil ;; Отключить курсор в неактивных окнах
  123.  cursor-type 'bar ;; Курсор в виде вертикальной черты
  124.  default-input-method "russian-computer" ;; Метод ввода по умолчанию
  125.  default-transient-input-method "russian-computer" ;; Временный метод ввода
  126.  delete-by-moving-to-trash t ;; Удалять файлы в Корзину
  127.  gc-cons-threshold (* 2 gc-cons-threshold) ;; Увеличить размер памяти для сборщика мусора
  128.  highlight-nonselected-windows nil ;; Не подсвечивать неактивные окна
  129.  inhibit-compacting-font-caches t ;; Не сжимать шрифты в памяти
  130.  inhibit-startup-screen t ;; Не показывать приветственный экран
  131.  initial-scratch-message nil ;; Пустой буфер *scratch*
  132.  load-prefer-newer t ;; Если есть файл elc, но el новее, загрузить el-файл.
  133.  major-mode 'text-mode ;; Текстовый режим для новых буферов по умолчанию.
  134.  read-answer-short t ;; Быстрый ввод ответов на вопросы (не аналог yes-or-no-p
  135.  read-file-name-completion-ignore-case t ;; Игнорировать регистр при вводе имён файлов
  136.  read-process-output-max (* 1024 1024) ;; Увеличим чанк чтения для LSP: по умолчанию 65535
  137.  redisplay-skip-fontification-on-input t ;; Не обновлять буфер, если происходит ввод
  138.  ring-bell-function 'ignore ;; Отключить звуковое сопровождение событий
  139.  show-trailing-whitespace t ;; Подсветка висячих пробелов
  140.  standard-indent 4 ;; Отступ по умолчанию — 4 пробела
  141.  tab-always-indent 'complete ;; Если можно — выровнять текст, иначе — автодополнение.
  142.  use-dialog-box nil ;; Диалоговые окна ОС не нужны
  143.  use-short-answers t ;; Краткие ответы вместо длинных
  144.  user-full-name "TODO: вписать своё имя" ;; Имя пользователя
  145.  user-mail-address "TODO: вписать свой email" ;; Адрес электронной почты
  146.  vc-follow-symlinks t ;; Переходить по ссылкам без лишних вопросов
  147.  visible-bell t) ;; Мигать буфером при переходе в него
  148.  
  149.  
  150. (defun init-kill-scratch ()
  151.   "Закрыть буфер *scratch* при запуске редактора или подключении клиента."
  152.   (when (get-buffer "*scratch*")
  153.     (kill-buffer "*scratch*")))
  154. ;; Закрываем буфер *scratch* при инициализации в обычном режиме
  155. (add-hook 'after-init-hook 'init-kill-scratch)
  156. ;; Закрываем буфер *scratch* при подключении к серверу Emacs
  157. (add-hook 'server-after-make-frame-hook 'init-kill-scratch)
  158.  
  159. (when (fboundp 'menu-bar-mode)
  160.   (customize-set-variable menu-bar-mode nil)) ;; Выключить отображение меню
  161.  
  162. (when (fboundp 'scroll-bar-mode)
  163.   (customize-set-variable scroll-bar-mode nil)) ;; Отключить полосы прокрутки
  164.  
  165. (when (fboundp 'tool-bar-mode)
  166.   (customize-set-variable tool-bar-mode nil)) ;; Выключить отображение панели инструментов
  167.  
  168. (when (fboundp 'tooltip-mode)
  169.   (tooltip-mode nil)) ;; Отключить вывод всплывающих подсказок в GUI
  170.  
  171.  
  172. ;; Отключим некоторые привязки клавиш по умолчанию
  173. (require 'keymap)
  174. (keymap-global-unset "M-,")     ;; Такие маркеры не нужны
  175. (keymap-global-unset "C-z")     ;; Такой Ctrl+Z нам не нужен
  176. (keymap-global-unset "C-x C-z") ;; `suspend-emacs' тоже не нужен
  177. (keymap-global-unset "C-x C-p") ;; `mark-page' не нужна, часто конфликтует с Projectile
  178.  
  179. ;; Включим переключение буферов по Ctrl+PgUp и Ctrl+PgDn
  180. (keymap-global-unset "C-<next>")  ;; Ни разу не видел, что это было нужно
  181. (keymap-global-unset "C-<prior>") ;; Это сочетание тоже не нужно.
  182. (keymap-global-set "C-<next>" 'next-buffer)
  183. (keymap-global-set "C-<prior>" 'previous-buffer)
  184.  
  185. ;; Закрыть буфер по нажатию [C-x k]
  186. (keymap-global-set "C-x k" (lambda() (interactive) (kill-buffer (current-buffer))))
  187.  
  188.  
  189. ;; 📦 PACKAGE
  190. ;; Этот встроенный пакет отвечает за управление другими пакетами.
  191. (require 'package)
  192. (add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t)
  193. (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
  194. (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
  195. (add-to-list 'package-archives '("nongnu" . "https://elpa.nongnu.org/nongnu/") t)
  196. (package-initialize)
  197.  
  198. (customize-set-variable package-archive-priorities
  199.         '(("gnu" . 40)
  200.           ("nongnu" . 30)
  201.           ("melpa-stable" . 20)
  202.           ("melpa" . 10)))
  203.  
  204. (defun init-el-check-archive-contents ()
  205.   "Проверим состояние кеша пакетов. Если его нет, то обновим его."
  206.   (unless package-archive-contents
  207.     (package-refresh-contents)))
  208.  
  209. (init-el-check-archive-contents)
  210.  
  211. ;; Этот пакет решает проблему проверки цифровых подписей пакетов.
  212. (unless (package-installed-p 'gnu-elpa-keyring-update)
  213.   (progn
  214.     (message "Обновление ключей для проверки цифровой подписи.")
  215.     (package-install 'gnu-elpa-keyring-update t)))
  216.  
  217. ;; Пакет `use-package' должен быть установлен, но на всякий случай
  218. ;; проверим
  219. (unless (package-installed-p 'use-package)
  220.   (package-install 'use-package t))
  221.  
  222. (require 'use-package)
  223.  
  224.  
  225. ;; 📦 ANSI-COLOR
  226. ;; Этот пакет отвечает за вывод текста в некоторых информационных
  227. ;; буферах.
  228. (use-package ansi-color
  229.   :custom
  230.   (ansi-color-for-compilation-mode t "Расцветка буфера *compile*")
  231.   :hook
  232.   (compilation-filter . ansi-color-compilation-filter))
  233.  
  234.  
  235. ;; 📦 AUTOREVERT
  236. ;; Встроенный пакет.
  237. ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Revert.html
  238. ;; Автоматическое обновление буферов.
  239. ;; По умолчанию `global-auto-revert-mode' работает только с файловыми
  240. ;; буферами, но мы заставим его обновлять и содержимое буферов Dired.
  241. (use-package autorevert
  242.   :custom
  243.   (auto-revert-check-vc-info t "Автоматически обновлять статусную строку")
  244.   (global-auto-revert-non-file-buffers t "Автообновление не только файловых буферов.")
  245.   :config
  246.   (global-auto-revert-mode t)
  247.   :hook
  248.   (dired-mode . auto-revert-mode))
  249.  
  250.  
  251. ;; 📦 CALENDAR
  252. ;; Пакет для работы с календарём.
  253. (use-package calendar
  254.   :custom
  255.   (calendar-week-start-day 1 "Начнём неделю с понедельника"))
  256.  
  257.  
  258. ;; 📦 COMPILE
  259. ;; Этот пакет отвечает за содержимое буфера *compilation*.
  260. (use-package compile
  261.   :custom
  262.   (compilation-scroll-output t "Включим автопрокрутку текста"))
  263.  
  264.  
  265. ;; 📦 CONF-MODE
  266. ;; Пакет для редактирования конфигурационных файлов INI/CONF.
  267. (use-package conf-mode
  268.   :mode
  269.   ("\\.env\\'"
  270.    "\\.flake8\\'"
  271.    "\\.pylintrc\\'"))
  272.  
  273.  
  274. ;; 📦 CUSTOM
  275. ;; Пакет для управления настройками.
  276. (use-package custom
  277.   :custom
  278.   (custom-safe-themes t "Все темы считаем безопасными"))
  279.  
  280.  
  281. ;; 📦 DELSEL
  282. ;; Пакет для управления выделенным текстом (регионами).
  283. ;; По умолчанию Emacs не удаляет выделенный текст при вводе нового
  284. ;; текста, а при нажатиях клавиш Del и BackSpace удаляет только один
  285. ;; знак. Но мы это исправим.
  286. (use-package delsel
  287.   :config
  288.   (delete-selection-mode t)) ;; Удалять ВЕСЬ выделенный фрагмент
  289.  
  290.  
  291. ;; 📦 DESKTOP
  292. ;; Сохранение состояния Emacs между сессиями.
  293. ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Saving-Emacs-Sessions.html
  294. (use-package desktop
  295.   :custom
  296.   (desktop-dirname user-emacs-directory "Каталог для хранения файла .desktop")
  297.   (desktop-load-locked-desktop t "Загрузка файла .desktop даже если он заблокирован")
  298.   (desktop-restore-frames t "Восстанавливать фреймы")
  299.   (desktop-save t "Сохранять список открытых буферов, файлов и т. д. без лишних вопросов")
  300.   :config
  301.   (desktop-save-mode t)
  302.   ;; Сохраняем рабочий стол при закрытии фрейма
  303.   (add-to-list 'delete-frame-functions 'desktop-save)
  304.   ;; Не сохраняем буферы Dired
  305.   (add-to-list 'desktop-modes-not-to-save 'dired-mode)
  306.   :hook
  307.   ;; Загружаем состояние при запуске в обычном режиме
  308.   (after-init . desktop-read)
  309.   ;; Загружаем состояние при запуске в режиме сервера
  310.   (server-after-make-frame . desktop-read)
  311.   ;; Сохраняем настройки при завершении работы
  312.   (kill-emacs . (lambda () (desktop-save user-emacs-directory t)))
  313.   (server-done . desktop-save))
  314.  
  315.  
  316. ;; 📦 DIRED
  317. ;; Файловый менеджер
  318. (use-package dired
  319.   :custom
  320.   (dired-free-space 'separate "Информация о занятом и свободном месте в отдельной строке")
  321.   (dired-kill-when-opening-new-dired-buffer t "Удалять буфер при переходе в другой каталог")
  322.   ;; Дополнительные параметры вызова утилиты ls.
  323.   (dired-listing-switches "-l --human-readable --all --group-directories-first --dired")
  324.   (dired-recursive-deletes 'always "Не задавать лишних вопросов при удалении не-пустых каталогов")
  325.   :init
  326.   ;; По умолчанию будем показывать только имена. Чтобы увидеть всё,
  327.   ;; нажмите [C-(]
  328.   (add-hook 'dired-mode-hook 'dired-hide-details-mode))
  329.  
  330.  
  331. ;; 📦 DISPLAY-LINE-NUMBERS-MODE
  332. ;; Отображение номеров строк.
  333. (use-package display-line-numbers
  334.   :hook
  335.   ((c-mode
  336.     conf-mode
  337.     emacs-lisp-mode
  338.     html-mode) . display-line-numbers-mode))
  339.  
  340.  
  341. ;; 📦 ELECTRIC-INDENT MODE
  342. ;; Автоматическая вставка отступов при переходе на новую строку.
  343. ;; Добавляйте режимы осторожно.
  344. (use-package electric
  345.   :hook
  346.   ((emacs-lisp-mode) . electric-indent-local-mode))
  347.  
  348.  
  349. ;; 📦 ELEC-PAIR MODE
  350. ;; Автоматически вставляет при вводе одной скобки или кавычки парную
  351. ;; ей. Если выделен регион, то в скобки обрамляется он.
  352. (use-package elec-pair
  353.   :config
  354.   ;; Локализуем список парных символов
  355.   (add-to-list 'electric-pair-pairs '(?\( . ?\))) ;; ()
  356.   (add-to-list 'electric-pair-pairs '(?\[ . ?\])) ;; []
  357.   (add-to-list 'electric-pair-pairs '(?{ . ?}))   ;; {}
  358.   (add-to-list 'electric-pair-pairs '(?« . ?»))   ;; «»
  359.   (add-to-list 'electric-pair-pairs '(?‘ . ’?))   ;; ‘’
  360.   (add-to-list 'electric-pair-pairs '(?‚ . ‘?))   ;; ‚‘
  361.   (add-to-list 'electric-pair-pairs '(?“ . ”?))   ;; “”)
  362.   :hook
  363.   ((conf-mode
  364.     emacs-lisp-data-mode
  365.     emacs-lisp-mode
  366.     lisp-data-mode
  367.     nxml-mode
  368.     org-mode
  369.     ruby-mode
  370.     tex-mode) . electric-pair-local-mode))
  371.  
  372.  
  373. ;; 📦 FACE-REMAP
  374. ;; Настройки отображения шрифтов в графическом режиме.
  375. (use-package face-remap
  376.   :custom
  377.   ;; Изменим шаг увеличения масштаба: будем добавлять или убирать по
  378.   ;; 10%. По умолчанию — 20.
  379.   (setq text-scale-mode-step 1.1 "Шаг увеличения масштаба"))
  380.  
  381.  
  382. ;; 📦 FILES
  383. ;; Это встроенный пакет для управления файлами
  384. (use-package files
  385.   :custom
  386.   (delete-old-versions t "Удалять старые резервные копии файлов без лишних вопросов")
  387.   (enable-local-eval t "Разрешить вызов `eval' в `.dir-locals.el'")
  388.   (enable-local-variables :all "Считать все переменные из файлов `.dir-locals.el' безопасными")
  389.   (large-file-warning-threshold (* 100 1024 1024) "Предупреждение при открытии файлов больше 100 МБ (по умолчанию — 10 МБ)")
  390.   (make-backup-files nil "Резервные копии не нужны, у нас есть Git")
  391.   (require-final-newline t "Требовать новую строку в конце файлов")
  392.   (save-abbrevs 'silently "Сохранять аббревиатуры без лишних вопросов"))
  393.  
  394.  
  395. ;; 📦 FILL-COLUMN
  396. ;; Отображение рекомендуемой границы символов.
  397. (use-package display-fill-column-indicator
  398.   :hook
  399.   ((emacs-lisp-mode) . display-fill-column-indicator-mode))
  400.  
  401.  
  402. ;; 📦 FLYMAKE
  403. ;; Встроенный пакет для работы со статическими анализаторами.
  404. (use-package flymake
  405.   :bind (:map emacs-lisp-mode-map
  406.               ;; Перейти к следующей ошибке
  407.               ("M-n" . flymake-goto-next-error)
  408.               ;; Перейти к предыдущей ошибке
  409.               ("M-p" . flymake-goto-prev-error))
  410.   :hook ((emacs-mode
  411.           wisent-grammar-mode) . flymake-mode))
  412.  
  413.  
  414. ;; 📦 FLYSPELL-MODE
  415. ;; Встроенный пакет.
  416. ;; Проверка орфографии с помощью словарей.
  417. ;; Использовать пакет только в том случае, когда дело происходит в
  418. ;; Linux и Hunspell, Aspell и Nuspell доступны.
  419. (when (string-equal system-type "gnu/linux")
  420.   (use-package flyspell
  421.     :custom
  422.     ;; Выбираем желаемую утилиту для проверки орфографии
  423.     (ispell-program-name (cond ((file-executable-p "/usr/bin/hunspell") "hunspell")
  424.                                ((file-executable-p "/usr/bin/aspell") "aspell")
  425.                                ((file-executable-p "/usr/bin/nuspell") "nuspell")
  426.                                ;; Ничего не установлено
  427.                                (t nil)))
  428.     :hook
  429.     ((text-mode . flyspell-mode)
  430.      (emacs-lisp-mode . flyspell-prog-mode))))
  431.  
  432.  
  433. ;; 📦 FRAME
  434. ;; Встроенный пакет.
  435. ;; Управление фреймами.
  436. (use-package frame
  437.   :custom
  438.   (window-divider-default-places 't "Разделители окон со всех сторон (по умолчанию только справа)")
  439.   (window-divider-default-right-width 3  "Ширина в пикселях для линии-разделителя окон")
  440.   (frame-resize-pixelwise t "Размер фреймов изменять по пикселям а не по символам")
  441.   :bind
  442.   (:map global-map
  443.         ("C-x O" . previous-window-any-frame) ;; Перейти в предыдущее окно
  444.         ;; Перейти в следующее окно
  445.         ("C-x o" . next-window-any-frame)
  446.         ("M-o" . next-window-any-frame)))
  447.  
  448.  
  449. ;; 📦 GOTO-ADDRESS-MODE
  450. ;; Подсвечивает ссылки и позволяет переходить по ним с помощью [C-c RET].
  451. ;; Возможны варианты (зависит от основного режима).
  452. (use-package goto-addr
  453.   :hook
  454.   ((emacs-lisp-mode
  455.     html-mode
  456.     rst-mode) . goto-address-mode))
  457.  
  458.  
  459. ;; 📦 IBUFFER
  460. ;; Встроенный пакет для удобной работы с буферами.
  461. ;; По нажатию F2 выводит список открытых буферов.
  462. (use-package ibuffer
  463.   :custom
  464.   (ibuffer-formats '((mark      ;; Отметка
  465.                       modified  ;; Буфер изменён?
  466.                       read-only ;; Только чтение?
  467.                       locked    ;; Заблокирован?
  468.                       " "
  469.                       (name 35 45 :left :elide) ;; Имя буфера: от 30 до 40 знаков
  470.                       " "
  471.                       (mode 8 -1 :left)         ;; Активный режим: от 8 знаков по умолчанию, при необходимости увеличить
  472.                       " "
  473.                       filename-and-process)     ;; Имя файла и процесс
  474.                      ;; Сокращённый формат
  475.                      (mark      ;; Отметка?
  476.                       " "
  477.                       (name 35 -1) ;; Имя буфера: 32 знака, при необходимости — расширить на сколько нужно
  478.                       " "
  479.                       filename)))  ;; Имя файла
  480.   (ibuffer-default-sorting-mode 'filename/process "Сортировать файлы по имени / процессу")
  481.   (ibuffer-display-summary nil "Не показывать строку ИТОГО")
  482.   (ibuffer-eliding-string "…" "Если строка не уместилась, показать этот символ")
  483.   (ibuffer-expert t "Не запрашивать подтверждение для опасных операций")
  484.   (ibuffer-shrink-to-minimum-size t "Минимальный размер буфера по умолчанию")
  485.   (ibuffer-truncate-lines nil "Не обкусывать длинные строки")
  486.   (ibuffer-use-other-window t "Открывать буфер *Ibuffer* в отдельном окне")
  487.   :init
  488.   ;; Теперь при нажатии [C-x C-b] будет не просто список буферов, а
  489.   ;; IBuffer.
  490.   (defalias 'list-buffers 'ibuffer "Замена стандартной функции на ibuffer."))
  491.  
  492.  
  493. ;; 📦 ICOMPLETE
  494. ;; Встроенное автодополнение в минибуфере
  495. (use-package icomplete
  496.   :config (icomplete-vertical-mode t))
  497.  
  498.  
  499. ;; 📦 MINIBUFFER
  500. ;; Встроенный пакет для управления поведением минибуфера.
  501. (use-package minibuffer
  502.   :custom
  503.   (completions-detailed t "Подробные подсказки в минибуфере"))
  504.  
  505.  
  506. ;; 📦 PAREN
  507. ;; Управление парными скобками.
  508. (use-package paren
  509.   :config
  510.   (show-paren-mode t)) ;; Подсвечивать парные скобки
  511.  
  512.  
  513. ;; 📦 PIXEL-SCROLL
  514. ;; Плавная прокрутка текста. Доступна не везде.
  515. (when (package-installed-p 'pixel-scroll)
  516.   (use-package pixel-scroll
  517.     :config
  518.     (pixel-scroll-mode t)
  519.     (pixel-scroll-precision-mode)))
  520.  
  521.  
  522. ;; 📦 RECENTF-MODE
  523. ;; Запоминание списка последних открытых файлов.
  524. (use-package recentf
  525.   :custom
  526.   (recentf-max-saved-items 100 "Помнить последние 100 файлов")
  527.   (recentf-save-file (locate-user-emacs-file "recentf") "Хранить список в файле .emacs.d/recentf")
  528.   :config (recentf-mode t))
  529.  
  530.  
  531. ;; 📦 REPEAT-MODE
  532. ;; Этот пакет упрощает ввод некоторых команд.
  533. (use-package repeat
  534.   :config
  535.   (repeat-mode t)
  536.   :hook
  537.   (text-mode . repeat-mode))
  538.  
  539.  
  540. ;; 📦 RST-MODE
  541. ;; Встроенный пакет для редактирования reStructutedText
  542. ;; https://www.writethedocs.org/guide/writing/reStructuredText/
  543. (use-package rst
  544.   :custom
  545.   (rst-default-indent 3)
  546.   (rst-indent-comment 3)
  547.   (rst-indent-field 3)
  548.   (rst-indent-literal-minimized 3)
  549.   (rst-indent-width 3)
  550.   ;; На сайте docutils написано, что правильно вот так:
  551.   (rst-preferred-adornments '((?# over-and-under 1)
  552.                               (?* over-and-under 1)
  553.                               (?= simple 0)
  554.                               (?- simple 0)
  555.                               (?^ simple 0)
  556.                               (?\" simple 0)))
  557.  (rst-toc-indent 3))
  558.  
  559.  
  560. ;; 📦 RUBY-TS-MODE
  561. ;; Встроенный пакет для работы с Ruby.
  562. (use-package ruby-ts-mode
  563.  :mode
  564.  ("\\.rb\\'"
  565.   "Vagrantfile\\'"))
  566.  
  567.  
  568. ;; 📦 RUST-MODE
  569. ;; https://github.com/rust-lang/rust-mode
  570. ;; Поддержка языка Rust: https://rust-lang.org/
  571. (use-package rust-mode
  572.  :mode ("\\.rs\\'" . rust-mode)
  573.  :custom
  574.  (rust-format-on-save t "Автоматическое форматирование буфера при сохранении.")
  575.  :config
  576.  (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil))))
  577.  
  578.  
  579. ;; 📦 SAVEPLACE
  580. ;; Встроенный пакет.
  581. ;; Запоминание позиции курсора в посещённых файлах.
  582. (use-package saveplace
  583.  :custom
  584.  (save-place-forget-unreadable-files t "Не запоминать положение в нечитаемых файлах.")
  585.  :config
  586.  (save-place-mode t))
  587.  
  588.  
  589. ;; 📦 SAVEHIST
  590. ;; Встроенный пакет для запоминания истории команд
  591. (use-package savehist
  592.  :hook
  593.  (server-done . savehist-save)
  594.  (kill-emacs . savehist-save)
  595.  :config
  596.  (add-to-list 'delete-frame-functions 'savehist-save)
  597.  (savehist-mode t))
  598.  
  599.  
  600. ;; 📦 SHELL-SCRIPT-MODE
  601. ;; Пакет для работы со скриптами Shell.
  602. (use-package sh-script
  603.  :mode
  604.  ("\\.bash_aliases\\'" . sh-mode)
  605.  ("\\.bashrc\\'" . sh-mode)
  606.  ("\\.envrc\\'" . sh-mode)
  607.  ("\\.profile\\'" . sh-mode)
  608.  ("\\.sh\\'" . sh-mode))
  609.  
  610.  
  611. ;; 📦 SHELL-MODE
  612. ;; Оболочка командной строки внутри Emacs
  613. (use-package shell
  614.  :custom
  615.  (shell-kill-buffer-on-exit t "Закрыть буфер, если работа завершена."))
  616.  
  617.  
  618. ;; 📦 SIMPLE
  619. ;; Разные настройки управления элементарным редактированием текста.
  620. (use-package simple
  621.  :custom
  622.  (backward-delete-char-untabify-method 'hungry "Удалять все символы выравнивания при нажатии [Backspace]")
  623.  (blink-matching-paren t "Мигать, когда скобки парные")
  624.  (indent-tabs-mode nil "Отключить `indent-tabs-mode'.")
  625.  (kill-do-not-save-duplicates t "Не добавлять строку в kill-ring, если там уже есть такая же")
  626.  (save-interprogram-paste-before-kill t "Сохранять данные в kill ring перед попаданием нового фрагмента")
  627.  (size-indication-mode nil "Не показывать размера буфера в mode-line")
  628.  (suggest-key-bindings t "Показывать подсказку клавиатурной комбинации для команды")
  629.  :config
  630.  (keymap-global-unset "<insert>" t) ;; Режим перезаписи не нужен
  631.  (disable-command 'overwrite-mode)
  632.  :bind
  633.  (:map global-map
  634.        ("C-z" . undo)) ;; Отмена на Ctrl+Z
  635.  :hook
  636.  (compilation-mode . visual-line-mode)
  637.  (markdown-mode . visual-line-mode)
  638.  (messages-buffer-mode . visual-line-mode)
  639.  (text-mode . visual-line-mode))
  640.  
  641.  
  642. ;; 📦 UNIQUIFY
  643. ;; Встроенный пакет.
  644. ;; Используется для поддержания уникальности названий буферов, путей и т. д.
  645. (use-package uniquify
  646.  :custom
  647.  (uniquify-buffer-name-style 'forward "Показывать каталог перед именем файла, если буферы одинаковые (по умолчанию имя<каталог>)")
  648.  (uniquify-separator "/" "Разделять буферы с похожими именами, используя /"))
  649.  
  650.  
  651. ;; 📦 WHITESPACE MODE
  652. ;; Отображение невидимых символов.
  653. ;; Выключите или закомментируйте, если не используете.
  654. (use-package whitespace
  655.  :custom
  656.  (whitespace-display-mappings ;; Отображение нечитаемых символов
  657.   '((space-mark   ?\   [?\xB7]     [?.])        ;; Пробел
  658.     (space-mark   ?\xA0 [?\xA4]     [?_])        ;; Неразрывный пробел
  659.     (newline-mark ?\n   [?¶ ?\n]    [?$ ?\n])    ;; Конец строки
  660.     (tab-mark     ?\t   [?\xBB ?\t] [?\\ ?\t]))) ;; TAB
  661.  (whitespace-line-column 1000 "По умолчанию подсвечиваются длинные строки. Не надо этого делать.")
  662.  :hook
  663.  ((emacs-lisp-mode
  664.    sh-mode
  665.    sql-mode
  666.    tex-mode) . whitespace-mode))
  667.  
  668.  
  669. ;; 📦 WHICH-KEY MODE
  670. ;; https://elpa.gnu.org/packages/which-key.html
  671. ;; Показывает подсказки к сочетаниям клавиш.
  672. (use-package which-key
  673.  :ensure t ;; В новых версиях Emacs этот пакет встроенный
  674.  :custom
  675.  (which-key-compute-remaps t "Выводить актуальные сочетания клавиш, а не «как должно быть»")
  676.  (which-key-dont-use-unicode nil "Используем Unicode")
  677.  (which-key-idle-delay 2 "Задержка появления подсказки")
  678.  (which-key-idle-secondary-delay 0.05 "Ещё одна задержка появления подсказки")
  679.  (which-key-lighter nil "Справимся и так, не надо ничего показывать в строке статуса.")
  680.  (which-key-separator " → " "Разделитель сочетаний и команд")
  681.  (which-key-show-major-mode t "То же самое что и [C-h m], но в формате which-key")
  682.  :config
  683.  (which-key-mode t))
  684.  
  685.  
  686. ;; 📦 WINDMOVE
  687. ;; Перемещение между окнами Emacs.
  688. ;;
  689. ;; Ctrl + → — окно справа от текущего
  690. ;; Ctrl + ← — окно слева от текущего
  691. ;; Ctrl + ↓ — окно снизу от текущего
  692. ;; Ctrl + ↑ — окно сверху от текущего
  693. (use-package windmove
  694.  :config
  695.  (windmove-default-keybindings 'ctrl)
  696.  (windmove-swap-states-default-keybindings 'meta)
  697.  (windmove-mode t))
  698.  
  699.  
  700. ;; 📦 WINDOW
  701. ;;
  702. ;; Переключение между буферами как между вкладками в браузере:
  703. ;;
  704. ;; Ctrl + TAB         — предыдущий буфер
  705. ;; Ctrl + Shift + Tab — следующий буфер
  706. (use-package window
  707.  :custom
  708.  (window-resize-pixelwise t "Делить окна по пикселям, а не по символам.")
  709.  :bind
  710.  (:map global-map
  711.        ("C-S-<iso-lefttab>" . next-buffer)
  712.        ("C-<tab>" . previous-buffer)))
  713.  
  714.  
  715. ;; 📦 XML
  716. ;; Встроенный пакет для работы с диалектами XML
  717. (use-package xml
  718.  :custom
  719.  (nxml-attribute-indent 4 "Выравнивание атрибутов")
  720.  (nxml-auto-insert-xml-declaration-flag nil "Не вставлять декларацию")
  721.  (nxml-bind-meta-tab-to-complete-flag t "Использовать TAB для завершения ввода")
  722.  (nxml-child-indent 4 "Выравнивание дочерних элементов")
  723.  (nxml-slash-auto-complete-flag t "Закрывать теги по вводу /")
  724.  :mode
  725.  ("\\.pom\\'"
  726.   "\\.xml\\'"))
  727.  
  728. (load-theme 'deeper-blue)
  729.  
  730. (provide 'init.el)
  731. ;;; init.el ends here
  732. (put 'overwrite-mode 'disabled t)
  733.  
Tags: emacs
Advertisement
Add Comment
Please, Sign In to add comment