Cách dễ nhất để kiểm tra xem dòng hiện tại có phải là trống rỗng (bỏ qua khoảng trắng) không?


14

Tôi chỉ muốn kiểm tra xem dòng hiện tại có trống hay không (nếu nó chỉ chứa khoảng trắng, thì tôi vẫn coi nó là trống).

Đây là phiên bản ban đầu của tôi:

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

Cách dễ nhất để kiểm tra nếu dòng hiện tại là trống?


3
Trong một chuỗi lisp, viết \stương đương với viết s. Có lẽ bạn có ý đó "^\\s*$".
YoungFrog

3
Như một nhận xét chung, elisp sẽ có ý nghĩa hơn một khi bạn bắt đầu suy nghĩ về các hành động trên bộ đệm , trái ngược với (như người ta có xu hướng làm trong các ngôn ngữ khác) làm mọi việc bằng chuỗi . Cô lập và trích xuất một chuỗi để thực hiện một số thử nghiệm có khả năng (a) không hiệu quả và (b) giảm đáng kể số lượng công cụ theo ý của bạn. Elisp thực sự giỏi trong việc làm mọi thứ trực tiếp trên nội dung của bộ đệm.
phils

1
@YoungFrog, cũng nên \\s-thay thế \\s. Dấu gạch nối đó là bắt buộc trong regisp elisp.
Kaushal Modi

Câu trả lời:


24

Một cái gì đó như thế này sẽ "dễ dàng" hơn?

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

12

Một phương pháp đơn giản, gần với những gì bạn có:

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

Tôi thích giải pháp này vì nó không sửa đổi match-data.
nispio

1
Bạn cần phải có \\s-thay vì \s. Bạn đã thử giải pháp đó chưa?
Kaushal Modi

Điều kỳ lạ là tôi sử dụng nó khá nhiều. Nhưng tôi chỉ viết điều này ra khỏi bộ nhớ. Bạn nói đúng.
PythonNut

1
vẫn còn thiếu dấu gạch nối? :)
Kaushal Modi

Đó là sớm, và tôi chưa hoàn toàn thức dậy.
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

Tôi đề nghị:

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

(Lưu ý rằng progntrên thực tế không cần thiết vì các hàm bỏ qua không bao giờ trả về nil). Như Dan làm trong câu trả lời của mình, skip-syntax-*cũng có thể được sử dụng thay thế.


3
Điều này không xác định một dòng chỉ chứa các tab là trống. skip-syntax-*là tập hợp đúng các chức năng sử dụng ở đây.
Gilles 'SO- ngừng trở nên xấu xa'

1

Đây là một giải pháp đơn giản cho nó, được lấy từ comment-dwim-2gói

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

1

Đây là bản sửa đổi về những gì PythonNut đã trả lời không phù hợp với tôi (tại sao?):

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

string-match-ptrả về chỉ mục của dòng tiếp theo bất cứ khi nào dòng hiện tại không trống. Vì vậy, tôi đã kiểm tra giá trị trả về là 0.


Chỉ số của dòng tiếp theo? bạn có ý nghĩa gì chính xác? (và chào mừng bạn trên emacs.SE!)
JeanPierre

@JeanPierre (thing-at-point 'line)bao gồm dòng mới ở cuối dòng. Nếu dòng hiện tại không trống, biểu thức chính quy phù hợp với dòng mới đó. Thời gian duy nhất string-match-ptrả về con số không ở đây là trên dòng cuối cùng của bộ đệm (và Dario, phiên bản của bạn không hoạt động trên dòng cuối cùng nếu bộ đệm không kết thúc bằng dòng mới).
Gilles 'SO- ngừng trở nên xấu xa'

Một cách khắc phục tốt hơn sẽ là khớp với phần đầu của chuỗi thay vì khớp phần đầu của bất kỳ dòng nào trong chuỗi. Tôi đã chỉnh sửa câu trả lời của PythonNut.
Gilles 'SO- ngừng trở nên xấu xa'

0

current-indentation cung cấp cho bạn cột sau khoảng trống hàng đầu, có thể so sánh với cột ở cuối dòng:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.