web-dev-qa-db-fra.com

Les commandes exécutées à partir de vim ne reconnaissent pas les alias de commande bash

J'utilise bash sur mac et l'un des alias est comme ça

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'

Mais quand je fais

 :! gitlog

Je reçois

/bin/bash: gitlog: command not found 

Je sais que je peux ajouter des alias comme celui-ci dans mon .gitconfig

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff

Cependant, je ne veux pas ajouter tous mes alias bash à .gitconfig. Ce n'est pas SEC.

Y a-t-il une meilleure solution?

92
Nick Vanderbilt

Bash ne charge pas votre .bashrc à moins qu'il ne soit interactif. Utilisation

:set shellcmdflag=-ic

pour faire de Vim's :! Shell se comporte comme votre invite de commande.

109
Josh Lee

Je sais que cette question a déjà reçu une "réponse", mais j'ai un problème avec la réponse. Le Shell n'a pas besoin d'être défini sur interactif dans Vim. Voir ce fil pour une réponse alternative sans avoir à quitter un shell interactif.

Si vous voulez un Shell non interactif (par défaut) mais une expansion des alias bash, mettez vos définitions d'alias dans un fichier, par ex. .bash_aliases et activer explicitement l'expansion d'alias dans ce fichier:

shopt -s expand_aliases  
alias la='ls -la'

Ajoutez ensuite ceci à votre .vimrc pour que le fichier d'alias soit réellement lu chaque fois que vous exécutez une commande Shell depuis vim:

let $BASH_ENV = "~/.bash_aliases"

Cette solution a été suggérée par "Jakob". Voir le lien ci-dessous pour l'original. J'ai testé cela sur Mac OS X 10.9 et cela a fonctionné parfaitement!

vim - ne reconnaît pas les alias en mode interactif?

77
Zahnon

Notez que selon la façon dont vos fichiers doth bash sont configurés, vous pouvez utiliser l'option -l plutôt que l'option -i. Cela lancera le Shell en tant que Shell de connexion.

7
user836003

Je sais que cela peut être une vieille question, mais aucune des réponses ci-dessus n'a fonctionné pour moi comme souhaité. Donc, pour ceux qui sont venus ici de googler et pour (oh-my-) les utilisateurs de zsh:

Ma solution à cela a été aussi simple que de copier .zshrc vers .zshenv - selon http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'provient de toutes les invocations du shell, sauf si l'option -f est définie. Il doit contenir des commandes pour définir le chemin de recherche des commandes, ainsi que d'autres variables d'environnement importantes. `.zshenv 'ne doit pas contenir de commandes qui produisent une sortie ou supposent que le shell est attaché à un tty.

Donc $ cp ~/.zshrc ~/.zshenv fera l'affaire.

5
Damian Borowski

Je ne me sens pas trop à l'aise avec la définition de l'option -i, car cela a un certain impact et j'utilise souvent le shell de vim. Ce que je ferais à la place, c'est quelque chose comme :!bash -c ". ~/.alias; gitlog"

2
pfnuesel