Mevcut karakterin bu ana mod için bir yorum karakteri olup olmadığını nasıl tespit edebilirim?


12

Geçerli satıra bir sonraki satırı çeken bu küçük fonksiyon üzerinde çalışıyorum. Geçerli satır bir satır yorum ve sonraki satır da bir satır yorum ise, yorum karakterleri "pull-up" eyleminden sonra kaldırılır, böylece bir işlevsellik eklemek istiyorum.

Misal:

Önce

;; comment 1▮
;; comment 2

çağrı M-x modi/pull-up-line

Sonra

;; comment 1▮comment 2

;;Daha önce olan karakterlerin kaldırıldığını unutmayın comment 2.

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      (while (looking-at "/\\|;\\|#")
        (delete-forward-char 1))
      (when (looking-at "\\s-")
        (delete-forward-char 1)))))

Yukarıdaki fonksiyon çalışır ama şimdi, ne olursa olsun büyük-mod, bu dikkate alacaktır /ya ;ya #bir açıklama karakteri olarak: (looking-at "/\\|;\\|#").

Bu çizgiyi daha akıllı yapmak istiyorum; büyük moda özgü.

Çözüm

@Ericstokes'in çözümü sayesinde, aşağıdakilerin artık tüm kullanım durumlarımı kapsadığına inanıyorum :)

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      ;; Delete all comment-start or space characters
      (while (looking-at (concat "\\s<" ; comment-start char as per syntax table
                                 "\\|" (substring comment-start 0 1) ; first char of `comment-start'
                                 "\\|" "\\s-")) ; extra spaces
        (delete-forward-char 1)))))

Bunun farklı yorum başlangıç ​​ve bitiş karakterlerini ve çok karakterli yorumları (örn. C'ler /* ... */) işleyecek kadar akıllı olmasını ister misiniz ?
erikstokes

Hayır, ihtiyacım olan buydu. Teşekkürler!
Kaushal Modi

@erikstokes Meraktan, C tarzı yorumları nasıl ele alırsınız?
Pradhan

Bu çözüm çok satırlı yorumlarla hemen çalışır, özel bir şey yapılması gerekmez, çünkü çok satırlı yorumlara katılırken herhangi bir karakteri silmemiz gerekmez.
Kaushal Modi

2
@Pradhan "/ *" ve "* /" olarak ayarlanmış (ancak değil ) comment-startve comment-enddizeleri vardır . Ve her iki stile de uyuyor. Bitiş karakterlerini, ardından katıldıktan sonra başlangıcını silersiniz. Ama çözüm için olacağını düşünüyorum , ve yorum karakteri ne olduğu hakkında Emacs endişe edelim. c-modec++-modec-comment-start-regexpuncomment-regionjoin-linecomment-region
erikstokes

Yanıtlar:


12

Geçerli karakter sözdizimi tablosunu kullanarak bir açıklama karakterini olup olmadığını kontrol edebilirsiniz: (looking-at "\\s<"). Normal ifade \\s<, herhangi bir karakteri "yorum başlatma" sözdizimiyle eşleştirir; \\s>"yorum sonu" sözdizimi ile eşleşecektir.

Başka bir seçenek de ve arkadaşlar comment-starttarafından eklenen dize olan değişkendir comment-dwim. Genellikle yorum başlangıç ​​karakterine ve bir miktar boşluğa ayarlanır.


2

Çok daha basit bir çözüm var , lütfen kodumu https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el adresinde inceleyin.

Tüm kodu buraya kopyalayıp yapıştırmayacağım. ama işte kilit noktalar:

  • yorumun kendi yazı tipi yüzü, arama yazı tipi-kilit-yorum-yüz ve yazı tipi-kilit-yorum-sınırlayıcı-yüz kodumda var

  • İkinci satırı açmak için Emacs kendi API'sını kullanın, ardından ilk satırla birleştirin

Herhangi bir makul ana modda çalışmalıdır.

Bu numara benim tarafımdan icat edilmedi. Aslında Emacs'ın kendi kodundan (daha spesifik olarak sinek yazım). Bu nedenle çözüm, herhangi bir büyük mod sineklik desteğini desteklemelidir


3
Bir şeyi yorum olarak vurgulamak için, sözdizimi tablosunun uygun şekilde ayarlanmasını gerektirir, bu yüzden bu sözdizimine bakmanın alternatifinden daha akıllı olduğundan şüpheliyim.
wasamasa

Kodumu belgelediğim gibi, bu numarayı Emacs'ın kendi kodunu (aslında sineklik) okuyarak öğrendim.
chen bin

0

Lisp kodu (Elisp, Clojure, Scheme ve Common Lisp) için bu özelliği arıyorsanız, lispy'ı denemelisiniz , adı verilen bir işlev lispy-fillbu tür bir şey yapar.

Bu özelliği başka bir dil için arıyorsanız, o zaman rebox2 ( Cve için doğrulandı Python), adlı bir işlev rebox-fillveya adlı başka bir işlev rebox-dwimbu tür bir şey yapmalısınız.

Her ikisi de harika paketlerdir ve farklı ana modlar için kullanıldıkları için birbirleriyle çatışmazlar ve her ikisi de ( lispy-fillve rebox-dwim) M-qoldukça temizdir.

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.