vim - не распознавать псевдонимы в интерактивном режиме? - PullRequest
20 голосов
/ 12 января 2012

Тот же вопрос, что и Команды, выполняемые из 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.

Ответы [ 4 ]

33 голосов
/ 19 сентября 2013

Если вам нужна неинтерактивная оболочка (по умолчанию), но расширение псевдонимов bash, поместите определения псевдонимов в файл, например, .bash_aliases и явно включают расширение псевдонима в этом файле:

shopt -s expand_aliases
alias la='ls -la'

Затем добавьте это в .vimrc, чтобы файл псевдонимов фактически читался каждый раз, когда вы запускаете команду оболочки из vim:

let $BASH_ENV = "~/.bash_aliases"
22 голосов
/ 20 января 2012

Попробуйте добавить эту строку в ~/.vimrc:

set shell=/bin/bash\ -i

Тогда vim будет использовать интерактивную оболочку (-i), которая по умолчанию читает ~/.bashrc.См. :h shell для получения дополнительной информации о shell.


Я вижу, что это по сути то же самое, что предыдущие ответы, которые вы говорите, не работают.Пожалуйста, попробуйте следующий пример сеанса на вашем компьютере, чтобы увидеть, есть ли у вас аналогичные результаты (и опубликуйте какие-либо ошибки / расхождения с выводом, который вы видите в образце).не работает для начала, когда 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.
9 голосов
/ 26 января 2012

Я заставил это работать через страницу руководства для 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>
0 голосов
/ 13 января 2012

У меня есть это в моем ~/.vimrc:

set shell=bash\ -i

Все пользовательские функции:

mkcd () {
  mkdir -p "$*"
  cd "$*"
}

и псевдонимы:

alias lsvn='svn list -vR'

работа при использовании от Vim.

Но я не использую ~/.bash_aliases, я добавил их прямо в ~/.bashrc.

Вы получаете ~/.bash_aliases от ~/.bashrc?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...