
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
!
!cmd
bash -c cmd
- 1 つの ! コマンドで定義されたエイリアスは、まったく別のプロセスであるため、次の ! コマンドによって開始される他のシェルでは使用できません。
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