Как сделать функцию вызова vim в .bashrc?

Среда: debian9 + vim7.4.

   cat .bashrc
   add(){
        echo $(expr $1 + $2)
    }

Теперь отредактируйте файл в vim

add 1 5 

Запустите его в командном режиме :w !bash, произойдет ошибка.

bash: line 1: add: command not found    
shell returned 127

1.add set shellcmdflag=-ic в обоих файлах /etc/vim/vimrc и .bashrc и .vimrc.
2.reboot
3.vim test.sh
войти в командный режим
: verbose set shellcmdflag

  shellcmdflag=-ic
        Last set from ~/.vimrc

4.Введите две строки в test.sh

ls
add  5  6

:w !bash     
a1.sh       test.py    
bash: line 2: add: command not found    
shell returned 127    

Как сделать обе две строки выполнены? введите описание изображения здесь
введите описание изображения здесь

:execute '! source ~/.bashrc; source '.expand('%:p') может выполнять обе команды: ls и add.

После перезагрузки,
Функция 1.add не может быть вызвана из sh test.sh?

sh test.sh
test.sh   #it means that ls command executed
test.sh: 2: test.sh: add: not found  #it means that add function can't be called from  /etc/vim/vimrc or .bashrc  or .vimrc.

Функция 2.add не может быть вызвана из vim !bash %?

введите описание изображения здесь

test.sh    #it means that ls command executed
test.sh: line 2: add: command not found  #it means that add function can't be called from  /etc/vim/vimrc or .bashrc  or .vimrc.

[4]+  Stopped                 vim test.sh

Ответ 1

Чтобы добавить строку export -f add в файл .bashrc.

   add(){
        echo $(expr $1 + $2)
    }
    export -f add

Теперь source .bashrc, каждый метод может вызвать функцию add из .bashrc правильно.

Ответ 2

Проблема заключается в том, что Vim по умолчанию вызывает неинтерактивную оболочку, а .bashrc (где вы определили функцию add) читается только для интерактивных оболочек.

Вы можете проинструктировать Vim использовать интерактивную оболочку:

:set shellcmdflag=-ic

Это может сделать внешние вызовы команд медленнее (из-за накладных расходов при оценке инициализации Bash).

В качестве альтернативы вы можете определить функцию где-то еще, поэтому она всегда доступна (но там нет простого места, см. раздел man bash, esp. the INVOCATION). Или превратите функцию в отдельный script, доступный из вашего PATH (например, ~/bin/add).

Ответ 3

Проблема заключается в том, что ваша функция ограничена интерактивной оболочкой для ее выполнения. Вам нужно сделать это

:!bash -ic "add 1 2"

Ответ 4

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

:execute '! source ~/.bashrc; source '.expand('%:p')

Я просто рушаю bashrc перед вызовом команды. Одним из возможных объяснений вашей проблемы является то, что вы находитесь на mac. Насколько я знаю, OSX не используют bashrc, они действительно используют bash_profile.

Ответ 5

Как выполнить обе две строки?

 ls
 add 5 6    

Это также работает (с shellcmdflag=-ic или shellcmdflag=-c):

:w !bash -i

При таком подходе нет необходимости включать export -f add в .bashrc.

Почему добавить функцию нельзя из vim с помощью !bash %?

Предполагая, что у вас есть флаги shellcmdflag=-c, вы можете сделать:

:!bash -i ./%

что очень похоже на ответ exe.