Ситуация # 1: я только что выделил блок текста.Затем я набираю «: Command», которая вызывает некоторую функцию.
Ситуация # 2: Текущий визуальный выбор не выполняется (хотя я мог сделать такой выбор ранее в сеансе редактирования).Я набираю «: Command», которая вызывает (ту же самую) функцию.
Есть ли (надежный) способ отличить две вышеупомянутые ситуации от функции?Я пробовал 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).Я использую маркеры "<"/"
>", чтобы воссоздать коллекцию чисел из визуального выбора.Но я хочу сделать это только , если есть визуальный выбор в настоящее время выделено / активно.
Возможно, вся моя логика неверна и есть лучший способ разработкиэто функциональность?