2012年12月17日月曜日

Gentooでemacs+haskell環境を作る

三島Haskell無名関数の会 第一回目にて

「三島Haskell無名関数の会 第一回目」ということで静岡の富士市で行った勉強会の中で、@kzfmさんが「静岡のHaskellerはemacsを使う」というお題でemacsのhaskell環境を披露してもらった。

本題としてはemacsでhaskell環境を作るということで以下の環境を作成
  • virthualenv(Haskellの仮想環境)
  • hlint(コードチェック)
  • ghc-mod(Haskellコードの保管)
  • flymake(構文チェック)

この作業の中で感激した機能で
  • emacs-24で利用可能な「M-x list-package」というパッケージインストール機能
  • hlintでコードの書き方のチェック
  • flymakeでコード編集時の構文チェック
ということで実際に設定してみる


emacs-24のインストール

Gentooでのインストールになるので、ご注意ください、

「list-package」の機能がemacs-24からディフォルトで入っていると言うことなので、emacs-24をインストールする、自分はemacs-23だったのでemacsをアップデート
karky7 ~ # emerge -pv emacs
...
...
[ebuild   R    ] app-editors/emacs-24.2:24
karky7 ~ # emerge -u emacs

Gentooは複数のemacsを利用できるのでeselect-emacsをインストールしておく
karky7 ~ # emerge -pv app-admin/eselect-emacs

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] app-admin/eselect-emacs-1.14
..
..
karky7 ~ # emerge app-admin/eselect-emacs

emacsを切り替える、emacs-24だけインストールされているなら必要ありません
karky7 ~ # eselect emacs list
Available Emacs symlink targets:
  [1]   emacs-23 *
  [2]   emacs-24

XEmacs is also installed
karky7 ~ # eselect emacs set 2
Switching emacs to emacs-24 ...
Switching ctags to ctags-emacs-24 ...
Switching etags to etags-emacs-24 ...
karky7 ~ # eselect emacs list
Available Emacs symlink targets:
  [1]   emacs-23
  [2]   emacs-24 *

XEmacs is also installed
karky7 ~ #

旧バージョンをインストールしている人は、emacsのパッケージをアップデートしておく
karky7 ~ # emacs-updater -a all
* Searching for byte-compiled elisp files ...
* Currently selected GNU Emacs version: 24.2.1
Found php-mode.elc (compiled by Emacs 24.2.1)
Found xcscope.elc (compiled by Emacs 24.2.1)
...
...


「list-packageを」をインストールする

ロードパスの設定とpackageのarchiveの設定
;;; ロードパスの追加
(setq load-path (append
           '("~/.emacs.d"
             "~/.emacs.d/packages/emacs-jedi"
             "~/.emacs.d/packages/json-mode"
             "~/.emacs.d/auto-install"
             "~/.emacs.d/custom"
             "~/.emacs.d/conf")
           load-path))

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

これで、melpaとmarmaladeからパッケージを落とせるようになる


「list-packageを」を使ってみる

「M-x list-package」でパッケージリストを開く、開けたらお好みのパッケージを入れる事が出きるようになる。






ghc-modのインストール

Gentooはghc-modパッケージがマスクされているのでマスクを解除してemergeする
karky7 ~ # emerge -pv app-emacs/ghc-mod

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ~] dev-haskell/io-choice-0.0.2::gentoo-haskell  USE="doc hoogle -hscolour -profile {-test}" 3 kB
[ebuild  N    ~] dev-haskell/ghc-syb-utils-0.2.1.1::gentoo-haskell  USE="doc hoogle -hscolour -profile" 4 kB
[ebuild  N    ~] dev-haskell/convertible-1.0.11.1::gentoo-haskell  USE="doc hoogle -hscolour -profile {-test}" 15 kB
[ebuild  N    ~] app-emacs/ghc-mod-1.11.2::gentoo-haskell  USE="-emacs" 20 kB

...
...

karky7 ~ # emerge app-emacs/ghc-mod

続いて、「list-package」を使ってghcをインストールする、インストール方法は「C-s」でghc辺りを検索してもらえればghcが見つかると思うので、「i」のキーを押してインストールしたいパッケージを選択する。その後「x」でインストールの実行をする
  • ghc
  • haskell-mode(ちなみにemergeでもあります)


  • 「i」でパッケージを選択
  • 「x」で指定したパッケージをインストール


flymakeのインストール

上の手順と同じで以下のパッケージをインストールしていく
  • flymake
  • flymake-cursor



ghc-modの設定

編集を楽にするようにキーをバインド

キーバインド

  • 「C-j」・・・ 「->」を出力
  • 「M-j」・・・ 「=>」を出力
  • 「C-l」・・・ 「<-」を出力
(autoload 'ghc-init "ghc" nil t)
(add-hook 'haskell-mode-hook '(lambda ()
(ghc-init)
        (local-set-key "\C-j" (lambda () (interactive)(insert " -> ")))
        (local-set-key "\M-j" (lambda () (interactive)(insert " => ")))
        (local-set-key "\C-l" (lambda ()(interactive)(insert " <- ")))
            ))

これがhaskellのコードを書いてると意外にだるいので、助かる


run-haskellの起動

コードをチェックする時にghciを起動するのですが毎回:lでコードをloadするのが面倒なので、ghciの起動とファイルの読み込みを「C-c C-l」で実行出来るようにしておく
(defadvice inferior-haskell-load-file (after change-focus-after-load)
  "Change focus to GHCi window after C-c C-l command"
  (other-window 1))
(ad-activate 'inferior-haskell-load-file)


flymakeの設定

;; haskell ghc-mod
;; https://github.com/kazu-yamamoto/ghc-mod
(autoload 'ghc-init "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init) (flymake-mode)))


hlintのインストール

hlintはGentooのパッケージがあったのでそれを利用する(Maskでした)
karky7 ~ # emerge -pv hlint

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] dev-haskell/hscolour-1.19::gentoo-haskell  USE="doc -profile" 25 kB
[ebuild  N    ~] dev-haskell/haskell-src-exts-1.13.5:0/1.13.5::gentoo-haskell  USE="doc hoogle -hscolour -profile" 285 kB
[ebuild  N    ~] dev-haskell/uniplate-1.6.7::gentoo-haskell  USE="doc hoogle -hscolour -profile" 30 kB
[ebuild  N    ~] dev-haskell/hlint-1.8.35:0/1.8.35::gentoo-haskell  USE="doc hoogle -emacs -hscolour -profile" 62 kB

Total: 4 packages (4 new), Size of downloads: 401 kB
...
...

karky7 ~ # emerge hlint


haskell-modeの設定

;;; haskell-mode
(require 'haskell-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)


flymake使ってみる

適当にtest.hsなどを開いて編集してみる

cuomo@karky7 ~ $ emacs test.hs

編集でシンタックスエラーを起こすと赤でエラー部分を表示してくれる




構文を直すと、今度は宣言が無いので警告を青で表示してくれる




hlintを使ってみる

「C-c C-c」でチェックをhlintに変えるすると「doがいらないよ」と赤く表示してくれる、要するに綺麗な書き方を指導してくれる。




これで、入力補完、構文チェックがコード編集時に可能になる、これなら逝けるんじゃないか?
PHP、Pythonもこれで生きましょう (笑)


元ネタ

「静岡のHaskellerはemacsを使う @kzfm」

0 件のコメント:

コメントを投稿