วิธีที่ง่ายที่สุดในการตรวจสอบว่าบรรทัดปัจจุบันเป็น“ ว่างเปล่า” (ละเว้นช่องว่าง) หรือไม่


14

ฉันแค่ต้องการตรวจสอบว่าบรรทัดปัจจุบันว่างหรือไม่ (ถ้ามันมีเพียงช่องว่างเท่านั้นแล้วฉันยังคงพิจารณาว่าว่างเปล่า)

นี่คือเวอร์ชั่นเริ่มต้นของฉัน:

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

วิธีที่ง่ายที่สุดในการตรวจสอบว่าบรรทัดปัจจุบันว่างเปล่าคืออะไร?


3
ในสตริงกระเพื่อมเขียนเทียบเท่ากับการเขียน\s บางทีคุณอาจจะหมายถึงs "^\\s*$"
YoungFrog

3
เป็นความคิดเห็นทั่วไป Elisp จะทำให้รู้สึกมากขึ้นเมื่อคุณเริ่มคิดในแง่ของการดำเนินการกับบัฟเฟอร์เมื่อเทียบกับ (เป็นหนึ่งมีแนวโน้มที่จะทำในภาษาอื่น ๆ ) การทำสิ่งที่มีสตริง การแยกและแยกสตริงเพื่อดำเนินการทดสอบบางอย่างมีแนวโน้มที่จะ (ก) ไม่มีประสิทธิภาพและ (ข) ลดจำนวนเครื่องมือในการกำจัดของคุณอย่างมาก Elisp เก่งมากในการทำสิ่งต่าง ๆ โดยตรงกับเนื้อหาของบัฟเฟอร์
phils

1
@YoungFrog ยังมันควรจะเป็นแทน\\s- \\sยัติภังค์นั้นจำเป็นต้องมีใน elisp regexp
Kaushal Modi

คำตอบ:


24

สิ่งนี้จะเป็น "ง่ายขึ้น" หรือไม่?

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

12

วิธีง่ายๆใกล้กับสิ่งที่คุณมี:

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

match-dataผมชอบวิธีนี้เพราะมันไม่ได้ปรับเปลี่ยน
nispio

1
คุณจำเป็นต้องมีแทน\\s- \sคุณได้ลองวิธีแก้ปัญหานั้นแล้วหรือยัง?
Kaushal Modi

ผิดปกติฉันใช้มันค่อนข้างน้อย แต่ฉันเพิ่งเขียนออกจากหน่วยความจำนี้ คุณถูก.
PythonNut

1
ยังขาดยัติภังค์อยู่หรือไม่ :)
Kaushal Modi

มันเป็นช่วงต้นและฉันยังไม่ได้ตื่นขึ้นมาอย่างสมบูรณ์
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

ฉันแนะนำ:

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

(โปรดทราบว่าprognในความเป็นจริงแล้วไม่จำเป็นเพราะฟังก์ชั่นการข้ามจะไม่ส่งคืนศูนย์) ดานทำตามคำตอบของเขาskip-syntax-*ก็สามารถใช้แทนได้เช่นกัน


3
สิ่งนี้ไม่ได้ระบุบรรทัดที่มีแท็บเท่านั้นเป็นช่องว่าง skip-syntax-*เป็นชุดฟังก์ชั่นที่เหมาะสมที่จะใช้ที่นี่
Gilles 'หยุดความชั่วร้าย'

1

นี่เป็นอีกวิธีที่ง่ายสำหรับมันนำมาจากcomment-dwim-2แพคเกจ

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

1

นี่คือการดัดแปลงสิ่งที่ PythonNut ตอบซึ่งไม่ได้ผลสำหรับฉัน (เพราะเหตุใด):

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

string-match-pส่งคืนดัชนีของบรรทัดถัดไปเมื่อใดก็ตามที่บรรทัดปัจจุบันไม่ว่างเปล่า ดังนั้นฉันจึงตรวจสอบว่าค่าส่งคืนเป็น 0


ดัชนีของบรรทัดถัดไปหรือไม่ คุณหมายถึงอะไรกันแน่ (และยินดีต้อนรับ emacs.SE!)
JeanPierre

@JeanPierre (thing-at-point 'line)มีการขึ้นบรรทัดใหม่ที่ท้ายบรรทัด หากบรรทัดปัจจุบันไม่ว่างเปล่า regexp จะจับคู่กับขึ้นบรรทัดใหม่ การstring-match-pคืนค่าเวลาเดียวจะไม่มีที่นี่อยู่ในบรรทัดสุดท้ายของบัฟเฟอร์ (และ Dario เวอร์ชันของคุณจะไม่ทำงานในบรรทัดสุดท้ายหากบัฟเฟอร์ไม่ได้ลงท้ายด้วยการขึ้นบรรทัดใหม่)
Gilles 'หยุดความชั่วร้าย'

การแก้ไขที่ดีกว่าคือการจับคู่จุดเริ่มต้นของสตริงแทนที่จะจับคู่จุดเริ่มต้นของบรรทัดใด ๆ ในสตริง ฉันแก้ไขคำตอบของ PythonNut แล้ว
Gilles 'หยุดความชั่วร้าย'

0

current-indentation ให้คอลัมน์ตามช่องว่างนำหน้าซึ่งสามารถเปรียบเทียบกับคอลัมน์ที่ท้ายบรรทัดได้

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.