2017-07-29 91 views
3

我想在vim中設置一些自定義自動完成宏。我想這樣的事情(|代表光標位置):在vim中創建替換宏的最佳方法

it<TAB>| 

立即變爲:

it("|", function() { 
}); 

這可能使用直VIM,或者我需要一個插件嗎?如果是這樣,那裏有一個首選插件嗎?

+2

我會去ultisnips – dlmeetei

回答

3

使用的縮寫你可以寫這樣的事情:

inorea it it("", function() {<cr>});<c-o>k<c-o>f" 

<c-o>k<c-o>f"在最後的目的是重新定位光標雙引號內,但它可能無法正常工作的所有時間。


使用映射,你可以試試這個:

ino <expr> <tab> <sid>expand_last_word() 

let s:your_expansions = { 
         \ 'it': '\<c-w>it(\"\", function() {\<cr>});\<c-o>k\<right>', 
         \ } 

fu! s:expand_last_word() abort 
    let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c') 
    return has_key(s:your_expansions, last_word) 
       \ ? eval('"'.s:your_expansions[last_word].'"') 
       \ : "\<tab>" 
endfu 

你將不得不添加的字典裏面s:your_expansions您的縮寫和他們的擴張。


使用:read命令,你可以定義較大的代碼片段,並在幾個文件分割:

ino <expr> <tab> <sid>expand_last_word() 

fu! s:expand_last_word() abort 
    let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c') 
    if last_word ==# 'it' 
     return "\<c-w>\<c-o>:r /path/to/some_file\<cr>\<c-o>f\"\<right>" 
    endif 
    return "\<tab>" 
endfu 

這裏/path/to/some_file應該包含您的代碼片段:

it("", function() { 
}); 

他們是非常簡單的解決方案,如果你想要更強大的東西,你公關可靠地需要一個片段插件。其中之一是UltiSnips,它要求您的Vim版本已經使用Python支持編譯(:echo has('python'):echo has('python3')返回1)。

隨着UltiSnips,你會寫你的網頁摘要:包含的關鍵字snippetendsnippet之間

snippet it "your description" b 
it("$0", function() { 
}); 
endsnippet 

這裏的定義。在第一行中,您可以在雙引號內的字符串中描述片段的用途。如果您使用相同的選項卡觸發器定義了多個片段,並且存在不明確性,它將在列表中由UltiSnips顯示。

結尾b是一個選項,用於防止標籤觸發器it在行的開頭以外的任何位置被擴展。

$0是一個tabstop,它代表您希望光標位置,一旦代碼片段已完全展開。

github上的自述頁面提供了一個快速入門,以及一些視頻鏈接。

如果你想看看其他人寫的片段,你可以安裝vim-snippets

還有其他的片段管理者,但我不太瞭解他們的描述他們的片段的語法。如果你想有一個比較,這裏的one,這裏是其中的一些環節:

+0

非常徹底,謝謝! –

2

這裏是一個abbreviation,你可以用於您的特定示例

:inoreabbrev it it("", function() {<cr>});<esc>kf"a 

打字,然後CTRL +]插入模式it將呈現

it("|", function() { 
}); 

,並讓你在插入模式。

但我肯定會去ultisnips,並有一個screencast在同一頁上創建片段。這就是爲什麼我在這裏省略片段,因爲你可以自己做。

相關問題