發表於 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 根...