2009-11-19 11 views
8

Non ho molta familiarità con l'elisp e sto cercando di imparare. In Emacs, mi piacerebbe essere in grado di effettuare le seguenti operazioni:Come scrivere una funzione di Emacs per avvolgere l'area contrassegnata con il testo specificato

  1. Mark tramite C-spazio
  2. Vai a dove voglio la marcatura alla fine, quindi ho una regione che viene evidenziato, suppongo è
  3. Hit a-sequenza di tasti
  4. hanno "testo evidenziato" emacs mi chiedono di inserire un testo, dire "complotto", e
  5. avere quel evidenziato il cambiamento del testo per essere "complotto (testo evidenziato)" . Cioè, mi piacerebbe racchiudere il testo evidenziato con parentesi e precederlo con il testo che inserisco.

    (defun wrap-text() 
        ) 
    

Suppongo che l'ingresso della funzione sarebbe il testo evidenziato, ma non so da dove cominciare a cercare. L'altra parte difficile sarebbe la parte del testo di input. Qualcuno potrebbe guidarmi? Grazie.

risposta

8

Per il vostro caso, questo dovrebbe funzionare:

(defun wrap-text (b e txt) 
    "simple wrapper" 
    (interactive "r\nMEnter text to wrap with: ") 
    (save-restriction 
    (narrow-to-region b e) 
    (goto-char (point-min)) 
    (insert txt) 
    (insert "(") 
    (goto-char (point-max)) 
    (insert ")"))) 

(global-set-key (kbd "C-x M-w") 'wrap-text) 
+0

Vedi anche: http://xahlee.org/emacs/wrap-url.html –

+0

Anche questa domanda/risposta: http://stackoverflow.com/questions/1397113/how-to-tag-text -in-emacs/1397134 # 1397134. –

+0

come farebbe esattamente qualcosa di simile con yasnippet? ho familiarità con: 1. tipo di parola chiave 2. espandere questo comporta l'aggiunta di testo all'inizio e alla fine di una regione. sarei interessato anche a sentire questa soluzione. Grazie. –

1

grazie Trey Jackson. non sapevo che avessi postato una soluzione, quindi sono andato a #emacs sul freenode per chiedere aiuto. Dopo alcune ricerche, mi si avvicinò con il seguente:

(defun ess-R-wrap-content-vqn() 
    "Wrap marked region with a specified PREFIX and closing parentheses." 
    (interactive) 
    (set (make-local-variable 'prefix) (read-from-minibuffer "function: ")) 
    (set (make-local-variable 'prefix) (concat prefix "(")) 
    (save-excursion (goto-char (region-beginning)) (insert prefix)) 
    (save-excursion (goto-char (region-end)) (insert ")")) 
) 
(define-key ess-mode-map "\C-c\M-w" 'ess-R-wrap-content-vqn) ;; w is for wrap 

ho pensato StackOverflow stava per essere avvisato quando una soluzione è distaccato. di nuovo, grazie. imparando un po 'più di elisp da questo.

3

Qualcosa di un po 'più vicino alla versione, ma con alcune modifiche:

  • si può usare 'let' di creare un locale variabile
  • regione-inizio e la regione-end ti dà l'equivalente di ciò che ha fatto con trey

Ecco un esempio:

(defun wrap-in-function() 
    "Wrap marked region with a specified PREFIX and closing parentheses." 
    (interactive) 
    (let ((prefix (read-from-minibuffer "function: "))) 
    (save-excursion 
     (goto-char (region-beginning)) 
     (insert (concat prefix "("))) 
    (save-excursion 
     (goto-char (region-end)) 
     (insert ")")))) 

Un'altra d l'ifferenza tra le due versioni è la posizione del punto dopo aver chiamato la funzione; la versione trey potrebbe essere migliore da usare (questione di gusti).

MODIFICA: modificato seguendo le osservazioni di vinh.

+0

La dichiarazione "interattiva" nella risposta di Trey è un modo migliore per farlo. La 'r' indica che una regione deve essere definita e il resto è usato come prompt per leggere il testo desiderato usando i metodi standard di Emacs. Sebbene questi metodi possano alla fine chiamare 'read-from-minibuffer 'come hai fatto qui, perdi qualsiasi altro comportamento Emacs standard/globale che hai personalizzato. –

+0

appena provato il tuo e non avvolge completamente il testo. avvolge: wrap() mytext. –

+0

Grazie a vinh, hai ragione, la mia funzione funziona solo se selezioni il testo da avvolgere a partire dalla fine. Proverò a vedere se riesco a risolverlo. – phtrivier

2

questo richiede 'cl ma è altrimenti piuttosto piccolo. l'ho usato per alcuni anni.

(require 'cl) ;;if you haven't elsewhere 
(defun decorate-region(beg end prefix suffix) 
    (interactive "r\nMPrefix: \nMSuffix: ") 
    (cl-set-buffer-substring beg end (concat prefix 
              (buffer-substring beg end) 
              suffix))) 
Problemi correlati