2

有时我想生成随机数(以可用空格分隔的格式),但我希望能够指定行数和列数。

我从这里看到一些动机来生成随机数的单个实例(源自使用 ruby​​): http: //mo.morsi.org/blog/node/299

" 在当前行的末尾生成随机数

function! s:Rand(max)
y a         
redir @b    
ruby << EOF
  rmax = VIM::evaluate("a:max")
  rmax = nil if rmax == ""
  printf rand(rmax).to_s
EOF
redir END 
let @a = strpart(@a, 0, strlen(@a) - 1)
let @b = strpart(@b, 1, strlen(@b) - 1)
let @c = @a . @b
.s/.*/\=@c/g
endfunction

我们怎么能把这个简单地扩展到我可以打字的方式

:兰德(6,6)

并生成一个从我的光标位置开始的表格?

对于不知道的用户,vim 需要 +ruby 支持:Installing vim with ruby​​ support (+ruby)

4

2 回答 2

4

我通常很懒惰,只是做一些类似的事情

od -iAn -w 12 /dev/urandom | head -n 30

这将生成具有 3 列随机整数的行。当然,您可以像以往一样对它发出命令:

fun! RTable(r,c)
    exec 'r!od -iAn -w' . (4*a:c) . ' /dev/urandom | head -n ' . a:r
endf
command! -nargs=+ RTable call RTable(<f-args>)

现在你可以,悠闲地

RTable 5 5
RTable 1 500

等等

于 2012-07-17T23:23:37.977 回答
3

循环通过 x 和 y 坐标并提供最大随机数。

function! Rand(max)
   redir @b
ruby << EOF
  rmax = VIM::evaluate("a:max")
  rmax = nil if rmax == ""
  printf rand(rmax).to_s
EOF
   redir END
   let @a = strpart(@a, 0, strlen(@a) - 1)
   let @b = strpart(@b, 1, strlen(@b) - 1)
   let @c = @a . @b
   return @c
endfunction

fun! RandTable(...)
   for y in range(a:2)
      for x in range(a:1)
         if a:0 > 2
            let rand = Rand(a:3)
         else
            let rand = Rand(10)
         end
         exe "norm i" . rand . "  "
      endfor
      exe "norm Xi\<cr>"
   endfor
endfun

command! -nargs=* Rand call RandTable(<f-args>)

现在您可以使用:Rand 6 6or:Rand 6 6 6其中第三个参数指定随机数的最大值。

于 2012-07-17T22:04:42.223 回答