diff --git a/evil-collection.el b/evil-collection.el index 6995569..e7894f0 100644 --- a/evil-collection.el +++ b/evil-collection.el @@ -165,6 +165,7 @@ This will bind additional find-* type commands, e.g. usages, assignments, etc.." finder flycheck flymake + forge free-keys geiser ggtags @@ -239,6 +240,7 @@ This will bind additional find-* type commands, e.g. usages, assignments, etc.." robe rtags ruby-mode + scheme scroll-lock selectrum sh-script diff --git a/modes/eshell/evil-collection-eshell.el b/modes/eshell/evil-collection-eshell.el index c025878..6610ba4 100644 --- a/modes/eshell/evil-collection-eshell.el +++ b/modes/eshell/evil-collection-eshell.el @@ -1,6 +1,6 @@ ;;; evil-collection-eshell.el --- Evil bindings for Eshell -*- lexical-binding: t -*- -;; Copyright (C) 2017 Pierre Neidhardt +;; Copyright (C) 2017, 2021 Pierre Neidhardt ;; Author: Pierre Neidhardt ;; Maintainer: James Nguyen @@ -51,6 +51,12 @@ (eshell-interrupt-process) (evil-insert 1)) +(defun evil-collection-eshell-escape-stay () + "Go back to normal state but don't move cursor backwards. +Moving cursor backwards is the default Vim behavior but it is not +appropriate in some cases like terminals." + (setq-local evil-move-cursor-back nil)) + ;; Taken from Doom Emacs (evil-define-operator evil-collection-eshell-evil-change (beg end type register yank-handler delete-func) "Like `evil-change' but will not delete/copy the prompt." @@ -79,7 +85,10 @@ type register yank-handler))) ;; Taken from Doom Emacs -;; Although the BEG argument doesn't get used in any meaningful way, `evil-define-operator' must access it nonetheless, so putting an underscore in front will make the CI fail. +;; +;; Although the BEG argument doesn't get used in any meaningful way, +;; `evil-define-operator' must access it nonetheless, so putting an underscore +;; in front will make the CI fail. (evil-define-operator evil-collection-eshell-evil-delete-line (beg end type register yank-handler) "Change to end of line." :motion nil @@ -87,8 +96,8 @@ (interactive "") (evil-collection-eshell-evil-delete (point) end type register yank-handler)) -;;; `eshell-mode-map' is reset when Eshell is initialized in `eshell-mode'. We -;;; need to add bindings to `eshell-first-time-mode-hook'. +;; `eshell-mode-map' is reset when Eshell is initialized in `eshell-mode'. We +;; need to add bindings to `eshell-first-time-mode-hook'. (defun evil-collection-eshell-setup-keys () "Set up `evil' bindings for `eshell'." (evil-collection-define-key 'normal 'eshell-mode-map @@ -113,14 +122,11 @@ "C" 'evil-collection-eshell-evil-change-line "d" 'evil-collection-eshell-evil-delete "D" 'evil-collection-eshell-evil-delete-line) - (evil-collection-define-key 'insert 'eshell-mode-map - ;; motion - (kbd "M-h") 'eshell-backward-argument - (kbd "M-l") 'eshell-forward-argument) - ;; TODO: What if the user changes `evil-want-C-u-delete' after this is run? + (when evil-want-C-u-delete (evil-collection-define-key 'insert 'eshell-mode-map (kbd "C-u") 'eshell-kill-input)) + (evil-collection-define-key 'visual 'eshell-mode-map ;; motion ;; TODO: This does not work with `evil-visual-line'. @@ -137,6 +143,7 @@ ;;;###autoload (defun evil-collection-eshell-setup () "Set up `evil' bindings for `eshell'." + (add-hook 'eshell-mode-hook 'evil-collection-eshell-escape-stay) (add-hook 'eshell-mode-hook 'evil-collection-eshell-next-prompt-on-insert) (add-hook 'eshell-first-time-mode-hook 'evil-collection-eshell-setup-keys)) diff --git a/modes/forge/evil-collection-forge.el b/modes/forge/evil-collection-forge.el new file mode 100644 index 0000000..64186d5 --- /dev/null +++ b/modes/forge/evil-collection-forge.el @@ -0,0 +1,101 @@ +;;; evil-collection-forge.el --- Evil-based key bindings for forge + +;; Copyright (C) 2021 James Nguyen + +;; Author: James Nguyen +;; Maintainer: James Nguyen +;; Package-Requires: ((emacs "25.1") (evil "1.2.3")) +;; Homepage: https://github.com/emacs-evil/evil-collection +;; Version: 0.4.1 + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published +;; by the Free Software Foundation; either version 3, or (at your +;; option) any later version. +;; +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; For a full copy of the GNU General Public License +;; see . + +;;; Commentary: + +;; This library configures Magit and Evil to play well with each +;; other. For some background see: +;; https://github.com/emacs-evil/evil-collection/issues/543. + +;;; Code: + +(require 'evil-collection) +(require 'forge nil t) +(require 'transient nil t) + +(defcustom evil-collection-forge-use-y-for-yank t + "View `evil-collection-magit-state' for more information." + :group 'magit + :type 'boolean) + +(defcustom evil-collection-forge-state + (if evil-collection-forge-use-y-for-yank 'normal 'motion) + "State to use for forge." + :group 'magit + :type 'symbol) + +;;;###autoload +(defun evil-collection-forge-setup () + "Set up `evil' bindings for `magit'." + (let ((states (if evil-collection-forge-use-y-for-yank + `(,evil-collection-forge-state visual) + `(,evil-collection-forge-state)))) + (dolist (state states) + (evil-collection-define-key state 'magit-mode-map "@" 'forge-dispatch) + + (evil-collection-define-key + state 'magit-commit-section-map + [remap magit-browse-thing] 'forge-browse-dwim) + (evil-collection-define-key + state 'magit-remote-section-map + [remap magit-browse-thing] 'forge-browse-remote) + (evil-collection-define-key + state 'magit-branch-section-map + [remap magit-browse-thing] 'forge-browse-branch) + + (evil-collection-define-key + state 'magit-commit-section-map (kbd "C-c C-v") 'forge-visit-topic) + (evil-collection-define-key + state 'magit-branch-section-map (kbd "C-c C-v") 'forge-visit-topic))) + + ;; https://github.com/magit/forge/blob/master/lisp/forge.el + + (transient-append-suffix 'magit-dispatch "!" + '("@" "Forge" forge-dispatch)) ;; N -> @ + + (transient-append-suffix 'magit-fetch "m" + '("n" "forge topics" forge-pull)) + (transient-append-suffix 'magit-fetch "n" + '("N" "forge notifications" forge-pull-notifications)) + (transient-append-suffix 'magit-pull "m" + '("n" "forge topics" forge-pull)) + (transient-append-suffix 'magit-pull "n" + '("N" "forge notifications" forge-pull-notifications)) + (transient-append-suffix 'magit-branch "w" + '("n" "pull-request" forge-checkout-pullreq)) + (transient-append-suffix 'magit-branch "W" + '("N" "from pull-request" forge-branch-pullreq)) + (transient-append-suffix 'magit-worktree "c" + '("n" "pull-request worktree" forge-checkout-worktree)) + (transient-append-suffix 'magit-status-jump "w" + '("Np" "pull-requests" forge-jump-to-pullreqs)) + (transient-append-suffix 'magit-status-jump "Np" + '("Ni" "issues" forge-jump-to-issues)) + (transient-append-suffix 'magit-merge "a" + '(7 "M" "Merge using API" forge-merge))) + +;;; evil-collection-forge.el ends soon +(provide 'evil-collection-forge) +;; Local Variables: +;; End: +;;; evil-collection-forge.el ends here diff --git a/modes/magit/evil-collection-magit.el b/modes/magit/evil-collection-magit.el index 3f788b6..28eca6c 100644 --- a/modes/magit/evil-collection-magit.el +++ b/modes/magit/evil-collection-magit.el @@ -294,7 +294,6 @@ When this option is enabled, the stash popup is available on \"Z\"." (,states magit-mode-map "'" magit-submodule "o") (,states magit-mode-map "\"" magit-subtree "O") (,states magit-mode-map "=" magit-diff-less-context "-") - (,states magit-mode-map "@" forge-dispatch) (,states magit-mode-map "j" evil-next-line) (,states magit-mode-map "k" evil-previous-line) (,states magit-mode-map "gg" evil-goto-first-line) @@ -600,16 +599,6 @@ evil-collection-magit affects.") (unless evil-collection-magit-popup-keys-changed (dolist (change evil-collection-magit-popup-changes) (apply #'evil-collection-magit-change-popup-key change)) - (with-eval-after-load 'forge - ;; When `forge' is loaded, it maps `forge-dispatch' to ' key which is - ;; set for `magit-submodule', wiping it so we add it back after `forge' - ;; loads. - (transient-append-suffix 'magit-dispatch "M" - '("'" "Submodule" magit-submodule)) - ;; Clear `forge' key and re-add back in as "@". - (transient-remove-suffix 'magit-dispatch 'forge-dispatch) - (transient-append-suffix 'magit-dispatch "!" - '("@" "Forge" forge-dispatch))) (setq evil-collection-magit-popup-keys-changed t))) (defun evil-collection-magit-revert-popups () diff --git a/modes/mu4e/evil-collection-mu4e.el b/modes/mu4e/evil-collection-mu4e.el index f14f67b..0f6ead5 100644 --- a/modes/mu4e/evil-collection-mu4e.el +++ b/modes/mu4e/evil-collection-mu4e.el @@ -202,7 +202,7 @@ "ce" mu4e-compose-edit "cf" mu4e-compose-forward "cr" mu4e-compose-reply - "p" mu4e-view-save-attachment + "p" mu4e-view-save-attachments "P" mu4e-view-save-attachment-multi ; Since mu4e 1.0, -multi is same as normal. "O" mu4e-headers-change-sorting "A" mu4e-view-mime-part-action ; Since 1.6, uses gnus view by default diff --git a/modes/scheme/evil-collection-scheme.el b/modes/scheme/evil-collection-scheme.el new file mode 100644 index 0000000..cca713d --- /dev/null +++ b/modes/scheme/evil-collection-scheme.el @@ -0,0 +1,47 @@ +;;; evil-collection-scheme.el --- Evil bindings for scheme -*- lexical-binding: t -*- + +;; Copyright (C) 2021 Zhiwei Chen + +;; Author: Zhiwei Chen +;; Maintainer: James Nguyen +;; Pierre Neidhardt +;; URL: https://github.com/emacs-evil/evil-collection +;; Version: 0.0.1 +;; Package-Requires: ((emacs "25.1")) +;; Keywords: evil, lisp, languages + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: +;; Evil bindings for scheme. + +;;; Code: +(require 'evil-collection) + +(defconst evil-collection-scheme-maps '(scheme-mode-map)) + +(defun evil-collection-scheme-repl () + "Open the scheme REPL." + (interactive) + (pop-to-buffer (get-buffer-create "*scheme*")) + (call-interactively #'run-scheme)) + +;;;###autoload +(defun evil-collection-scheme-setup () + "Set up `evil' bindings for `scheme'." + (evil-collection-define-key 'normal 'scheme-mode-map + "gz" 'evil-collection-scheme-repl)) + +(provide 'evil-collection-scheme) +;;; evil-collection-scheme.el ends here