]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new user option 'yank-transform-functions'
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 19 May 2022 22:15:28 +0000 (00:15 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 19 May 2022 22:15:38 +0000 (00:15 +0200)
* doc/lispref/text.texi (Yanking): Mention it.
(Yanking): Document it.

* lisp/simple.el (yank-transform-functions): New user option.
(yank): Mention it.

* lisp/subr.el (insert-for-yank): Use it.

doc/lispref/text.texi
etc/NEWS
lisp/simple.el
lisp/subr.el

index a1db715db6ee694035ba2653c0e690e451b64082..8fd8a5fb97ac9cff1b3043cf5e36d489148f0323 100644 (file)
@@ -1034,6 +1034,9 @@ text in @var{string} according to the @code{yank-handler} text
 property, as well as the variables @code{yank-handled-properties} and
 @code{yank-excluded-properties} (see below), before inserting the
 result into the current buffer.
+
+@var{string} will be run through @code{yank-transform-functions} (see
+below) before inserting.
 @end defun
 
 @defun insert-buffer-substring-as-yank buf &optional start end
@@ -1108,6 +1111,23 @@ or specifying key bindings.  It takes effect after
 @code{yank-handled-properties}.
 @end defopt
 
+@defopt yank-transform-functions
+This variable is a list of functions.  Each function is called (in
+order) with the string to be yanked as the parameter, and should
+return a (possibly transformed) string.  This variable can be set
+globally, but can also be used to create new commands that are
+variations on @code{yank}.  For instance, to create a command that
+works like @code{yank}, but cleans up whitespace before inserting, you
+could say something like:
+
+@lisp
+(defun yank-with-clean-whitespace ()
+  (interactive)
+  (let ((yank-transform-functions
+        '(string-clean-whitespace)))
+    (call-interactively #'yank)))
+@end lisp
+@end defopt
 
 @node Yank Commands
 @subsection Functions for Yanking
index 4f6df48129e973da0f37c06a957dbb89baece92f..c3bc1f0f58b64f846b03cad9cd38d03d12178d39 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2190,6 +2190,9 @@ platforms.
 This command lets you examine all data in the current selection and
 the clipboard, and insert it into the buffer.
 
+** New user option 'yank-transform-functions'.
+This function allows the user to alter the string to be inserted.
+
 ---
 ** New function 'minibuffer-lazy-highlight-setup'.
 This function allows setting up the minibuffer so that lazy
index cd7a82b7acaf9abe1122fdb3f9b50c5409ef3114..bed72457c3a0d001118ff0fe6208619d372d79c3 100644 (file)
@@ -5928,6 +5928,15 @@ See also `yank-handled-properties'."
   :group 'killing
   :version "24.3")
 
+(defcustom yank-transform-functions nil
+  "List of functions to run on strings to be yanked.
+Each function in this list will be called (in order) with the
+string to be yanked as the sole argument, and should return the (possibly)
+ transformed string."
+  :type '(repeat function)
+  :version "29.1"
+  :group 'killing)
+
 (defvar yank-window-start nil)
 (defvar yank-undo-function nil
   "If non-nil, function used by `yank-pop' to delete last stretch of yanked text.
@@ -5999,6 +6008,8 @@ property, as described below.
 Properties listed in `yank-handled-properties' are processed,
 then those listed in `yank-excluded-properties' are discarded.
 
+STRING will be run through `yank-transform-functions'.
+
 If STRING has a non-nil `yank-handler' property anywhere, the
 normal insert behavior is altered, and instead, for each contiguous
 segment of STRING that has a given value of the `yank-handler'
index d7f06bdcde853520adc1635d6a4f0ea2ac73cc3d..945587db53ccdc1c4ad9fdec5262b751c6b2ef96 100644 (file)
@@ -4070,7 +4070,12 @@ remove properties specified by `yank-excluded-properties'."
 
 This function is like `insert', except it honors the variables
 `yank-handled-properties' and `yank-excluded-properties', and the
-`yank-handler' text property, in the way that `yank' does."
+`yank-handler' text property, in the way that `yank' does.
+
+It also runs the string through `yank-transform-functions'."
+  ;; Allow altering the yank string.
+  (dolist (func yank-transform-functions)
+    (setq string (funcall func string)))
   (let (to)
     (while (setq to (next-single-property-change 0 'yank-handler string))
       (insert-for-yank-1 (substring string 0 to))