helm sourceで completing-read関数を使う場合の注意

helm-gtags.elに投げられた問題でわかったんですが、
helm-modeを有効にしているとき、helm source内で completing-read関数を
使っている場合問題がある可能性があるのでそれについて示します。

問題

helm-modeが有効なとき、つまり

  (helm-mode 1)

のようにしている場合ですが、このとき completing-readの補完関数が
helmで定義しているものに差し替えられます。helm-completing-read-default
という関数です。これが場合により問題になります。


completing-read関数を必ず候補の中から入力するように設定している
(第四引数が t)にしていれば問題ないのですが、候補以外でも入力可能と
いうように設定していると問題が発生します。詳しくは見ていないですが、
helmは原則候補(candidates)の中から選択しなければならないので、
そこに候補外の文字列を入力したとき、戻り値が期待したものにならず
問題が生じたものだと思います。

対策

補完関数をデフォルトに戻すことで解決されます。
以下のようにして、completing-readを呼び出せばこの問題を回避できます。

(let ((completing-read-function 'completing-read-default))
  (completing-read prompt comp-func nil nil nil nil tagname))))

おわりに

すべてが helm(anything)になってしまうのは慣れないので、helm-modeを
有効にしたことが一度もなくて気づかなかったのですが、このような
問題が起こってしまうようです。まあ helmの中で completing-readを
使うということはあんまりないので、頻繁に遭遇する問題ではないかと
思いますが、helm-modeでうまく動作しないっていう場合があれば、
上記のようなことが起きてるんじゃないかとを考えてみると良いのではないでしょうか。