Frage

In vi [m] gibt es die ! Befehl, der mir Rohr Text lässt durch einen Shell-Befehl - wie Art oder Gedankenstrich - und den gefilterte Text zurück in den Puffer erhalten. Gibt es ein Äquivalent in Emacs?

War es hilfreich?

Lösung

Sie können eine Region auswählen und geben Sie `C-u M- | Befehl RET‘und ersetzt die Region mit der Befehlsausgabe in dem gleichen Puffer, aufgrund des interaktiven prefix Argument von Shell-Befehl-on-Region.

Andere Tipps

Ich schrieb dies ein paar Jahre zurück, es könnte Ihnen helfen:

(defun generalized-shell-command (command arg)
  "Unifies `shell-command' and `shell-command-on-region'. If no region is
selected, run a shell command just like M-x shell-command (M-!).  If
no region is selected and an argument is a passed, run a shell command
and place its output after the mark as in C-u M-x `shell-command' (C-u
M-!).  If a region is selected pass the text of that region to the
shell and replace the text in that region with the output of the shell
command as in C-u M-x `shell-command-on-region' (C-u M-|). If a region
is selected AND an argument is passed (via C-u) send output to another
buffer instead of replacing the text in region."
  (interactive (list (read-from-minibuffer "Shell command: " nil nil nil 'shell-command-history)
                     current-prefix-arg))
  (let ((p (if mark-active (region-beginning) 0))
        (m (if mark-active (region-end) 0)))
    (if (= p m)
        ;; No active region
        (if (eq arg nil)
            (shell-command command)
          (shell-command command t))
      ;; Active region
      (if (eq arg nil)
          (shell-command-on-region p m command t t)
        (shell-command-on-region p m command)))))

Ich habe diese Funktion sehr hilfreich. Wenn Sie es nützlich finden, schlage ich es bis zu einem gewissen Funktionstaste für die Bequemlichkeit Bindung, ich persönlich F3 verwenden:

(global-set-key [f3] 'generalized-shell-command)

Späte bearbeiten : So viel wie ich die upvotes, Jurta Antwort schätzen, ist der Weg zu gehen. Und Gregs Hack ist ordentlicheres als meine.

Ich werde den Rest dieser hier verlassen, weil es etwas wert sein könnte, aber ...


M-x shell-command-on-region , die gebunden zu sein scheint M-| in der Standardeinstellung.


Ich sehe, dass dies nicht genau das tun, was Rohit gefragt. Mit C-h f shell-command-on-region zeigt, dass das gewünschte Verhalten in der nicht-interaktiven Version des Befehls verfügbar ist (durch das Argument replace zu Nicht-Null setzen). Wir sollten einen Wrapper schreiben können, dies zu tun.

Versuchen Sie, diese (es in *scratch* laden und M-x eval-buffer laufen, wenn es funktioniert, kopieren Sie sie in Ihre .emacs-Datei):

(defun shell-command-on-region-replace (start end command)
  "Run shell-command-on-region interactivly replacing the region in place"
  (interactive (let (string) 
         (unless (mark)
           (error "The mark is not set now, so there is no region"))
         ;; Do this before calling region-beginning
         ;; and region-end, in case subprocess output
         ;; relocates them while we are in the minibuffer.
         ;; call-interactively recognizes region-beginning and
         ;; region-end specially, leaving them in the history.
         (setq string (read-from-minibuffer "Shell command on region: "
                            nil nil nil
                            'shell-command-history))
         (list (region-beginning) (region-end)
               string)))
  (shell-command-on-region start end command t t)
  )

Und Notiz, wie ich sage in den Kommentaren, dass dies nicht eine sehr emacsy Sache zu tun. Aber ich denke, es funktioniert.


Für alle Leser, die nicht wissen, wie eine Region auszuwählen:

  1. Bewegen Sie den „Punkt“ (aktuelle Cursorposition) mit einem Ende der Region, und verwenden C-space die „Zeichen“
  2. aktivieren
  3. Bewegen Sie den Punkt zum anderen Ende des Bereichs
  4. Sie getan, rufen Sie den Befehl
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top