VIM使用vimrc更改折叠标记以显示行和字数

VIM使用vimrc更改折叠标记以显示行和字数,vim,markdown,folding,Vim,Markdown,Folding,我在windows上使用GVIM来写科幻小说,我把章节折叠起来,这样我就可以把它们藏起来。折叠时,章节“线条”显示如下内容: ##1 – Spaceman Spoof Encounters the Watterson........ 115 lines [2.4%] +--+-- ##1 – Spaceman Spoof Encounters the Watterson........ l:115 w:1032 [4.4%] +--+-- 这是有用的,但只是一点点。有些行可能只是几个字,而另

我在windows上使用GVIM来写科幻小说,我把章节折叠起来,这样我就可以把它们藏起来。折叠时,章节“线条”显示如下内容:

##1 – Spaceman Spoof Encounters the Watterson........ 115 lines [2.4%] +--+--
##1 – Spaceman Spoof Encounters the Watterson........ l:115 w:1032 [4.4%] +--+--
这是有用的,但只是一点点。有些行可能只是几个字,而另一些行可能超过100字。我更喜欢这样的行计数和字数计数:

##1 – Spaceman Spoof Encounters the Watterson........ 115 lines [2.4%] +--+--
##1 – Spaceman Spoof Encounters the Watterson........ l:115 w:1032 [4.4%] +--+--
百分比是单词的百分比,而不是行的百分比。任何帮助都将不胜感激

这是我的
\u vimrc
的折叠部分:

function! MarkdownFolds()
    let thisline = getline(v:lnum)
    if match(thisline, '^##') >= 0
        return ">2"
    elseif match(thisline, '^#') >= 0
        return ">1"
    else
        return "="
    endif
endfunction

setlocal foldmethod=expr
setlocal foldexpr=MarkdownFolds()

function! MarkdownFoldText()
    "get first non-blank line
    let fs = v:foldstart
    while getline(fs) =~ '^\s*$' | let fs = nextnonblank(fs + 1)
    endwhile
    if fs > v:foldend
        let line = getline(v:foldstart)
    else
        let line = substitute(getline(fs), '\t', repeat(' ', &tabstop), 'g')
    endif

    let w = winwidth(0) - &foldcolumn - (&number ? 8 : 0)
    let foldSize = 1 + v:foldend - v:foldstart
    let foldWords = v:foldend,v:foldstart!wc -w
    let foldSizeStr = " " . foldSize . " lines "
    let foldWordsStr = " " . foldWords . " w "
    let foldLevelStr = repeat("+--", v:foldlevel)
    let lineCount = line("$")
    let foldPercentage = printf("[%.1f", (foldSize*1.0)/lineCount*100) . "%] "
    " let expansionString = "."
    let expansionString = repeat(".", w - strwidth(foldSizeStr.line.foldLevelStr.foldPercentage))
    return line . expansionString . foldSizeStr . foldPercentage . foldLevelStr
    " return line . expansionString . foldSizeStr . foldPercentage . foldWordsStr . foldLevelStr
    " return line . "......" . foldSizeStr . foldPercentage . foldLevelStr
endfunction

setlocal foldtext=MarkdownFoldText()
以下是一个解决方案:

function! MarkdownFoldText()
    "get first non-blank line
    let fs = v:foldstart
    while getline(fs) =~ '^\s*$' | let fs = nextnonblank(fs + 1)
    endwhile
    if fs > v:foldend
        let line = getline(v:foldstart)
    else
        let line = substitute(getline(fs), '\t', repeat(' ', &tabstop), 'g')
    endif

    let w = winwidth(0) - &foldcolumn - (&number ? 8 : 0)
    let foldSize = 1 + v:foldend - v:foldstart

    let i = 0
    let foldWords=0
    let wordCount=0
    while (i<line('$'))
      let lineWords = len(split(getline(i)))
      if (i<=v:foldend && i>= v:foldstart)
        let foldWords = foldWords + lineWords
      endif
      let wordCount += lineWords
      let i += 1
    endwhile

    let foldWordsStr = " " . foldWords . " w,"
    let foldSizeStr = foldWordsStr . foldSize . " lines "
    let foldLevelStr = repeat("+--", v:foldlevel)
    let foldPercentage = printf("[%.1f", (foldWords*1.0)/wordCount*100) . "%] "
    let expansionString = repeat(".", w - strwidth(foldSizeStr.line.foldLevelStr.foldPercentage))
    return line . expansionString . foldSizeStr . foldPercentage . foldLevelStr
