Los comandos ejecutados desde vim no reconocen los alias de comandos de bash

97

Yo uso bash en mac y uno de los alias es así

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

Sin embargo, cuando lo hago

 :! gitlog

yo obtengo

/bin/bash: gitlog: command not found 

Sé que puedo agregar alias como este en mi .gitconfig

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

Sin embargo, no quiero agregar todos mis alias de bash a .gitconfig. Eso no es SECO.

¿Existe una solución mejor?

Nick Vanderbilt
fuente
Si los alias estuvieran en el .gitconfig, entonces no necesitaría repetirlos en sus alias de Bash, y todo lo que use git los reconocería, en lugar de solo Bash. Entonces, DRY es admirable, pero también hay SPOT (Single Point Of Truth), y colocar su SPOT en el lugar correcto significa que también es más fácil estar SECO.
Jonathan Leffler
Posible duplicado entre sitios de: superuser.com/questions/47821/vim-ignores-aliases~~V~~singular~~3rd
Ciro Santilli郝海东冠状病六四事件法轮功

Respuestas:

114

Bash no carga su .bashrc a menos que sea interactivo. Utilizar

:set shellcmdflag=-ic

para hacer que el :!shell de Vim se comporte como su símbolo del sistema.

Josh Lee
fuente
6
edite su archivo .vimrc (vim ~ / .vimrc) y colóquelo en una línea allí (sin :)
guardado el
9
Esto es bueno pero tengo problemas: si habilito el modo interactivo (la bandera i), entonces puedo ejecutar bien mis comandos de shell con alias, pero tan pronto como los comandos terminan de ejecutarse, vim sale, lo cual no es deseable. Por ejemplo, intenté hacer:! Ls con shellcmdflag = -ic: [4] + Detenido vi ~ / .vimrc
ashgromnies
6
@Kevin: ¿no hay forma de obtener el comportamiento normal de viw con el bash interactivo? (ejecute el comando, espere cualquier clave, vuelva a vim)
Mayeu
7
Para mí, tener el comando en .vimrc conduce a suspended (tty output)Cuándo lo usogit commit
has2k1
27
Decirle a Vim que siempre use un shell interactivo puede crear problemas. Una mejor solución es averiguar qué en su configuración de bash establece alias y cómo puede moverlo a un lugar que esté cargado incluso en shells no interactivos. Por ejemplo, zshell solo se carga ~/.zshrcpara shells interactivos, pero se carga ~/.zshenvpara todos los shells, así que moví mi configuración de alias allí y ahora funciona desde Vim. Consulte man zsh(o las páginas de manual de su shell) para obtener más información.
Nathan Long
83

Sé que esta pregunta ya fue "respondida" anteriormente, pero tengo un problema con la respuesta. No es necesario configurar el shell para que sea interactivo en Vim. Consulte este hilo para obtener una respuesta alternativa sin tener que salir de un shell interactivo.

Si desea un shell no interactivo (por defecto) pero la expansión de los alias de bash, coloque sus definiciones de alias en un archivo, por ejemplo .bash_aliases y habilite explícitamente la expansión de alias en este archivo:

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

Luego agregue esto a su .vimrc para que el archivo de alias se lea cada vez que ejecute un comando de shell desde dentro de vim:

let $BASH_ENV = "~/.bash_aliases"

Esta solución fue sugerida por "Jakob". Vea el enlace a continuación para ver el original. ¡Probé esto en Mac OS X 10.9 y funcionó perfectamente!

vim: ¿no reconoce los alias cuando está en modo interactivo?

EmpáticoSabio
fuente
7
La mejor solución con diferencia. Personalmente, configuro la $BASH_ENVvar en mi .bashrc(antes de cualquier verificación de modo interactivo personalizado), para poder usar todos mis alias en todas las aplicaciones.
el.atomo
2
Esta es probablemente la mejor solución en esta página porque el alcance de los cambios se limitaría a Vim. Incluso se podría ir más allá y let $BASH_ENV="~/.vim/vim_bash"esto se usaría para todas las :!invocaciones dentro de Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
Desafortunadamente, esto no funciona en el shell predeterminado de macOS 10.15.2, zsh.
Ben Quigley
8

Tenga en cuenta que, dependiendo de cómo estén configurados sus archivos de punto bash, es posible que desee utilizar la opción -l en lugar de -i. Esto lanzará el shell como shell de inicio de sesión.

user836003
fuente
4
dreftymac escribió: "Para que esto funcionara para mí, era necesario hacer la opción -lic; de lo contrario, vim devolvió 'comando no encontrado'"
dreftymac
8

Sé que puede ser una pregunta antigua, sin embargo, ninguna de las respuestas anteriores funcionó para mí como deseaba. Entonces, para los que vinieron aquí de buscar en Google y para (oh-my-) usuarios de zsh:

Mi solución a esto fue tan simple como copiar .zshrc a .zshenv, según http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'se obtiene en todas las invocaciones del shell, a menos que se establezca la opción -f. Debe contener comandos para establecer la ruta de búsqueda de comandos, además de otras variables de entorno importantes. `.zshenv 'no debe contener comandos que produzcan resultados o supongan que el shell está adjunto a un tty.

Así $ cp ~/.zshrc ~/.zshenvhará la cosa.

Damian Borowski
fuente
¡Gracias por esto! Solo quería señalar que si tiene sus alias de shell en un archivo, puede simplemente obtenerlos en .zshenv. Algo como: . $HOME/.aliases
scifisamurai
2

No me siento muy cómodo con la configuración de la opción -i, ya que tiene bastante impacto y estoy usando el shell a menudo desde vim. Lo que haría en su lugar es algo como:!bash -c ". ~/.alias; gitlog"

pfnuesel
fuente
Esta parece la mejor solución, pero no me funciona. Todavía dice comando no encontrado
still_dreaming_1