imenu-generic-expression

どもです。

google test のテストケースにジャンプ

google test使ってテスト書いていて,テストが増えてきた場合にも,
ある特定のテストにジャンプしたいときが多々ございます。
はいドンッ!!
そういえば,ワンピースわけわからんくなってきているというか,読みにくくなったというか。
そんなことをだいぶ前から感じているわけであります。
まあ私はキングダムとうまるさえ読めればなんとか生きていけそうなのでよしとします。
閑話休題

(defun my-c++-mode-hook-func ()
  (interactive)
  ;; 諸々
  (push '(nil "^TEST\\(_F\\)?(\\([^)]+\\))" 2) imenu-generic-expression)

とかc++-modeのフックに突っ込めばOK。
fixtureの名前を含めるかどうか迷ったけどとりあえず含めてみて,
しばらく使って様子を見ることにします。

ヘッダファイル中でジャンプしたい

テンプレート使うとヘッダファイル中にゴリゴリと書くことがあると思います。
「ゴリゴリと書く」と書いておくとなんかコードを大量に書いている風に聞こえてかっこいいので
「ゴリゴリ」を使っていますが,実際は「ペチッ・・・ペチッペチッ・・・ふぅ」くらいです。


何が言いたいかというとヘッダファイル中に実装を書くことがどうやら結構あるらしく,
それにならって実装を書いていたのですが,imenuである関数にジャンプしようとしても,
候補にないことに気づいた次第であります。結構ショック。
なので,ここでも同様に変数imenu-generic-expressionに正規表現を突っ込みます。

(defun my-c++-mode-hook-func ()
  (interactive)
  ;; 諸々
  (push '(nil "^[ 	]*\\([[:alnum:]*]+[ 	]\\)*\\([[:alpha:]_~][[:alnum:]_:<>~]*\\)([^).]*)\\([ 	]+const\\)?[ 	]*\\([{:\n]+\\|$\\)" 2)
        imenu-generic-expression))

私のスタイルではこれで結構役をしてくれます。(この言い方は方言か?)
正規表現の最後のグループは自信ない。
「文字があるとしたら[{:\n]のどれかで,なければ行末」であってほしいとの願いを込めてみました。
すでに行末と改行がかぶっている気がするのですが・・・。


オーバーロードしてたらわけわかめ状態になると思う。
あとctor, dtorを含めるようにしてしまったので,えーとなんていうんだこういうの,
false positiveではなくて,false negative? ん? そんな言い方あるのか? わからん。
つまり,余計なものまで含めてしまいます。マクロとかマクロとかマクロとか。
チャゲアス曰く「余計なものなどないよね」だそうですが,言っている本人が
ヤクやっていたとかやっていないとかなので,それが真実かどうかはわかりませんね。


よりよくするためには,ctor, dtorとメンバ関数を分ける。さらにoperator用の正規表現も作る。
ベストはimenu-index-create-functionを作る。
けど面倒だし難しそうだしやめておきます。


さっき書いたばっかりなので使いながら修正していく予定。

以前書いたac-sourceを切り替えるやつのバグを修正

(defun my-auto-complete-toggle-source ()
  (interactive)
  (let* ((completing-functions
          (loop for source in ac-sources ;(remove 'ac-source-dictionary ac-sources)
                for candidates-func = (cdr (assoc 'candidates (symbol-value source)))
                for prefix-func = (cdr (assoc 'prefix (symbol-value source)))
                for ac-prefix = (or ac-prefix
                                    (cond
                                     ((stringp prefix-func)
                                      (let ((beg
                                             (save-excursion
                                               (if (re-search-backward prefix-func
                                                                       (line-beginning-position)
                                                                       t)
                                                   (or (match-beginning 1)
                                                       (match-beginning 0))
                                                 nil))))
                                        (when beg
                                          (buffer-substring-no-properties
                                           beg (point)))))
                                     ((and (symbolp prefix-func)
                                           (fboundp prefix-func)
                                           (funcall prefix-func))
                                      (buffer-substring-no-properties
                                       (funcall prefix-func)
                                       (point)))
                                     (t
                                      nil)))
                ;; do (message "ac-prefix=%s, source=%s, point=%d, ac-point=%s"
                ;;             ac-prefix (symbol-name source) (point) ac-point)
                when (and ac-prefix ; <-- これを追加しただけ
                          candidates-func
                          (symbolp candidates-func)
                          (fboundp candidates-func)
                          (funcall candidates-func))
                collect (intern-soft (replace-regexp-in-string "^ac-source"
                                                               "ac-complete"
                                                               (format "%s" source))))))
    (when completing-functions
      (my-auto-complete-toggle-source-1 completing-functions))))

今のところまともに動いています。
動いているのですが,切り替えた先のac-sourceで候補が1つの場合それに確定されてしまうのがちょっと困る。
例えば,ac-sources => (source1 source2 source3) として,今source1とする。
source3からの補完をしてほしいなー。
なので,トグルする。source2に切り替わったときに現在のprefixにマッチする候補が1つだけ。
するとこの候補が確定して入力される。
俺「source3に行きたかった・・・ぜ・・・orz」
そのうち直すかも。