Bagaimana cara saya memfilter konten kill-ring?

9

Apakah mungkin untuk mencegah kill-ringmenyimpan spasi putih / baris kosong? Sekarang setelah saya melakukan beberapa perubahan dan kemudian pergi ke browse-kill-ringsaya sering melihat sesuatu seperti ini:

-------



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

-------

-------

Apakah ada cara memaksa kill-ring hanya menambahkan konten yang bermakna?

Ignacy Moryc
sumber
1
Bukan jawaban, tapi saya menggunakan helm-show-kill-ringdan sepertinya menyaring entri cincin membunuh kosong. Saya masih bisa menarik banyak spasi, jadi +1 untuk pertanyaannya.
glukas
Hal paling dekat yang ada di kill-do-not-save-duplicatesdalamnya adalah , yang mencegah kill-newdari menambahkan hal yang sama ke ring bunuh dua kali berturut-turut.
glukas

Jawaban:

3

Inilah satu pendekatan untuk menangani pembunuhan kosong (yaitu hanya spasi kosong). Daripada memfilter semuanya, ini akan memungkinkan paling banyak satu entri kosong di ring bunuh. Setiap pembunuhan baru akan memeriksa kepala cincin pembunuhan dan menggantinya jika itu kosong.

(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)

Perhatikan bahwa saya menggunakan mekanisme saran Emacs 24.4+ di sini untuk memfilter argumen yang akhirnya diteruskan kill-new.

Efeknya adalah bahwa Anda masih bisa membunuh dan menarik banyak ruang putih, tetapi jika Anda membunuh beberapa ruang putih dan kemudian membunuh sesuatu yang lain, entri spasi putih akan dibuang.

glukas
sumber
Anda dapat memilih untuk tidak menambahkan ke cincin membunuh insteda jika Anda mau. Pendekatan ini berfungsi untuk kill,, kill-ring-savedll. Jika Anda memiliki perintah yang menambah cincin bunuh tanpa menelepon kill-newmaka itu tidak akan berhasil, tentu saja.
glucas
Yang ini menyelesaikannya untuk saya. Saya pikir saya tidak menggunakan perintah apa pun yang menambah ring kill tanpa kill-new, atau setidaknya saya tidak melihat adanya perilaku aneh.
Ignacy Moryc
0

Satu masalah adalah bahwa perintah apa pun dapat memodifikasi kill-ringsehingga satu - satunya pengait yang cukup kuat untuk melakukan ini adalah post-command-hook. Ini tidak efisien, tetapi AFAIK satu-satunya cara untuk melakukan ini dengan keras. Jika itu kedengarannya baik bagi Anda, Anda dapat melakukan ini:

(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)

Demi efisiensi, saya berasumsi bahwa semua perintah ditambahkan ke kill-ring, ini mungkin aman, tetapi perhatikan bahwa suatu fungsi dapat menyisipkan teks di mana saja mereka inginkan ke dalam kill-ring. Ini jarang terjadi, dan saya yakin Anda tidak ingin mengulangi seluruh cincin bunuh pada setiap perintah.

PythonNut
sumber
Cara yang sedikit lebih efisien untuk melakukan ini mungkin dengan membersihkan cincin bunuh tepat sebelum Anda menarik atau menelusuri, baik melalui defadvice atau perintah Anda sendiri.
Sacha Chua
Saya berpikir tentang itu, tetapi kemudian kita akan memerlukan daftar semua perintah yang mengakses cincin bunuh untuk menarik. Jika ada yang bisa membuat daftar, maka sisanya akan mudah (tentu saja).
PythonNut