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


97

Я використовую 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. Отже, СУХЕ - це захоплююче, але існує також СПОТ (Single Point Of Truth), і якщо ваш СПОТ потрапить у потрібне місце, це означає, що також легше бути СУХИМ.
Джонатан Леффлер,


Можливий дублікат перехресного веб-сайту: superuser.com/questions/47821/vim-ignores-aliases
Ciro Santilli 法轮功 冠状 病 六四 14 法轮功

Відповіді:


114

Bash не завантажує ваш .bashrc, якщо він не інтерактивний. Використовуйте

:set shellcmdflag=-ic

змусити :!оболонку Vim поводитись як ваш командний рядок.


6
відредагуйте файл .vimrc (vim ~ / .vimrc) і поставте його там у рядок (без :)
skeept

9
Це добре, але у мене виникають проблеми - якщо я ввімкнув інтерактивний режим (прапор i), тоді я зможу чудово виконувати свої команди псевдонімів оболонки, але як тільки команди будуть виконані, vim виходить, що небажано. Наприклад, я спробував зробити:! Ls with shellcmdflag = -ic: [4] + Зупинився vi ~ / .vimrc
ashgromnies

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'

Потім додайте це у.

let $BASH_ENV = "~/.bash_aliases"

Це рішення запропонував "Якоб". Дивіться посилання нижче для оригіналу. Я протестував це на Mac OS X 10.9, і він працював бездоганно!

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


7
Найкраще рішення на сьогоднішній день. Особисто я встановлюю $BASH_ENVvar у своєму .bashrc(перед будь-якою перевіркою в інтерактивному режимі), щоб я міг використовувати всі свої псевдоніми в додатках.
el.atomo

2
Це, мабуть, найкраще рішення на цій сторінці, оскільки обсяг змін буде обмежений до Vim. Можна навіть піти далі і let $BASH_ENV="~/.vim/vim_bash", і це звикне для всіх :!викликів у Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeej

Це не працює в оболонці за замовчуванням macOS 10.15.2, zsh, на жаль.
Бен Квіглі

8

Зверніть увагу, що залежно від того, як налаштовані ваші файли дот-файлів bash, ви можете скористатися параметром -l, а не параметром -i. Це запустить оболонку як оболонку входу.


4
dreftymac писав: "Щоб змусити це працювати для мене, потрібно було зробити параметр -lic, інакше vim повернув" команду не знайдено ""
dreftymac

8

Я знаю, що це може бути старе запитання, проте жодна з наведених відповідей не спрацювала для мене, як хотілося. Тож для тих, хто прийшов сюди від гуглінгу та для користувачів (о-моє) 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"


Це здається найкращим рішенням, але воно для мене не працює. У ньому все ще сказано, що команду не знайдено
still_dreaming_1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.