Como filtrar o conteúdo do anel de interrupção?

9

É possível impedir o kill-ringarmazenamento de espaços em branco / linhas vazias? Agora, depois de fazer algumas alterações e depois ir para browse-kill-ring, geralmente vejo algo assim:

-------



-------
   merchant_uuid: "some_uuid"
-------
   it "creates a webhook" do
-------

-------

-------

Existe uma maneira de forçar o kill-ring a acrescentar apenas conteúdo significativo?

Ignacy Moryc
fonte
1
Não é uma resposta, mas estou usando helm-show-kill-ringe parece filtrar as entradas do anel de morte em branco. Ainda posso arrancar um monte de espaços em branco, então +1 para a pergunta.
glucas
A coisa mais próxima que é incorporada parece ser kill-do-not-save-duplicates, o que impede a kill-newadição da mesma coisa ao anel de morte duas vezes seguidas.
glucas

Respostas:

3

Aqui está uma abordagem para lidar com mortes em branco (ou seja, apenas em branco). Em vez de filtrá-los completamente, isso permitirá, no máximo, uma entrada em branco no anel de morte. Cada nova morte checa a cabeça do anel de morte e a substitui se estiver em branco.

(defun my/replace-blank-kill (args)
  (let ((string (car args))
        (replace (cdr args))
        (last (car-safe kill-ring)))
    (when (and last (string-blank-p last))
      (setq replace t))
    (list string replace)))

(advice-add 'kill-new :filter-args #'my/replace-blank-kill)

Observe que estou usando o mecanismo de aconselhamento do Emacs 24.4+ aqui para filtrar os argumentos que acabam sendo transmitidos kill-new.

O efeito é que você ainda pode matar e puxar vários espaços em branco, mas se você matar algum espaço em branco e depois matar outra coisa, a entrada de espaço em branco será descartada.

glucas
fonte
Você pode optar por não adicionar o anel de morte instantaneamente, se preferir. Essa abordagem funciona para kill, kill-ring-saveetc. Se você possui comandos que são adicionados ao anel de interrupção sem chamar, kill-newentão não funcionará, é claro.
glucas
Este resolveu para mim. Acho que não uso nenhum comando que seja adicionado ao kill ring sem kill-new, ou pelo menos não notei nenhum comportamento estranho.
Ignacy Moryc
0

Um problema é que qualquer comando pode modificar o kill-ringmodo que o único gancho poderoso o suficiente para fazer isso é o post-command-hook. Isso é ineficiente, mas o AFAIK é a única maneira de fazer isso com rigor. Se isso lhe parece bom, você pode fazer o seguinte:

(defun kill-ring-clean-whitespace-only ()
  (when (string-match "^[[:space:]]*$" (car kill-ring))
    (setq kill-ring (cdr kill-ring))))

(add-hook 'post-command-hook #'kill-ring-clean-whitespace-only)

Por uma questão de eficiência, presumo que todos os comandos sejam anexados a kill-ring, isso provavelmente é seguro, mas observe que uma função pode inserir texto em qualquer lugar que desejar kill-ring. Isso é raro, porém, e tenho certeza que você não deseja repetir todo o anel de morte em todos os comandos.

PythonNut
fonte
Uma maneira um pouco mais eficiente de fazer isso pode ser limpar o anel de matança imediatamente antes de puxá-lo ou procurá-lo, seja por meio de defadvice ou por seus próprios comandos.
Sacha Chua
Eu pensei sobre isso, mas então precisaríamos de uma lista de todos os comandos que acessam o ringue para puxar. Se alguém puder criar uma lista, o resto seria fácil (é claro).
precisa saber é o seguinte