2013-11-26 8 views
8

gdb-many-windowsをEmacs 24で使用し、通常はそれ自身のフレームで設定します。別の編集フレームが好きです。これは次のようになります(ASCII ASCIIダイアグラムのお詫び):Emacs/GDB:gdb-many-windowsで特定のウィンドウに常にソースを表示します。

+-------------+-------------+ 
| gdb   | locals  | 
+-------------+-------------+ 
| source  | I/O   | 
|    |    | 
+-------------+-------------+ 
| stack  | breakpoints | 
+-------------+-------------+ 

これは1つの大きな問題を除いて非常にうまくいきます。 gdbが、例えばup/down/stepの後に、別のソースバッファを表示する必要があるときは、常に、それが「ソース」ウィンドウに表示されるとは限りません。たとえば、別のフレームのウィンドウで同じバッファを開いている場合、gdbフレームにキーボードのフォーカスを合わせながらそのフレームを上げます。これは、フレームがお互いをカバーしているときに、が実際には厄介なです。

同じソースバッファが別の場所に表示されていても、ソースを表示するにはgdb-many-windowsセットアップでソースウィンドウを常に使用します。どうやってやるの?


EDIT:より詳細な指示が再現します。 Emacs 24.2.1とGDB 7.5-ubuntuを使用しています。私はこの問題をCinnamonのUbuntu 10.04とLinux Mint Nadiaで見たことがあります。

  • は、この式を評価:(setq gdb-many-windows t)
  • は、少なくとも二つのファイルとCプログラムをコンパイルします。たとえば、

// foo.c 
void bar(int); 
void foo(int c) { 
    if (c > 0) 
    bar(c - 1); 
} 
int main(void) { 
    foo(100); 
    return 0; 
} 

// bar.c 
void foo(int c); 
void bar(int c) { 
    if (c > 0) 
    foo(c - 2); 
} 

// compile with gcc -g -O0 foo.c bar.c -o test 
  • bar.cには、メインフレームに表示されてみましょう。 M-x 5 2で新しいフレームを開きます。そのフレームで、M-x gdbでgdbを起動します。上記のように、そのフレームには6つのウィンドウが必要です。ソースフレームの上にgdbフレームを配置します。
  • mainにブレークポイントを設定し、foobarを呼び出します。 barが呼び出されると、メインフレームはbar.cがすでにそこに表示されているのでgdbフレーム上に持ち上げられますが、キーボードフォーカスはgdbフレームに残ります。

gud.el.gzの問題機能はgdb-display-source-bufferだと思います。私はdefadviceでこれを上書きしようと考えていますが、私は実際にアドバイスに精通していません。もし私がそれを理解すれば、私はここに答えを掲示するでしょう。

+0

問題を再現できません。 –

+0

@Jay Conrod:まだこの問題があるかどうか教えてください。もしそうなら、Emacsとgdbのフルバージョン番号を教えてください。さらに、 'emacs -q'を試して、あなたの設定の潜在的な問題を検出してください。また、最小限の例を提供してください。つまり、問題を再現するための小さなソースファイルとステップバイステップの指示です。 – Tobias

+0

@Tobias、再現するための詳細な説明が追加されました。私が何かを明確にすることができるかどうか私に教えてください。 Debianのemacs 24.4.1で –

答えて

1

私は24.3を持っています。そして、私はこのバージョンで問題を再現することはできません。次のように ありgud-display-lineに見えます:

