【问题标题】:longest line in vim?vim中最长的行?
【发布时间】:2011-01-05 17:25:15
【问题描述】:

是否有一个命令可以确定 vim 中最长行的长度?并在文件开头附加该长度?

【问题讨论】:

  • 必须在 Vim 中完成吗?我问是因为这是一件非常具体的事情,如果您需要在多个文件上完成它,将 Python/Perl/Ruby 脚本放在一起可能会更快。
  • 这听起来像是您要求对实际问题的错误解决方案。你到底想达到什么目的?
  • @ZoogieZork:有时候vim就够了,也够简单,不用外接工具。

标签: vim command


【解决方案1】:

Gnu 的 wc 命令有一个 -L --max-line-length 选项,用于打印文件的最大行长度。请参阅gnu man wc。 freebsd wc也有-L,但没有--max-line-length,见freebsd man wc

如何在 vim 中使用这些?命令:

:%!wc -L

会通过 wc -L 过滤打开的文件,使文件内容为最大行长。

要保留文件内容并将最大行长度放在第一行,请执行以下操作:

:%yank
:%!wc -L
:put

Find length of longest line - awk bash 没有使用 wc,而是描述了如何使用 awk 来查找最长行的长度。

好的,现在是纯 Vim 解决方案。我对脚本有点陌生,但这里有。以下内容基于textfilter 中的FilterLongestLineLength 函数。

function! PrependLongestLineLength ( )
  let maxlength   = 0
  let linenumber  = 1
  while linenumber <= line("$")
    exe ":".linenumber
    let linelength  = virtcol("$")
    if maxlength < linelength
      let maxlength = linelength
    endif
    let linenumber  = linenumber+1
  endwhile

  exe ':0'
  exe 'normal O'
  exe 'normal 0C'.maxlength
endfunction

command PrependLongestLineLength call PrependLongestLineLength()

将此代码放入 .vim 文件(或您的 .vimrc)并 :source 文件。然后使用新命令:

:PrependLongestLineLength

谢谢,解决这个问题很有趣。

【讨论】:

  • 我在类似 !awk '{print(length($0))}'
  • 即使 Jonathan (pre-vim-7) 的解决方案有点复杂,但他使用virtcol() 是对的,表格不应算作“1”。恐怕所有其他基于 wc、awk、perl 等的解决方案都不会给出正确的答案。
【解决方案2】:

如果您使用扩展的表格,一个简单的

:0put=max(map(getline(1,'$'), 'len(v:val)'))

够了。

否则,我想我们将需要以下内容(您可以在 :h virtcol() 中找到最后一个示例,减去 -1):

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1"))

【讨论】:

  • 我不会称那行“简单”。它虽然有效,所以没有抱怨。
【解决方案3】:

:!wc -L %
而不是
:%!wc -L

要在文件开头附加该长度:
:0r !wc -L % |剪切 -d' ' -f1

【讨论】:

  • %!wc -L 的优势在于它适用于未保存或未命名的缓冲区。
  • 请注意,如果文件名中有空格或某些特殊字符,可能会导致一些问题。请改用"%"
【解决方案4】:

这是一个简单易记的方法:

  • 选择所有文本:ggVG
  • 将每个字符 (.) 替换为“a”::'&lt;,'&gt;s/./a/g
  • 排序,唯一::'&lt;,'&gt;sort u
  • 计算最长行中的字符(如果字符太多不容易计算,只需查看 Vim 状态栏中的列位置)

在制作 PostgreSQL 表之前,我将其应用于检查酶委员会 (EC) 编号:

我将 ec_numbers 数据复制到 Calc 中,然后在 Neovim 中取出每一列,将每个字符替换为“a”,

:'<,'>s/./a/g

然后对唯一行进行排序

:'<,'>sort u

aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaaaa

...所以最长的 EC 编号条目 [x.x.x.x] 是 11 个字符,VARCHAR(11)。

类似地应用于 Accepted Names,我们得到

aaaaa
aaaaaa
...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

即最长的名称是 147 个字符:VARCHAR(200) 应该覆盖它!

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2010-12-11
    • 2015-10-04
    相关资源
    最近更新 更多