Wie finde ich die Zeile mit der maximalen Anzahl von Spalten / Zeichen in Vim / gVim?

3795
drapkin11

Ich verwende derzeit gVim unter Windows XP und habe zwei Kernfragen zu meiner Kernfrage:

Was ist die beste Methode, um die Zeile mit den meisten Zeichen zu finden?

Meine derzeitige Methode: Ich benutze die Regex-Suche :/^\(\p\)\{#number#,}$) und erhöhe die ganze Zahl, #number#bis ich nur eine Übereinstimmung finde. Bei meiner Datei handelt es sich um eine Zeile mit nur 81.000 Zeichen - nicht um 916.657, wie ich bisher dachte. Ich weiß das, weil ich, wenn sich der Cursor in dieser Zeile befindet, drücke g + Ctrl+gund die Spaltenanzahl von 81K erhalte.

Followup 1) Stimmt die Frage mit "What is the best method of finding the line with the most columns?"der obigen Nummer 2 überein?

Folge 2) Was bedeutet die zweite Zahl, wenn ich eine Datei öffne und die folgende Zeile am unteren Rand des Bildschirms angezeigt wird:

enter image description here

Ich interpretiere das so, dass die Datei 14.871 Zeilen hat und mindestens eine Zeile 916.657 Spalten hat. Ich habe überprüft, dass die Datei 14.871 Zeilen enthält, aber ich konnte den Zweck der zweiten Zeile (916K) nicht verstehen.

