Ситуация №1: Я только что выделил блок текста. Затем я набираю ": Command", которая вызывает некоторую функцию .
Ситуация № 2: Текущий визуальный выбор отсутствует (хотя я, возможно, сделал такой выбор ранее в сеансе редактирования). Я набираю «: Команда», которая вызывает (ту же самую) функцию.
Есть ли (надежный) способ различить две вышеуказанные ситуации внутри функции? Я попробовал mode ()
, но проблема в том, что в обоих случаях я нахожусь в командном режиме, хотя в первом случае я попал в командный режим из визуального режима, а во втором - из обычного. Может быть, путем проверки a: firstline
/ a: lastline
/ v: count
?
Обновление - пример использования: «: Sum
». Если есть текущий визуальный выбор, например, столбец чисел (выделение блока) или диапазон строк, содержащий только числа, эта команда отобразит сумму чисел. В противном случае он ожидает в качестве аргументов список чисел, разделенных пробелами, и выводит сумму этих чисел. Базовая структура:
command! -nargs="*" -range Sum :call CalcSum(<f-args>)
function! CalcSum(...) range
" 1. collect numbers from visual selection if there is a current active selection
" 2. otherwise, if len(args) > 0, collect numbers from args
" 3. other cases (i.e., no selection and no args or both selection and args) handled reasonably
" 4. sum collection of numbers
" 5. return/echo result
endfunction
Шаги (2) - (5) просты. У меня проблемы с (1). Я использую маркеры « <» / «
>», чтобы воссоздать набор чисел из визуального выделения. Но я хочу сделать это только в том случае, если есть визуальный выбор , который сейчас выделен / активен.
Может быть, вся моя логика неверна и есть лучший способ разработать эту функциональность?