あれ、どうやったっけ

(たぶん)テキストサイト風blog。文が安定するまで書き直しあるからメンゴ。

どうしてemacsのcompanyでpowershellのcompletionに成功したのか自分でもよくわからない

すでに書き直しverがあったりする

キャッシュして高速化したビミョーな奴はこちら。この記事はすでに古いです。

http://osaka-zumai.hatenablog.jp/entry/2017/11/20/210940

emacs + company + powershell + completion >= Powershell ISE(笑)、本当か?

Powershell ISEにはコードフォーマッターないんで、すでにあるEmacsのほうが有利になるな的な話(というか、ISEはインデントなんとかしてください)。

ですが、以下のコードにキモチワルイところはあります。 何がキモチワルイのかといえば、company-backendsに食わす関数で使う`prefixとか`candidatesの意味を自分はキチンと飲み込んでいないことなのです。prefixとかcandidatesが呼ばれる順番とか中身の意味。

サンプルみてこのような書き方をせよってことか、としか。すげえモンキー。

「experimental(実験的)」品質ってことでお願いします。

(defun company-powershell (command &optional arg &rest ignored)
  (pcase command
    (`prefix (and (eq major-mode 'powershell-mode)
                 (company-grab-symbol)))
    (`candidates
     (setq-default company-powershell-start-complete-length 3)
     ((lambda (target)
        (let ((ps-out ""))
          (if (>= company-powershell-start-complete-length (length target)) ()
            (setq ps-out (shell-command-to-string
                          (concat "powershell -Nologo -Command \"Get-Command -Name "
                                  target
                                  "* -CommandType Alias,Function,Filter,Cmdlet"
                                  " | Format-Wide -Property Name -Column 1")))
            (setq ps-out (string-trim ps-out))
            (split-string ps-out))))
      arg))))

(add-to-list 'company-backends 'company-powershell)

やりたかったことは「Get-Command」の出力を元にcompanyの補完リスト作ることです。こんなの。スパーハカーマジ怖いのでコンピュータ名消させてください。

f:id:osaka_zumai:20171120030140j:plain

prefixで補完対象の文字飛んでくるってなことのようですが、powershell-modeじゃなかったら補完候補イランやん、でアタマっぱねしてます。他はサンプルをモロパクです。興味が出たらcompany-modeについて調べると思いますが、当面置いて別のことする予定。

company-powershell-start-complete-length はその……文字数0とか1ではGet-Commandの出力クッソ長いんです。重いんです。3~4で実用域か?(4でもひっかかりあり) orz

一番いいのはキャッシュして読むのはわかってますよ! 僕やり方知らないんです! (逆切れ)

自分の今のelispの知識ではやり方よくわかんね、とも言います。ごめん。リアルで。昨晩そんな余裕なかったです。あー誰かもっといいの書いてくんねーかなー。「わお、クール」って相手を一回褒めてからパクりますから、よしなに……。

今日の結論:るびきち記事(まず参照しますよね)とcompany本家の記事見てごまかしたった、そんなのでいいのか俺。