Les commandes s’exécutent-elles beaucoup plus lentement dans le shell emacs? Comment puis-je empêcher cela mais toujours l’utiliser?

Aujourd’hui, j’ai exécuté une commande comme celle-ci dans le shell emacs:

./someBinary | grep foo | cut -c30- | sort | uniq -c 

qui en bash prend un peu mais pas si longtemps (environ 15 secondes) parce que la sortie dépasse facilement le million de lignes. Lorsque j’ai exécuté cette commande dans le shell emacs, j’ai attendu plus d’une heure et le processus est toujours en cours, les processus fonctionnant visiblement si je vérifie avec top . Je me demande si cela est dû au fait que emacs implémente les outils unix auxquels je me livre dans lisp – et si c’est la raison, s’il existe un moyen de le rendre par défaut aux systèmes.

Emacs est en train de capturer la sortie finale dans le tampon du shell et d’appliquer le locking des fonts et d’autres parsings (par exemple, le nombre de lignes) pour les afficher. Il fait également défiler l’affichage pour afficher la dernière sortie. Alors qu’Emacs contient des dispositions pour éliminer les sorties de commandes pathologiquement longues, elles ne sont pas vraiment optimisées pour des quantités vraiment énormes de millions de lignes, ce qui rend son fonctionnement visiblement pire que celui de votre émulateur de terminal.

Si vous ne vous intéressez pas à la sortie, redirigez-la vers /dev/null ou vers tail -500 .

non, emacs n’implémente pas ces outils. qui exécute les mêmes outils que vous exécutez à partir de la ligne de commande. cependant, la sortie est transmise par différents canaux et divers formats de mise en forme ont probablement été appliqués par emacs, ce qui est probablement à l’origine du ralentissement extrême. Une chose facile à essayer serait de désactiver le mode de locking de police dans le tampon shell.

Vous ne dites pas si vous utilisez eshell ou shell . D’après mon expérience, le shell fonctionne très bien, mais eshell est complètement inutilisable pour tout ce qui veut mettre> 1k lignes dans un tube (ce qui est sortingste, car les autres fonctionnalités d’eshell sont plutôt agréables).

Notez que eshell est lent même si la sortie est juste une ligne, tant que vous utilisez un | , donc il semble être le réel | L’opérateur (implémenté dans emacs-lisp dans eshell) est lent.