2

カスタムの ViM 折りたたみファイルを作成したいタイプのデータ ファイル (興味がある場合は ENDF) があります。折り畳みは、ファイルの列 66 ~ 80 の内容に依存 ​​(定義) されます。

ファイルの列 66 ~ 80 は次のようになります。

-columns 1--65                                             -125 0  0    0
-columns 1--65                                             -125 3  1    1
-columns 1--65                                             -125 3  1    2
-columns 1--65                                             -125 3  1    3
                                                            ...
-columns 1--65                                             -125 3  1   35
-columns 1--65                                             -125 3  099999
-columns 1--65                                             -125 3  2    1
                                                            ...
-columns 1--65                                             -125 3  2   35
-columns 1--65                                             -125 3  099999
                                                            ...
-columns 1--65                                             -125 3  099999
-columns 1--65                                             -125 0  0    0
-columns 1--65                                             -125 4  2    1
                                                            ...
-columns 1--65                                             -125 4  2  195

最初のインデント レベルは、列 71 ~ 72 が同じ番号になるようにしたいと思います。上記の例では、これらの番号は3,4です。

2 番目の折り畳みレベルは、列 73 ~ 76 が同じ番号を持つ場所です。上記の例では、これらの数字は12ですが、最大 3 桁までの任意の数字を使用できます。

これがスクリプトでの私の最初の試みです。

" ENDF folding functions

setlocal foldmethod=expr
setlocal foldexpr=ENDFFolds(v:lnum)

let MF = '0'
let MT = '0'

" This function is executed 
function! ENDFFolds(lnum)
    " Get the current line
    let line = getline(v:lnum)

    let mf = strpart(line, 71, 72)
    echom mf

    " Check to see if we have moved into a new file (MF)
    if mf == MF

        " Check to see if we have moved into a new section (MT)
        let mt = strpart(line, 73, 75)
        if mt == MT
            return "="
        else
            MT = mt
            return ">2"
        endif

    else
        MF = mf
        return ">1"
    endif
endfunction

このスクリプトを に入れました~/.vim/ftplugin/endf/folding.vim。の結果が表示されるので、ファイルが見つかっていることがわかりますecho mf

残念ながら、これは機能しません。折り目は見当たりません。お知らせ下さい。

4

1 に答える 1

0

骨の折れる試行錯誤で、私はこの解決策を思いつきました:

setlocal foldmethod=expr
setlocal foldexpr=ENDFFolds()
setlocal foldtext=ENDFFoldText()

let g:current_line = ''
let g:current_mf = 0
let g:current_mt = 0

" This function is executed for every line to determine the fold level
function! ENDFFolds()
    " Get the current line
    let line = getline(v:lnum)

    let g:previous_mf = g:current_mf
    let g:current_mf = str2nr(strpart(line, 70, 2))

    let g:previous_mt = g:current_mt
    let g:current_mt = str2nr(strpart(line, 72, 3))

    if g:previous_mf == 0
        let g:current_mt = 0
        return '>1'
    else
        if g:previous_mt == 0
            return ">2"
        else
            return "="
        endif
    endif
endfunction

function! ENDFFoldText()
    let foldsize = (v:foldend-v:foldstart)

    let line = getline(v:foldstart)
    let MAT = strpart(line, 66, 4)
    let MF = strpart(line, 70, 2)
    let MT = strpart(line, 72, 3)

    return 'MAT='.MAT.' MF='.MF.' MT='.MT.' '.' ('.foldsize.' lines)'
endfunction
于 2014-03-27T16:42:43.103 に答える