vim 中最长的一行?

问题描述 投票:0回答:5

vim 中有确定最长行长度的命令吗?并将该长度附加到文件的开头?

vim command
5个回答
21
投票

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

代替使用 wc,查找最长行的长度 - awk bash 描述如何使用 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

谢谢,弄清楚这个很有趣。


8
投票

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

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

就够了。

否则,我想我们将需要以下内容(您可以在

:h virtcol()
中找到最后一个示例,减去-1):

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

2
投票

:!wc -L %

而不是
:%!wc -L

将该长度附加到文件开头:

:0r !wc -L % | cut -d' ' -f1


1
投票

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

  • 选择所有文本:
    ggVG
  • 将每个字符 (.) 替换为“a”:
    :'<,'>s/./a/g
  • 排序,独特:
    :'<,'>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)。

同样适用于接受的名称,我们得到

aaaaa
aaaaaa
...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

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


1
投票

对于 neovim 用户:

local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)

local width = #(lines[1])

for _, line in ipairs(lines) do
  if #line > width then
    width = #line
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.