cpp-complt.el

C/C++言語において#からはじまる命令の補完を提供するelisp.
ヘッダファイルの入力のとき, stdio.hとかstdlib.hなどを補完できてかなり便利.
このヘッダファイルの補完は読み込みに行くディレクトリを変数に設定しておいてやればいいため, かなり柔軟にできる.
以下が簡単な設定例. まあEmacs電子書棚さんに書いてあるとおり.

(require 'cpp-complt)
(add-hook
 'c-mode-hook
 '(lambda()
    ;; C/C++ でヘッダを補完入力.
    (define-key c-mode-map "#" 'cpp-complt-instruction-completing)
    (define-key c-mode-map "\C-c#" 'cpp-complt-ifdef-region)))

#を押すとミニバッファを利用して補完がでける.
ヘッダファイルの情報を読み込み行くディレクトリを追加するならこんな感じ.

;; add gtk+-2.0 and libwnck-1.0 headers
(setq cpp-complt-standard-header-path
      '("/usr/include"
        ;; gtk+-2.0
        "/usr/include/gtk-2.0" "/usr/lib/gtk-2.0/include"
        "/usr/include/atk-1.0" "/usr/include/cairo"
        "/usr/include/pango-1.0" "/usr/include/glib-2.0"
        "/usr/lib/glib-2.0/include" "/usr/include/freetype2"
        "/usr/include/libpng12"
        ;; libwnck-1.0
        "/usr/include/libwnck-1.0"))

標準で設定されているのは, "/usr/include"のみ. gtk+-2.0とlibwnck-1.0のディレクトリを足してみた.
この場合, 補完して入力される形は, #include <...>のように不等号でくくった形になる.
cpp-complt-standard-header-pathの代わりにcpp-complt-own-header-pathを使えば, <..>の形ではなくて"..."の形で補完される.



んで, 使ってて問題に気付いたんだけど, 上のようにlibwnck-1.0を追加したのにlibwnck-1.0のヘッダが補完できない.
問題を追ってみたら分かった.

--- /tmp/cpp-complt.el	2008-05-21 00:01:02.000000000 +0900
+++ new/cpp-complt.el	2008-05-21 00:05:57.000000000 +0900
@@ -871,10 +871,12 @@
 		  (and
 		   (file-directory-p target)
 		   (file-readable-p target)))
-	    (nconc file-alist
-		   (cpp-complt-build-header-file-alist-here 
-		    (concat entry "/" (car file-list))
-		    (car file-list))))
+			;; modified by khiker
+			;; because if file-alist is nil, data is not saved!
+			(setq file-alist (nconc file-alist
+									(cpp-complt-build-header-file-alist-here
+									 (concat entry "/" (car file-list))
+									 (car file-list)))))
         (setq file-list (cdr file-list))))
     file-alist))
 

こんな感じおkなはず.
原因は, nconcのところ. 以下のようにnconcは第1引数の要素に結果を上書きするみたいなんだけど,

(let ((hoge '("a")))
  (nconc hoge '("b" "c"))
  hoge)                                 ; => ("a" "b" "c")

第1引数の値がnilだったとき, おかしくなる.

(let ((hoge nil))
  (nconc hoge '("b" "c"))
  hoge)                                 ; => nil

こんな風にhogeに値が結果が保存されてない. ちなみに, (nconc hoge '("b" "c"))のところは("b" "c")が返ってる.
よって, 第1引数の値がnilだったときもちゃんと値を保存するように, 明示的にsetq使って値を保存するようにしただけ.

更新時刻

2008年, 5月21日, 0:18