Skip to content

Latest commit

 

History

History
2276 lines (1638 loc) · 92.5 KB

myconfig.org

File metadata and controls

2276 lines (1638 loc) · 92.5 KB

GNU Emacs Configuration

Table of Contents

About

;;; init.el --- Initialisation file for GNU Emacs

;; Copyright © 2020-2023 Egor Tolbaev <egor05.09.97@gmail.com>

;; Author: Egor Tolbaev <egor05.09.97@gmail.com>
;; URL: https://github.com/EgorTolbaev/.emacs.d
;; Keywords: emacs, init, init.el, dotfiles

;; This file is NOT part of GNU Emacs.

;;; Commentary:
;;
;; I decided to create my own GNU Emacs configuration
;; to simplify my daily life by adding scripts and useful features.
;; This configuration does not claim to be ideal and is in constant development, but it is fully operational.
;; This file is generated based on myconfig.org

;;; Code:

Я решил создать свою собственную конфигурацию GNU Emacs, что бы упростить мою повседневную жизнь, добавив сценарии и полезные функции.

Для управления конфигурациями пакетов я использую пакет use-package от John Wiegley.

Этот файл генерирует init.el который будет загружен GNU Emacs при запуске.

Startup Performance

Ускорьте запуск, уменьшив частоту сборки мусора.

(setq gc-cons-threshold (* 50 1000 1000))

Переменные ОС

Некоторые части конфигурации отличаются в зависимости от системы, поэтому я определил функции для дальнейшего использования.

(defun system-is-linux()
  (string-equal system-type "gnu/linux"))
(defun system-is-windows()
  (string-equal system-type "windows-nt"))

Package System Setup

use-package - упрощает установку пакетов.

(require 'package)

(setq package-archives '(("melpa" . "https://melpa.org/packages/")
                         ("elpa" . "https://elpa.gnu.org/packages/")))

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))

