Spesso ho una situazione in cui devo applicare del testo in una regione. Per HTML e casi semplici ci sono già librerie per questo. Ma per quanto riguarda il caso generale? Vorrei chiedermi cosa inserirò all'inizio e alla fine della regione.
Spesso ho una situazione in cui devo applicare del testo in una regione. Per HTML e casi semplici ci sono già librerie per questo. Ma per quanto riguarda il caso generale? Vorrei chiedermi cosa inserirò all'inizio e alla fine della regione.
Risposte:
Ho cercato su Google e ho trovato questo post di John D. Cook . Dimostra come creare una semplice funzione interattiva per ottenere facilmente tag HTML / XML nella regione. Da quello ho modificato la funzione per chiedere due volte.
(defun tag-word-or-region (text-begin text-end)
"Surround current word or region with given text."
(interactive "sStart tag: \nsEnd tag: ")
(let (pos1 pos2 bds)
(if (and transient-mark-mode mark-active)
(progn
(goto-char (region-end))
(insert text-end)
(goto-char (region-beginning))
(insert text-begin))
(progn
(setq bds (bounds-of-thing-at-point 'symbol))
(goto-char (cdr bds))
(insert text-end)
(goto-char (car bds))
(insert text-begin)))))
Ancora più importante, questa funzione può essere utilizzata anche come strumento ausiliario, ad esempio quando si desidera associare i tasti per mappare alcuni bit specifici di testo.
(defun tag-php ()
(interactive)
(tag-word-or-region "<?php " "?>"))
evil
che io uso che interferisce qui. Forse una funzione di tipo ha interactive "r"
funzionato in modo più efficace?
Suggerirei un approccio diverso. Quando c'è una regione, per definizione point
deve essere all'inizio (o alla fine) della regione e mark
sarà alla fine (o all'inizio). Ciò significa che è possibile inserire il testo desiderato in un punto, quindi utilizzare exchange-point-and-mark
, ad esempio C-x C-x
, per passare all'altra estremità della regione. Inserisci la seconda metà del wrapper e il gioco è fatto.
Non ti viene chiesto esplicitamente di inserire il testo di inserimento, ma non riesco a immaginare che ci sarebbe un modo per realizzare la stessa cosa con meno sforzo.
multiple-cursors
potrebbe essere modificato per inserire il testo simultaneamente all'inizio e alla fine della regione attiva.
C-x C-x
. Con la tua risposta, devi chiamare la tua funzione ( C-c something
) e devi anche premere return
dopo ogni voce. Quindi, qualunque cosa tu faccia, hai altre due battiture. Detto questo, non aiuta se vuoi qualcosa da chiamare da elisp.
Solo per motivi di varietà:
Un altro modo per farlo con un testo di inizio e fine arbitrario sarebbe quello di usare replace-regexp
sulla regione: abbina .+
e sostituisci con before \& after
, o qualunque testo tu voglia usare per before
e after
.
Potresti scrivere un comando do a questo, ma sto pensando a un caso in cui in un determinato file vuoi applicare lo stesso testo iniziale / finale in più punti. Puoi registrare una macro o semplicemente usare la cronologia del minibuffer per ripetere su un'altra regione.
Ovviamente se il testo che vuoi avvolgere può essere espresso come un'espressione regolare, allora non dovrai nemmeno selezionare una regione e puoi fare un query-replace-regexp
buffer, ma presumibilmente il testo che vuoi avvolgere non è così coerente.
<?php
...?>
, e quindi, quando selezioni una regione e digiti<?php
(o un keybinding), la includi nella coppia. Tuttavia, non esiste un modo semplice per utilizzare queste librerie se si hanno molte coppie one-shot.