Same question as this, however the solution there didn't work.
I set these variables in my ~/.vimrc:
set shellcmdflag=-ic set shell=/bin/bash\ -i
and I have an alias in my ~/.bash_aliases:
rgr() { if [ ! -z "$2" ]; then grep -rI --exclude=\*.svn\* "$1" * --include=$2 ; else grep -rI --exclude=*svn* "$1" * ; fi ; }
which works when executed from the command line, but when I try to call it from Vim with :!rgr test
, I get an error message and Vim exits:
bash: rgr: command not found [4]+ Stopped vi ~/somefile
If I disable the interactive mode, I just get the "command not found" message and Vim doesn't exit.
How can I get Vim to recognize my aliases? I've reproduced this behavior on both OS X and Ubuntu.
As with Bash aliases in general, you can put your gc alias in ~/. bashrc or in ~/. bash_aliases but it should not go in .
BASH Alias is a shortcut to run commands using some mapping. It is a way to create some shortcut commands for repetitive and multiple tasks. We create an alias in a BASH environment in specified files. We can also incorporate BASH functions, variables, etc to make the Alias more programmatic and flexible.
Please note that the alias command is built into a various shells including ksh, tcsh/csh, ash, bash and others.
If you want non-interactive shell (as default) but expansion of bash aliases, put your alias definitions in a file, e.g. .bash_aliases
and explicitly enable alias expansion in this file:
shopt -s expand_aliases alias la='ls -la'
Then add this to your .vimrc
so the aliases file is actually read each time you run a shell command from within vim:
let $BASH_ENV = "~/.bash_aliases"
Try adding this line to your ~/.vimrc
:
set shell=/bin/bash\ -i
Then vim
will use an interactive shell (-i
) which reads from ~/.bashrc
, by default. See :h shell
for more information on shell
.
I see this is essentially the same as the previous answers that you say don't work. Please try the sample session below on your machine to see if you have similar results ( and post any errors / divergences from the output you see in the sample ).
$ cat .bash_aliases alias test_alias="echo test alias" test_func () { echo test func } $ vim [vim]:set shell=/bin/bash [vim]:!type test_alias /bin/bash: line 0: type: test_alias: not found shell returned 1 Press ENTER or type command to continue [vim]:!type test_func /bin/bash: line 0: type: test_func: not found shell returned 1 Press ENTER or type command to continue [vim]:set shell=/bin/bash\ -i [vim]:!type test_alias test_alias is aliased to `echo test alias' Press ENTER or type command to continue [vim]:!type test_func test_func is a function test_func () { echo test func } Press ENTER or type command to continue
As for why it wasn't working to begin with, when bash
is simply run (i.e. neither interactive nor login; default for vim and most other purposes), it reads whatever file is specified in $BASH_ENV
:
When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following com‐ mand were executed: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi but the value of the PATH variable is not used to search for the file name.
By adding the -i
, we make the shell interactive and it therefore it reads ~/.bashrc
:
When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.
The *profile
files are read when starting a login shell:
When bash is invoked as an interactive login shell, or as a non-inter‐ active shell with the --login option, it first reads and executes com‐ mands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With