Preventing Emacs From Filling Up Your Clipboard History
February 9, 2016
I use a clipboard manager called Copied that syncs previously copied text across all my devices. Short of having an OS X version of Drafts, this is a very efficient way to get text from a Mac to an iOS device. However, when I’m working in Emacs, my clipboard history quickly becomes cluttered because every bit of text I “kill” in Emacs gets “copied” to the system pasteboard and then synchronized to all of my devices.
Indeed, every time I select a sentence or paragraph and kill it with
C-w (kill-region
), that text gets added to the clipboard
history. Worse still, every time I press M-DEL
(backward-kill-word
) to kill the previous word, that word also gets
added to my history. I use these commands a lot, so even with a
history of 100 previous items, the important items in my history are
quickly buried under a heap of words and phrases that I have killed in
Emacs during the normal process of writing and editing text.
This is mitigated to some extent by the fact that Copied allows
one to quickly filter the history by just typing a search string in
the main window. However, I discovered today that Emacs has a
minor mode called delete-selection-mode
and when this mode is
active, the region is replaced when a character is inserted or deleted
(e.g., with backspace). The practical implication of this is that
one can remove the active region by pressing DEL rather
than C-w:
By default, text insertion occurs normally even if the mark is active–for example, typing a inserts the character ‘a’, then deactivates the mark. If you enable Delete Selection mode, a minor mode, then inserting text while the mark is active causes the text in the region to be deleted first. To toggle Delete Selection mode on or off, type M-x delete-selection-mode.
Source: GNU Emacs Manual, section 11.3.
Also see DeleteSelectionMode on the EmacsWiki and in the
Emacs FAQ. To summarize, if one uses DEL instead of
C-w
to remove text in the active region, it won’t end up in the kill
ring or clipboard history. Somehow this slipped by me, but
delete-selection-mode
is enabled by default in Emacs 24 and 25.
Replacing M-DEL
with an alternative that deletes without adding to
the kill ring is less obvious. Without adding a custom function, a
long version would be C-SPC M-b DEL
. This sequence activates the
mark1, moves the point backward by one word, and deletes the
active region. If you find yourself using this often, it might be
better to define a backward-delete-word
function to your init.el
(source):
(defun backward-delete-word (arg)
"Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
(interactive "p")
(delete-region (point) (progn (backward-word arg) (point))))
I moved the default backward-kill-word
binding to C-M-DEL
and set
M-DEL
to this new function:
(global-set-key (kbd "C-M-<backspace>") 'backward-kill-word)
(global-set-key (kbd "M-<backspace>") 'backward-delete-word)