
В режиме cmdline следующие примеры у меня не работают.
!alias lol='echo lol'
!lol='echo lol'
решение1
При использовании :!
команды из Vim создается новая оболочка. В этой оболочке устанавливается псевдоним, но сразу после этого оболочка завершает работу, и все теряется.
Лучше всего определить псевдонимы в оболочке, которая запускает Vim. Для переменных окружения вы также можете задать их из Vim через :let $VAR = 'value'
, и вы можете использовать их в :!
командах. И вы можете запустить оболочку из Vim с помощью :shell
, или приостановить Vim и вернуться к исходной оболочке с помощью :stop
или ^z
.
решение2
vim
запускает один экземпляр неинтерактивного bash
(предполагается, bash
что это ваша оболочка входа в систему и вы не изменили $SHELL
) для каждой !
команды (в !cmd
, vim запускает bash -c cmd
). Итак:
- Псевдоним, определенный в одной команде !, не будет доступен в другой оболочке, запущенной следующей командой !, поскольку это совершенно другой процесс.
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