Делюсь опытом в описанных технологиях. Блог в первую очередь выполняет роль памяток для меня самого.

Хоткеи в EMACS

Комментариев нет
Запись была обновлена 11.09.2016 г. Исправлены ошибки в разметке, из-за которых не выводились на экран некоторые элементы кода.

Основы

Я долгое время пользовался пакетом ergoemacs и был доволен, однако, со временем он стал обрастать функциями, которые мне стали не нужны, а иногда откровенно глючили на моём самосборном EMACS'е. Пришлось изучить, как настраиваются хоткеи в редакторе.

Во-первых, вместо привычных Ctrl, Alt и Shift в EMACS для обозначения модификаторов используются другие значения:

C Ctrl
M Alt
S Shift

Ни в одном руководстве по EMACS вы не найдете записи типа Ctrl+S - там будет написано C-S, хотя по сути эти две записи идентичны.

Во-вторых, клавиши, которые нажимаются вместе, записываются через дефис.

Третье, регистр имеет значение.

Последнее, что нужно знать о клавиатурных комбинациях EMACS - некоторые команды состоят из последовательного нажатия разных клавиатурных комбинаций, например, выход из редактора выглядит так: C-x C-c, что означает следующее:

  • Сначала нажимаем Ctrl+X
  • Теперь нажимаем Ctrl+C

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

К делу!

Перед тем, как использовать какую-либо клавиатурную комбинацию, следует убедиться, что она уже не привязана к какому-либо действию, либо освободить её от этой привязки. Ниже показано, как удалить привязку команды к комбинации и тут же связать её с новой командой:

(global-unset-key (kbd "C-S-c C-S-c"))
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
Обратите внимание, что привязывать к комбинациям следует только те команды, про которые "знает" EMACS, иначе при запуске он будет выдавать ошибки в конфигурации.

С простыми клавишами разобрались, добавим функциональные:

(require 'neotree)
(require 'ibuffer)
(require 'magit)
(require 'dired)

(global-set-key [f2] 'ibuffer)
(global-set-key [f3] 'dired)
(global-set-key [f8] 'neotree-toggle)
(global-set-key [f10] 'magit-status)

Теперь посмотрим, как описываются стрелки:

;; Resize windows
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<down>") 'shrink-window)
(global-set-key (kbd "S-C-<up>") 'enlarge-window)

Можно ли сделать с полученными знаниями что-то полезное? Да! Давайте удалим ergoemacs и начнем вместо него использовать свои собственные комбинации!

;;; Package --- Summary
;;; Commentary:
;;; Keybindings for non-latin layout

;;; Code:

(setq initial-major-mode (quote text-mode))

(defun cfg:reverse-input-method (input-method)
  "Build the reverse mapping of single letters from INPUT-METHOD."
  (interactive
   (list (read-input-method-name "Use input method (default current): ")))
  (if (and input-method (symbolp input-method))
      (setq input-method (symbol-name input-method)))
  (let ((current current-input-method)
        (modifiers '(nil (control) (meta) (control meta))))
    (when input-method
      (activate-input-method input-method))
    (when (and current-input-method quail-keyboard-layout)
      (dolist (map (cdr (quail-map)))
        (let* ((to (car map))
               (from (quail-get-translation
                      (cadr map) (char-to-string to) 1)))
          (when (and (characterp from) (characterp to))
            (dolist (mod modifiers)
              (define-key local-function-key-map
                (vector (append mod (list from)))
                (vector (append mod (list to)))))))))
    (when input-method
      (activate-input-method current))))

(cfg:reverse-input-method 'russian-computer)

(require 'neotree)
(require 'ibuffer)
(require 'magit)
(require 'dired)

(global-set-key [f2] 'ibuffer)
(global-set-key [f3] 'dired)
(global-set-key [f8] 'neotree-toggle)
(global-set-key [f10] 'magit-status)

;; Multiple cursors
(global-unset-key (kbd "C-S-c C-S-c"))
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)

;; Resize windows
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<down>") 'shrink-window)
(global-set-key (kbd "S-C-<up>") 'enlarge-window)

(defun xah-new-empty-buffer ()
  "Open a new empty buffer.
URL `http://ergoemacs.org/emacs/emacs_new_empty_buffer.html'
Version 2015-06-12"
  (interactive)
  (let ((ξbuf (generate-new-buffer "untitled")))
    (switch-to-buffer ξbuf)
    (funcall (and initial-major-mode))
    (setq buffer-offer-save t)))

;; Save/close/open
(global-set-key (kbd "C-w") 'kill-this-buffer)
(global-set-key (kbd "C-s") 'save-buffer)
(global-set-key (kbd "C-S-s") 'write-file)
(global-set-key (kbd "C-r") 'revert-buffer)
(global-set-key (kbd "C-a") 'mark-whole-buffer)
(global-set-key (kbd "M-'") 'comment-or-uncomment-region)
(global-set-key (kbd "C-o") 'dired)
(global-set-key (kbd "C-n") 'xah-new-empty-buffer)
(global-set-key (kbd "C-+") 'text-scale-increase)
(global-set-key (kbd "C--") 'text-scale-decrease)

;; Buffers and windows
(global-set-key (kbd "C-<next>") 'next-buffer)
(global-set-key (kbd "C-<prior>") 'previous-buffer)
(global-set-key (kbd "C-<tab>") 'other-window)

(global-set-key (kbd "M-3") 'delete-other-windows)
(global-set-key (kbd "M-4") 'split-window-horizontally)
(global-set-key (kbd "M-5") 'split-window-vertically)
(global-set-key (kbd "M-6") 'balance-windows)

(global-set-key (kbd "C-f") 'isearch-forward)
(global-set-key (kbd "C-h") 'query-replace)
(global-set-key (kbd "C-S-h") 'query-replace-regexp)

(global-set-key (kbd "M-a") 'execute-extended-command)
(global-set-key (kbd "M-x") 'kill-whole-line)
(global-set-key (kbd "<esc>") 'keyboard-quit)

(setq x-select-enable-clipboard t)

;; Highlight search resaults
(setq search-highlight        t)
(setq query-replace-highlight t)

;;; keyboard.el ends here

У меня конфигурация разбита на несколько маленьких файлов, и я привёл целиком содержимое keyboard.el. Полагаю, не проблема выбросить ненужное и оставить нужное. Большая часть команд будет работать без установки дополнительных пакетов.

Комментариев нет :

Отправить комментарий