endfunction
函数!MarkdownFoldText()
“获取第一个非空白行
设fs=v:foldstart
而getline(fs)=~'^\s*$'|让fs=nextnonblank(fs+1)
循环结束
如果fs>v:折叠
let line=getline(v:foldstart)
其他的
让line=substitute(getline(fs),'\t',repeat('',&tabstop),'g')
恩迪夫
设w=winwidth(0)-&foldcolumn-(&number?8:0)
让foldSize=1+v:foldend-v:foldstart
设i=0
让foldWords=0
让wordCount=0

而(i这里是另一个解决方案,使用wordcount()函数,这次:

function! MarkdownFoldText()
    "get first non-blank line
    let fs = v:foldstart
    while getline(fs) =~ '^\s*$' | let fs = nextnonblank(fs + 1)
    endwhile
    if fs > v:foldend
        let line = getline(v:foldstart)
    else
        let line = substitute(getline(fs), '\t', repeat(' ', &tabstop), 'g')
    endif

    let w = winwidth(0) - &foldcolumn - (&number ? 8 : 0)
    let foldSize = 1 + v:foldend - v:foldstart

    let i = v:foldstart
    let foldWords=0
    while (i<v:foldend)
      let lineWords = len(split(getline(i)))
      let foldWords = foldWords + lineWords
      let i += 1
    endwhile
    let wordCount = wordcount()["words"]

    " let foldWords = v:foldend,v:foldstart!wc -w
    let foldWordsStr = " " . foldWords . " w,"
    let foldSizeStr = foldWordsStr . foldSize . " lines "
    let foldLevelStr = repeat("+--", v:foldlevel)
    let foldPercentage = printf("[%.1f", (foldWords*1.0)/wordCount*100) . "%] "
    " let expansionString = "."
    let expansionString = repeat(".", w - strwidth(foldSizeStr.line.foldLevelStr.foldPercentage))
    return line . expansionString . foldSizeStr . foldPercentage . foldLevelStr
    " return line . expansionString . foldSizeStr . foldPercentage . foldWordsStr . foldLevelStr
    " return line . "......" . foldSizeStr . foldPercentage . foldLevelStr
endfunction
函数!MarkdownFoldText()
“获取第一个非空白行
设fs=v:foldstart
而getline(fs)=~'^\s*$'|让fs=nextnonblank(fs+1)
循环结束
如果fs>v:折叠
let line=getline(v:foldstart)
其他的
让line=substitute(getline(fs),'\t',repeat('',&tabstop),'g')
恩迪夫
设w=winwidth(0)-&foldcolumn-(&number?8:0)
让foldSize=1+v:foldend-v:foldstart
设i=v:foldstart
让foldWords=0

虽然(它工作得很好,西蒙皮埃尔。我试着投票支持它,但恐怕我没有足够的理由这么做。这有一个缺点,因为小说中的字数(尤其是超过10万字的小说)需要相当多的计算,因此打开折叠时会有很大的延迟,但当我试图找出某些章节是否太重时,这是值得的。我可能只想使用两个不同的_vimrc文件并将其交换。我可以处理并优化此问题:看起来字数会重新计算几次。我会的看看我是否能处理好。出于某种原因,这不起作用。折叠线只是一个0。在我的机器上没有:`````升级Nexus核心交换机……..404 w,95线[19.3%]+--conf t……..169 w,40线[8.1%+--conf t……..44 w,10线[2.1%] +-- ```