2009-10-13 14 views
11

TextMate में, कोई ओपन/क्लोज टैग में टेक्स्ट को लपेटने के लिए ctrl-shift-w का उपयोग कर सकता है और ओपन/क्लोज टैग में किसी क्षेत्र में प्रत्येक पंक्ति को लपेटने के लिए ctrl-shift-cmd-w। Emacs lisp का उपयोग कर Emacs में यह वही कार्यक्षमता कैसे कार्यान्वित कर सकता हूं?टेक्स्टमैट जैसे ओपन/बंद टैग में लपेटें चयन?

 
emacs 

becomes 

<p>emacs</p> 

और ...

 
emacs 
textmate 
vi 

becomes 

<li>emacs</li> 
<li>textmate</li> 
<li>vi</li> 

उत्तर

7

This answer आप क्षेत्र (एक बार आप कोण कोष्ठक का उपयोग करने के इसे संशोधित) लपेटकर के लिए एक समाधान देता है।

यह दिनचर्या टैग का उपयोग करने के लिए संकेत देगा, और उस प्रकार का एक खोलने/बंद टैग के साथ इस क्षेत्र में हर पंक्ति को टैग करना होगा:

(defun my-tag-lines (b e tag) 
    "'tag' every line in the region with a tag" 
    (interactive "r\nMTag for line: ") 
    (save-restriction 
    (narrow-to-region b e) 
    (save-excursion 
     (goto-char (point-min)) 
     (while (< (point) (point-max)) 
     (beginning-of-line) 
     (insert (format "<%s>" tag)) 
     (end-of-line) 
     (insert (format "</%s>" tag)) 
     (forward-line 1))))) 

* नोट: * यदि आप के लिए tag चाहता है तो हमेशा li बनें, फिर टैग तर्क को हटाएं, कॉल से इंटरैक्टिव पर \nMTag for line: टेक्स्ट हटाएं, और "<li\>" डालने के लिए सम्मिलित कॉल अपडेट करें, जैसा कि आप उम्मीद करेंगे।

3

yasnippet Emacs के लिए टेक्स्टमैट के स्निपेट वाक्यविन्यास का विशेष रूप से अच्छा कार्यान्वयन है। इसके साथ आप टेक्स्टमेट के सभी स्निपेट आयात कर सकते हैं। ठीक है यह मेरा इस फिक्सिंग करने का अंतिम प्रयास है (यह Textmate के संस्करण की तरह ठीक है यह भी एक के बाद पात्रों पर ध्यान नहीं देता: यदि आप यह तो स्थापित कर लेते हैं, यह स्निपेट कि मैंने लिखा आप क्या चाहते हैं करना चाहिए:

(defun wrap-region-or-point-with-html-tag (start end) 
    "Wraps the selected text or the point with a tag" 
    (interactive "r") 
    (let (string) 
    (if mark-active 
     (list (setq string (buffer-substring start end)) 
      (delete-region start end))) 
    (yas/expand-snippet (point) 
         (point) 
         (concat "<${1:p}>" string "$0</${1:$(replace-regexp-in-string \" .*\" \"\" text)}>")))) 

(global-set-key (kbd "C-W") 'wrap-region-or-point-with-html-tag) 

संपादित करें।। अंत टैग में स्थान)

क्षमा करें मैं आपके प्रश्न को गलत तरीके से पढ़ता हूं। इस समारोह को क्षेत्र में प्रत्येक पंक्ति को संपादित करना चाहिए।

(defun wrap-lines-in-region-with-html-tag (start end) 
    "Wraps the selected text or the point with a tag" 
    (interactive "r") 
    (let (string) 
    (if mark-active 
     (list (setq string (buffer-substring start end)) 
       (delete-region start end))) 
    (yas/expand-snippet 
    (replace-regexp-in-string "\\(<$1>\\).*\\'" "<${1:p}>" 
     (mapconcat 
     (lambda (line) (format "%s" line)) 
     (mapcar 
     (lambda (match) (concat "<$1>" match "</${1:$(replace-regexp-in-string \" .*\" \"\" text)}>")) 
     (split-string string "[\r\n]")) "\n") t nil 1) (point) (point)))) 
5

sgml-mode deratives के लिए, मार्क क्षेत्र tagify लिए, टाइप करें M-x sgml-tag, और टैग नाम आप (प्रेस TAB उपलब्ध HTML तत्वों की सूची प्राप्त करने) का उपयोग करना चाहते टाइप करें। Altough, यह विधि आपको किसी क्षेत्र में प्रत्येक पंक्ति को टैग करने की अनुमति नहीं देती है, आप कीबोर्ड मैक्रो रिकॉर्ड करके इसके आसपास काम कर सकते हैं।

0

ट्रे के उत्तर पर यह संस्करण एचटीएमएल को सही तरीके से इंडेंट करेगा।

(defun wrap-lines-region-html (b e tag) "'tag' every line in the region with a tag" (interactive "r\nMTag for line: ") (setq p (point-marker)) (save-excursion (goto-char b) (while (< (point) p) (beginning-of-line) (indent-according-to-mode) (insert (format "<%s>" tag)) (end-of-line) (insert (format "</%s>" tag)) (forward-line 1))))

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