Moving to Doom Emacs!

This commit is contained in:
Derek Taylor
2019-12-16 20:21:19 -06:00
parent d9f2f456f1
commit d4b4c33550
683 changed files with 51877 additions and 100 deletions
@@ -0,0 +1,85 @@
;;; tools/debugger/autoload/debugger.el -*- lexical-binding: t; -*-
(defvar +debugger--last nil)
(defun +debugger-list-for-dap ()
(when (and (bound-and-true-p lsp-mode)
(bound-and-true-p lsp--buffer-deferred)
(require 'dap-mode nil t)
dap-mode)
(mapcar #'car dap-debug-template-configurations)))
(defun +debugger-list-for-realgud ()
(cl-loop for (sym . plist) in +debugger--realgud-alist
for sym-name = (symbol-name sym)
for modes = (plist-get plist :modes)
if (or (null modes) (apply #'derived-mode-p modes))
collect sym))
(defun +debugger-list-available ()
"TODO"
(append (+debugger-list-for-dap)
(+debugger-list-for-realgud)
nil))
;;
;;; Interactive commands
;;;###autoload
(defun +debugger/start-last ()
"Relaunch the last debugger session."
(interactive)
(unless +debugger--last
(user-error "No last debugger to invoke"))
(call-interactively +debugger--last))
;;;###autoload
(defun +debugger/start (arg)
"Launch a debugger session.
Launches the last used debugger, if one exists. Otherwise, you will be prompted
for what debugger to use. If the prefix ARG is set, prompt anyway."
(interactive "P")
(if (or arg (null +debugger--last))
(let ((debugger (intern-soft (completing-read "Start debugger: " (+debugger-list-available)))))
(unless debugger
(user-error "No debugging session to quit"))
(unless (fboundp debugger)
(user-error "Couldn't find debugger backend %S" debugger))
(setq-local +debugger--last debugger)
(if (assoc debugger dap-debug-template-configurations)
(dap-debug debugger)
(call-interactively debugger)))
(+debugger/start-last)))
;;;###autoload
(defun +debugger/quit ()
"Quit the active debugger, if any."
(interactive)
(cond ((and (fboundp 'dap--cur-session) (dap--cur-session))
(dap-disconnect))
((and (fboundp 'realgud-get-cmdbuf) (realgud-get-cmdbuf))
(let ((buf (realgud-get-cmdbuf)))
(ignore-errors
(call-interactively #'realgud:cmd-quit))
(let (realgud-safe-mode)
(kill-buffer buf))))
((user-error "No debugging session to quit"))))
;; TODO debugger breakpoint commands
;; ;;;###autoload
;; (defun +debugger/toggle-breakpoint ()
;; (interactive)
;; (user-error "not implemented yet"))
;; ;;;###autoload
;; (defun +debugger/next-breakpoint ()
;; (interactive)
;; (user-error "not implemented yet"))
;; ;;;###autoload
;; (defun +debugger/previous-breakpoint ()
;; (interactive)
;; (user-error "not implemented yet"))
@@ -0,0 +1,34 @@
;; tools/debugger/autoload/evil.el -*- lexical-binding: t; -*-
;;;###if (featurep! :editor evil)
;;;###autoload (autoload '+debugger:start "tools/debugger/autoload/evil" nil t)
(evil-define-command +debugger:start (&optional path)
"Initiate debugger for current major mode"
(interactive "<f>")
;; TODO Add python debugging
(let ((default-directory (doom-project-root)))
(pcase major-mode
((or 'c-mode 'c++-mode)
(realgud:gdb (if path (concat "gdb " path))))
((or 'ruby-mode 'enh-ruby-mode)
;; FIXME
(doom:repl nil (format "run '%s'" (file-name-nondirectory (or path buffer-file-name)))))
('sh-mode
(let ((shell sh-shell))
(when (string= shell "sh")
(setq shell "bash"))
(pcase shell
("bash"
(realgud:bashdb (if path (concat "bashdb " path))))
("zsh"
(realgud:zshdb (if path (concat "zshdb " path))))
(_ (user-error "No shell debugger for %s" shell)))))
((or 'js-mode 'js2-mode 'js3-mode)
(realgud:trepanjs))
('haskell-mode (haskell-debug))
(_ (user-error "No debugger for %s" major-mode)))))
;;;###autoload (autoload '+debugger:toggle-breakpoint "tools/debugger/autoload/evil" nil t)
(evil-define-command +debugger:toggle-breakpoint (&optional bang)
(interactive "<!>")
(call-interactively (if bang #'realgud:cmd-clear #'realgud:cmd-break)))
+112
View File
@@ -0,0 +1,112 @@
;;; tools/debugger/config.el -*- lexical-binding: t; -*-
(defvar +debugger--realgud-alist
'((realgud:zshdb :modes (sh-mode))
(realgud:kshdb :modes (sh-mode))
(realgud:rdebug :modes (ruby-mode enh-ruby-mode))
(realgud:pdb :modes (python-mode))
(realgud:trepan2 :modes (python-mode))
(realgud:gub :modes (go-mode))
(realgud:gdb)
(realgud:trepan :modes (perl-mode perl6-mode))
(realgud:trepanpl :modes (perl-mode perl6-mode))
(realgud:trepanjs :modes (javascript-mode js2-mode js3-mode))
(realgud:remake)
(realgud:trepan3k :modes (python-mode))
(realgud:bashdb :modes (sh-mode))
(realgud:perldb :modes (perl-mode perl6-mode))))
;;
;;; Packages
(use-package! dap-mode
:when (featurep! :tools lsp)
:hook (dap-mode . dap-ui-mode)
:after lsp-mode
:init
(setq dap--breakpoints-file (concat doom-etc-dir "dap-breakpoints"))
:config
(dap-mode 1)
(dolist (module '(((:lang . cc) ccls dap-lldb dap-gdb-lldb)
((:lang . elixir) elixir-mode dap-elixir)
((:lang . go) go-mode dap-go)
((:lang . java) lsp-java dap-java)
((:lang . php) php-mode dap-php)
((:lang . python) python dap-python)
((:lang . ruby) enh-ruby-mode dap-ruby)
((:lang . rust) rust-mode dap-lldb)))
(when (doom-module-p (caar module) (cdar module) '+lsp)
(with-eval-after-load (nth 1 module)
(mapc #'require (cddr module)))))
(when (featurep! :lang javascript +lsp)
(with-eval-after-load 'js2-mode
(require 'dap-node)
(require 'dap-chrome)
(require 'dap-firefox)
(when IS-WINDOWS
(require 'dap-edge)))))
(use-package! realgud
:defer t
:init
(use-package! realgud-trepan-ni
:defer t
:init (add-to-list '+debugger--realgud-alist
'(realgud:trepan-ni :modes (javascript-mode js2-mode js3-mode)
:package realgud-trepan-ni)))
;; Realgud doesn't generate its autoloads properly so we do it ourselves
(dolist (debugger +debugger--realgud-alist)
(autoload (car debugger)
(if-let (sym (plist-get (cdr debugger) :package))
(symbol-name sym)
"realgud")
nil t))
:config
(set-popup-rule! "^\\*\\(?:trepanjs:\\(?:g\\|zsh\\|bash\\)db\\|pdb \\)"
:size 20 :select nil :quit nil)
(defadvice! +debugger--cleanup-after-realgud-a (&optional buf)
"Kill command buffer when debugging session ends (which closes its popup)."
:after #'realgud:terminate
(when (stringp buf)
(setq buf (get-buffer buf)))
(when-let (cmdbuf (realgud-get-cmdbuf buf))
(let (kill-buffer-hook)
(kill-buffer buf))))
;; Monkey-patch `realgud:run-process' to run in a popup.
;; TODO Find a more elegant solution
;; FIXME Causes realgud:cmd-* to focus popup on every invocation
(defadvice! +debugger--realgud-open-in-other-window-a
(debugger-name script-filename cmd-args minibuffer-history-var &optional no-reset)
:override #'realgud:run-process
(let* ((cmd-buf (apply #'realgud-exec-shell debugger-name script-filename
(car cmd-args) no-reset (cdr cmd-args)))
(process (get-buffer-process cmd-buf)))
(cond ((and process (eq 'run (process-status process)))
(pop-to-buffer cmd-buf)
(when (boundp 'evil-emacs-state-local-map)
(define-key evil-emacs-state-local-map (kbd "ESC ESC") #'+debugger/quit))
(realgud:track-set-debugger debugger-name)
(realgud-cmdbuf-info-in-debugger?= 't)
(realgud-cmdbuf-info-cmd-args= cmd-args)
(when cmd-buf
(switch-to-buffer cmd-buf)
(when realgud-cmdbuf-info
(let* ((info realgud-cmdbuf-info)
(cmd-args (realgud-cmdbuf-info-cmd-args info))
(cmd-str (mapconcat #'identity cmd-args " ")))
(if (boundp 'starting-directory)
(realgud-cmdbuf-info-starting-directory= starting-directory))
(set minibuffer-history-var
(cl-remove-duplicates (cons cmd-str minibuffer-history)
:from-end t))))))
(t
(if cmd-buf (switch-to-buffer cmd-buf))
(message "Error running command: %s" (mapconcat #'identity cmd-args " "))))
cmd-buf)))
@@ -0,0 +1,9 @@
;; -*- no-byte-compile: t; -*-
;;; tools/debugger/packages.el
(when (package! realgud)
(when (featurep! :lang javascript)
(package! realgud-trepan-ni)))
(when (featurep! :tools lsp)
(package! dap-mode))