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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top