Tüm yorumları yüzüğü öldürmek için hareket ettirmeden bir arabellekten silme işlevi


9

Elisp kodundan bir arabellekten tüm yorumları kaldırabilmeliyim. Şimdilik kullanıyorum:

(goto-char (point-min))
(comment-kill (count-lines (point-min) (point-max)))

Bununla birlikte, comment-killetkileşimli bir işlevdir ve birincil kullanımı bir kerede bir yorumu silmektir. Ayrıca, öldürdüğü tüm yorumları öldürme halkasına eklediğinden can sıkıcı görünür yan etkileri vardır.

Bir arabellekten bazı veya tüm yorumları silmeye (öldürmemeye) izin veren bir işlev var mı?


Bunu yapabilmek için bir M-x flush-lines ^\s-*\/\/şey yapabilirsiniz . Mükemmel değil, ama bazen işe yarayabilir.
wvxvw

@wvxvw Öneri için teşekkürler! Ancak, kısaca bu şekilde gitmeyi düşündüm ve çok karmaşık olacağı sonucuna vardım: gömme çizgiler işe yaramayacak, çünkü yorumlar tüm satırı almayabilir (replace-regexp tamam olurdu); daha sinir bozucu olarak, yorumlar için birkaç sözdizimi vardır ve iç içe yerleştirilebilirler, bu da (muhtemelen) normal ifadelerin erişemeyeceği bir yer haline getirir.
T. Verron

Meraktan, yorumların kalıcı olarak kaldırılmasını mı yoksa sadece geçici olarak yoldan çekilmesini mi istiyorsunuz? Belki de sadece onları gizlemek mi istiyorsun?
Drew

Yanıtlar:


11

Genel olarak, elisp kodunun bir parçası olarak komutları kullanmanın yanlış bir yanı yoktur. Yalnızca etkileşimli kullanım amaçlı işlevler sizi bu konuda uyaracaktır (veya etmelidir). next-lineÖrneğin bakınız .

Silmek için öldürmek yerine, kill-ringdeğiştirilmediğinden emin olun :

(goto-char (point-min))
(let (kill-ring)
  (comment-kill (count-lines (point-min) (point-max))))

Evet, anladım. Bu komutla ilgili ana sorunum (yanıtladığınız) kill-ring ve potansiyel optimizasyon sorunları (karşılaştırılacak bir şey yoksa potansiyel olarak kalacak).
T. Verron

7

@ Malabarba'nın cevabı en basit ve zarif çözüm gibi görünüyor. Ancak, bunu kendi işlevini gerektirecek kadar yaparsanız comment-kill, kill halkasını değiştirmeden silmeye de adapte olabilirsiniz . Tanımlamak comment-killiçin tek satırlı değişikliğin kaynak kodu şöyledir comment-delete:

(defun comment-delete (arg)
  "Delete the first comment on this line, if any.  Don't touch
the kill ring.  With prefix ARG, delete comments on that many
lines starting with this one."
  (interactive "P")
  (comment-normalize-vars)
  (dotimes (_i (prefix-numeric-value arg))
    (save-excursion
      (beginning-of-line)
      (let ((cs (comment-search-forward (line-end-position) t)))
    (when cs
      (goto-char cs)
      (skip-syntax-backward " ")
      (setq cs (point))
      (comment-forward)
      ;; (kill-region cs (if (bolp) (1- (point)) (point))) ; original
      (delete-region cs (if (bolp) (1- (point)) (point)))  ; replace kill-region with delete-region
      (indent-according-to-mode))))
    (if arg (forward-line 1))))

Ve işte, mevcut satırdaki, etkin bölgedeki veya tüm arabellekteki yorumları silmenize olanak tanıyan bazı ek işlevler sağlayan bir işlev (NB: minimal olarak test edilmiştir):

(defun comment-delete-dwim (beg end arg)
  "Delete comments without touching the kill ring.  With active
region, delete comments in region.  With prefix, delete comments
in whole buffer.  With neither, delete comments on current line."
  (interactive "r\nP")
  (let ((lines (cond (arg
                      (count-lines (point-min) (point-max)))
                     ((region-active-p)
                      (count-lines beg end)))))
    (save-excursion
      (when lines
        (goto-char (if arg (point-min) beg)))
      (comment-delete (or lines 1)))))

Performans sorunlarını kontrol etmedim, ama belki de öldürme halkasına dokunmamaktan küçük bir yumru var. Ne olursa olsun, gerçekten büyük bir tamponla çalışmadığınız sürece performans sorunlarını fark edeceğinizden şüpheliyim. Ancak bu işlevi çok sık kullanmanız mümkün olmadığından, optimizasyon üzerinde çalışmak için çaba göstermeye değmeyecek gibi görünüyor.


Ah, fonksiyon olduğu geniş tamponlar bazen çok sık çalıştırın ve. Ancak, parçası olduğu makinelerin en azından şimdilik daha kötü darboğazları var.
T. Verron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.