昔の最近の出来事(2013.11)

2013/11/30

起きたら午後もいい時間。寝すぎ。

gdcのDMD2.064対応が来た模様。 ただ、「Update to 2.064 development snapshot 09/13」というのは リリース前の2.064という事なのかしら?まだ次があるのかも。

そういや先日リリースされたPOV-Rayですが、 以前、巨大画像をレンダリング したときはメモリのアクセス違反で動かなかったのがリリース版ではどうだろう? と試してみたり。結果から言うとウインドウで画像表示を行うとやっぱり アクセス違反でずっこけたり。で、 -Dオプションで画像表示をやめるといけたり。実は前のも画像表示を行わなければ 大丈夫だったのかも知れませんが。で、64000x48000というサイズで レンダリングしてみましたが一応いけました。ただ、レンダリング結果は 一旦全てメモリに保持されるようなので、このサイズだと11GBは必要になります。 POV-Rayは基本的に画面の上からレンダリングしているので、レンダリングし終わった スキャンラインから順次ファイルに書き出して、書き終えた分から捨ててしまって 構わないのですが、そういう仕掛けにはなっていないようです。

Mitsubaの新しいのが 出ているのに気づいたり。

2013/11/29

気持ち早めに帰着。

「おもひでぽろぽろ。」を観たり。久しぶりに観た気がしますが、 なんか最後まで観てしまいます。

あまりの眠さに急速停止。

2013/11/28

早くも無く遅くも無く。

先日のコンパイルエラーを直したり。と言っても一部をr416のように 戻すという方法ですが。

2013/11/27

気持ち早めに帰着。

D言語のWindowsAPIバインディングのr424を手持ちのr416ベースのと マージしてみたり。ハンドラ系のaliasが少し変わっててDMD2.062ベースの gdcではコンパイルエラーするようになっていたり。

2013/11/26

早くも無く遅くも無く。

ちょろり調べ事をして終了。

2013/11/25

早くも無く遅くも無く。あと10分遅かったら大荒れの中を帰るハメになる所でした。

