2012-01-24 83 views
3

映射命令時,我經常會創建一個臨時映射做一個特定的文件的東西。文件完成在VIM

典型的例子是這樣的:

:map <leader>f :w<cr>:! bundle exec cucumber features/account/sign_in.feature:41<cr> 

我想要的文件features/account/sign_in.feature從當前目錄下自動完成。

這應該只是保存當前的文件,並掏出上<leader>f運行命令。

它允許我很容易地工作的一段代碼沒有考慮跳到到一個特定的文件並運行它。

問題是創建這樣一個綁定很麻煩,並且容易出錯

VIM不允許映射當完成文件名。同樣使用%是完全不同的(我想映射到文件靜態)。

是什麼做的更好的辦法?

謝謝。

+1

抱歉,目前尚不清楚,在所有的,你要完成什麼樣的文件名。 ':41'來自哪裏? – sehe

+0

我已更新該問題。我想自動完成'features/account/sign_in.feature'。 41沒關係(它是文件中的行號)。 –

+0

而你希望'完成'它(_completion_表示你有一部分,其餘部分必須自動__;文件名完成通常意味着查看可能的文件名並選擇現有的可訪問文件的名稱) – sehe

回答

3

Allthough我覺得你的問題應該進行更加清晰,下面是一些提示:

:nnoremap <leader>f :w<bar>!exec "bundle exec cucumber " . expand('%') . ":" . line('.')<CR> 

將正確保存,並在命令插入當前文件名/行號

而且,你會想了解的autowrite選項:

:se autowrite 

最後,我通常採用makeprg爲這種目的:

:let &makeprg="bundle exec cucumber %" 

這與QuickFix命令(:copen:colder:cnewer)和工作的好處(作出了正確makef)也跳到錯誤行

+0

有關'autowrite'的提示。謝謝。你可以擴展一下關於如何在這裏使用'makeprg'嗎? –

+0

@DmytriiNagirniak:是的,我已經展示瞭如何設置它。我建議你通過執行':make | copen'(和':help quickfix'來獲得所有quickfix命令的完整文檔)來嘗試它。 – sehe

+0

爲什麼只要按' f'就需要鍵入':make | copen'更快?我只想要一個命令的快捷方式(通常不同,它不是編譯器或類似的)。該命令的映射只是容易出錯。 –

1

我不知道答案,但如果我是你,我會使用cabbr:

:cabbr fas features/account/sign_in.features: 

或類似的東西。它不是自動完成的,但它肯定會減少您需要的按鍵次數。

另一種替代方法是創建一個從用戶命令映射的函數,該函數接受創建映射的參數。如果我記得正確,可以自定義用戶命令完成,以便可以工作。

更新:是的,你可以自定義用戶命令。見:help user-command

像這樣的東西應該讓你開始:

command -complete=file_in_path -nargs=1 Map call CreateMap(expand('<args>')) 

function CreateMap(filename) 
    exec 'map <leader>f :w<cr>:! bundle exec cucumber ' . a:filename . ':41<cr>' 
endfun 

一旦你這樣做,保證你「路徑」設置包括當前目錄,或者如果你想讓它遞歸搜索「」 「./**」。然後你可以使用Map用戶命令是這樣的:

:Map fea<tab>ac<tab>