Vim - don't recognize aliases interactively?

The same question as Commands executed from vim does not recognize bash command aliases , however the solution did not work there.

I set these variables to my ~ / .vimrc file:

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 ( :!rgr test ), I get an error message and vim exits:

 bash: rgr: command not found [4]+ Stopped vi ~/somefile 

If you disable interactive mode, I just get the message "command not found", and vim will not work.

How can I get vim to recognize my aliases? I reproduced this behavior on both OS X and Ubuntu.

+16
bash vim
Jan 12 '12 at 19:29
source share
4 answers

I got this to work through the man page for bash :

 set shell=/bin/bash\ --rcfile\ ~/.bash_profile 

Similarly, --init-file works.

Note that \ -i not required , although it can be added to the command:

 set shell=/bin/bash\ --rcfile\ ~/.bash_profile\ -i 

Example:

~/.bash_profile contains

  source ~/.bash_aliases 

~/.bash_aliases contains

  alias rdc="open -a \"Remote Desktop Connection\"" 

~/.vimrc contains

  set shell=/bin/bash\ --rcfile\ ~/.bash_profile map ,r :!rdc &<cr> 
+9
Jan 26 '12 at 5:05
source share

If you want a non-interactive shell (by default), and a bash alias extension, put your alias definitions in a file, for example. .bash_aliases and explicitly include the alias extension in this file:

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

Then add this to your .vimrc so that the aliases file is actually read every time you run the shell command from vim:

 let $BASH_ENV = "~/.bash_aliases" 
+26
Sep 19 '13 at 17:46
source share

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. 
+22
Jan 20 '12 at 19:18
source share

I have this in my ~/.vimrc :

 set shell=bash\ -i 

All user functions:

 mkcd () { mkdir -p "$*" cd "$*" } 

and aliases:

 alias lsvn='svn list -vR' 

works when used with Vim.

But I do not use ~/.bash_aliases , I added them directly to my ~/.bashrc .

Source ~/.bash_aliases from ~/.bashrc ?

0
Jan 12 2018-12-12T00:
source share



All Articles