2011-06-20 7 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

は + CtrlキーCtrlキー + Vとして<C-a><C-x>を入力してみてください、それぞれCtrlキー + VはCtrl + X、。この方法は、あなたのexec行は 次のようになります。

^A^Xは、単一のシンボルです
exec ':normal ' . l:random . '^A' 
exec ':normal ' . abs(l:random) . '^X' 

ダブルクォート文字列 展開(:help expr-quoteを参照)を使用するともう1つ(おそらくより良い)方法です。

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> 
関連する問題