2010-12-19 192 views
2

我想編寫一個函數,我可以添加到我的.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

回答

7
function GitPush() 
    !git push origin master 
endfunction 

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

編輯:用戶定義的函數必須以大寫字母開頭太;)

1

爲什麼使用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。在命令開始時有:不會造成傷害,並且不是錯誤,但我只是不寫它:在正常模式映射中需要啓動命令模式,但不在腳本內部。