Emacs: Предотвратяване на gud & pdb от контролиране на прозорци

Използвам pdb за отстраняване на грешки в програми на Python и не съм доволен от поведението му.

Имам екрана, разделен на множество прозореца на emacs и когато изпълня pdb, той (на случаен принцип?) замества един от прозорците с изхода на *gud* дебъгера.

Освен това, когато се срещне точка на прекъсване, дори ако буферът за отстраняване на грешки вече е видим в прозорец, той обикновено поставя този буфер в друг прозорец и замества друг от моите прозорци със съдържанието на изходния файл. (между другото ми харесва, че скача на правилния ред в изходния файл)

Как мога да деактивирам gud/pdb да управлява моите прозорци вместо мен? Възможно ли е в emacs да се предотврати всяка програмна манипулация на прозорци и оформление на екрана?

Редактиране: Намерих отговора, който частично решава това в друга публикация: превключете специални прозорци


person EoghanM    schedule 01.05.2009    source източник


Отговори (4)


Погледнете в залепващи прозорци.

person Charlie Martin    schedule 01.05.2009
comment
настройката set-window-dedicated-p има недостатъка, че C-f find-file, извикан от прозорец, неинтуитивно отваря файла в друг прозорец. Успях да отменя това поведение, като добавих (set-window-dedicated-p (get-buffer-window (current-buffer)) nil) към персонализирана версия на find-file - person EoghanM; 02.05.2009
comment
Залепващите прозорци няма да попречат на gud/pdb да се опита да открадне вашите залепващи прозорци, където се намира буферът на вашия изходен код. Ако gud/pdb не може да открадне прозореца, той ще отвори нов Emacs Frame. Вижте моя отговор за решение на този проблем. - person Jérôme Radix; 03.03.2011

Опитах всички тези подходи без успех на Emacs 24. Ако все още се интересувате, се върнах към старото поведение на gdb, използвайки 'gud-gdb', което имплементира старото поведение на взаимодействието gdb/emacs (без специални прозорци и I/O буфер ). Ако не искате да извиквате M-x gud-gdb, когато го използвате, можете да дефинирате псевдоним за M-x gdb

person RodrigoP    schedule 22.03.2013
comment
Най-накрая нещо, което работи с най-новата версия на emacs! - person DomCote; 05.03.2016
comment
да gud-gdb работи както съм свикнал. Новото поведение работи добре, докато не го направи -- неговият отказ оставя emacs в някакво странно състояние. - person wcochran; 19.08.2020

Имам решение, което не позволява на gdb да краде windows. Работи с Emacs 24.4 (2014-07-18 snapshot) и не изисква отделяне на буфери. Предимството пред другите отговори е, че няма да се налага да се занимавате със заделяне и незаделяне на буфери всеки път, когато сменяте буфери, което бързо става досадно.

Поставете този съвет във вашия .emacs:

(defadvice gdb-inferior-filter
    (around gdb-inferior-filter-without-stealing)
  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
    (comint-output-filter proc string)))
(ad-activate 'gdb-inferior-filter)

Това ефективно замества тази функция, както е дефинирана в gdb-mi.el, и премахва клона, който извиква gdb-display-buffer, който е причината за кражбата на прозореца.

person holocronweaver    schedule 24.07.2014

Трябва да използвате Sticky Windows, за да накарате вашите прозорци и буфери да останат там, където са, но Sticky Windows няма спрете gud/pdb да се опита да открадне вашите прозорци. Когато gud/pdb не може да открадне вашия прозорец на изходния код, той отваря нов Emacs фрейм, дори ако има друг прозорец в текущия фрейм.

Това идва от факта, че функцията, която се опитва да премине към буфера gud-pdb (py-pdbtrack-track-stack-file) извиква функция pop-to-buffer с аргумент OTHER-WINDOW, зададен на t.

За да заобиколите това поведение за всички библиотеки, които извикват pop-to-buffer, можете да отмените ролята на OTHER-WINDOW, като дефинирате съвет за pop-to-buffer (във вашия .emacs):

(defadvice pop-to-buffer (before cancel-other-window first)
  (ad-set-arg 1 nil))

(ad-activate 'pop-to-buffer)

Трябва също да персонализирате променлива pop-up-windows на нула, за да принудите display-buffer (програмата на ниско ниво, използвана за показване на конкретен буфер на прозорци и рамки) да не създава нов прозорец.

person Jérôme Radix    schedule 03.03.2011
comment
Обърнете внимание, че аргументите на pop-to-buffer са променени в Emacs 24 и този съвет причинява известен хаос - person phils; 04.11.2011