Comment puis-je rendre les alias de shell disponibles lors du décorticage depuis Vim?

11

Dans mon .zshrc, je déclare quelques alias. Par exemple, which dbstartaffiche le contenu de cet alias.

Si j'ouvre vim à partir de ce shell, c'est un processus enfant. Dans Vim, je peux exécuter des commandes shell avec :! some_command. Si je fais :! echo $0pour voir quel shell Vim utilise, il génère '/ bin / zsh'. Cependant, mes alias ne sont pas disponibles là-bas.

Comment puis-je rendre mes alises shell normales disponibles lorsque je sort de Vim?

Deux idées:

  • D'une manière ou d'une autre, EXPORTles alias du shell d'origine, à son processus enfant vim, et à nouveau à son processus enfant shell
  • Configurer Vim pour lire mon .zshrclors de la création de ses sous-coques
Nathan Long
la source
inclure votre .zshrcdans .profile (qui semble être utilisé parvim
Kiwy

Réponses:

13

Vieille question, mais la solution la plus propre pour vim dans zsh était d'ajouter l'alias au ~/.zshenvfichier que zsh charge pour tous les shells, login, interactif ou autre. Cela évite de démarrer vim ou zsh avec des drapeaux et tout problème possible avec cela.

Il y a une belle explication de ~/.zshenvvs ~/.zshrcici: http://tanguy.ortolo.eu/blog/article25/shrc

Fondamentalement, zsh source toujours ~/.zshenv. Source de shells interactifs ~/.zshrc, et source de shells de connexion ~/.zprofileet ~/.zlogin. Ainsi, un shell interactif de connexion aux sources ~/.zshenv ~/.zprofile ~/.zlogin ~/.zloginet un shell non interactif et non connecté comme celui utilisé par vim pour exécuter des commandes uniquement des sources ~/.zshenv.

Kevin Lee
la source
Ce n'est pas une réponse de lien uniquement, mais il serait préférable que vous souligniez l'explication de la différence par rapport au lien; de cette façon, tout le monde peut bénéficier de l'explication ici et nous sommes à l'abri de linkrot.
HalosGhost
1
Mise à jour de ma réponse avec les principaux points du lien.
Kevin Lee
Cela a fonctionné exponentiellement mieux pour moi que les autres réponses. Lorsque j'ai ajouté pour que vim démarre un shell interactif, il s'est immédiatement suspendu. Lorsque j'utilise le fichier .zshenv (dont je ne connaissais pas l'existence auparavant), je récupère mes alias!
Caleb
5

On dirait que cela fonctionne pour zsh:

  • Assurez-vous que $ZDOTDIR=le répertoire où .zshrcse trouve. Par exemple,export ZDOTDIR=$HOME
  • Dans .vimrc, set shell=zsh\ -iou set shellcmdflag+=ipour le même effet.

C'est -iparce que, lorsqu'il est démarré en mode interactif, zshell se charge $ZDOTDIR/.zshrc. Voir man zshet rechercher $ZDOTDIRdes détails.

Nathan Long
la source
1
Hmmm, cela crée un problème étrange pour moi: copier dans le presse-papiers du système comme "+ymaintenant suspend Vim! superuser.com/questions/712245/…
Nathan Long
5
Mon vim se suspend dès que je l'ouvre.
Caleb
0

Je crois que lorsque vous êtes dedans vimet que vous l'utilisez, :!some_commandil utilise le shell défini par la variable d'environnement $SHELL.

Ceci est configurable, vous pouvez donc changer en remplaçant le $SHELLcomportement de votre $HOME/.vimrcfichier à utiliser à la zshplace.

:set shell
shell=/bin/bash
:set shell=zsh\ -i

Ou dans votre .vimrcutilisation de 1 de ces 2 lignes

 set shell=/bin/bash\ -i
 set shell=/bin/zsh\ -i

Aide Vim

Voir :help shellde l'intérieur vimpour plus d'informations.

:!{cmd}                 Execute {cmd} with the shell.  See also the 'shell'
                        and 'shelltype' option.
                        Any '!' in {cmd} is replaced with the previous
                        external command (see also 'cpoptions').  But not when
                        there is a backslash before the '!', then that
                        backslash is removed.  Example: ":!ls" followed by
                        ":!echo ! \! \\!" executes "echo ls ! \!".
                        After the command has been executed, the timestamp of
                        the current file is checked timestamp.
slm
la source
Non, comme je l'ai dit: "Si je le fais:! Echo $ 0 pour voir quel shell Vim utilise, il génère '/ bin / zsh'"
Nathan Long
@NathanLong - non, je pense que cela vous induit en erreur, voir mes mises à jour.
slm
@slm vim extrait la valeur de $SHELL. Votre coquille l'est donc /bin/bash. Si ma coquille est /bin/zsh, c'est ce qu'elle utilisera.
Patrick
0

En réglant shell=/usr/bin/zsh\ -là .vimrcrésoudre mon problème

Remarque:

J'utilise: linux mint 17.1

murali kodali
la source
en utilisant ubuntu 14.04, cela ne fonctionne pas pour moi
vilsbole