Monologo indekso » komputilo » tie ĉi
Komprementi parentezojn
Vendredo 2011.10.14 21:35

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.

« reen
Japane indekso
inserted by FC2 system