我使用vim:!外部命令函数一直都是,通常提供%作为shell命令的参数。例如:
:!psql -f %
我在我的.bashrc中也有很多bash shell函数。例如:
psql-h1 ()
{
/usr/bin/psql -hh1 -d mydb "$@"
}
这些bash功能无法通过以下方式获得:在vim里面。有没有办法让它们可用?
答案 0 :(得分:3)
导出您的功能。那就是:
psql-h1() { /usr/bin/psql -hh1 -d mydb "$@"; }
export -f psql-h1 ### <-- THIS RIGHT HERE
这将使它们可以作为子进程的任何bash运行副本使用,即使它是非交互式shell,也不会读取.bashrc
。< / p>
答案 1 :(得分:3)
导出你的函数的替代方法(可能无法访问Vim,其间是非Bash shell;请参阅here这样的情况),你可以指示Vim启动交互式 shell,以便您阅读.bashrc
。只需通过Vim -i
将:help 'shellcmdflag'
标记传递给Bash。
:set shcf=-ic
答案 2 :(得分:0)
此答案假设您的vim
实际上并未使用bash
来调用远程命令 - 可以通过在:!echo $0
中运行vim
来测试此问题。
专门针对vim
,添加:
set shell=/bin/bash
到.vimrc
。
一般来说,在尝试让其他程序调用我喜欢的shell时,我发现有两种策略有时会起作用:
export SHELL=/bin/bash
例如。 .profile
文件或:
ln -fsn /bin/bash /bin/sh
更新sh
符号链接以指向bash
。
在许多系统(当然是Ubuntu)上,/bin/sh
是sh
- 兼容shell(例如bash
)的符号链接,而不是sh
shell本身。鉴于这一事实,一些程序(我在GHC中看到过这种行为)似乎调用/bin/sh
,因此改变指向的位置将导致程序使用bash
。
答案 3 :(得分:0)
接受的答案对我不起作用。我将按照其他地方的建议设置shcf:
:set shcf=-ic
但另一个解决方案是
!source ~/.bashrc && psql ...
不幸的是,没有解决方案允许自动完成我正在创建的命令的正常工作。 (建议的auto_completions用于当前目录中的文件名,而不是我在.bashrc
中指定的文件名。complete -F _generate_foo_completions foo