Noktanın bir yorum alanında olup olmadığını nasıl tespit edebilirim?


15

Noktanın bir yorum alanında olup olmadığını nasıl tespit edebilirim?

Yanıtlar:


19

Listede döndürülen dördüncü * değerini kontrol edin syntax-ppss:

(nth 4 (syntax-ppss))

Bu var nilnokta, herhangi yorumlara dışındaysa teğer olmayan bir iç içe geçebilen yorumun içindeki veya bir tamsayı (yuvalama derinliği) bir iç içe geçebilen yorumun içindeki eğer. Daha parse-partial-sexpfazla bilgi için doktora bakın.

* Sıfır tabanlı.

Bunun Kuruluş modu ile çalışmadığını unutmayın, bunu kullanmalısınız:

(defun in-comment-p ()
  "Testy if cursor/point in a commented line?"
  (save-excursion
        (if (derived-mode-p 'org-mode)
                (save-match-data (beginning-of-line) (looking-at "^[ \t]*#"))
          (nth 4 (syntax-ppss)))))

Mükemmel, sağlayan diğer tüm bilgiler için bir belge var syntax-ppssmı?
İsim

2
Evet, doktrin için parse-partial-sexp.
legoscia

2
@ İsim: için doktrin syntax-ppsssize işaret edecek parse-partial-sexp, ikincisi size bu işlevler tarafından döndürülen tüm şeylerin bir açıklamasını verecektir. Umarım bu bir başlangıç ​​için yardımcı olur.
Dan

1
Ayrıca Emacs Lisp El Kitabı'ndaki 34.6 "İfadeleri Ayrıştırma" bölümüne bakın.
Sue D.Nymme

7

yazı tipi yüzünü kullanın, bu sineklikten öğrendiğim hiledir.

syntax-ppssİki yıl önce denedim , iki nedenden dolayı çalışmıyor:

  • Yorumun kenarında çalışmaz (yorum sınırı), örneğin, // this is commentc ++ modunda olduğu gibi yorum için , imleci /karakterin üzerine (nth 4 (syntax-ppss))koyarsanız , sonucu nil olur.

  • web modu gibi ana modlarda hiç çalışmaz

İşte ben flyspell kopyalanan kod:

(defun evilnc--in-comment-p (&optional pos)
  "Test if character at POS is comment.  If POS is nil, character at `(point)' is tested"
  (interactive)
  (unless pos (setq pos (point)))
  (let* ((fontfaces (get-text-property pos 'face)))
    (when (not (listp fontfaces))
      (setf fontfaces (list fontfaces)))
    (delq nil
          (mapcar #'(lambda (f)
                      ;; learn this trick from flyspell
                      (or (eq f 'font-lock-comment-face)
                          (eq f 'font-lock-comment-delimiter-face)))
                  fontfaces))))

Lütfen kodun, eşleşen yazı tipi yüzüyle yeni ana modları destekleyecek şekilde genişletilebileceğini unutmayın.

Bu numarayı yaklaşık üç yıldır başarısızlıkla kullandım. Ayrıca, flyspell'in uzun süre yaygın olarak kullanıldığını düşünürsek, bu yöntemin güvenilir olduğunu iddia edebilirim.

Benzer bir soru için dizeden çıkmak için hangi klavye kısayolunun kullanılacağına bakın .


1
Bir düzenleme, POSarg almayan ve kullanmayan başka bir sürüm önerdi point. Bu tür iki sürüme sahip olmak, arg'i POSisteğe bağlı yapmak ve (point)ne zamana ayarlamaktır nil.
Drew
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.