जाँच करने के लिए सबसे आसान तरीका है कि क्या वर्तमान लाइन "खाली" (व्हाट्सएप की अनदेखी) है?


15

मैं सिर्फ यह जांचना चाहता हूं कि वर्तमान लाइन खाली है या नहीं (यदि इसमें केवल व्हाट्सएप है, तो मैं अभी भी इसे खाली मानता हूं)।

यहाँ मेरा प्रारंभिक संस्करण है:

(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*$"
यंगफ्रॉग

3
एक सामान्य टिप्पणी के रूप में, एक बार जब आप बफ़र्स पर कार्रवाई के संदर्भ में सोचना शुरू कर देंगे , तो (जैसा कि कोई अन्य भाषाओं में करने के लिए जाता है) स्ट्रिंग्स के साथ काम करना शुरू कर देगा । कुछ परीक्षण करने के लिए एक स्ट्रिंग को अलग और निकालना एक () अयोग्य होने की संभावना है, और (बी) नाटकीय रूप से आपके निपटान में उपकरण की संख्या को कम करता है। Elisp वास्तव में बफ़र्स की सामग्री पर सीधे काम करने में अच्छा है
फिल्स

1
@YoungFrog, भी यह होना चाहिए \\s-बजाय \\s। उस हाइफ़न की आवश्यकता elisp regexp में होती है।
कौशल मोदी

जवाबों:



12

एक सरल विधि, जो आपके पास है:

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

मुझे यह समाधान पसंद है क्योंकि यह संशोधित नहीं होता है match-data
nispio

1
आप के \\s-बजाय की जरूरत है \s। क्या आपने उस समाधान की कोशिश की है?
कौशल मोदी

अजीब तरह से, मैं इसे काफी थोड़ा उपयोग करता हूं। लेकिन मैंने यह सिर्फ स्मृति से लिखा है। तुम सही हो।
PythonNut

1
अभी भी हाइफ़न गायब है? :)
कौशल मोदी

यह शुरुआती था, और मैं अभी तक पूरी तरह से जाग नहीं पाया था।
पाइथननॉट जूथ

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-*यहाँ उपयोग करने के लिए फ़ंक्शंस का सही सेट है।
गिल्स एसओ- बुराई को रोकें '21

1

यहां इसके लिए एक और सरल उपाय है, जिसे comment-dwim-2पैकेज से लिया गया है

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

1

यह पाइथननॉट ने उत्तर दिया जो मेरे लिए काम नहीं करता (क्यों?) का एक संशोधन है

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

string-match-pजब भी वर्तमान लाइन खाली नहीं थी, तो अगली पंक्ति का सूचकांक लौटाया। इसलिए मैंने जाँच की कि रिटर्न वैल्यू 0 है।


अगली पंक्ति का सूचकांक? आप का क्या तात्पर्य है? (और emacs.SE पर आपका स्वागत है!)
जीनपायर

@JeanPierre (thing-at-point 'line)में पंक्ति के अंत में नई पंक्ति शामिल है। यदि वर्तमान रेखा रिक्त नहीं है, तो regexp उस नई रेखा से मेल खाता है। यहां केवल एक बार string-match-pशून्य वापस आता है, बफर की अंतिम पंक्ति पर है (और डारियो, यदि आपका संस्करण अंतिम पंक्ति पर काम नहीं करता है यदि बफर एक नई रेखा के साथ समाप्त नहीं होता है)।
गिल्स एसओ- बुराई को रोकना '

एक बेहतर फिक्स स्ट्रिंग में किसी भी लाइन की शुरुआत से मेल खाने के बजाय स्ट्रिंग की शुरुआत से मेल खाना होगा। मैंने पायथनटन के उत्तर को संपादित किया है।
गाइल्स का SO- बुराई का होना बंद करो '

0

current-indentation आपको प्रमुख रिक्तता वाले कॉलम देता है, जिसकी तुलना पंक्ति के अंत में स्थित कॉलम से की जा सकती है:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.