Làm cách nào để lọc nội dung kill-ring?


9

Có thể ngăn chặn kill-ringlưu trữ khoảng trắng / dòng trống? Ngay bây giờ sau khi tôi thực hiện một vài thay đổi và sau đó đi đến browse-kill-ringtôi thường thấy một cái gì đó như thế này:

-------



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

-------

-------

Có cách nào để buộc kill-ring chỉ nối thêm nội dung có ý nghĩa không?


1
Không phải là một câu trả lời, nhưng tôi đang sử dụng helm-show-kill-ringvà nó dường như lọc ra các mục tiêu diệt vòng trống. Tôi vẫn có thể kéo một loạt khoảng trắng, vì vậy +1 cho câu hỏi.
glucas

Điều gần nhất được xây dựng trong dường như là kill-do-not-save-duplicates, ngăn không cho kill-newthêm điều tương tự vào vòng tiêu diệt hai lần liên tiếp.
glucas

Câu trả lời:


3

Đây là một cách tiếp cận để xử lý các khoảng trống (tức là chỉ khoảng trắng). Thay vì lọc chúng hoàn toàn, điều này sẽ cho phép nhiều nhất một mục trống trong vòng khử. Mỗi kill mới sẽ kiểm tra phần đầu của kill-ring và thay thế nó nếu nó trống.

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

Lưu ý rằng tôi đang sử dụng cơ chế tư vấn Emacs 24.4+ ở đây để lọc các đối số mà cuối cùng được chuyển đến kill-new.

Hiệu quả là bạn vẫn có thể giết và lấy một loạt khoảng trắng, nhưng nếu bạn giết một khoảng trắng nào đó và sau đó giết một thứ khác, mục nhập khoảng trắng sẽ bị loại bỏ.


Bạn có thể chọn không thêm insteda vòng giết nếu bạn thích. Cách tiếp cận này hoạt động cho kill, kill-ring-savev.v. Nếu bạn có các lệnh thêm vào vòng kill mà không gọi kill-newthì dĩ nhiên nó sẽ không hoạt động.
glucas

Điều này đã giải quyết nó cho tôi. Tôi nghĩ rằng tôi không sử dụng bất kỳ lệnh nào thêm vào để giết nhẫn mà không giết mới, hoặc ít nhất tôi đã không nhận thấy bất kỳ hành vi kỳ lạ nào.
Bỏ qua Moryc

0

Một vấn đề là bất kỳ lệnh nào cũng có thể sửa đổi, kill-ringvì vậy hook duy nhất đủ mạnh để thực hiện điều này là post-command-hook. Điều này là không hiệu quả, nhưng AFAIK là cách duy nhất để làm điều này với sự nghiêm ngặt. Nếu điều đó có vẻ tốt với bạn, bạn có thể làm điều này:

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

Vì mục đích hiệu quả, tôi giả sử rằng tất cả các lệnh nối vào kill-ring, điều này có thể an toàn, nhưng lưu ý rằng một chức năng có thể chèn văn bản bất cứ nơi nào chúng muốn vào kill-ring. Tuy nhiên, điều này rất hiếm và tôi chắc chắn rằng bạn không muốn lặp lại toàn bộ vòng tiêu diệt trên mỗi lệnh.


Một cách hiệu quả hơn một chút để làm điều này có thể là dọn sạch vòng giết ngay trước khi bạn kéo hoặc duyệt nó, thông qua defadvice hoặc các lệnh của riêng bạn.
Sacha Chua

Tôi nghĩ về điều đó, nhưng sau đó chúng tôi sẽ cần một danh sách tất cả các lệnh truy cập vào vòng giết để kéo dài. Nếu bất cứ ai có thể đưa ra một danh sách, thì phần còn lại sẽ dễ dàng (tất nhiên).
PythonNut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.