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

Команды, выполненные из vim, не распознают псевдонимы команд bash

Я использую bash для mac, и один из псевдонимов подобен этому

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'

Однако, когда я делаю

 :! gitlog

Я получаю

/bin/bash: gitlog: command not found 

Я знаю, что я могу добавить такие псевдонимы в моем .gitconfig

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff

Однако я не хочу добавлять все мои псевдонимы bash в .gitconfig. Это не СУХОЙ.

Есть ли лучшее решение?

4b9b3361

Ответ 1

Bash не загружает ваш .bashrc, если он не является интерактивным. Используйте

:set shellcmdflag=-ic

чтобы заставить Vims :! shell вести себя как ваша командная строка.

Ответ 2

Я знаю, что этот вопрос уже был ранее "ответил", но у меня проблема с ответом. Оболочку не нужно устанавливать в интерактивном режиме в Vim. См. Эту тему для альтернативного ответа без выхода из интерактивной оболочки.

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

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

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

let $BASH_ENV = "~/.bash_aliases"

Это решение было предложено "Якобом". См. Ссылку ниже для оригинала. Я тестировал это на Mac OS X 10.9, и он работал безупречно!

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

Ответ 3

Обратите внимание, что в зависимости от того, как настроены ваши файлы bash dotfiles, вы можете использовать опцию -l, а не -i. Это запустит оболочку в качестве оболочки входа.

Ответ 4

Я не чувствую себя слишком комфортно с настройкой опции -i, так как она имеет некоторое влияние, и я часто использую оболочку из vim. Вместо этого я бы сделал что-то вроде :!bash -c ". ~/.alias; gitlog"

Ответ 5

Я знаю, что это может быть старый вопрос, однако ни один из вышеперечисленных ответов не работал у меня по желанию. Итак, для тех, кто пришел сюда из Google и для пользователей (oh-my-) zsh:

Мое решение было таким же простым, как копирование .zshrc в .zshenv - согласно http://zsh.sourceforge.net/Intro/intro_3.html:

`.zshenv 'используется во всех вызовах оболочки, если не задана опция -f. Он должен содержать команды для задания пути поиска команд, а также другие важные переменные среды. `.zshenv 'не должен содержать команды, которые производят вывод или предполагают, что оболочка прикреплена к tty.

Итак, $ cp ~/.zshrc ~/.zshenv выполнит эту задачу.