現在の補完APIは Lua 側の負担が重いので、bash と同じくらいにお手軽な新補完APIを試作中してます。以下は git のサブコマンドを補完する例:
nyagos.complete_for["git"] = function(args) if #args == 2 then local base = args[#args] local len = string.len(base) local result = {} for _,s in pairs{ "commit","push","pop","diff","rebase","log" } do if string.sub(s,1,string.len(base)) == base then result[#result+1] = s end end return result else return nil end end
- コマンド単位に、テーブル
nyagos.complete_for["コマンド名"]
に関数を割り当てる - 引数 args はカーソルより左側を空白で区切ったテキスト(二重引用符等は削除済み)
- 戻り値には、補完候補の文字列群をテーブルとして返す
- 戻り値を nil にすると、従来どおりのデフォルトのファイル名補完が実行される。
まだ、もうちょっと変えるかもしれません。
追記
候補の限定処理も Go 側でやるようにしてみました。この結果、上記の例は
nyagos.complete_for["git"] = function(args) if #args == 2 then return { "commit","push","pop","diff","rebase","log" } else return nil end end
とすごく簡単になります。
さらに追記
決定版!
nyagos.complete_for.git = function(args) while #args > 2 and args[2]:sub(1,1) == "-" do table.remove(args,2) end if #args == 2 then return nyagos.fields([[ add fsck-objects rebase add--interactive gc receive-pack am get-tar-commit-id reflog annotate grep relink apply gui remote archimport gui--askpass remote-ext archive gui--askyesno remote-fd bisect gui.tcl remote-ftp bisect--helper hash-object remote-ftps blame help remote-http branch http-backend remote-https bundle http-fetch repack cat-file http-push replace check-attr imap-send request-pull check-ignore index-pack rerere check-mailmap init reset check-ref-format init-db rev-list checkout instaweb rev-parse checkout-index interpret-trailers revert cherry log rm cherry-pick ls-files send-email citool ls-remote send-pack clean ls-tree sh-i18n--envsubst clone mailinfo shortlog column mailsplit show commit merge show-branch commit-tree merge-base show-index config merge-file show-ref count-objects merge-index stage credential merge-octopus stash credential-manager merge-one-file status credential-store merge-ours stripspace credential-wincred merge-recursive submodule cvsexportcommit merge-resolve submodule--helper cvsimport merge-subtree subtree cvsserver merge-tree svn daemon mergetool symbolic-ref describe mktag tag diff mktree unpack-file diff-files mv unpack-objects diff-index name-rev update-index diff-tree notes update-ref difftool p4 update-server-info difftool--helper pack-objects upload-archive fast-export pack-redundant upload-pack fast-import pack-refs var fetch patch-id verify-commit fetch-pack prune verify-pack filter-branch prune-packed verify-tag fmt-merge-msg pull web--browse for-each-ref push whatchanged format-patch quiltimport worktree fsck read-tree write-tree]]) end if args[#args]:sub(1,1) == "-" then if args[2] == "commit" then return { "--amend" , "-a" , "--cleanup","--dry-run" } end end return nil end
nyagos.fields は文字列を空白で分割する関数です。