From: Philip Kaludercic <philipk@posteo.net>
To: 65380@debbugs.gnu.org
Subject: bug#65380: [PATCH] Add command to copy contents in a diff-mode buffer
Date: Sat, 19 Aug 2023 10:00:49 +0000 [thread overview]
Message-ID: <87ttsvwdv2.fsf@posteo.net> (raw)
In-Reply-To: <87wmxrwe6h.fsf@posteo.net> (Philip Kaludercic's message of "Sat, 19 Aug 2023 09:53:58 +0000")
[-- Attachment #1: Type: text/plain, Size: 991 bytes --]
Philip Kaludercic <philipk@posteo.net> writes:
> Tags: patch
>
>
> This command solves a long-standing annoyance I have had when working
> with diffs. To my knowledge there is no existing way to achieve this
> (rectangular selection might be possible, but that behaves differently
> when the text is yanked). The binding "w" seems intuitive when
> contrasted with "M-w", but might be confused with "W" (widen). Not sure
> if that is an issue or not.
>
> In GNU Emacs 30.0.50 (build 8, x86_64-pc-linux-gnu, GTK+ Version
> 3.24.37, cairo version 1.16.0) of 2023-08-18 built on quetzal
> Repository revision: 2f74a459d2a82578fd9a92e9e2facdca90dad974
> Repository branch: feature/a-package-for-elpa
> System Description: Debian GNU/Linux 12 (bookworm)
>
> Configured using:
> 'configure --with-pgtk --with-native-compilation --with-imagemagick
> --with-tree-sitter'
It seems I prepared to patch too hastily, and forgot to add a docstring.
Here is the updated version, with a docstring:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-command-to-copy-contents-in-a-diff-mode-buffer.patch --]
[-- Type: text/x-diff, Size: 3147 bytes --]
From fc39bd54ac93dbebec3b4c16aa1fe995cd421c92 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Sat, 19 Aug 2023 11:47:54 +0200
Subject: [PATCH] Add command to copy contents in a diff-mode buffer
* lisp/vc/diff-mode.el (diff-mode-shared-map): Bind 'diff-kill-ring-save'.
(diff-mode-map): Ensure the "w" binding does not get prefixed.
(diff-kill-ring-save): Add new command
* etc/NEWS: Mention 'diff-kill-ring-save'.
---
etc/NEWS | 7 +++++++
lisp/vc/diff-mode.el | 24 +++++++++++++++++++++++-
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/etc/NEWS b/etc/NEWS
index 6588299c532..9ce510e0f81 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -276,6 +276,13 @@ This allows changing which type of whitespace changes are ignored when
regenerating hunks with 'diff-ignore-whitespace-hunk'. Defaults to
the previously hard-coded "-b".
+---
+*** New command 'diff-kill-ring-save'.
+This command behaves like 'kill-ring-save', but removes change
+indicators ("+", "-") from the beginning of a line. This is useful
+when you wish to copy part of the contents of a diff, but not the diff
+itself.
+
** Ediff
---
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index d776375d681..342d2d8ce90 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -195,6 +195,7 @@ diff-mode-shared-map
"RET" #'diff-goto-source
"<mouse-2>" #'diff-goto-source
"W" #'widen
+ "w" #'diff-kill-ring-save
"o" #'diff-goto-source ; other-window
"A" #'diff-ediff-patch
"r" #'diff-restrict-view
@@ -207,7 +208,7 @@ diff-mode-map
;; We want to inherit most bindings from
;; `diff-mode-shared-map', but not all since they may hide
;; useful `M-<foo>' global bindings when editing.
- (dolist (key '("A" "r" "R" "g" "q" "W" "z"))
+ (dolist (key '("A" "r" "R" "g" "q" "W" "w" "z"))
(keymap-set map key nil))
map)
;; From compilation-minor-mode.
@@ -2079,6 +2080,27 @@ diff-goto-source
(goto-char (+ (car pos) (cdr src)))
(when buffer (next-error-found buffer (current-buffer))))))
+(defun diff-kill-ring-save (beg end)
+ "Save contents of the region between BEG and END akin to `kill-ring-save'.
+The contents of a region will not include diff indicators at the
+beginning of each line."
+ (interactive (list (region-beginning) (region-end)))
+ (let ((at-bol (save-excursion (goto-char beg) (bolp)))
+ lines)
+ (save-restriction
+ (narrow-to-region beg end)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (let ((line (thing-at-point 'line t)))
+ ;; In case the user has selected a region that begins
+ ;; mid-line, we should not chomp off the first character.
+ (if (and (null lines) (not at-bol))
+ (push line lines)
+ (push (substring line 1) lines)))
+ (forward-line)))
+ (let ((region-extract-function
+ (lambda (_) (apply #'concat (nreverse lines)))))
+ (kill-ring-save beg end t))))
(defun diff-current-defun ()
"Find the name of function at point.
--
2.39.2
next prev parent reply other threads:[~2023-08-19 10:00 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-19 9:53 bug#65380: [PATCH] Add command to copy contents in a diff-mode buffer Philip Kaludercic
2023-08-19 10:00 ` Philip Kaludercic [this message]
2023-08-20 0:59 ` Daniel Martín via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-20 7:52 ` Philip Kaludercic
2023-08-19 10:46 ` Eli Zaretskii
2023-08-19 10:48 ` Philip Kaludercic
2023-08-19 11:06 ` Eli Zaretskii
2023-08-19 15:45 ` Philip Kaludercic
2023-08-19 19:09 ` Eli Zaretskii
2023-08-19 19:30 ` Philip Kaludercic
2023-08-19 21:01 ` Sean Whitton
2023-08-19 22:49 ` Rudolf Adamkovič via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-20 0:41 ` Daniel Martín via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-08-20 16:30 ` Juri Linkov
2023-08-20 18:17 ` Eli Zaretskii
2023-08-20 18:24 ` Philip Kaludercic
2023-08-20 18:29 ` Eli Zaretskii
2023-08-22 11:06 ` Philip Kaludercic
2023-08-22 11:29 ` Eli Zaretskii
2023-08-20 19:47 ` Jim Porter
2023-08-20 20:13 ` Gregory Heytings
2023-08-20 20:45 ` Jim Porter
2023-08-20 21:29 ` Gregory Heytings
2023-08-20 22:21 ` Jim Porter
2023-08-20 22:31 ` Gregory Heytings
2023-08-20 23:39 ` Gregory Heytings
2023-08-21 0:34 ` Jim Porter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ttsvwdv2.fsf@posteo.net \
--to=philipk@posteo.net \
--cc=65380@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).