[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/evil-args edcae1a8d9 03/27: Added evil-args.el
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/evil-args edcae1a8d9 03/27: Added evil-args.el |
Date: |
Wed, 2 Feb 2022 20:58:11 -0500 (EST) |
branch: elpa/evil-args
commit edcae1a8d98c718675cfeeb9167f494c94b8d61f
Author: wcsmith <wconnorsmith@gmail.com>
Commit: wcsmith <wconnorsmith@gmail.com>
Added evil-args.el
---
evil-args.el | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 155 insertions(+)
diff --git a/evil-args.el b/evil-args.el
new file mode 100644
index 0000000000..18b53cc462
--- /dev/null
+++ b/evil-args.el
@@ -0,0 +1,155 @@
+;;; evil-args.el
+
+;; Author:
+;; Connor Smith
+
+;; This file is NOT part of GNU Emacs.
+
+;; Commentary:
+;;
+;; evil-args provides evil
+
+(require 'evil)
+
+
+(defvar evil-arg-openers '("(" "{" "["))
+(defvar evil-arg-closers '(")" "}" "]"))
+(defvar evil-arg-delimiters '("," ";"))
+
+(setq evil-arg-openers-regexp (regexp-opt evil-arg-openers))
+(setq evil-arg-closers-regexp (regexp-opt evil-arg-closers))
+(setq evil-arg-delimiters-regexp (regexp-opt evil-arg-delimiters))
+
+(setq evil-arg-search-regexp
+ (regexp-opt (append evil-arg-openers
+ evil-arg-closers
+ evil-arg-delimiters)))
+
+(defun evil-args--backward-delimiter (&optional count)
+ (let ((begin -1)
+ (count (or count 1)))
+ (save-excursion
+ (while (and (< begin 0)
+ (> count 0))
+ ;; search backwards for delimiter, opener, or closer
+ (if (not (re-search-backward evil-arg-search-regexp nil t))
+ ;; not found
+ (setq begin (- (point-at-bol) 1))
+ ;; found:
+ ;; skip over any matching pairs if necessary
+ (while (looking-at-p evil-arg-closers-regexp)
+ (evil-jump-item)
+ (backward-char))
+ ;; if looking at an opener, stop
+ (if (looking-at-p evil-arg-openers-regexp)
+ (setq begin (point))
+ ;; looking at a delimiter: decrement count and check if done
+ (when (and (looking-at-p evil-arg-delimiters-regexp)
+ (<= (setq count (- count 1)) 0))
+ (setq begin (point)))))))
+ (if begin (goto-char begin))))
+
+(defun evil-args--forward-delimiter (&optional count)
+ (let ((end -1)
+ (count (or count 1)))
+ (save-excursion
+ (while (and (< end 0)
+ (> count 0))
+ ;; search forward for a delimiter, opener, or closer
+ (if (not (re-search-forward evil-arg-search-regexp nil t))
+ ;; not found
+ (setq end (point-at-eol))
+ ;; found:
+ ;; skip over any matching pairs if necessary
+ (backward-char)
+ (while (looking-at-p evil-arg-openers-regexp)
+ (evil-jump-item)
+ (forward-char))
+ ;; if looking at a closer, stop
+ (if (looking-at-p evil-arg-closers-regexp)
+ (setq end (point))
+ ;; looking at a delimiter: decrement count and check if done
+ (when (looking-at-p evil-arg-delimiters-regexp)
+ (if (<= (setq count (- count 1)) 0)
+ (setq end (point))
+ (forward-char)))))))
+ (if end (goto-char end))))
+
+
+(defun evil-args--backward-arg-no-skip (count)
+ (evil-args--backward-delimiter (or count 1))
+ (forward-char)
+ (when (looking-at " ")
+ (forward-char))
+ (when (looking-at "\n")
+ (evil-next-line)
+ (evil-first-non-blank)))
+
+(evil-define-motion evil-backward-arg (count)
+ (evil-args--backward-arg-no-skip
+ (+ (if (looking-back (concat evil-arg-delimiters-regexp
+ "[\t\n ]*")) 1 0) (or count 1))))
+
+(evil-define-motion evil-forward-arg (count)
+ (evil-args--forward-delimiter (or count 1))
+ (when (not (looking-at-p evil-arg-closers-regexp))
+ (forward-char)
+ (when (looking-at " ")
+ (forward-char))
+ (when (looking-at "\n")
+ (evil-next-line)
+ (evil-first-non-blank))))
+
+(evil-define-text-object evil-inner-arg (count &optional beg end type)
+ "Select inner delimited argument."
+ (let ((begin (save-excursion (evil-args--backward-arg-no-skip 1) (point)))
+ (end (save-excursion (evil-args--forward-delimiter) (point))))
+ (evil-range begin end)))
+
+(evil-define-text-object evil-outer-arg (count &optional beg end type)
+ "Select a delimited argument."
+ (let ((begin nil)
+ (end-on-closer nil)
+ (end nil))
+ (save-excursion
+ (evil-args--forward-delimiter)
+ (if (member (string (char-after)) evil-arg-delimiters)
+ (evil-forward-arg 1)
+ (setq end-on-closer t))
+ (setq end (point)))
+ (save-excursion
+ (evil-args--backward-arg-no-skip 1)
+ (if (and end-on-closer
+ (not (looking-back (concat evil-arg-openers-regexp
+ "[\t\n ]*"))))
+ (progn (evil-args--backward-delimiter)
+ (setq begin (point)))
+ (setq begin (point))))
+ (evil-range begin end)))
+
+(evil-define-motion evil-jump-out-args (count)
+ (setq count (or count 1))
+ (while (> count 0)
+ (let ((begin -1)
+ (success nil))
+ (save-excursion
+ (while (< begin 0)
+ (if (not (re-search-backward evil-arg-search-regexp nil t))
+ (setq begin (- (point-at-bol)) 1)
+ (while (looking-at-p evil-arg-closers-regexp)
+ (evil-jump-item)
+ (backward-char))
+ (when (looking-at-p evil-arg-openers-regexp)
+ (setq begin (point))
+ (setq success t))))
+ (when success
+ (evil-backward-word-end)
+ (if (not (looking-at evil-arg-closers-regexp))
+ (evil-backward-word-begin)
+ (evil-jump-item)
+ (forward-char))
+ (setq begin (point))))
+ (if begin (goto-char begin)))
+ (setq count (- count 1))))
+
+ (provide 'evil-args)
- [nongnu] branch elpa/evil-args created (now 2671071a4a), ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 14de13714f 01/27: Initial commit., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args edcae1a8d9 03/27: Added evil-args.el,
ELPA Syncer <=
- [nongnu] elpa/evil-args e904186006 06/27: Added customization section to README., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 8d03d9d54a 07/27: Added license and boilerplate to evil-args.el., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 46aab06c34 10/27: Added clearer language to keybinding documentation., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args e851ac4570 09/27: Added more commentary to evil-args.el., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args b2bfdab464 18/27: Declare interactive commands as evil-motions separately from their definitions., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args b4336c2317 20/27: Autoload text object macros as functions., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args b554f83a31 22/27: Merge pull request #3 from purcell/patch-1, ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 36ba8acc97 21/27: Add missing colon in Package-Requires header, ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 0ab683418c 17/27: Modified autoload structure for inclusion with MELPA., ELPA Syncer, 2022/02/02
- [nongnu] elpa/evil-args 43c7fea7ee 19/27: Bugfix for evil-jump-out-args., ELPA Syncer, 2022/02/02