Geçerli satırın "boş" olup olmadığını kontrol etmenin en kolay yolu (boşluk yoksayılıyor)?


15

Sadece mevcut satırın boş olup olmadığını kontrol etmek istiyorum (sadece boşluk içeriyorsa, yine de boş olduğunu düşünüyorum).

İşte ilk versiyonum:

(defun strip-text-properties(txt)
  (set-text-properties 0 (length txt) nil txt)
  txt)

(defun is-current-line-empty ()
  (interactive)
  (setq c-line (thing-at-point 'line))
  (string-match "^\s*$" (strip-text-properties c-line)))

Geçerli satırın boş olup olmadığını kontrol etmenin en kolay yolu nedir?


3
Lisp dizgisinde yazı yazmakla \seşdeğerdir s. Belki demek istedin "^\\s*$".
YoungFrog

3
Genel bir yorum olarak, dizgelerle bir şeyler yapmak yerine (diğer dillerde yapma eğilimi gibi) tamponlar üzerindeki eylemler hakkında düşünmeye başladığınızda elisp daha anlamlı olacaktır . Bir test yapmak için bir ipin izole edilmesi ve çıkarılması (a) verimsiz olması ve (b) eldeki alet sayısını önemli ölçüde azaltması muhtemeldir. Elisp, doğrudan arabelleklerin içeriğinde bir şeyler yapmakta gerçekten iyidir .
phils

1
@ YoungFrog, \\s-bunun yerine de olmalı \\s. Bu tire, elisp normal ifadesinde gereklidir.
Kaushal Modi

Yanıtlar:


25

Böyle bir şey "daha kolay" olur mu?

(defun current-line-empty-p ()
  (save-excursion
    (beginning-of-line)
    (looking-at-p "[[:space:]]*$")))

12

Sahip olduğunuza yakın basit bir yöntem:

(defun current-line-empty-p ()
  (string-match-p "\\`\\s-*$" (thing-at-point 'line)))

Bu çözümü seviyorum çünkü değişmiyor match-data.
nispio

1
Bunun \\s-yerine sahip olmalısınız \s. Bu çözümü denediniz mi?
Kaushal Modi

İşin garibi, biraz kullanıyorum. Ama bunu hafızamdan yazdım. Haklısın.
PythonNut

1
hala kısa çizgiyi mi kaçırıyorsunuz? :)
Kaushal Modi

Erken oldu ve henüz tam olarak uyanmamıştım.
PythonNut

4
(defun blank-line-p (&optional pos)
  "Returns `t' if line (optionally, line at POS) is empty or
composed only of whitespace."
  (save-excursion
    (goto-char (or pos (point)))
    (beginning-of-line)
    (= (point-at-eol)
       (progn (skip-syntax-forward " ") (point)))))

1

Öneririm:

(defun blank-line-p ()
  (and (progn (skip-chars-backward " ") (bolp))
       (progn (skip-chars-forward " ") (eolp))))

(S'nin prognaslında gereksiz olduğunu unutmayın çünkü atlama işlevleri asla sıfır döndürmez). Dan'ın cevabında yaptığı gibi, skip-syntax-*bunun yerine kullanılabilir.


3
Bu, yalnızca sekmeleri içeren bir satırı boş olarak tanımlamaz. skip-syntax-*burada kullanılacak doğru işlevler kümesidir.
Gilles 'SO- kötü olmayı bırak'

1

İşte bunun için comment-dwim-2paketten alınan başka bir basit çözüm

(defun is-empty-line-p ()
  (string-match "^[[:blank:]]*$"
        (buffer-substring (line-beginning-position)
                          (line-end-position))))

1

Bu, PythonNut'un benim için işe yaramayan cevaplarının bir modifikasyonudur (neden?):

(defun current-line-blank ()
  (= 0 (string-match-p "^\\s-*$" (thing-at-point 'line))))

string-match-pgeçerli satır boş olmadığında sonraki satırın dizinini döndürdü. Bu yüzden dönüş değerinin 0 olduğunu kontrol ettim.


Bir sonraki satırın dizini? Tam olarak ne demek istiyorsun? (ve emacs.SE üzerinde hoş geldiniz!)
jeanpierre

@JeanPierre (thing-at-point 'line)satır sonundaki yeni satırı içerir. Geçerli satır boş değilse, normal ifade bu yeni satırla eşleşir. string-match-pBurada nil döndüren tek zaman arabellek son satırında (ve Dario, arabellek bir satırsonu ile bitmezse sürümünüz son satırda çalışmaz).
Gilles 'SO- kötü olmayı bırak'

Dizideki herhangi bir satırın başlangıcıyla eşleştirmek yerine dizenin başlangıcıyla eşleşmek daha iyi bir çözüm olabilir. PythonNut'un cevabını düzenledim.
Gilles 'SO- kötü olmayı bırak'

0

current-indentation satırın sonundaki sütuna göre karşılaştırılabilecek önde gelen boşlukları izleyen sütunu verir:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
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.