20 Stimmen

Wie kann man in Emacs einen Dateinamen in einen Shell-Befehl einfügen?

Ich benutze Shell-Befehl eine Menge (standardmäßig gebunden an M-!), aber oft tue ich etwas mit dem Puffer, den ich gerade bearbeite. Anstatt den Namen des Puffers einzugeben (und in shell-command ist leider keine Dateinamensvervollständigung verfügbar!), wäre es schön, eine Tastenkombination zu haben, z.B. f3, die den Namen für mich einfügt, wenn ich die Taste drücke.

Das Problem ist, dass ich die Taste nicht global binden möchte (ich verwende f3 für andere Dinge in einem anderen Kontext), nur im Minipuffer, wenn der Shell-Befehl aufruft. Es ist einfach, eine Lisp-Funktion zu schreiben, um den aktuellen Puffernamen einzufügen, aber welche Modus-Tastenbelegung sollte ich ändern, um eine Taste an diese Funktion zu binden?

Alternativ gibt es jede Lisp-Code/Paket, die Dateinamen-Vervollständigung in Shell-Befehl, ähnlich wie Bash es tut bieten? Ich weiß, dass die normale M-x-Shell die Vervollständigung bietet, aber die Bequemlichkeit der Eingabe eines Befehls im Minibuffer ist schwer aufzugeben ;)

Bearbeiten:

Hier ist, was ich wollte, entnommen aus huaiyuan Antwort mit einigen Korrekturen, inspiriert von/gestohlen von http://osdir.com/ml/emacs.sources/2002-04/msg00022.html

(define-key minibuffer-local-map
  [f3] (lambda () (interactive) 
       (insert (buffer-name (current-buffer-not-mini)))))

(defun current-buffer-not-mini ()
  "Return current-buffer if current buffer is not the *mini-buffer*
  else return buffer before minibuf is activated."
  (if (not (window-minibuffer-p)) (current-buffer)
      (if (eq (get-lru-window) (next-window))
          (window-buffer (previous-window)) (window-buffer (next-window)))))

11voto

huaiyuan Punkte 25393
(define-key minibuffer-local-map
  [f3] (lambda () (interactive) (insert (buffer-name))))

Bearbeiten:

Wie im Kommentarbereich und an anderer Stelle erwähnt, funktioniert das obige Codeschnipsel nicht. (Sorry, ich hätte es vor dem Posten testen sollen. :) Einige Korrekturen wurden gepostet; hier ist eine weitere:

(define-key minibuffer-local-map [f3]
  (lambda () (interactive) 
     (insert (buffer-name (window-buffer (minibuffer-selected-window))))))

Bezüglich der Vervollständigung von Dateinamen bei der Ausgabe von shell-command Vielleicht würde dieser Kniff funktionieren (bei mir funktioniert er mit Emacs 23.0.60):

(require 'shell)
(define-key minibuffer-local-map (kbd "C-i") 'comint-dynamic-complete)

0 Stimmen

Damit ist es fast geschafft, außer dass buffer-name Minibuf-1 nicht das, was ich wollte. Ich habe es mit (buffer-file-name (other-buffer)) versucht, aber das ergibt den ANDEREN Puffer, nicht den aktuellen Puffer, bevor ich minibuf eingegeben habe. Gibt es eine andere Möglichkeit, den echten aktuellen Puffer zu erhalten?

0 Stimmen

Vergessen Sie's, es scheint keine solche Funktion in Emacs zu geben; ich werde sehen, ob ich eine hacken kann.

7voto

David Hanak Punkte 10304

Die Lösung von huaiyuan lässt sich folgendermaßen beheben:

(define-key minibuffer-local-map [f3]
  (lambda() (interactive) (insert (buffer-file-name (nth 1 (buffer-list))))))

Sie sollten wahrscheinlich eine Art Fehlerprüfung für den Fall hinzufügen, dass der "andere" Puffer keinen Dateinamen hat und (buffer-file-name) null zurückgibt.

2voto

Ich überlasse es dem huaiyuan über genau das, was Sie gefragt haben, aber Sie können sich auch unter Filtern von Text durch einen Shell-Befehl in Emacs als möglicher alternativer Ansatz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X