在命令行模式下,以下示例对我不起作用。
!alias lol='echo lol'
!lol='echo lol'
答案1
当您使用该:!
命令时,Vim 中会生成一个新的 shell。在该 shell 中,设置了别名,但此后 shell 立即退出,一切都丢失了。
最好在启动 Vim 的 shell 中定义别名。对于环境变量,您还可以通过在 Vim 中设置它们:let $VAR = 'value'
,并且可以在:!
命令中使用它们。您可以使用 启动 Vim 中的 shell ,或者使用或:shell
暂停 Vim 并返回到原始 shell 。:stop
^z
答案2
vim
为每个命令(在vim 运行中)启动一个非交互式实例bash
(假设bash
是您的登录 shell 并且您尚未修改) 。所以:$SHELL
!
!cmd
bash -c cmd
- 在其中定义的别名!命令,在下一个启动的其他 shell 中将不可用!命令,因为它完全是一个不同的过程。
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