diff --git a/core/core-quickrun.el b/core/core-quickrun.el index 1c2adee7f..1e53d6168 100644 --- a/core/core-quickrun.el +++ b/core/core-quickrun.el @@ -17,16 +17,11 @@ (use-package repl-toggle :commands (rtog/toggle-repl rtog/add-repl) - :config + :init (setq rtog/goto-buffer-fun 'popwin:pop-to-buffer - rtog/mode-repl-alist - '((php-mode . php-boris) - (python-mode . run-python) - (lua-mode . run-lua) - (emacs-lisp-mode . ielm) - (ruby-mode . inf-ruby) - (js2-mode . nodejs-repl))) - ) + rtog/mode-repl-alist '()) + + (add-hook! repl-toggle-mode (evil-initialize-state 'emacs))) (provide 'core-quickrun) ;;; core-quickrun.el ends here diff --git a/core/lib/defuns-quickrun.el b/core/lib/defuns-quickrun.el index 33c199056..d3ff22214 100644 --- a/core/lib/defuns-quickrun.el +++ b/core/lib/defuns-quickrun.el @@ -70,5 +70,35 @@ If ARG is nil this function calls `recompile', otherwise it calls (insert (current-kill 0))))) (t (quickrun-replace-region beg end)))) +(defvar narf--repl-buffer nil) +;;;###autoload (autoload 'narf:repl "defuns-quickrun" nil t) +(evil-define-command narf:repl (&optional bang) + :repeat nil + (interactive "") + (if (and narf--repl-buffer (buffer-live-p narf--repl-buffer)) + (if (popwin:popup-window-live-p) + (popwin:select-popup-window) + (popwin:pop-to-buffer narf--repl-buffer)) + (rtog/toggle-repl (if (use-region-p) 4)) + (setq narf--repl-buffer (current-buffer)))) + +;;;###autoload (autoload 'narf:repl-eval "defuns-quickrun" nil t) +(evil-define-operator narf:repl-eval (&optional beg end bang) + :type inclusive + :repeat nil + (interactive "") + (let ((region-p (use-region-p)) + (selection (s-trim (buffer-substring-no-properties beg end)))) + (narf:repl bang) + (when (and region-p beg end) + (let* ((buf narf--repl-buffer) + (win (get-buffer-window buf))) + (unless (eq buf popwin:popup-buffer) + (popwin:pop-to-buffer buf nil t)) + (when (and narf--repl-buffer (buffer-live-p narf--repl-buffer)) + (with-current-buffer narf--repl-buffer + (goto-char (point-max)) + (insert selection))))))) + (provide 'defuns-quickrun) ;;; defuns-quickrun.el ends here diff --git a/core/lib/macros-quickrun.el b/core/lib/macros-quickrun.el index c3b16e7c9..8554a125b 100644 --- a/core/lib/macros-quickrun.el +++ b/core/lib/macros-quickrun.el @@ -9,5 +9,9 @@ additional check to make sure they exist in the project root." (narf/project-has-files ,build-file)) (setq narf--build-command '(,command . ,build-file))))) +;;;###autoload +(defmacro define-repl! (mode command) + `(push '(,mode . ,command) rtog/mode-repl-alist)) + (provide 'macros-quickrun) ;;; macros-quickrun.el ends here diff --git a/modules/module-js.el b/modules/module-js.el index 3efe5c6c7..069c56d15 100644 --- a/modules/module-js.el +++ b/modules/module-js.el @@ -3,6 +3,8 @@ (use-package js2-mode :mode "\\.js$" :interpreter "node" + :init + (define-repl! js2-mode nodejs-repl) :config (setq-default js2-skip-preprocessor-directives t diff --git a/modules/module-lisp.el b/modules/module-lisp.el index 97af0a3a7..907966f54 100644 --- a/modules/module-lisp.el +++ b/modules/module-lisp.el @@ -1,6 +1,7 @@ ;;; module-lisp --- all things lisp ;; see lib/elisp-defuns.el +(define-repl! emacs-lisp-mode ielm) (add-hook! emacs-lisp-mode 'turn-on-eldoc-mode) ;; [pedantry intensifies] diff --git a/modules/module-lua.el b/modules/module-lua.el index 436da178a..48efb0494 100644 --- a/modules/module-lua.el +++ b/modules/module-lua.el @@ -4,11 +4,16 @@ :mode "\\.lua$" :interpreter "lua" :init + (define-repl! lua-mode narf-inf-lua) (setq-default lua-indent-level tab-width) ;; (after! company-dict ;; (add-to-list 'company-dict-minor-mode-alist 'love-mode)) (add-hook! lua-mode '(narf|enable-tab-width-2 flycheck-mode)) - (add-hook! lua-mode (setq lua-indent-level 2))) + (add-hook! lua-mode (setq lua-indent-level 2)) + + (defun narf-inf-lua () + (lua-start-process "lua" "lua") + (pop-to-buffer lua-process-buffer))) (define-minor-mode love-mode "Buffer local minor mode for Love2D" diff --git a/modules/module-php.el b/modules/module-php.el index eeea66e66..a226843e0 100644 --- a/modules/module-php.el +++ b/modules/module-php.el @@ -24,7 +24,12 @@ (require 'php-refactor-mode) (add-hook! php-mode '(turn-on-eldoc-mode emr-initialize php-refactor-mode))) -(use-package php-boris :defer t) +(use-package php-boris :defer t + :init + (define-repl! php-mode php-boris) + :config + (evil-set-initial-state 'php-boris-mode 'emacs) + (setq php-boris-command "~/.dotfiles/scripts/run-boris")) (use-package hack-mode :mode "\\.hh$") diff --git a/modules/module-python.el b/modules/module-python.el index 723f6df84..abec95e99 100644 --- a/modules/module-python.el +++ b/modules/module-python.el @@ -12,6 +12,10 @@ python-shell-interpreter "ipython") :config (define-env-command! python-mode "python --version | cut -d' ' -f2") + (define-repl! python-mode narf-inf-python) + + (defun narf-inf-python () + (run-python python-shell-interpreter t t)) ;; interferes with smartparens (define-key python-mode-map (kbd "DEL") nil) diff --git a/modules/module-sh.el b/modules/module-sh.el index e593ca413..7aa5b8411 100644 --- a/modules/module-sh.el +++ b/modules/module-sh.el @@ -1,11 +1,19 @@ ;;; module-sh.el --- description -;; [pedantry intensifies] (after! sh-script - (defadvice sh-mode (after sh-mode-rename-modeline activate) - (setq mode-name "Sh")) + (define-repl! sh-mode narf-inf-shell) + (add-hook! sh-mode 'flycheck-mode) - (add-hook! sh-mode 'flycheck-mode)) + ;; [pedantry intensifies] + (defadvice sh-mode (after sh-mode-rename-modeline activate) + (setq mode-name "sh")) + + (defun narf-inf-shell () + (let* ((dest-sh (symbol-name sh-shell)) + (sh-shell-file dest-sh)) + (sh-shell-process t) + (with-current-buffer "*shell*" + (rename-buffer (format "*shell [%s]*" dest-sh)))))) (provide 'module-sh) ;;; module-sh.el ends here