(unless (package-installed-p 'use-package)
    (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)

Keep .emacs.d Clean

Переносим переменные, созданные Custom в отдельный файл.

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

General settings

Defaults

Для лучшего взаимодействия с GNU Emacs я использую следующие значения по умолчанию.

;; disable because of elpa bug in emacs 27.1
(setq package-check-signature nil)

(setq inhibit-startup-message t)

;; (setq ring-bell-function 'ignore)              ; Отключить звуковой сигнал
(blink-cursor-mode -1)                            ; Курсор не мигает
(fset 'yes-or-no-p 'y-or-n-p)                     ; Замена yes-or-on на y-or-n

(menu-bar-mode -1)    ; Не показывать меню
(scroll-bar-mode -1)  ; Не показывать полосу прокрутки
(tool-bar-mode -1)    ; Не показывать панель инструментов

(setq visible-bell t) ; Установите видимый звонок

(setq user-full-name "Egor Tolbaev")              ; Имя пользователя
(setq user-mail-address "egor05.09.97@gmail.com") ; Email пользователя

;; Показ номера строки стандартными средствами
(column-number-mode)
(global-display-line-numbers-mode t)

;; Отключить номера строк где они не нужны
(dolist (mode '(org-mode-hook
		  term-mode-hook
		  shell-mode-hook
		  eshell-mode-hook
		  org-agenda-mode-hook
		  treemacs-mode-hook
		  eww-mode-hook
		  calendar-mode-hook
		  deft-mode-hook
		  dired-mode-hook
		  cfw:calendar-mode-hook
		  cfw:details-mode-hook))
    (add-hook mode (lambda () (display-line-numbers-mode 0))))

Fonts

Использую Source Code Pro или Consolas еще не решил:)

(defvar et/default-font-size 115)
;;(set-face-attribute 'default nil :font "Consolas")
;;(set-face-attribute 'default nil :font "Source Code Pro Medium" :height et/default-font-size)
(set-face-attribute 'default nil :font "Fira Mono" :height et/default-font-size)
;(set-fontset-font t 'latin "Noto Sans")
(set-fontset-font t 'latin "Cantarell")

Кодировка

(set-language-environment 'UTF-8)
(setq default-buffer-file-coding-system 'utf-8)
(setq-default coding-system-for-read    'utf-8)
(setq file-name-coding-system           'utf-8)
(set-keyboard-coding-system        'utf-8-unix)
(set-terminal-coding-system             'utf-8)
(prefer-coding-system                   'utf-8)

Парные элементы

Теперь при вводе парного элемента типа “(” они автоматически закрываються

(electric-pair-mode t)
(show-paren-mode 1)

Перенос по словам

Слова которые не помещаются по размеру фрейма переносится на другую строку

(setq word-wrap t)
(global-visual-line-mode t)

Чистим пробелы

При сохранение файла удаляются лишние пробелы в конце строки и файла.

(add-hook 'before-save-hook '(lambda () (delete-trailing-whitespace)))

Отключить сохранение

(setq make-backup-files nil)        ; Не нужны файлы резервных копий
(setq auto-save-list-file-name nil) ; Не нужны файлы .saves
(setq auto-save-default nil)        ; Не хочу автосохранения

Auto mode alist

(setq auto-mode-alist
    (append
     '(("\\.el$"  . emacs-lisp-mode)
	 ("\\.org$" . org-mode)
	 ("\\.tex$" . latex-mode))))

multiple-cursors

Github: multiple-cursors

(use-package multiple-cursors)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)

Edit This Configuration File Shortcut

(defun edit-configs ()
  "Opens the README.org file."
  (interactive)
  (find-file "~/.emacs.d/myconfig.org"))

(global-set-key (kbd "C-x e") #'edit-configs)

UI

Theme

Я использую темы doom-themes в сочетании с doom-modeline. Для отображения значков в doom-modeline использую all-the-icons

(use-package doom-themes
  :config
    (load-theme 'doom-Iosvkem))

Переключение темы

Светлая тема

(defun set-light-theme()
  (interactive)
  (load-theme 'doom-opera-light))
  (global-set-key (kbd "<f8>") 'set-light-theme)

Темная тема

(defun set-night-theme()
  (interactive)
  (load-theme 'doom-Iosvkem))
  (global-set-key (kbd "<f9>") 'set-night-theme)

Modeline

GitHub: doom-modeline

(use-package doom-modeline
  :hook (after-init . doom-modeline-mode))

Icons

GitHub: all-the-icons

Для того, чтобы значки работали, очень важно, чтобы Вы установили шрифты ресурсов, включенные в этот пакет.

M-x all-the-icons-install-fonts

Для Windows эта функция предложит указать каталог для загрузки, чтобы вы могли установить их вручную.

(use-package all-the-icons)

Отображение времени

(setq display-time-24hr-format t) ; 24-часовой временной формат в mode-line
(display-time-mode t)             ; показывать часы в mode-line
(size-indication-mode t)          ; размер файла в %-ах

Настройка фрейма

Устанавливаю прозрачность фрейма и разворачиваю окно по умолчанию.

Что бы это было красиво следите за свои рабочим столом и окнами позади фрейма GNU Emacs

(defun et/transparent-frame (bool)
  (if bool
      (set-frame-parameter (selected-frame) 'alpha '(90 . 90))
    (set-frame-parameter (selected-frame) 'alpha '(100 . 100))))

(et/transparent-frame t)

(add-to-list 'default-frame-alist '(alpha . (90 . 90)))
(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
(add-to-list 'default-frame-alist '(fullscreen . maximized))

Выбор окна

GitHub: ace-window

ace-window - позволяет удобно переключаться между открытыми окнами. Все что Вам нужно это нажать M-o и выбрать окно. Кроме переключения между окнами в пакете также есть и другие функции для работы с ними.

Commands

commandkey / ex commanddescription
ace-windowM-oВыбор окна
aw-delete-windowM-o xудалить окно
aw-swap-windowM-o mпоменять местами окна
aw-move-windowM-o Mпереместить окно
aw-copy-windowM-o cкопировать окно
aw-switch-buffer-in-windowM-o jвыбрать буфер
aw-flip-windowM-o nвыбрать предыдущее окно
aw-switch-buffer-other-windowM-o uвыбрать буфер в другом окне
aw-split-window-fairM-o cсправедливо разделить окно по вертикали или по горизонтали
aw-split-window-vertM-o vразделить окно по вертикали
aw-split-window-horzM-o bразделить окно по горизонтали
delete-other-windowsM-o oразвернуть текущее окно
aw-show-dispatch-helpM-o ?показать эти привязки команд

Settings

(use-package ace-window
  :bind (("M-o" . ace-window))
  :custom
  (aw-scope 'frame)
  (aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l))
  (aw-minibuffer-flag t)
  :config
  (ace-window-display-mode 1))

Golden ratio

GitHub: golden-ratio

Удобный способ работать с окнами, при переключении golden-ratio изменяет размер окна с которым работаете.

(use-package golden-ratio
  :config
  (golden-ratio-mode 1))

Highlight indent guides

GitHub: highlight-indent-guides

highlight-indent-guides - пакет для выделения уровней отступов в коде. С этом режимом так же включаю hs-minor-mode что позволяет скрывать/показывать блок кода.

Commands

commandkey / ex commanddescription
hs-hide-blockC-c @ C-dскрыть текущий блок
hs-show-blockC-c @ C-sпоказать текущий блок
hs-hide-allC-c @ C-tскрыть все блоки верхнего уровня
hs-show-allC-c @ C-aпоказать все блоки в буфере

Settings

(use-package highlight-indent-guides
  :hook ((prog-mode . highlight-indent-guides-mode)
         (prog-mode . hs-minor-mode))
  :config
  (setq highlight-indent-guides-method 'character)
  (setq highlight-indent-guides-responsive 'top))

Office

Org mode

Org mode предназначен для ведения заметок, списков дел, планирования проектов и многого другого.

Описание: org-store-link, org-capture, org-agenda

Commands

commandkey / ex commanddescription
org-captureC-c cсоздать заметку
org-agendaC-c aоткрыть agenda
org-store-linkC-c lсоздать ссылку
org-todoC-c C-tизменить статус задачи
org-set-tags-commandC-c C-qпоставить тег
org-scheduleC-c C-sуказать дату по плану
org-deadlineC-c C-dуказать дату дедлайна
org-table-create-or-convert-from-regionC-x pipeсоздать таблицу
calendar-открыть календарь

Описание рабочего процесса

Вкратце опишу файлы и мой процесс работы с задачами.

Важно Я не претендую на соблюдения всех принципов GTD, и не говорю что мой подход правильный, просто это работает для меня.

Файлы

У меня есть следующие файлы:

inbox.org - структуры у файла нет, это просто список все входящей информации, новые задачи, почта, статьи которые хочу прочитать и т.п;

projects.org - файл содержит задачи для выполнения которых требуется больше чем одно действие. В нем есть два заголовка, “Дом” и “Работа”;

agenda.org - у файла следующая структура:

  • Birthdays (Дни рождения)
  • Recurrent (Повторяющийся)
    • Scheduled (Запланированное)
    • Habits (Привычки)
  • Future (Будущее)

Тут хранятся, дни рождения, привычки которые я хочу отслеживать, какие-то ежедневные задачи или рабочие встречи, а так же все что имеет конкретную запланированную дат;

waiting.org - хранит в себе список делегированных или чего то ожидающих задач;

journal.org - журнал дня, в нем я отслеживаю задачи которыми занимался в конкретный день, затраченное время на задачу, а также могу сделать заметку на этот день.

Структура:

  • Год
    • Месяц
      • День
        • Заметки
        • Задачи

notes.org - просто заметки или заметки к конкретной задаче, встречи;

Процесс

С помощью org-capture добавляю задачу, письмо и т.п в inbox.org; При разборе inbox.org принимаю решения куда дальше это задача попадет в projects.org или next_tasks.org. Если задача попала в projects.org, то разбиваю ее на подзадачи, если в next_tasks.org задача просто ждет своего часа. Также на этом шаге добавляю теги к задаче если они нужны; Беру задачу в работу, переношу или делаю ссылку в journal.org. В journal.org в момент когда начинаю работу над задачей проставляю статус задачи и запускаю таймер, в конце дня, месяца и года строю таблицу затраченного времени.

Basic Config

Этот раздел содержит базовую конфигурацию org-mode, а также конфигурацию для повестки дня.

(use-package org
  :config
  (setq org-ellipsis "")
  (setq org-agenda-start-with-log-mode t)
  (setq org-log-done 'time)  ; Заметки с отметкой времени
  (setq org-log-into-drawer t)
  (when (system-is-windows)
    (setq org-agenda-files '(;; Файлы GTD
			       "c:/Users/user/Dropbox/GTD/next_tasks.org"
			       "c:/Users/user/Dropbox/GTD/projects.org"
			       "c:/Users/user/Dropbox/GTD/journal.org"
			       "c:/Users/user/Dropbox/GTD/agenda.org"
			       "c:/Users/user/Dropbox/GTD/waiting.org"))
    (set 'inbox_file "c:/Users/user/Dropbox/GTD/inbox.org"))
  (when (system-is-linux)
    (setq org-agenda-files '(;; Файлы GTD
			       "~/Dropbox/GTD/next_tasks.org"
			       "~/Dropbox/GTD/projects.org"
			       "~/Dropbox/GTD/journal.org"
			       "~/Dropbox/GTD/agenda.org"
			       "~/Dropbox/GTD/waiting.org"))
    (set 'inbox_file "~/Dropbox/GTD/inbox.org"))


  (setq org-refile-targets
	  '(("inbox.org" :maxlevel . 1)
	    ("projects.org" :maxlevel . 1)
	    ("journal.org" :maxlevel . 4)
	    ;("someday.org" :maxlevel . 1)
	    ("next_tasks.org" :maxlevel . 1)
	    ("waiting.org" :maxlevel . 1)
	    ("archive.org" :maxlevel . 1)
	    ("agenda.org" :maxlevel . 1)))

  ;; Save Org buffers after refiling!
  (advice-add 'org-refile :after 'org-save-all-org-buffers)

  (require 'org-habit)
  (add-to-list 'org-modules 'org-habit)
  (setq org-habit-graph-column 60)

  (setq org-todo-keywords '((sequence "TODO(t)"
					"IN-PROGRESS(s)"
					"PAUSE(p@/!)"
					"NEXT(n@)"
					"ACTIVE(a)"
					"WAITING(w@/!)""|" "DONE(d!)" "CANCEL(c@)")))
  (setq org-tag-alist
	  '((:startgroup)
					  ; Put mutually exclusive tags here
	    (:endgroup)
	    ("@home" . ?H)
	    ("@work" . ?W)
	    ("meeting" .?m)
	    ("day" . ?d)
	    ("projects" . ?p)
	    ("next" . ?n)
	    ("waiting" . ?g)
	    ("sprint" .?s)))

  (setq org-agenda-custom-commands
	  '(("d" "Dashboard"
	     ((agenda "" ((org-agenda-span 0)))
	      (tags-todo "+TODO=\"TODO\"-habits"
			 ((org-agenda-overriding-header "TODO")))
	      (todo "IN-PROGRESS"
		    ((org-agenda-overriding-header "IN-PROGRESS")))
	      (todo "WAITING"
		    ((org-agenda-overriding-header "WAITING")))
	      (todo "PAUSE"
		    ((org-agenda-overriding-header "PAUSE")))
	      (todo "NEXT"
		    ((org-agenda-overriding-header "Next")))))

	    ("w" "Workflow Status"
	     ((tags-todo "projects"
			 ((org-agenda-overriding-header "Projects")
			  (org-agenda-files org-agenda-files)))
	      (tags-todo "next"
			 ((org-agenda-overriding-header "Next")
			  (org-agenda-files org-agenda-files)))
	      (tags-todo "waiting"
			 ((org-agenda-overriding-header "Waiting")
			  (org-agenda-files org-agenda-files)))))
	    ("s" "Sprint"
	     ((tags-todo "sprint"
			 ((org-agenda-overriding-header "Sprint")
			  (org-agenda-files org-agenda-files)))))

	    ("i" "Inbox"
	     ((todo "TODO"))((org-agenda-files (list inbox_file))))

	    ;; Low-effort next actions
	    ("e" tags-todo "+TODO=\"TODO\"+Effort<15&+Effort>0"
	     ((org-agenda-overriding-header "Low Effort Tasks")
	      (org-agenda-max-todos 20)
	      (org-agenda-files org-agenda-files)))))

  (org-babel-do-load-languages
   'org-babel-load-languages
   '((python . t))))

(global-set-key (kbd "C-c l") 'org-store-link)
(global-set-key (kbd "C-c c") 'org-capture)
(global-set-key (kbd "C-c a") 'org-agenda)

Настройка org-protocol

Org-mode имеет удобную функцию org-protocol, которая связана с org-capture.

Org-protocol позволяет делать захват статей или их частей пряма из браузера.

Это позволяет при чтении чего-либо в браузере сохранить ссылку и выделенный текст прямо в org файл который Вы указали.

Для самой простой настройки Вам нужно сделать следующее:

  1. В свой config GNU Emacs добавить вызов функции server-start и пакет org-protocol;
  2. Добавить шаблон захвата (org-capture-templates)

    Пример простого шаблона:

    ("c" "org-protocol-capture" entry (file capture_file)
    "* TODO [[%:link][%:description]]\n\n %i"
    :immediate-finish t)
        
  3. В браузере котором Вы работаете настроить Bookmarklet для вызова следующего JS кода:
    javascript:location.href ='org-protocol://capture?template=c&url='+
        encodeURIComponent(location.href) +
        '&title=' + encodeURIComponent(document.title) +
        '&body=' + encodeURIComponent(window.getSelection())
    
        
  4. Зарегистрировать org-protocl в своей системе:
    • Windows

      Нужно создать обычный текстовый файл и добавить в него следующие строки

      REGEDIT4
      
      [HKEY_CLASSES_ROOT\org-protocol]
      @="URL:Org Protocol"
      "URL Protocol"=""
      [HKEY_CLASSES_ROOT\org-protocol\shell]
      [HKEY_CLASSES_ROOT\org-protocol\shell\open]
      [HKEY_CLASSES_ROOT\org-protocol\shell\open\command]
      @="\"C:\\emacs\\bin\\emacsclientw.exe\" \"%1\""
      
              

      после сохранить файл с расширением reg и запустить.

      Обратите внимание что строка @”"C:\emacs\bin\emacsclientw.exe" "%1"” может отличаться, в зависимости куда был установлен GNU Emacs

    • Linux

      Еще не настраивал:)

Подробно про настройку можно почитать тут

Capture

Я использую capture для быстрого создания задач, заметок и другой организации дел.

На данный момент capture связан с org-protocl, смотрите пункт выше.

 (when (system-is-windows)
   (set 'gtd_inbox_file "c:/Users/user/Dropbox/GTD/inbox.org")
   (set 'gtd_journal_filel "c:/Users/user/Dropbox/GTD/journal.org")
   (set 'gtd_agenda_filel "c:/Users/user/Dropbox/GTD/agenda.org")
   (set 'gtd_notes_filel "c:/Users/user/Dropbox/GTD/notes.org")
   (set 'gtd_projects_filel "c:/Users/user/Dropbox/GTD/projects.org")
					  ;(set 'gtd_someday_filel "c:/Users/user/Dropbox/GTD/someday.org")
   (set 'gtd_next_tasks_file "c:/Users/user/Dropbox/GTD/next_tasks.org")
   (set 'gtd_waiting_file "c:/Users/user/Dropbox/GTD/waiting.org"))
 (when (system-is-linux)
   (set 'inbox_file "~/Dropbox/GTD/inbox.org")
   (set 'journal_filel "~/Dropbox/GTD/journal.org")
   (set 'gtd_agenda_filel "~/Dropbox/GTD/agenda.org")
   (set 'gtd_notes_filel "~/Dropbox/GTD/notes.org")
   (set 'gtd_projects_filel "~/Dropbox/GTD/projects.org")
					  ;(set 'gtd_someday_filel "~/Dropbox/GTD/someday.org")
   (set 'gtd_next_tasks_file "~/Dropbox/GTD/next_tasks.org")
   (set 'gtd_waiting_file "~/Dropbox/GTD/waiting.org"))

 (server-start)
 (require 'org-protocol)

 (setq org-capture-templates
	'(;; Захват задач в файл Inbox
	  ("i" "Inbox task")
	  ("ii" "Just a task (просто задача)" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO %?\n Entered on %U")
	  ("il" "Task with a link to a file (задача с ссылкой на файл))" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO %?\n Entered on %U \n %a")
	  ("im" "Meeting (собрание)" entry (file+olp gtd_agenda_filel "Future")
	   "* TODO %? :meeting: \n %^t %i")
	  ("is" "Schedule a task (запланировать задачу)" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO %? %^G \n SCHEDULED: %^t %i")
	  ("id" "Task with a deadline (задача с дедлайном)" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO %? %^G \n DEADLINE: %^t %i")
	  ;; Журнал дня
	  ("j" "Journal Entries")
	  ("jj" "Journal" entry (file+function gtd_journal_filel
					       (lambda ()
						 (org-datetree-find-date-create
						  (org-date-to-gregorian (org-today)) t)
						 (re-search-forward "^\\*.+ Day" nil t)))
	   "\n* %<%I:%M %p> - Journal :journal:\n\n%?\n\n")
	  ("jd" "Tasks for the day" entry
	   (file+olp+datetree gtd_journal_filel)
	   "\n* Day \n* Meeting :meeting: \n* %<%Y-%m-%d %p> - Tasks for the day")
	  ("jn" "Nex date" entry (file+function gtd_journal_filel
						(lambda ()
						  (org-datetree-find-date-create
						   (org-date-to-gregorian (org-date-to-gregorian (time-add (org-today) 1))) t)
						  (re-search-forward "^\\*.+ Day" nil t)))
	   "\n* Day \n* Meeting :meeting: \n* %(org-insert-time-stamp (org-read-date nil t \"++1d\" nil (org-read-date nil t \"%:date\")) nil t) - Tasks for the day")
	  ;; Заметки
	  ("n" "Note")
	  ("nn" "Note with link" entry  (file gtd_notes_filel)
	   "* Note (%a)\n Entered on/ %U\n %?")
	  ("nj" "Just a note" entry  (file gtd_notes_filel)
	   "* Note %?\n  Entered on/ %U\n")
	  ;; Захват задач из внешних источников (браузер)
	  ("c" "org-protocol-capture" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO [[%:link][%:description]]\n\n %i"
	   :immediate-finish t)
	  ;; Захват выделенного региона, используеться в функции et/org-capture-inbox
	  ("e" "capturing a selected region" entry (file+olp gtd_inbox_file "Inbox")
	   "* TODO %?\n %a\n %i"
	   :immediate-finish t)))

 (defun et/org-capture-inbox ()
   "Записать выделенный регион в файл Inbox"
   (interactive)
   (org-capture nil "e"))

Org-roam

Org-roam - это система для управления вашими знаниями на основе org файлов. Удобный способ создать собственную wiki или просто управлять своими заметками.

Установка

Windows

Чтобы установить org-roam на OS Windows, Вам нужно установить компилятор C MSYS2 и в его терминале ввести команду:

pacman -S gcc

Далее нужно добавить пути, для этого в терминале введем следующие:

setx PATH "c:\msys64\mingw32\bin;c:\msys64\usr\bin;%PATH%"

Чтобы узнать подробней читайте инструкцию.

Linux

Еще не настроено:)

Commands

commandkey / ex commanddescription
org-roam-node-findC-c n fоткрыть/создать узел
org-roam-node-insertC-c n iдобавить ссылку на узел
org-roam-buffer-toggleC-c n lпосмотреть связи между узлами
completion-at-pointC-M-iавто завершение при вводе первых символов
org-id-get-create-создать узел из заголовка
org-roam-alias-add-добавить alias узлу
org-roam-dailies-capture-todayC-c n d nсоздать заметку на текущий день
org-roam-dailies-goto-todayC-c n d dперейти к заметкам текущего дня
org-roam-dailies-capture-yesterdayC-c n d Yсоздать заметку вчерашнего дня
org-roam-dailies-capture-tomorrowC-c n d Tсоздать заметку завтрашнего дня
org-roam-dailies-capture-dateC-c n d vсоздать заметку на определенную дату
org-roam-dailies-goto-dateC-c n d cперейти к файлу за конкретную дату
org-roam-dailies-goto-next-noteC-c n d bперейти к заметки вчерашнего дня
org-roam-dailies-goto-previous-noteC-c n d fперейти к заметку завтрашнего дня

Settings

 (when (system-is-windows)
   (set 'path_org_roam "c:/Users/user/Dropbox/Braindump/main"))
 (when (system-is-linux)
   (set 'path_org_roam "~/Dropbox/Braindump/main"))

 (use-package org-roam
   :init
   (setq org-roam-v2-ack t)
   :custom
   (org-roam-directory path_org_roam)
   (org-roam-completion-everywhere t)
   :bind (("C-c n l" . org-roam-buffer-toggle)
	   ("C-c n f" . org-roam-node-find)
	   ("C-c n i" . org-roam-node-insert)
	   :map org-mode-map
	   ("C-M-i" . completion-at-point)
	   :map org-roam-dailies-map
	   ("Y" . org-roam-dailies-capture-yesterday)
	   ("T" . org-roam-dailies-capture-tomorrow))
   :bind-keymap
   ("C-c n d" . org-roam-dailies-map)
   :config
   (require 'org-roam-dailies) ;; Ensure the keymap is available
   (org-roam-db-autosync-mode)
   (cl-defmethod org-roam-node-type ((node org-roam-node))
     "Return the TYPE of NODE."
     (condition-case nil
	  (file-name-nondirectory
	   (directory-file-name
	    (file-name-directory
	     (file-relative-name (org-roam-node-file node) org-roam-directory))))
	(error ""))))

Org-roam-ui

GitHub: org-roam-ui

org-roam-ui — это интерфейс для просмотра и взаимодействия с вашими заметками в Org-roam.

Используйте M-x org-roam-ui-mode RET для включения глобального режима. Он запустит веб-сервер по адресу http://127.0.0.1:35901/ и подключится к нему через WebSocket для получения обновлений в реальном времени.

(use-package org-roam-ui
  :after org-roam
  ;;normally we'd recommend hooking orui after org-roam, but since org-roam does not have
  ;;a hookable mode anymore, you're advised to pick something yourself
  ;;if you don't care about startup time, use
  ;;:hook (after-init . org-roam-ui-mode)
  :config
  (setq org-roam-ui-sync-theme t
        org-roam-ui-follow t
        org-roam-ui-update-on-save t
        org-roam-ui-open-on-start t))

Calendar

Github: emacs-calfw

Commands

commandkey / ex commanddescription
cfw:change-view-mothMпросмотр месяца
cfw:change-view-weekW1 неделя просмотра
cfw:change-view-two-weeksT2 недели просмотра
cfw:change-view-dayDдень
cfw:refresh-calendar-bufferrобновить
cfw:show-details-commandSPCвсплывающий буфер сведений
qвыйти

Settimgs

(use-package calfw
  :commands cfw:open-org-calendar
  :config
  (setq cfw:fchar-junction ?╋
	  cfw:fchar-vertical-line ?┃
	  cfw:fchar-horizontal-line ?━
	  cfw:fchar-left-junction ?┣
	  cfw:fchar-right-junction ?┫
	  cfw:fchar-top-junction ?┯
	  cfw:fchar-top-left-corner ?┏
	  cfw:fchar-top-right-corner ?┓)
  (setq calendar-week-start-day 1) ; 0:Sunday, 1:Monday

  (use-package calfw-org
    :config
    (setq cfw:org-agenda-schedule-args '(:timestamp))))

Org bullets

Github: org-bullets

org-bullets заменяет звездочки заголовков в буферах режима организации более красивыми символами.

(use-package org-bullets
  :after org
  :hook (org-mode . org-bullets-mode)
  :custom
  (org-bullets-bullet-list '("" "" "" "" "" "" "")))

Center Org Buffers

Github: visual-fill-column

Мне нравится когда файл в режим org-mode центрируется в буфере.

(when (system-is-windows)
  (set 'center_org 130))
(when (system-is-linux)
  (set 'center_org 150))

(defun et/org-mode-visual-fill ()
    (setq visual-fill-column-width center_org
          visual-fill-column-center-text t)
    (visual-fill-column-mode 1))

  (use-package visual-fill-column
    :hook (org-mode . et/org-mode-visual-fill))

Toc org

GitHub: toc-org

Удобный способ делать оглавления автоматически, просто в первом заголовке добавить тег :TOC:

(use-package toc-org
  :after org
  :hook (org-mode . toc-org-enable))

Block Templates

Шаблоны позволяют вводить что-то вроде, <el, затем при нажатии Tab разворачивается шаблон.

(require 'org-tempo)

(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python"))
(add-to-list 'org-structure-template-alist '("cs" . "src csharp"))

Quick file access

В этом разделе собраны функции для быстрого доступа к файлам которые мне часто нужны.

(defun et/open-inbox ()
  "Открыть файл Inbox"
  (interactive)
  (find-file gtd_inbox_file))

(defun et/open-agenda ()
  "Открыть файл Agenda"
  (interactive)
  (find-file gtd_agenda_filel))

(defun et/open-journal ()
  "Открыть файл Journal"
  (interactive)
  (find-file gtd_journal_filel))

(defun et/open-notes ()
  "Открыть файл Notes"
  (interactive)
  (find-file gtd_notes_filel))

(defun et/open-projects ()
  "Открыть файл Projects"
  (interactive)
  (find-file gtd_projects_filel))

;(defun et/open-someday ()
;  "Открыть файл Someday"
;  (interactive)
;  (find-file gtd_someday_filel))

(defun et/open-next-tasks ()
  "Открыть файл Nex tasks"
  (interactive)
  (find-file gtd_next_tasks_file))

(defun et/open-waiting ()
  "Открыть файл Someday"
  (interactive)
  (find-file gtd_waiting_file))

Auto-tangle Configuration Files

Каждый раз при сохранении myconfig.org экспортирует конфигурацию в init.el

(when (system-is-windows)
  (defvar et/path-expand "./myconfig.org"))
(when (system-is-linux)
  (defvar et/path-expand "~/.emacs.d/myconfig.org"))

(defun et/org-babel-tangle-config ()
  (when (string-equal (buffer-file-name)
                      (expand-file-name et/path-expand))
    (let ((org-confirm-babel-evaluate nil))
      (org-babel-tangle))))

(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'et/org-babel-tangle-config)))

Markdown

Markdown Mode for GNU Emacs

Прежде чем использовать этот пакет, нужно убедиться что установлен какой то процессор Markdown

В моем конфиге это - pandoc

(use-package markdown-mode
  :commands (markdown-mode gfm-mode)
  :mode (("README\\.md\\'" . gfm-mode)
         ("\\.md\\'" . markdown-mode)
         ("\\.markdown\\'" . markdown-mode))
  :init (setq markdown-command "pandoc"))

pomodoro

(add-to-list 'load-path "~/.emacs.d/local/pomodoro")
(require 'pomodoro)

File Management

Dired

Dired - это встроенный файловый менеджер для GNU Emacs.

В OS Windows может быть не корректная сортировка файлов и дополнительная информация, это неприятно, но работе не мешает.

Для отображения icons в Dired использую Treemacs Icons.

Commands

commandkey / ex commanddescription
diredC-x dоткрыть
dired-jumpC-x C-jоткрыть dired текущего файла

dired-single

commandkey / ex commanddescription
dired-single-up-directoryhвернуться назад в текущем буфере
dired-single-bufferjоткрыть в текущем буфере

Навигация

commandkey / ex commanddescription
dired-next-linenследующая строка
dired-previous-linepпредыдущая строка
dired-goto-filejперейти к файлу в буфере
dired-find-fileRETвыберите файл или каталог
dired-up-directiry^перейти в родительский каталог
dired-find-file-other-windowoоткрыть файл в «другом» окне
dired-display-fileC-oпоказать файл в другом окне без фокусировки
dired-view-filevпредварительный просмотр
revert-buffergобновить буфер

Маркировка файлов

commandkey / ex commanddescription
dired-markmотметить файл
dired-unmarkuснять отметку
dired-unmark-all-marksUснять отметку со всех файлов
dired-toggle-marks* t or tИнвертирует отмеченные файлы в буфере
dired-mark-files-regexp% mПометить файлы в буфере с помощью регулярного выражения
*Множество других функций автоматической маркировки
dired-do-kill-linesk«Убить» отмеченные предметы

Копирование и переименование файлов

commandkey / ex commanddescription
dired-do-copyCскопировать файл
dired-do-renameRпереименовать файл
dired-do-rename-regexp% RПереименовать на основе регулярного выражения ^test

Удаление файлов

commandkey / ex commanddescription
dired-do-deleteDУдалить отмеченный файл
dired-flag-file-deletiondОтметить файл для удаления
dired-do-flagged-deletexВыполнить удаление для отметок
delete-by-moving-to-trash-Переместить в корзину

Создание и распаковка архивов

commandkey / ex commanddescription
dired-do-compressZСжать или распаковать файл или папку в ( .tar.gz)
dired-do-compresscСжать выделение в конкретный файл
dired-compress-files-alist-Привязать команды сжатия к расширению файла

Другие общие операции

commandkey / ex commanddescription
dired-do-touchTКоснитесь (изменить отметку времени)
dired-do-chmodMИзменить режим файла
dired-do-chownOСменить владельца файла
dired-do-chgrpGИзменить группу файлов
dired-do-symlinkSСоздайте символическую ссылку на этот файл
dired-do-loadLЗагрузить файл GNU Emacs Lisp в GNU Emacs

Settings

(use-package dired
  :commands (dired dired-jump)
  :bind (("C-x C-j" . dired-jump))
  :custom ((dired-listing-switches "-agho --group-directories-first"))
  :config
  (define-key dired-mode-map "h"
    'dired-single-up-directory)
  (define-key dired-mode-map "l"
    'dired-single-buffer))

(use-package dired-single)

;; (use-package all-the-icons-dired
;;   :hook (dired-mode . all-the-icons-dired-mode))

Deft

GitHub: Deft

Deft — это режим GNU Emacs для быстрого просмотра, фильтрации и редактирования каталогов простых текстовых заметок, вдохновленный Notational Velocity.

Commands

commandkey / ex commanddescription
deft-open-file-other-windowC-oоткрыть файл в другом окне не меня фокуса
deft-open-file-other-windowC-u C-oоткрыть файл в другом окне переключившись на него
deft-filter-clearС-с С-сочистить фильтр поиска
deft-filterC-c C-lредактировать строку поиска
M-p and M-nистория поиска в режиме редактирования строки поиска
deft-toggle-incremental-searchC-c C-tпереключение между обычным поиском и по регулярным выражения
deft-rename-fileC-c C-rпереименовать файл
deft-delete-fileС-с С-dудалить файл
deft-new-fileC-c C-nсоздать файл
deft-archive-fileC-c C-aпереместить файл в архив
C-c C-qзакрыть deft

Settings

(when (system-is-windows)
  (setq et/deft-dir-list '("c:/Users/user/Dropbox/Braindump/main"
                           "c:/Users/user/Dropbox/GTD/")))
(when (system-is-linux)
  (setq et/deft-dir-list '("~/Dropbox/Braindump/main"
                           "~/Dropbox/GTD/")))

(use-package deft
  :config (setq deft-directory "c:/Users/user/Dropbox/Braindump/main"
                deft-extensions '("md" "org"))
  (setq deft-use-filename-as-title t))

(defun et/pick-deft-dir ()
  "Select directories from a list"
  (interactive)
  (setq deft-directory
        (ido-completing-read "Select directory: " et/deft-dir-list))
  (deft-refresh))

Modes

IVY

Ivy - это общий механизм завершения для GNU Emacs. Использую в месте с ivy-rich и counsel

Commands

commandkey / ex commanddescription
swiperC-sоткрыть поиск
ivy-alt-doneTAB or C-lвыйти из буфера
ivy-next-lineС-j or C-nследующая строка
ivy-previous-lineC-k or C-pпредыдущая строка
ivy-switch-buffer-killC-dвыйти из буфера reverse-i-search
counsel-switch-bufferC-M-jпереключение буферов с превью

Settings

(use-package ivy
  :diminish
  :bind (("C-s" . swiper)
         :map ivy-minibuffer-map
         ("TAB" . ivy-alt-done)
         ("C-l" . ivy-alt-done)
         ("C-j" . ivy-next-line)
         ("C-k" . ivy-previous-line)
         :map ivy-switch-buffer-map
         ("C-k" . ivy-previous-line)
         ("C-l" . ivy-done)
         ("C-d" . ivy-switch-buffer-kill)
         :map ivy-reverse-i-search-map
         ("C-k" . ivy-previous-line)
         ("C-d" . ivy-reverse-i-search-kill))
  :config
  (ivy-mode 1))

(global-set-key (kbd "C-M-j") 'counsel-switch-buffer)

IVY-RICH

(use-package ivy-rich
  :init
  (ivy-rich-mode 1))

COUNSEL

(use-package counsel
  :bind (("M-x" . counsel-M-x)
         ("C-x b" . counsel-ibuffer)
         ("C-x C-f" . counsel-find-file)
        :map minibuffer-local-map
         ("C-r" . 'counsel-minibuffer-history)))

Helpful

GitHub: helpful

Helpful - это альтернатива встроенной справке GNU Emacs, которая предоставляет гораздо больше контекстной информации.

(use-package helpful
  :custom
    (counsel-describe-function-function #'helpful-callable)
    (counsel-describe-variable-function #'helpful-variable)
  :bind
    ([remap describe-function] . counsel-describe-function)
    ([remap describe-command] . helpful-command)
    ([remap describe-variable] . counsel-describe-variable)
    ([remap describe-key] . helpful-key))

Which Key

GitHub: which-key

which-key- это второстепенный режим для GNU Emacs, который отображает привязки клавиш после введенной вами неполной команды (префикса) во всплывающем окне.

(use-package which-key
  :init (which-key-mode)
  :diminish which-key-mode
  :config
    (setq which-key-idle-delay 1))

General packages

BS

GitHub: bs

Меню для выбора и отображения буферов

(use-package bs)

;; Добавим чтобы в буфере всегда был scratch
(setq bs-configurations
    '(("files" "^\\*scratch\\*" nil nil bs-visits-non-file bs-sort-buffer-interns-are-last)))

(global-set-key (kbd "<f2>") 'bs-show)

Dashboard

GitHub: dashboard

Расширяемый стартовый экран GNU Emacs.

(use-package dashboard
  :init
  (progn
    (setq dashboard-startup-banner "~/.emacs.d/images/ET_Light_Small.png")
    (setq dashboard-items '((recents  . 5)
                            (projects . 5)
                            (agenda . 5)))
    (setq dashboard-show-shortcuts nil)
    (setq dashboard-center-content t)
    (setq dashboard-set-file-icons t)
    (setq dashboard-set-heading-icons t)
    (setq dashboard-set-init-info t ))
  :config
  (dashboard-setup-startup-hook)
  :custom
  (dashboard-banner-logo-title "Good Hack")
  ;; Кнопки навигации
  (dashboard-set-navigator t)
  (dashboard-navigator-buttons
   (if (featurep 'all-the-icons)
       `(((,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust 0.0)
           "Homepage" "Browse homepage"
           (lambda (&rest _) (browse-url "https://github.com/EgorTolbaev")))
          (,(all-the-icons-fileicon "elisp" :height 1.1 :v-adjust -0.1)
           "Configuration" "" (lambda (&rest _) (edit-configs)))))
     `((("" "Homepage" "Browse homepage"
         (lambda (&rest _) (browse-url "https://github.com/EgorTolbaev")))
        ("" "Configuration" "" (lambda (&rest _) (edit-configs)))))))
  ;; Настройки dashboard-agenda для показа с определенным тегом и статусом
  (dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-todo)
  (dashboard-match-agenda-entry "day|@work"
    dashboard-match-next-entry "TODO=\"TODO\"|TODO=\"IN-PROGRESS\"|TODO=\"PAUSE\""))

Reverse-im

GitHub: reverse-im

Переопределяет функциональную-клавишную-карту для предпочтительных методов ввода для перевода входных последовательностей на английский язык.

(use-package reverse-im
  :custom
    (reverse-im-input-methods '("russian-computer"))
  :config
    (reverse-im-mode t))

Browser

Я решил использовать в связке с GNU Emacs браузер, ориентированный на клавиатуру, с минимальным графическим интерфейсом Qutebrowser

При установки qutebrowser на Windows возможно потребуеться вручную добавить путь в переменную $path = C:\Program Files\qutebrowser

(use-package browse-url
  :custom
  (browse-url-browser-function 'browse-url-default-windows-browser))
    ;(browse-url-browser-function 'browse-url-generic)
    ;(browse-url-generic-program "qutebrowser"))

Engine-mode

Github: engine-mode

Удобный способ совершать поиск не выходя из GNU Emacs

Commands

commandkey / ex commanddescription
engine/keymap-prefixC-x /открыть буфер команд
engine/search-duckduckgoC-x / dпоиск в duckduckgo
engine/search-githubC-x / gпоиск в GitHub
engine/search-google-imagesC-x / iпоиск картинок в google
engine/search-youtubeC-x / yпоиск в youtube

Settings

 (use-package engine-mode
   :defer 3
   :config
     (defengine duckduckgo
       "https://duckduckgo.com/?q=%s"
	:keybinding "d")

     (defengine github
       "https://github.com/search?ref=simplesearch&q=%s"
	:keybinding "g")

     (defengine google
       "https://www.google.com/search?q=%s"
	:keybinding "i")

     (defengine youtube
       "http://www.youtube.com/results?aq=f&oq=&search_query=%s"
	:keybinding "y")

   (engine-mode t))

Hydra

GitHub: hydra, major-mode-hydra

hydra позволяет сделать меню с командами и всплывающем окне отображать их. Это удобно когда вам нужно группировать команды или просто не запоминать все хоткеии, а подсматривать в подсказку.

Commands

commandkey / ex commanddescription
Браузер
hydra-browser/bodyC-c bhydra браузера
engine/search-duckduckgoC-c b dпоиск в duckduckgo
engine/search-google-imagesC-c b iпоиск картинок в google
engine/search-youtubesC-c b yпоиск в youtube
engine/search-githuC-c b gпоиск в GitHub
Treemacs
hydra-treemacs/bodyC-c thydra treemac
treemacsC-c t ttreemac
lsp-treemacs-symbolsC-c t streemacs ymbols
Настройка темы
hydra-theme/bodyC-c shydra theme
counsel-load-themeC-c s aпосмотреть все темы
set-night-themeC-c s dустановить темную тему
set-light-themeC-c s lустановить светлую тему
(et/transparent-frame t)C-c s pпрозрачный фрейм
(et/transparent-frame nil)C-c s nне прозрачный фрейм
Org
hydra-org/bodyC-c ohydra org
org-insert-link-globalC-c o gсоздать ссылку
org-store-linkC-c o lstore link
org-captureC-c o cсоздать заметку
org-agendaC-c o aоткрыть agenda
org-clock-gotoC-c o jперейти к задаче
org-clock-in-lastC-c o dповторный запуск времени задачи
org-clock-inC-c o iзапустить время выполнения
org-clock-outC-c o oостановить время выполнения
cfw:open-org-calendarC-c o wоткрыть календарь cfw
Windows
hydra-windows/bodyC-c whydra windows
golden-ratio-modeC-c w gвключить/отключить golden ratio
balance-windowsC-c w b or C-x +сбалансировать размер всех окон
shrink-windowC-c w sуменьшить окно по вертикали
shrink-window-horizontallyC-c w [ or C-x {уменьшить окно по горизонтали
enlarge-window-horizontallyC-c w ] or C-x }увеличить окно по горизонтали
Text
hydra-text-scale/bodyC-c Thydra text
text-scale-increaseC-c T jувеличить текст
text-scale-decreaseC-c T kуменьшить текст
File GTD
hydra-file-gtd/bodyC-c ghydra File GTD
et/open-inboxC-c g iоткрыть файл Inbox
et/open-agendaC-c g aоткрыть файл Agenda
et/open-journalC-c g jоткрыть файл Journal
et/open-notesC-c g nоткрыть файл Note
et/open-projectsC-c g pоткрыть файл Projects
et/open-somedayC-c g sоткрыть файл Someday
et/open-next-tasksC-c g tоткрыть файл Next task
et/open-waitingC-c g wоткрыть файл Waiting

Settings Hydra

(use-package hydra
  :bind (("C-c b" . hydra-browser/body)
	   ("C-c t" . hydra-treemacs/body)
	   ("C-c s" . hydra-theme/body)
	   ("C-c o" . hydra-org/body)
	   ("C-c w" . hydra-windows/body)
	   ("C-c T" . hydra-text-scale/body)
	   ("C-c g" . hydra-file-gtd/body)
	   ))

(use-package major-mode-hydra
  :after hydra
  :preface
  (defun with-alltheicon (icon str &optional height v-adjust face)
    "Display an icon from all-the-icon."
    (s-concat (all-the-icons-alltheicon icon :v-adjust (or v-adjust 0) :height (or height 1) :face face) " " str))

  (defun with-faicon (icon str &optional height v-adjust face)
    "Display an icon from Font Awesome icon."
    (s-concat (all-the-icons-faicon icon ':v-adjust (or v-adjust 0) :height (or height 1) :face face) " " str))

  (defun with-fileicon (icon str &optional height v-adjust face)
    "Display an icon from the Atom File Icons package."
    (s-concat (all-the-icons-fileicon icon :v-adjust (or v-adjust 0) :height (or height 1) :face face) " " str))

  (defun with-octicon (icon str &optional height v-adjust face)
    "Display an icon from the GitHub Octicons."
    (s-concat (all-the-icons-octicon icon :v-adjust (or v-adjust 0) :height (or height 1) :face face) " " str)))

Hydra / Browser

(pretty-hydra-define hydra-browser
  (:hint nil :forein-keys warn :quit-key "q" :title (with-faicon "chrome" "Browser" 1 -0.05))
  (""
   (("d" engine/search-duckduckgo "Duckduckgo")
    ("i" engine/search-google "Google")
    ("y" engine/search-youtube "Youtube")
    ("g" engine/search-github "GitHub"))))

Hydra / Treemacs

(pretty-hydra-define hydra-treemacs
  (:hint nil :forein-keys warn :quit-key "q" :title (with-faicon "file-text" "Treemacs" 1 -0.05))
  (""
   (("t" treemacs "Treemacs")
    ("s" lsp-treemacs-symbols "Treemacs Symbols"))))

Hydra / Theme

(pretty-hydra-define hydra-theme
  (:hint nil :forein-keys warn :quit-key "q" :title (with-faicon "codepen" "Theme" 1 -0.05))
  ("All Theme"
   (("a" counsel-load-theme "View all themes"))
   "Used themes"
   (("d" set-night-theme "Night theme")
    ("l" set-light-theme "Light theme"))
   "Frame"
   (("p" (et/transparent-frame t) "Transparent frame")
    ("n" (et/transparent-frame nil) "Not transparent frame"))))

Hydra / Org

(pretty-hydra-define hydra-org
  (:hint nil :forein-keys warn :quit-key "q" :title (with-faicon "codepen" "Org" 1 -0.05))
  (""
   (("g" org-insert-link-global "Insert link")
    ("l" org-store-link "Store link")
    ("c" org-capture "Create capture")
    ("a" org-agenda "Open agenda"))
   "Clock"
   (("j" org-clock-goto "Org clock goto")
    ("d" org-clock-in-last "Org clock in last")
    ("i" org-clock-in "Org clock in")
    ("o" org-clock-out "Org clock uot")
    ("t" org-clock-report "Org clock report"))
   "Calendar"
   (("w" cfw:open-org-calendar "cfw org calendar "))))

Hydra / Windows

(pretty-hydra-define hydra-windows
  (:hint nil :forein-keys warn :quit-key "q" :title (with-faicon "windows" "Windows" 1 -0.05))
  (""
   (("g" golden-ratio-mode "Golden ratio")
    ("b" balance-windows   "Balance windows"))
   ""
   (("s" shrink-window               "Shrink window")
    ("[" shrink-window-horizontally  "Shrink window horizontally")
    ("]" enlarge-window-horizontally "Enlarge window horizontally"))))

Hydra / Text

(pretty-hydra-define hydra-text-scale
  (:hint nil :forein-keys warn :quit-key "q" :timeout 4 :title (with-faicon "codepen" "Text" 1 -0.05))
  (""
   (("j" text-scale-increase "in")
    ("k" text-scale-decrease "out"))))

Hydra / File GTD

(pretty-hydra-define hydra-file-gtd
  (:hint nil :forein-keys warn :quit-key "q" :timeout 4 :title (with-faicon "codepen" "GTD" 1 -0.05))
  ("File GTD"
   (("i" (et/open-inbox) "Open Inbox")
    ("a" (et/open-agenda) "Open Agenda")
    ("j" (et/open-journal) "Open Journal")
    ("n" (et/open-notes) "Open Note"))
   ""
    (("p" (et/open-projects) "Open Project")
    ;("s" (et/open-someday) "Open Someday")
    ;("t" (et/open-next-tasks) "Open Next task")
    ("w" (et/open-waiting) "Open Waiting"))))

Development

Languages

IDE Features with lsp-mode

lsp-mode

GitHub: lsp-mode

Я использую lsp-mode, чтобы сделать IDE-подобную функциональность. Прежде чем настроить lsp-mode, ознакомьтесь c документацией для своего языка.

(defun et/lsp-mode-setup ()
  (setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols))
  (lsp-headerline-breadcrumb-mode))

(use-package lsp-mode
  :commands (lsp lsp-deferred)
  :hook (lsp-mode . et/lsp-mode-setup)
  :init
  (setq lsp-keymap-prefix "C-c l")
  :config
  (lsp-enable-which-key-integration t))

lsp-ui

lsp-ui - это набор улучшений пользовательского интерфейса, созданных на основе, lsp-mode которые делают GNU Emacs еще более похожим на IDE.

(use-package lsp-ui
  :hook (lsp-mode . lsp-ui-mode)
  :custom
  (lsp-ui-doc-position 'bottom))

lsp-treemacs

GitHub: lsp-treemacs

Treemacs - файловый менеджер древовидной структуры для GNU Emacs.

treemacs-icons-dired - позволяет использовать значки treemacs в dired буферах.

Commands
commandkey / ex commanddescription
lsp-treemacs-symbolsC-x t sПоказать дерево символов в текущем файле
lsp-treemacs-references-Показать древовидную структуру для ссылок символа под курсором
lsp-treemacs-error-list-Показать древовидную структуру диагностических сообщений в проекте
Settings
(use-package lsp-treemacs
  :after lsp)

(global-set-key (kbd "C-x t t") 'treemacs)
(global-set-key (kbd "C-x t s") 'lsp-treemacs-symbols)

(use-package treemacs-icons-dired
  :config (treemacs-icons-dired-mode))

lsp-ivy

GitHub: lsp-ivy

Упрощает поиск в коде.

Commands
commandkey / ex commanddescription
lsp-ivy-workspace-symbol-Поиск имени символа в рабочей области текущего проекта
lsp-ivy-global-workspace-symbol-Поиск имени символа во всех активных рабочих областях проекта
Settings
(use-package lsp-ivy)

Debugging with dap-mode

dap-mode - это пакет для отладки в GNU Emacs.

Документацию по настройки языков можно посмотреть тут.

Commands

commandkey / ex commanddescription
dap-breakpoint-toggle-поставить точку остановы
dap-breakpoint-delete-удалить точку остановы
dap-ui-breakpoint-list-список всех точек остановы
dap-debug-запустить отладку
dap-hydra-посмотреть как управлять отладкой

Settings

(use-package dap-mode)

TypeScript and JavaScript

;(use-package typescript-mode
;  :mode "\\.ts\\'"
;  :hook (typescript-mode . lsp-deferred)
;  :config
;  (setq typescript-indent-level 2)
;  (require 'dap-node)
;  (dap-node-setup))

(use-package js2-mode
  :mode "\\.jsx?\\'"
  :hook (js2-mode . lsp-deferred)
  :config
  (setq js-indent-level 2))

Важная заметка! Для lsp-mode работы с TypeScript (и JavaScript) вам необходимо установить языковой сервер на вашем компьютере. Если у вас установлен Node.js, самый простой способ сделать это - выполнить следующую команду:

npm i -g typescript-language-server; npm i -g typescript

Python

Для Python использую lsp-mode и dap-mode.

В данной конфигурации используется pyls, по этому убедитесь что у вас установлен языковой сервер

pip install --user "python-language-server[all]"
pip install python-lsp-server

Также вам может понадобиться debugger и среда тестирования pytest

pip3 install --user debugpy
pip3 install --user pytest

Важная заметка! если при использование OS Windows возникли проблемы, с нормальной работы Python при открытии файлов, попробуйте с начало запустить среду Python внутри GNU Emacs при помощи run-python.

(use-package python-mode
  :mode "\\.py\\'"
  :hook (python-mode . lsp-deferred)
  :custom
  ;; NOTE: Set these if Python 3 is called "python3" on your system!
  ;; (python-shell-interpreter "python3")
  ;; (dap-python-executable "python3")
  (dap-python-debugger 'debugpy)
  :config
  (require 'dap-python))

Для virtualenv можно использовать pyvenv. Чтобы запустить используйте pyvenv-activate.

GitHub: pyvenv GitHub: pyenv-mode

(use-package pyvenv
  :config
  (pyvenv-mode 1))

(use-package pyenv-mode
  ;; Integrate pyenv with Python-mode
  :hook (python-mode . pyenv-mode)
  :init
  (let ((pyenv-path (expand-file-name "~/.pyenv/bin")))
    (setenv "PATH" (concat pyenv-path ":" (getenv "PATH")))
    (add-to-list 'exec-path pyenv-path))
  :config
  (pyenv-mode))

CSharp

GitHub: csharp-mode, csproj-mode, dotnet

csproj-mode - Основной режим GNU Emacs для редактирования csproj ( .csproj, .vbproj) и других файлов проекта. dotnet - режим dotnet CLI для GNU Emacs

Перед использованиям убедитесь что у вас установлен языковой сервер omnisharp. Простой способ это сделать, открыть файл с расширением .cs и GNU Emacs сам предложит это сделать или M-x: lsp-install-server и выбрать нужный сервер.

(use-package csproj-mode)
(use-package dotnet)

(use-package csharp-mode
  :mode "\\.cs\\'"
  :hook ((csharp-mode . lsp-deferred)
	   (csharp-mode . dotnet-mode))
  :config
  (require 'dap-netcore))

Не смотря на то что пакет dotnet удобный и позволяет избегать написание одних и тех же команд в терминале, по какой то причине он не развивается и в нем есть недочеты.

Один из них, это не удобная работа с несколькими проектами. При первом запуске dotnet-run записывается путь к проекту и при изменения проекта путь остается прежним. Я добавил свою функцию чтобы обнулять dotnet-run-last-proj-dir, а после запускать команду dotnet-run.

(defun et/dotnet-run ()
  (interactive)
  (setq dotnet-run-last-proj-dir nil)
  (dotnet-run dotnet-run-last-proj-dir))

Company Mode

GitHub: company

Company - это фреймворк для автозавершения текста для GNU Emacs.

GitHub: company-box

Фирменный интерфейс с иконками.

(use-package company
  ;:after lsp-mode
  ;:hook (lsp-mode . company-mode)
  :hook (after-init . global-company-mode)
  :bind (:map company-active-map
         ("<tab>" . company-complete-selection))
        (:map lsp-mode-map
         ("<tab>" . company-indent-or-complete-common))
  :custom
  (company-minimum-prefix-length 1)
  (company-idle-delay 0.0))

(use-package company-box
  :hook (company-mode . company-box-mode))

Web mode

GitHub: web-mode

web-mode - это режим emacs для редактирования веб-шаблонов.

(use-package web-mode
  :mode (("\\.css$"  . web-mode)
         ("\\.html$" . web-mode)))

JSON

json-mode - режим GNU Emacs для обработки файлов JSON

GitHub: json-mode

(use-package json-mode
  :mode "\\.json\\'")

YAML

yaml-mode - режим GNU Emacs для обработки файлов YAML/YML

GitHub: yaml-mode

(use-package yaml-mode
  :mode (("\\.yml$"  . yaml-mode)
         ("\\.yaml$" . yaml-mode)))

Makefile

makefile-gmake-mode - режим GNU Emacs для обработки файлов Makefile

(use-package makefile-gmake-mode
  :mode  ("Makefile.*" . makefile-gmake-mode))

Buildsystem

Docker

Docker, режим для управления докером из GNU Emacs.

GitHub: docker

(use-package docker
  :bind ("C-c d" . docker))

Dockerfile Mode — режим GNU Emacs для обработки файлов Dockerfile.

GitHub: dockerfile-mode

(use-package dockerfile-mode)

Projectile

GitHub: projectile

Projectile - это библиотека взаимодействия с проектом для GNU Emacs.

Commands

commandkey / ex commanddescription
projectile-command-mapC-x p
projectile-find-fileC-x p fПоказать список всех файлов в проекте.
С аргументом префикса он сначала очистит кеш.
projectile-find-file-other-windowC-x p 4 fПерейти к файлу проекта с помощью
завершения и показать его в другом окне.
projectile-find-dirC-x p dПоказать список всех каталогов в проекте.
С аргументом префикса он сначала очистит кеш.
projectile-find-dir-other-windowC-x p 4 dПерейдите в каталог проекта и покажите его в другом окне.
projectile-switch-to-bufferC-x p bПоказать список всех буферов проекта, открытых в данный момент.
projectile-diredC-x p DОткрывает корень проекта в формате dired
projectile-kill-buffersC-x p kУбивает все буферы проекта.
projectile-recentfC-x p eПоказывает список недавно посещенных файлов проекта.
projectile-next-project-bufferC-x p leftПереключиться на предыдущий буфер проекта.
projectile-previous-project-bufferC-x p rightПереключиться на следующий буфер проекта.
projectile-run-shell-command-in-rootC-x p !Запускается shell-command в корневом каталоге проекта.
projectile-run-shellC-x p x sЗапускается shell.
projectile-save-project-bufferC-x p SСохраните все буферы проекта.
projectile-switch-projectC-x p pОтображение списка известных проектов

Полный список команд можно посмотреть по ссылке.

Settings

(use-package projectile
  :config
    (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map)
    (projectile-mode +1))

Magit

GitHub: magit

Magit - это интерфейс системы контроля версий Git.

Commands

commandkey / ex commanddescription
magit-statusC-x gсостояние репозитория (git status)
magit-stage-filesдобавить изменения в точке в промежуточную область (git add <file>)
magit-stage-modifiedSвнести все изменения в файлах, измененные в рабочем дереве (git add .)
magit-unstage-fileuудалить изменения в точке из промежуточной области (git restore –staged <file>)
magit-unstage-allUудалить все изменения из промежуточной области (git restore –staged .)
magit-commitcкоммит (git commit)
?открыть все команды magit

Settings

(use-package magit
  :bind (("C-x g" . #'magit-status)))

Rainbow Delimiters

GitHub: rainbow-delimiters

Полезно в режимах программирования, потому что раскрашивают вложенные круглые скобки в соответствии с их глубиной вложенности.

(use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))

Terminals

Eshell

Eshell — это собственная реализация оболочки GNU Emacs, написанная на GNU Emacs Lisp.

eshell-git-prompt - пакет предоставляет темы приглашения GNU Emacs Shell (Eshell).

GitHub: eshell-git-prompt

(defun et/configure-eshell ()
  ;; Save command history when commands are entered
  (add-hook 'eshell-pre-command-hook 'eshell-save-some-history)

  ;; Truncate buffer for performance
  (add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer)

  (setq eshell-history-size         10000
        eshell-buffer-maximum-lines 10000
        eshell-hist-ignoredups t
        eshell-scroll-to-bottom-on-input t))

(use-package eshell-git-prompt)

(use-package eshell
  :hook (eshell-first-time-mode . et/configure-eshell)
  :config
  (with-eval-after-load 'esh-opt
    (setq eshell-destroy-buffer-when-process-dies t)
    (setq eshell-visual-commands '("htop" "zsh" "vim")))

  (eshell-git-prompt-use-theme 'multiline2))