【问题标题】:How to fold in ViM for data files?如何在 ViM 中折叠数据文件?
【发布时间】:2014-05-05 07:52:08
【问题描述】:

我有一种数据文件(ENDF,如果您感兴趣的话),我想为其创建一个自定义的 ViM 折叠文件。折叠将取决于文件第 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

第二个折叠级别是第 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 的结果。

很遗憾,这不起作用。没有发现褶皱。请指教。

【问题讨论】:

  • 如果这应该是 66-80 列,我为什么要计算 28 列?我认为您需要知道的所有内容都在:help fold-expr 下进行了描述。
  • @benjifisher 我已经更新了我的问题。我已经尝试过了,但还是不太对。
  • 我想你想要strpart(line, 71, 2)strpart(line, 73, 4)。试试:echo ENDFFolds(1):echo ENDFFolds(2):你得到了什么(包括你的调试线)?与其依赖全局变量,不如显式检查前一行。

标签: vim folding code-folding


【解决方案1】:

经过艰苦的试验和错误,我想出了这个解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2013-09-10
    • 2011-06-01
    • 2011-07-01
    • 2012-08-11
    相关资源
    最近更新 更多