Skip to content

Instantly share code, notes, and snippets.

@11111000000
Last active September 14, 2025 12:51
Show Gist options
  • Select an option

  • Save 11111000000/0cf598388678e550c55cb8a4d816574c to your computer and use it in GitHub Desktop.

Select an option

Save 11111000000/0cf598388678e550c55cb8a4d816574c to your computer and use it in GitHub Desktop.
Как сделать удобно в Emacs пользователю Винды
  • Включите CUA и привычное выделение: они дадут Ctrl+C/X/V, Shift+стрелки, замену выделенного при печати, правый клик — меню.
  • Добавьте небольшой глобальный minor-mode, который привяжет “виндовые” сочетания: Ctrl+Z, Ctrl+Shift+Z, Ctrl+S, Ctrl+Shift+S, Ctrl+O, Ctrl+Tab, Ctrl+F4, Alt+F4, Ctrl+колёсико масштаб и т.д.
  • Потенциально спорные переназначения (например, Ctrl+S на “Сохранить”, а не “Поиск”) можно включить опционально.
  • Быстрый старт
;; 1) Базовая “Windows”-поведенка
(cua-mode 1)                        ;; Ctrl+C/X/V, прямоугольники и т.п.
(delete-selection-mode 1)           ;; печать заменяет выделение
(setq shift-select-mode t)          ;; Shift+стрелки = расширять выделение
(when (fboundp 'context-menu-mode)  ;; ПКМ-меню как в GUI-редакторах (Emacs 28+)
  (context-menu-mode 1))

;; 2) Удобства с колесиком (как в браузерах/IDE)
(global-set-key (kbd "<C-wheel-up>")   #'text-scale-increase)
(global-set-key (kbd "<C-wheel-down>") #'text-scale-decrease)
(global-set-key (kbd "C-=")            #'text-scale-increase)
(global-set-key (kbd "C--")            #'text-scale-decrease)
(global-set-key (kbd "C-0")            (lambda () (interactive) (text-scale-set 0)))

;; 3) Слова по Ctrl+Backspace/Delete (как в Windows)
(global-set-key (kbd "C-<backspace>") #'backward-kill-word)
(global-set-key (kbd "C-<delete>")    #'kill-word)
  • Полный профиль: Windows‑friendly minor mode (вкл/выкл одной командой)
(defgroup windows-friendly nil
  "Windows-like key UX."
  :group 'convenience)

(defcustom windows-friendly-rebind-C-s/save t
  "Переназначать C-s на save-buffer (сместив поиск на C-f)."
  :type 'boolean :group 'windows-friendly)

(defcustom windows-friendly-rebind-C-y-to-redo nil
  "Делать Ctrl+Y = Redo (по умолчанию C-y в Emacs — paste/yank)."
  :type 'boolean :group 'windows-friendly)

(defcustom windows-friendly-rebind-C-a-select-all nil
  "Делать Ctrl+A = Выделить всё (по умолчанию C-a — начало строки)."
  :type 'boolean :group 'windows-friendly)

(defvar windows-friendly-keys-mode-map
  (let ((m (make-sparse-keymap)))
    ;; Undo / Redo
    (define-key m (kbd "C-z")    #'undo)
    (when (fboundp 'undo-redo)
      (define-key m (kbd "C-S-z") #'undo-redo))   ;; стандартно в Windows
    ;; Открыть / Сохранить / Сохранить как
    (define-key m (kbd "C-o")    #'find-file)
    (when windows-friendly-rebind-C-s/save
      (define-key m (kbd "C-s")    #'save-buffer)
      (define-key m (kbd "C-S-s")  #'write-file)
      ;; Поиск/Замена на знакомых клавишах
      (define-key m (kbd "C-f")    #'isearch-forward)
      (define-key m (kbd "C-S-f")  #'query-replace))
    ;; Закрыть текущий “таб”/буфер и приложение
    (define-key m (kbd "<C-f4>")   #'kill-current-buffer)
    (define-key m (kbd "<M-f4>")   #'save-buffers-kill-emacs)
    ;; Переключение вкладок/окон как Ctrl+Tab / Ctrl+Shift+Tab
    (define-key m (kbd "<C-tab>")        #'other-window)
    (define-key m (kbd "<C-S-tab>")      (lambda () (interactive) (other-window -1)))
    (define-key m (kbd "<C-S-iso-lefttab>")
      (lambda () (interactive) (other-window -1))) ;; совместимость на X11
    ;; Полноэкранный режим на F11
    (define-key m (kbd "<f11>")    #'toggle-frame-fullscreen)
    m))

(define-minor-mode windows-friendly-keys-mode
  "Глобальный режим с Windows-подобными клавишами."
  :global t
  :keymap windows-friendly-keys-mode-map
  (if windows-friendly-keys-mode
      (progn
        ;; Базовая привычная поведенка
        (cua-mode 1)
        (delete-selection-mode 1)
        (setq shift-select-mode t)
        (when (fboundp 'context-menu-mode) (context-menu-mode 1))
        ;; Опциональные горячие
        (when (and (fboundp 'undo-redo) windows-friendly-rebind-C-y-to-redo)
          (global-set-key (kbd "C-y") #'undo-redo))
        (when windows-friendly-rebind-C-a-select-all
          (global-set-key (kbd "C-a") #'mark-whole-buffer)))
    ;; Отключаем опциональные переназначения аккуратно
    (when (and (fboundp 'undo-redo) windows-friendly-rebind-C-y-to-redo)
      (global-unset-key (kbd "C-y")))
    (when windows-friendly-rebind-C-a-select-all
      (global-unset-key (kbd "C-a")))))

;; Включить сразу
(windows-friendly-keys-mode 1)
  • Что вы получите по умолчанию
  • Редактирование
    • Ctrl+C / Ctrl+X / Ctrl+V — копировать/вырезать/вставить (cua-mode).
    • Shift+стрелки — выделение; печать заменяет выделение.
    • Ctrl+Backspace / Ctrl+Delete — удалять слово влево/вправо.
  • Поиск/замена и файлы
    • Ctrl+O — открыть.
    • Ctrl+S — сохранить, Ctrl+Shift+S — “Сохранить как” (если включен rebind).
    • Ctrl+F — поиск, Ctrl+Shift+F — заменить (если включен rebind).
  • Отмена/повтор
    • Ctrl+Z — Undo; Ctrl+Shift+Z — Redo. Опционально Ctrl+Y — Redo.
  • Навигация и окна
    • Ctrl+Tab / Ctrl+Shift+Tab — следующее/предыдущее окно (как вкладки).
    • Ctrl+F4 — закрыть буфер; Alt+F4 — выйти (с предложением сохранить).
    • F11 — полноэкранный режим.
  • Масштаб
    • Ctrl+колёсико — увеличить/уменьшить.
    • Ctrl+= / Ctrl+- / Ctrl+0 — увеличить/уменьшить/сбросить масштаб.
  • Замечания и советы
  • Переназначение Ctrl+S под “Сохранить” конфликтует со стандартным Emacs-поиском на C-s. Включайте эту опцию, если цель — максимально “виндовое” поведение. Поиск будет на Ctrl+F.
  • Ctrl+Y как Redo может мешать привычному Emacs “yank” (вставке). В Windows-профиле это логично, но по умолчанию я оставил выключенным.
  • Если вам больше нравится, чтобы Ctrl+Tab переключал не окна, а буферы, замените other-window на next-buffer/previous-buffer.
  • Правая клавиша мыши: context-menu-mode даёт контекстное меню “как в IDE”.
  • Home/End, PageUp/PageDown и Shift‑Home/End обычно работают из коробки как ожидается в GUI Emacs.
  • Хочется ещё более “IDE‑подобно”?
  • Подписи сочетаний клавиш: пакет which-key делает подсказки во всплывающем окне.
  • Переключение между окнами “умнее”: ace-window на Alt+O
  • Командная палитра: M-x уже есть, но можно повесить на Ctrl+Shift+P.
  • Откат к классике Emacs
  • Выключите режим: M-x windows-friendly-keys-mode.
  • Или точечно снимите спорные биндинги, поменяв значения переменных windows-friendly-rebind-/ перед (windows-friendly-keys-mode 1).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment