2013-08-05 134 views
10

我最IDE和現代的文本編輯器(崇高的文本3)光標在插入新行的HTML標籤之間(又名「擴展」標籤),之後正確縮進:Vim的光標位置

之前:

<div>|</div> 

按CR後:

<div> 
    | 
</div> 

但在Vim的,這就是我得到:

<div> 
|</div> 

如何在Vim中獲得與大多數其他編輯器一樣的行爲(請參閱上文)?

+0

試試這個:https://github.com/othree/xml.vim – Kent

+0

我無法在這裏回答這個問題,因爲某些原因(不斷收到錯誤提交一個時) 。我在[這個要點](https://gist.github.com/rson/7bd877744ac59bee5491)上粘貼了我的可能答案。 –

+0

@RandyMorris我沒有問題發佈它作爲答案。嘗試再次發佈? – FDinoff

回答

7

只有正確行爲<CR>在插入模式下是斷開光標處的行。

你想要的是一個增強行爲,你需要添加一些東西到你的配置來得到它:一個映射,一個簡短的功能或完整的插件。

當我開始使用vim時,這種行爲實際上是我添加到我的vimrc中的第一件事情。我已經改變了很多次,在過去,但該映射已經有一段相當穩定:

inoremap <leader><CR> <CR><C-o>==<C-o>O 

我用<leader><CR>保持的<CR>正常行爲。


這裏是一個小功能,似乎你想要做什麼:

function! Expander() 
    let line = getline(".") 
    let col = col(".") 
    let first = line[col-2] 
    let second = line[col-1] 
    let third = line[col] 

    if first ==# ">" 
    if second ==# "<" && third ==# "/" 
     return "\<CR>\<C-o>==\<C-o>O" 

    else 
     return "\<CR>" 

    endif 

    else 
    return "\<CR>" 

    endif 

endfunction 

inoremap <expr> <CR> Expander() 
+0

非常感謝 - 您的解決方案有效,我會接受它作爲答案。我寧願喜歡看到像Sublime Text或Textmate中那樣的更自動的行爲。我可能會調查學習vimscript並在下面擴展Randy Morris解決方案。 –

+0

FWIW,我使用SnipMate和Sparkup編寫HTML。你應該考慮這些插件:它們將幫助你節省**很多鍵入內容。 – romainl

+0

@DanielLang,請參閱我的編輯。 – romainl

2

@RandyMorris和@romainl爲您的確切問題發佈了很好的解決方案。

如果您自己輸入這些標籤,您可能會感興趣的還有其他一些可能:有用於HTML/XML編輯的ragtag.vim插件。

隨着ragtag.vim鍵入此創建你的 「前」 的情況(在插入模式):

div<C-X><Space> 

要創建自己的情況 「後」,而是鍵入:

div<C-X><Enter> 

因此,如果您事先知道您要「展開」標籤,只需鍵入元素名稱和組合號碼即可CtrlX後面跟着輸入就夠了。

還有其他更高級的插件可以在編輯HTML時保存按鍵,例如ZenCoding.vimSparkup

+0

謝謝!不幸的是,這並不適用於我,雖然我已經安裝了ragtag插件,並使用它插入ruby標籤(所以我知道它的工作原理)。 –

3

這個小片段將重新映射在插入模式輸入測試光標是否爲><之間並據此採取相應行動。根據您的縮進設置,\<Tab>可能需要刪除。

它將與可能也可以映射輸入鍵,要知道,有可能是更多的工作,如果你想的兼容性做其他插件發揮好。

function EnterOrIndentTag() 
    let line = getline(".") 
    let col = getpos(".")[2] 
    let before = line[col-2] 
    let after = line[col-1] 

    if before == ">" && after == "<" 
    return "\<Enter>\<C-o>O\<Tab>" 
    endif 
    return "\<Enter>" 
endfunction 

inoremap <expr> <Enter> EnterOrIndentTag() 

我只測試了簡單的情況下(該行的開頭,該行的結束,內和外><),有可能是邊緣情況,這將不會趕上。

+0

謝謝蘭迪。您的解決方案非常好,但實際上我需要一些與matchIt等其他插件配合使用的內容。你的代碼讓我想到編寫這樣一個函數,謝謝! –