使用vim生成基于整数的随机数表?

时间:2012-07-17 20:04:49

标签: ruby vim

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

我从这里看到一些动机来生成随机数的单个实例(从使用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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 6:Rand 6 6 6,其中第三个参数指定随机数的最大值。