Vim not recognizing aliases when in interactive mode?

前端 未结 4 1369
Happy的楠姐
Happy的楠姐 2020-12-09 09:33

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
<         


        
相关标签:
4条回答
  • 2020-12-09 09:49

    I have this in my ~/.vimrc:

    set shell=bash\ -i
    

    All the custom functions:

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

    and aliases:

    alias lsvn='svn list -vR'
    

    work when used from Vim.

    But I don't use ~/.bash_aliases, I've added them directly to my ~/.bashrc.

    Do you source ~/.bash_aliases from ~/.bashrc?

    0 讨论(0)
  • 2020-12-09 09:50

    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.
    
    0 讨论(0)
  • 2020-12-09 09:58

    I got this to work, via the man page for bash:

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

    Similarly, --init-file works.

    Note that \ -i is not necessary, though 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>
    
    0 讨论(0)
  • 2020-12-09 09:58

    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"
    
    0 讨论(0)
提交回复
热议问题