2014-03-26 48 views
2

我有一種類型的數據文件(如果您感興趣的話可以是ENDF),我想創建一個自定義的ViM摺疊文件。摺疊將取決於(由其定義)文件的列66-80的內容。如何在ViM中摺疊數據文件?

列的文件(S)的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

第二個摺疊級別是列73-76具有相同編號的位置。在上面的例子中,這些數字是12,但可以有任何數字 - 最多三位數字。

這是我第一次嘗試腳本。

" 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的結果。

不幸的是,這是行不通的。找不到褶皺。請指教。

+0

如果這應該是列66-80,爲什麼我算28分列?我認爲你需要知道的一切都在':help fold-expr'下描述。 – benjifisher

+0

@benjifisher我更新了我的問題。我做了一個嘗試,但我仍然不太對。 – jlconlin

+0

我想你想要'strpart(line,71,2)'和'strpart(line,73,4)'。試試':echo ENDFFolds(1)',':echo ENDFFolds(2)':你會得到什麼(包括你的調試行)?不要依賴全局變量,可以顯式檢查前一行。 – benjifisher

回答

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