メモの日々


2011年08月07日(日) [長年日記]

[vim][dev] Pyclewnを使ってVimからGDBを操作

GDBは--tuiオプションを使って使用していたのだけれど、PyclewnというPythonスクリプトを使うと、Vim上でGDBを操作できるようになることを知った。Vimにパッチを当てる必要もなく、GVim必須でもなくて素晴らしい。使い方などをメモ。

インストール

現在の最新バージョンは1.6。インストーラがあるのでそれでインストール。ドキュメントの通り、

% vimdir=$HOME/.vim python setup.py install --force --home=$HOME

を実行し、ホームディレクトリへインストールした。これで、pyclewnコマンドやVimのPyclewnプラグインが使えるようになる。

Pyclewnの起動と終了

Pyclewnは、Vimから「:Pyclewn」を実行して起動する方法と、pyclewnコマンドの子プロセスとしてVimを実行する方法の2通りの実行方法がある。後者の方が使いやすく感じた。後者の場合、

% pyclewn -e vim --cargs '-S ~/.pyclewn_mapping.vim' --args デバッグ対象プログラム名

のようにして実行できる。オプションの意味は次の通り。

-e vim
使用するエディタプログラムを指定。gvimではなくvimを使いたいために指定した。
--cargs '-S ~/.pyclewn_mapping.vim'
Vimへのオプションを指定。~/.pyclewn_mapping.vimに、Pyclewn使用時だけ有効にしたいVimのキーマッピングを定義している(後述)。

Vimを終了すればPyclewnも終了する。

GDBの操作

GDBのほとんどのコマンドを、Vimのコマンドラインモードで「C」の後に続ければ使用できる。例えば、

:Cbreak main

とすれば、デバッグ対象プログラムの関数mainが表示され、そこにブレイクポイントが設定される。

その後「:Crun」して「:Cnext」して「:Cprint」してという風に、通常のGDBと同じように操作ができる。が、これだけだといつもより2文字多く打つ必要があり不便なので、キーマッピングを定義したい。

キーマッピングの設定例

Pyclewnには「:Cmapkeys」とすることでキーマッピングを定義する機能があり、このマッピング内容を設定ファイルでカスタマイズする機能もある。けれども、このカスタマイズ機能はVimのmapコマンドとは異なる方法でマッピングを定義していて、やりたいマッピングを定義できなかった(具体的には、カーソル位置の単語を取得することができそうになかった)。

なので、この機能は使わず、上に書いたように、~/.pyclewn_mapping.vim にmapコマンドでマッピングを定義して、Pyclewn起動時にこのファイルを読み込ませるようにした。今の ~/.pyclewn_mapping.vim の内容は次の通り。Pyclewn使用中は編集操作はしないと割り切って、いくつかの編集コマンド(編集以外もだけど)は上書きしている。まだ試行錯誤中なので注意。

cnoremap <expr> <SID>lineno line(".")

" カーソル行にブレイクポイント設定/取消
nnoremap <script> BB :Cbreak <C-R><C-%>:<SID>lineno<CR>
nnoremap <script> BC :Cclear <C-R><C-%>:<SID>lineno<CR>

nnoremap R :Crun
nnoremap S :Cstep<CR>
nnoremap N :Cnext<CR>
nnoremap F :Cfinish
nnoremap U :Cuntil
nnoremap C :Ccontinue

nnoremap <C-U> :Cup<CR>
nnoremap <C-D> :Cdown<CR>

" カーソル位置の変数の値表示
nnoremap PP :Cprint <C-R><C-W>
nnoremap PO :Cprint *<C-R><C-W>

