Windows 上の emacs において pdb を使う際のメモ

# はじめに
本稿は Windows 上の emacs において Python デバッガである pdb を使えるようにした際の備忘録である．

# RealGud をインストールする
```
M-x package-refresh-contents RET      (to refresh your package database)
M-x package-install RET realgud RET   (to install and compile `realgud` and its dependencies)
```
以下の文章では RealGud のインストールフォルダである
/home/.emacs.d/elpa/realgud-20160829.1821
をカレントフォルダとする．

# pdb 起動時のデフォルト引数をフルパスから相対パスに変更する
ファイル ./realgud/common/core.el において，関数定義 (defun realgud-suggest-invocation ... の中の

```
(setq filename (realgud:suggest-file-from-buffer lang-str))
(concat debugger-name " " (shell-quote-argument filename)))
```

という部分を次のように変更する．

```
(setq filename (realgud:suggest-file-from-buffer lang-str))
(setq filename (first (last (split-string filename "/")))) ;; <= 追加
(concat debugger-name " " (shell-quote-argument filename)))
```

その後，M-x byte-compile-file により core.el　ファイルをコンパイルする．

- この関数の呼ばれ方．

```
realgud:pdb(./realgud/debugger/pdb/pdb.el)
 -> realgud:run-debugger(./realgud/common/run.el)
  -> pdb-query-cmdline(./realgud/debugger/pdb/core.el) (as a callback function)
   -> realgud-query-cmdline(./realgud/common/core.el)
    -> pdb-suggest-invocation(./realgud/debugger/pdb/core.el) (as a callback function)
     -> realgud-suggest-invocation(./realgud/common/core.el)
```


- 注意．
  この修正は必須ではないがフルパスで実行するには Windows 形式にて，
  次のように打たなければならず非常に面倒である．

```
Run pdb (like this): pdb c:\\Users\\...\\hoge.py
```

# pdb 実行時の引数をフォルダ区切り(/)のフルパスに自動変換するのをやめる

ファイル ./realgud/common/run.el において，関数定義 (defun realgud:run-debugger ... の中の

```
(realgud:run-process debugger-name script-name parsed-cmd-args
		     minibuffer-history no-reset)
```

という部分を次のように変更する．

```
(realgud:run-process debugger-name script-name
                     cmd-args ;; <= パースしない
                     minibuffer-history no-reset)
```

その後, M-x byte-compile-file により run.el ファイルをコンパイルする.

- この関数の呼ばれ方．

```
realgud:pdb(./realgud/debugger/pdb/pdb.el)
 -> realgud:run-debugger(./realgud/common/run.el)
```

# ソースファイルを別のバッファに開くためにパスの表記を変更する

ファイル ./realgud/common/file.el において，関数定義 (defun realgud:file-loc-from-line ... の中の

```
(setq remapped-filename
      buffer-file-name
      (compilation-find-file (point-marker) filename directory)))
```

という部分を次のように変更する．

```
(setq filename (first (last (split-string filename "\\\\")))) ;; <= 追加
(setq remapped-filename
      buffer-file-name
      (compilation-find-file (point-marker) filename directory)))
```

その後, M-x byte-compile-file により file.el ファイルをコンパイルする.

- デバッガが実行されコマンドバッファが開くと Realgud-Track モードに入る.
  すると関数 realgud-track-mode-setup (./realgud/common/track-mode.el) が実行され
  comint-output-filter-functions API (コマンドバッファのイベント発生時に実行される関数)
  に realgud-track-comint-output-filter-hook (./realgud/common/track.el) がフックされる.
  これによりコマンドバッファ上のイベントに付随してソースバッファが書き換えられていく.


- この関数の呼ばれ方．

```
イベント発生
 -> realgud-track-comint-output-filter-hook(./realgud/common/track.el)
  -> realgud:track-from-region(./realgud/common/track.el)
   -> realgud-track-loc(./realgud/common/track.el)
    -> realgud:file-loc-from-line(./realgud/common/file.el)
```

# ソースファイル上でブレークポイントを打った際に正しく動作するように修正する

ファイル ./realgud/common/send.el において，関数定義 (defun realgud-expand-format ... の中の

```
(setq fmt-str (substring fmt-str (match-end 2))))
```

という部分を次のように変更する．

```
(setq result
      (replace-regexp-in-string "/" "\\\\"
                                (replace-regexp-in-string "/c" "c:"
                                                          result)))
;; <= 追加
(setq fmt-str (substring fmt-str (match-end 2))))
```

その後, M-x byte-compile-file により send.el ファイルをコンパイルする.

- この関数の呼ばれ方．

```
ソースファイル上で "b"
 -> realgud:cmd-break(./realgud/common/cmds.el)
  -> realgud:cmd-run-command(./realgud/common/cmds.el)
   -> realgud-command(./realgud/common/send.el)
    -> realgud-expand-format(./realgud/common/send.el)
```

# おわりに
以上の変更によってソースを見ながらブレークポイントを打てるようになったので，満足．