【问题标题】:Emacs - Skip whitespace killsEmacs - 跳过空格杀死
【发布时间】:2023-03-28 17:15:01
【问题描述】:

我正在尝试使 kill ring 基本上忽略仅空白条目(制表符、换行符、仅空格等),我对 elisp 相当陌生,我很确定要做的方法是做 defadvice 但是我有几个问题。

  • 首先阻止空白条目进入杀戮环,还是在 yank 时跳过它们会更好?我假设是后者。

在这种情况下,我完全不知道我应该建议哪个函数,它在 current-kill、yank 和 insert-for-yank 之间 - 但我不完全确定我应该操纵哪个函数来不从 kill 中拉出空格响。

谢谢!

编辑:我很确定这样做的方法是操纵“current-kill”以继续调用自身,直到它到达非空白条目? (或环结束,以先到者为准)

【问题讨论】:

  • 您能否举一个使用模式的示例,该模式会导致 kill ring 中出现大量无用的空格?我感到很困惑,这对某人来说可能是个问题。
  • @Sean 以您杀死一个代码区域的情况为例,稍后您将对其进行拉取。在遍历将要插入代码的位置的途中,您会发现两个相邻的空白行:O。你杀了其中一个,现在,该死的,杀戮环上有一条空线。我时不时会遇到这种情况,这很烦人。
  • @Sean,MrBones 的用例非常完美,或者你经常在一行内容之后有大量空白,你会为了清理它而杀戮。
  • 而不是建议,也许只是将 yank 键重新绑定到您自己的功能。在我看来,这听起来会更简单、更健壮。
  • @MrBones 这与您在拉出前一个杀戮的途中杀死任何其他文本时的情况完全相同。当你到达那里时,你只需使用M-y 来支持你想要的杀戮。我只是不明白为什么只有空格的中间杀戮应该特别令人反感。

标签: emacs elisp advising-functions defadvice


【解决方案1】:

从 cmets 看来,由于您杀死了空白行,因此您的 kill-ring 中的空白似乎存在问题。我的解决方案是避免杀死空白行并改用函数delete-blank-line (C-x C-o)。这会将一组空行(包括空格和制表符)减少为一个空行。

【讨论】:

  • 如果一行以 x 个空格字符结尾的情况,你会杀死吗? delete-blank-line 在这种情况下不起作用。我认为重新定义 yank 可能是解决这两种情况的方法,并且不需要删除空白行。
  • 在这种情况下使用whitespace-cleanup(add-hook 'before-save-hook 'whitespace-cleanup)。通常比修改 emacs 更容易找到 emacs 的做事方式。
【解决方案2】:

我编写了一个包clean-kill-ring.el,它提供了控制杀戮环中允许的内容的功能。

默认启用clean-kill-ring-mode 可防止空白字符串进入kill ring,但也可以进一步自定义。

【讨论】:

    【解决方案3】:

    以下建议一开始就不允许将空格添加到 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多