Cara termudah untuk memeriksa apakah baris saat ini "kosong" (mengabaikan spasi putih)?


14

Saya hanya ingin memeriksa apakah baris saat ini kosong atau tidak (jika hanya berisi spasi, maka saya masih menganggapnya kosong).

Ini adalah versi awal saya:

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

Apa cara termudah untuk memeriksa apakah saluran saat ini kosong?


3
Dalam string lisp, menulis \ssama dengan menulis s. Mungkin maksudmu "^\\s*$".
YoungFrog

3
Sebagai komentar umum, elisp akan lebih masuk akal begitu Anda mulai berpikir dalam hal tindakan pada buffer , sebagai lawan (karena orang cenderung melakukan dalam bahasa lain) melakukan sesuatu dengan string . Mengisolasi dan mengekstraksi string untuk melakukan beberapa tes cenderung (a) tidak efisien, dan (b) secara dramatis mengurangi jumlah alat yang Anda inginkan. Elisp sangat pandai melakukan hal-hal langsung pada isi buffer.
phils

1
@YoungFrog, juga seharusnya \\s-bukan \\s. Tanda hubung itu diperlukan di elisp regexp.
Kaushal Modi

Jawaban:


24

Apakah hal seperti ini menjadi "lebih mudah"?

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

12

Metode sederhana, dekat dengan apa yang Anda miliki:

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

Saya suka solusi ini karena tidak dimodifikasi match-data.
nispio

1
Anda harus memiliki \\s-alih - alih \s. Sudahkah Anda mencoba solusi itu?
Kaushal Modi

Anehnya, saya menggunakannya sedikit. Tapi saya baru saja menulis ini karena ingatan. Anda benar.
PythonNut

1
masih melewatkan tanda hubung? :)
Kaushal Modi

Saat itu masih pagi, dan saya belum sepenuhnya bangun.
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

Saya menyarankan:

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

(Perhatikan bahwa progns sebenarnya tidak diperlukan karena fungsi lompatan tidak pernah mengembalikan nol). Seperti yang dilakukan Dan dalam jawabannya, skip-syntax-*bisa juga digunakan sebagai gantinya.


3
Ini tidak mengidentifikasi baris yang hanya berisi tab sebagai kosong. skip-syntax-*adalah rangkaian fungsi yang tepat untuk digunakan di sini.
Gilles 'SO- stop being evil'

1

Berikut ini adalah solusi sederhana untuk itu, diambil dari comment-dwim-2paket

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

1

Ini adalah modifikasi dari jawaban PythonNut yang tidak berfungsi untuk saya (mengapa?):

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

string-match-pmengembalikan indeks baris berikutnya setiap kali baris saat ini tidak kosong. Jadi saya memeriksa bahwa nilai kembali adalah 0.


Indeks baris berikutnya? Apa maksudmu sebenarnya? (dan selamat datang di emacs.SE!)
JeanPierre

@JeanPierre (thing-at-point 'line)menyertakan baris baru di akhir baris. Jika baris saat ini tidak kosong, regexp cocok dengan baris baru itu. Satu-satunya waktu string-match-pmengembalikan nol di sini adalah pada baris terakhir dari buffer (dan Dario, versi Anda tidak bekerja pada baris terakhir jika buffer tidak diakhiri dengan baris baru).
Gilles 'SO- stop being evil'

Perbaikan yang lebih baik adalah dengan mencocokkan awal string daripada mencocokkan awal setiap baris dalam string. Saya telah mengedit jawaban PythonNut.
Gilles 'SANGAT berhenti menjadi jahat'

0

current-indentation memberi Anda kolom berikut blanko terkemuka, yang dapat dibandingkan dengan kolom di akhir baris:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.