2008-09-18 7 views
4

Emacs Lisp a replace-string mais n'a pas de replace-char. Je veux remplacer les citations bouclées « » typographiques (code Emacs pour ce caractère est hexadécimal 53979) avec des guillemets ASCII réguliers, et je peux le faire avec:replace-char dans Emacs Lisp?

(replace-string (make-string 1 ?\x53979) "'") 

Je pense que ce serait mieux avec replace-char.

Quelle est la meilleure façon de faire cela?

Répondre

5

Pourquoi ne pas utiliser

(replace-string "\x53979" "'") 

ou

(while (search-forward "\x53979" nil t) 
    (replace-match "'" nil t)) 

comme recommandé dans la documentation pour remplacer chaîne?

1

ce qui serait certainement mieux avec replace-char. Un moyen d'améliorer mon code?

Est-ce vraiment lent au point où cela compte? Mon élisp est habituellement ridiculement inefficace et je ne remarque jamais. (Je ne l'utilise pour les outils de l'éditeur si, YMMV si vous construisez la prochaine MS recherche en direct avec elle.)

De plus, la lecture de la documentation:

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)) 

Cette réponse est gpl probablement sous licence maintenant.

1

Qu'en est-ce

(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))) 

Une fois que vous avez dans votre dotemacs, vous pouvez coller elisp des exemples de codes (de blogs et etc) à votre tampon zéro puis appuyez immédiatement sur CM- \ (pour indenter correctement) puis Mx my-replace-smart-quotes (pour corriger les citations intelligentes) et enfin Cx Ce (pour l'exécuter).

Je trouve que la citation bouclée est toujours hexa 2019, êtes-vous sûr que c'est 53979 dans votre cas? Vous pouvez vérifier les caractères dans le tampon avec C-u C-x =.

Je pense que vous pouvez écrire "'" à la place de "\ x2019" dans la définition de my-replace-smart-quotes et ça va. C'est juste pour être du bon côté.

3

C'est la façon dont je remplace les caractères dans elisp:

(subst-char-in-string ?' ?’ "John's") 

donne:

"John’s" 

Notez que cette fonction n'accepte pas les caractères comme chaîne. Le premier et le second argument doivent être un caractère littéral (utilisant la notation ? ou string-to-char).

Notez également que cette fonction peut être destructive si l'argument optionnel inplace est non-nul.

Questions connexes