Vim中的脚本编号增量/减量

时间:2011-06-20 09:54:40

标签: vim

我正在尝试创建一个VimScript函数,该函数随机增加/减少光标下的数字,因此我可以从宏调用它。到目前为止,我有这个:

function! RandomIncDec() 
    python import random
    python vim.command("let l:random = " + str(random.randint(-15, 15)))
    if l:random > 0
        exec ':normal ' . l:random . '<C-a>'
    elseif l:random < 0
        exec ':normal ' . abs(l:random) . '<C-x>'
    endif
endfunction

command! RandIncDec :call RandomIncDec()

我遇到的问题是 Ctrl - A Ctrl - X 键'似乎以这种方式从VimScript工作。我也尝试在Vim中使用feedkeys()函数来尝试和模拟按键,但这似乎也没有。我可以通过调用 Ctrl - A Ctrl - X 映射到的基础函数来做到这一点,但由于它们是核心,我无法从:map找到它们的内容。

从vimscript执行此操作的正确方法是什么?谢谢!

2 个答案:

答案 0 :(得分:3)

尝试输入<C-a><C-x>作为 Ctrl + V Ctrl + A Ctrl + V , 分别为 Ctrl + X 。这样你的exec行应该这样 看起来像这样:

exec ':normal ' . l:random . '^A'
exec ':normal ' . abs(l:random) . '^X'

其中^A^X是单个符号。

另一种(可能更好)的方法是使用双引号字符串 扩展(见:help expr-quote)。

exec ':normal ' . l:random . "\<C-A>"
exec ':normal ' . abs(l:random) . "\<C-X>"

答案 1 :(得分:0)

抱歉,我没有在unix上测试过。

function! s:srand()
  if has('win32') || has('win64')
    call libcallnr("msvcrt.dll", "srand", localtime())
  else
    call libcallnr("libc.so", "srand", localtime())
  endif
endfunction

function! s:rand()
  if has('win32') || has('win64')
    return libcallnr("msvcrt.dll", "rand", -1)
  else
    return libcallnr("libc.so", "rand", -1)
  endif
endfunction

call s:srand()

function! s:RandomInc()
  let r = s:rand()%3 + 1
  exe "normal! ".r."\<c-a>"
endfunction

function! s:RandomDec()
  let r = s:rand()%3 + 1
  exe "normal! ".r."\<c-x>"
endfunction

nmap <c-a> :call <SID>RandomInc()<cr>
nmap <c-x> :call <SID>RandomDec()<cr>