Emacs: ファイル名補完で「Icon^M」を無視する


Emacsではfind-fileなどでのファイル名補完で特定の拡張子のファイルを候補に含まないように設定できる.
たとえば.xlsxファイルをEmacsで開くことは普段はあまりないだろう.

(setq completion-ignored-extensions
      (append completion-ignored-extensions
              '("./" "../" ".xlsx")))
(defadvice completion-file-name-table (after ignoring-backups-f-n-completion activate)
  "filter out results when the have completion-ignored-extensions"
  (let ((res ad-return-value))
    (if (and (listp res)
             (stringp (car res))
          (cdr res)) ; length > 1, don't ignore sole match
        (setq ad-return-value
              (completion-pcm--filename-try-filter res)))))

(参考:autocomplete – Don’t show uninteresting files in Emacs completion window – Stack Overflow,Emacsのバージョンによって微妙にどこかを変えなければいけなかったような気がするけど忘れた)

で,マッキントッシュというオーエスでは油断すると「Icon\r」(\rは制御文字のCR, 0x0d)という名前のファイルが勝手に作られることがある(「Icon?」「Icon^M」に見える場合もあるだろう).
普段は見えないので気にならないが,油断すると,例えばDropboxがヘマをすると見えるようになっていて,CRが含まれているせいで非常に邪魔だ.消したい.

が,completion-ignored-extensionsにそのまま"Icon\r"とか"Icon\\r"とか書いてもうまくいかない.
何故ならばEmacsが自動的に\r\nに変換してくれているからである.

このことは次のようにすると確かめられる.

(car (file-name-all-completions "Icon" "~/Dropbox/"))
=> "Icon
"

(string= "Icon\n" (car (file-name-all-completions "Icon" "~/Dropbox/")))
=> t

(注.最後の~/Dropbox/を適当にIconからファイル名が始まるファイルがIcon\rしかないディレクトリに変える)

と,いうわけでcompletion-ignored-extensionsには"Icon\n"を追加すればよい.


Leave a Reply

Your email address will not be published. Required fields are marked *