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

98

Я использую 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. Это не СУХОЕ.

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

Ник Вандербильт
источник
Если бы псевдонимы были в .gitconfig, вам не нужно было бы повторять их в псевдонимах Bash, и все, что использует git, узнало бы их, а не только Bash. Итак, DRY - это достойно восхищения, но есть еще и SPOT (Single Point Of Truth), и размещение вашего SPOT в нужном месте означает, что легче быть DRY.
Джонатан Леффлер,
Возможный межсайтовый дубликат: superuser.com/questions/47821/vim-ignores-aliases
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

116

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

:set shellcmdflag=-ic

чтобы :!оболочка Vim работала как ваша командная строка.

Джош Ли
источник
6
отредактируйте файл .vimrc (vim ~ / .vimrc) и поместите его в строку (без
символа
9
Это хорошо, но у меня проблемы - если я включу интерактивный режим (флаг i), я могу нормально выполнять команды оболочки с псевдонимом, но как только команды будут выполнены, vim завершится, что нежелательно. Например, я попытался сделать:! Ls с shellcmdflag = -ic: [4] + Остановлен vi ~ / .vimrc
ashgromnies 08
6
@Kevin: нет возможности добиться нормального поведения viw с помощью интерактивного bash? (выполнить команду, дождаться любой клавиши, вернуться в vim)
Mayeu
7
Для меня наличие команды в .vimrc приводит к тому, что suspended (tty output)когда я используюgit commit
has2k1
27
Указание Vim всегда использовать интерактивную оболочку может создать проблемы. Лучшее решение - выяснить, что в вашей конфигурации bash устанавливает псевдонимы и как вы можете переместить это в место, которое загружается даже в неинтерактивных оболочках. Например, zshell загружается только ~/.zshrcдля интерактивных оболочек, но он загружается ~/.zshenvдля всех оболочек, поэтому я переместил туда свой псевдоним, и теперь он работает из Vim. См. man zsh(Или справочные страницы вашей оболочки) для получения дополнительной информации.
Натан Лонг
83

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

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

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

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

let $BASH_ENV = "~/.bash_aliases"

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

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

Эмпатический Мудрец
источник
7
Лучшее решение на сегодняшний день. Лично я устанавливаю $BASH_ENVпеременную в my .bashrc(перед любой проверкой пользовательского интерактивного режима), поэтому я могу использовать все свои псевдонимы в приложениях.
el.atomo 03
2
Вероятно, это лучшее решение на этой странице, потому что объем изменений будет ограничен внутри Vim. Можно даже пойти дальше и let $BASH_ENV="~/.vim/vim_bash", и это будет использоваться для всех :!вызовов в Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeej
К сожалению, это не работает в оболочке по умолчанию macOS 10.15.2, zsh.
Бен Куигли
8

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

user836003
источник
4
dreftymac написал: «Для того, чтобы это работало для меня, необходимо было использовать параметр -lic, иначе vim вернул бы 'команда не найдена'»
dreftymac
8

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

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

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

Так $ cp ~/.zshrc ~/.zshenvчто сделаю вещь.

Дамиан Боровски
источник
Спасибо тебе за это! Просто хотел отметить, что если у вас есть псевдонимы оболочки в файле, вы можете просто указать их в формате .zshenv. Что-то вроде: . $HOME/.aliases
scifisamurai
2

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

pfnuesel
источник
Это кажется лучшим решением, но у меня оно не работает. Он по-прежнему говорит, что команда не найдена
still_dreaming_1