In vi [m] utilise le !
command which lets me pipe text via une commande shell - comme un tri ou un retrait - et renvoie le texte filtré dans le tampon. Y a-t-il un équivalent dans emacs?Filtrage du texte via une commande shell dans Emacs
Répondre
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.
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:
- Déplacez le « point » (position du curseur) à une extrémité de la région, et utilisent
C-space
pour activer le « marque » - Déplacer le point à l'autre extrémité de la région
- Votre fait, appelez la commande
Merci, je sais cela, mais il me donne le texte filtré dans un tampon séparé; il ne remplace pas l'original. – Rohit
Je connais le comportement de vi que vous voulez. Toujours à la recherche. – dmckee
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. –
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)
Excellent. Cela agit exactement comme le tube "C-k /" de joe via la commande shell. –
- 1. dans une commande shell
- 2. Définir une commande emacs qui appelle une autre commande emacs (en conservant les infos interactives)
- 3. Groovy exécuter « cp * » commande shell
- 4. sortie couleur de commande shell dans Ruby
- 5. comment éviter de tuer accidentellement du texte dans emacs?
- 6. Comment rediriger stdin à partir d'un script shell vers une commande dans le script shell?
- 7. Recherche de texte marqué (sélectionné) dans Emacs
- 8. Comment faire emacs shell exécuter le fichier init automatiquement?
- 9. comment supprimer une zone de texte dans emacs?
- 10. Obtenir Emacs pour respecter mes options shell + par défaut
- 11. Quel est l'équivalent Perl du "$ @" du shell?
- 12. javascript (spidermonkey) comment exécuter une commande linux depuis js shell?
- 13. Comment faire une interruption de commande $ (shell) défectueuse Make
- 14. Toute commande Emacs comme mode collage dans vim?
- 15. Argument numérique de la commande Eclipse Emacs
- 16. Filtrage des balises XML lors du chargement dans une arborescence
- 17. Comment rechercher et remplacer du texte dans un fichier à partir d'un script shell?
- 18. Commande Shell qui parcourt les lignes?
- 19. Modifier la position du texte dynamique dans Flash via AS
- 20. Scripting Shell. question de substitution commande dans mon script
- 21. Comment intégrer un shell de commande dans Visual Studio
- 22. exécution de la commande même dans plusieurs scripts shell
- 23. Commande shell VB.NET lançant un fichier non trouvé exception
- 24. Citation d'arguments de ligne de commande dans des scripts shell
- 25. Java SWT - Texte sur un shell transparent?
- 26. Définition du numéro de ligne à une variable dans Emacs
- 27. Emacs et cygwin
- 28. X11: déclencher une fenêtre existante via une ligne de commande?
- 29. Ouverture du navigateur depuis le script emacs?
- 30. Commande Emacs pour insérer et indenter la ligne au-dessus du curseur
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
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
Merci jurta. Malheureusement, je n'ai trouvé aucune documentation pour cette fonctionnalité. – Rohit