cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

よじれた実験:コマンド補完関数の中でコマンド補完関数を呼ぶ

コマンド補完関数の中で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:
参照がコピーされるのは、関数参照と辞書、リストだけで合ってます?
fmmm

thinca:
配列は参照コピーなので一瞬
関数参照も参照コピーじゃないです…
あれは関数名を文字列で保持している。文字列は当然毎回コピーされる

kamichidu:
39Mのデータが400Mまで膨れた理由、文字列コピーっぽいので

thinca:
Funcref フラグがあるだけで、持ってるものは文字列と同じ

kamichidu:
oh...
なるほど、ありがとうございます

http://lingr.com/room/vim/archives/2014/10/18#message-20422068

関数参照もコピーで渡されていたとは