Forum Programmation.shell Démarrer un shell avec un programme dedans.

Posté par  .
Étiquettes : aucune
0
20
déc.
2007
Depuis que j'ai écrit mon journal Vim VS Gvim, ce problème m'énerve de plus en plus.
Sous Vim, comme sous plein d'applications, CTRL-Z stoppe le processus pour revenir dans le shell. Ensuite, on se sert de bg ou fg pour mettre en avant ou en arrière plan.
J'aimerais reproduire ce comportement dans un terminal qui s'ouvre directement avec VIM.
Voici ce que j'ai essayé :

xterm -e vimLance un xterm avec uniquement vim dedans, CTRL-Z ne renvoit donc sur rien.
xterm -e sh -c "bash && vim"Ouvre un xterm dans lequel tourne bash puis, une fois qu'on a quitté bash, lance vim. Mais j'aimerais que le vim tourne à l'intérieur du bash, comme si je l'avais tapé par moi-même. Alors j'ai pensé à mettre un & plutôt qu'un && :
xterm -e sh -c "bash & vim" Mais le bash est complètement zappé.
xterm -e sh -c "vim & bash"Mais : Vim alerte ! Il me dit qu'il n'est pas lancé dans un terminal.
Je me retrouve avec bash et vim en même temps dans le terminal.

Il faudrait que le vim lancé ait pour père le bash du xterm...

Le but final est de lancer un vim dans lequel CTRL-Z me renvoit dans un shell, comme si j'avais tapé vim dans un shell normal.
Sinon, pour les alternatives :
:sh ouvre un shell, mais c'est autrement plus lent que CTRL-Z
screen ne fait pas exactement ce que je veux.

