From 378469b15ec2d73124fa91dd90411136221628a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Mar 2017 15:01:03 -0400 Subject: [PATCH] lang/javascript: add skewer-mode --- modules/lang/javascript/autoload.el | 43 +++++++++++++++++++++++++++++ modules/lang/javascript/config.el | 40 +++++++++++++++++++++++++-- modules/lang/javascript/packages.el | 1 + 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 3ea6645ac..23603c6dd 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -14,3 +14,46 @@ ignore the cache." (json-read-file package-file))) (puthash project-root json +javascript-npm-conf)))))) +;;;###autoload +(defun +javascript/repl () + "Open a Javascript REPL. Meaning either `skewer-repl', if any of the +skewer-*-mode's are enabled, or `nodejs-repl' otherwise." + (interactive) + (call-interactively + (if (and (featurep 'skewer-mode) + (or skewer-mode skewer-css-mode skewer-html-mode)) + 'skewer-repl + 'nodejs-repl))) + +;;;###autoload +(defun +javascript/skewer-this-buffer () + "Toggle a globalized skewer-mode, attaching an external browser (once), +initiating an internal httpd server (once) and enabling the appropriate +skewer-mode for the current buffer. + +Run this for any buffer you want to skewer." + (interactive) + (when (bound-and-true-p impatient-mode) + (error "Skewer-mode isn't compatible with impatient mode")) + (require 'skewer-mode) + (unless (process-status "httpd") + (run-skewer)) + (unless (and skewer-mode skewer-css-mode skewer-html-mode) + (pcase major-mode + ((or 'css-mode 'scss-mode 'less-css-mode) (skewer-css-mode +1)) + ((or 'web-mode 'html-mode) (skewer-html-mode +1)) + ('js2-mode (skewer-mode +1)) + (_ (error "Invalid mode %s" major-mode))))) + +;;;###autoload +(defun +javascript/skewer-cleanup () + "Disable skewer-mode globally and disable the httpd server." + (interactive) + (when (process-status "httpd") + (httpd-stop)) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (if skewer-mode (skewer-mode -1)) + (if skewer-css-mode (skewer-css-mode -1)) + (if skewer-html-mode (skewer-html-mode -1))))) + diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 52a7fec92..deee14bf5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -16,13 +16,14 @@ ;; Conform switch-case indentation to editorconfig's config (add-hook! 'js2-mode-hook (setq js-switch-indent-offset js-indent-level)) - (set! :repl 'js2-mode 'nodejs-repl) + (set! :repl 'js2-mode '+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.) :words '("||" "&&")) (set! :xref-backend 'js2-mode 'xref-js2-xref-backend) (map! :map js2-mode-map :localleader :nv ";" 'doom/append-semicolon + :n "s" '+javascript/skewer-this-buffer :prefix "r" :n "g" 'js2r-add-to-globals-annotation @@ -93,11 +94,46 @@ :init (setq coffee-indent-like-python-mode t)) -(def-package! web-beautify :commands web-beautify-js +(def-package! web-beautify + :commands web-beautify-js :init (map! :map* (json-mode js2-mode-map) :n "gQ" 'web-beautify-js)) +;; +;; Skewer-mode +;; + +(def-package! skewer-mode + :commands (skewer-mode run-skewer) + :config + (map! :map skewer-mode-map + :localleader + :n "s" nil + :n "sE" 'skewer-eval-last-expression + :n "se" 'skewer-eval-defun + :n "sf" 'skewer-load-buffer)) + +(def-package! skewer-css-mode ; in skewer-mode + :commands skewer-css-mode + :config + (map! :map skewer-css-mode-map + :localleader + :n "s" nil + :n "se" 'skewer-css-eval-current-declaration + :n "sr" 'skewer-css-eval-current-rule + :n "sb" 'skewer-css-eval-buffer + :n "sc" 'skewer-css-clear-all)) + +(def-package! skewer-html-mode ; in skewer-mode + :commands skewer-html-mode + :config + (map! :map skewer-html-mode-map + :localleader + :n "s" nil + :n "se" 'skewer-html-eval-tag)) + + ;; ;; Projects ;; diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 5d245d684..274ea1162 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -8,6 +8,7 @@ (package! nodejs-repl) (package! tern) (package! web-beautify) +(package! skewer-mode) (when (featurep! :completion company) (package! company-tern))