slackbuilds/magit-key-mode.el

331 lines
13 KiB
EmacsLisp
Raw Normal View History

(defvar magit-mode-map
(let ((map (make-keymap)))
(suppress-keymap map t)
(define-key map (kbd "n") 'magit-goto-next-section)
(define-key map (kbd "p") 'magit-goto-previous-section)
(define-key map (kbd "TAB") 'magit-toggle-section)
(define-key map (kbd "<backtab>") 'magit-expand-collapse-section)
(define-key map (kbd "1") 'magit-show-level-1)
(define-key map (kbd "2") 'magit-show-level-2)
(define-key map (kbd "3") 'magit-show-level-3)
(define-key map (kbd "4") 'magit-show-level-4)
(define-key map (kbd "M-1") 'magit-show-level-1-all)
(define-key map (kbd "M-2") 'magit-show-level-2-all)
(define-key map (kbd "M-3") 'magit-show-level-3-all)
(define-key map (kbd "M-4") 'magit-show-level-4-all)
(define-key map (kbd "M-h") 'magit-show-only-files)
(define-key map (kbd "M-H") 'magit-show-only-files-all)
(define-key map (kbd "M-s") 'magit-show-level-4)
(define-key map (kbd "M-S") 'magit-show-level-4-all)
(define-key map (kbd "<M-left>") 'magit-goto-parent-section)
(define-key map (kbd "g") 'magit-refresh)
(define-key map (kbd "G") 'magit-refresh-all)
(define-key map (kbd "?") 'magit-describe-item)
(define-key map (kbd "!") 'magit-shell-command)
(define-key map (kbd ":") 'magit-git-command)
(define-key map (kbd "RET") 'magit-visit-item)
(define-key map (kbd "SPC") 'magit-show-item-or-scroll-up)
(define-key map (kbd "DEL") 'magit-show-item-or-scroll-down)
(define-key map (kbd "C-w") 'magit-copy-item-as-kill)
(define-key map (kbd "R") 'magit-rebase-step)
(define-key map (kbd "r s") 'magit-rewrite-start)
(define-key map (kbd "r t") 'magit-rewrite-stop)
(define-key map (kbd "r a") 'magit-rewrite-abort)
(define-key map (kbd "r f") 'magit-rewrite-finish)
(define-key map (kbd "r *") 'magit-rewrite-set-unused)
(define-key map (kbd "r .") 'magit-rewrite-set-used)
(define-key map (kbd "P") 'magit-push)
(define-key map (kbd "f") 'magit-remote-update)
(define-key map (kbd "F") 'magit-pull)
(define-key map (kbd "c") 'magit-log-edit)
2010-08-31 19:14:42 +02:00
(define-key map (kbd "l") (lambda () (interactive) (magit-key-mode 'logging)))
(define-key map (kbd "$") 'magit-display-process)
(define-key map (kbd "E") 'magit-interactive-rebase)
(define-key map (kbd "q") 'quit-window)
map))
(defvar magit-commit-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
map))
(defvar magit-status-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "-") 'magit-diff-smaller-hunks)
(define-key map (kbd "+") 'magit-diff-larger-hunks)
(define-key map (kbd "0") 'magit-diff-default-hunks)
(define-key map (kbd "s") 'magit-stage-item)
(define-key map (kbd "S") 'magit-stage-all)
(define-key map (kbd "u") 'magit-unstage-item)
(define-key map (kbd "U") 'magit-unstage-all)
(define-key map (kbd "i") 'magit-ignore-item)
(define-key map (kbd "I") 'magit-ignore-item-locally)
(define-key map (kbd ".") 'magit-mark-item)
(define-key map (kbd "=") 'magit-diff-with-mark)
(define-key map (kbd "d") 'magit-diff-working-tree)
(define-key map (kbd "D") 'magit-diff)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
(define-key map (kbd "b") 'magit-branch-menu)
(define-key map (kbd "m") 'magit-manual-merge)
(define-key map (kbd "M") 'magit-automatic-merge)
(define-key map (kbd "k") 'magit-discard-item)
(define-key map (kbd "e") 'magit-interactive-resolve-item)
(define-key map (kbd "C") 'magit-add-log)
(define-key map (kbd "x") 'magit-reset-head)
(define-key map (kbd "X") 'magit-reset-working-tree)
(define-key map (kbd "t") 'magit-tag)
(define-key map (kbd "T") 'magit-annotated-tag)
(define-key map (kbd "z") 'magit-stash)
(define-key map (kbd "Z") 'magit-stash-snapshot)
map))
(defvar magit-stash-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "-") 'magit-diff-smaller-hunks)
(define-key map (kbd "+") 'magit-diff-larger-hunks)
(define-key map (kbd "0") 'magit-diff-default-hunks)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
map))
(defvar magit-log-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd ".") 'magit-mark-item)
(define-key map (kbd "=") 'magit-diff-with-mark)
(define-key map (kbd "d") 'magit-diff-working-tree)
(define-key map (kbd "D") 'magit-diff)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "s") 'magit-log-grep)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
(define-key map (kbd "b") 'magit-branch-menu)
(define-key map (kbd "m") 'magit-manual-merge)
(define-key map (kbd "M") 'magit-automatic-merge)
(define-key map (kbd "x") 'magit-reset-head)
(define-key map (kbd "e") 'magit-log-show-more-entries)
2010-08-31 19:14:42 +02:00
(define-key map (kbd "l") (lambda () (interactive) (magit-key-mode 'logging)))
map))
(defvar magit-reflog-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd ".") 'magit-mark-item)
(define-key map (kbd "=") 'magit-diff-with-mark)
(define-key map (kbd "d") 'magit-diff-working-tree)
(define-key map (kbd "D") 'magit-diff)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
(define-key map (kbd "x") 'magit-reset-head)
map))
(defvar magit-diff-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "-") 'magit-diff-smaller-hunks)
(define-key map (kbd "+") 'magit-diff-larger-hunks)
(define-key map (kbd "0") 'magit-diff-default-hunks)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
map))
(defvar magit-wazzup-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd ".") 'magit-mark-item)
(define-key map (kbd "=") 'magit-diff-with-mark)
(define-key map (kbd "d") 'magit-diff-working-tree)
(define-key map (kbd "D") 'magit-diff)
(define-key map (kbd "a") 'magit-apply-item)
(define-key map (kbd "A") 'magit-cherry-pick-item)
(define-key map (kbd "v") 'magit-revert-item)
(define-key map (kbd "b") 'magit-branch-menu)
(define-key map (kbd "m") 'magit-manual-merge)
(define-key map (kbd "M") 'magit-automatic-merge)
(define-key map (kbd "x") 'magit-reset-head)
(define-key map (kbd "i") 'magit-ignore-item)
map))
(defvar magit-key-mode-key-maps '()
"This will be filled lazily with proper `define-key' built
keymaps as they're reqeusted.")
2010-08-31 09:42:21 +02:00
(defvar magit-key-mode-buf-name "*magit-key*"
"Name of the buffer.")
(defvar magit-key-mode-groups
'((logging
(actions
("l" "One line log" magit-log)
("L" "Long log" magit-log-long)
("h" "Reflog" magit-reflog)
2010-08-31 09:42:21 +02:00
("H" "Reflog on head" magit-reflog-head))
(switches
2010-08-31 13:16:23 +02:00
("-f" "First parent" "--first-parent")
2010-08-31 19:53:37 +02:00
("-a" "All" "--all"))
(arguments
("-g" "Grep" "--grep" read-from-minibuffer))))
2010-08-31 00:06:29 +02:00
"Holds the key, help, function mapping for the log-mode. If you
modify this make sure you reset `magit-key-mode-key-maps' to
nil.")
2010-08-31 00:28:52 +02:00
(defun magit-key-mode-options-for-group (for-group)
(or (cdr (assoc for-group magit-key-mode-groups))
(error "Unknown group '%s'" for-group)))
(defun magit-key-mode-build-keymap (for-group)
"Construct a normal looking keymap for the key mode to use and
put it in magit-key-mode-key-maps for fast lookup."
2010-08-31 00:28:52 +02:00
(let* ((options (magit-key-mode-options-for-group for-group))
(actions (cdr (assoc 'actions options)))
2010-08-31 09:42:21 +02:00
(switches (cdr (assoc 'switches options)))
2010-08-31 19:53:37 +02:00
(arguments (cdr (assoc 'arguments options))))
2010-08-30 23:50:57 +02:00
(let ((map (make-sparse-keymap)))
2010-08-31 00:28:52 +02:00
;; all maps should 'quit' with C-g
(define-key map (kbd "C-g") (lambda ()
(interactive)
(with-magit-key-mode-command
t)))
2010-08-30 23:50:57 +02:00
(when actions
(dolist (k actions)
2010-08-31 09:42:21 +02:00
(define-key map (car k) `(lambda ()
(interactive)
(with-magit-key-mode-command
(funcall ',(nth 2 k)))))))
(when switches
(dolist (k switches)
(define-key map (car k) `(lambda ()
2010-08-31 13:16:23 +02:00
(interactive)
(magit-key-mode-add-option
',for-group
,(nth 2 k))))))
2010-08-31 19:53:37 +02:00
(when arguments
(dolist (k arguments)
(define-key map (car k) `(lambda ()
(interactive)
(magit-key-mode-add-argument
',for-group
,(nth 2 k))))))
2010-08-31 09:42:21 +02:00
(aput 'magit-key-mode-key-maps for-group map)
2010-08-30 23:50:57 +02:00
map)))
2010-08-31 09:42:21 +02:00
(defvar magit-key-mode-current-options '()
"Current option set (which will eventually make it to the git
command-line).")
2010-08-31 00:45:51 +02:00
(defvar magit-key-mode-header-re
2010-08-31 19:53:37 +02:00
(rx line-start (| "Actions" "Switches" "Arguments") ":"))
2010-08-31 00:45:51 +02:00
(defvar magit-key-mode-action-re
(rx line-start
(char space)
(group
2010-08-31 19:37:50 +02:00
(* "-")
(char alpha))
2010-08-31 00:45:51 +02:00
": "
(group
(* not-newline))))
(defvar magit-key-mode-font-lock-keywords
(list
(list magit-key-mode-header-re 0 'font-lock-keyword-face)
2010-08-31 09:42:21 +02:00
(list magit-key-mode-action-re '(1 font-lock-builtin-face))))
(defmacro with-magit-key-mode-command (&rest body)
(set-window-configuration magit-log-mode-window-conf)
`(let ((magit-custom-options magit-key-mode-current-options))
2010-08-31 09:42:21 +02:00
,@body
(magit-key-mode-kill-buffer)))
2010-08-31 00:45:51 +02:00
(defun magit-key-mode-add-argument (for-group option-name))
2010-08-31 19:53:37 +02:00
2010-08-31 09:42:21 +02:00
(defun magit-key-mode-add-option (for-group option-name)
"Toggles the appearance of OPTION-NAME in
`magit-key-mode-current-options'."
(if (not (member option-name magit-key-mode-current-options))
(add-to-list 'magit-key-mode-current-options option-name)
(setq magit-key-mode-current-options
(delete option-name magit-key-mode-current-options)))
(magit-key-mode-redraw for-group))
2010-08-31 00:45:51 +02:00
2010-08-31 09:42:21 +02:00
(defun magit-key-mode-kill-buffer ()
2010-08-31 19:15:05 +02:00
(interactive)
2010-08-31 09:42:21 +02:00
(kill-buffer magit-key-mode-buf-name))
(defvar magit-log-mode-window-conf nil
"Pre-popup window configuration.")
2010-08-31 09:42:21 +02:00
(defun magit-key-mode (for-group &optional original-opts)
2010-08-31 19:38:44 +02:00
"Mode for magit key selection."
(interactive)
2010-08-31 22:48:06 +02:00
;; save the window config to restore it as was (no need to make this
;; buffer local)
(setq magit-log-mode-window-conf
(current-window-configuration))
;; setup the mode, draw the buffer
2010-08-31 09:42:21 +02:00
(let ((buf (get-buffer-create magit-key-mode-buf-name)))
(pop-to-buffer buf)
(kill-all-local-variables)
(set (make-variable-buffer-local
'magit-key-mode-current-options)
original-opts)
(magit-key-mode-redraw for-group)))
2010-08-31 09:42:21 +02:00
(defun magit-key-mode-redraw (for-group)
2010-08-31 19:38:44 +02:00
"(re)draw the magit key buffer."
2010-08-31 09:42:21 +02:00
(let ((buffer-read-only nil))
(erase-buffer)
(make-local-variable 'font-lock-defaults)
(setq font-lock-defaults
'(magit-key-mode-font-lock-keywords t nil nil nil))
(use-local-map
(or (cdr (assoc for-group magit-key-mode-key-maps))
(magit-key-mode-build-keymap for-group)))
(magit-key-mode-draw for-group)
2010-08-31 19:38:08 +02:00
(setq mode-name "magit-key-mode" major-mode 'magit-key-mode))
(setq buffer-read-only t)
(fit-window-to-buffer))
2010-08-31 00:28:52 +02:00
(defun magit-key-mode-draw (for-group)
2010-08-31 00:45:51 +02:00
"Function used to draw actions, switches and parameters."
2010-08-31 00:28:52 +02:00
(let* ((options (magit-key-mode-options-for-group for-group))
2010-08-31 09:42:21 +02:00
(switches (cdr (assoc 'switches options)))
2010-08-31 19:53:37 +02:00
(arguments (cdr (assoc 'arguments options)))
2010-08-31 00:28:52 +02:00
(actions (cdr (assoc 'actions options))))
(insert "Actions:\n")
(dolist (action actions)
(insert
2010-08-31 09:42:21 +02:00
(concat " " (car action) ": " (nth 1 action) "\n")))
(insert "Switches:\n")
(dolist (switch switches)
(let ((option (nth 2 switch)))
(insert
(concat
" "
(car switch)
": "
(nth 1 switch)
" ("
(if (member option magit-key-mode-current-options)
(propertize option 'font-lock-face 'font-lock-warning-face)
option)
2010-08-31 19:53:37 +02:00
")\n"))))
(insert "Arguments:\n")
(dolist (argument arguments)
(insert
(concat
" "
(car argument)
": "
(nth 1 argument)
" ("
(nth 2 argument)
")\n")))))
2010-08-31 00:28:52 +02:00
2010-08-31 09:42:21 +02:00
(provide 'magit-key-mode)