はじめてNew Issueる

どもです。

direx-elマンセー。ありがたく使わせていただいております。


ふと気づいたのですが,direxのバッファ内で上に移動するときに,
C-uC-pとかC-8C-pとかしてもカーソルが1個しか上にいごかない。
下に移動するときには期待通りにprefix argumentを勘定に入れていごいてくれる。


ははーん。また俺の環境のせいだな。
と思いつつ,pullしてみて更新が無いことを確認してからソースを覗いてみる。
自分の環境のせいだと言いつつも最初にソースを見るあたり,根性が汚いというか,
そういうのが表れていますよね。
ちゃうちゃうちゃいまんがな。
ソースを確認してまずソースは正しいことを確認するのが一番早そうだったから
そうしたまでです。キリッ。


私の結論はというと,たぶんバグか仕様。

diff --git a/direx.el b/direx.el
index 44c3e39..cbe521d 100644
--- a/direx.el
+++ b/direx.el
@@ -700,7 +700,10 @@ mouse-2: find this node in other window"))

 (defun direx:previous-item (&optional arg)
   (interactive "p")
-  (direx:next-item (if (or (null arg) (> arg 0)) -1 1)))
+  (direx:next-item (cond
+                    ((null arg) -1)
+                    ((> arg 0) (* -1 arg))
+                    (t 1))))

 (defun direx:up-item-1 (item)
   (loop with parent = (direx:item-parent item)

prefix argでなんか渡しても,-1をdirex:next-itemに渡していると思われます。
なので,上記diffにあるようにいじってみたところ,バッチグー。
ん? 今気づいたけど,なにこの「mouse-2: findなんちゃらって」。謎いな。


でですね,さてどうしたものかと。
悩んだあげく,ええいと南無三的に本丸でissueとして報告させてもらおうと。
いらんことしてしまっていたらすいません。
そして私はissuesとして何かを報告したことがないのであーる。
ああ,globalで報告したことあるけど,githubでははじめての経験。
かなりどきどきへたれっぷり全開。


他人が読んでわかるかどうかわからんような英語だとは思いますが,英語で報告。
やっぱ英語じゃないとまずいんだよねきっと,こういうのって。
ほいで,はじめての経験なのでエントリにさせてもらいましたとさ。


よし。あとはこの報告自体が俺のissuesとして報告されないことを祈るのみだな。

※2013/10/01 (Tue) 17:57 追記

本家の方で無事,修正してもらえました。ありがとうございます。
C-uC-uC-u ありがとうございます,くらいです。はい。
些細なこととは言え,なんか貢献できた感があってうれしいぞ。
というか「-」って関数だったのか・・・。
はじめて知った,もしくは,ずっと忘れていたかのどっちか。
そしてコードが鋭ぇ。かっこいいぜ。
いい加減マクロ覚えないといかんな。
よし元気でた。

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」
そのうち直すかも。

緑と赤は正義!

どもです。
エアコンから水が垂れてくるという悪夢もこれで3度目くらい。
前面カバーを開けてドレンパンを確認しようとするも,
このエアコンの前面カバーを開けるのは無理じゃね? という結論に至って,
ゴミ袋とバケツでその場をしのいでいます。
エアコンいらないくらいの時期になったら修理を頼もうかというすごいダメっぷり。
てーかさードレンパンって何よ? drain panのことじゃね? だったらドレインパンだろうなぁ。
drain panを最初にドレンパンって言ったヤツの罪は重いぞ。

google test最強説

ぶっちゃけ他のunit test frameworkを使ったことがないし,他のframeworkが本気出してないだけかも。
けどgoogle testも「私の戦闘力は53万です」とか「私にはあと2回変身が残されています」とか
「私はまだ卍解していません」とか言いはじめて,インフレがはじまる・・・んなこたーない。


業務で使ったりする場合にはありえないかもしれませんが,
私の場合はC++の勉強していて使うくらいなので,emacs内で全部実行できたらうれしいということで,
コンパイルコマンドで,

g++ -Wall -Wextra -g tmp.cc -o tmp -lgtest -L/usr/local/lib && ./tmp

と指定して実行。その結果の一例がこれ。

テストが失敗したときには,該当箇所に飛べるように結果を出力してくれるやさしいgoogle testさんですが,
色に納得できない・・・。いやほんますんません。いたいいたいっ。ほんますんません。もう言いませんから。
ほんまにほんまに。これっきりにしますから。


しかし私は知っている。オプションで,--gtest_color=yesを与えれば色つきで出力してくれることを。
そしてこうなる。

・・・。まあそらそうですわ。シェルから実行する場合はOKだけど・・。
ソースちょっと見たら,エスケープシーケンスいけそうなら色つきで出力している感じ。
どこをいじるか? gtest側でなんちゃらPrinterっていうイベントリスナー作る?
いやいやemacs側でなんとかしないとまずいよな−,ということでググル。
ほいで解決策。

(require 'ansi-color)
(defun my-colorize-compilation-filter-hook-func ()
  (toggle-read-only -1)
  (ansi-color-apply-on-region (point-min) (point-max))
  (toggle-read-only 1))

(add-hook 'compilation-filter-hook 'my-colorize-compilation-filter-hook-func)
;; for removal
;;(remove-hook 'compilation-filter-hook 'my-colorize-compilation-filter-hook-func)

んでこうなる。いえぃいえぃいえぃ!

ちなみにansi-color.elは最初から入っていました。(NTEmacs23.2)

おまけ

初めて知ったのですが,オプション--gtest_filterを使うと実行するテストを選べて非常に便利。
ドキュメントはこの辺。
http://code.google.com/p/googletest/wiki/AdvancedGuide#Selecting_Tests

さっきの例の続きとして一例を挙げると,

g++ -Wall -Wextra -g tmp.cc -o tmp -lgtest -L/usr/local/lib && ./tmp --gtest_color=yes --gtest_filter='SomeTest.doSomething'

で,テストケースSomeTestのテストdoSomethingだけを実行。ワイルドカードも少しいける。
上で挙げたドキュメントに例が載っているので詳細はそちらで。

popwin-elのバグが直っていて大変うれしい。

どもです。

もっそい困っていた

私は,

(push '(occur-mode :noselect t :stick t) popwin:special-display-config)

して,occurバッファでもpopwinを利用させてもろてます。


M-x occur (C-c oにバインドしている)して該当行が少数で全部チェックしたいときには,
「M-g M-n」なり「M-g M-p」して全部見ます。この時には問題ナッシング。


だどもoccurバッファの中を眺めてピンポイントで移動したいときには,
移動先となる一致行にカーソル置いてC-m。以前はこれで移動できていました。
しかしpopwin-elを使い始めて以降,移動せずにバッファが閉じてまう。
バッファをもっかい出してC-mしても移動しない。バッファは閉じる。
けどもなんかのきっかけでEnterだと移動してくることもまれにある。
それでも10回中に8,9回は移動できない。これは不便でしゃーなかった。


で,さっきふと思い立ってpopwin-elをpullしてevalしてみたら,治っていた!
いやっほい!
これはかなり困っていたのですが,どうせ私の環境のせいだろうとあきらめていました。
しかし今回治っていたので,それはもううれしくて感謝の気持ちでいっぱいです。
ありがとうございます。


つまり,うれしくてテンション上がってエントリにしてしまったということです。はい。

このディレクトリ内の画像一覧みたいなー。チラッチラッ。

どもです。


htmlの勉強していてimagesディレクトリ内の画像ファイルを一覧で見たい!!
なんていう時が頻繁にございます。それは私だけではないはず。
皆様はどうしてはります?


今までは面倒臭くて,NTEmacsからshell-popでshellに飛んで,

% start foo.gif

みたいなことやっていたんですが,これだとWindowsの画像ビューアが立ち上がる。
まあ設定でどないにでもできるんでしょうけど。


しかし目的はあくまでも複数のエロ画像ファイルの一覧
なわけでして,これだと目的達成度半分くらい。


なので次にやっていたのは,irfanviewを立ち上げて,画像フォルダをドラッグアンドドロップ
まあ,ビューアとしても動いてしまってフォルダ内の最初の画像ファイルが表示されはしますが,
一応サムネイル一覧としても表示してくれます。
少々不満はありますが,目的達成度80%くらいでしょうか?


おや? 今回はもったいぶりますね〜。


んで,一々irfanviewを立ち上げフォルダをドラッグするのも億劫になってきた今日この頃。
どっこいしょと重い腰を上げて,実際にはくそ重い体は動かさず指先を動かして,
irfanviewのhelpファイルを見てみたらcommand line optionsという項を発見!!
うほ。

ちゅうわけで,シェルスクリプトを書いてシェルからの立ち上げに成功。
また作業が楽になってまうわー。
はいどすん!

#!/bin/bash

# irfanview へのパス。各自で要変更
EXE="e:/tools/iview425j/i_view32.exe"

if [ ! -d "$1" ]; then
    echo "Usage: `basename ${0}` [directory]";
    exit 0;
fi

"$EXE" `cygpath -aw "$1"` /thumbs &

これをiviewとして保存して,パスが通っているディレクトリに放り込めばOK。
わたしは ~/bin に放り込みました。
これで,

% iview ../../images

とすれば,irfanview が立ち上がり,../../images ディレクトリ内の画像ファイルが
サムネイル一覧として表示される!!
cygpath使っているのでcygwin必須ですね。
今書いたばっかりなのでどっかバグってると思う。使いながらぼちぼち見つけていきます。

まとめ
  • 誰得俺得マジ俺得。
  • あれ? エクスプローラの設定でサムネイル表示をしている人はimagesフォルダを開けばいいだけじゃね?

久しぶりにgmailを見てみた

どもです。


愛用のBeckyでgmailにくるメールを見られなくなってどのくらい経ったのか・・・。
久しぶりにwhitypigのアカウントでログインしてメールみたら,
大事そうなメールも来ていてちょっと怖い。
github関係で言うとコミット権限やるからマージする? とか,メンテナのお誘い? とか。。。
当然メールが来たのは数ヶ月前。いやもっと前だったかも。
たぶんgmailの仕様変更以来見ていなかったはず。
あーこわいこわい。
よし。見ていないことにしよう。
自分のコミュ障っぷりが情けないぜ。


関係ないけどEK芯の0.5は使いものにならんのかなー。
もうちょっと粘ってみるか。
低粘度インクだけにね。

htmlの勉強用に便利だぜ

どもです。
実家に帰った際に小学4年生の姪っ子に麻雀なんて教えてませんよ。
教えたその日,というか手積み2,3回目にしてしっかり手積みができるようになって,
すさまじいポテンシャルを垣間見たとかなんてことはありませんよ。
みんな心配しすぎだってばよ。
久しぶりに牌を握ったけどやっぱたまらんものがあるぜ!

さて。

htmlのお勉強をしているのですが,ある程度マークアップしてから,
「あーやっぱこのへんをdivりたいなーとか,やっぱtableにして,この辺をtrからのthしたいなー」
なんてことがちょいちょいあるんですが,この作業がだりー。
いくらnxml-modeのelectric-slashによる補助があってもめんどくせー。
リージョン指定して,このリージョンを<div></div>するとか,<tr><th></th></tr>するとか
できるのはどっかにあるだろうと,aproposから^nxmlして一通りチラ見したけどそれらしきものを見つけられなかった。

なので書いてみた。

(defun my-nxml-mode-entag-region (start end)
  (interactive "r")
  (let* ((tag (split-string (read-from-minibuffer "Tag: ") "[ ,]" t))
         (start-tag (mapconcat (lambda (s)
                                 (concat "<" s ">"))
                               tag ""))
         (end-tag (mapconcat (lambda (s)
                               (concat "</" s ">"))
                             (reverse tag) ""))
         ;; skip leading whitespaces
         (start2 (or (progn (goto-char start)
                            (when (string-match "[ \t]" (make-string 1 (char-after)))
                              (goto-char start)
                              (back-to-indentation)
                              (point)))
                     start))
         ;; skip backward trailing whitespaces
         (end2 (save-excursion
                 (goto-char end)
                 (if (re-search-backward "[^ \t\n\r]" nil t)
                     (1+ (point))
                   end)))
         ;; region to be replaced with new-region
         (region (and (< start2 end2) (buffer-substring start2 end2)))
         ;; and new-region
         (new-region (and (< start2 end2)
                          (concat start-tag
                                  region
                                  end-tag))))
    (when (< start2 end2)
      (kill-region start2 end2)
      (goto-char start2)
      (insert new-region)
      (goto-char start2))))
使い方的なもの

リージョン指定して,M-x my-nxml-mode-entag-region すると,
「Tag: 」とミニバッファに出るので,タグ名をスペースまたはカンマ区切りで入力します。
んで,ウマー!!

;; 例
;; リージョンを選択(選択とはいわんのか?)して・・・
;; リージョン内に「if i say im not a region, what would you call me?」とします。
M-x my-nxml-mode-entag-region [RET]
Tag: span [RET]
;; さっきのリージョンが
;; <span>if i say im not a region, what would you call me?</span>
;; となります。

私は,

(defun my-nxml-mode-hook-func ()
  (interactive)
  ;; たくさんあるので略
  (define-key nxml-mode-map (kbd "C-c C-e") 'my-nxml-mode-entag-region)
  (auto-complete-mode t)
  )

として,C-c C-e にバインドして使っています。entag の e ね,ちなみに。

結論
  • もっとずっと高機能で便利な物があるはずなのでそれを探して使うのがいいと思います。
  • mapconcatを初めて知った。
    • 今まではmapcarしてreduceしてきたが,mapconcatが出てきてreduceたん涙目w
    • けど僕はreduceたんと一生付き合っていくつもりです!