よじれた実験:コマンド補完関数の中でコマンド補完関数を呼ぶ
コマンド補完関数の中でfeedkeys()が使えることが分かった。
ただし、feedkeys()のキー入力が開始されるのは補完が始まった後。
feedkeys()のキー入力によって補完は終了してしまう。
ただし、オプション 'wildcharm' の値を変更することで feedkeys()から補完を再度呼び出せることが分かった。
末尾に '=' が含まれると空白を挟んで 'a' 'b' 'c' を補完する補完関数の例。
function! Cmpl(arglead, cmdline, curpos) if a:arglead =~# "\<C-x>" let &wcm = s:save_wcm return ['a', 'b', 'c'] end if a:arglead =~# '=$' let s:save_wcm = &wcm let &wcm = char2nr("\<Tab>") call feedkeys(" \<C-v>\<C-x>\<Tab>", 'n') return [a:arglead] end return [] endfunction
何かに使えないかと思ったけど、今のところ使い道は見つかっていない。
'=' で引数を受けられるオプションの補完に使えないかなーって頑張ったんだけど。
Vimが参照渡しをするのはリストと辞書だけ。長い文字列はリストに入れて渡す。
kamichidu:
vimの文字列って、代入時にコピーされましたっけthinca:
されます
let や引数に渡す際にもコピーされます
苦しみのテクニックとして、巨大な文字列は配列に入れる、というのがありますkamichidu:
参照がコピーされるのは、関数参照と辞書、リストだけで合ってます?
fmmmthinca:
配列は参照コピーなので一瞬
関数参照も参照コピーじゃないです…
あれは関数名を文字列で保持している。文字列は当然毎回コピーされるkamichidu:
39Mのデータが400Mまで膨れた理由、文字列コピーっぽいのでthinca:
Funcref フラグがあるだけで、持ってるものは文字列と同じkamichidu:
http://lingr.com/room/vim/archives/2014/10/18#message-20422068
oh...
なるほど、ありがとうございます
関数参照もコピーで渡されていたとは