📄 bashdb.el
字号:
;;; bashdb.el --- Grand Unified Debugger mode for running bashdb;; Copyright (C) 2000, 2001 Masatake YAMATO ;; Author: Masatake YAMATO <jet@gyve.org>;; This program is free software; you can redistribute it and/or modify it;; under the terms of the GNU General Public License as published by;; the Free Software Foundation; either version 2 of the License, or;; (at your option) any later version.;; This program is distributed in the hope that it will be useful, but;; WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the;; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License;; along with this program; if not, write to the Free Software Foundation,;; Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA;; Commentary:;; This program may run on Emacs 21.0.91 and XEmacs 21.1. ;;;; Put ;; (autoload 'bashdb "bashdb" "Run bashdb" t nil);; to your .emacs.;; M-x bashdb;; Run bashdb (like this): bashdb target.sh;;;; About bashdb:;; You can get bashdb from;; http://www.oranda.demon.co.uk/development.html;;;; bashdb.el is based on perldb in gud.el in XEmacs 21.1.;; Revision:;; $Revision: 1.6 $;; $Log: bashdb.el,v $;; Revision 1.6 2001/01/06 12:18:06 masata-y;; Write note about XEmacs.;;;;;;; Code: (require 'gud);; User customizable variable(defcustom gud-bashdb-command-name "bashdb" "File name for executing Bashdb." :type 'string :group 'gud);; History of argument lists passed to bashdb.(defvar gud-bashdb-history nil)(defun gud-bashdb-massage-args (file args) (if xemacsp (cons (file-name-nondirectory file) args) args));; There's no guarantee that Emacs will hand the filter the entire;; marker at once; it could be broken up across several strings. We;; might even receive a big chunk with several markers in it. If we;; receive a chunk of text which looks like it might contain the;; beginning of a marker, we save it here between calls to the;; filter.(if xemacsp (defvar gud-bashdb-marker-acc ""))(defun gud-bashdb-marker-acc () (if xemacsp gud-bashdb-marker-acc gud-marker-acc))(defun gud-bashdb-marker-acc-quote () (if xemacsp 'gud-bashdb-marker-acc 'gud-marker-acc))(defun gud-bashdb-marker-filter (string) (save-match-data (set (gud-bashdb-marker-acc-quote) (concat (gud-bashdb-marker-acc) string)) (let ((output "")) ;; Process all the complete markers in this chunk. (while (string-match "^\\([^:\n]+\\):\\([0-9]+\\)[ *]*>.*\n" (gud-bashdb-marker-acc)) (setq ;; Extract the frame position from the marker. gud-last-frame (cons (substring (gud-bashdb-marker-acc) (match-beginning 1) (match-end 1)) (string-to-int (substring (gud-bashdb-marker-acc) (match-beginning 2) (match-end 2)))) ;; Append any text before the marker to the output we're going ;; to return - we don't include the marker in this text. output (concat output (substring (gud-bashdb-marker-acc) 0 (match-beginning 0)))) ;; Set the accumulator to the remaining text. (set (gud-bashdb-marker-acc-quote) (substring (gud-bashdb-marker-acc) (match-end 0)))) ;; Does the remaining text look like it might end with the ;; beginning of another marker? If it does, then keep it in ;; (gud-bashdb-marker-acc) until we receive the rest of it. Since we ;; know the full marker regexp above failed, it's pretty simple to ;; test for marker starts. (if (string-match "^\\([^:\n]+\\):\\([0-9]+\\)[ *]*>" (gud-bashdb-marker-acc)) (progn ;; Everything before the potential marker start can be output. (setq output (concat output (substring (gud-bashdb-marker-acc) 0 (match-beginning 0)))) ;; Everything after, we save, to combine with later input. (set (gud-bashdb-marker-acc-quote) (substring (gud-bashdb-marker-acc) (match-beginning 0)))) (setq output (concat output (gud-bashdb-marker-acc))) (set (gud-bashdb-marker-acc-quote) "")) output))) (defun gud-bashdb-find-file (f) (find-file-noselect f));;;###autoload(defun bashdb (command-line) "Run bashdb on program FILE in buffer *gud-FILE*.The directory containing FILE becomes the initial working directoryand source-file directory for your debugger." (interactive (if xemacsp (list (read-from-minibuffer "Run bashdb (like this): " (if (consp gud-bashdb-history) (car gud-bashdb-history) (format "%s " gud-bashdb-command-name)) nil nil '(gud-bashdb-history . 1))) (list (gud-query-cmdline 'bashdb)) )) (if xemacsp (progn (gud-overload-functions '((gud-massage-args . gud-bashdb-massage-args) (gud-marker-filter . gud-bashdb-marker-filter) (gud-find-file . gud-bashdb-find-file))) (gud-common-init command-line gud-bashdb-command-name)) (gud-common-init command-line 'gud-bashdb-massage-args 'gud-bashdb-marker-filter 'gud-bashdb-find-file) (set (make-local-variable 'gud-minor-mode) 'bashdb));; Unsupported commands;; condition foo set break condition to foo;; condition clear break condition;; display EXP evaluate and display EXP for each debug step;; display show a list of display expressions;; undisplay N remove display expression N;; ! string passes string to a shell;; quit quit (gud-def gud-break "break %l" "\C-b" "Set breakpoint at current line.") (gud-def gud-list-break "break" "b" "List breakpoints & break condition.") (gud-def gud-remove "delete %l" "\C-d" "Remove breakpoint at current line") (gud-def gud-remove-all "delete" "d" "Clear all breakpoints") (gud-def gud-cont "continue" "\C-r" "Continue with display.") (gud-def gud-next "next" "\C-n" "Step one line (skip functions).") (gud-def gud-print "print %e" "\C-p" "Evaluate bash expression at point.") (gud-def gud-help "help" "h" "Show all commands.") (gud-def gud-trace "trace" "t" "Toggle execution trace on/off") (setq comint-prompt-regexp "^bashdb> ") (setq paragraph-start comint-prompt-regexp) (run-hooks 'bashdb-mode-hook))(provide 'bashdb);; bashdb.el ends here
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -