Forum Programmation.autre [emacs] Raccourcie clavier et elisp

Posté par  (site web personnel) .
Étiquettes :
1
1
août
2012

Bonjour tout le monde !

Je viens de trouver un raccourcie clavier génial pour emacs : « C-u M-| ». Pour faire simple ça applique une commande shell sur la région et la remplace par sa sortie. Mais voilà bien qu'utilisateur régulier d'emacs, et donc habitué à me tordre les doigts, le raccourcie clavier associé est franchement lourds. Donc j'aimerai le remplacer. Vous aller me dire, rien de plus facile :

(global-set-key "\M-p" 'shell-command-on-region)

Malheureusement, pour avoir le comportement souhaité il faut que je donne un argument numérique à shell-command-on-region et je ne sais pas comment faire.

M-| (shell-command-on-region) is like M-!, but passes the contents of the region as the standard input to the shell command, instead of no input. With a numeric argument, it deletes the old region and replaces it with the output from the shell command.

Si quelqu'un aurait une piste je le lui en saurait reconnaissant !

Merci

  • # J'en ai chié, mais j'ai trouvé !

    Posté par  (site web personnel) . Évalué à 4.

    Après maintes réflections, voilà une solution (à mettre dans le .emacs)

    (global-set-key "\M-p"   'pipe)
    
    (defun pipe()
      "Vive les pipes"
      (interactive)
      (let ((c (read-from-minibuffer "Command : " nil nil nil nil nil nil)))
        (if mark-active
            (shell-command-on-region (region-beginning) (region-end) c  (current-buffer) t t)
            (shell-command  c  1)
        )))
    
    

    Pour faire simple cette fonction permet de remplacer la région (la zone sélectionnée) par le résultat d'une commande dont l'entrée standard est la région avant remplacement, où sans région, rajoute juste le résultat de la commande là où se trouve le curseur.

    • [^] # Le compte est bon…

      Posté par  . Évalué à 2.

      …Mais il y avait plus simple :

      (global-set-key (kbd "M-p") #'(lambda ()
                                      (interactive)
                                      (let ((current-prefix-arg 4))
                                        (call-interactively 'shell-command-on-region))))
      
      

      Le C-u est géré par la variable current-prefix-arg, donc il suffit que tu lui donne la valeur d'un C-u qui est 4. Il suffit d'appeler « interactivement » la fonction que tu veux pour pas avoir a gérer les arguments de la-dite fonction toi-même.

      • [^] # Re: Le compte est bon…

        Posté par  (site web personnel) . Évalué à 3.

        Merci. C'était exactement ce que je cherchais !

        • [^] # Re: Le compte est bon…

          Posté par  (site web personnel) . Évalué à 2.

          Pour info, la version propre finale

          (global-set-key (kbd "M-p") 'pipe)
          
          
          (defun pipe()
            "Vive les pipes"
            (interactive)
            (let ((current-prefix-arg 4))
              (if mark-active
                  (call-interactively 'shell-command-on-region)
                  (call-interactively 'shell-command)
              )))
          
          
          • [^] # Re: Le compte est bon…

            Posté par  . Évalué à 2. Dernière modification le 02 août 2012 à 12:38.

            Alors pour être tout à fait exhaustif, le test sur mark-active seul n'est pas suffisant si tu désactive le transient-mark-mode (le surlignage de la région), parce que dans ce cas, il y a de fortes chances que mark-active retourne vrai quoi qu'il arrive. Dans ce cas-là, la mark sert surtout comme genre de bookmark pour se déplacer rapidement dans le fichier.

            Le test qui va bien devrait être :

            (if (use-region-p)
                ...)
            
            

            Mais pour ton utilisation personnelle, (if mark-active …) est probablement suffisant.

  • # Une histoire de poissons qui ne s'aiment pas

    Posté par  . Évalué à -1.

    Si quelqu'un aurait une piste

    J'en ai une ici

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.