环境: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 {/ 1}} / etc / vim / vimrc和.bashrc以及.vimrc。
2.reboot
3.vim test.sh
进入命令模式
:verbose set shellcmdflag
set shellcmdflag=-ic
4.在test.sh中输入两行
shellcmdflag=-ic
Last set from ~/.vimrc
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
。
重新启动后,
1.add函数无法从add
调用?
sh test.sh
2.add函数无法从vim 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.
调用?
!bash %
答案 0 :(得分:10)
问题是Vim默认调用非交互式 shell,而.bashrc
(你定义了add
函数的地方)仅用于交互式shell
您可以指示Vim使用交互式shell:
:set shellcmdflag=-ic
这可能会使外部命令调用速度变慢(由于评估Bash初始化的开销)。
或者,您可以在其他地方定义该功能,因此它始终可用(但这样的地方并不容易;请参阅man bash
,尤其是INVOCATION
部分)。或者将该函数转换为可从PATH访问的单独脚本(例如~/bin/add
)。
答案 1 :(得分:4)
问题是你的功能仅限于交互式shell来执行它你必须这样做
:!bash -ic "add 1 2"
答案 2 :(得分:3)
在.bashrc文件中添加行export -f add
。
add(){
echo $(expr $1 + $2)
}
export -f add
现在source .bashrc
,每个方法都可以正确调用.bashrc中的add函数。
答案 3 :(得分:2)
我想这应该为你解决。它更像是一种解决方法而不是对你问题的解释,但它完成了工作
:execute '! source ~/.bashrc; source '.expand('%:p')
我只是在调用命令之前手动获取bashrc。 对您的问题的一个可能的解释是,如果你在Mac上。据我所知,OSX不会提供源代码bashrc,但他们确实采用了bash_profile。
答案 4 :(得分:1)
如何让两条线都被执行?
ls
add 5 6
这也适用(使用shellcmdflag=-ic
或shellcmdflag=-c
):
:w !bash -i
使用此方法,无需在export -f add
中包含.bashrc
。
为什么无法使用
!bash %
从vim调用添加函数?
假设您有标记shellcmdflag=-c
,您可以这样做:
:!bash -i ./%
这与exe的答案非常相似。