Не используйте :
, используйте <expr>
:
function! s:NumSort(a, b)
return a:a>a:b ? 1 : a:a==a:b ? 0 : -1
endfunction
func! VtoList()
let [firstline, lastline]=sort([line('v'), line('.')], 's:NumSort')
let mylist = getline(firstline, lastline)
echo mylist
return ""
endfunc
vnoremap <expr> <F2> VtoList()
Обратите внимание на другие изменения: let
(вы забыли это), sort
(строка, где начинается выделение, может быть после строки, где заканчивается выделение), vnoremap
(line("v")
работает только в визуальном режиме), return
(expr
mappings возвращаемое значение выполнено, но оно вам не нужно, вам нужны только побочные эффекты). Вы можете заменить вторую строку на
if mode()=~#"^[vV\<C-v>]"
let [firstline, lastline]=sort([line('v'), line('.')], 's:NumSort')
else
let [firstline, lastline]=sort([line("'<"), line("'>")], 's:NumSort')
endif
Причина, по которой ваше решение не работает, заключается в том, что когда в отображении появляется :
, вы немедленно выходите из визуального режима и переходите в командный режим. line("v")
работает только в визуальном режиме.
Другое примечание: vnoremap {lhs} :
создаст командную строку, уже заполненную '<,'>
. Возможно, вы добавили range
к определению функции и используете let [firstline, lastline]=sort([a:firstline, a:lastline], 's:NumSort')
. Но вы все равно выйдете из визуального режима с :
.