2012-07-04 11 views
7

मैं स्ट्रिंग और मार-क्षेत्र, की शुरुआत को चिह्नित किए बिना किसी स्रोत फ़ाइल में उद्धृत स्ट्रिंग को मारना चाहता हूं, लेकिन केवल उद्धृत स्ट्रिंग के अंदर कहीं भी बिंदु डालकर और शॉर्टकट दबाकर।emacs में बिंदु पर उद्धृत स्ट्रिंग को कैसे मारें?

मैं इसके लिए elisp में एक समारोह लिखने का प्रयास किया है, लेकिन मैं पता लगा है कि फाइल निर्धारित करने के लिए बिंदु के अंदर स्ट्रिंग उद्धृत किया गया है बात करने के लिए ऊपर शुरू से ही पार्स करने की आवश्यकता होगी, और की सीमा से लगता है उद्धृत स्ट्रिंग (यह भी \ संभाल ") ...

लेकिन फ़ाइल पहले फ़ॉन्ट-लॉक से पार्स किया गया है तो अब मैं पता कर सकते हैं अगर मैं अंदर स्ट्रिंग उद्धृत कर रहा हूँ:।

(defun inside-quoted-string?() 
    (interactive) 
    (print (find 'font-lock-doc-face (text-properties-at (point))))) 

लेकिन मैं स्ट्रिंग की सीमा कैसे प्राप्त करूं? फ़ॉन्ट-लॉक इसे जानता है, क्योंकि यह अच्छी तरह से हाइलाइट करता है यह नीले रंग में है, लेकिन मैं इसे कैसे प्राप्त करूं?

संपादित करें: उत्तर के लिए धन्यवाद। मैं इस कोड के साथ आया जो ठीक वही करता है जो मैं चाहता था - कोड को शुरू किए बिना क्षेत्र या यहां तक ​​कि चुनने के बिना कोड को स्थानांतरित करें।

(defun kill-at-point() 
    "Kill the quoted string or the list that includes the point" 
    (interactive) 
    (let ((p (nth 8 (syntax-ppss)))) 
    (if (eq (char-after p) ?\") 
    (progn 
     (goto-char p) 
     (kill-sexp)) 
     (progn 
    (up-list) 
    (let ((beg (point))) 
     (backward-list) 
     (kill-region beg (point))))))) 
(global-set-key (kbd "C-,") 'kill-at-point) 

इसे सुधारने के लिए कोई सुझाव स्वागत है।

उत्तर

5

फ़ॉन्ट-लॉक पर भरोसा करने के बजाय, आप अंतर्निहित पार्सर के डेटा का उपयोग कर सकते हैं। स्ट्रिंग के चारों ओर स्ट्रिंग (यदि कोई हो) की शुरुआत (nth 8 (syntax-ppss)) के रूप में उपलब्ध है। इसके बाद आप अपना अंत खोजने के लिए स्ट्रिंग पर कूदने के लिए (forward-sexp 1) का उपयोग कर सकते हैं।

3

आप previous-property-change और next-property-change के साथ संपत्ति की सीमाएं पा सकते हैं। उदाहरण के लिए:

(defun kill-by-property (arg) 
    (interactive "d") 
    (kill-region 
    (previous-property-change arg nil (point-min)) 
    (next-property-change arg nil (point-max)))) 
1

बिल्डिंग syntax-ppss का उपयोग कर के स्टीफन के सुझाव के बंद, निम्नलिखित चाल

(defun kill-string() 
    (interactive) 
    (let ((string-start (nth 8 (syntax-ppss)))) 
    (goto-char string-start) 
    (kill-sexp))) 

यह (nth 8 (syntax-ppss)) का उपयोग करता है स्ट्रिंग की शुरुआत को खोजने के लिए क्या करना चाहिए, वहाँ कूदता है, तो का उपयोग करता है में निर्मित kill-sexp को मारने के लिए बिंदु पर एस-अभिव्यक्ति (इस मामले में, जिस स्ट्रिंग को हम चाहते हैं)। आपके हिस्से पर किसी भी तरह की क्षेत्र की गणना के लिए बिल्कुल कोई ज़रूरत नहीं है।

संबंधित मुद्दे