用vim中的bash执行脚本


2

我试图让vim执行我正在用键映射(例如ctrl+)编辑的脚本x,所以我在vimrc

:map <C-x> :!exec_file %<CR>

要将文件名传递给我编写的脚本,该脚本可解析扩展名并调用适当的解释器,到目前为止,此方法效果很好。

但是,我想知道是否可以bash直接使用脚本名称来调用它并执行它,因为我编辑的大多数脚本都有一个shebang行,所以我尝试使用此映射:

:map <C-x> :!bash %<CR>

但这不起作用,是否可以通过将其名称传递给bash来执行脚本?


尽管这种方式不同,但IIRC bash仍将尝试执行Python脚本,因此我不确定这是否有意义。如果您的脚本文件是可执行文件,那还:!%不够吗?
丹尼尔·贝克

@DanielBeck是的,这就是正在发生的一切,可以解决吗?也不是所有脚本都可执行,我也不想对其进行修改...
mux

1
尝试执行脚本文件时,请执行OS相同的操作:解析shebang行以确定解释器,然后调用它。本质上是您的exec_file工作,但不必依赖扩展。可能只有当没有shebang行时才将其用作备用。FWIW,shebang行通常仅在您希望使脚本可执行时才有意义,因为调用解释器将始终使用文件参数。
丹尼尔·贝克

您的bash映射在这里起作用。我用下面的映射来调用家当,假设脚本是可执行的:map <f4> :!%:p<cr>:p将扩展到脚本的完整路径。
雷神(Thor)

@Thor是的,但并不是我编辑的所有脚本都是可执行的,有时我打开vim并编写脚本并想在chmod'ing之前执行,或者我打开了不可执行的脚本,但是我想我现在明白为什么bash不能执行执行脚本。
mux

Answers:


7

Vim已经使用外壳程序(请参阅参考资料:set shell?)执行外部命令。使用shebang行的脚本应该可以正常工作。执行当前缓冲区的规范方法是

:!./%

(正在./处理当前目录不属于该目录PATH。这假定脚本已经是可执行的(:!chmod +x %可能在映射/ ftplugin中完成。)

您可以使用just重新执行:!!。另外,还有一些更出色的解​​决方案可以在外部解释器中执行(部分,未保存等)缓冲区内容;检查vim.org的插件部分。


看来,如果我希望此脚本能够工作,就必须对chmod进行脚本操作,谢谢。
mux

是的,无论如何您以后都可能需要chmod,所以为什么在开始编写时不从编辑器执行此操作。
Ingo Karkat

无论如何,我都想节省额外的步骤,我想我会坚持使用脚本方式,也许可以按照Daniel的建议编辑它以读取shebang行,这使我可以执行不可执行或没有的脚本完全是shebang。
mux

0

似乎我必须chmod

不,你没有。如果您的可执行文件具有以下形式

#! /bin/bash
ls -l

映射

:map <C-x> :! sh ./% <CR>

即使该文件不是可执行文件,它也会执行您想要的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.