" カーソル位置の変数をwatch変数バッファに追加
nnoremap P` :Cdbgvar <C-R><C-W>

" watch変数バッファのカーソル行の折り畳みを開く/閉じる
nnoremap <script> ZZ :Cfoldvar <SID>lineno<CR>

" watch変数バッファのカーソル位置の情報を削除
nnoremap ZD :Cdelvar <C-R><C-W>

watch変数バッファ

上のマッピングで使っているが、Pyclewnにはwatched variables bufferというバッファがあって、watchしたい変数をそのバッファに次のコマンドで登録できる。

:Cdbgvar 変数名

変数の型が構造体などの場合は折り畳まれて表示され、折り畳みの展開は次のようにして行う。

:Cfoldvar watch変数バッファの行番号

また、

:Cdelvar watch変数バッファ上での名前

でバッファから変数を削除できる。指定する名前はバッファ上で「var1」などと表示されている名前。

ブレイクポイント設定時の補完

「:Cbreak」コマンドでブレイクポイントを設定するとき、デフォルトでは関数名の補完が効かない。

:Csymcompletion

を実行すると、GDBが保持するシンボル情報を補完に利用できるようになる。


2011年08月08日(月) [長年日記]

[windows] Visioで図面のサイズを変更

Visio 2007で図面のサイズを変更する方法を、以前調べたのに今日も分からなくて調べ直したので、忘れないようにメモ。

「Ctrlキーを押している間はマウスで自由に変更できる」だ。

ヘルプの記述を見つけた。

  1. [オブジェクト選択ツール] ボタンをクリックします。
  2. ポインタをページの端に移動して、Ctrl キーを押します。ポインタが双方向の矢印に変わります。
  3. ページの端を目的の位置までドラッグします。

分かりにくいなあ。


2011年08月11日(木) [長年日記]

  • pyclewnは何と読めばいいのか。clewは「くるー」のようなので、「ぱいくるーん」かな。

[vim][dev][unix] Pyclewnを使ってVimからGDBを操作 (2)

Pyclewnを使うと、デフォルトではデバッグ対象プログラムの出力が /dev/null へリダイレクトされてしまう。

出力内容を確認したい場合は、pyclewnコマンドの実行時に --tty オプションで疑似端末名を指定すれば、そこへ出力が行われる。疑似端末名は、出力を表示したい端末でttyコマンドを実行すれば分かる。

ただし、こうしたとき、出力先に「&"warning: GDB: Failed to set controlling terminal:」という警告が表示された。プログラムの出力はちゃんと行えているようなので、警告は気にしなければ問題はないかなあ。


2011年08月15日(月) [長年日記]

  • シェルスクリプトを書いた。bashの機能は遠慮なく使う。知ったことをいくつかメモ。

[shell][unix][howto] シェルスクリプトで一時ファイルを作成し、削除する

作成

シェルスクリプトで一時ファイルを作成するのに、プロセスIDを使用するのはセキュアでないので避けたい。

それより、mktempコマンドを使うのがよさそう。このコマンドは適当な名前で空のファイルまたはディレクトリを作成し、そのファイル名を出力してくれる。使うのも簡単だし、手元のLinuxでは標準でインストールされていた。

削除

一時ファイルは、シェルスクリプトが終了たときに自動で削除されて欲しい。これはbashのtrapコマンドで実現できる。「sigspec が EXIT (0) であれば、シェルの終了時にコマンド arg が実行されます。」ということなので、

trap "rm -fv $tmpfile" EXIT

のようにしておけば自動的に $tmpfile は削除される。SIGTERMなどのシグナル受信時にもちゃんと削除される。ただし、SIGKILLシグナル受信時には削除されないようだ。これは仕方ないかな。

複数の一時ファイル

一時ファイルを複数使うなら、mktempを何度も呼ぶより、mktempでディレクトリを作成してその中にファイルを自由に作る方が、ファイルの削除が簡単に済んで便利。

tmpdir=`mktemp -d`
trap "rm -rfv $tmpdir" EXIT

[shell][unix][howto] シェルスクリプトで連番の生成

連番はseqコマンドで生成できる。このコマンドには色々な機能があって便利なので活用すべし。

が、seqコマンドを使わなくても、手元のbashは {x..y} と書けば連番を展開してくれた。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

zshでも同じように動いた。zshだと {00..10} とすることで、seqの -w オプションと同じようなゼロ埋めもできた。手元のbash(version 3.00.15)ではゼロ埋めができなかったが、もっと新しいバージョンだとできるらしい。

また、bashだと文字の連番も生成できたが、これはzshではできなかった。

$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

{x..y}の展開機能は、JMにあるman bashの日本語訳にはなかった。本家のマニュアルには次のようにある。

A sequence expression takes the form {x..y[..incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer.

ここにある ..incr というオプションも手元の古いbashでは動かなかった。

[shell][howto] シェルスクリプトで多重ループを抜ける

シェルスクリプトで多重ループを抜けるのにどう書けばいいのか知らなかったけど、「break 2」とすれば2レベル分のループを抜けられると知った。breakは組み込みコマンドなのか。

なお、引数なしの break は break 1 と同じみたい。


2011年08月18日(木) [長年日記]

[link][dev][service] http://encarta.msn.com/ は終了?

http://encarta.msn.com/ にあった英語の類語辞典便利に使っていたのだけれど、今日使おうとしたらアクセスできなかった。

検索すると一昨年のニュース

米Microsoftが、オンライン百科事典「MSN Encarta」を2009年10月31日に終了することを明らかにした。各国版をこの日に閉鎖するが、日本版だけは12月31日の終了となる。

なんて書かれていた。でも最近まで使えていたけどなあ。なくなると困る。別のいいサービスがあればいいのだけれど。


2011年08月19日(金) [長年日記]

[dev][howto] Gitでブランチ間の差分を表示

Gitでブランチ「branch」をブランチ「master」へマージするときに、確認のため差分を表示したい。このケースでは、masterからbranchまでの差分を表示したいので、

% git diff master branch

または

% git diff master..branch

とすればよい。マニュアルによればどちらでも同じみたい。

で、マージをする直前はカレントのブランチはmasterになっているはずで、そのとき上は

% git diff ..branch

と書けるようだ。これを使うのがいいと思った。

[link][dev][service] 英語のオンライン類語・反対語辞典

encartaの類語辞典のサイトは復活しそうにないので、別のサイトをいくつかメモ。どれがいいかまだわからない。

Thesaurus.com
機能がencartaの辞典と似てていいのだけど、画面が見難い。
Wordsmyth
こちらの方が検索結果が見やすくていいかなあ。
Synonym.com
画面がシンプルでいいのだけど、検索結果が少ない。