El mi volas komprementi parentezojn (rondajn krampojn) kiam programi per Vim, la vim-skripton mi mem kod-skribis.
La vim-skripto faris Vim komprementi malferman krampon kaj ferman krampon per ^G^G.
inoremap <C-g><C-g> <C-r>=CompleteParent()<CR>
function! CompleteParent() let str = getline('.') let pos = col('.') if pos == 1 || pos == col('$') || str[(pos - 1) :] !~ ')' \ || (str[0: (pos - 2)] !~ '(' && str[-1:] == ')') call setline('.', str .')') else let i = 0 let k = 0 while i < 100 let k = match(str[0: (pos - 2)], '(', k + 1) if k == -1 break endif let i += 1 endwhile let list = split(str[(pos - 1) :], ')', 1) let list[-(i + 2)] .= ')' call setline('.', str[0: (pos - 2)] .join(l:list, ')')) endif return "(\<left>" endfunction
Aldono : pri reiranta valoro de col('.')
Se la fokuso eniras de enŝova reĝimo en komandan linion per <C-o>:, la funkcio col('.') reirigos saman valoron kun col('$'), kiam ambaŭ pozicio de la kursoro estas "fino de linio" aŭ "antaŭ fino de linio". (Ĉar kiam plenumi la komandon, la fokuso eliris de enŝova reĝimo.)
Se utiligi reirantan valoron de col('.') en enŝova reĝimo, vi devas rekte voki la funkcion per <C-r>=.
Se vi ne volas enŝovi la reiranta valoron, skribu :return ""
Ne estas en ceteraj reĝimoj funkcio distingi ĉu la pozicio de la kursoro estas fino de linio.