从VIM运行终端命令?

从VIM运行终端命令?

问题描述:

我想编写一个函数,我可以添加到我的.vimrc文件中,该文件将调用终端命令,然后将其绑定到<leader>u从VIM运行终端命令?

我似乎无法让它工作寿。我相信我可以使用system()函数,但只有很少的文档可用,我似乎无法使它工作。

有问题的终端命令是'git push origin master'。

我知道有插件可用于git,但我不寻找任何这些,只是一个简单的函数来绑定一个终端命令到一个组合键。

function gitPush() 
system("git push origin master") 
endfunction 
:nmap <leader>u :call gitPush() 

我知道这是waaay out,但vim似乎并不想让文档非常可用。

+2

你知道':help',对吧? ':help system()'显示'system()'函数的文档。 ':help shell'为你提供'shell'命令的文档,在它下面你会看到'!'命令的文档(你可能想要的)。 – 2010-12-19 23:29:59

+2

在相关说明中,如果您希望使用shell命令的目的是与git进行交互,那么使用git相关的Vim插件(比如'fugitive'或VCSCommand)会更好。以下是逃犯页面的链接:http://www.vim.org/scripts/script.php?script_id=2975 – 2010-12-19 23:58:14

function GitPush() 
    !git push origin master 
endfunction 

是在子shell运行命令的方式。

编辑:用户定义的函数必须以大写字母开头太;)

为什么使用call打电话给你自己的功能,而没有使用它内置的?它是以下三个错误之一:@Richo提到的其他错误:用户定义的函数必须以大写或b:,w:,t:(请注意,这些都不是本地函数),g:,s:(仅在脚本中,并且您将必须在映射中替换s:<SID>),即使\w:(例如,function _:foo()工作)或与{filename_without_extension}#(如果文件名匹配\w+.vim)。如果是匿名功能:

let dict={} 
function dict["foo"]() 
endfunction 
function dict.bar() 
endfunction 

它也不需要以大写开头。所以正确的解决方案是:

function g:gitPush() 
    call system("git push origin master") 
endfunction 
nnoremap <leader>u :call g:gitPush()<CR> 

第三个错误是省略<CR>。我将nmap更改为nnoremap,因为在可能的情况下可以使用nore。在命令开始时有:不会造成伤害,并且不是错误,但我只是不写它:在正常模式映射中需要启动命令模式,但不在脚本内部。