Увеличение / уменьшение числа скриптов в Vim - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь создать функцию 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 таким образом. Я также пытался использовать функцию feedkeys() в Vim, чтобы попытаться эмулировать нажатия клавиш, но, похоже, это тоже не сработало. Я мог бы, вероятно, сделать это, вызвав базовые функции, которые отображаются Ctrl - A и Ctrl - X , но по мере Я не могу понять, что они из :map.

Какой правильный способ сделать это из vimscript? Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Попробуйте набрать <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>"
0 голосов
/ 21 июня 2011

Извините, я не проверял следующее в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...