slackbuilds/magit-keys.el

316 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)
(define-key map (kbd "l") 'magit-log-menu)
(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)
(define-key map (kbd "l") 'magit-log-menu)
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-menu
'((logging
(?l "One line log" magit-log)
(?L "Detailed log" magit-log-long)
(?h "Reflog" magit-reflog)
(?H "Reflog head" magit-reflog-head)
(?a "--all" "All branches" magit-true)
(?g "--grep=" "Containing regexp" read-from-minibuffer)
(?A "--author=" "By author" read-from-minibuffer)
(?C "--committer=" "By committer" read-from-minibuffer)
(?F "--first-parent" "Follow only first parent" magit-true)
(?B "--branches=" "Branches" read-from-minibuffer)
(?R "--relative=" "Restrict to path" read-directory-name))
(branching
(?b "Switch" magit-checkout)
(?B "Create" magit-create-branch)
(?V "Show branches" magit-show-branches)
(?k "Delete" magit-delete-branch)
(?m "Move/Rename" magit-move-branch)
(?w "Wazzup" magit-wazzup)
(?T "--no-track" "Do not track remote parent branch" magit-true)
(?R "-r" "Consider remote-tracking branches" magit-true)
(?C "--contains" "Only branches that contain the given commit" magit-read-rev)
(?M "--merged" "Only branches merged into the given commit" magit-read-rev)
(?N "--no-merged" "Only branches not merged into the given commit" magit-read-rev))))
(defun magit-log-menu (&optional arg)
(interactive "P")
(magit-menu 'logging arg))
(defun magit-branch-menu (&optional arg)
(interactive "P")
(magit-menu 'branching arg))
(defvar magit-custom-options '()
"This variable is for internal use by the magit menu
functionality. Before executing a menu command, it is bound to
the list of arguments corresponding to the options setted by
the user on the menu.")
(magit-get-menu-options 'logging)
(defun magit-get-menu-options (group)
(let ((menu-items '()))
(dolist (item magit-menu)
(when (string= (car item) group)
(cond
((stringp (nth 3 item)) ;; It's an option
;; We append an extra cell to the item for storing the option's value:
(setq menu-items (append menu-items (list (append item (list nil))))))
((functionp (nth 3 item)) ;; It's a command
(setq menu-items (append menu-items (list item))))
(t (error "Unrecognised item type in `magit-menu': %S." item)))))
menu-items))
(defun magit-menu-insert-item (text highlight-p)
(let* ((item-width 35)
(max-items-perline 2)
(max-columns (window-width))
(begin)
(current-column (- (point) (line-beginning-position)))
(padding
(make-string (- item-width (mod (length text) item-width)) 32)))
(when (< max-columns (+ current-column (length text) (length padding)))
(insert "\n"))
(setq begin (point))
(insert text)
(when highlight-p
(put-text-property begin (point) 'face 'magit-menu-selected-option))
(insert padding)))
(defun magit-build-menu (group menu-items)
(erase-buffer)
(let ((s ""))
(insert group " variants\n")
(dolist (item menu-items)
(when (functionp (nth 3 item))
(setq s (concat (string (nth 1 item)) " " (nth 2 item)))
(magit-menu-insert-item s nil)))
(insert "\nOptions\n")
(dolist (item menu-items)
(let ((args (magit-menu-make-arguments-for-option item t)))
(when args
(setq s (concat (string (nth 1 item)) " " (nth 0 args)
" " (nth 1 args)))
(magit-menu-insert-item s (nth 5 item)))))
(insert "\n"))
(setq buffer-read-only nil)
(fit-window-to-buffer))
(defun magit-menu (group &optional prefix-arg)
(let ((magit-buf (current-buffer))
(menu-buf)
(menu-items (magit-get-menu-options group))
(prompt (concat (if prefix-arg (format "(prefix: %s) " prefix-arg))
"Command key (? for help): "))
(display-help-p)
(chosen-fn nil))
(save-window-excursion
(delete-other-windows)
(switch-to-buffer-other-window "*Magit Commands*" t)
(setq menu-buf (current-buffer))
(catch 'exit
(while t
(pop-to-buffer menu-buf)
(magit-build-menu group menu-items)
(let ((c (read-char-exclusive prompt))
(case-fold-search nil))
(cond
;; Bail out if the input is not a character (Meta-x etc):
((not (characterp c))
(throw 'exit 0))
((char-equal c ??)
(setq display-help-p t)
(setq prompt "Show help for command: "))
(t
(dolist (item menu-items)
(when (char-equal c (nth 1 item))
;; If a command, fn is a function.
;; If an option, fn is a string.
(setq fn (nth 3 item))
(cond
((and (stringp fn) display-help-p)
(message "No help for options!")
(sit-for 2))
((and (stringp fn) (nth 5 item))
(setcar (nthcdr 5 item) nil))
((stringp fn)
(setcar (nthcdr 5 item)
(funcall (nth 4 item) (concat (nth 2 item) ": "))))
(display-help-p
(setq chosen-fn fn)
(throw 'exit 0))
(t
(setq chosen-fn fn)
(throw 'exit 0))))))
(error "Invalid key: %c" c))))))
(when chosen-fn
(if display-help-p
(describe-function chosen-fn)
(setq current-prefix-arg prefix-arg)
(let ((magit-custom-options (magit-menu-make-option-list menu-items)))
(call-interactively chosen-fn))))))
(defun magit-menu-make-arguments-for-option (item &optional all-p)
"Returns as a cons cell the arguments for the git process
depending on the contents of `item'. If the option was not set,
returns nil, unless `all-p' evals to true."
(let* ((option (nth 2 item))
(value (nth 5 item))
(join-valuep
(and (stringp value)
(string= "=" (substring option (- (length option) 1))))))
(when (and (stringp (nth 3 item)) (or value all-p))
(cons (concat option (when join-valuep value))
(when (and (stringp value) (not join-valuep)) value)))))
(defun magit-menu-make-option-list (menu-items)
(let ((result '()))
(dolist (item menu-items)
(setq result (append result (magit-menu-make-arguments-for-option item))))
result))
(provide 'magit-keys)