vim括號自動補全

2021-06-01 21:05:32 字數 3901 閱讀 7891

發表於 2023年05月22日 | 分類:

vim |

括號是程式設計中最常接觸的特殊符,因其往往成對出現,成對刪除的特性,加上vim強大的自定義功能,實現括號的自動完成,成對刪除等各種功能,大大減少了程式設計手指負擔。本文介紹如何對小括號進行設計達到上述功能,加深對vim指令碼的理解。1. 括號自動完成 功能描述:當輸入(時自動生成(),並使游標指向),系統保持在insert mode

分析:當鍵入(時,只需模擬輸入()並使游標回退乙個字元即可

**1:

inoremap ( ()

2. 重複鍵入括號自動換行 功能描述:在目標一的基礎上實現若游標前一字元為(,則自動換行並縮排,而非插入括號

分析:要達到該效果,必需通過命令實現,呼叫命令有,, 三種途徑

對於eol與普通字元的處理方式不一樣,所以這裡採取esc進入normal模式,離開insert模式恆回退乙個字元

**2:功能一的命令版

function! parenopen()

normal! a()

startinsert

endfunction

inoremap ( :call parenopen()

分析 2:要獲得當前游標下的字元,vim似乎沒有直接提供命令。但可以通過yl,或者getline('.')[col('.')-1]取得

** 3:實現功能2

function! parenopen()

let line = getline('.')

let prev_char = line[col('.')-1]

if prev_char == '('

" 新增額外的字元;,以避免vim自動刪除空白行

execute "normal! a\\==o;"

return

end" 同樣需要新增;

execute "normal! a(;)\i"

"當縮排被刪除時,重新縮排當前行

if line == ''

normal! ==$h

endendfunction

inoremap ( :call parenopen()"_cl

**4

function! parenclose()

let line = getline('.')

let char = line[col('.')]

if char == ')'

execute "normal! l"

else

normal! a)

endendfunction

inoremap ) :call parenclose()a

4. 配對刪除括號 功能描述:當刪除(時,若()之間為空時,則連)一起刪除

分析:目前只能想到map 一條途徑,通過正則判斷括號間是否為空

**5

function! parendelete()

let line = getline('.')

let prev_char = line[col('.')-1]

if prev_char == '(' && match(line,'^\s*)',col('.')) != -1

" 使用 cf) 代替df)使游標離開normal時左移一格用以a

normal! cf)

else

execute "normal! a\"

endendfunction

inoremap :call parendelete()a

function! parenopen()

let line = getline('.')

let prev_char = line[col('.')-1]

if prev_char == '('

" 新增額外的字元;,以避免vim自動刪除空白行

execute "normal! a\\==o;"

return

end" 同樣需要新增;

execute "normal! a(;)\i"

"當縮排被刪除時,重新縮排當前行

if line == ''

normal! ==$h

endendfunction

function! parenclose()

let line = getline('.')

let current_char = line[col('.')]

if current_char == ')'

execute "normal! l"

else

normal! a)

endendfunction

function! parendelete()

let line = getline('.')

let prev_char = line[col('.')-1]

if prev_char == '(' && match(line,'^\s*)',col('.')) != -1

" 使用 cf) 代替df)使游標離開normal時左移一格用以a

normal! cf)

else

execute "normal! a\"

endendfunction

" 函式parenopen執行後游標指向;,使用"_cl清除並進入insert模式

inoremap ( :call parenopen()"_cl

inoremap ) :call parenclose()a

inoremap :call parendelete()a

呼叫時會導致狀態列,-- 插入 -- 閃爍,修正**為使用代替

通過與=表示式暫存器實現括號的自動完成功能

指令碼正好可以不進入normal模式,如果函式中有normal ***,那麼不得不使用作為入口了

function! parenopen()

let line = getline('.')

let prev_char = line[col('.')-2]

if prev_char == '('

return "\\==o"

endreturn "()\"

endfunction

function! parenclose()

let line = getline('.')

let current_char = line[col('.')-1]

if current_char == ')'

return "\"

endreturn ')'

endfunction

function! parendelete()

let line = getline('.')

let prev_char = line[col('.')-2]

if prev_char == '(' && match(line,'^\s*)',col('.')-1) != -1

return "\\cf)"

endreturn "\"

endfunction

inoremap ( =parenopen()inoremap ) =parenclose()inoremap =parendelete()

auto pairs是根據此文進一步完善的外掛程式。支援{}() ' "的括號自動完成與刪除。

詳見:2011-06-11更新

-------------------

inoremap x =foo()可以用inoremap x代替

即上文可以改進為

inoremap ( parenopen()

inoremap ) parenclose()

inoremap parendelete()

在 Vim 中實現括號自動補全

流行的 ide 的編輯器,諸如 eclipse,都提供了括號自動補全的功能,相當的方便。可惜 vim 預設情況下並沒有提供這樣的功能,那就只有自己來寫了。將下面的 加入到 vimrc 中,重啟 vim,即可 inoremap i inoremap closepair inoremap i inore...

vim 自動補全

開啟終端 alt ctrl t 輸入 vim 這樣就開啟了該編輯器。要檢視自動補全,可以輸入 help compl generic help complete help ins completion任意乙個均可。ctrl n 向下補全 ctrl p 向上補全 其它補全方式 整行補全 ctrl x c...

vim 自動補全

一 vim自帶的補全功能 ctrl x ctrl o全能補全 omnicomplete ctrl x ctrl l 整行補全 ctrl x ctrl n 根據當前檔案裡關鍵字補全 ctrl x ctrl k 根據字典補全 ctrl x ctrl t 根據同義詞字典補全 ctrl x ctrl i 根...