有时我想生成随机数(以自由空格分隔格式),但我希望能够指定行数和列数。
我从这里看到一些动机来生成随机数的单个实例(从使用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)
答案 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
,其中第三个参数指定随机数的最大值。