summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2012-10-22 08:43:54 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2012-10-22 08:43:54 -0400
commitc77d37e227560d8ab87b475acef74bf20b54750e (patch)
tree6f549b6b304dbd90bab331497e34358231068532 /lisp
parentb1d39ccce419eeec83a4bc723f6c9daf4ffb2be4 (diff)
Rework the last delsel/electric fix.
* lisp/delsel.el (delete-selection-helper): Use a function instead of a hook. (delete-selection-pre-hook): Use use-region-p. (delete-selection-self-insert-function): Remove. (self-insert-command): Obey self-insert-uses-region-functions. (self-insert-iso): Revert to previous setting, since we don't actually know what that command does. (delete-selection-self-insert-hooks): Remove. * lisp/electric.el (electric-pair-delete-selection-self-insert-function): Rename to electric-pair-will-use-region, return a boolean. (electric-pair-mode): Adjust accordingly. Don't require delsel.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog14
-rw-r--r--lisp/delsel.el55
-rw-r--r--lisp/electric.el17
3 files changed, 44 insertions, 42 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 6edf13719c..1b680eadc0 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
+2012-10-22 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * electric.el (electric-pair-delete-selection-self-insert-function):
+ Rename to electric-pair-will-use-region, return a boolean.
+ (electric-pair-mode): Adjust accordingly. Don't require delsel.
+
+ * delsel.el (delete-selection-helper): Use a function instead of a hook.
+ (delete-selection-pre-hook): Use use-region-p.
+ (delete-selection-self-insert-function): Remove.
+ (self-insert-command): Obey self-insert-uses-region-functions.
+ (self-insert-iso): Revert to previous setting, since we don't actually
+ know what that command does.
+ (delete-selection-self-insert-hooks): Remove.
+
2012-10-22 Simon Law <sfllaw@sfllaw.ca> (tiny change)
* delsel.el (delete-selection-helper): New function, extracted from
diff --git a/lisp/delsel.el b/lisp/delsel.el
index 09f58e086a..2ed8267618 100644
--- a/lisp/delsel.el
+++ b/lisp/delsel.el
@@ -44,12 +44,12 @@
;; `kill-region' is used on the selection, rather than
;; `delete-region'. (Text selected with the mouse will typically
;; be yankable anyhow.)
-;; non-nil
+;; t
;; The normal case: delete the active region prior to executing
;; the command which will insert replacement text.
-;; hooks
+;; <function>
;; For commands which need to dynamically determine this behaviour.
-;; Each hook should return one of the above values or nil.
+;; The function should return one of the above values or nil.
;;; Code:
@@ -82,23 +82,23 @@ If KILLP in not-nil, the active region is killed instead of deleted."
t)
(defun delete-selection-helper (type)
- "Deletes selection according to TYPE:
- 'yank
+ "Delete selection according to TYPE:
+ `yank'
For commands which do a yank; ensures the region about to be
deleted isn't yanked.
- 'supersede
+ `supersede'
Delete the active region and ignore the current command,
i.e. the command will just delete the region.
- 'kill
+ `kill'
`kill-region' is used on the selection, rather than
`delete-region'. (Text selected with the mouse will typically
be yankable anyhow.)
- non-nil
+ t
The normal case: delete the active region prior to executing
the command which will insert replacement text.
- hooks
+ FUNCTION
For commands which need to dynamically determine this behaviour.
- Each hook should return one of the above values or nil."
+ FUNCTION should take no argument and return one of the above values or nil."
(condition-case data
(cond ((eq type 'kill)
(delete-active-region t))
@@ -119,9 +119,7 @@ If KILLP in not-nil, the active region is killed instead of deleted."
(delete-active-region)
(unless empty-region
(setq this-command 'ignore))))
- ((and (symbolp type) (not (booleanp type)))
- (delete-selection-helper
- (run-hook-with-args-until-success type)))
+ ((functionp type) (delete-selection-helper (funcall type)))
(type
(delete-active-region)
(if (and overwrite-mode
@@ -151,29 +149,22 @@ If KILLP in not-nil, the active region is killed instead of deleted."
(message "Text is read-only") (ding))))
(defun delete-selection-pre-hook ()
- "Normal hook run before commands that delete selections are executed.
-Commands which will delete the selection need a 'delete-selection
-property on their symbols; commands which insert text but don't
+ "Function run before commands that delete selections are executed.
+Commands which will delete the selection need a `delete-selection'
+property on their symbol; commands which insert text but don't
have this property won't delete the selection.
-
-See `delete-selection-helper'.
-"
- (when (and delete-selection-mode transient-mark-mode mark-active
+See `delete-selection-helper'."
+ (when (and delete-selection-mode (use-region-p)
(not buffer-read-only))
- (let ((type (and (symbolp this-command)
- (get this-command 'delete-selection))))
- (delete-selection-helper type))))
-
-(defun delete-selection-self-insert-function ()
- t)
+ (delete-selection-helper (and (symbolp this-command)
+ (get this-command 'delete-selection)))))
-(defvar delete-selection-self-insert-hooks
- '(delete-selection-self-insert-function)
- "Abnormal hook run before commands that insert characters.
-This hook should return a TYPE that `delete-selection-helper' understands.")
+(put 'self-insert-command 'delete-selection
+ (lambda ()
+ (not (run-hook-with-args-until-success
+ 'self-insert-uses-region-functions))))
-(put 'self-insert-command 'delete-selection 'delete-selection-self-insert-hooks)
-(put 'self-insert-iso 'delete-selection 'delete-selection-self-insert-hooks)
+(put 'self-insert-iso 'delete-selection t)
(put 'yank 'delete-selection 'yank)
(put 'clipboard-yank 'delete-selection 'yank)
diff --git a/lisp/electric.el b/lisp/electric.el
index e6fa1df914..abf5a72eca 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -358,11 +358,9 @@ This can be convenient for people who find it easier to hit ) than C-f."
(eq (char-syntax (following-char)) ?w)))
(save-excursion (insert closer))))))
-(defun electric-pair-delete-selection-self-insert-function ()
- (let ((syntax (electric-pair-syntax last-command-event)))
- (if (and (memq syntax '(?\( ?\" ?\$)) (use-region-p))
- 'keep
- t)))
+(defun electric-pair-will-use-region ()
+ (and (use-region-p)
+ (memq (electric-pair-syntax last-command-event) '(?\( ?\" ?\$))))
;;;###autoload
(define-minor-mode electric-pair-mode
@@ -380,15 +378,14 @@ See options `electric-pair-pairs' and `electric-pair-skip-self'."
:group 'electricity
(if electric-pair-mode
(progn
- (require 'delsel)
(add-hook 'post-self-insert-hook
#'electric-pair-post-self-insert-function)
- (add-hook 'delete-selection-self-insert-hooks
- #'electric-pair-delete-selection-self-insert-function))
+ (add-hook 'self-insert-uses-region-functions
+ #'electric-pair-will-use-region))
(remove-hook 'post-self-insert-hook
#'electric-pair-post-self-insert-function)
- (remove-hook 'delete-selection-self-insert-hooks
- #'electric-pair-delete-selection-self-insert-function)))
+ (remove-hook 'self-insert-uses-region-functions
+ #'electric-pair-will-use-region)))
;; Automatically add newlines after/before/around some chars.