我正在尝试创建一个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执行此操作的正确方法是什么?谢谢!
答案 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>