Emacs - 跳过空白字符删除

7
我试图让kill ring忽略仅包含空白字符的条目(制表符,换行符,空格等),我对elisp相当陌生,但我非常确定可以通过defadvice来实现,但我有几个问题。
  • 首先应该防止空格条目进入kill ring还是在yank时跳过它们? 我假设后者。

如果是后者,我完全不知道应该建议哪个函数,它可能是current-kill,yank或insert-for-yank之间的一个,但我不确定应该使用哪个来避免从kill ring中提取空格。

谢谢!

编辑:我非常确定可以通过操纵`current-kill'来使其继续调用自身,直到到达非空格条目为止?(或第一个出现的)


1
你能给出一个使用模式的例子,使得kill ring中存在大量无用的空格吗?我感到困惑,这怎么可能成为某些人的问题。 - Sean
2
@Sean 假设你要删除一段代码,然后稍后再粘贴回去。在遍历代码的过程中,你发现有两行相邻的空白行 :O。你删除其中一行,结果,糟糕了,剪切板上出现了一个空行。我偶尔也会遇到这种情况,非常恼人。 - Squidly
@Sean,MrBones已经完美地解释了使用情况,或者说通常情况下,一行内容后面会有大量的空格,你会很想清理它们。 - user652650
1
不要给建议,也许只需将yank键重新绑定到您自己的函数上。对我来说,这听起来会更简单和更健壮。 - tripleee
1
@MrBones 这种情况与在复制之前杀死任何其他文本时完全相同。当到达所需位置时,只需使用“M-y”即可返回到要复制的内容。我只是不明白为什么仅包含空格的中间段落应该特别令人反感。 - Sean
@sean,我的意思是我从来不需要空格,所以要么每次都弹出环,要么将kill设置为删除空格。 - Squidly
3个回答

4

从评论中看来,您在kill-ring中遇到了空格的问题,因为您杀死了空格行。我的解决方法是避免杀死空格行,并使用函数delete-blank-line (C-x C-o)。这将把一组空白行(包括空格和制表符)缩减为单个空白行。


如果一行以x个空格字符结尾,你将其删除,那么怎么办?在这种情况下,delete-blank-line无法正常工作。我认为重新定义yank可能是解决问题的方法,这将解决两种情况,并消除delete-blank-line的需要。 - user652650
1
在这种情况下,使用whitespace-cleanup(add-hook 'before-save-hook 'whitespace-cleanup)。通常更容易找到emacs的做事方式,而不是修改emacs。 - Nicolas Dudebout

2
我写了一个包clean-kill-ring.el,提供了控制剪贴板环的内容的功能。
默认情况下,启用clean-kill-ring-mode可以防止空字符串进入剪贴板环,但也可以进行更多的自定义。

0
以下建议可以避免将空格添加到 kill ring 中:

(defun night/h-kill-skip-whitespace (orig-fn string &optional rest)
  (let* (
         (string-raw (substring-no-properties string))
         (space-p (not (string-match-p "[^ \t\n\r]" string-raw))))

    (cond
     ((not space-p)
      (apply orig-fn string rest))
     (t
      (message "skipped whitespace kill")
     ))))

(advice-add 'kill-new :around #'night/h-kill-skip-whitespace)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接