Merci d'avance :=)
  • # pourquoi faire ?

    Posté par  . Évalué à 1.

    déjà c'est pour quoi faire exactement ?
    il y a peut-être une alternative.

    Sinon, je n'ai pas vu l'essai:

    bash xterm -e vim &

    qui lance un bash père d'une xterm qui lance vim, le tout en bg...
    • [^] # Re: pourquoi faire ?

      Posté par  . Évalué à 1.

      Tout le problème est là :
      bash xterm n'existe pas, il faut l'option -c entre les deux
      J'ai l'impression que bash -c xterm est équivalent à xterm tapé dans bash.

      ---

      C'est pour lancer dans un xterm (en fait ce sera après plutôt un urxvt mais ça change rien) un vim.
      Tape :
      xterm -e vim
      puis CTRL-Z

      et tu comprendras le problème.
  • # chez moi, ca marche pareil

    Posté par  . Évalué à 1.

    que chez toi,

    mais j'ai pas saisi l'interet du Ctrl+Z qui me renvoie sur le shell en suspendant le vim

    par rapport au :sh qui lance un shell dans le vim

    et surtout quel est l'interet de lancer un vim directement si c'est pour l'arret pour avoir un shell, autant lancer le shell d'abord, non ?
  • # des essais

    Posté par  . Évalué à 1.

    sont presques bons

    mais il doit falloir lancer un vim DANS un bash DANS un xterm

    donc en theorie et sans avoir essayer
    xterm -e bash -c vim

    man xterm
    et
    man bash

    pour savoir comment lancer une commande à l'appel du programme.
    • [^] # Re: des essais

      Posté par  . Évalué à 1.

      Ça marche pas.
      Si je fais CTRL-Z, le titre change en bash, mais aucun shell n'est accessible.
      J'ai bien maté les man pages (bon, tu comprendras que j'ai pas tout lu le man bash, j'ai juste regardé les options).
      Mais le problème c'est justement comme dans ton exemple.

      Quand on lance une commande dans un bash, la commande se lance mais le bash ne reste pas en arrière plan comme si on l'avait tapé.

      En fait, le problème est moins trivial qu'il n'en a l'air, sauf bien sûr si j'ai sauté l'option qui va bien.
      • [^] # Re: des essais

        Posté par  . Évalué à 1.

        la question est peut-etre de savoir ce que tu veux faire "au final"
        pour ensuite savoir "comment le faire"


        parce que là j'ai l'impression que tu cherches à couper les cheveux en 4...
        • [^] # Re: des essais

          Posté par  . Évalué à 1.

          Au final j'ai envie de faire :

          xterm -e vim

          et que dans ce xterm, CTRL-Z me renvoie vers un shell.
          • [^] # Re: des essais

            Posté par  . Évalué à 1.

            Ce qui est idiot, tout l'interet de xterm -e <command> résidant dans le fait de ne pas lancer un shell supplémentaire pour faire tourner <command>...
            • [^] # Re: des essais

              Posté par  . Évalué à 1.

              Ce qui est idiot
              Ca n'a rien d'idiot, ca peut permettre d'avoir un éditeur lancé en arrière plan dans une session X. Ce qui peut remplacer un gvim tout en gardant le comportement d'un vim, par exemple le fait que ^Z de redonne la mains sur le process père ce qui permet d'avoir un vrai shell.

              Etienne
      • [^] # Re: des essais

        Posté par  . Évalué à 1.

        Si je fais CTRL-Z, le titre change en bash, mais aucun shell n'est accessible.

        C'est parcequ'en faisant un bash -c, le shell invoqué n'est pas un shell interactif et il n'y aura donc pas possibilité de saisire une commande.

        Je ne vois pas trop de solution tout de suite car pour que le ^Z donne un shell interactif, il faut qu'il ai été lancé à partir d'un shell interactif. ^Z suspend vim et te redonne la main sur le process parent, dans notre cas, le process parent n'est pas un shell interactif.


        Etienne
        • [^] # Re: des essais

          Posté par  . Évalué à 1.

          Je peux te proposer un truc pas forcément très propre mais qui marche.


          PROMPT_COMMAND="vim; unset PROMPT_COMMAND" xterm -e bash --norc


          Le contenu de la variable PROMPT_COMMAND est executé avant chaque prompt, donc arrivé là tu as déjà un shell interactif. En demandant d'executer vim (puis en supprimant la variable pour éviter de lancer des vim en boucle), tu lance vim dès le début.

          Le --norc est là car cette variable PROMPT_COMMAND est utilisée redéclarée dans le /etc/bashrc de la distrib que j'utilise.

          Tu peux aussi passer par une autre variable et dans ton ~/.bashrc faire en sorte de positionner PROMPT_COMMAND comme il faut pour éviter le --norc.


          Etienne
          • [^] # Re: des essais

            Posté par  . Évalué à 1.

            Génial !!!
            J'allais dire j'ai trouvé une solution pourrie mais qui marche, mais la tienne reste mieux.

            Je vais quand même l'écrire, on sait jamais ça pourrait aider quelqu'un.
            ------------------------------------
            urxvt -name Ma_Session_Vim & sleep 5 && FvwmCommand "All (Ma_Session_Vim) Focus" && xvkbd -xsendevent -text "vim\r"

            1) J'ouvre un terminal
            2) J'attends : récupérer le PID et l'attendre serait plus propre qu'un sleep 5
            3) Une commande interne à mon gestionnaire de fenêtre qui met le focus sur la fenêtre
            4) Un clavier virtuel écrit vim puis "entrer" dans le terminal.

            C'est simplement horrible en plus de pas être standard.
            ------------------------------------

            Sinon je trouve ta solution au contraire très propre (surtout par rapport à la mienne), mon bashrc ne permet pas non plus ta commande si on ne met pas le --norc.
            J'essaierai de poster la partie de bashrc qu'll faut dès que possible.
            • [^] # Re: des essais

              Posté par  . Évalué à 1.

              Sinon je trouve ta solution au contraire très propre (surtout par rapport à la mienne), mon bashrc ne permet pas non plus ta commande si on ne met pas le --norc.
              J'essaierai de poster la partie de bashrc qu'll faut dès que possible.


              Dans le .bashrc il suffit de mettre simplement à la fin


              if [ "$BASH_START_COMMAND" ]
              then
              PROMPT_COMMAND="$BASH_START_COMMAND;unset PROMPT_COMMAND"
              fi


              Et démarrer xterm avec la variable BASH_START_COMMAND contenant la commande à executer. Dans ton cas

              BASH_START_COMMAND=vim xterm
              • [^] # Re: des essais

                Posté par  . Évalué à 1.

                Merci beaucoup :)

                J'ai mis ta condition en fin de ~/.bashrc
                Et je lance ceci :

                BASH_START_COMMAND='vim --servername Danou' urxvt -fn "xft:Bitstream Vera Sans Mono:pixelsize=20" -bg black -fg white +sb -name vim

                Ça marche parfaitement et quand je reviens dans le shell, le titre reste vim, ce qui est parfait pour éviter d'oublier que c'est vim et pas un shell normal.

                Encore merci.

Suivre le flux des commentaires

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