Emacsのalignが便利

投稿者: shuichi, タグ: ,,,,, 投稿日時: 2009/04/08 21:50

Emacsのalignがけっこう便利。桁揃えが簡単になるので、特にコーディングするときに重宝する。例えば次のようなコードがあるとする。

input HCLK; // Clock
output [31:0] HADDR; // Address
output [1:0] HTRANS; // Transfer type
output HWRITE; // Transfer direction
output [2:0] HSIZE; // Transfer size
output [2:0] HBURST; // Burst type
output [31:0] HWDATA; // Write data
input [31:0] HRDATA; // Read data
input HREADY; // Transfer done

そして次に示すコマンドを実行してみる。

コードをリージョンで選択→M-x align-regexp→Align regexp: \[
コードをリージョンで選択→M-x align-regexp→Align regexp: H
コードをリージョンで選択→M-x align-regexp→Align regexp: //

するとコードが次のように桁揃えされる。

input         HCLK;   // Clock
output [31:0] HADDR;  // Address
output [1:0]  HTRANS; // Transfer type
output        HWRITE; // Transfer direction
output [2:0]  HSIZE;  // Transfer size
output [2:0]  HBURST; // Burst type
output [31:0] HWDATA; // Write data
input  [31:0] HRDATA; // Read data
input         HREADY; // Transfer done

同じようなことを3回繰り返しているのでちょっと面倒だが、手作業でやるよりはマシだと思う。どこで桁揃えするかを正規表現で指定できるのでかなり応用が利く。場合によっては余計面倒になるかもしれないが…。

ちなみにC-u M-x align-regexpでもう少し複雑なことができる。詳細はEmacsWiki: Align Commandsを参照。さらに、桁揃えのルールをあらかじめ定義しておくことができるので、これを定義しておけばもっと便利になりそう。

Emacs(verilog-mode)でVerilogの数値リテラルを強調表示

投稿者: shuichi, タグ: ,,,, 投稿日時: 2009/04/02 02:01

Emacsのverilog-modeでは数値リテラルが強調表示されないので、以下のコードで対応。

(font-lock-add-keywords
 'verilog-mode
 '(("\\(\\<[1-9][0-9_]*\\)?'h[0-9_a-fxz]+\\>" . font-lock-number-face)
   ("\\(\\<[1-9][0-9_]*\\)?'d[0-9_xz]+\\>"    . font-lock-number-face)
   ("\\(\\<[1-9][0-9_]*\\)?'o[0-7_xz]+\\>"    . font-lock-number-face)
   ("\\(\\<[1-9][0-9_]*\\)?'b[01_xz]+\\>"     . font-lock-number-face)
   ("\\<[0-9][0-9_]*\\>"                      . font-lock-number-face)))

フェイスは好きなものを指定する。ちなみに32'D0とか5e3とか0xとかには未対応。使わないので。

Emacsを本格的に使い始めて1ヶ月もたっていないので間違いがあるかもしれないけど、とりあえず強調表示はできてる。Verilogを書くにはEmacsのverilog-modeが一番便利っぽい。

EmEditorのPHP構文ファイル(PHP 5.3)

投稿者: shuichi, タグ: ,,, 投稿日時: 2009/03/28 15:19

以前作成したEmEditorのPHP構文ファイルをアップデートした。とりあえずPHP 5.3で追加されるキーワードにも対応してみたつもりだが、足りないかもしれない。

ちなみにこのサーバーのPHPで自動生成しているので、関数名などはサーバーのPHPにロードされている拡張に依存するので注意。

Visual Studio 2005 Service Pack 1 適用済みディスクを作成

投稿者: shuichi, タグ: ,,, 投稿日時: 2007/03/12 00:25

Visual Studio 2005 Service Pack 1をインストールするためには数GBのハードディスク容量が必要でインストールにかかる時間がパソコンのスペックにもよりますが1時間ほどかかります。OSインストールの次に時間がかかる作業ではないかと。再インストール時の手間を考えてSP1適用済みインストールディスクを作成しておきました。

SP1適用作業はSlipstreaming Visual Studio 2005 Service Pack 1の手順どおりに行うことで成功。DVDに記録する場合はボリュームラベルをオリジナルインストールディスクのものと同じにする必要があるので注意。

ContextMenuStripをタスクバー上に表示する

投稿者: shuichi, タグ: ,,,, 投稿日時: 2006/10/28 04:38

.NET Framework 2.0では.NET Framework 1.xのContextMenuの代わりにContextMenuStripというコントロールが追加されました。このContextMenuStripは多機能で便利ですが、タスクバー上に表示させようとするとうまく表示できません(タスクバーに重ならないように表示される)。SHAppBarMessageでデスクトップツールバーを作成したときなどは困るんじゃないかと。ということでContextMenuStripをタスクバー上に表示させるためにいろいろと調べてみました。

最初に注目したのはNotifyIcon。NotifyIconにContextMenuStripを設定すると正常にタスクバー上に表示されます。MSIL逆アセンブラでNotifyIconを覗いてみると、ContextMenuStripのShowInTaskbarというプライベートメソッドを呼び出していることが分かります。とりあえず、

contextMenuStrip.GetType().InvokeMember(
    "ShowInTaskbar",
    System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.InvokeMethod |
    System.Reflection.BindingFlags.Instance,
    null,
    contextMenuStrip,
    new Object[] { Cursor.Position.X, Cursor.Position.Y } );

とすることでcontextMenuStripをタスクバー上に表示させることができました。

ただし、この方法では何故かメニューが常にマウスポインタの右上に表示されるようです。いまいちスッキリしないのでShowInTaskbarメソッドの中をさらに覗いてみると、ToolStripDropDownにWorkingAreaConstrainedプロパティが存在するらしい。強制的に作業領域に表示させるという意味なので、

contextMenuStrip.GetType().InvokeMember(
    "WorkingAreaConstrained",
    System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.SetProperty |
    System.Reflection.BindingFlags.Instance,
    null,
    contextMenuStrip,
    new Object[] { false } );
contextMenuStrip.Show( Cursor.Position );

としてみるとうまく表示させることができました。ただし、メニューが表示されるとWorkingAreaConstrainedがtrueに設定されるようなので、表示させる前に毎回WorkingAreaConstrainedをfalseに設定しないと駄目なようです。

これらの方法は本来アクセスできないメソッドやプロパティに強引にアクセスしているわけで、実際はこのような方法は好ましくありません。とりあえずこのような方法もあるというだけです。