可能重复:
Commands executed from vim are not recognizing bash command aliases
我的〜/ .bashrc 文件中有以下功能(在我的Ubunut框中)
# convert tex to pdf, no bib
function t2p {
latex $1 && latex $1 && dvips $1 -o $1.ps && ps2pdf $1.ps && rm -f $1.dvi }
# convert tex to pdf, with bib
function tb2p {
latex $1 && bibtex $1 && latex $1 && latex $1 && dvips $1 -o $1.ps && ps2pdf $1.ps && rm -f $1.dvi }
例如,要将tex文件 f.tex 转换为pdf文件并按正确的顺序bibtex,我调用 tb2p f 。如果我在Bash终端,这非常有效。但是,要从Vim内部进入Bash提示符,我实际上必须首先执行命令:sh 。
为了简化上述步骤,我尝试通过:!t2p f 在Vim中执行 t2p 和 tb2p 功能。然后Vim告诉我它找不到函数 t2p 。我做了一些谷歌搜索,并读到我应该将这些函数放入文件 /etc/bash.bashrc ,以使它们对Vim可见。不幸的是,这在我的情况下不起作用。 Vim仍然不知道这个功能。
在一天结束时,我希望能够使用键盘快捷键从Vim中调用我的功能。因此,我的问题如下:
非常感谢你。
答案 0 :(得分:4)
尝试在Vim中使用:!bash -c t2p
。如果您的别名仅限于交互式shell,则还要添加-i
标记。
答案 1 :(得分:1)
尝试将set shell=bash\ --login
添加到.vimrc。
要转换当前文件,请键入:!tb2p %
,执行脚本时,Vim会为您展开%
。
一旦它正常工作,您可以添加映射以使整个过程更快:
nnoremap <F12> :!tb2p %<CR>
答案 2 :(得分:1)
Vim
使用bash
参数运行-c
命令,这使得shell非交互式和非登录,并绕过读取启动文件。
您可以使用环境变量覆盖它。
来自 man bash :
When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV
in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to
read and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
或者,可以要求vim本身将命令shell作为登录shell运行。从 vim :help shell
我们得到以下内容:
On Unix the command normally runs in a non-interactive
shell. If you want an interactive shell to be used
(to use aliases) set 'shellcmdflag' to "-ic".
For Win32 also see |:!start|.
答案 3 :(得分:0)
您始终可以在单独的文件中定义功能,并将该文件放在文件夹中 在您的PATH环境变量中。 在我的情况下,我将使用的个人功能转到〜/ bin
在你的情况下为t2p:
在〜/ bin中创建一个文件t2p,内容为:
#!/bin/bash
# convert tex to pdf, no bib
latex $1 && latex $1 && dvips $1 -o $1.ps && ps2pdf $1.ps && rm -f $1.dvi
然后使文件可执行:
> chmod +x t2p
确保〜/ bin在您的路径中,将以下内容放在〜/ .bashrc中:
export PATH=${HOME}/bin:${PATH}