VIM使用vimrc更改折叠标记以显示行和字数
我在windows上使用GVIM来写科幻小说,我把章节折叠起来,这样我就可以把它们藏起来。折叠时,章节“线条”显示如下内容: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%] +--+-- 这是有用的,但只是一点点。有些行可能只是几个字,而另
##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%] +-- ```