Skip to content

Commit c8b997f

Browse files
authored
Merge pull request #1025 from fukamachi/fix/vi-text-objects
Fix vi-mode text objects
2 parents ddf6643 + 9b492cf commit c8b997f

File tree

6 files changed

+241
-153
lines changed

6 files changed

+241
-153
lines changed

extensions/vi-mode/commands.lisp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,21 +721,27 @@
721721
(fall-within-line (current-point))))))
722722

723723
(define-text-object-command vi-a-word (count) ("p")
724+
(:expand-selection t)
724725
(a-range-of 'word-object (current-state) count))
725726

726727
(define-text-object-command vi-inner-word (count) ("p")
728+
(:expand-selection t)
727729
(inner-range-of 'word-object (current-state) count))
728730

729731
(define-text-object-command vi-a-double-quote () ()
732+
()
730733
(a-range-of 'double-quoted-object (current-state) 1))
731734

732735
(define-text-object-command vi-inner-double-quote () ()
736+
()
733737
(inner-range-of 'double-quoted-object (current-state) 1))
734738

735739
(define-text-object-command vi-a-paren (count) ("p")
740+
(:expand-selection t)
736741
(a-range-of 'paren-object (current-state) count))
737742

738743
(define-text-object-command vi-inner-paren (count) ("p")
744+
(:expand-selection t)
739745
(inner-range-of 'paren-object (current-state) count))
740746

741747
(define-command vi-normal () ()

extensions/vi-mode/commands/utils.lisp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@
251251
:keep-visual ,keep-visual
252252
:restore-point ,restore-point)))
253253

254-
(defun call-define-text-object-command (fn)
254+
(defun call-define-text-object-command (fn &key expand-selection)
255255
(flet ((expand-visual-range (range)
256256
(let ((p1 (range-beginning range))
257257
(p2 (range-end range)))
@@ -271,11 +271,16 @@
271271
(return-from call-define-text-object-command)))))
272272
(let ((range (funcall fn)))
273273
(when (visual-p)
274-
(expand-visual-range range))
274+
(if expand-selection
275+
(expand-visual-range range)
276+
(setf (visual-range)
277+
(list (range-beginning range) (range-end range)))))
275278
range))))
276279

277-
(defmacro define-text-object-command (name arg-list arg-descriptors
280+
(defmacro define-text-object-command (name arg-list arg-descriptors (&key expand-selection)
278281
&body body)
279282
`(define-command (,name (:advice-classes vi-text-object)) ,arg-list
280283
(,(parse-arg-descriptors arg-descriptors))
281-
(call-define-text-object-command (lambda () ,@body))))
284+
(call-define-text-object-command
285+
(lambda () ,@body)
286+
:expand-selection ,expand-selection)))

extensions/vi-mode/lem-vi-mode.asd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
(:file "operator")
4848
(:file "visual")
4949
(:file "commands")
50+
(:file "text-objects")
5051
(:file "options")))
5152
(:file "utils"
5253
:pathname "tests/utils"))
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
(defpackage :lem-vi-mode/tests/text-objects
2+
(:use :cl
3+
:lem
4+
:rove
5+
:lem-vi-mode/tests/utils)
6+
(:import-from :lem-fake-interface
7+
:with-fake-interface)
8+
(:import-from :named-readtables
9+
:in-readtable))
10+
(in-package :lem-vi-mode/tests/text-objects)
11+
12+
(in-readtable :interpol-syntax)
13+
14+
(deftest double-quoted
15+
(with-fake-interface ()
16+
(with-vi-buffer ("[ ]\"foo\" \"bar\"")
17+
(cmd "va\"")
18+
(ok (buf= " <\"foo\"[ ]>\"bar\"")))
19+
(with-vi-buffer (" [\"]foo\" \"bar\"")
20+
(cmd "va\"")
21+
(ok (buf= " <\"foo\"[ ]>\"bar\"")))
22+
(with-vi-buffer (" \"f[o]o\" \"bar\"")
23+
(cmd "va\"")
24+
(ok (buf= " <\"foo\"[ ]>\"bar\"")))
25+
(with-vi-buffer (" \"foo[\"] \"bar\"")
26+
(cmd "va\"")
27+
(ok (buf= " <\"foo\"[ ]>\"bar\"")))
28+
(with-vi-buffer (" \"foo\"[ ]\"bar\"")
29+
(cmd "va\"")
30+
;; NOTE: This behavior is not same as Vim
31+
(ok (buf= " \"foo\"< \"bar[\"]>")))
32+
(with-vi-buffer (" \"foo\" \"bar[\"]")
33+
(cmd "va\"")
34+
(ok (buf= " \"foo\"< \"bar[\"]>")))))

extensions/vi-mode/tests/visual.lisp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
(deftest text-objects
3737
(with-fake-interface ()
3838
(testing "vaw"
39+
(with-vi-buffer (#?" [f]oo\n")
40+
(cmd "vaw")
41+
(ok (buf= #?" <fo[o]>\n")))
3942
(with-vi-buffer (#?" [ ]foo bar baz \n")
4043
(cmd "vaw")
4144
(ok (buf= #?"< fo[o]> bar baz \n")))

0 commit comments

Comments
 (0)