【问题标题】:How to get the number of column in the longest line with vim command?如何使用 vim 命令获取最长行中的列数?
【发布时间】:2016-12-22 12:47:51
【问题描述】:

在vim编辑的文件中,如何用vim命令获取最长行的字符数?
行号呢?

【问题讨论】:

  • 获取最长行长度的最简单方法是将问题交给你的 shell::!wc -L < %
  • 是哪一行?
  • 是要获取某条线的长度还是要先找到最长的线再获取长度?
  • 两个问题1.获取最长行的列号
  • :!wc -L < % 替我做。

标签: vim


【解决方案1】:

使用一些像wcawk这样的Unix工具可能更容易和更短(其他答案/cmets似乎适合他们),所以这是一个纯粹的Vimscript解决方案:

let widths = map(getline(1, '$'), 'strdisplaywidth(v:val)')
let maxWidth = max(widths)
let longestLines = filter(map(copy(widths), 'v:val == maxWidth ? (v:key + 1) : ""'), '! empty(v:val)')
echo printf('max width is %d, found in line(s) %s', maxWidth, join(longestLines, ', '))

它将所有行转换为它们的长度列表,然后找到最大值。然后过滤所有具有该值的列表条目并将其转换为它们的行号(= 列表索引 + 1)。最后打印结果。

【讨论】:

    【解决方案2】:

    这将打印行号、长度和行:

    :%!awk ' { if ( length > L ) { L=length ;s=$0 } }END{ print NR, L, "\""s"\"" }'
    

    http://www.unixcl.com/2009/04/find-length-of-longest-line-awk-bash.html

    【讨论】:

    • 1) 这将清除带有列号的整个缓冲区。 2)如果我们使用外部cmd,wc -L(见问题下的评论)比你的awk简单得多。 3),你的awk可以通过awk '{m=length>m?length:m}END{print m}'来改进
    • 1) 是的,但你可以使用类似stackoverflow.com/a/2075372/94746 2) wc -L 更简单,但它不返回行号。 3)它不打印行号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2018-04-09
    • 2014-11-26
    相关资源
    最近更新 更多