Emacs: Mark, Copy and Yank Things
In a previous post I described how I copy various things at point in emacs to make my daily live easier. Meanwhile the code grew larger and larger and in the end went too large to maintain it in my emacs config.
So, I descided to put it into its own module: mark-copy-yank-things-mode. As always you can find the mode on github.
There are a couple of new features now: I created a copy-comment-block function which is able to copy comment blocks even if they are on the right side of some code. Here's a demo gif:
Also, there is now support for email addresses, ip addresses and urls. The mode provides prefix keys mappings, so, it's very easy to change the key mapping for the various functions just by modifying the prefix key.
Here's a lis of the current default key bindings provided by the mode:
COPY commands (keymap: mcyt-copy-map):
C-c c w mcyt-copy-word C-c c q mcyt-copy-quote C-c c k mcyt-copy-parens C-c c l mcyt-copy-line C-c c p mcyt-copy-paragraph C-c c f mcyt-copy-defun C-c c u mcyt-copy-url C-c c e mcyt-copy-email C-c c c mcyt-copy-comment-block C-c c a mcyt-copy-buffer C-c c i mcyt-copy-ip C-c c s mcyt-copy-sexp
COPY & YANK commands (keymap: mcyt-yank-map):
C-c c y y mcyt-copy-and-yank-line C-c c y l mcyt-copy-and-yank-line C-c c y p mcyt-copy-and-yank-paragraph C-c c y f mcyt-copy-and-yank-defun C-c c y a mcyt-copy-and-yank-buffer C-c c y w mcyt-copy-and-yank-word C-c c y i mcyt-copy-and-yank-ip C-c c y c mcyt-copy-and-yank-comment
MARK commands (keymap: mcyt-mark-map):
C-c c a a mcyt-mark-buffer C-c c a w mcyt-mark-word C-c c a f mcyt-mark-defun C-c c a p mcyt-mark-paragraph C-c c a l mcyt-mark-line C-c c a u mcyt-mark-url C-c c a e mcyt-mark-email C-c c a s mcyt-mark-sexp C-c c a c mcyt-mark-comment-block C-c c a i mcyt-mark-ip
Update 2017-03-28:
From time to time I stumble upon a very annoying emacs behavior: I copy some text and want to insert it into multiple positions somewhere else. However, I need to delete something on those positions before yanking. Now, this deleted stuff will be added to the kill-ring and appears first, when I executeyank
the next time. So, I need to cycle through the kill-ring with M-y
to reach the text I really want to yank. And everytime this text moves further away. So, this is what I type in those situations:
C-<backspace> C-y [..] C-<backspace> C-y M-y [..] C-<backspace> C-y M-y M-y [..] C-<backspace> C-y M-y M-y M-y [..] C-<backspace> C-y M-y M-y M-y M-y [..]
You see, this is very annoying. Here's how I fixed this: I just added a defadvice
to my copying code of the above module, which puts the copied text into a emacs text register. And I created a new key binding to access this text register: C-v
. I do not use this in emacs for cursor movement (its original binding) anyway and its the default PASTE key binding on some OS'es and applications - so I'm already somewhat used to it. Now I can always yank the last copied text and it doesn't matter how many items I added to the kill-ring since copying.
Here's the code:
(advice-add 'mcyt--copy-thing :after '(lambda (&rest args) (with-temp-buffer (yank) (copy-to-register 'c (point-min) (point-max)))))(defun my-insert-c-register () (interactive) (insert-register ‘c))
(global-set-key (kbd “C-v”) ‘my-insert-c-register)