emacs設定その3

とりあえずこの辺で一段落? (gitは使い方覚えたら)
とは適宜追加する

動的文法チェックを行うflymake

とりあえずCだけ設定、それ以外も適宜設定すべし
参照したブログでMakefileを使わない方法があったのでそれを活用させていただく
すごいなこれ

http://d.hatena.ne.jp/nyaasan/20071216/p1

(require 'flymake)

(defun flymake-cc-init ()
(let* *1
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "g++" (list "-Wall" "-Wextra" "-fsyntax-only" local-file))))

(push '("\\.cpp$" flymake-cc-init) flymake-allowed-file-name-masks)

(add-hook 'c++-mode-hook
'(lambda ()
(flymake-mode t)))

あと
http://tech.kayac.com/archive/emacs.html
からカスタマイズを引用
# たまにたくさんコンパイルが走ることがあったのでチェックを止めるコマンドにもショートカットを作った

;; not use gui
(setq flymake-gui-warnings-enabled nil)

;; show error message by popup
(defun flymake-popup-err-message ()
"Display a menu with errors/warnings for current line if it has errors and/or warnings."
(interactive)
(let* *2
(line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
(menu-data (flymake-make-err-menu-data line-no line-err-info-list)))
(if menu-data
(popup-tip (mapconcat '(lambda (e) (nth 0 e))
(nth 1 menu-data)
"\n")))
))

;; keybind
(global-set-key (kbd "C-c p") 'flymake-goto-prev-error)
(global-set-key (kbd "C-c n") 'flymake-goto-next-error)
(global-set-key (kbd "C-c d") 'flymake-popup-err-message)
(global-set-key (kbd "C-c c") 'flymake-start-syntax-check)
(global-set-key (kbd "C-c q") 'flymake-stop-all-syntax-checks)

# なんか表示がくずれてるかも

あと
http://d.hatena.ne.jp/uhiaha888/20100721/1279717717
からpython用の設定を引用

;; for python
(add-hook 'python-mode-hook
(lambda ()
; Activate flymake unless buffer is a tmp buffer for the interpreter
(unless (eq buffer-file-name nil) (flymake-mode t))
))

c++で自動補完をするためのauto-complete-clangの設定

これが結構たいへんだった, 下記の方法はunixな環境専用

http://www.nomtats.com/2010/11/auto-completeelemacs.html

#
# macではデフォルトでclangが入っているのでインストールは飛ばすこと
# 変にインストールするとパスがごっちゃになって動かないです(これでハマったorz)
#

apt-get とか yum とかでパッケージあるならそれでいいと思うけど、諸事情でソースからビルド試したメモが以下に続く

まず公式サイトからllvmとclangのソースを持ってきてビルドする
# svnでtrunkからとってきても良かったんだけど、とりあえずリリースバージョンで
http://clang.llvm.org/get_started.html
llvm-3.0.tar.gzとclang-3.0.tar.gz
テキトーな所で展開、このときclangのソースをllvmのtoolsの下に配置するのがポイント
# コンパイルは結構時間掛かるので気長に待つ
# cpuがたくさんあるなら"-j"オプションで並列ビルドするといいかも

tar zxvf llvm-3.0.tar.gz
tar zxvf clang-3.0.tar.gz
mv clang-3.0.src llvm-3.0.src/tools/clang
cd llvm-3.0.src
./cofigure
make # -j2
sudo make install

auto-complete-clangではヘッダをもとに補完候補を割り出しているみたいだけど、
普通にヘッダを見に行くととても重いらしいので必要なヘッダを一つのファイルに集めてプリコンパイルヘッダを作成する
# 動作原理がさっぱりわかってない、clangのparserみたいなのがあってそれ使ってるのかな?

やり方の例は以下のサイト参照
http://d.hatena.ne.jp/whitypig/20110306/1299416655

ヘッダを作ったら以下のコマンドみたいにやる

clang -cc1 -x c++-header ./stdafx.h -emit-pch -o stdafx.pch

環境によっては"ファイルが見つからん!"とか怒られたら-vオプションつけてインクルードパスがどこを見てるか確認
足りない文は"-I"オプションで適宜追加する
# 他の環境でboostもガッチャンコできないかと思って試したけど、プリコンパイル中にエラーが出てだめだた

あとはemacsの設定を追加する

(require 'auto-complete-clang)
(defun my-ac-cc-mode-setup ()
;; pre-compiled header
(setq ac-clang-prefix-header "stdafx.pch")
(setq ac-clang-flags '("-w" "-ferror-limit" "1"))
(setq ac-sources (append '(ac-source-clang
ac-source-yasnippet
ac-source-gtags)
ac-sources)))

(add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)

ついでにauto-complete周りの設定も見直し
ちなみに全体はこんな感じ

;; load auto-complete
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/elisps/auto-complete/ac-dict")
;(ac-config-default)
(setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(global-auto-complete-mode t)

;; prevent from auto-start
(setq ac-auto-start nil)
;; delay to show help
(setq ac-quick-help-delay 0.5)
;; set TAB to trigger of auto-complete
(ac-set-trigger-key "TAB")

;(define-key global-map "\C-n" 'ac-next)
;(define-key global-map "\C-p" 'ac-previous)

;; add ac-setup for each mode
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
(add-hook 'auto-complete-mode-hook 'ac-common-setup)

;; load ac-python
(require 'ac-python)

;; load auto-complete-clang
(require 'auto-complete-clang)
(defun my-ac-cc-mode-setup ()
;; pre-compiled header
(setq ac-clang-prefix-header "~/.emacs.d/data/stdafx.pch")
(setq ac-clang-flags '("-w" "-ferror-limit" "1"))
(setq ac-sources (append '(ac-source-clang
ac-source-yasnippet
ac-source-gtags)
ac-sources)))

(add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)

雑多な設定

altとcommandの入れ替え

;; swap alt <-> command (for mac)
(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))

タブは空白に展開

;; indent-region -> ctrl+x ctrl+i
(define-key global-map (kbd "C-x C-i") 'indent-region)

*1:temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace

*2:line-no (flymake-current-line-no