2
Vielen Dank an alle für die Antworten. Jeder greift das Problem aus einem anderen Blickwinkel an! Zeigt die Vielseitigkeit von Vim. drapkin11 vor 13 Jahren 0
Für seine Einfachheit und Eleganz verwende ich [Dennis Williamson] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columnsbuchstaben- in-vim-gvim / 255438 (255438) Ansatz. Aus [Eelvex] (http://superuser.com/questions/255368/how-to-find-the-line-mit-maximum-number-of-columns-zeichen-in-vim-gvim/255401#255401 ) Ich werde meine vim-Befehle weiter verfeinern und von [garyjohn] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of) -columns-characters-in-vim-gvim / 255434 (255434), mein vim-Scripting. drapkin11 vor 13 Jahren 1

4 Antworten auf die Frage

3
Eelvex

Es muss einen besseren Weg geben, aber Folgendes wird es auch tun:

%s/./a/g "Replace everything with 'a's sort! "Sort by column length ggy$ "Go to first line (longest) and copy it u "Undo the sorting /<c-r>" "Search for the longest line mm "Mark it 'm' u "Undo the replace 'm "Go to the mark - there! 
[garyjohn] (http://superuser.com/questions/255368/how-to-find-the-line-mit-maximum-number-of-columns-zeichen-in-vim-gvim/255434#255434) ist der bessere Weg :) Eelvex vor 13 Jahren 1
Vielen Dank. In der Zwischenzeit [Dennis] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columns-characters-in-vim-gvim/255438# 255438) kam auch hoch und ich nehme an, dass andere folgen werden :) Eelvex vor 13 Jahren 0
/"... was macht dieser Befehl? Ich habe nachgesehen und bedeutet" Wiederholen "? Nachdem ich gedrückt habe , Ich sehe ein Zitat, dann wenn ich "drücke, wird das, was ich zuvor kopiert habe, eingefügt. Aber ich bin mir nicht sicher, was das" hier eigentlich macht. drapkin11 vor 13 Jahren 0
@ drapkin11: siehe Hilfe für `i_CTRL-R` = Einfügemodus``. Es fügt den Inhalt eines Registers ein. "" ist das Register "letzte Kopie oder Ausschnitt". Eelvex vor 13 Jahren 1
3
Dennis Williamson

Die zweite Zahl ist die Gesamtzahl der Zeichen in der gesamten Datei. Wenn Sie tun:

$ wc -l -c filename 

Sie sollten die gleichen zwei Zahlen sehen (Zeilen und Gesamtzeichen). In der Tat können Sie tun:

:!wc -l -c % 

Hier ist ein Plugin namens textfilter ( download ), das eine Funktion zum Auffinden der längsten Zeile enthält.

Oder Sie können dies verwenden, um die Länge der längsten Linie zu ermitteln:

:echo max(map(range(1, line('$')), "col([v:val, '$'])")) - 1 

dann kannst du diese Nummer wie folgt verwenden:

/^.\$ 
Ich denke, Sie brauchen `col ()`, wenn die Nummer in Verbindung mit `/ ^. \ ` verwendet werden soll (`$` ist hier optional) Eelvex vor 13 Jahren 0
@Eelvex: Ich habe diese Korrektur vorgenommen. Dennis Williamson vor 13 Jahren 1
sehr interessant - ich habe nie daran gedacht, Vim in der Art Ihrer Line 3 zu verwenden: ": echo max (map (range ...)" drapkin11 vor 13 Jahren 0
@ drapkin11: Es ist von `: h virtcol ()` Dennis Williamson vor 13 Jahren 1
`:! wc%` zeigt die Anzahl der Zeilen, Wörter und Zeichen in * der aktuell gespeicherten Version * der aktuellen Datei sowie den Dateinamen an. (Wenn Sie nicht alle drei Nummern wünschen, geben Sie die gewünschten Nummern mit Hilfe von Optionen an.) Um die Nummer (n) zu erhalten, ohne den Dateinamen anzuzeigen, verwenden Sie `:! Wc <%`. Um die Anzahl * für den Text zu ermitteln, der sich aktuell im Editierpuffer * befindet, verwenden Sie `: w! Wc`. (Natürlich können Sie dieselben Informationen auch mit "g" gefolgt von "Strg + G" erhalten.) Scott vor 9 Jahren 0
1
geekosaur

Cam't spricht mit der ersten Frage, aber diese zweite Zahl in der Datei-Lademeldung gibt die Gesamtzahl der Zeichen in der Datei an.

1
garyjohn

Hier ist eine Funktion, die das tut.

function MaxLine() let maxcol = 0 let lnum = 1 while lnum <= line("$") call cursor(lnum, 0) if col("$") > maxcol let maxcol = col("$") let maxline = lnum endif let lnum += 1 endwhile echo "Line" maxline "has" maxcol - 1 "characters" endfunction 

Sie können es mit ausführen

:call MaxLine() 

oder definieren Sie einen Befehl oder ein Mapping, um es aufzurufen.

Beachten Sie, dass das Finden der Zeile mit den meisten tatsächlichen Spalten der Zeile mit den meisten Zeichen entspricht. Das kann nicht der Zeile mit den meisten Bytes entsprechen. Wenn Sie die Zeile mit den meisten virtuellen Spalten suchen möchten, ersetzen Sie sie col("$")mit virtcol("$").

das inspiriert mich dazu, Skripting in Vim zu lernen. Die Funktion funktioniert, aber aus irgendeinem Grund muss ich sie zweimal ausführen. Beim ersten Mal wird nichts zurückgegeben. Beim zweiten Mal wird "Line" maxline "mit" maxcol - 1 "Zeichen belegt ... Ich schätze das ist beabsichtigt. drapkin11 vor 13 Jahren 0
Nein, es sollte jedes Mal gleich funktionieren. Ich kann dieses Verhalten unter Vim 7.3.125 auf einem Fedora Linux-System reproduzieren, aber ich kann es nicht erklären. Ich habe "verbose" auf 15 gesetzt und den ersten und zweiten Durchlauf verglichen - kein Unterschied in den Protokollen. Könnte ein Fehler in Vim sein; könnte ein Fehler in der Funktion sein, die ich gerade nicht sehe. garyjohn vor 13 Jahren 0
Ok, es müssen meine gVim-Einstellungen sein. Ich habe es wie "Fenster", was das Verhalten erklären könnte. In jedem Fall hat Ihre Antwort mich in die Nachschlagewerke gestoßen, was gut ist. drapkin11 vor 13 Jahren 0
Zum Scripting: Wenn Sie erst einmal den Dreh raus haben, ist es wirklich ordentlich. Ich kann von Vim aus mit ein paar Tastatureingaben viel tun. Es ist wie beim Shell-Scripting: Nachdem Sie die gleiche Aufgabe mehrmals ausgeführt haben, stellen Sie fest, dass Sie alles in einem Schritt erledigen und ohne jedes Mal Optionen und Dateinamen mit nur wenigen Zeilen Shell-Script oder Vim-Skript eingeben zu müssen. garyjohn vor 13 Jahren 0