Add an evil text object for all grouping characters
Found a great idead from Chen Bin for not making a distinction between parens, brackets and braces when doing text object manipulation. This saves having to press the shift and reach for the another key when ~g~ is riiight there.
This commit is contained in:
parent
c609e124f3
commit
62c2e13dab
1 changed files with 41 additions and 0 deletions
|
@ -429,6 +429,47 @@ While I’m pretty good with the VIM keybindings, I would like to play around wi
|
||||||
- ~i`~ :: inner back quoted string
|
- ~i`~ :: inner back quoted string
|
||||||
|
|
||||||
*Note:* The ~x~ in the above examples are ~d~ for delete, ~v~ for select, ~y~ for copying and ~c~ for changing.
|
*Note:* The ~x~ in the above examples are ~d~ for delete, ~v~ for select, ~y~ for copying and ~c~ for changing.
|
||||||
|
*** Better Parenthesis with Text Object
|
||||||
|
I took the following clever idea and code from [[http://blog.binchen.org/posts/code-faster-by-extending-emacs-evil-text-object/][this essay]] from Chen Bin for creating a ~xig~ to grab code within any grouping characters, like parens, braces and brackets. For instance, ~dig~ cuts the content inside brackets, etc. First, we need a function to do the work (I changed the original from =my-= to =ha-= so that it is easier for me to distinguish functions from my configuration):
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(defun ha-evil-paren-range (count beg end type inclusive)
|
||||||
|
"Get minimum range of paren text object.
|
||||||
|
COUNT, BEG, END, TYPE is used. If INCLUSIVE is t, the text object is inclusive."
|
||||||
|
(let* ((parens '("()" "[]" "{}" "<>"))
|
||||||
|
range
|
||||||
|
found-range)
|
||||||
|
(dolist (p parens)
|
||||||
|
(condition-case nil
|
||||||
|
(setq range (evil-select-paren (aref p 0) (aref p 1) beg end type count inclusive))
|
||||||
|
(error nil))
|
||||||
|
(when range
|
||||||
|
(cond
|
||||||
|
(found-range
|
||||||
|
(when (< (- (nth 1 range) (nth 0 range))
|
||||||
|
(- (nth 1 found-range) (nth 0 found-range)))
|
||||||
|
(setf (nth 0 found-range) (nth 0 range))
|
||||||
|
(setf (nth 1 found-range) (nth 1 range))))
|
||||||
|
(t
|
||||||
|
(setq found-range range)))))
|
||||||
|
found-range))
|
||||||
|
#+end_src
|
||||||
|
Extend the text object to call this function for both /inner/ and /outer/:
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(evil-define-text-object ha-evil-a-paren (count &optional beg end type)
|
||||||
|
"Select a paren."
|
||||||
|
:extend-selection t
|
||||||
|
(ha-evil-paren-range count beg end type t))
|
||||||
|
|
||||||
|
(evil-define-text-object ha-evil-inner-paren (count &optional beg end type)
|
||||||
|
"Select 'inner' paren."
|
||||||
|
:extend-selection nil
|
||||||
|
(ha-evil-paren-range count beg end type nil))
|
||||||
|
#+end_src
|
||||||
|
And the keybindings:
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(define-key evil-inner-text-objects-map "g" #'ha-evil-inner-paren)
|
||||||
|
(define-key evil-outer-text-objects-map "g" #'ha-evil-a-paren)
|
||||||
|
#+end_src
|
||||||
*** Key Chord
|
*** Key Chord
|
||||||
Using the key-chord project allows me to make Escape be on two key combo presses on both sides of my keyboard:
|
Using the key-chord project allows me to make Escape be on two key combo presses on both sides of my keyboard:
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
|
|
Loading…
Reference in a new issue