【问题标题】:VIM change folding markdown to show lines and number of words using vimrcVIM 使用 vimrc 更改折叠降价以显示行数和字数
【发布时间】:2017-05-21 14:22:36
【问题描述】:

我在 Windows 上使用 GVIM 来编写科幻小说,我将章节折叠起来,以便将它们隐藏起来。折叠时,“行”章节显示如下:

##1 – Spaceman Spoof Encounters the Watterson........ 115 lines [2.4%] +--+--

这很有用,但只有一点点。有些行可能只有几个词,而另一些则可能超过 100 个词。我更喜欢这样的行数和字数:

##1 – Spaceman Spoof Encounters the Watterson........ l:115 w:1032 [4.4%] +--+--

百分比是单词而不是行。任何帮助都将不胜感激。

这是我_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()

【问题讨论】:

    标签: vim markdown folding


    【解决方案1】:

    这里有一个解决方案:

    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
    

    这个想法是计算全局字数,以及同时在选定区域中的字数。

    然后我们根据要求将百分比替换为字数。

    【讨论】:

    • 效果很好,simonpierre。我试图投票,但恐怕我没有足够的分数来投票。
    • 这有一个缺点,因为小说中的字数(尤其是超过 10 万字的字数)需要相当多的计算,所以打开折叠时会有很大的延迟,但是当我'我试图弄清楚某些章节是否过于繁重。我可能只想使用两个不同的 _vimrc 文件并将它们换掉。
    • 我可以解决这个问题并对其进行优化:看起来字数会重新计算几次。我会看看我能不能解决这个问题。
    【解决方案2】:

    这是另一个解决方案,这次使用 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
    

    应该更快。并不是说这个文件夹与整个缓冲区相比的百分比是多少。使用 wordcount() 函数,我们离终点还有多远将是微不足道的。

    【讨论】:

    • 由于某种原因,simonpierre 不起作用。折叠线只是一个 0。
    • 不在我的机器上:``` # 升级 Nexus 核心交换机............ 404 w,95 行 [19.3%] +-- # conf t. ..................... 169 w,40 行 [8.1%] +-- # conf t....................... 44 w,10 行 [2.1%] +- - ```
    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 2012-06-28
    • 2015-02-08
    • 1970-01-01
    • 2021-09-01
    • 2011-03-08
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多