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 命令即可快速搜索复制历史并粘贴到光标处.

3 个赞

假设用的是 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 改造一下,改为:

  • 不修改 kill ring,只是监控 kill ring 是否(因 C-k)产生变化。
  • C-y 的时候,如果 kill ring 无变化,就直接 yank;如果已改变,弹出 kill ring 搜索框(kill-ring-search / helm-show-kill-ring)。

或者干脆另外写个 paste 函数,只粘贴来自 C-w / M-w 的内容,摆脱 kill ring。

1 个赞

browse-kill-ringcounsel-kill-ring-pop很好用

browse-kill-ringcounsel-kill-ring-pop很好用。

2 个赞

browse-kill-ring 很好用,感谢推荐。