GDCに差分が大量コミットされていたので2.064対応か?と思ったら 違うらしい(^^;

2013/11/24

AM中に起床。

手持ちのD言語コードの中に、HelloWorldを表示するWinAPIテストコードが あるのですが、ふとW系APIなら何語でもいけるのかしら?と 思い試してみたり。

[多国語ソース] [多国語表示]

ソースの方はGoogle翻訳で「こんにちは世界」を各国語に翻訳したものを Emacsにコピペしただけです。 で、結果は タイ語と韓国語(ハングル文字)は豆腐になったり。そもそも文字として グリフが無ければ表示できない訳ですが、そういうのを自動で処理 してくれるのかと思ってました。 じゃぁどうやれば良いか?と思い少し調べてみたのですが、調べ方が 悪いせいか解決方法は判りませんでした。 各国文字を混在してエディットできる時点でEmacsは良くできてるなぁと 思うと同時に、表示が簡単にできない時点で各国語対応って大変だなぁと 思いました。

Fedora19のソフトウェアアップデートを行っていたら、Wings1.5.1の64bit っていうのが入ろうとしていて、あれ?1.5シリーズが出てたの?と気づいたり。 いつの間にかURLが変わっていた為、しばらくページをチェックできてません でした(^^;(現在のWings3Dのページはこちら)。 Windows向けにも64bitバイナリが提供されました。 で、早速使ってみたり。結論から言うと、以前 自力で64bitビルドを試してみた時と同じレベル。 一応erlの起動オプションには-smp enableが指定されているようなのですが、 マルチスレッドで動作している感じがしないので、巨大ポリゴンの編集は重すぎて 操作がままならない感じ。また、1500万ポリゴンのAsianDragon(WavefrontOBJファイル) も読み込みに失敗するという感じでした。

でも、GitHubで開発が続けられているのに1.4.1以降、2年ほどリリースされていなかったので、 安定版として適当にリリースしてくれないかなぁ?と 思っていた所でした。良いと思います。

2013/11/23

AM中に起床。ちょろり休出。

7zipアーカイブの生成や展開に7-Zip を使用しているのですが、 7z形式以外にも色々なアーカイブに対応しているので重宝しています。 で、何気に気づいたのですが、7-ZipのGUIファイラーでディレクトリ のサイズが、そのディレクトリの下に含まれるファイルサイズ合計を 示しています。この手のファイラーだとディレクトリは 容量が0と表示されて情報が無いのと同じに感じる所なのですが、 7-Zipのそれだと展開するのにどれくらいの空きディスク容量 が必要なのかが一目で判るのが便利です。例えばバックアップを7zで サブディレクトリ含めて丸ごと圧縮してあった場合、一部をリストア したい時の容量確認が簡単で良いと思います。

2013/11/22

日付け越え。

Web巡回して終了。

2013/11/21

早くも無く遅くも無く。

なんとなくNetHackをコンパイルしてみたり。

2013/11/20

早くも無く遅くも無く。

ちょろりコーディング。

2013/11/19

早くも無く遅くも無く。

ちょろりコーディング。

2013/11/18

早くも無く遅くも無く。

ちょろりコーディング。flymakeのおかげで文法エラーのほとんどを コーディング時に潰す事ができて捗ります。

2013/11/17

AM中に起床。

zlc.elのバグ修正コードを更にリファイン。

*** zlc.el.orig 2013-11-12 01:59:32.104360700 +0900
--- zlc.el      2013-11-17 12:37:40.106577700 +0900
***************
*** 156,167 ****
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              ;; sometimes (get-text-property 0 'face str) does not work...
!              (from (case (cadr (text-properties-at 0 str))
!                      ('completions-common-part
!                       (or (next-property-change 0 str)
!                           (length str)))
!                      (t 0))))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise
--- 156,168 ----
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              (from (let ((search-diff
!                           (lambda (n str)
!                             (let ((atch (cadr (text-properties-at n str))))
!                               (if (not (eq atch nil))
!                                   (if (eq atch 'completions-common-part) (1+ n) n)
!                                 (if (> n 0) (funcall search-diff (1- n) str) 0))))))
!                      (funcall search-diff (1- (length str)) str) )))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise

先日のコードでは再帰ループの為に関数定義が必要になった訳ですが、 defunでグローバル関数となっていたのがイマイチに思ったので ローカル関数化してみました。しかし、lambdaでローカル関数定義すると 関数呼び出しの為にfuncallという関数を使わなくてはならないらしく、 関数呼び出しの手続きに一貫性が無くなっている点が、逆にイマイチな 気がしたりも。

whitespace-modeというマイナーモード。素の設定だと色々可視化されて 表示がうるさいのですが、こちら のサイトで無駄な空白だけを目立たせる設定を知ったり。 ただ、tableモードと相性が悪く、table-recognizeしても 有効な箇所のハイライト が行われなくなりました。あと、global-whitespace-modeを設定すると、 色々と影響がありすぎる為、find-file-hookを使って、ファイルを開いた時に ローカルのwhitespace-modeを有効にするようにしてみたり。 これでもtableモードではハイライトが行われないのですが、その時だけ whitespace-modeをdisableにする事で対応する感じに。 whitespace-modeの設定がtableに干渉する原因を取り払うのが一番面倒 臭くなくて良いのですが、ちょっと見た所では原因がよく判りませんでした。

2013/11/16

AM中に起床。

zlc.elのバグを直してみたり。ダーティーハックにもほどがあるような 直し方ですが次のような感じにしてみました。

*** zlc.el.orig 2013-11-12 01:59:32.104360700 +0900
--- zlc.el      2013-11-16 13:29:45.147259900 +0900
***************
*** 156,167 ****
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              ;; sometimes (get-text-property 0 'face str) does not work...
!              (from (case (cadr (text-properties-at 0 str))
!                      ('completions-common-part
!                       (or (next-property-change 0 str)
!                           (length str)))
!                      (t 0))))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise
--- 156,175 ----
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              (from (let ((__loopcount 0)
!                          (atch "")
!                          (_pos 0))
!                      (setq __loopcount (1- (length str)))
!                      (while (>= __loopcount 0)
!                        (setq atch (cadr (text-properties-at __loopcount str)))
!                        (if (not (string= (format "%s" atch) "nil" ))
!                            (progn
!                              (if (string= (format "%s" atch) "completions-common-part")
!                                  (setq _pos (1+ __loopcount))
!                                (setq _pos __loopcount))
!                              (setq __loopcount -1)))
!                        (setq __loopcount (1- __loopcount)))
!                      _pos)))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise

もっとエレガントな記述ができるのかも知れませんがLISP脳になっていないTANEには これが精一杯(^^;

変数strは補完候補の一つが入っている文字列型の変数です。実際に困る動きをする ケースでは、次のような文字列変数が渡されてきます。

#("aaaaabbbb1" 0 5 (face completions-common-part)
               5 9 (face completions-common-part font-lock-face completions-first-difference)
               9 10 (font-lock-face completions-first-difference))

0から数えて 9文字目の1が他に候補があるという事で、 「completions-first-difference」という属性になっているのですが、 何故か5文字目にもcompletions-first-differenceの属性が含まれています。 この為、元のコードでは 0文字目がcompletions-common-part属性ならば、 (next-property-change)を使ってcompletions-common-part属性じゃなくなる文字位置 を探しているのですが、5文字目に含まれるcompletions-first-difference属性が 邪魔して、9文字目ではなく5文字目の位置が得られていました。これが余計な 文字を補完してしまう直接の原因でした。
そこで、文字列の後ろから属性を調べていき、nilじゃなければそこで何かしらの 属性が入っているので、その属性がcompletions-common-partならば1文字足して 位置調節、そうでなければcompletions-first-differenceであると見なしてその位置 を返すようにしてみました。
少なくとも、先日の再現手順で起こっていたバグについては 回避できました。少し使って様子を見てみよう。

ニュース番組で「くまモン」の報道があったのですが、その時の発音が良く聞く それと違っていたので、あれ?っと思ったり。Webで検索してみたところ、 このようなページ がありました。あれ?っと思ったのはこのページで言うところの「平坦アクセント」 で発音していたから。
そういや、Perfumeも、最近は「ぱふゅーむ」の'ぱ'アクセントが 普通になってますが。TVで盛んに出るようになった頃、'ふゅ'にアクセントを付ける 発音もされていました(公式には'ぱ'にアクセントを付けるのが正解らしいです。 以前のWikipediaには発音に触れた文言があったのですが今は無くなっているようです)。
くまモンもそのうち平坦アクセントが標準になるのでしょうか?

そういや、以前、Emacsのartist-modeで スプレー缶という描画ツールの、太さを変えるバインドを追加したのですが、 何も言わずに設定を変える感じになっているのがイマイチに思いました。 で、以下のようにしてみたり。

(load-library "artist.el")
(define-key artist-mode-map [?\C-1] '(lambda () "" (interactive) (setq artist-spray-radius 1) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-2] '(lambda () "" (interactive) (setq artist-spray-radius 2) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-3] '(lambda () "" (interactive) (setq artist-spray-radius 3) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-4] '(lambda () "" (interactive) (setq artist-spray-radius 4) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-5] '(lambda () "" (interactive) (setq artist-spray-radius 5) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-6] '(lambda () "" (interactive) (setq artist-spray-radius 6) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-7] '(lambda () "" (interactive) (setq artist-spray-radius 7) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map [?\C-8] '(lambda () "" (interactive) (setq artist-spray-radius 8) (message "spray-radisu %s" artist-spray-radius)))
(define-key artist-mode-map "\C-c\C-a\C-v" '(lambda () "" (interactive) (setq artist-spray-chars (reverse artist-spray-chars)) (let ((msg (format "spray-chars ["))) (dolist (ch artist-spray-chars) (setq msg (concat msg (format "%s" (char-to-string ch))))) (message "%s" (concat msg "]")))))

最後のパターンを反転させるのは、パターンが文字列のリストで入っている訳では なかったので、反転自体は(reverse ..)で簡単にできているのに、メッセージ表示は ちょっと面倒臭い感じになってます。

zlc.elの修正コードを少しリファインしてみたり。

*** zlc.el.orig 2013-11-12 01:59:32.104360700 +0900
--- zlc.el      2013-11-17 02:26:19.681024900 +0900
***************
*** 156,167 ****
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              ;; sometimes (get-text-property 0 'face str) does not work...
!              (from (case (cadr (text-properties-at 0 str))
!                      ('completions-common-part
!                       (or (next-property-change 0 str)
!                           (length str)))
!                      (t 0))))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise
--- 156,168 ----
        ;; select next completion
        (let* ((cand (zlc--current-candidate))
               (str (if (consp cand) (car cand) cand))
!              (from (let ()
!                      (defun zlc--search-diff (n str)
!                        (let ((atch (cadr (text-properties-at n str))))
!                          (if (not (eq atch nil))
!                              (if (eq atch 'completions-common-part) (1+ n) n)
!                            (if (> n 0) (zlc--search-diff (1- n) str) 0))))
!                      (zlc--search-diff (1- (length str)) str) )))
          (insert (substring str from))
          (zlc--highlight-nth-completion zlc--index))
      ;; otherwise

関数定義して再帰でループを回すようにしてみました。ループ変数や一時置き の変数が減ったのですが、慣れていないと パっと見でどういう動きをするのかよく 判らなくなったような気がしたりも(^^;

2013/11/15

気持ち早めに帰着。

あまりの眠さに急速停止。

2013/11/14

気持ち遅めに帰着。

zlc.elの挙動を調べたり。 (display-completion-list)で補完候補の文字列リストを得て、 各文字列には属性が付いているのですが、この属性の付け方が なんだか謎な感じ。 属性にはcompletions-common-partとcompletions-first-differenceが あるようで、単純にcompletions-first-differenceな文字位置を 使えば良さそうに思ったのですが、何故かcompletions-first-differenceが 複数ある場合があり、その時にバグった表示になっている模様。 何故、複数のcompletions-first-differenceが存在するのかは不明。うーむ。

2013/11/13

気持ち早めに帰着。

zlc.elの挙動が変なのを調べたり。 例えば次のようなパターンで変になるような気が。

  1. 次のようなファイル群があったとします。
    $ ls /tmp/zlc_test/
    aaaaa  aaaaabbbb1  aaaaabbbb2
        
  2. C-x C-f後、/tmp/zlc_test/ まで手で入力した所で TABを押すと、 候補窓が開くと共に minibufferには /tmp/zlc_test/aaaaa が補完されます。
  3. TABを2回押すとaaaaabbbb1が選択され、minibufferには /tmp/zlc_test/aaaaabbbb1 が補完されます。
  4. バックスペースで/tmp/zlc_test/aaaaabまで削った後、TABを押すと候補窓が閉じると共に minibufferには /tmp/zlc_test/aaaaabbbb が補完されます。
  5. TABを押すと候補窓が開き、もう一度TABを押すと aaaaabbbb1が選択されるのですが、 minibufferには何故か /tmp/zlc_test/aaaaabbbbbbbb1 が補完されます。

4.で文字を削ったところで、TABを押すとzlcの外枠で補完されているにも関わらず、 それが認識されていなくてzlcで重ねて補完した結果、余計に文字が足されてしまって いる結果になっているのかな?なんとなく4.で補完した所で、zlcでの補完文字数を再計算すれば 良い気がしますが、どうやって直せば良いのかが良くわからず(^^;

どうやら、(zlc--current-candidate)で得られるcons-cellの中に、 マッチに関する情報がいくつか入る場合があるようなのですが、そのうちの 一つの情報だけで追加する文字数を決定しているようです。 複数ある情報のうち後ろのものが有効な場合に、バグった 補完が行われてしまうという感じ。でもどう直せば良いかはやっぱり よく判らず。

2013/11/12

気持ち遅めに帰着。

先日のzlc。例えば C-x C-f でhomeディレクトリからいくつかディレクトリ を潜ってファイルを開く場合、TAB TABでzlcの候補選択に移行するので、 目的のディレクトリを選択する訳ですが、このディレクトリの下に潜りたい 場合に、はて?どうしたもんかと思ったり。というのも、TABはzlcの候補 選択に使用されてしまっている為、ディレクトリに潜るという操作には 使えなくなっています。そんな訳でイマイチいけそうでいけてない感じに。

そういや zshってどうなってるんだっけ?と思いインストールして調べて みた所、TABで候補選択に移行するのですが、'/'を押す事で選択を確定 するような動きになっていた為、zlcもそうなっているのかもと思い試して みたところ、「hoge//」と'/'が入力通りに入った上に、ルートディレクトリ 直下のファイル群が選択候補になってしまいうまくない感じに。

そんな訳で、次のようなバインドを追加してみたり。

(let ((map minibuffer-local-map))
  (define-key map (kbd "/")
    '(lambda () "" (interactive)
       (if (string= (char-to-string (char-before (point))) "/")
           (minibuffer-complete)
         (insert "/"))))
  )

'/'を押した時、カーソル位置の手前の文字が'/'ならばディレクトリと見なして (minibuffer-complete)を実行。'/'じゃなければ'/'文字そのものを挿入します。 最初、単純に'/'を押したら(minibuffer-complete)を実行するようにして、なんとなく よさげな感じになったと思ったのですが、ルートディレクトリの指定ができない事に 気づいて上記のような形に落ち着いたという感じ。

ただ、zlcが少々バグっているようで、候補をミニバッファに写す時に うまく文字が入らない場合があるようです。

2013/11/11

気持ち遅めに帰着。

ちょろりコーディング。思い出すだけで終了。

先日、小菊を入れてfind-file(C-x C-f)にmigemoを使えるようにしてみたのですが、 ふと次のような場合にどうなるんだろう?と思い試してみたり。

$ ls
橋.txt  端.txt  箸.txt

というようなファイルがあった時どのように補完されるか?..........結果。どれも選べず(^^;

zshライクにファイル候補をインクリメンタルに表示するようなの無いかしら? と思い検索してみたところ、「zlc.el」 なるそのものズバリなEmacsLispの存在を知り入れてみたり。githubやソースコードの説明にあるように、

(require 'zlc)
(zlc-mode t)

てな感じで「(zlc-mode t)」を入れておかないと有効にならない点に注意が必要なようです。
ただし、小菊との相性は微妙。むしろzlcがあれば小菊の出番は無いかも知れません(^^;

2013/11/10

昼過ぎ起床。

Emacsでfind-file(C-x C-f)でファイルを開く時、日本語文字を含んだファイルを開こうと すると途中でIMEを起動しなくてはならないのが少々面倒臭いと感じる事が あります。migemoを使ったfind-fileって無いか?と思いWebを検索をしたところ、 「小菊」というそのものズバリな EmacsLispを知ったり。早速入れてみた所、良い感じにローマ字入力だけで日本語文字名の ファイルを開く事ができるようになりました。

で、もう一つ。Fedoraに日本語文字名のファイルを置いてTRAMPでリモート接続すると ファイル名が化けるという問題がありました。これも、

(require 'tramp)
(require 'tramp-sh)

(let ((process-environment tramp-remote-process-environment))
  (setenv "LC_ALL" nil)
  (setq tramp-remote-process-environment process-environment))

というのを.emacs(オールドスタイルですみません)に追加する事でdired表示 で日本語文字が化ける事も無くなり 開く事もできるようになったのですが、 何やら動きが変になったり。

TRAMPの動きが変というのは、まだパスワードを聞かれていない状態から 「/ssh:user@hostname:/...」と入力したところでRETキーを入力した所、 何故かパスワードを聞く前に何かしらパスワード文字列を送ってしまって、timeout で接続に失敗します。パスをRETで確定する前にTABでファイル名補完を 行えば、同様にtimeoutにはなるものの、再問い合わせでパスワード自体は入力できる為、 接続する事はできます。何よりも、必ずtimeoutするまで1分ほど待たされるのが イマイチな感じになってしまいました。で、原因を探ってみると、先に入れた 小菊との相性が悪いらしく、小菊を外せばTRAMPの動作は正常に戻りました。

小菊の補完やらmigemo起動がTRAMPのパスワード入力の邪魔をしている んじゃないかという推測。でも、「emacs 小菊 tramp」を2005年以降の フィルタで検索しても、2件しか引っかからず。

どうやら、(setq kogiku-use-advocate nil)てのを.emacsに追加すれば大丈夫みたい。 どういうモードなのかイマイチよく判りませんが、TRAMP越しに例えば 「/ssh:use@hostname:/hoge/fuga/」を入力後、TABでファイル一覧を期待すると パスワードの問い合わせにつっかかる事無く反応でき、その後の日本語文字ファイル名 のmigemo補完もちゃんと効きました。なんで初期値が問題の出る方に倒れているのかは不明。

そういえば、以前/ssh:接続してもリモートファイルの読み込みが /scp:接続と同じ程度に高速になってるのに気づいたのですが、油断するとそのまま のノリでリモートファイルへの書き込みの方を試してしまい、死ぬほど時間がかかる 罠にハマります。 tramp-sh.elという標準EmacsLispの中に、ファイルがあるサイズ以上になると いわゆるout-of-the-bandな転送メソッド(scpなど)を使って転送する仕組みが あるらしいのを知ったのですが切り替わる気配無し。

2013/11/09

寒さでAM中に起床。

そういやDMDの2.064.2が来ています。gdcに来るのは少し先かな?

Fedoraでgdcをビルドしてみたり。現時点のmasterをビルドしてみたのですが、 コンパイルエラーでビルドに失敗。gcc-4.9-20131103というスナップショットを 使ったのですが新し過ぎたみたい。gcc-4.9-20131013のスナップショットを 使えばビルド成功。

Fedora19のscreenコマンド。ウインドウタイトルが勝手にbashのPROMPT_COMMANDと同じ ものに更新されたり。:titleで変えても勝手に書き換わってしまい、 なんかバグってるんじゃないかと思ったり。 少し調べてみたところ、そういう機能がscreenにはあったらしい。Cygwinのscreenも バージョンは同じだったのですが、PROMPT_COMMANDを設定していないので全く気づきませんでした。 Fedoraの方では .bashrcで /etc/bashrcを吸い込んでいたので、 そこで設定されているようです。/etc/bashrcを吸い込まないようにしても良いの ですが、.bashrcに「export PROMPT_COMMAND=」を追加して対応したり。

2013/11/08

遅めに帰着。

flymake。Makefileの書き方でもっと良い方法を知ったので書き換えてみたり。

$ cat Makefile
BINPATH =
CC      = $(BINPATH)gcc
CFLAGS  = -O2
DC      = $(BINPATH)gdc
DFLAGS  = -O2

%:%.c
        $(CC) $(CFLAGS) $< -o $@

%:%.d
        $(DC) $(DFLAGS) $< -o $@


.PHONY: check-syntax
check-syntax: $(addsuffix -check-syntax,$(CHK_SOURCES))

%.c-check-syntax:
        $(CC) $(CFLAGS) -fsyntax-only $(CHK_SOURCES)

%.d-check-syntax:
        $(DC) $(DFLAGS) -fsyntax-only $(CHK_SOURCES)

ルールを増やすと、if文の入れ子が増える問題(elseifが無い為)が 解消されました。

ついにPOV-Rayの3.7がリリースされました。 以前予想した通り、秋のリリース になりました。ソースコードはgithubにも 登録されているようです。 それにしても3.7はものすごく難産だったのですが理由は何だったのかしら?

2013/11/07

遅めに帰着。

flymake。結局、次のようにしてみました。
簡単な単体ファイルのソースでもMakefileを使うようにしてみました。 そして、言語毎にルールをif文で分けるようにした結果が次のような Makefile。

$ cat Makefile
BINPATH =
CC      = $(BINPATH)gcc
CFLAGS  = -O2
DC      = $(BINPATH)gdc
DFLAGS  = -O2

%:%.c
        $(CC) $(CFLAGS) $< -o $@

%:%.d
        $(DC) $(DFLAGS) $< -o $@

.PHONY: check-syntax
check-syntax:
ifeq ($(suffix $(CHK_SOURCES)),.c)
        $(CC) $(CFLAGS) -fsyntax-only $(CHK_SOURCES)
else
ifeq ($(suffix $(CHK_SOURCES)),.d)
        $(DC) $(DFLAGS) -fsyntax-only $(CHK_SOURCES)
endif
endif

flymake用のcheck-syntaxは拡張子によってコンパイラを切り替えてます。 foo.cやfoo.dからfoo.exeを作るルールは普通に書いてあるという感じ。 あと、PATHの通ったコンパイラでは無く、例えば/usr/local/hoge/binのコンパイラ を使用したい場合は「make BINPATH=/usr/local/hoge/bin/ foo」てな 感じに指定します(最後が'/'で終わるのがポイント)。

そして、.emacs(オールドスタイルですみません)は次のようなのを追加してみたり。

(require 'flymake)

(defun flymake-get-make-cmdline (source base-dir)
  (list "make"
        (list "-s"
              "-C"
              base-dir
              (concat "CHK_SOURCES=" source)
              "SYNTAX_CHECK_MODE=1"
              "BINPATH=/usr/local/hoge/bin/"
              "check-syntax")))

(push '(".+\\.d$" flymake-simple-make-init) flymake-allowed-file-name-masks)
(add-hook 'd-mode-hook
          '(lambda ()
             (flymake-mode t)))

(push '(".+\\.c$" flymake-simple-make-init) flymake-allowed-file-name-masks)
(add-hook 'c-mode-hook
          '(lambda ()
             (flymake-mode t)))

flymake-get-make-cmdlineという関数はflymake.elの中で定義しているものを オーバーライドしてBINPATH指定を追加しています。 拡張子に対応したhookは flymake-simple-make-initを使う事になります。

ソースファイルと同じディレクトリにMakefileが存在すればflymake-simple-make-initで、 Makefileが存在しなければ自前ハンドラを使用するようにできれば、単体ファイル用に いちいちMakefileを用意する必要は無いところだと思うのですが、 まぁその辺は事情に合わせて対応するという事で。

で、ちょっとだけ使ってみたり。........ヤダこれ、ステキすぎる!

2013/11/06

遅めに帰着。

flymake。先日の文法チェック結果がイマイチな原因判明。 Cygwinパッケージに含まれる超古いgdcを使って文法チェックを行っていた為。 autoやforeachがダメに見えていたのですが、実際には変数の宣言でエラーしていた のが行全体にかかって見えていただけでした。
少し困ったのが、普段はCygwinのgccが使えるようにしてあって、mingw-gdcを使う時 だけパスを通してそのシェル内だけはmingw-gdcとmingw-gccを使えるように してあるのですが、文法チェックを通すには常にmingw-gdcが使える状態に しておかなくてはなりません。gdcをフルパスで実行するようにしてみたのですが、 それを.emacsに書くのはイマイチです。また、-Iでインクルードパスを指定する ような場合は、その指定がどのソースに対しても常に有効とは限りません。 Makefileに flymake用のcheck-syntaxというターゲットをいい感じに書くのが 良い気がしてみたり。
あと、D言語とC言語の両方のソースが存在するとき、言語に応じた コンパイラを選択させるにはcheck-syntexをどう書けば良いのかしら?

2013/11/05

遅めに帰着。

調べ事をして終了。

2013/11/04

昼前起床。

暇つぶしにEmacsから起動できる音楽プレイヤーである mpg123.el というのを入れてみたり。再生自体は外部コマンド で行うので、mpg123とogg123をCygwinでビルドしていインストール。 でも、mpg123の方はオーディオ出力ができなくてエラーするバイナリ になったり。コンパイル済み実行ファイルを使ってみるもCygwinから 渡すファイルパスルールと合わない為かうまく動作できず。 ogg123の方はひとまず動作するものができたのでそちらだけで我慢する事に。

ちょろりコーディング。

2013/11/03

AM中に起床。

先日アップグレードしたFedora19で何気にEmacsを立ち上げて、 image-diredを実行してみたら、何やらサムネイルのカーソル移動がバグって いたり。あれぇ?と思い、Cygwinの emacs-w32でもimage-diredを実行 してみたら同様にカーソル移動がバグっていたり。 具体的にはサムネイルバッファを開いた直後は正常にカーソル移動できる のですが、一つ画像を開くとその後のカーソル移動がおかしくなって、 先頭と最後のサムネイルしか選択できなくなる感じに。

で、たまたまEmacsのbzrリポジトリのtrunkをbzr branchしていたので、 lisp/image-dired.elを入れ替えてみたところ大丈夫な感じだったり。 まぁ、今まで気づかなかったくらいなので普段使っていないのがバレバレ ですが(^^;

flymakeというEmacsのモードを試してみたり。プログラムを編集しながら リアルタイムに文法チェックできるというすばらしいモードで、D言語 にも対応しているらしいのですが、手持ちコードをいくつか開いてみたところ、 文法的に間違いの無い箇所をエラーとして認識していてイマイチ 使えない感じだったり。

[Emacs flymake-mode with D-language]

ちょっとだけ見たところ、


など。他にもあるかも知れません。とにかく、HelloWorldレベルをちょっと 越えた範囲で使おうとすると真っ赤になるようです。
コンパイラ(gdc)の文法チェックではエラーにならないので、ELISPでリアルタイムな 文法チェックを行っていると思うのですが、どうやってチェックしているのかが イマイチ良くわからなくて直せず。多分、キーワードを足せば良いとかそういうレベル で直せるんじゃないかと思うのですが.......

[後日追記]:原因判明。原因詳細は2013/11/06、対応は2013/11/07参照。

2013/11/02

起きたら午後もいい時間。寝すぎ。

ちょろり本屋に。「ONEPIECE(72)」。少しずつネタ回収されていますが、 まだまだ続きます。

暇つぶしにEmacsのartist-modeで遊んでみたり。

[Emacs ArtistMode]

MS系のフォントだと半角バックスラッシュは¥マークで表示されますので、 小夏フォントを 使って表示してみました。
それにしてもなかなかの変態モードです(褒め)。二直線が交わる箇所を'X'や '+'で表示するとか、小さな円はできるだけ円に見えるように'('や')'を使う とか、妙なこだわりが感じられて面白いです。

VMwareに入れているFedora17をアップグレードしてみたり。 fedupというパッケージを使ってアップグレードするのですが、 感覚的にはパッケージソフトをネットワークアップデートするのと同じ感じ。 17→18、18→19と二回アップグレードを実行して特に突っかかる所無く 完了。GNOME3はなんだか使い方が良くわからなくなっている気がしたり。

2013/11/01

気持ち遅めに帰着。

TV東京のWBSで年賀状の話をしていたり。 最近はメールで済ます人が多くなってきたという話から、スマフォで 手軽に年賀状印刷を行うという話に。 写真データ、住所録、レイアウト、全てスマフォ内のデータやアプリを使い、 印刷&投函代行業者にスマフォから委託する......それってメールで済ますのと ほぼ同義なのでは?と思ったりも。


TOP PREV