(defun gud-display-line (true-file line) 
    (let* ((last-nonmenu-event t) ; Prevent use of dialog box for questions. 
    (buffer 
     (with-current-buffer gud-comint-buffer 
     (gud-find-file true-file))) 
    (window (and buffer 
       (or (get-buffer-window buffer) 
       (display-buffer buffer)))) 
    (pos)) 
    (when buffer 
     (with-current-buffer buffer 
    (unless (or (verify-visited-file-modtime buffer) gud-keep-buffer) 
     (if (yes-or-no-p 
      (format "File %s changed on disk. Reread from disk? " 
       (buffer-name))) 
      (revert-buffer t t) 
     (setq gud-keep-buffer t))) 
    (save-restriction 
     (widen) 
     (goto-char (point-min)) 
     (forward-line (1- line)) 
     (setq pos (point)) 
     (or gud-overlay-arrow-position 
      (setq gud-overlay-arrow-position (make-marker))) 
     (set-marker gud-overlay-arrow-position (point) (current-buffer)) 
     ;; If they turned on hl-line, move the hl-line highlight to 
     ;; the arrow's line. 
     (when (featurep 'hl-line) 
     (cond 
     (global-hl-line-mode 
      (global-hl-line-highlight)) 
     ((and hl-line-mode hl-line-sticky-flag) 
      (hl-line-highlight))))) 
    (cond ((or (< pos (point-min)) (> pos (point-max))) 
      (widen) 
      (goto-char pos)))) 
     (when window 
    (set-window-point window gud-overlay-arrow-position) 
    (if (eq gud-minor-mode 'gdbmi) 
     (setq gdb-source-window window)))))) 

window設定は、あなたとは全く異なるものです。おそらく、上記のコードは参考になるかもしれません。あるいは新しいgud/gdbのものにアップグレードしてください。

+0

ありがとうございます、私はすぐ次の日か2日にアップグレードしようとします。私は少し懐疑的です。なぜなら、 'get-buffer-window'がまだそこにあるからです。問題が早く起こった原因かもしれないと思います。 –

+0

私は 'emacs -q'で始まり、多くのCファイルをオープンし、3つのフレームを開き、フレームを最大化するなど、複数のシナリオを試しました。これらのケースでは、emacs 24.3で問題を再現することはできませんでした。 'emacs -q'で試しましたか? – Tobias

+0

家でemacsを24.3にアップグレードしましたが、もう問題は見えません。アップ/ダウン/フレームも期待どおりに動作します。なぜそれが正確に動作するのかわかりませんが、それはありません!ご協力いただきありがとうございます。 –

2

この問題を引き起こす関数は、実際にはgud.el.gzのgud-display-lineです。この関数は、現在の行のソースウインドウにオーバーレイの矢印を配置し、それが見えることを確認します。ここでは、ロジックです:

(let* ... 
(window (and buffer 
      (or (get-buffer-window buffer) 
      (if (eq gud-minor-mode 'gdbmi) 
       (or (if (get-buffer-window buffer 'visible) 
        (display-buffer buffer nil 'visible)) 
       (unless (gdb-display-source-buffer buffer) 
       (gdb-display-buffer buffer nil 'visible)))) 
      (display-buffer buffer)))) 

私は全体の機能を無効にするためにdefadviceを使用しました。基本的に、ソースをコピーしてウィンドウ選択ロジックを変更しました。

(defadvice gud-display-line (around do-it-better activate) 
    (let* ... 
    (window (and buffer 
        (or (if (eq gud-minor-mode 'gdbmi) 
          (unless (gdb-display-source-buffer buffer) 
          (gdb-display-buffer buffer nil 'visible))) 
         (get-buffer-window buffer) 
         (display-buffer buffer)))) 
    ...) 

明らかに最も洗練された解決策ではありません。また、フレームを切り替えるとき(アップ/ダウン/フレームで)は役に立ちませんので、これを理解するときに編集します。

+1

私の問題を解決しました:) – OLL

+0

この方法でdefadviceを使用すると、emacs24-common 24.4 + 1-5でDebian Jessieに働きかけました。バグレポートやパッチとして提出した人は誰ですか?たとえそれが何らかの形で不完全であったとしても、修正して再報告する価値があるようです。問題を知っていれば、メンテナーが十分に磨きをかけて適用すると思われるでしょうか? –

-1

私はEmacs 24.5を実行していますが、これはまだ問題です。私は、主に以下の機能が、今専用のWindowsを使用して手動で自分のウィンドウを管理:

(defun gdb-restore-windows-gud-io-and-source() 
    "Restore GUD buffer, IO buffer and source buffer next to each other." 
    (interactive) 
    ;; Select dedicated GUD buffer. 
    (switch-to-buffer gud-comint-buffer) 
    (delete-other-windows) 
    (set-window-dedicated-p (get-buffer-window) t) 
    (when (or gud-last-last-frame gdb-show-main) 
    (let ((side-win (split-window nil nil t)) 
      (bottom-win (split-window))) 
     ;; Put source to the right. 
     (set-window-buffer 
     side-win 
     (if gud-last-last-frame 
      (gud-find-file (car gud-last-last-frame)) 
     (gud-find-file gdb-main-file))) 
     (setq gdb-source-window side-win) 
     ;; Show dedicated IO buffer at the bottom. 
     (set-window-buffer 
     bottom-win 
     (gdb-get-buffer-create 'gdb-inferior-io)) 
     (set-window-dedicated-p bottom-win t)))) 

これは、左上のGUDウィンドウを示し、下部のIOバッファは、左右のサイドにソースバッファを設定します。 GUDとIOバッファは専用に設定されています。

関連する問題