2008-10-15 9 views

Répondre

100

Vous pouvez sélectionnez une région et tapez `C-u M- | commande RET ', et il 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.

+2

Jurta pour la victoire. Upvote. Je jure que chaque fois que je pense que je commence à connaître ce programme, quelqu'un arrive et me montre que je suis un débutant de rang. – dmckee

+0

Habituellement, lorsque vous avez besoin d'une fonctionnalité dans Emacs, il y a de fortes chances qu'elle soit déjà implémentée depuis longtemps. Donc, la meilleure chose à faire en premier est de lire la documentation au lieu de commencer à réinventer la roue;) – link0ff

+1

Merci jurta. Malheureusement, je n'ai trouvé aucune documentation pour cette fonctionnalité. – Rohit

7

Dernière modification: Autant que j'apprécie les upvotes, la réponse de Jurta est la voie à suivre. Et le hack de Greg est plus propre que le mien.

Je vais laisser le reste de cet ici parce qu'il pourrait être quelque chose d'intéressant, mais ...


M-x shell-command-on-region, qui semble être lié à par défaut. Je vois que cela ne fait pas exactement ce que demande Rohit. L'utilisation de C-h f shell-command-on-region indique que le comportement souhaité est disponible dans la version non interactive de la commande (en définissant l'argument replace sur non-nul). Nous devrions être en mesure d'écrire un emballage pour le faire.

Essayez ceci (le charger dans *scratch* et exécuter M-x eval-buffer, 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 que je dis dans les commentaires que ce n'est pas très emacsy chose à faire. Mais je pense que ça fonctionne.


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

  1. Déplacez le « point » (position du curseur) à une extrémité de la région, et utilisent C-space pour activer le « marque »
  2. Déplacer le point à l'autre extrémité de la région
  3. Votre fait, appelez la commande
+0

Merci, je sais cela, mais il me donne le texte filtré dans un tampon séparé; il ne remplace pas l'original. – Rohit

+0

Je connais le comportement de vi que vous voulez. Toujours à la recherche. – dmckee

+0

Intéressant que ce n'est pas simplement une FAQ. J'utilise cette fonctionnalité dans vi (ou vim) tout le temps; un éditeur sans ça devient ... moins intéressant. –

15

J'ai écrit ce a quelques années, il 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 trouvez cela utile, je suggère lier à une touche de fonction pour plus de commodité, personnellement, j'utilise F3:

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

Excellent. Cela agit exactement comme le tube "C-k /" de joe via la commande shell. –

Questions connexes