我有时候需要从其他地方复制文本,但是如果在emacs中使用了kill(比如常用的C-k)一类的操作就会覆盖了剪贴板,导致我不得不重新复制。
各位是怎样处理的呢?
我有时候需要从其他地方复制文本,但是如果在emacs中使用了kill(比如常用的C-k)一类的操作就会覆盖了剪贴板,导致我不得不重新复制。
各位是怎样处理的呢?
我就用默认的了,用个剪切板软件记录下copy过的东西就行了。也尝试过改,但发现不是拷贝,就是粘贴有问题,所以就算了。
如果用的是 linux 并且使用 fcitx 输入法的话,可以使用其自带的一个剪切板记录工具,默认可以记录 5 条记录,最多可以支持 16 条,还可以保存至文件什么的,挺好用的
使用 kill-ring-search.el/kill-ring-search.el at master · nschum/kill-ring-search.el · GitHub 吧
随意复制, 想复制的时候, 直接调用 kill-ring-search 命令即可快速搜索复制历史并粘贴到光标处.
假设用的是 Emacs 原生方法操作 kill-ring,C-k
绑定的是 kill-line
,没用任何扩展(例如 evil):
(defun around@kill-line (fn &rest args)
(let ((last-content (pop kill-ring)))
(apply fn args)
(kill-new last-content)))
(advice-add 'kill-line :around 'around@kill-line)
测试:
(with-temp-buffer
(insert "aa\nbb")
;; copy "aa"
(goto-char (point-min))
(mark-line)
(kill-ring-save (point-at-bol) (point-at-eol)) ;; `M-w'
;; delete "bb"
(forward-line)
(kill-line) ;; `C-k'
;; paste "aa"
(yank) ;; `C-y'
;; assert
(let ((expected "aa\naa")
(actual (buffer-string)))
(unless (string= actual expected)
(error "expected: %S\nactual: %S" actual expected)
)))
复制删除黏贴之后,如果临时 buffer 的区内容不是 "aa\naa"
,测试代码会报错。
Ctrl + K 有时候可以当做一种 Ctrl + W 用, 然后在不用的地方多次 Ctrl + Y, 非常方便.
advice 反而把逻辑弄混乱了.
其实 kill-ring-search 这个插件就能很好的解决楼主的问题.
ivy/counsel 有一个counsel-kill-ring-pop
很好用
我也觉得。前面只不过提供了一种思路,毕竟每个人习惯都不一样。也可以写个 delete-line
来替换 kill-line
:
(defun delete-line (&optional arg)
(interactive "P")
(flet ((kill-region (begin end)
(delete-region begin end)))
(kill-line arg)))
(global-set-key (kbd "C-k") 'delete-line)
如果不想改变 kill ring,用 kill-ring-search 是个好主意。或者用 helm 的 helm-show-kill-ring
函数也不错,但是我很少想起这个操作,多一个快捷键多一份负担。我想是不是可以把前面的 advice 改造一下,改为:
C-k
)产生变化。C-y
的时候,如果 kill ring 无变化,就直接 yank
;如果已改变,弹出 kill ring 搜索框(kill-ring-search / helm-show-kill-ring)。或者干脆另外写个 paste
函数,只粘贴来自 C-w
/ M-w
的内容,摆脱 kill ring。
browse-kill-ring 很好用,感谢推荐。