11
votes

Traitement des lots idiomatique du texte dans EMACS?

en python, vous pouvez faire quelque chose comme xxx

(je pense que ce serait similaire dans de nombreuses autres langues aussi). Dans Emacs Lisp, feriez-vous quelque chose comme xxx

que j'ai eu l'inspiration (et le code) de EMACS LISP: Processus Un fichier ligne-by-ligne . Ou devrais-je essayer quelque chose de totalement différent? Et comment supprimer le "" de l'instruction Imprimer?


0 commentaires

3 Réponses :


5
votes

Voici ce que je suis venu avec. Regarde beaucoup plus idiomatique pour moi: xxx


0 commentaires

1
votes

EMACS LISP ne convient pas au traitement des flux de fichiers. L'ensemble du fichier doit être lu à la fois:

(defun my-line-fun (line)
  (concat "prefix: " line))

(let* ((in-file "in")
       (out-file "out")
       (lines (with-temp-buffer 
        (insert-file-contents in-file)
        (split-string (buffer-string)  "\n\r?"))))
  (with-temp-file out-file
    (mapconcat 'my-line-fun lines "\n")))


4 commentaires

Split-String sans aucun argument par défaut est par défaut sur le fractionnement sur SPLAST-String-Séparateurs par défaut , qui est "[\ f \ t \ n \ r \ v] + " par défaut. Vous voulez probablement passer "[\ n \ r] +" dans explicitement comme deuxième argument.


Et techniquement, "Emacs Lisp ne convient pas au traitement des flux de fichiers" n'est pas vrai; Vous pouvez utiliser un filtre de processus, mais il est beaucoup plus compliqué et la lecture de l'ensemble du dossier est probablement le moyen le plus simple de faire des choses. Si la lecture d'un flux (tel qu'une prise réseau) est vraiment nécessaire, vous devrez probablement utiliser un filtre de processus (voir le manuel ELISP).


Merci: Utilisation fixe de chaîne scindante.


En fait, vous pouvez traiter stdin .



38
votes

Si vous souhaitez un traitement par lots de stdin code> et d'envoyer le résultat à stdout code>, vous pouvez utiliser le - script Option de ligne de commande sur EMACSS, qui vous permettra d'écrire du code qui se lit à partir de stdin code> et écrit sur stdout code> et starr code>.

Voici un exemple de programme qui est comme chat code> , sauf qu'il renverse chaque ligne: p>

dcba
4321
zyx


2 commentaires

Référencement croisé à la réponse suivante qui montre comment transmettre des arguments de ligne de commande supplémentaires aux scripts EMACS: Stackoverflow.com/questions/6238331/...


Au lieu de (conditionné ...) , vous pouvez utiliser (ignorer les erreurs ...) , qui fait la même chose. Encore mieux, supprimez l'utilisation de condition de condition et remplacez (lecture-from-mini-minibuffer "") avec (Ignorer les erreurs (lecture-from-minibuffer " "))) .