Pourquoi eshell préfère-t-il les fonctions lisp même si eshell-prefer-lisp-functions est nul?


8

Si je démarre emacs 24.5.2 avec emacs -Qet fais M-x eshell, exécutez:

$ which rm
eshell/rm is a compiled Lisp function in `em-unix.el'

J'obtiens la version eshell. Mais si je C-h v eshell-prefer-lisp-functionsvois, la valeur est nulle. Pourtant, la documentation indique:

Si vous préférez utiliser les commandes intégrées au lieu des commandes externes, définissez eshell-prefer-lisp-functions sur t.

Est-ce un bug? Je pensais que les documents pourraient être à l'envers, j'ai donc essayé de définir la variable sur t, mais le comportement reste le même, je continue à obtenir l'implémentation eshell plutôt que la version dans / bin.


Je me demande si le problème est avec which. Si vous le faites rm --version, qu'obtenez-vous?
2015

@zck J'obtiens ce que j'obtiendrais de / bin / rm, mais la raison pour laquelle j'ai commencé à enquêter est parce que j'ai rm un grand répertoire qui a provoqué le gel de tous les emacs, indiquant qu'il utilise la version eshell. Je crois que les versions eshell se replient sur la version système lorsqu'elles rencontrent un argument non reconnu pour des raisons de compatibilité, donc je pense que le fait qu'il génère les informations de version rm des coreutils est en fait trompeur, et il utilise la version eshell.
Joseph Garvin

Eh bien, c'est déroutant. J'aimerais pouvoir aider davantage.
ZCK

Pourquoi ne pas utiliser la commande directe au lieu de compter sur les paramètres de préférence ? Par exemple: $ *rm filename. Le démarrage *fera eshellsauter la recherche de commandes intégrées. Cette méthode est utile pour contourner les commandes intégrées, quels que soient les paramètres préférés.
Emacs User

Réponses:


4

Eshell préfère toujours les fonctions Lisp. eshell-prefer-lisp-functionsaffecte uniquement l'interprétation de *rm, pas l'interprétation de rm.

Source: le code source… D'après Emacs 24.3:

(defun eshell-plain-command (command args)
  (let* ((esym (eshell-find-alias-function command))
    …
    (if (and …
             (or esym eshell-prefer-lisp-functions
                 (not (eshell-search-path command))))
        (eshell-lisp-command sym args)
      (eshell-external-command command args))))

eshell-find-alias-functionrecherche une fonction sous le eshell/préfixe. Il y a une logique similaire eshell/which.

La documentation de la variable est carrément trompeuse, et le manuel est également assez trompeur. Je suppose que le comportement est de par leur conception (après tout, pourquoi définiriez-vous une fonction eshell si ce n'est pas pour l'utiliser?), C'est donc un bug de documentation.

Pour appeler l'utilitaire externe, appelez /bin/rmou, à condition que vous ayez laissé eshell-prefer-lisp-functionsla valeur nulle, appelez *rm*. Si vous souhaitez rmtoujours invoquer l'utilitaire externe, vous pouvez définir un alias: alias rm "rm $*"(merci GDP2 ).


Ceci est un rapport de bug, pas une réponse. Supprimez la réponse ou modifiez-la avec une solution viable.
Emacs User

2
Utilisateur Emacs: De quoi parlez-vous? La question est "Pourquoi eshell préfère-t-il les fonctions lisp même si eshell-prefer-lisp-functions est nul?" et c'est 100% une réponse à cette question.
phils

"La seule façon de faire rmtoujours invoquer la commande externe est de s'assurer qu'aucune fonction n'est appelée eshell/rm. (Cela, ou bien sûr de conseiller ou de redéfinir une partie du code d'Eshell.)" Ce n'est pas la seule façon de faire rminvoquer la commande externe. Comme indiqué dans le manuel, vous pouvez créer un alias pointantrm vers *rm(voir également emacs.stackexchange.com/a/880/10761 ).
GDP2

@Gilles Pas de problème.
GDP2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.