Подтвердить что ты не робот

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.

4b9b3361

Ответ 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?