perlplusでシンボルを補完
perlplus.elをsite-lisp以下に置き、.emacsに以下を追加した。
これでPerlのコーディング中にシンボルを補完することができる。
(add-hook 'cperl-mode-hook (lambda () (require 'perlplus) (local-set-key "\M-o" 'perlplus-complete-symbol) (perlplus-setup)))
キーバインドは、普通M-TABに割り当てるようだけど、
Windowsの場合、Alt+TABを入力するとタスク切り替えになってしまうので、
ちょっと悩んでM-oに割り当てることに決めた。
僕はid:naoya氏に習って動的略語展開をC-oに割り当てているので、
M-oが一番しっくりくると思ったのが理由だ。
おまけ
でも本当は補完関係のことは全部C-oでできた方がいいなぁなんて思っている。
だから、http://www.bookshelf.jp/soft/meadow_34.html#SEC494で紹介されている方法で、
動的略語展開で読み込むための専用のファイルを用意して、
Meadowの起動時にPerlの予約語を読み込んでみるようにしてみた。
具体的には、まず以下を.emacsに追加する。
;;; 補完候補とするファイルを読み込ませる ;; このファイルは C-x b などの対象にならないため邪魔にならない (setq filename-for-abbrev '("~/TAGS" "~/dabbrev-list.txt")) ;;(defun find-file-for-abbrev () (progn (let ((list filename-for-abbrev) filename buf cbuf) (setq cbuf (current-buffer)) (while list (setq filename (car list)) (setq list (cdr list)) (if (get-buffer filename) () (progn (setq buf (find-file-noselect filename)) (set-buffer buf) (rename-buffer (concat " *" (file-name-nondirectory filename) "*") t)))) (set-buffer cbuf)))
そして、homeディレクトリ以下にdabbrev-list.txtを作り、
そこにPerlの予約語を書き込んだ。
(予約語はサクラエディタのキーワードファイルから持ってきた。)
これで、C-oでPerlの予約語を補完することができるようになった。
でもPerlと全然関係ないときも予約語が補完の候補に入ってきちゃうのが、
ちょっと気になると言えば気になるところ。
Rubyとか他の言語と併用することになるとどうしてもね。。
モードごとに補完の対象を絞れたらかなりよくなると思うんだよなぁこれ。
一応、サクラエディタから持ってきたPerlの予約語を貼っておこう。ぺたり。
// Perl キーワード定義ファイル // 予約語 perlsyn break continue do elsif else for foreach goto if last next return sub undef unless until while // 関数 perlfunc // m,q,s,y はとりあえずコメントアウトしてあります。 abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each eof eval exec exists exit exp fcntl fileno flock fork format formline getc getlogin getpeername getpgrp getppid getpriority getpwnam getgrnam gethostbyname getnetbyname getprotobyname getpwuid getgrgid getservbyname gethostbyaddr getnetbyaddr getprotobynumber getservbyport getpwent getgrent gethostent getnetent getprotoent getservent setpwent setgrent sethostent setnetent setprotoent setservent endpwent endgrent endhostent endnetent endprotoent endservent getsockname getsockopt glob gmtime goto grep hex import index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat //m map mkdir msgctl msgget msgsnd msgrcv my next no oct open opendir ord our pack package pipe pop pos print printf prototype push //q qq qr qx qw quotemeta rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir //s scalar seek seekdir select semctl semget semop send setpgrp setpriority setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unlink unpack untie unshift use utime values vec wait waitpid wantarray warn write //y