2011-06-20 22 views
2

我正在嘗試創建一個隨機遞增/遞減遊標下的數字的VimScript函數,所以我可以從宏中調用它。到目前爲止,我有這樣的:在Vim中腳本編號遞增/遞減

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 - 一個按Ctrl - X鍵似乎並沒有從Vimscript中的這項工作辦法。我也嘗試過在Vim中使用feedkeys()函數來嘗試和模擬按鍵,但是這似乎也沒有辦法。 一個按Ctrl - - 我可以通過調用按Ctrl的基本功能可能做到這一點X被映射到,但因爲他們是核心,我不能找出他們是從什麼:map

什麼是從vimscript做到這一點的正確方法?謝謝!

+1

順便說一句,你沒有忘記數和'' /''點之間操作? –

+0

你說得對,也必須做出這個改變。編輯我的問題,包括此更新,以防其他人試圖做同樣的事情 – actionshrimp

回答

3

嘗試鍵入<C-a><C-x>作爲Ctrl鍵 + VCtrl鍵 + ,和Ctrl鍵 + VCtrl鍵 + 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>" 
+0

輝煌,不知道Ctrl + V插入模式。這很好地完成了這個技巧:-)感謝您的幫助! – actionshrimp

+2

而不是將「硬」控制字符插入到腳本文件中,而是可以使用雙引號字符串並反斜槓<字符,例如:exec':normal'。 l:隨機。 「\ 」 – Heptite

+0

@Heptite:感謝您的建議!反斜槓擴展比硬編碼的不可打印字符更好。 –

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>