2009-10-13 9 views
11

In TextMate, è possibile utilizzare ctrl-shift-w per avvolgere il testo in un tag Apri/Chiudi e ctrl-shift-cmd-w per avvolgere ogni riga in un'area nei tag Apri/Chiudi. Come posso implementare questa stessa funzionalità in Emacs usando emacs lisp?Seleziona il wrap in Open/Close Tag come TextMate?

 
emacs 

becomes 

<p>emacs</p> 

E ...

 
emacs 
textmate 
vi 

becomes 

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

risposta

7

This answer ti dà una soluzione per il confezionamento della regione (una volta che si modifica in modo da utilizzare le parentesi angolari).

Questa routine vi verrà chiesto per il tag da usare, e dovrebbe contrassegnare ogni linea nella regione con una/tag di chiusura aperta di quel tipo:

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

* Nota: * Se si voleva il tag a sempre li, quindi rimuovere l'argomento tag, rimuovere il testo \nMTag for line: dalla chiamata a interattiva e aggiornare le chiamate di inserimento per inserire semplicemente lo "<li\>" come previsto.

3

yasnippet è un'implementazione particolarmente valida della sintassi snippet di Textmate per Emacs. Con questo puoi importare tutti i frammenti di Textmate. Se si installa allora, questo frammento di codice che ho scritto dovrebbe fare quello che vuoi:

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

EDIT: (Va bene questo è il mio ultimo tentativo di risoluzione di questo E 'esattamente come la versione di TextMate Essa ignora anche caratteri dopo a.. spazio nel tag di chiusura)

Spiacente ho letto male la tua domanda. Questa funzione dovrebbe modificare ogni riga nella regione.

(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

Per sgml-mode deratives, regione mark to tagify, tipo M-x sgml-tag, e digitare il nome del tag che si desidera utilizzare (premere TAB ottenere l'elenco degli elementi HTML disponibili). Inoltre, questo metodo non ti consente di codificare ogni riga in una regione, puoi aggirare il problema registrando una macro della tastiera.

0

Questa variante della risposta di Trey farà rientrare correttamente l'html.

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