Como encontrar a linha com o número máximo de colunas / caracteres no Vim / gVim?

2

No momento, estou usando o gVim no Windows XP e tenho dois seguimentos para minha pergunta principal:

Qual é o melhor método para encontrar a linha com mais caracteres?

Meu método atual: eu uso a pesquisa regex :/^\(\p\)\{#number#,}$ ), e continuo aumentando o inteiro #number# até obter apenas uma correspondência. No caso do meu arquivo, é uma linha de apenas 81K caracteres - não 916.657 como eu pensava anteriormente. Eu sei disso porque quando o cursor está nessa linha, eu pressiono g + Ctrl+g e obtenho a contagem de 81K.

Acompanhamento 1) A pergunta "What is the best method of finding the line with the most columns?" é igual a # 2 acima?

Acompanhamento 2) O que o segundo número significa quando abro um arquivo e vejo a seguinte linha na parte inferior da tela:



Eu interpreto isso para dizer que o arquivo tem 14,871 linhas, e pelo menos uma linha tem 916.657 colunas. Verifiquei que o arquivo tem 14,871 linhas, mas não consegui entender o objetivo do segundo (916K).

    
por drapkin11 09.03.2011 / 19:54

4 respostas

3

O segundo número é a contagem total de caracteres em todo o arquivo. Se você fizer:

$ wc -l -c filename

você deve ver os mesmos dois números (linhas e caracteres totais). Na verdade, você pode fazer:

:!wc -l -c %

Aqui está um plug-in chamado textfilter (< href="http://lug.fh-swf.de/vim/textfilter.zip"> download ) que inclui uma função para encontrar a linha mais longa.

Ou você pode usar isso para encontrar o comprimento da linha mais longa:

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

então você pode usar esse número assim:

/^.\{248\}$
    
por 09.03.2011 / 21:41
3

Deve haver um caminho melhor, mas o seguinte também será feito:

%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!
    
por 09.03.2011 / 20:46
1

Não é possível falar com a primeira pergunta, mas esse segundo número na mensagem de carregamento de arquivos é o número total de caracteres no arquivo.

    
por 09.03.2011 / 20:13
1

Aqui está uma função que faz isso.

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

Você pode executá-lo com

:call MaxLine()

ou defina um comando ou mapeamento para chamá-lo.

Observe que encontrar a linha com as colunas mais reais é o mesmo que a linha com o maior número de caracteres. Isso pode não ser o mesmo que a linha com o maior número de bytes. Se você quiser encontrar a linha com a maioria das colunas virtuais, substitua col("$") por virtcol("$") .

    
por 09.03.2011 / 21:30