2017-05-21 19 views
2

Ich benutze GVIM auf Windows zum Schreiben von SF-Romane und ich falte die Kapitel, damit ich sie verstecken kann. Im zusammengeklappten Zustand zeigt das Kapitel "Linien" etwa folgendes:VIM ändern falten Markdown zu Zeilen und Anzahl der Wörter mit vimrc

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

Dies ist nützlich, aber nur ein kleines bisschen. Einige Zeilen können nur ein paar Wörter sein, andere mehr als 100 Wörter. Was ich würde es vorziehen, ist eine Zeilenzahl und ein Wort wie diese zählen:

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

mit dem Prozentsatz, dass die Worte sind und nicht für die Leitungen. Jede Hilfe würde sicher geschätzt werden.

Hier ist der Faltabschnitt meiner _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() 

Antwort

0

Hier ist eine Lösung:

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 

Die Idee, die globale Wortanzahl zu zählen ist, und derjenige, der nur in den ausgewählten ist Region gleichzeitig.

Dann ersetzen wir den Prozentsatz mit der Wortanzahl wie angefordert.

+0

Das funktioniert wunderbar simonpierre. Ich habe versucht, es abzustimmen, aber ich fürchte, ich habe nicht genug Punkte, um das zu tun. – tgrignon

+0

Es gibt einen Nachteil, da das Wort zählen in einem Roman (vor allem ein über 100K Wörter) erfordert ziemlich viel Rechenleistung, so gibt es eine erhebliche Verzögerung beim Öffnen Falten, aber das ist es wert, wenn ich versuche herauszufinden, wenn sicher Kapitel sind zu schwer. Ich möchte vielleicht einfach zwei verschiedene _vimrc-Dateien verwenden und sie austauschen. – tgrignon

+0

Ich kann daran arbeiten und dies optimieren: sieht so aus, als ob die Wortzählung mehrmals neu berechnet wird. Ich werde sehen, ob ich das schaffen kann. –

0

Hier ist eine andere Lösung, wordcount() Funktion, diesmal:

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 

Es sollte schneller sein. Nicht, dass der Prozentsatz angibt, wie viel dieser Ordner im Vergleich zum gesamten Puffer darstellt. Wie weit sind wir vom Ende her mit der Funktion wordcount() trivial zu bauen?

+0

Aus irgendeinem Grund funktioniert das simonpierre nicht. Die gefalteten Linien sind damit nur eine 0. – tgrignon

+0

Nicht auf meiner Maschine: '' ' # Upgrade Nexus Core-Switches ........... 404 w, 95 Zeilen [19.3%] + - # conf t .... ................................. 169 W, 40 Zeilen [8.1%] + - # conf t. ..................................... 44 w, 10 Zeilen [2,1%] + - '' ' –