Try adding this line to your ~/.vimrc :
set shell=/bin/bash\ -i
Then vim will use the interactive shell ( -i ), which by default reads from ~/.bashrc . See :h shell for more information on shell .
I see that this is essentially the same as the previous answers you say do not work. Please try the sample session below on your computer to see if you have similar results (and post any errors / deviations from the result that you see in the example).
$ 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 this did not work, when bash just starts (i.e., neither interactive, nor login, by default for vim and most other purposes), it reads which 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.
Adding -i will make the shell interactive, and so 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.
*profile files are read when the login shell starts:
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.