如何在.bashrc中创建vim调用函数?

时间:2018-02-06 13:05:27

标签: bash function vim

环境: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

如何让两条线都被执行? enter image description here
enter image description here

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. 调用?

enter image description here

!bash %

5 个答案:

答案 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=-icshellcmdflag=-c):

:w !bash -i

使用此方法,无需在export -f add中包含.bashrc

  

为什么无法使用!bash %从vim调用添加函数?

假设您有标记shellcmdflag=-c,您可以这样做:

:!bash -i ./%

这与exe的答案非常相似。