Domanda
Emacs Lisp ha replace-string
ma non ha replace-char
.Voglio sostituire "tipografico" virgolette curve (Emacs codice per questo personaggio è esadecimale 53979) con regolare ASCII citazioni, e posso farlo con:
(replace-string (make-string 1 ?\x53979) "'")
Penso che sarebbe meglio replace-char
.
Qual è il modo migliore per fare questo?
Soluzione
Perché non usare
(replace-string "\x53979" "'")
o
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
come consigliato nella documentazione per sostituire la stringa?
Altri suggerimenti
Questo è il modo che ho per sostituire i caratteri in elisp:
(subst-char-in-string ?' ?’ "John's")
dà:
"John’s"
Si noti che questa funzione non accetta i caratteri della stringa.Il primo e il secondo argomento deve essere un carattere letterale (utilizzando il ?
notazione o string-to-char
).
Anche questa funzione può essere distruttivo se opzionale inplace
l'argomento è non nullo.
che sarebbe sicuramente meglio con la sostituzione-char.Un modo per migliorare il mio codice?
È davvero lento al punto in cui è importante?Il mio elisp di solito è incredibilmente inefficiente e non ho mai notate.(Io uso solo per gli strumenti dell'editor, però, YMMV se si sta costruendo la prossima MS live search con esso.)
Inoltre, la lettura di documenti:
This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
(while (search-forward "’" nil t)
(replace-match "'" nil t))
Questa risposta è probabilmente concesso in licenza GPL ora.
Che dire di questo
(defun my-replace-smart-quotes (beg end)
"replaces ’ (the curly typographical quote, unicode hexa 2019) to ' (ordinary ascii quote)."
(interactive "r")
(save-excursion
(format-replace-strings '(("\x2019" . "'")) nil beg end)))
Una volta che avete nel vostro dotemacs, è possibile incollare elisp codici di esempio (dai blog ecc) per il buffer scratch e quindi premere immediatamente C-M-\ (rientro correttamente) e quindi M-x la mia-sostituire-smart-citazioni (per fissare virgolette) e, infine, C-x C-e (per eseguirlo).
Trovo che il ricci preventivo è sempre hexa 2019, siete sicuri che sia 53979 nel tuo caso?È possibile controllare caratteri nel buffer con il C-u-C x =.
Penso che si può scrivere "’" al posto di "\x2019" nella definizione del mio-sostituire-smart-preventivi e va bene.È solo per essere sul sicuro.