2016-02-02 19 views
0

嗨,大家好,我只需要一個快速修復,如果你可以:使用Vim和我需要我的花括號自動關閉左括號鍵入。我有inoremap { {<CR>}<ESC>ko這工作正常。但是,當我不需要時,我需要禁用它。所以我在想一個簡單的if語句來尋找一個')',因爲前一個字符就足夠了。但是,我不知道我應該如何在這裏做到這一點。任何幫助?在.vimrc中結合條件邏輯與inoremap

回答

1

這可以通過調用自定義函數來完成。

預賽

  • :help getline()

    函數getline({lnum}行[{端}])

    沒有{end}結果是一個字符串,它是線{ lnum}從當前緩衝區中刪除。當{lnum}是一個不以數字開頭的字符串時,將調用line()將該字符串轉換爲一個數字。爲了得到線光標下:函數getline

  • :help col()( 「」):

    山口({expr}的)

    結果是一個數值,即字節索引{expr}給出的列位置。

所以,你可以將光標通過getline('.')[col('.') - 2]前右側獲得字符。

  • :help feedkeys()

    feedkeys({串} [{模式}])

    性狀{串}排隊等待處理,就像它們來自映射或進行鍵入的由用戶。默認情況下,字符串被添加到類型提前緩衝區的末尾,因此如果映射仍在執行,字符會緊跟其後。

    要在{字符串}中包含特殊鍵,請使用雙引號和「...」符號表達式引用。例如,feedkeys(「\ < CR>」)模擬按下Enter>鍵。但是,feedkeys('\ < CR>')推送5個字符。

    如果{mode}不存在,則會重新映射鍵。{模式}是字符串,它可以包含這些字符國旗:

    'm'  Remap keys. This is default. 
    'n'  Do not remap keys. 
    
  • :help i_CTRL-O:help i_CTRL-\_CTRL-O

    CTRL-O   execute one command, return to Insert mode i_CTRL-O 
    CTRL-\ CTRL-O like CTRL-O but don't move the cursor  i_CTRL-\_CTRL-O 
    

的作用

首先,ko可以減少到一個單一的命令O

function! s:InsertBrace() 
    let l:last_char = getline('.')[col('.') - 2] 
    if l:last_char ==# ')' 
    call feedkeys("{\<CR>}\<Esc>O", 'n') 
    else 
    call feedkeys('{', 'n') 
    endif 
endfunction 
inoremap { <C-\><C-O>:call <SID>InsertBrace()<CR> 

當我們按下{,我們稱之爲s:InsertBrace()。該函數檢查當前光標下的字符。如果是),那麼我們插入{<CR>}<Esc>O,注意逃生。否則,我們只需插入單個{。在exe命令,偉馳可以讓你保持所創建的自動縮進結束

inoremap { <c-o>:call InsertCurly()<cr> 

function! InsertCurly() 
    normal! gi{ 
    if search(')\s*\%#') 
     exe "normal! o}\<esc>ko \<bs>" 
    endif 
endf 

注意的空間和\<bs>

+0

感謝詳細的回答有很多在這裏有用的信息! – Rhurac

1

下應該這樣做。

也有很好的插件來自動關閉括號,但你必須看着它們來檢查它是否有條件。

1

這可能不是你正在尋找的。但是不要寫一個函數,因此不要製作複雜的vimrc。我用

逃生使用按Ctrl +v映射一個簡單但有點labourous方法,只要你不希望映射