2

我正在创建一个新函数来证明文本的合理性。我知道有一些插件,但它们并没有做我想做的事情,所以我决定自己创建一个函数。

前:

text_text_text_text_____

后:

text__text___text___text

我首先要做的是找到单词的数量和非空格字符的数量(对于我文本中的每一行):

let @e = '' | redir @e | silent exe i.'s/'.cols.'\(\S\+\)/&/gne' | redir END
     if matchstr(@e, 'match') != '' | let nrwords   = matchstr(@e, '\d\+\ze') | else | continue          | endif
let @e = '' | redir @e | silent exe i.'s/'.cols.'\S/&/gne'   | redir END
     if matchstr(@e, 'match') != '' | let nonspaces = matchstr(@e, '\d\+\ze') | else | let nonspaces = 0 | endif

然后找到空格:

let spaces = textwidth_I_want - nonspaces

我必须划分单词之间的空格:

let SpacesBetweenWords = spaces/(str2float(nrwords)-1)   

但是通常它是一个浮点数。
体育spaces = 34
nr.words-1 = 10
SpacesBetweenWords = 3.4

我想要做的是划分单词之间的空格,如下所示:单词之间的
空格:
4 3 3 4 3 3 4 3 3 4
并将它们放在一个列表'SpaceList'中

然后将它们插入单词之间

 for m in range(1,len(SpaceList))
    exe i 's/^'.cols.'\(\S\+\zs\s\+\ze\S\+\)\{'.m.'}/'.repeat(' ', SpaceList[m-1]).'/'
 endfor

(cols = 我的块选择或整行)

在我的示例中创建一个包含所有整数 pe 的列表很容易
3 3 3 3 3 3 3 3 3 3(空格 = 30)
,但单词之间仍然有 4 个空格。
我的问题是“如何在单词数之间划分这些空格”?

4

2 回答 2

1

结果是3.4,这意味着,您不能使长度相同的单词之间的所有距离。您必须调整textwidth_I_want值以使结果为整数,或者将距离设置为3,然后计算您还需要多少个空格 ( 10*(3.4-3)=4)。您可以将这 4 个空格添加到 4 个距离。

于 2015-12-17T11:23:58.520 回答
0

使用python找到了解决方案

let r = float2nr(SpacesBetweenWords)
let places = nrwords-1
"the extra spaces to put between words
let extraspaces2divide = float2nr(spaces-r*places)
"find randomly with the help of python a serie of (unique) numbers for every space to divide, numbers between 1 and the number of words
exe "py import vim,random;  Listvalue = random.sample(xrange(1,".(places+1).",1),".extraspaces2divide.");vim.command(\"let randomlist = '%s'\"% Listvalue)"

"the result of python is a string like this [1, 3, 6, 9]: remove the brackets and spaces and split the result to a list
let randomlist = substitute(randomlist, '[\[\] ]', '', 'g')
"this list is the serie of random numbers (= the place between words) where to add an extra space
let list = sort(split(randomlist, ','))

for s in range(1,nrwords-1)
  if (index(list, ''.s.'') != -1)
    let r2 = r+1
  else
    let r2 = r
  endif
  call add(SpaceList, r2)
endfor
于 2015-12-18T10:23:56.967 回答