[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/evil-iedit-state 76a8967a41 02/32: Version 1.0
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/evil-iedit-state 76a8967a41 02/32: Version 1.0 |
Date: |
Mon, 12 Dec 2022 20:59:23 -0500 (EST) |
branch: elpa/evil-iedit-state
commit 76a8967a41fc3dd0c9510ca3a34ec4034084076a
Author: syl20bnr <sylvain.benner@gmail.com>
Commit: syl20bnr <sylvain.benner@gmail.com>
Version 1.0
---
README.md | 111 ++++++++++++++++++++++++
evil-iedit-state.el | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 349 insertions(+)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..a9ae03f654
--- /dev/null
+++ b/README.md
@@ -0,0 +1,111 @@
+# evil-iedit-state
+
+<!-- markdown-toc start - Don't edit this section. Run M-x
markdown-toc/generate-toc again -->
+**Table of Contents**
+
+- [evil-iedit-state](#evil-iedit-state)
+ - [Install](#install)
+ - [Package manager](#package-manager)
+ - [Manually](#manually)
+ - [Key bindings](#key-bindings)
+ - [State transitions](#state-transitions)
+ - [In iedit state](#in-iedit-state)
+ - [In iedit-insert state](#in-iedit-insert-state)
+
+<!-- markdown-toc end -->
+
+This package adds two new evil states:
+- iedit state
+- iedit-insert state
+
+It has also a nice integration with [expand-region][] for quick edit
+of the current selected text by pressing <kbd>e</kbd>.
+
+## Install
+
+### Package manager
+
+**will be available soon**
+
+You can either install `evil-iedit-state` from [MELPA][melpa-link]:
+
+```
+ M-x package-install evil-iedit-state
+```
+
+Or add it to your `Cask` file:
+
+```elisp
+(source melpa)
+
+(depends-on "evil-iedit-state")
+```
+
+### Manually
+
+Add `evil-iedit-state.el` to your load path. `evil-iedit-state` requires
+both `iedit` and `evil` to be installed.
+
+## Key bindings
+
+### State transitions
+
+ Key Binding | From | To
+-------------------|:------------------:|:-------------------------:
+<kbd>SPC s e</kbd> | normal or visual | iedit
+<kbd>e</kbd> | expand-region | iedit
+<kbd>ESC</kbd> | iedit | normal
+<kbd>C-g</kbd> | iedit | normal
+<kbd>fd</kbd> | iedit | normal
+<kbd>ESC</kbd> | iedit-insert | iedit
+<kbd>C-g</kbd> | iedit-insert | normal
+<kbd>fd</kbd> | iedit-insert | normal
+
+To sum-up, in `iedit-insert state` you have to press <kbd>ESC</kbd> twice to
+go back to the `normal state`. You can also at any time press <kbd>C-g</kbd>
+or <kbd>fd</kbd> to return to `normal state`.
+
+**Note:** evil commands which switch to `insert state` will switch in
+`iedit-insert state`.
+
+### In iedit state
+
+`iedit state` inherits from `normal state`, the following key bindings are
+specific to `iedit state`.
+
+ Key Binding | Description
+------------------|------------------------------------------------------------
+<kbd>ESC</kbd> | go back to `normal state`
+<kbd>TAB</kbd> | toggle current occurrence
+<kbd>0</kbd> | go to the beginning of the current occurrence
+<kbd>$</kbd> | go to the end of the current occurrence
+<kbd>#</kbd> | prefix all occurrences with an increasing number
(<kbd>C-u</kbd> to choose the starting number).
+<kbd>A</kbd> | go to the end of the current occurrence and switch to
`iedit-insert state`
+<kbd>D</kbd> | delete the occurrences
+<kbd>F</kbd> | restrict the scope to the function
+<kbd>gg</kbd> | go to first occurrence
+<kbd>G</kbd> | go to last occurrence
+<kbd>I</kbd> | go to the beginning of the current occurrence and switch
to `iedit-insert state`
+<kbd>J</kbd> | increase the edition scope by one line below
+<kbd>K</kbd> | increase the edition scope by one line above
+<kbd>L</kbd> | restrict the scope to the current line
+<kbd>n</kbd> | go to next occurrence
+<kbd>N</kbd> | go to previous occurrence
+<kbd>p</kbd> | replace occurrences with last yanked (copied) text
+<kbd>S</kbd> | (substitute) delete the occurrences and switch to
`iedit-insert state`
+<kbd>V</kbd> | toggle visibility of lines with no occurrence
+<kbd>U</kbd> | Up-case the occurrences
+<kbd>C-U</kbd> | down-case the occurrences
+
+**Note:** <kbd>0</kbd>, <kbd>$</kbd>, <kbd>A</kbd> and <kbd>I</kbd> have the
+default Vim behavior when used outside of an occurrence.
+
+### In iedit-insert state
+
+ Key Binding | Description
+---------------------------|------------------------------------------------------------
+<kbd>ESC</kbd> | go back to `iedit state`
+<kbd>C-g</kbd> | go back to `normal state`
+
+[iedit]: https://github.com/tsdh/iedit
+[expand-region]: https://github.com/magnars/expand-region.el
diff --git a/evil-iedit-state.el b/evil-iedit-state.el
new file mode 100644
index 0000000000..ca65cf5444
--- /dev/null
+++ b/evil-iedit-state.el
@@ -0,0 +1,238 @@
+;;; evil-iedit-state.el --- Evil states to interface iedit mode.
+
+;; Copyright (C) 2014 syl20bnr
+;;
+;; Author: Sylvain Benner <sylvain.benner@gmail.com>
+;; Keywords: convenience editing evil iedit mnemonic
+;; Created: 12 Dec 2014
+;; Version: 1.0
+;; Package-Requires: ((evil "1.0.9") (iedit "0.97"))
+;; URL: https://github.com/syl20bnr/evil-iedit-state
+
+;; This file is not part of GNU Emacs.
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Adds two new Evil states `iedit' and `iedit insert' with expand-region
+;; integration.
+
+;; For more info visit: https://github.com/syl20bnr/evil-iedit-state
+
+(require 'evil)
+(require 'iedit)
+
+(evil-define-state iedit
+ "`iedit state' interfacing iedit mode."
+ :tag " <E> "
+ :enable (normal)
+ :cursor box
+ :message "-- IEDIT --"
+ ;; force iedit mode
+ (if (evil-replace-state-p) (call-interactively 'iedit-mode)))
+
+(evil-define-state iedit-insert
+ "Replace insert state in `iedit state'."
+ :tag " <Ei> "
+ :enable (insert)
+ :cursor (bar . 2)
+ :message "-- IEDIT-INSERT --")
+
+(defun evil-iedit-state/iedit-mode (&optional arg)
+ "Start `iedit-mode'."
+ (interactive "P")
+ (if (fboundp 'ahs-clear) (ahs-clear))
+ (iedit-mode arg)
+ (evil-iedit-state))
+
+(defun evil-iedit-state/quit-iedit-mode ()
+ "Quit iedit-mode and return to `normal state'."
+ (interactive)
+ (iedit-done)
+ (evil-normal-state))
+
+(defmacro evil-iedit-state||swith-to-insert-state-after-command (command
&optional interactive)
+ "Call COMMAND and switch to iedit-insert state.
+If INTERACTIVE is non-nil then COMMAND is called interactively."
+ `(progn
+ (if ,interactive
+ (call-interactively ',command)
+ (funcall ',command))
+ ;; required to correctly update the cursors
+ (evil-iedit-state)
+ (evil-iedit-insert-state)))
+
+(defun evil-iedit-state//goto-overlay-start ()
+ "Return the position of the start of the current overlay."
+ (let ((overlay (iedit-find-current-occurrence-overlay)))
+ (if overlay
+ (goto-char (overlay-start overlay))
+ (call-interactively 'evil-digit-argument-or-evil-beginning-of-line))))
+
+(defun evil-iedit-state//goto-overlay-end ()
+ "Return the position of the end of the current overlay."
+ (let ((overlay (iedit-find-current-occurrence-overlay)))
+ (if overlay
+ (goto-char (overlay-end overlay))
+ (call-interactively 'evil-end-of-line))))
+
+(defun evil-iedit-state/evil-beginning-of-line (count)
+ "Go to the beginning of the current overlay."
+ (interactive "p")
+ (evil-iedit-state//goto-overlay-start))
+
+(defun evil-iedit-state/evil-end-of-line ()
+ "Go to the beginning of the current overlay."
+ (interactive)
+ (evil-iedit-state//goto-overlay-end))
+
+(defun evil-iedit-state/evil-append-line ()
+ "Put the point at then end of current overlay and switch to
+`iedit-insert state'."
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command
+ evil-iedit-state//goto-overlay-end))
+
+(defun evil-iedit-state/evil-insert-line ()
+ "Put the point at then end of current overlay and switch to
+`iedit-insert state'."
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command
+ evil-iedit-state//goto-overlay-start))
+
+(defun evil-iedit-state/substitute ()
+ "Wipe all the occurrences and switch in `iedit-insert state'"
+ (interactive)
+ (iedit-delete-occurrences)
+ (evil-iedit-insert-state))
+
+(defun evil-iedit-state/evil-change ()
+ "Wipe all the occurrences and switch in `iedit-insert state'"
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command evil-change t))
+
+(defun evil-iedit-state/evil-append ()
+ "Append and switch to `iedit-insert state'"
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command evil-append t))
+
+(defun evil-iedit-state/evil-open-below ()
+ "Insert new line below and switch to `iedit-insert state'"
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command evil-open-below t))
+
+(defun evil-iedit-state/evil-open-above ()
+ "Insert new line above and switch to `iedit-insert state'"
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command evil-open-above t))
+
+(defun evil-iedit-state/evil-substitute ()
+ "Append and switch to `iedit-insert state'"
+ (interactive)
+ (evil-iedit-state||swith-to-insert-state-after-command evil-substitute t))
+
+(defun evil-iedit-state/paste-replace (count)
+ "Replace the selection with the yanked text."
+ (interactive "P")
+ (iedit-delete-occurrences)
+ (evil-paste-before count))
+
+;; expand-region integration, add an "e" command
+(eval-after-load 'expand-region
+ '(progn
+ (defun evil-iedit-state/iedit-mode-from-expand-region (&optional arg)
+ "Start `iedit-mode'."
+ (interactive "P")
+ (evil-iedit-state/iedit-mode arg)
+ ;; hack to leave expand-region temporary overlay map
+ ;; we choose a letter that is not in `iedit state'
+ (setq unread-command-events (listify-key-sequence "kj")))
+
+ (defadvice er/prepare-for-more-expansions-internal
+ (around iedit/prepare-for-more-expansions-internal activate)
+ ad-do-it
+ (let ((default-msg (car ad-return-value))
+ (default-bindings (cdr ad-return-value)))
+ (message "%s" default-bindings)
+ (setq ad-return-value
+ (cons (concat default-msg ", e to edit")
+ (add-to-list 'default-bindings
+ '("e"
evil-iedit-state/iedit-mode-from-expand-region))))))))
+
+;; redefine iedit-done to prevent iedit from putting the occurrence on the
+;; kill-ring for no useful reason.
+(defun iedit-done ()
+ "Exit Iedit mode.
+Save the current occurrence string locally and globally. Save
+the initial string globally."
+ (when iedit-buffering
+ (iedit-stop-buffering))
+ (setq iedit-last-occurrence-local (iedit-current-occurrence-string))
+ (setq iedit-last-occurrence-global iedit-last-occurrence-local)
+ (setq iedit-last-initial-string-global iedit-initial-string-local)
+ ;; this is the hack
+ ;; (if iedit-last-occurrence-local
+ ;; (kill-new iedit-last-occurrence-local)) ; Make occurrence the latest kill
in the kill ring.
+ (setq iedit-num-lines-to-expand-up 0)
+ (setq iedit-num-lines-to-expand-down 0)
+ (iedit-cleanup)
+ (setq iedit-initial-string-local nil)
+ (setq iedit-mode nil)
+ (force-mode-line-update)
+ (remove-hook 'kbd-macro-termination-hook 'iedit-done t)
+ (remove-hook 'change-major-mode-hook 'iedit-done t)
+ (remove-hook 'iedit-aborting-hook 'iedit-done t)
+ (run-hooks 'iedit-mode-end-hook))
+
+(define-key evil-iedit-state-map "#" 'iedit-number-occurrences)
+(define-key evil-iedit-state-map "$" 'evil-iedit-state/evil-end-of-line)
+(evil-redirect-digit-argument evil-iedit-state-map "0"
'evil-iedit-state/evil-beginning-of-line)
+(define-key evil-iedit-state-map "a" 'evil-iedit-state/evil-append)
+(define-key evil-iedit-state-map "A" 'evil-iedit-state/evil-append-line)
+(define-key evil-iedit-state-map "c" 'evil-iedit-state/evil-change)
+(define-key evil-iedit-state-map "D" 'iedit-delete-occurrences)
+(define-key evil-iedit-state-map "F" 'iedit-restrict-function)
+(define-key evil-iedit-state-map "gg" 'iedit-goto-first-occurrence)
+(define-key evil-iedit-state-map "G" 'iedit-goto-last-occurrence)
+(define-key evil-iedit-state-map "i" 'evil-iedit-insert-state)
+(define-key evil-iedit-state-map "I" 'evil-iedit-state/evil-insert-line)
+(define-key evil-iedit-state-map "J" 'iedit-expand-down-a-line)
+(define-key evil-iedit-state-map "K" 'iedit-expand-up-a-line)
+(define-key evil-iedit-state-map "L" 'iedit-restrict-current-line)
+(define-key evil-iedit-state-map "n" 'iedit-next-occurrence)
+(define-key evil-iedit-state-map "N" 'iedit-prev-occurrence)
+(define-key evil-iedit-state-map "o" 'evil-iedit-state/evil-open-below)
+(define-key evil-iedit-state-map "O" 'evil-iedit-state/evil-open-above)
+(define-key evil-iedit-state-map "p" 'evil-iedit-state/paste-replace)
+(define-key evil-iedit-state-map "s" 'evil-iedit-state/evil-substitute)
+(define-key evil-iedit-state-map "S" 'evil-iedit-state/substitute)
+(define-key evil-iedit-state-map "V" 'iedit-toggle-unmatched-lines-visible)
+(define-key evil-iedit-state-map "U" 'iedit-upcase-occurrences)
+(define-key evil-iedit-state-map (kbd "C-U") 'iedit-downcase-occurrences)
+(define-key evil-iedit-state-map (kbd "C-g")'evil-iedit-state/quit-iedit-mode)
+(define-key evil-iedit-state-map [tab] 'iedit-toggle-selection)
+(define-key evil-iedit-state-map [backspace] 'iedit-blank-occurrences)
+(define-key evil-iedit-state-map [escape] 'evil-iedit-state/quit-iedit-mode)
+
+(define-key evil-iedit-insert-state-map (kbd "C-g")
'evil-iedit-state/quit-iedit-mode)
+(define-key evil-iedit-insert-state-map [escape] 'evil-iedit-state)
+
+;; unbound iedit commands:
+;; toggle buffering
+;; toggle case sensitive
+
+(provide 'evil-iedit-state)
+
+;;; evil-iedit-state.el ends here
- [nongnu] elpa/evil-iedit-state f75cff4ecb 21/32: Fix TAB to toggle occurrences, (continued)
- [nongnu] elpa/evil-iedit-state f75cff4ecb 21/32: Fix TAB to toggle occurrences, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 0bf8d5d177 06/32: Add MELPA badge, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 2cdbd00a9c 05/32: Remove mention for `fd` from evil-escape for now, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 40715752b8 12/32: Autoload expand-region integration, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 49415ca6d5 01/32: Initial commit, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 000c02aa31 13/32: Fix moving cursor when leaving expand-region transient map, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 9a0c89a373 10/32: Update dostring, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state e111eb4ce1 14/32: Alternative way to leave expand-region transient map, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 6dcbb85418 03/32: Minor README update, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 44863e6cff 18/32: Fix table formatting in README.md, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 76a8967a41 02/32: Version 1.0,
ELPA Syncer <=
- [nongnu] elpa/evil-iedit-state 44c64c7169 31/32: Bump version to 1.3, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 2d252e199a 24/32: Override yank handlers when pasting, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 30fcfa96ce 26/32: Fix toggling unmatched lines with V keybinding, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state 6f7b502447 32/32: Update README.md to mention NonGNU ELPA, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state c8793e80e4 30/32: fix "C-U" binding, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state e1a6bfb87c 28/32: fix: call evil-beginning-of-line instead of it's evil-digit-argument counterpart, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state c6ed1ef101 29/32: Disable AHS mode when exiting evil-iedit-mode, ELPA Syncer, 2022/12/12
- [nongnu] elpa/evil-iedit-state f5573ddefc 25/32: Fix version of iedit to 0.9.9.9, ELPA Syncer, 2022/12/12