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

98

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'

Cependant 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?

Nick Vanderbilt
la source
Si les alias se trouvaient dans .gitconfig, vous n'auriez pas besoin de les répéter dans vos alias Bash, et tout ce qui utilise git les connaîtrait, plutôt que simplement Bash. Donc, DRY est admirable, mais il y a aussi SPOT (Single Point Of Truth), et placer votre SPOT au bon endroit signifie qu'il est aussi plus facile d'être DRY.
Jonathan Leffler
Possible duplication
intersite

Réponses:

116

Bash ne charge pas votre .bashrc sauf s'il est interactif. Utilisation

:set shellcmdflag=-ic

pour que le :!shell de Vim se comporte comme votre invite de commande.

Josh Lee
la source
6
éditez votre fichier .vimrc (vim ~ / .vimrc) et mettez-le dans une ligne là (sans le :)
skeept
9
C'est bien mais j'ai des problèmes - si j'active le mode interactif (le drapeau i), alors je peux exécuter mes commandes shell aliasées correctement, mais dès que les commandes sont exécutées, vim quitte ce qui n'est pas souhaitable. Ex, j'ai essayé de faire:! Ls avec shellcmdflag = -ic: [4] + Stopped vi ~ / .vimrc
ashgromnies
6
@Kevin: il n'y a aucun moyen d'obtenir le comportement normal de viw avec le bash interactif? (exécutez la commande, attendez n'importe quelle clé, revenez à vim)
Mayeu
7
Pour moi, avoir la commande en .vimrc mène à suspended (tty output)Quand j'utilisegit commit
has2k1
27
Dire à Vim de toujours utiliser un shell interactif peut créer des problèmes. Une meilleure solution consiste à déterminer ce qui dans votre configuration bash configure les alias et comment vous pouvez le déplacer vers un emplacement chargé même dans des shells non interactifs. Par exemple, zshell ne se charge que ~/.zshrcpour les shells interactifs, mais il se charge ~/.zshenvpour tous les shells, j'ai donc déplacé ma configuration d'alias là-bas et cela fonctionne maintenant depuis Vim. Voir man zsh(ou les pages de manuel de votre shell) pour en savoir plus.
Nathan Long
83

Je sais que cette question a déjà été "répondue", 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 extension des alias bash, mettez vos définitions d'alias dans un fichier, par exemple .bash_aliases et activez explicitement l'expansion d'alias dans ce fichier:

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

Ensuite, ajoutez ceci à votre .vimrc afin 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?

EmpathiqueSage
la source
7
La meilleure solution de loin. Personnellement, j'ai défini le $BASH_ENVvar dans my .bashrc(avant toute vérification du mode interactif personnalisé), afin de pouvoir utiliser tous mes alias dans les applications.
el.atomo
2
C'est probablement la meilleure solution sur cette page car la portée des changements serait limitée à Vim. On pourrait même aller plus loin et let $BASH_ENV="~/.vim/vim_bash", et cela serait utilisé pour toutes les :!invocations dans Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
Cela ne fonctionne pas dans le shell par défaut de macOS 10.15.2, zsh, malheureusement.
Ben Quigley le
8

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

user836003
la source
4
dreftymac a écrit: "Pour que cela fonctionne pour moi, il était nécessaire de faire l'option -lic, sinon vim a renvoyé 'command not found'"
dreftymac
8

Je sais que c'est 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 les utilisateurs de (oh-my-) zsh:

Ma solution à cela était 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.

Alors $ cp ~/.zshrc ~/.zshenvfera la chose.

Damian Borowski
la source
Merci pour ça! Je voulais juste noter que si vous avez vos alias de shell dans un fichier, vous pouvez simplement les rechercher dans .zshenv. Quelque chose comme: . $HOME/.aliases
scifisamurai
2

Je ne me sens pas trop à l'aise avec la définition de l'option -i, car elle 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"

pfnuesel
la source
Cela semble être la meilleure solution, mais cela ne fonctionne pas pour moi. Il dit toujours que la commande n'a pas été trouvée
still_dreaming_1