web-dev-qa-db-ja.com

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

コマンドラインモードでは、次の例は機能しません。

!alias lol='echo lol'
!lol='echo lol'
2
bug

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

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

5
Ingo Karkat

vimは、非対話型bashの1つのインスタンスを開始します(bashがログインシェルであり、_$Shell_ごとに_!_を変更していないと仮定します) __コマンド(_!cmd_では、vimは_bash -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
_
4