the highlighted strings in visual mode

visual mode でどこかを選択したあとに mapping を通して呼び出した関数内で選択文字列を取得する、ってのにハマったのでまとめ。結論として visual mode からでも関数呼び出しは normal mode として行われるので該当関数内でとりあえず normal! gv を実行してもう一回選択しなおさなければならない ( :help gv ) 、というのが point 。まぁ実際の case としてはあの register に yank したいだとか選択部分を破棄しつつ change したいだとかだと思うので normal! gv"xy normal! gv"_c とかになると思うけども。

あと visual mode における mapping の定義なんだけど以下の前者のようにすると範囲選択が許されていないとか怒られるので後者のようにきちんと normal mode にしてから呼び出さないといけない、というのも注意点と言えば注意点。

" error
vnoremap <silent><Leader>evh :echo GetVisualHighlighted()<CR>
" work
vnoremap <silent><Leader>evh <Esc>:echo GetVisualHighlighted()<CR>

input mode における定義と違って ":call" を使って呼び出すと普通に呼び出せちゃうから関数内でも visual mode だと勘違いしちゃうんだよね。以下の code が "n" になった ( :help mode() ) のでここらへんの罠に気付いたという経緯で。

function EchoMode()
    echo mode()
endfunction
vnoremap <silent><Leader>em :call EchoMode()<CR>