46 votes

Comment faire en sorte qu'Emacs lise la mémoire tampon de stdin au démarrage ?

Avec Vim, je peux facilement faire

$ echo 123 | vim -

Est-il possible de le faire avec Emacs ?

$ echo 123 | emacs23
... Emacs starts with a Welcome message

$ echo 123 | emacs23 -
... Emacs starts with an empty *scratch* buffer and “Unknown option”

$ echo 123 | emacs23 --insert -
... “No such file or directory”, empty *scratch* buffer

Est-il vraiment impossible de lire un buffer à partir d'un pipe unix ?

Editar : Comme solution, j'ai écrit un wrapper Shell nommé emacspipe :

#!/bin/sh
TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP

40voto

Andrew Wood Points 1239

Vous pouvez utiliser substitution de processus :

$ emacs --insert <(echo 123)

15voto

crackity_jones Points 1112

Correct, il est impossible de lire un buffer à partir de stdin.

La seule mention de stdin dans les pages d'information d'Emacs est la suivante este qui dit :

En mode batch, Emacs fait le texte en cours d'édition, et le caractère caractères standard d'interruption de terminal tels que C-z y C-c c leur effet normal. Les fonctions prin1 , princ y print la sortie vers stdout au lieu de l'écho tandis que message a et les messages d'erreur sont transmis à stderr . Les fonctions qui lisent normalement dans le minibuffer prennent leur entrée de stdin au lieu de cela.

Et le read peut lire les données de stdin mais uniquement en mode batch.

Il n'est donc pas possible de contourner ce problème en écrivant un elisp personnalisé.

14voto

Richard Hoskins Points 11604

Vous pouvez rediriger vers un fichier, puis ouvrir ce fichier.

echo 123 > temp; emacs temp

jweede note que si vous voulez que le fichier temporaire soit automatiquement supprimé, vous pouvez le faire :

echo 123 > temp; emacs temp; rm temp

La manière Emacsy de procéder est la suivante pour exécuter la commande Shell dans Emacs .

M-! echo 123 RET

Cela vous donne un tampon nommé *Shell Command Output* avec les résultats de la commande.

10voto

cwitte Points 101

C'est possible, voir https://stackoverflow.com/questions/2879746/idomatic-batch-processing-of-text-in-emacs

Voici echo dans un script emacs script (copié du lien ci-dessus) :

#!/usr/bin/emacs --script
(condition-case nil
    (let (line)
      (while (setq line (read-from-minibuffer ""))
        (princ line)
        (princ "\n")))
  (error nil))

ou de le lire dans un buffer et de l'imprimer en une seule fois

#!/usr/bin/emacs --script
(with-temp-buffer
  (progn
    (condition-case nil
    (let (line)
      (while (setq line (read-from-minibuffer ""))
        (insert line)
        (insert "\n")))
      (error nil))
    (princ (buffer-string))
    ))

7voto

Cela fonctionne :

echo 123 | emacs --insert <(cat)

mais, pour une raison quelconque, seulement avec emacs en mode graphique (Gnome,Konsole,GNU Emacs 23.4.1). La commande :

echo 123 | emacs -nw --insert <(cat)

génère une erreur 'emacs : standard input is not a tty'. La même erreur apparaît lorsque l'on essaie d'utiliser la console de texte brut.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X