shtaxxx日記

コンピュータアーキテクチャについて研究している研究者の日記や技術紹介

emacsでPython+Jediの補完を使う

OSには事情によりCentOS 6.5を想定しているが,Ubuntu等でもほぼ同じ.

各種ソフトウェアインストール

pipをインストールし,その後virtualenvをインストールする.既にインストールされていればスキップ可能.

CentOS (6.5) の場合 (rootで実行)

yum install python27 python3
easy_install pip
easy_install-3.3 pip
pip install virtualenv
pip3 install virtualenv

次に,jediとepcをインストールする

pip3 install jedi epc

 

jediの設定をする

cd .emacs.d/site-lisp/jedi/emacs-jedi
virtualenv-3.4 env

emacs lispを設定する

inits/70-python.el はこんな感じ

;; python-mode with jedi
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-deferred")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-epc")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-ctable")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-jedi")

(autoload 'python "python" nil t)
(autoload 'jedi "jedi" "Jedi for python" t)

(add-hook 'python-mode-hook
          '(lambda ()
             ;; python common 
             (setq python-python-command "python3")
             (setq indent-tabs-mode nil)
             (setq indent-level 4)
             (setq python-indent 4)
             (setq tab-width 4)
             ;; jedi
             (setq jedi:setup-keys t)
             (jedi:setup)
             (define-key jedi-mode-map (kbd "M-TAB") 'jedi:complete)
             (setq jedi:complete-on-dot t)
             (setq jedi:environment-root "env")
             (setq jedi:environment-virtualenv
                   (append python-environment-virtualenv
                           '("--python" "python3")))))

(eval-after-load "jedi"
  '(progn
     (setq jedi:server-command
           (list python-python-command jedi:server-script))))

emacsでGo言語(golang)の補完と定義ジャンプをするにはgocodeとgodefを使う

emacs (24.3) 上でgolang (1.3.3) の補完とコードジャンプを利用する方法をまとめました.
ターミナルのシェルにはbashを使っていますが,他のシェルでも変わらないはず.

PATH各種を設定する

まず,emacs上でexec-pathが$GOPATH (Goコマンドでインストールしたバイナリがあるディレクトリのパス) を含むことを確認する.*scratch*で

exec-path

とタイプしてからC-j (Ctrl + j) とすれば確認できる.

シェルからemacsを起動すれば自動的に$PATHをexec-pathとして取り込むので,予めシェルで$PATHが$GOPATHを含むように設定しておけばOK.

Macなどでアプリケーションのアイコンから直接emacsを起動してしまうとexec-pathに$PATHが取り込まれないので注意.
また,OSX Yosemite上で起動したemacs 24.4では,うまくexec-pathに$PATHを取り込めていない模様.
かたついさんの記事の通りに,exec-path-from-shell を使いましょう.

package.el等でemacsの環境にexec-path-from-shellをインストールし,inits/30-exec-path-from-shell.elを

(exec-path-from-shell-initialize)

と設定.

あとは,シェルの設定をする.bashなら.bashrcに

if [ -x "`which go`" ]; then
    export GOROOT=`go env GOROOT`
    export GOPATH=~/.go
    export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
fi

としておけば良いし,tcshなら.cshrcに

if (-x "`which go`") then
    set GOROOT=`go env GOROOT`
    set GOPATH=~/.go
    set path= ( \
        $GOROOT/bin \
        $GOPATH/bin \
        $path \
        )
endif

としておけば,ターミナルからemacsを起動した際に$PATHがexec-pathに取り込まれる.

もし,$GOPATHの実体となるディレクトリがなければ,作成する.

mkdir -p $GOPATH

gocode, godef, goimportsをインストールする

hgやgitが必要になるかもしれないので,予めインストールしておく.
MacでHomebrewを使っているなら

brew install git hg

Ubuntuでapt-getなら

sudo apt-get install hg git

godefをインストールする.

go get code.google.com/p/rog-go/exp/cmd/godef

gocodeをインストールする.

go get -u github.com/nsf/gocode

goimportsをインストールする.

go get code.google.com/p/go.tools/cmd/goimports

emacs lispの設定

emacsに auto-complete, go-mode, go-autocomplete のパッケージを追加する.
僕はemacs24系でinit-loader.el+package.elを使ってパッケージ管理をしているので,inits/20-package.el がこんな感じになっている.パッケージがなければ自動的にダウンロードし,インストールされる.
init-loader.el+package.elの詳しい使い方はかたついさんの記事を参照しましょう.

(require 'package)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)

(require 'cl)
(defvar installing-package-list
  '(
    auto-complete
    exec-path-from-shell
    gtags
    flymake
    flymake-cursor
    markdown-mode
    markdown-mode+
    python-mode
    epc
    python-environment
    jedi
    jinja2-mode
    go-mode
    go-autocomplete
    scala-mode2
    haskell-mode
    ))

(let ((not-installed (loop for x in installing-package-list
                           when (not (package-installed-p x))
                           collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
      (package-install pkg))))

auto-completeの設定をする.inits/50-auto-complete.elはこんな感じ.

(require 'auto-complete)
;(add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-20130724.1750/dict")
(require 'auto-complete-config)
(ac-config-default)
(global-auto-complete-mode t)

最後に,inits/70-go-mode.elを用意し,go-modeと補完機能を設定する.

;; go-mode
;; In advance, install godef, gocode, and goimports in $GOPATH.
;;   go get code.google.com/p/rog-go/exp/cmd/godef
;;   go get -u github.com/nsf/gocode
;;   go get code.google.com/p/go.tools/cmd/goimports
;; exec-path should include a path to .go/bin.
;; So DO NOT launch an emacs from App icon, DO launch an emacs from terminal (shell).

(autoload 'go-mode "go-mode" nil t)
(eval-after-load "go-mode" '(progn (require 'go-autocomplete)))
(add-hook 'go-mode-hook
          '(lambda()
             (setq gofmt-command "goimports")
             (add-hook 'before-save-hook 'gofmt-before-save)
             (setq c-basic-offset 4)
             (setq indent-tabs-mode t)
             (local-set-key (kbd "M-.") 'godef-jump)
             (local-set-key (kbd "C-c C-r") 'go-remove-unused-imports)
             (local-set-key (kbd "C-c i") 'go-goto-imports)
             (local-set-key (kbd "C-c d") 'godoc)
             (define-key ac-mode-map (kbd "M-TAB") 'auto-complete)))

go-modeの設定の仕方はこちらを参照しました.ありがとうございました.

完成

こんな感じで補完ができるようになったはず.
M-Tabで補完メニューが出て,M-.でカーソルのキーワードの定義にジャンプできる.便利.

a2psでソースコードをpsに変換,その後pdfに変換

たまに使うa2ps.いつもオプションを忘れてしまうのでメモ.
こちらを参考にさせて頂きました.ありがとうございました.

$ a2ps --prologue=color --line-numbers=1 input.py -o code.ps
$ ps2pdf -sPAPERSIZE=a4 code.ps output.pdf

クレジットカードが不正利用されてしまった 続き

三井住友VISAに連絡して,カードを止めてもらって,新しいカードを発行してもらった.明日には届くみたい.素早い対応でよかった.

どうやら,"GOOGLE*SEGA"に加えて,もう1件問い合わせが照会があったみたいで,そちらも不正利用と思われる.

話を聞いてみたところ,不正利用の原因はやっぱり,グローバルデータの情報流失でした.周りの同業者の皆さんが割と早い段階で不正利用の被害に遭っていて,遂に自分もかって感じです.