Pergunta
Emacs Lisp tem replace-string
mas não tem replace-char
. Quero substituir "tipográficas" aspas curvas (Emacs código para este personagem é hexadecimal 53979) com aspas ASCII regulares, e eu posso fazê-lo com:
(replace-string (make-string 1 ?\x53979) "'")
Eu acho que seria melhor com replace-char
.
Qual é a melhor maneira de fazer isso?
Solução
Por que não usar apenas
(replace-string "\x53979" "'")
ou
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
como recomendado na documentação para substituí-string?
Outras dicas
Esta é a maneira que eu substituir caracteres em elisp:
(subst-char-in-string ?' ?’ "John's")
dá:
"John’s"
Note que esta função não aceita caracteres como string. O primeiro e segundo argumento deve ser um caractere literal (usando a notação ?
ou string-to-char
).
Além disso, note que esta função pode ser destrutivo se o argumento inplace
opcional é não-nula.
que certamente seria melhor com substituí-char. Qualquer forma de melhorar o meu código?
É realmente retardar ao ponto onde importa? Meu elisp geralmente é ridiculamente ineficientes e nunca notar. (Eu só usá-lo para ferramentas do editor, porém, YMMV se você está construindo os próximos MS Live Search com ele.)
Além disso, ler os docs:
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))
Esta resposta provavelmente é licenciado sob a GPL agora.
O que sobre este
(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)))
Uma vez que você tem isso em seus dotemacs, você pode colar os códigos de exemplo elisp (a partir de blogs e etc) para o seu buffer de zero e, em seguida, pressione imediatamente CM- \ (para travessão-lo corretamente) e, em seguida, Mx meus substituir-Smart aspas (para corrigir citações inteligentes) e, finalmente, Cx Ce (para executá-lo).
Eu acho que a citação crespo é sempre hexa 2019, você tem certeza que é 53979 no seu caso? Pode procurar caracteres em tampão com C-L-C = x.
Eu acho que você pode escrever "’" no lugar de '\ x2019' na definição do meu-substituir-aspas inteligentes e estar bem. É só para estar no lado seguro.