1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-22 07:09:54 +00:00

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.
This commit is contained in:
Stefan Monnier 2012-10-22 08:43:54 -04:00
parent b1d39ccce4
commit c77d37e227
3 changed files with 44 additions and 42 deletions

View File

@ -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

View File

@ -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))))
(delete-selection-helper (and (symbolp this-command)
(get this-command 'delete-selection)))))
(defun delete-selection-self-insert-function ()
t)
(put 'self-insert-command 'delete-selection
(lambda ()
(not (run-hook-with-args-until-success
'self-insert-uses-region-functions))))
(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 '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)

View File

@ -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.