From 200c532bd04a67a89db602462d74706051c61178 Mon Sep 17 00:00:00 2001 From: João Távora Date: Wed, 2 Apr 2014 10:59:06 +0100 Subject: Inhibit quote autopairing more frequently * lisp/elec-pair.el (electric-pair-inhibit-if-helps-balance): Inhibit quote pairing if point-max is inside an unterminated string. (electric-pair--looking-at-unterminated-string-p): Delete. (electric-pair--in-unterminated-string-p): New function. * test/automated/electric-tests.el (inhibit-if-strings-mismatched): New test, change from `inhibit-only-of-next-is-mismatched'. --- lisp/ChangeLog | 8 ++++++++ lisp/elec-pair.el | 27 ++++++++++++++------------- test/ChangeLog | 5 +++++ test/automated/electric-tests.el | 4 ++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index dca32ba701..66ec9ab3dc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2014-04-02 João Távora + + * elec-pair.el (electric-pair-inhibit-if-helps-balance): Inhibit + quote pairing if point-max is inside an unterminated string. + (electric-pair--looking-at-unterminated-string-p): + Delete. + (electric-pair--in-unterminated-string-p): New function. + 2014-04-01 Daniel Colascione * minibuffer.el (minibuffer-complete): Prevent assertion failure diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el index 52ad9bc024..2d7060eb27 100644 --- a/lisp/elec-pair.el +++ b/lisp/elec-pair.el @@ -364,18 +364,17 @@ If point is not enclosed by any lists, return ((t) . (t))." (funcall ended-prematurely-fn))))))) (cons innermost outermost))) -(defun electric-pair--looking-at-unterminated-string-p (char) - "Return non-nil if following string starts with CHAR and is unterminated." - ;; FIXME: ugly/naive - (save-excursion - (skip-chars-forward (format "^%c" char)) - (while (not (zerop (% (save-excursion (skip-syntax-backward "\\")) 2))) - (unless (eobp) - (forward-char 1) - (skip-chars-forward (format "^%c" char)))) - (and (not (eobp)) - (condition-case nil - (progn (forward-sexp) nil) +(defun electric-pair--in-unterminated-string-p (char) + "Return non-nil if inside unterminated string started by CHAR" + (let* ((ppss (syntax-ppss)) + (relevant-ppss (if (nth 4 ppss) ; in comment + (electric-pair--syntax-ppss) + ppss)) + (string-delim (nth 3 relevant-ppss))) + (and (or (eq t string-delim) + (eq char string-delim)) + (condition-case nil (progn (scan-sexps (nth 8 relevant-ppss) 1) + nil) (scan-error t))))) (defun electric-pair--inside-string-p (char) @@ -409,7 +408,9 @@ happened." (t (eq (cdr outermost) pair))))) ((eq syntax ?\") - (electric-pair--looking-at-unterminated-string-p char)))) + (save-excursion + (goto-char (point-max)) + (electric-pair--in-unterminated-string-p char))))) (insert-char char))))) (defun electric-pair-skip-if-helps-balance (char) diff --git a/test/ChangeLog b/test/ChangeLog index 75a3d0101c..be845db162 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2014-04-02 João Távora + + * automated/electric-tests.el (inhibit-if-strings-mismatched): + New test, change from `inhibit-only-of-next-is-mismatched'. + 2014-03-26 Barry O'Reilly * automated/undo-tests.el (undo-test-marker-adjustment-nominal): diff --git a/test/automated/electric-tests.el b/test/automated/electric-tests.el index e3ffd1abd2..c43b87f3f8 100644 --- a/test/automated/electric-tests.el +++ b/test/automated/electric-tests.el @@ -295,9 +295,9 @@ Should %s \"%s\" and point at %d" :bindings `((electric-pair-text-syntax-table . ,prog-mode-syntax-table))) -(define-electric-pair-test inhibit-only-if-next-is-mismatched +(define-electric-pair-test inhibit-if-strings-mismatched "\"foo\"\"bar" "\"" - :expected-string "\"\"\"foo\"\"bar" + :expected-string "\"\"foo\"\"bar" :expected-point 2 :test-in-strings nil :bindings `((electric-pair-text-syntax-table -- cgit v1.2.3