Vim - не распознавать псевдонимы в интерактивном режиме?
Тот же вопрос, что и Команды, выполненные из vim, не распознают псевдонимы команд bash, однако решение там не срабатывало.
Я установил эти переменные в свой файл ~/.vimrc:
set shellcmdflag=-ic
set shell=/bin/bash\ -i
и у меня есть псевдоним в моих ~/.bash_aliases:
rgr() { if [ ! -z "$2" ]; then grep -rI --exclude=\*.svn\* "$1" * --include=$2 ; else grep -rI --exclude=*svn* "$1" * ; fi ; }
который работает, когда выполняется из командной строки, но когда я пытаюсь вызвать его из vim (:!rgr test
), я получаю сообщение об ошибке и vim выходит:
bash: rgr: command not found
[4]+ Stopped vi ~/somefile
Если отключить интерактивный режим, я просто получаю сообщение "команда не найдена", и vim не выйдет.
Как я могу получить vim для распознавания моих псевдонимов? Я воспроизвел это поведение как на OS X, так и на Ubuntu.
Ответы
Ответ 1
Я получил это для работы через man-страницу для bash
:
set shell=/bin/bash\ --rcfile\ ~/.bash_profile
Аналогично, --init-file
работает.
Обратите внимание, что \ -i
не требуется, хотя его можно добавить в команду:
set shell=/bin/bash\ --rcfile\ ~/.bash_profile\ -i
Пример:
~/.bash_profile
содержит
source ~/.bash_aliases
~/.bash_aliases
содержит
alias rdc="open -a \"Remote Desktop Connection\""
~/.vimrc
содержит
set shell=/bin/bash\ --rcfile\ ~/.bash_profile
map ,r :!rdc &<cr>
Ответ 2
Если вы хотите неинтерактивную оболочку (по умолчанию), а расширение псевдонимов bash, поместите свои определения псевдонимов в файл, например. .bash_aliases
и явно включить расширение псевдонима в этом файле:
shopt -s expand_aliases
alias la='ls -la'
Затем добавьте это в свой .vimrc
, чтобы файл псевдонимов фактически читался каждый раз, когда вы запускаете команду оболочки из vim:
let $BASH_ENV = "~/.bash_aliases"
Ответ 3
Попробуйте добавить эту строку в свой ~/.vimrc
:
set shell=/bin/bash\ -i
Затем vim
будет использовать интерактивную оболочку (-i
), которая по умолчанию считывает из ~/.bashrc
. См. :h shell
для получения дополнительной информации о shell
.
Я вижу, что это по сути то же самое, что и предыдущие ответы, которые вы говорите, не работают. Пожалуйста, попробуйте примерную сессию ниже на вашем компьютере, чтобы узнать, есть ли у вас похожие результаты (и опубликуйте любые ошибки/отклонения от результата, который вы видите в примере).
$ cat .bash_aliases
alias test_alias="echo test alias"
test_func () {
echo test func
}
$ vim
[vim]:set shell=/bin/bash
[vim]:!type test_alias
/bin/bash: line 0: type: test_alias: not found
shell returned 1
Press ENTER or type command to continue
[vim]:!type test_func
/bin/bash: line 0: type: test_func: not found
shell returned 1
Press ENTER or type command to continue
[vim]:set shell=/bin/bash\ -i
[vim]:!type test_alias
test_alias is aliased to `echo test alias'
Press ENTER or type command to continue
[vim]:!type test_func
test_func is a function
test_func ()
{
echo test func
}
Press ENTER or type command to continue
Что касается того, почему это не сработало, когда bash
просто запускается (т.е. ни интерактивный, ни логин, по умолчанию для vim и большинства других целей), он читает, какой файл указан в $BASH_ENV
:
When bash is started non-interactively, to run a shell script, for
example, it looks for the variable BASH_ENV in the environment, expands
its value if it appears there, and uses the expanded value as the name
of a file to read and execute. Bash behaves as if the following com‐
mand were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file
name.
Добавив -i
, мы сделаем оболочку интерактивной, и поэтому она читает ~/.bashrc
:
When an interactive shell that is not a login shell is started, bash
reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if
these files exist. This may be inhibited by using the --norc option.
The --rcfile file option will force bash to read and execute commands
from file instead of /etc/bash.bashrc and ~/.bashrc.
Файлы *profile
считываются при запуске оболочки входа:
When bash is invoked as an interactive login shell, or as a non-inter‐
active shell with the --login option, it first reads and executes com‐
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable. The --noprofile option may be used when the
shell is started to inhibit this behavior.
Ответ 4
У меня это в моем ~/.vimrc
:
set shell=bash\ -i
Все пользовательские функции:
mkcd () {
mkdir -p "$*"
cd "$*"
}
и псевдонимы:
alias lsvn='svn list -vR'
работает при использовании с Vim.
Но я не использую ~/.bash_aliases
, я добавил их прямо в мой ~/.bashrc
.
Источник ~/.bash_aliases
от ~/.bashrc
?