5 votes

Le processus Vim s'arrête après l'exécution d'une commande externe

J'ai récemment utilisé vim pour programmer en C. J'ai créé des raccourcis pour compiler et exécuter les programmes à partir de vim lui-même, mais récemment, le processus de vim s'est arrêté après l'exécution du programme.

foo.c :

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

.vimrc :

set shellcmdflag=-ic

syntax on

autocmd FileType c map <F6> :!gcc -o "%:p:r.out" "%:." <bar> more<CR>
autocmd FileType c map <F7> :!%:p:r.out<CR>

Si je frappe F6 le programme se compile bien. Mais si je tape F7 J'obtiens ce qui suit :

Hello World!
[1]+  Stopped                 vim test.c

Je peux utiliser fg pour relancer le processus, mais ça devient légèrement ennuyeux de le faire. Quelqu'un sait-il comment résoudre ce problème ?

7voto

rici Points 3733

N'utilisez pas un Shell interactif pour exécuter des commandes. (C'est le i in -ic .)

Le shellcmdflag par défaut ( -c ) devrait fonctionner parfaitement.

Si vous spécifiez -i afin que bash puisse lire votre .bashrc (qui est un effet secondaire du démarrage d'un Shell interactif), alors vous feriez mieux de dire à bash de lire un Shell d'environnement de démarrage. Citation de la page de manuel de bash :

Lorsque bash est lancé de manière non interactive, pour exécuter un Shell Shell, par exemple, il recherche la variable BASH_ENV dans l'environnement, développe sa valeur si elle y apparaît, et utilise la valeur développée comme nom de fichier à lire et à exécuter. Bash se comporte comme si la commande suivante était exécutée :

          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

mais la valeur de la PATH n'est pas utilisée pour rechercher le nom du fichier.

Vous pouvez définir des variables d'environnement dans vim avec :let

0voto

Britton Points 394

Je suis d'accord sur le fait qu'il ne faut pas utiliser un sous-shell interactif, car rici souligne dans sa réponse . (J'ai particulièrement apprécié le analyse du problème dans son commentaire .)

Cependant, le réglage BASH_ENV est dangereux : si vous faites cela, vous devez vous assurer que Bash est jamais invoqué à partir de ce fichier, directement ou indirectement, ou vous vous retrouverez dans une boucle infinie de processus Bash. Cela peut être difficile si vous avez une configuration assez sophistiquée, car il est facile de ne pas réaliser qu'un programme que vous appelez est en fait un script de Bash.

Ma solution consiste simplement à set shell=bash-rcc qui est le script suivant :

#!/usr/bin/env bash
#
#   bash-rcc - source ~/.bashrc and run bash -c command
#
#   This is used as the shell by programs such as vim where we want
#   `:!` commands to be able to use shell functions and aliases
#   defined in `~/.bashrc` but do not want the shell started in
#   interactive mode. Interactive mode does various things, such as
#   setting up its own process group, that can cause problems when
#   used to run a single command from another program.

[[ $1 = -c ]] && shift
. ~/.bashrc
eval "$1"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X