vim 内から bash エイリアスと変数を設定するにはどうすればよいですか?

vim 内から bash エイリアスと変数を設定するにはどうすればよいですか?

cmdline モードでは、次の例は機能しません。

!alias lol='echo lol'
!lol='echo lol'

答え1

コマンドを使用すると:!、Vim 内から新しいシェルが生成されます。そのシェルではエイリアスが設定されますが、その直後にシェルが終了し、すべてが失われます。

Vim を起動するシェルでエイリアスを定義するのが最適です。環境変数については、 を使用して Vim 内から設定することもでき:let $VAR = 'value':!コマンドでそれらを使用することもできます。また、 を使用して Vim 内からシェルを起動したり:shell、 または を使用して Vim を一時停止して元のシェルに戻ったりする:stopこともできます^z

答え2

vimは、各コマンド ( では、vim は を実行します)に対して、非対話型の インスタンスを 1 つ起動しますbash(bashがログイン シェルであり、 を変更していないと仮定) 。つまり、$SHELL!!cmdbash -c cmd

  1. 1 つの ! コマンドで定義されたエイリアスは、まったく別のプロセスであるため、次の ! コマンドによって開始される他のシェルでは使用できません。
  2. bash~/.bashrcエイリアスを展開せず、対話的でないときは読み取らない

これを回避するには、$BASH_ENVエイリアスの拡張を有効にし、 の終了時にbash新しいエイリアスのリストが含まれた状態で を書き換えるような設定をします。次のようになります ( 内~/.vimrc):

let $BASH_ENV = $HOME . "/.bashvimrc." . getpid()
au VimLeave * silent !exec rm -f "$BASH_ENV"
silent !echo 'vim_setup() { shopt -s expand_aliases; trap write_aliases EXIT; eval "$@"; }; write_aliases() { typeset -f vim_setup write_aliases; alias; echo vim_setup \"\$@\";} > "$BASH_ENV"; vim_setup "$@"' > "$BASH_ENV"
set shell=/bin/bash

関連情報