Как задать псевдонимы и переменные bash из vim?

Как задать псевдонимы и переменные bash из vim?

В режиме 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). Итак:

  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

Связанный контент