Festlegen des E-Shell-Alias

7

In meiner Emacs-Alias-Datei unter .emacs.d / eshell / alias habe ich Folgendes:

alias mv mv -v $*

Immer wenn ich den Alias ​​in eshell ausführe, zum Beispiel:, erhalte mv from_here.txt to_here.textich den Fehler:

mv: fehlende Zieldatei oder Verzeichnis

Wie kann dieses Alias-Problem behoben werden? Vielen Dank.

Ari
quelle

Antworten:

5

Zuerst ein Kommentar zu Ihrem Alias. Während die emacswiki-Seite vorschlägt, dass dies alias mv 'mv -v $*'richtig ist, sagt die entsprechende offizielle Handbuchseite , dass Sie alias mv mv -vstattdessen verwenden sollten. Im Folgenden gehe ich davon aus, dass die Handbuchseite richtig ist.

Es sieht aus wie eshell-maybe-replace-by-aliasein Buggy (zumindest in Emacs 25.2.1).

Die aktuelle Implementierung ist

(defun eshell-maybe-replace-by-alias (command args)
  "If COMMAND has an alias definition, call that instead using ARGS."
  (unless (and eshell-prevent-alias-expansion
           (member command eshell-prevent-alias-expansion))
    (let ((alias (eshell-lookup-alias command)))
      (if alias
      (throw 'eshell-replace-command
         `(let ((eshell-command-name ',eshell-last-command-name)
                        (eshell-command-arguments ',eshell-last-arguments)
                        (eshell-prevent-alias-expansion
                         ',(cons command eshell-prevent-alias-expansion)))
                    ,(eshell-parse-command (nth 1 alias))))))))

Das throwFormular ersetzt den auszuführenden Befehl. Im eshell-parse-commandAlias ​​wird ersetzt, aber die Argumente gehen verloren.

Meine Schale zeigt das erwartete aliasVerhalten, wenn ich argses eshell-parse-commandüber die folgende Überschreibung hinzufüge :

(defun eshell-maybe-replace-by-alias-bugfix-25.2.1 (command args)
  "If COMMAND has an alias definition, call that instead using ARGS."
  (unless (and eshell-prevent-alias-expansion
           (member command eshell-prevent-alias-expansion))
    (let ((alias (eshell-lookup-alias command)))
      (if alias
      (throw 'eshell-replace-command
         `(let ((eshell-command-name ',eshell-last-command-name)
                        (eshell-command-arguments ',eshell-last-arguments)
                        (eshell-prevent-alias-expansion
                         ',(cons command eshell-prevent-alias-expansion)))
                    ,(eshell-parse-command (nth 1 alias) args)))))))

(advice-add #'eshell-maybe-replace-by-alias :override #'eshell-maybe-replace-by-alias-bugfix-25.2.1)

Beachten Sie, dass ich bereits einen Fehlerbericht an[email protected] gesendet habe .

Vielen Dank für die Behebung dieses Problems im Hauptzweig von Emacs an Noam Postavsky: http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=e66e81679c3c91d6bf8f62c7abcd968430b4d1fe

Tobias
quelle