Question

Dans vi [m], il existe la commande ! qui laisse-moi diriger le texte par une commande shell - telle que trier ou mettre en retrait - et récupérer le texte filtré dans la mémoire tampon. Existe-t-il un équivalent dans emacs?

Était-ce utile?

La solution

Vous pouvez sélectionner une région et taper `C-u M- | commande RET 'et remplace la région par la sortie de la commande dans le même tampon en raison de l'argument de préfixe interactif de shell-command-on-region.

Autres conseils

J'ai écrit ceci il y a quelques années, cela pourrait vous aider:

(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)))))

J'ai trouvé cette fonction très utile. Si vous le trouvez également utile, je suggère de l'associer à une touche de fonction pour votre commodité, personnellement, j'utilise F3 :

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

Modification tardive : Même si j'apprécie les votes positifs, la réponse de Jurta est la voie à suivre. Et le hack de Greg est plus net que le mien.

Je vais laisser le reste de ceci ici parce que ça pourrait valoir quelque chose, mais ...

Commande de shell Mx dans la région , qui semble être lié à M- | par par défaut.

Je vois que cela ne fait pas exactement ce que Rohit a demandé. L'utilisation de Ch f commande-région-shell révèle que le comportement souhaité est disponible dans la version non interactive de la commande (en définissant l'argument replace sur non-nil ). Nous devrions pouvoir écrire un wrapper pour le faire.

Essayez ceci (chargez-le dans * scratch * et exécutez M-x tampon d'évaluation> , si cela fonctionne, copiez-le dans votre fichier .emacs):

(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)
  )

Et notez, comme je le dis dans les commentaires, que ce n’est pas une chose très émacative à faire. Mais je pense que ça marche.

Pour les lecteurs qui ne savent pas comment sélectionner une région:

  1. Déplacez le " point " (position actuelle du curseur) à une extrémité de la région et utilisez C-espace pour activer la "marque"
  2. Déplacez le point à l'autre extrémité de la région
  3. Votre fait, invoquez la commande
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top