diff options
Diffstat (limited to 'rekado-mode.el')
-rw-r--r-- | rekado-mode.el | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/rekado-mode.el b/rekado-mode.el new file mode 100644 index 0000000..72c794a --- /dev/null +++ b/rekado-mode.el @@ -0,0 +1,147 @@ +;; ---------------- rekado minor mode -------------------- +(defvar rekado-permanent-mode-q nil "indicates whether permanent keys are active") +(defvar rekado-mode-map (make-sparse-keymap) "keymap for rekado-mode") +(defun rekado-mode-define-keys (define-permanent-keys) + "Defines key bindings for rekado-mode. If the argument is t, +the edit mode keys will be bound as well." + (let* ((modal-keys + '( + ("a" . move-beginning-of-line) + ("e" . move-end-of-line) + + ;; define JKLI (HTNC in Dvorak) as arrow keys + ("c" . previous-line) + ("t" . next-line) + ("h" . backward-char) + ("n" . forward-char) + + ;; add meta key to move more quickly + ("M-c" . (lambda () (interactive) + (previous-line 5))) + ("M-t" . (lambda () (interactive) + (next-line 5))) + ("M-h" . (lambda () (interactive) + (backward-char 5))) + ("M-n" . (lambda () (interactive) + (forward-char 5))) + + ;; define u/o (g/r in Dvorak) as backward/forward-word + ("g" . backward-word) + ("r" . forward-word) + ;; define U/O (G/R in Dvorak) to kill word in direction + ("G" . backward-kill-word) + ("R" . kill-word) + + ;; TODO: add advice for C, T, H and N (upper case arrows in Dvorak) to mark and start selection + ;; jump to character + ("f" . ace-jump-char-mode) + ("i" . rekado-permanent-mode-exit) + ("k" . (lambda () + (interactive) + (move-beginning-of-line nil) + (kill-whole-line))) + ;; undo as in vim + ("u" . undo) + ;; repeat as in vim + ("." . repeat) + ;; paste as in vim + ("p" . (lambda () + (interactive) + (next-line) + (beginning-of-line) + (yank))) + ("P" . (lambda () + (interactive) + (beginning-of-line) + (yank))) + ;; copy as in vim + ("y" . kill-ring-save) + ("s" . isearch-forward-regexp) + ;; open line below/above as in vim + ("o" . (lambda () + (interactive) + (open-line-below) + (rekado-permanent-mode-exit))) + ("O" . (lambda () + (interactive) + (open-line-above) + (rekado-permanent-mode-exit))) + ;; join lines (like J in vim) + ("j" . (lambda () + (interactive) + (join-line -1))) + ;; change till the end of the line + ("C" . (lambda () + (interactive) + (kill-line) + (rekado-permanent-mode-exit))) + ))) + (progn + ;; toggle permanent mode + (define-key rekado-mode-map + (kbd "<C-return>") + 'rekado-permanent-mode-toggle) + + ;; toggle permanent mode + (define-key rekado-mode-map + (kbd "<M-SPC>") + 'rekado-permanent-mode-toggle) + + (if define-permanent-keys + ;; define permanent keys + (progn + (setq rekado-permanent-mode-q t) + (mapc (lambda (pair) + (define-key rekado-mode-map + (kbd (car pair)) + (cdr pair))) + modal-keys)) + ;; undefine permanent keys + (progn + (setq rekado-permanent-mode-q nil) + (mapc (lambda (pair) + (define-key rekado-mode-map + (kbd (car pair)) + nil)) + modal-keys))))) + rekado-mode-map) + +(defun open-line-below () + (interactive) + (end-of-line) + (newline) + (indent-for-tab-command)) + +(defun open-line-above () + (interactive) + (beginning-of-line) + (newline) + (forward-line -1) + (indent-for-tab-command)) + +(defun rekado-permanent-mode-exit () + (interactive) + (set-cursor-color "White") + (rekado-mode-define-keys nil)) + +(defun rekado-permanent-mode-toggle () + (interactive) + (if rekado-permanent-mode-q + (rekado-permanent-mode-exit) + (progn + (set-cursor-color "Red") + (rekado-mode-define-keys 1)))) + +;; disable permanent keys when in the minibuffer (also when running +;; commands such as isearch) +(add-hook 'post-command-hook (lambda () (if (minibufferp) (rekado-permanent-mode-exit)))) + +(define-minor-mode rekado-mode + "Cursor movement shortcuts while Alt is hold and editing +shortcuts when permanent mode is active." + :lighter " rekado" + :global t + :keymap rekado-mode-map + :after-hook (rekado-mode-define-keys nil)) + +(provide 'rekado-mode) |