
No modo cmdline, os exemplos a seguir não funcionam para mim.
!alias lol='echo lol'
!lol='echo lol'
Responder1
Quando você usa o :!
comando, um novo shell é gerado no Vim. Nesse shell, o alias é definido, mas imediatamente depois disso, o shell é encerrado e tudo está perdido.
É melhor definir os aliases no shell que inicia o Vim. Para variáveis de ambiente, você também pode defini-las no Vim via :let $VAR = 'value'
e pode usá-las em :!
comandos. E você pode iniciar um shell no Vim com :shell
ou suspender o Vim e voltar ao shell original com :stop
ou ^z
.
Responder2
vim
inicia uma instância de um não interativo bash
(supondo bash
que seja seu shell de login e que você não tenha modificado $SHELL
) para cada !
comando (em !cmd
, vim é executado bash -c cmd
). Então:
- Um alias definido em um ! comando, não estaria disponível no outro shell iniciado pelo próximo! comando, pois é um processo completamente diferente.
bash
não expande aliases e não lê~/.bashrc
quando não é interativo
Para contornar isso, você pode definir $BASH_ENV
algo que permita a expansão do alias e se reescreva ao sair bash
com a lista de novos aliases incluída. Algo como (em ~/.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