2016-04-04 5 views
1

я хочу вызвать функцию, когда пользователь нажимает qq в визуальном режиме, поэтому я написал следующий код:Функция вызывается несколько раз в vimscript

function! FindSelectionMeaning() 
    echo "FindSelectionMeaning" 
endfunction 

vnoremap <silent> qq :call FindSelectionMeaning()<CR> 

Эта функция вызывается, но у меня есть следующие вопросы:

  • Почему FindSelectionMeaning вызывается один раз для каждой выбранной линии? Я думал, что его следует называть только один раз
  • Есть ли способ вызвать функцию, связанную с скриптом, через vnoremap (в данном случае s:FindSelectionMeaning вместо FindSelectionMeaning)?
+0

Ах, для первого вопроса - кажется, что мне нужно поставить ключевое слово 'range' после' function! FindSelectionMeaning() ' – FrozenHeart

ответ

1

Ваша команда была вызвана несколько раз (на самом деле количество выбранных строк), потому что, когда вы нажимаете : в визуальном режиме, ВИМ автоматически добавит диапазон '<,'>, это приводит к каждой выбранной строке выполнить позже, введенный команда. Если ваша функция хочет быть вызвана только один раз, вы можете изменить отображение, как:

vnoremap <silent> qq :<c-u>call FindSelectionMeaning()<CR> 

<c-u> собирается удалить информацию диапазона после :

В самом деле, вы можете получить выделенный текст таким образом Я думаю, что это проще, держать <c-u> отображение, и изменить свою функцию:

function! FindSelectionMeaning() 
    try 
    let v_save = @v 
    normal! gv"vy 
    return @v 
    finally 
    let @v = v_save 
    endtry 
endfunction 

Эта функция возвращает выделенный текст.

+0

Я обнаружил, что эту проблему можно избежать, добавив ключевое слово' range' после 'function! FindSelectionMeaning() ' – FrozenHeart

+1

@FrozenHeart это тоже может работать. это зависит от того, что вы хотите сделать в этой функции. Если в соответствии с вашим описанным вопросом напечатайте sth, независимо от того, какой пользователь выбрал, только убедитесь, что функция должна вызываться в визуальном режиме, вы можете просто «' использовать 'range', чтобы обрабатывать диапазон в вашей функции. – Kent

+0

Нет, мне нужно получить визуально выбранный текст в этой функции – FrozenHeart

Смежные вопросы