2012年1月11日

Emacsでauto-complete + pycompleteによるPythonの補完 (Gentoo Linux)


Emacsでのpython開発環境を強化しようと思い色々と設定を行っています。
補完機能について色々と試していたが、そこそこな設定ができたので記録を残しておきます。

Emacsでpythonの補完を行う方法は、pythonの思想に反して(?)色々方法があるようです。


  ropemacs
  pysmell
  pycomplete
  ac-python


あまりモジュールの依存が多いものは嫌だったので、pycompleteを使うことにしました。

なお、以下の設定はGentooでの設定に依存したものになります。
(一般的な部分もありますが...)

まず必要なパッケージをインストールします。括弧内に実際にインストールしたバージョンを記載しています。


  # emerge app-editors/emacs       (=app-editors/app-emacs-23.3-r2)
  # emerge app-emacs/pymacs        (=app-emacs/pymacs-0.23-r1)
  # emerge app-emacs/python-mode   (=app-emacs/python-mode-5.2.0)
  # emerge app-emacs/auto-complete (=app-emacs/auto-complete-1.3.1)


また、Gentooのpython-modeではpycompleteがインストールされないためローカル環境に置きます。
python-modeインストール時に取得されたtgzが/usr/portage/distfilesにあるので、
そこから pycomplete.py と pycomplete.el を取り出します。以下のパスに配置しました。


  $HOME/.emacs.d/local-site-lisp/pycomplete.el
  $HOME/.emacs.d/pycomplete/pycomplete.py


続いて、Emacsの設定。$HOME/.emacsに以下を記述します。


  ;; portageでインストールされるelispを読み込む
  (load "/usr/share/emacs/site-lisp/site-gentoo")

  ;; pycomplete.elを保存したディレクトリをload-pathに追加
  (setq load-path (append '("~/.emacs.d/local-site-lisp") load-path))

  ;; auto-completeの設定
  (add-to-list 'ac-dictionary-directories "~/.emacs.d/dict")
  (require 'auto-complete-config)
  (ac-config-default)
  (setq ac-use-menu-map t)  ; 補完ウィンドウでC-p,C-nで候補選択

  ;; pycomplete.pyをpymacsに渡す
  (eval-after-load "pymacs"
    '(add-to-list 'pymacs-load-path "~/.emacs.d/pycomplete"))
  ;; pycompleteをロードする
  (add-hook 'python-mode-hook '(lambda () (require 'pycomplete)))

  ;; auto-completeでpycompleteを渡すための設定
  (defvar ac-source-pycomplete
    '((prefix "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z_][a-zA-Z0-9_]*\\)?\\)" nil 1)
      (candidates . ac-pycomplete-candidates)
      (require . 0)))
  (defun ac-pycomplete-candidates ()
    (pycomplete-get-all-completions (py-symbol-near-point) (py-find-global-imports)))

  ;; auto-completeをpythonでも有効にする
  ;;   (app-emacs/auto-complete-1.3.1ではpython-modeは設定されていない)
  (add-to-list 'ac-modes 'python-mode)
  (defun ac-python-mode-setup ()
    (setq ac-sources (append '(ac-source-pycomplete)
    ac-sources)))
  (add-hook 'python-mode-hook 'ac-python-mode-setup)

  ;; M-hで即座にpycompleteによる補完を行う
  ;;  XXX: ac-complete-pycompleteを利用すると、"sys."等のドット状態で補完ができない
  ;;  XXX: そのため、ac-complete-interactive-pycompleteを定義して呼び出す
  (global-set-key (kbd "M-h") 'ac-complete-interactive-pycomplete)
  (defvar ac-source-pycomplete-interactive
    '((prefix "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z_][a-zA-Z0-9_]*\\)?\\)" nil 1)
      (candidates . ac-pycomplete-candidates)
      (requires . 0)))
  (defun ac-complete-interactive-pycomplete ()
    (interactive)
    (auto-complete '(ac-source-pycomplete-interactive)))


ac-source-pycomplete-interactiveについてですが、関数定義の中身はac-source-pycompleteと一緒です。
ac-complete-interactive-pycompleteからac-source-pycompleteを呼び出すようにすると、
後述のドット(.)で補完を行うことができないため(原因不明)、別の関数で定義しています。

以上の設定で、以下のようにできます。
  "sys.__" とか入力すれば、auto-completeで補完してくれる
  "time." とか入力後、M-hでシンボル一覧が表示される
これでかなりイイ感じです。

以下のサイトを参考にしました。感謝!
[emacs][python] auto-complete と pycomplete で賢い補完
@yosisaさんのつぶやき

2012年1月3日

Googleリーダーのキーボードショートカット

RSSリーダーとしてGoogleリーダーを愛用しています。
よく使うキーボードショートカットは以下です。
  • j  : 次のアイテム
  • k : 前のアイテム
  • s : スターをつける
  • Shift+a : 全て既読にする
なお、日本語入力が無効の状態で無いとキーボードショートカットは効かないです。

個人的Advent Calenderのまとめ

2011年のプログラミング系Advento Calenderの一覧です。(個人的に気になったもの)



また、Advent Calenderの一覧をまとめたサイト