diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el new file mode 100644 index 000000000..8f9519283 --- /dev/null +++ b/modules/lang/ruby/autoload.el @@ -0,0 +1,15 @@ +;;; lang/ruby/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +ruby|cleanup-robe-servers () + "Clean up dangling inf robe processes if there are no more `enh-ruby-mode' +buffers open." + ;; FIXME This should wait X seconds before cleaning up + (unless (or (not robe-mode) (doom-buffers-in-mode 'enh-ruby-mode)) + (let (inf-buffer kill-buffer-query-functions) + (while (setq inf-buffer (robe-inf-buffer)) + (let ((process (get-buffer-process inf-buffer)) + confirm-kill-processes) + (when (processp process) + (kill-process (get-buffer-process inf-buffer)) + (kill-buffer inf-buffer))))))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0757982ff..0f6ade8b8 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -78,9 +78,10 @@ environment variables." ;; robe-start errors if you hit no. (defun +ruby|init-robe () (when (executable-find "ruby") - (cl-letf (((symbol-function #'yes-or-no-p) - (lambda (&rest _) t))) - (ignore-errors (robe-start))))) + (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_) t))) + (ignore-errors (robe-start)) + (when (robe-running-p) + (add-hook 'kill-buffer-hook #'+ruby|cleanup-robe-servers nil t))))) (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) :config (set-company-backend! 'robe-mode 'company-robe))