From e14e25ecb497bd0b578bdbf504999f2240ff6614 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Feb 2017 18:57:16 -0500 Subject: [PATCH] Update modules/lang/* --- modules/lang/asm/config.el | 10 -- modules/lang/assembly/config.el | 8 + modules/lang/assembly/packages.el | 6 + modules/lang/cc/autoload.el | 80 ++++++++++ modules/lang/cc/config.el | 163 ++++++++++++++------ modules/lang/cc/packages.el | 19 +++ modules/lang/cc/setup.sh | 48 ++++++ modules/lang/crystal/config.el | 15 +- modules/lang/crystal/packages.el | 5 + modules/lang/csharp/config.el | 74 ++++----- modules/lang/csharp/packages.el | 7 + modules/lang/csharp/setup.sh | 11 ++ modules/lang/css/config.el | 52 ------- modules/lang/data/config.el | 68 ++++---- modules/lang/data/packages.el | 9 ++ modules/lang/emacs-lisp/config.el | 21 ++- modules/lang/go/config.el | 52 +++---- modules/lang/go/packages.el | 8 + modules/lang/haskell/config.el | 18 +-- modules/lang/haskell/packages.el | 5 + modules/lang/java/autoload.el | 33 ++++ modules/lang/java/config.el | 38 +++-- modules/lang/java/packages.el | 7 + modules/lang/javascript/+screeps.el | 15 +- modules/lang/javascript/autoload.el | 21 +++ modules/lang/javascript/config.el | 126 +++++++++------ modules/lang/javascript/packages.el | 5 +- modules/lang/julia/autoload.el | 14 ++ modules/lang/julia/config.el | 7 +- modules/lang/julia/packages.el | 5 + modules/lang/latex/config.el | 79 ++++++---- modules/lang/latex/packages.el | 12 ++ modules/lang/lua/autoload.el | 9 ++ modules/lang/lua/config.el | 42 ++--- modules/lang/lua/packages.el | 9 ++ modules/lang/{text => markdown}/autoload.el | 4 +- modules/lang/{text => markdown}/config.el | 37 +++-- modules/lang/{text => markdown}/packages.el | 2 +- modules/lang/octave/config.el | 16 +- modules/lang/php/config.el | 133 ++++++++-------- modules/lang/php/packages.el | 13 ++ modules/lang/processing/config.el | 55 +++---- modules/lang/processing/packages.el | 4 + modules/lang/python/config.el | 107 ++++++------- modules/lang/python/packages.el | 9 ++ modules/lang/ruby/config.el | 98 ++++++------ modules/lang/ruby/packages.el | 10 ++ modules/lang/rust/config.el | 36 +++-- modules/lang/rust/packages.el | 10 ++ modules/lang/rust/setup.sh | 25 +++ modules/lang/scala/config.el | 22 +-- modules/lang/scala/packages.el | 6 + modules/lang/sh/autoload.el | 49 ++++++ modules/lang/sh/boostrap.el | 14 ++ modules/lang/sh/config.el | 30 ++-- modules/lang/sh/packages.el | 5 + modules/lang/sh/setup.sh | 12 ++ modules/lang/swift/config.el | 23 +-- modules/lang/swift/packages.el | 7 + modules/lang/typescript/config.el | 44 ++++++ modules/lang/typescript/packages.el | 6 + modules/lang/web/+css.el | 47 ++++++ modules/lang/web/+html.el | 63 ++++++++ modules/lang/web/autoload/css.el | 7 + modules/lang/web/autoload/evil.el | 20 +++ modules/lang/web/autoload/html.el | 59 +++++++ modules/lang/web/config.el | 145 +++++------------ modules/lang/web/packages.el | 18 +++ 68 files changed, 1487 insertions(+), 750 deletions(-) delete mode 100644 modules/lang/asm/config.el create mode 100644 modules/lang/assembly/config.el create mode 100644 modules/lang/assembly/packages.el create mode 100644 modules/lang/cc/autoload.el create mode 100644 modules/lang/cc/packages.el create mode 100755 modules/lang/cc/setup.sh create mode 100644 modules/lang/crystal/packages.el create mode 100644 modules/lang/csharp/packages.el create mode 100755 modules/lang/csharp/setup.sh delete mode 100644 modules/lang/css/config.el create mode 100644 modules/lang/data/packages.el create mode 100644 modules/lang/go/packages.el create mode 100644 modules/lang/haskell/packages.el create mode 100644 modules/lang/java/autoload.el create mode 100644 modules/lang/java/packages.el create mode 100644 modules/lang/javascript/autoload.el create mode 100644 modules/lang/julia/autoload.el create mode 100644 modules/lang/julia/packages.el create mode 100644 modules/lang/latex/packages.el create mode 100644 modules/lang/lua/autoload.el create mode 100644 modules/lang/lua/packages.el rename modules/lang/{text => markdown}/autoload.el (93%) rename modules/lang/{text => markdown}/config.el (55%) rename modules/lang/{text => markdown}/packages.el (73%) create mode 100644 modules/lang/php/packages.el create mode 100644 modules/lang/processing/packages.el create mode 100644 modules/lang/python/packages.el create mode 100644 modules/lang/ruby/packages.el create mode 100644 modules/lang/rust/packages.el create mode 100755 modules/lang/rust/setup.sh create mode 100644 modules/lang/scala/packages.el create mode 100644 modules/lang/sh/autoload.el create mode 100644 modules/lang/sh/boostrap.el create mode 100644 modules/lang/sh/packages.el create mode 100755 modules/lang/sh/setup.sh create mode 100644 modules/lang/swift/packages.el create mode 100644 modules/lang/typescript/config.el create mode 100644 modules/lang/typescript/packages.el create mode 100644 modules/lang/web/+css.el create mode 100644 modules/lang/web/+html.el create mode 100644 modules/lang/web/autoload/css.el create mode 100644 modules/lang/web/autoload/evil.el create mode 100644 modules/lang/web/autoload/html.el create mode 100644 modules/lang/web/packages.el diff --git a/modules/lang/asm/config.el b/modules/lang/asm/config.el deleted file mode 100644 index 4e1de3be6..000000000 --- a/modules/lang/asm/config.el +++ /dev/null @@ -1,10 +0,0 @@ -;;; module-asm.el - -(use-package mips-mode :mode "\\.mips$") - -(use-package haxor-mode :mode "\\.hax$") - -(use-package nasm-mode :defer t) - -(provide 'module-asm) -;;; module-asm.el ends here diff --git a/modules/lang/assembly/config.el b/modules/lang/assembly/config.el new file mode 100644 index 000000000..921411fb6 --- /dev/null +++ b/modules/lang/assembly/config.el @@ -0,0 +1,8 @@ +;;; lang/assembly/config.el + +(@def-package mips-mode :mode "\\.mips$") + +(@def-package haxor-mode :mode "\\.hax$") + +(@def-package nasm-mode :commands nasm-mode) + diff --git a/modules/lang/assembly/packages.el b/modules/lang/assembly/packages.el new file mode 100644 index 000000000..ee4acaf9e --- /dev/null +++ b/modules/lang/assembly/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/assembly/packages.el + +(@package mips-mode) +(@package haxor-mode) +(@package nasm-mode) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el new file mode 100644 index 000000000..4450d062c --- /dev/null +++ b/modules/lang/cc/autoload.el @@ -0,0 +1,80 @@ +;;; lang/cc/autoload.el + +;;;###autoload +(defun +cc/install () + (interactive) + (irony-install-server + (format + (concat "%s %s %s && %s --build . " + "--use-stderr --config Release --target install") + (shell-quote-argument irony-cmake-executable) + (shell-quote-argument (concat "-DCMAKE_INSTALL_PREFIX=" + (expand-file-name + irony-server-install-prefix))) + (shell-quote-argument irony-server-source-dir) + (shell-quote-argument irony-cmake-executable)))) + +;;;###autoload +(defun +cc/autoclose->-maybe () + "For some reason smartparens won't autoskip >'s, this hack does." + (interactive) + (if (save-excursion + (backward-char) + (looking-at-p "[^ \t]>")) + (forward-char) + (call-interactively 'self-insert-command))) + +(defun +cc--copy-face (new-face face) + "Define NEW-FACE from existing FACE." + (copy-face face new-face) + (eval `(defvar ,new-face nil)) + (set new-face new-face)) + +;;;###autoload +(defun +cc|extra-fontify-c++ () + ;; We could place some regexes into `c-mode-common-hook', but + ;; note that their evaluation order matters. + ;; NOTE modern-cpp-font-lock will eventually supercede some of these rules + (font-lock-add-keywords + nil '(;; c++11 string literals + ;; L"wide string" + ;; L"wide string with UNICODE codepoint: \u2018" + ;; u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string" + ("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face) + ;; R"(user-defined literal)" + ;; R"( a "quot'd" string )" + ;; R"delimiter(The String Data" )delimiter" + ;; R"delimiter((a-z))delimiter" is equivalent to "(a-z)" + ("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter + ( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t) ; actual string + ( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter + ) t)) + +;;;###autoload +(defun +cc|extra-fontify-c/c++ () + (font-lock-add-keywords + nil '(;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT + ("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face) + ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face) + ;; integer/float/scientific numbers + ("\\<\\([\\-+]*[0-9\\.]+\\)\\>" 1 font-lock-constant-face t) + ("\\<\\([\\-+]*[0-9\\.]+\\)\\(f\\)\\>" + (1 font-lock-constant-face t) + (2 font-lock-keyword-face t)) + ("\\<\\([\\-+]*[0-9\\.]+\\)\\([eE]\\)\\([\\-+]?[0-9]+\\)\\>" + (1 font-lock-constant-face t) + (2 font-lock-keyword-face t) + (3 font-lock-constant-face t)) + ) t)) + +;;;###autoload +(defun +cc-sp-point-is-template-p (id action context) + (and (sp-in-code-p id action context) + (sp-point-after-word-p id action context))) + +;;;###autoload +(defun +cc-sp-point-after-include-p (id action context) + (and (sp-in-code-p id action context) + (save-excursion + (goto-char (line-beginning-position)) + (looking-at-p "[ ]*#include[^<]+")))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 42bfaf557..0fe9bdf3b 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -1,91 +1,156 @@ -;;; module-cc.el --- C, C++, and Objective-C +;;; lang/cc/config.el --- C, C++, and Objective-C -(use-package cc-mode +(@def-package cc-mode :commands (c-mode c++-mode objc-mode java-mode) :mode ("\\.mm" . objc-mode) :init - (add-hook! (c-mode c++-mode) 'doom|extra-fontify-c/c++) - (add-hook 'c-mode-hook 'highlight-numbers-mode) - (add-hook 'c++-mode-hook 'doom|extra-fontify-c++) - (add-hook 'c-initialization-hook 'doom|init-c/c++-settings) - - ;; C++ header files - (push (cons (lambda () (and (f-ext? buffer-file-name "h") - (or (f-exists? (f-swap-ext buffer-file-name "cpp")) - (awhen (car-safe (projectile-get-other-files (buffer-file-name) (projectile-current-project-files))) - (f-ext? it "cpp"))))) + ;; Auto-detect C++ header files + (push (cons (lambda () + (and (equal (file-name-extension buffer-file-name) "h") + (or (file-exists-p (expand-file-name + (concat (file-name-sans-extension buffer-file-name) + ".cpp"))) + (when-let (file (car-safe (projectile-get-other-files + buffer-file-name + (projectile-current-project-files)))) + (equal (file-name-extension file) "cpp"))))) 'c++-mode) magic-mode-alist) - ;; Obj-C - (push (cons (lambda () (and (f-ext? buffer-file-name "h") + ;; Auto-detect Obj-C header files + (push (cons (lambda () (and (equal (file-name-extension buffer-file-name) "h") (re-search-forward "@\\" magic-mode-regexp-match-limit t))) 'objc-mode) magic-mode-alist) :config - (def-electric! (c-mode c++-mode objc-mode) :chars (?\n ?\})) - (def-company-backend! (c-mode c++-mode objc-mode) (irony-c-headers irony)) - (setq c-tab-always-indent nil c-electric-flag nil) - (map! :map c-mode-base-map (:localleader :nv ";" 'doom/append-semicolon)) + ;; extra highlights for numbers in C (`modern-cpp-font-lock' offers something better for C++) + (add-hook 'c-mode-hook 'highlight-numbers-mode) + ;; Fontification of C++11 string literals + (add-hook 'c++-mode-hook '+cc|extra-fontify-c++) + + (@set :electric '(c-mode c++-mode objc-mode java-mode) + :chars ?\n ?\}) + + (@set :company-backend + '(c-mode c++-mode objc-mode) + '(company-irony-c-headers company-irony)) (sp-with-modes '(c-mode c++-mode objc-mode java-mode) - (sp-local-pair "<" ">" :when '(doom/sp-point-is-template-p doom/sp-point-after-include-p)) + (sp-local-pair "<" ">" :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p)) (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))) ;; Doxygen blocks (sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC"))) (sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC")))) ;; Improve indentation of inline lambdas in C++11 - (advice-add 'c-lineup-arglist :around 'doom/c-lineup-arglist)) + (advice-add 'c-lineup-arglist :around '+c-lineup-arglist) -(use-package modern-cpp-font-lock + ;; C/C++ style settings + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) + (c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open + (c-set-offset 'inline-open '+) + (c-set-offset 'block-open '+) + (c-set-offset 'brace-list-open '+) ; all "opens" should be indented by the c-indent-level + (c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too + (c-set-offset 'access-label '-) + (c-set-offset 'arglist-intro '+) + (c-set-offset 'arglist-close '0) + + (defun +cc--c-lineup-inclass (langelem) + (let ((inclass (assoc 'inclass c-syntactic-context))) + (save-excursion + (goto-char (c-langelem-pos inclass)) + (if (or (looking-at "struct") + (looking-at "typedef struct")) + '+ + '++)))) + (c-set-offset 'inclass '+cc--c-lineup-inclass) + + + ;; Certain mappings interfere with smartparens and custom bindings, + ;; so unbind them + (@map :map c-mode-map + "DEL" nil + "#" 'self-insert-command + "{" 'self-insert-command + "}" 'self-insert-command + "/" 'self-insert-command + "*" 'self-insert-command + ";" 'self-insert-command + "," 'self-insert-command + ":" 'self-insert-command + "(" 'self-insert-command + ")" 'self-insert-command + + :map c++-mode-map + "}" nil + + ;; Smartparens and cc-mode both try to autoclose + ;; angle-brackets intelligently. The result isn't very + ;; intelligent (causes redundant characters), so we just do it + ;; ourselves. + "<" nil + :map (c-mode-base-map c++-mode-map) + :i ">" '+cc/autoclose->-maybe)) + + +(@def-package modern-cpp-font-lock :commands modern-c++-font-lock-mode :init (add-hook 'c++-mode-hook 'modern-c++-font-lock-mode)) -(use-package irony + +(@def-package irony :after cc-mode :config - (setq irony-server-install-prefix (concat doom-ext-dir "/irony-mode/server/build/irony/")) - (add-hook! c++-mode + (setq irony-server-install-prefix (concat doom-cache-dir "irony-server/")) + (@add-hook 'irony-mode-hook '(irony-eldoc flycheck-mode)) + (@add-hook 'c++-mode-hook (make-local-variable 'irony-additional-clang-options) - (push "-std=c++11" irony-additional-clang-options)) + (push "-std=c++11" irony-additional-clang-options))) - (require 'irony-eldoc) - (require 'company-irony) - (require 'company-irony-c-headers) - (require 'flycheck-irony) - (flycheck-irony-setup) +(@def-package irony-eldoc :after irony) - ;; some c-mode dervied modes wrongfully trigger these hooks (like php-mode) - (add-hook! (c-mode c++-mode objc-mode) - (when (memq major-mode '(c-mode c++-mode objc-mode)) - (flycheck-mode +1) - (irony-mode +1) - (eldoc-mode +1) - (irony-eldoc +1)))) +(@def-package flycheck-irony :after irony :config (flycheck-irony-setup)) -(use-package disaster :commands (disaster)) ;; -(use-package cmake-mode +;; Tools +;; + +(@def-package disaster :commands disaster) + + +;; +;; Plugins +;; + +(@def-package company-cmake :after cmake-mode) + +(@def-package company-irony :after irony) + +(@def-package company-irony-c-headers :after company-irony) + + +;; +;; Major modes +;; + +(@def-package cmake-mode :mode "CMakeLists\\.txt$" - :config (def-company-backend! cmake-mode (cmake yasnippet))) + :config + (@set :company-backend 'cmake-mode '(company-cmake company-yasnippet))) -(use-package company-cmake :after cmake-mode) +(@def-package glsl-mode :mode ("\\.glsl\\'" "\\.vert\\'" "\\.frag\\'" "\\.geom\\'")) -(use-package glsl-mode :mode ("\\.glsl\\'" "\\.vert\\'" "\\.frag\\'" "\\.geom\\'")) +(@def-package cuda-mode :mode "\\.cuh?$") -(use-package cuda-mode :mode "\\.cuh?$") +(@def-package opencl-mode :mode "\\.cl$") -(use-package opencl-mode :mode "\\.cl$") - -(use-package demangle-mode +(@def-package demangle-mode :commands demangle-mode :init (add-hook 'llvm-mode-hook 'demangle-mode)) - -(provide 'module-cc) -;;; module-cc.el ends here diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el new file mode 100644 index 000000000..34ace102d --- /dev/null +++ b/modules/lang/cc/packages.el @@ -0,0 +1,19 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/cc/packages.el + +(@package cmake-mode) +(@package cuda-mode) +(@package demangle-mode) +(@package disaster) +(@package glsl-mode) +(@package irony) +(@package irony-eldoc) +(@package opencl-mode) +(@package modern-cpp-font-lock) + +(when (@featurep :feature syntax-checker) + (@package flycheck-irony)) + +(when (@featurep :completion company) + (@package company-irony) + (@package company-irony-c-headers)) diff --git a/modules/lang/cc/setup.sh b/modules/lang/cc/setup.sh new file mode 100755 index 000000000..cd5c3ef41 --- /dev/null +++ b/modules/lang/cc/setup.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +source VARS + +# +echo "Setting up C/C++ (irony-mode)" + +case "$OSTYPE" in + darwin*) + brew install cmake + brew install llvm --with-clang + ;; + linux*) + if is-arch; then + sudo pacman --noconfirm --needed -S cmake clang + elif is-deb; then + echo "Not implemented" + exit 1 + fi + ;; +esac + +# Build irony-server +git-repo "https://github.com/Sarcasm/irony-mode" "irony-mode" + +# Reset build directory +cd irony-mode/server +[ -d build ] && rm -rf build +mkdir build && cd build + +DEST="$(pwd)/irony-mode/server/build/irony/" + +# Compile +if is-mac +then + cmake -DCMAKE_INSTALL_RPATH_USE_LINK_PATH\=ON \ + -DCMAKE_INSTALL_PREFIX\="$DEST" ../ +else + cmake -DCMAKE_INSTALL_PREFIX\="$DEST" ../ +fi +cmake --build . --use-stderr --config Release --target install + +if is-mac +then + install_name_tool -change @rpath/libclang.dylib \ + /usr/local/opt/llvm/lib/libclang.dylib \ + $DEST/bin/irony-server +fi diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 2bd103459..3f7119ebf 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -1,16 +1,11 @@ ;;; module-crystal.el -(use-package crystal-mode +(@def-package crystal-mode :mode "\\.cr$" :interpreter "crystal" :config - (def-docset! crystal-mode "crystal") - (after! quickrun - (quickrun-add-command - "crystal" '((:command . "crystal") - (:exec . "%c %s") - (:description . "Run Crystal script")) - :mode 'crystal-mode))) + (@set :eval 'crystal-mode + '((:command . "crystal") + (:exec . "%c %s") + (:description . "Run Crystal script")))) -(provide 'module-crystal) -;;; module-crystal.el ends here diff --git a/modules/lang/crystal/packages.el b/modules/lang/crystal/packages.el new file mode 100644 index 000000000..b565b26c9 --- /dev/null +++ b/modules/lang/crystal/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/crystal/packages.el + +(@package crystal-mode :recipe (:fetcher github :repo "dotmilk/emacs-crystal-mode")) + diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 13167107a..531f6f225 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,49 +1,49 @@ -;;; module-csharp.el --- -*- no-byte-compile: t; -*- +;;; module-csharp.el -(use-package csharp-mode +(@def-package csharp-mode :mode "\\.cs$" :init (add-hook 'csharp-mode-hook 'flycheck-mode)) -(use-package shader-mode :mode "\\.shader$") ; unity shaders -(use-package omnisharp - :commands (omnisharp-mode) +(@def-package omnisharp + :commands omnisharp-mode :preface (setq omnisharp-auto-complete-want-documentation nil - omnisharp-server-executable-path (concat doom-ext-dir "/OmniSharp.exe")) + omnisharp-server-executable-path (concat doom-local-dir "OmniSharp.exe")) :when (file-exists-p omnisharp-server-executable-path) - :init (add-hook! csharp-mode '(eldoc-mode omnisharp-mode)) + :init + (@add-hook csharp-mode '(eldoc-mode omnisharp-mode)) :config - (def-company-backend! csharp-mode (omnisharp)) - (map! :map omnisharp-mode-map - "gd" 'omnisharp-go-to-definition - (:localleader - "tr" (λ! (omnisharp-unit-test "fixture")) - "ts" (λ! (omnisharp-unit-test "single")) - "ta" (λ! (omnisharp-unit-test "all")))) + (@set :company-backend 'csharp-mode '(company-omnisharp)) ;; Map all refactor commands (see emr) - (mapc (lambda (x) - (let ((command-name (car x)) - (title (cadr x))) - (emr-declare-command - (intern (format "omnisharp-%s" (symbol-name command-name))) - :title title :modes 'omnisharp-mode))) - '((find-usages "find usages") - (find-implementations "find implementations") - (fix-code-issue-at-point "fix code issue at point") - (fix-usings "fix usings") - (rename "rename") - (current-type-information "current type information") - (current-type-documentation "current type documentation") - (navigate-to-current-file-member "navigate to current file member") - (navigate-to-solution-member "navigate to solution member") - (navigate-to-solution-file-then-file-member "navigate to solution file then member") - (navigate-to-solution-file "navigate to solution file") - (navigate-to-region "navigate to region") - (show-last-auto-complete-result "last auto complete result") - (show-overloads-at-point "show overloads at point") - (recompile "recompile")))) + (@map :map omnisharp-mode-map + :n "gd" 'omnisharp-go-to-definition + + :localleader + :n "b" 'omnisharp-recompile + + :prefix "r" + :n "fu" 'omnisharp-find-usages + :n "fi" 'omnisharp-find-implementations + :n "i" 'omnisharp-fix-code-issue-at-point + :n "u" 'omnisharp-fix-usings + :n "r" 'omnisharp-rename + :n "ti" 'omnisharp-current-type-information + :n "td" 'omnisharp-current-type-documentation + :n "gf" 'omnisharp-navigate-to-current-file-member + :n "gm" 'omnisharp-navigate-to-solution-member + :n "gM" 'omnisharp-navigate-to-solution-file-then-file-member + :n "gF" 'omnisharp-navigate-to-solution-file + :n "gr" 'omnisharp-navigate-to-region + :n "a" 'omnisharp-show-last-auto-complete-result + :n "o" 'omnisharp-show-overloads-at-point + + :prefix "t" + :n "tr" (@λ (omnisharp-unit-test "fixture")) + :n "ts" (@λ (omnisharp-unit-test "single")) + :n "ta" (@λ (omnisharp-unit-test "all")))) + + +(@def-package shader-mode :mode "\\.shader$") ; unity shaders -(provide 'module-csharp) -;;; module-csharp.el ends here diff --git a/modules/lang/csharp/packages.el b/modules/lang/csharp/packages.el new file mode 100644 index 000000000..96e7f4edd --- /dev/null +++ b/modules/lang/csharp/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/csharp/packages.el + +(@package csharp-mode) +(@package omnisharp) +(@package shader-mode) + diff --git a/modules/lang/csharp/setup.sh b/modules/lang/csharp/setup.sh new file mode 100755 index 000000000..9d0ceb478 --- /dev/null +++ b/modules/lang/csharp/setup.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +source VARS + +# +echo "Setting up C# (omnisharp)" + +git-repo "https://github.com/OmniSharp/omnisharp-server" omnisharp +cd omnisharp && xbuild +mv omnisharp/bin/Debug/OmniSharp.exe ./OmniSharp.exe +rm -rf omnisharp diff --git a/modules/lang/css/config.el b/modules/lang/css/config.el deleted file mode 100644 index f762e771e..000000000 --- a/modules/lang/css/config.el +++ /dev/null @@ -1,52 +0,0 @@ -;;; module-css.el - -(after! emr - (emr-declare-command 'doom/css-toggle-inline-or-block - :title "toggle inline/block" - :modes '(css-mode less-css-mode scss-mode) - :predicate (lambda () (not (use-region-p))))) - -(sp-with-modes '(css-mode scss-mode less-css-mode stylus-mode) - (sp-local-pair "/*" "*/" :post-handlers '(("[d-3]||\n[i]" "RET") ("| " "SPC")))) - -(map! (:map* (css-mode-map scss-mode-map less-css-mode-map) - :n "M-R" 'doom/web-refresh-browser) - (:map* (css-mode-map scss-mode-map less-css-mode-map) - :localleader :nv ";" 'doom/append-semicolon)) - -;; css & scss -(use-package css-mode - :mode (("\\.css$" . css-mode) - ("\\.scss$" . scss-mode)) - :init - (add-hook! css-mode - '(yas-minor-mode-on flycheck-mode rainbow-mode highlight-numbers-mode - doom|counsel-css-imenu-setup)) - :config - (def-company-backend! css-mode (css yasnippet)) - (push '("css" "scss" "sass" "less" "styl") projectile-other-file-alist) - - (def-builder! scss-mode doom/scss-build) - (def-company-backend! scss-mode (css yasnippet)) - (def-docset! scss-mode "sass,bourbon,compass,neat,css") - (push '("scss" "css") projectile-other-file-alist)) - -(use-package sass-mode - :mode "\\.sass$" - :config - (setq sass-command-options '("--style compressed")) - (def-builder! sass-mode doom/sass-build) - (def-company-backend! sass-mode (css yasnippet)) - (push '("sass" "css") projectile-other-file-alist)) - -(use-package less-css-mode - :mode "\\.less$" - :config (push '("less" "css") projectile-other-file-alist)) - -(use-package stylus-mode - :mode "\\.styl$" - :init (add-hook! stylus-mode '(yas-minor-mode-on flycheck-mode)) - :config (push '("styl" "css") projectile-other-file-alist)) - -(provide 'module-css) -;;; module-css.el ends here diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 8b38c89dc..bb5868b96 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,40 +1,52 @@ ;;; module-data.el -(associate! conf-mode :match "/sxhkdrc$") +(@associate conf-mode :match "/sxhkdrc$") -(associate! nxml-mode :match "\\.plist$") -(after! nxml-mode - (def-company-backend! nxml-mode (nxml yasnippet))) -(use-package toml-mode :mode "\\.toml$") - -(use-package yaml-mode :mode "\\.ya?ml$" - :config (def-electric! yaml-mode :chars (?\n ?\: ?\-))) - -(use-package json-mode :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" - :config (def-electric! json-mode :chars (?\n ?: ?{ ?}))) - -(use-package vimrc-mode - :mode ("/\\.?g?vimrc$" "\\.vim$" "/\\.vim/rc/.+$" "/\\.?vimperatorrc$" "\\.vimp$")) - -(use-package dockerfile-mode :mode "/Dockerfile$" +(@def-package nxml-mode + :mode "\\.plist$" :config - (def-docset! dockerfile-mode "docker") - (def-builder! dockerfile-mode dockerfile-build-buffer "Dockerfile")) + (@set :company-backend 'nxml-mode '(company-nxml company-yasnippet))) + + +(@def-package toml-mode :mode "\\.toml$") + + +(@def-package yaml-mode + :mode "\\.ya?ml$" + :config + (@set :electric 'yaml-mode :chars ?\n ?\: ?\-)) + + +(@def-package json-mode :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" + :config + (@set :electric 'json-mode :chars ?\n ?: ?{ ?})) + + +(@def-package vimrc-mode + :mode ("/\\.?g?vimrc$" "\\.vim$" "/\\.?vimperatorrc$" "\\.vimp$")) + + +(@def-package dockerfile-mode + :mode "/Dockerfile$" + :config + ;; TODO + (@set :build 'docker 'dockerfile-mode '+data-dockerfile-p '+data/dockerfile-build)) + ;; For ROM hacking or debugging -(use-package hexl-mode +(@def-package hexl-mode :mode ("\\.hex$" "\\.nes$")) + +;; +;; Frameworks ;; -(def-project-type! ansible-mode "ans" - :modes (yaml-mode) - :files ("roles/") - (def-company-backend! ansible-mode (ansible))) -(use-package company-ansible :commands (company-ansible)) -(def-project-type! vagrant "vagrant" - :files ("Vagrantfile")) +;; (@def-project ansible-mode "ans" +;; :modes (yaml-mode) +;; :files ("roles/")) + +;; (@def-project vagrant "vagrant" +;; :files ("Vagrantfile")) -(provide 'module-data) -;;; module-data.el ends here diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el new file mode 100644 index 000000000..07441794b --- /dev/null +++ b/modules/lang/data/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/data/packages.el + +(@package dockerfile-mode) +(@package json-mode) +(@package toml-mode) +(@package vimrc-mode) +(@package yaml-mode) + diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7ba7d1b3d..90aaadc1f 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,14 +1,14 @@ ;;; lang/emacs-lisp/config.el -(@def-package elisp-mode +(@def-package elisp-mode ; built-in :mode ("/Cask$" . emacs-lisp-mode) :init - (@add-hook emacs-lisp-mode '(highlight-quoted-mode auto-compile-on-save-mode +emacs-lisp|hook)) + (add-hook 'emacs-lisp-mode-hook '+emacs-lisp|hook) :config (@map :map emacs-lisp-mode-map :m "gd" '+emacs-lisp/find-function - :leader :m "gd" '+emacs-lisp/find-function-other-window) + :leader :m "gd" '+emacs-lisp/find-function-in-other-window) ;; Don't affect lisp indentation (only `tab-width') (setq editorconfig-indentation-alist @@ -19,11 +19,15 @@ (setq mode-name "Elisp") ; [pedantry intensifies] (add-hook 'before-save-hook 'delete-trailing-whitespace nil t) + (eldoc-mode +1) + (highlight-quoted-mode +1) + (auto-compile-on-save-mode +1) + (font-lock-add-keywords nil `(;; Display "lambda" as λ ("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) ?λ 'decompose-region)))) ;; Highlight doom/module functions - ("\\(^\\|\\s-\\)(\\(\\(doom\\|\\+\\)[^) ]+\\)[) \n]" (2 font-lock-builtin-face)) + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\)[) \n]" (2 font-lock-builtin-face)) ;; Highlight doom macros (no need, macros are fontified in emacs 25+) ;; ("\\(^\\|\\s-\\)(\\(@[^) ]+\\)[) \n]" (2 font-lock-preprocessor-face append)) )) @@ -38,20 +42,13 @@ ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) - ("Functions" "^\\-s*(\\(?:cl-\\)?def\\(?:un\\*?\\|method\\|generic\\) +\\([^ )\n]+\\)" 1) + ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\) +\\([^ )\n]+\\)" 1) ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) )))) -(@after debug ;; elisp debugging - (@map :map debugger-mode-map - :n "RET" 'debug-help-follow - :n "n" 'debugger-step-through - :n "c" 'debugger-continue)) - - ;; ;; Plugins ;; diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index aded97963..4d026ee57 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -1,43 +1,37 @@ -;;; module-go.el +;;; lang/go/config.el -(use-package go-mode +(@def-package go-mode :mode "\\.go$" :interpreter "go" :init (add-hook 'go-mode-hook 'flycheck-mode) - (add-hook! go-mode (add-hook 'before-save-hook 'gofmt-before-save)) + (@add-hook go-mode (add-hook 'before-save-hook 'gofmt-before-save)) :config - (def-builder! go-mode "go build") - (def-company-backend! go-mode (go yasnippet)) - (def-repl! go-mode gorepl-run) - (map! :map go-mode-map + (@set :build 'go-build 'go-mode '+go/build) + (@set :company-backend 'go-mode '(company-go company-yasnippet)) + (@set :repl 'go-mode 'gorepl-run) + + (@map :map go-mode-map :n "gd" 'godef-jump - (:leader :n "h" 'godef-describe) (:localleader - :n "tr" 'doom:go-test-run-all - :n "ta" 'doom:go-test-run-all - :n "ts" 'doom:go-test-run-package)) + :n "k" 'godef-describe + :prefix "r" + :n "i" go-remove-unused-imports + :nv "f" gofmt + :prefix "t" + :n "r" '+go/test-run-all + :n "a" '+go/test-run-all + :n "s" '+go/test-run-package))) - (mapc (lambda (x) - (let ((command-name (car x)) - (title (cadr x)) - (region-p (caddr x)) - predicate) - (setq predicate (cond ((eq region-p 'both) nil) - (t (if region-p - (lambda () (use-region-p)) - (lambda () (not (use-region-p))))))) - (emr-declare-command (intern (symbol-name command-name)) - :title title :modes 'go-mode :predicate predicate))) - '((go-remove-unused-imports "Remove unused imports" nil) - (gofmt "Format code" nil)))) -(use-package go-eldoc :after go-mode +(@def-package company-go :after go-mode) + + +(@def-package go-eldoc + :after go-mode :init (add-hook 'go-mode-hook 'go-eldoc-setup)) -(use-package company-go :after go-mode) -(use-package gorepl-mode :commands (gorepl-run gorepl-run-load-current-file)) +(@def-package gorepl-mode + :commands (gorepl-run gorepl-run-load-current-file)) -(provide 'module-go) -;;; module-go.el ends here diff --git a/modules/lang/go/packages.el b/modules/lang/go/packages.el new file mode 100644 index 000000000..3924bf608 --- /dev/null +++ b/modules/lang/go/packages.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/go/packages.el + +(@package go-eldoc) +(@package go-mode) +(@package gorepl-mode) +(when (@featurep :completion company) + (@package company-go)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index b100b7718..132def0a7 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -1,20 +1,20 @@ ;;; module-haskell.el -(use-package haskell +(@def-package haskell :mode (("\\.hs$" . haskell-mode) ("\\.ghci$" . ghci-script-mode) ("\\.cabal$" . haskell-cabal-mode)) :interpreter (("runghc" . haskell-mode) ("runhaskell" . haskell-mode)) - :init (add-hook! haskell-mode '(interactive-haskell-mode flycheck-mode)) + :init + (@add-hook haskell-mode '(interactive-haskell-mode flycheck-mode)) :config - (def-popup! "*debug:haskell*" :size 20) - (def-repl! haskell-mode switch-to-haskell) + (@set :popup "*debug:haskell*" :size 20) + (@set :repl 'haskell-mode 'switch-to-haskell) (push ".hi" completion-ignored-extensions)) -(use-package inf-haskell - :commands (inferior-haskell-mode inf-haskell-mode switch-to-haskell) - :config (map! :map inf-haskell-mode-map "ESC ESC" 'doom/popup-close)) -(provide 'module-haskell) -;;; module-haskell.el ends here +(@def-package inf-haskell ; part of haskell + :commands (inferior-haskell-mode inf-haskell-mode switch-to-haskell) + :config (@map :map inf-haskell-mode-map "ESC ESC" 'doom/popup-close)) + diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el new file mode 100644 index 000000000..64517ab35 --- /dev/null +++ b/modules/lang/haskell/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/haskell/packages.el + +(@package haskell-mode) + diff --git a/modules/lang/java/autoload.el b/modules/lang/java/autoload.el new file mode 100644 index 000000000..1a52c3180 --- /dev/null +++ b/modules/lang/java/autoload.el @@ -0,0 +1,33 @@ +;;; lang/java/config.el + +;; yasnippet defuns +;;;###autoload +(defun +java-android-mode-is-layout-file () + (and android-mode + (eq major-mode 'nxml-mode) + (string-equal (file-name-base (directory-file-name default-directory)) "layout"))) + +;;;###autoload +(defun +java-android-mode-in-tags (&rest tags) + (-contains? tags (android-mode-tag-name))) + +;;;###autoload +(defun +java-android-mode-tag-name () + (save-excursion + (let (beg end) + (nxml-backward-up-element) + (evil-forward-word-begin) + (setq beg (point)) + (evil-forward-WORD-end) + (setq end (1+ (point))) + (buffer-substring-no-properties beg end)))) + +;;;###autoload +(defun +java|android-mode-maybe () + (let ((root (doom-project-root))) + (when (or (doom-project-has-files "local.properties" root) + (doom-project-has-files "AndroidManifest.xml" root) + (doom-project-has-files "src/main/AndroidManifest.xml" root)) + (android-mode +1) + (doom/set-build-command "./gradlew %s" "build.gradle")))) + diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 49ace9deb..94f8e2151 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -1,37 +1,35 @@ -;;; module-java.el +;;; lang/java/config.el -(use-package meghanada +(@def-package meghanada :commands meghanada-mode :init - (add-hook! java-mode '(meghanada-mode flycheck-mode)) + (@add-hook java-mode '(meghanada-mode flycheck-mode)) :config - (def-docset! java-mode "java,javafx,grails,groovy,playjava,spring,cvj,processing,javadoc") - (def-builder! java-mode meghanada-compile-project) + (@set :build 'compile-file 'java-mode 'meghanada-compile-file) + (@set :build 'compile-project 'java-mode 'meghanada-compile-project) - (setq meghanada-server-install-dir (f-expand "meghanada-server" doom-ext-dir) + (setq meghanada-server-install-dir (expand-file-name "meghanada-server" doom-cache-dir) meghanada-use-company t meghanada-use-flycheck t meghanada-use-auto-start t) - (unless (f-exists? (meghanada--locate-server-jar)) - (meghanada-install-server)) + (@map :map meghanada-mode-map :m "gd" 'meghanada-jump-declaration) - (map! :map meghanada-mode-map :m "gd" 'meghanada-jump-declaration)) + (unless (file-exists-p (meghanada--locate-server-jar)) + (meghanada-install-server))) -(use-package android-mode + +(@def-package android-mode :commands android-mode :init - (add-hook! (java-mode groovy-mode nxml-mode) 'doom|android-mode-enable-maybe) + (@add-hook (java-mode groovy-mode nxml-mode) '+java|android-mode-maybe) :config - (def-yas-mode! android-mode) - (after! company-dict - (push 'android-mode company-dict-minor-mode-list))) + (@set :yas-minor-mode 'android-mode) + (@set :company-dict-minor-mode 'android-mode)) -(use-package groovy-mode - :mode "\\.g\\(radle\\|vy\\|roovy\\)$" + +(@def-package groovy-mode + :mode "\\.g\\(radle\\|roovy\\)$" :config - (after! quickrun - (push '("\\.gvy$" . "groovy") quickrun-file-alist))) + (@set :eval 'groovy-mode "groovy")) -(provide 'module-java) -;;; module-java.el ends here diff --git a/modules/lang/java/packages.el b/modules/lang/java/packages.el new file mode 100644 index 000000000..e6f72de5f --- /dev/null +++ b/modules/lang/java/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/java/packages.el + +(@package meghanada) +(@package android-mode) +(@package groovy-mode) + diff --git a/modules/lang/javascript/+screeps.el b/modules/lang/javascript/+screeps.el index 940109e13..f2f5a8558 100644 --- a/modules/lang/javascript/+screeps.el +++ b/modules/lang/javascript/+screeps.el @@ -165,12 +165,13 @@ "REACTIONS" "BODYPARTS_ALL" "RESOURCES_ALL" "COLORS_ALL")) -(project! screeps "screeps" - :match "/screeps/.+$" - :modes (nodejs-project-mode)) +;; TODO +;; (@def-project screeps "screeps" +;; :match "/screeps/.+$" +;; :modes (nodejs-project-mode)) -(@add-hook screeps-project-mode - (when (eq major-mode 'js2-mode) - (add-to-list 'flycheck-disabled-checkers 'javascript-jshint) - (setq js2-additional-externs (append '("_") screeps-objects screeps-constants)))) +;; (@add-hook screeps-project-mode +;; (when (eq major-mode 'js2-mode) +;; (add-to-list 'flycheck-disabled-checkers 'javascript-jshint) +;; (setq js2-additional-externs (append '("_") screeps-objects screeps-constants)))) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el new file mode 100644 index 000000000..0bb068bc2 --- /dev/null +++ b/modules/lang/javascript/autoload.el @@ -0,0 +1,21 @@ +;;; lang/javascript/autoload.el + +;;;###autoload +(defun +javascript/install () + "Installs NodeJS and tern." + (interactive) + (pcase (doom-system-os) + ('arch + (unless (and (executable-find "node") + (executable-find "npm")) + (doom-sudo "pacman --needed --noconfirm -S nodejs npm"))) + ('debian) ;; TODO + ('macos + (unless (executable-find "node") + (doom-sh "brew install node"))) + (_ (error "Not a supported OS"))) + (unless (executable-find "node") + (error "node isn't installed, run `+javascript/install' again")) + (unless (executable-find "tern") + (sh "npm -g install tern"))) + diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index ca9f653a9..634ed9f21 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -1,58 +1,84 @@ ;; lang/javascript/config.el +;; TODO (@load +screeps) + (@def-package js2-mode :mode "\\.js$" :interpreter "node" - :init + :config (setq js2-skip-preprocessor-directives t js2-highlight-external-variables nil js2-mode-show-parse-errors nil) - :config - (@add-hook '(tern-mode flycheck-mode highlight-indent-guides-mode)) - ;; Only way to conform switch-case indentation to editorconfig's config - (@add-hook (setq js-switch-indent-offset js-indent-level)) + (@add-hook js2-mode '(tern-mode flycheck-mode highlight-indent-guides-mode)) + ;; Conform switch-case indentation to editorconfig's config + (@add-hook js2-mode (setq js-switch-indent-offset js-indent-level)) - (@map :map js2-mode-map :localleader :nv ";" 'doom/append-semicolon) + (@set :repl 'js2-mode 'nodejs-repl) - (@set :repl nodejs-repl) - (@set :company-backends tern) - (@set :electric-chars ?\} ?\) ?.) - (@set :electric-words "||" "&&") - (@set :emr - (:v js2r-extract-function "extract function") - (:v js2r-extract-method "extract method") - (:v js2r-introduce-parameter "introduce parameter") - (:n js2r-localize-parameter "localize parameter") - (:n js2r-expand-object "expand object") - (:n js2r-contract-object "contract object") - (:n js2r-expand-function "expand function") - (:n js2r-contract-function "contract function") - (:n js2r-expand-array "expand array") - (:n js2r-contract-array "contract array") - (:n js2r-wrap-buffer-in-iife "wrap buffer in ii function") - (:v js2r-inject-global-in-iife "inject global in ii function") - (:n js2r-add-to-globals-annotation "add to globals annotation") - (:v js2r-extract-var "extract variable") - (:v js2r-inline-var "inline variable") - (:n js2r-rename-var "rename variable") - (:n js2r-var-to-this "var to this") - (:n js2r-arguments-to-object "arguments to object") - (:n js2r-ternary-to-if "ternary to if") - (:n js2r-split-var-declaration "split var declaration") - (:n js2r-split-string "split string") - (:v js2r-unwrap "unwrap") - (:nv js2r-log-this "log this") - (:nv js2r-debug-this "debug this") - (:n js2r-forward-slurp "forward slurp") - (:n js2r-forward-barf "forward barf"))) + (@set :company-backend 'js2-mode '(company-tern)) -(@def-package js2-refactor :after emr) + (@set :electric 'js2-mode + :chars ?\} ?\) ?. + :words "||" "&&") + + (@map :map js2-mode-map + :localleader + :nv ";" 'doom/append-semicolon + + :prefix "r" + :n "g" 'js2r-add-to-globals-annotation + :n "ca" 'js2r-arguments-to-object + :n "Xa" 'js2r-contract-array + :n "Xf" 'js2r-contract-function + :n "Xo" 'js2r-contract-object + :nv "d" 'js2r-debug-this + :n "xa" 'js2r-expand-array + :n "xf" 'js2r-expand-function + :n "xo" 'js2r-expand-object + :v "ef" 'js2r-extract-function + :v "em" 'js2r-extract-method + :v "ev" 'js2r-extract-var + :n "F" 'js2r-forward-barf + :n "f" 'js2r-forward-slurp + :v "ii" 'js2r-inject-global-in-iife + :v "iv" 'js2r-inline-var + :v "p" 'js2r-introduce-parameter + :n "p" 'js2r-localize-parameter + :nv "l" 'js2r-log-this + :n "r" 'js2r-rename-var + :n "ss" 'js2r-split-string + :n "sv" 'js2r-split-var-declaration + :n "ct" 'js2r-ternary-to-if + :v "u" 'js2r-unwrap + :n "t" 'js2r-var-to-this + :n "ii" 'js2r-wrap-buffer-in-iife)) + + +(@def-package nodejs-repl :commands nodejs-repl) + + +(@def-package js2-refactor + :commands + (js2r-extract-function js2r-extract-method js2r-introduce-parameter + js2r-localize-parameter js2r-expand-object js2r-contract-object + js2r-expand-function js2r-contract-function js2r-expand-array + js2r-contract-array js2r-wrap-buffer-in-iife js2r-inject-global-in-iife + js2r-add-to-globals-annotation js2r-extract-var js2r-inline-var + js2r-rename-var js2r-var-to-this js2r-arguments-to-object js2r-ternary-to-if + js2r-split-var-declaration js2r-split-string js2r-unwrap js2r-log-this + js2r-debug-this js2r-forward-slurp js2r-forward-barf)) + + +(@def-package company-tern + :when (featurep 'company) + :commands company-tern + :after tern) -(@def-package company-tern :commands company-tern :after tern) (@def-package jsx-mode :mode "\\.jsx$") + (@def-package coffee-mode :mode "\\.coffee$" :init (setq coffee-indent-like-python-mode t)) @@ -62,15 +88,15 @@ ;; Projects ;; -(project! npm - :modes (web-mode js2-mode) - :files ("package.json") - :config - (let* ((project-path (doom-project-root)) - (hash (gethash project-path npm-conf)) - (package-file (expand-file-name "package.json" project-path)) - deps) - (-when-let (json (and (not hash) (f-exists? package-file) - (ignore-errors (json-read-file package-file)))) - (puthash project-path json npm-conf)))) +;; (project! npm +;; :modes (web-mode js2-mode) +;; :files ("package.json") +;; :config +;; (let* ((project-path (doom-project-root)) +;; (hash (gethash project-path npm-conf)) +;; (package-file (expand-file-name "package.json" project-path)) +;; deps) +;; (when-let (json (and (not hash) (file-exists-p package-file) +;; (ignore-errors (json-read-file package-file)))) +;; (puthash project-path json npm-conf)))) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index a36c7eeee..6e029318d 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -2,9 +2,12 @@ ;;; lang/javascript/packages.el (@package coffee-mode) -(@package company-tern :needs +company) (@package js2-mode) (@package js2-refactor) (@package jsx-mode) +(@package nodejs-repl) (@package tern) +(when (@featurep :completion company) + (@package company-tern)) + diff --git a/modules/lang/julia/autoload.el b/modules/lang/julia/autoload.el new file mode 100644 index 000000000..a73feef01 --- /dev/null +++ b/modules/lang/julia/autoload.el @@ -0,0 +1,14 @@ +;;; lang/julia/autoload.el + +;;;###autoload +(defun +julia/repl () + "Run an inferior instance of `julia' inside Emacs." + (interactive) + (let ((buffer (get-buffer-create "*Julia*"))) + (unless (comint-check-proc "*Julia*") + (apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments)) + (pop-to-buffer buffer) + (with-current-buffer buffer + (inferior-julia-mode)))) + + diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 876f798f8..a7a63a7de 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -1,11 +1,8 @@ -;;; module-julia.el +;;; lang/julia/config.el (use-package julia-mode :mode "\\.jl$" :interpreter "julia" :config - (def-docset! julia-mode "julia") - (def-repl! julia-mode doom/julia-repl)) + (@set :repl 'julia-mode '+julia/repl)) -(provide 'module-julia) -;;; module-julia.el ends here diff --git a/modules/lang/julia/packages.el b/modules/lang/julia/packages.el new file mode 100644 index 000000000..53b7f1379 --- /dev/null +++ b/modules/lang/julia/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/julia/packages.el + +(@package julia-mode) + diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 811938ab3..7ce96223f 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -1,40 +1,61 @@ -;;; module-latex.el +;;; lang/latex/config.el -(defvar doom-bibtex-dir "~/Dropbox/docs/biblio") +;; TODO Test me -(use-package reftex - :commands turn-on-reftex - :init - (setq reftex-plug-into-AUCTeX t - reftex-ref-style-default-list '("Cleveref" "Hyperref" "Fancyref") - reftex-default-bibliography - `(,(expand-file-name "phys.bib" doom-bibtex-dir))) - (add-hook! (LaTeX-mode latex-mode) 'turn-on-reftex)) - -(use-package helm-bibtex - :commands helm-bibtex +(defvar +latex-bibtex-dir "~/work/writing/biblio/" + "Where bibtex files are kept.") + +(defvar +latex-bibtex-default-file "default.bib" + "TODO") + + +;; +;; Plugins +;; + +(@def-package auctex + :mode ("\\.tex$" . LaTeX-mode) :init + (add-hook 'LaTeX-mode-hook 'turn-on-auto-fill) + :config (setq TeX-auto-save t TeX-parse-self t - bibtex-dialect 'biblatex - bibtex-align-at-equal-sign t - bibtex-text-indentation 20) - (add-hook! bibtex-mode - (local-set-key (kbd "C-c \\") 'bibtex-fill-entry) - (setq fill-column 140)) - (add-hook! (LaTeX-mode latex-mode) 'turn-on-auto-fill) + TeX-source-correlate-start-server nil + LaTeX-fill-break-at-separators nil) + (@add-hook LaTeX-mode '(LaTeX-math-mode TeX-source-correlate-mode)) + + (@set :company-backend 'LaTeX-mode '(company-auctex))) + +(@def-package company-auctex) + + +(@def-package bibtex ; built-in :config - (setq helm-bibtex-bibliography - (list (f-expand "phys.bib" doom-bibtex-dir)) + (setq bibtex-dialect 'biblatex + bibtex-align-at-equal-sign t + bibtex-text-indentation 20 + bibtex-completion-bibliography (list +latex-bibtex-default-file)) - helm-bibtex-library-path - (list (f-expand "phys-pdf" doom-bibtex-dir)) + (@map :map bibtex-mode-map + "C-c \\" 'bibtex-fill-entry)) - helm-bibtex-notes-path (f-expand "notes.org" doom-bibtex-dir) - helm-bibtex-pdf-open-function - (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/open" nil fpath)))) +(@def-package reftex ; built-in + :commands turn-on-reftex + :init + (add-hook 'LaTeX-mode-hook 'turn-on-reftex) + :config + (setq reftex-plug-into-AUCTeX t + reftex-default-bibliography (list +latex-bibtex-default-file)) + + (@map :map reftex-mode-map + :leader :n ";" 'reftex-toc)) + + +(@def-package ivy-bibtex + :commands ivy-bibtex) + +(@def-package helm-bibtex + :commands helm-bibtex) -(provide 'module-latex) -;;; module-latex.el ends here diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el new file mode 100644 index 000000000..4a01aa37a --- /dev/null +++ b/modules/lang/latex/packages.el @@ -0,0 +1,12 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/latex/packages.el + +(@package auctex) +;; (@package auctex-latexmk) + +(when (@featurep :completion company) + (@package company-auctex)) +(when (@featurep :completion ivy) + (@package ivy-bibtex)) +(when (@featurep :completion helm) + (@package helm-bibtex)) diff --git a/modules/lang/lua/autoload.el b/modules/lang/lua/autoload.el new file mode 100644 index 000000000..6eb69f203 --- /dev/null +++ b/modules/lang/lua/autoload.el @@ -0,0 +1,9 @@ +;;; lang/lua/autoload.el + +;;;###autoload +(defun +lua/repl () + (interactive) + (lua-start-process "lua" "lua") + (pop-to-buffer lua-process-buffer)) + + diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index f3b4b6aa7..703f9ff53 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,34 +1,40 @@ -;;; module-lua.el --- lua + Love2D +;;; lang/lua/config.el --- lua + Love2D -(use-package lua-mode +(@def-package lua-mode :mode "\\.lua$" :interpreter "lua" - :init (add-hook 'lua-mode-hook 'flycheck-mode) + :init + (add-hook 'lua-mode-hook 'flycheck-mode) :config - (def-company-backend! lua-mode (lua yasnippet)) - (def-electric! lua-mode :words ("else" "end")) - (def-repl! lua-mode doom/inf-lua) + (@set :company-backend 'lua-mode '(company-lua company-yasnippet)) + (@set :electric 'lua-mode :words "else" "end") + (@set :repl 'lua-mode '+lua/repl) ;; sp's lua-specific rules are obnoxious, so we disable them (setq sp-pairs (delete (assq 'lua-mode sp-pairs) sp-pairs))) -(use-package company-lua :after lua-mode) -(use-package moonscript +(@def-package company-lua + :after lua-mode) + + +(@def-package moonscript :mode ("\\.moon$" . moonscript-mode) :config (push '(moonscript-mode moonscript-indent-offset) editorconfig-indentation-alist)) + +;; +;; TODO Frameworks ;; -(def-project-type! love "♥" - :modes (lua-mode markdown-mode json-mode) - :files ("main.lua" "conf.lua") - :build ("open -a love.app '%s'" "main.lua")) -(def-project-type! hammerspoon "hammer" - :modes (lua-mode markdown-mode) - :match "/\\.?hammerspoon/.+\\.lua$" - :build "open hammerspoon://reload") +;; (def-project-type! love "♥" +;; :modes (lua-mode markdown-mode json-mode) +;; :files ("main.lua" "conf.lua") +;; :build ("open -a love.app '%s'" "main.lua")) + +;; (def-project-type! hammerspoon "hammer" +;; :modes (lua-mode markdown-mode) +;; :match "/\\.?hammerspoon/.+\\.lua$" +;; :build "open hammerspoon://reload") -(provide 'module-lua) -;;; module-lua.el ends here diff --git a/modules/lang/lua/packages.el b/modules/lang/lua/packages.el new file mode 100644 index 000000000..b615badda --- /dev/null +++ b/modules/lang/lua/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/lua/packages.el + +(@package lua-mode) +(@package moonscript) + +(when (@featurep :completion company) + (@package company-lua)) + diff --git a/modules/lang/text/autoload.el b/modules/lang/markdown/autoload.el similarity index 93% rename from modules/lang/text/autoload.el rename to modules/lang/markdown/autoload.el index 3b0312305..443d681aa 100644 --- a/modules/lang/text/autoload.el +++ b/modules/lang/markdown/autoload.el @@ -1,11 +1,11 @@ -;;; lang/text/autoload.el +;;; lang/markdown/autoload.el ;; Implement strike-through formatting (defvar +text--markdown-regex-del "\\(^\\|[^\\]\\)\\(\\(~\\{2\\}\\)\\([^ \n \\]\\|[^ \n ]\\(?:.\\|\n[^\n]\\)*?[^\\ ]\\)\\(\\3\\)\\)") ;;;###autoload -(defun +text/markdown-insert-del () +(defun +markdown/insert-del () "Surround region in github strike-through delimiters." (interactive) (let ((delim "~~")) diff --git a/modules/lang/text/config.el b/modules/lang/markdown/config.el similarity index 55% rename from modules/lang/text/config.el rename to modules/lang/markdown/config.el index 6662fd441..32ae568e1 100644 --- a/modules/lang/text/config.el +++ b/modules/lang/markdown/config.el @@ -1,4 +1,4 @@ -;;; lang/text/config.el +;;; lang/markdown/config.el (@def-package markdown-mode :mode ("\\.m\\(d\\|arkdown\\)$" "/README$" @@ -11,6 +11,8 @@ markdown-gfm-additional-languages '("sh")) :config + (@set :electric 'markdown-mode :chars "+" "#") + (@add-hook markdown-mode (auto-fill-mode +1) (setq line-spacing 2 @@ -20,33 +22,38 @@ '(markdown-mode gfm-mode) "\`\`\`" "\`\`\`" :post-handlers '(("||\n" "RET"))) - (@set :electric-chars "+" "#") - (@map :map gfm-mode-map "`" 'self-insert-command) - (@map :map markdown-mode-map + (@map :map gfm-mode-map + "`" 'self-insert-command + + :map markdown-mode-map "" nil "" nil "" nil "M-*" 'markdown-insert-list-item "M-b" 'markdown-insert-bold "M-i" 'markdown-insert-italic - "M-`" '+text/markdown-insert-del + "M-`" '+markdown/insert-del + :m "gj" 'markdown-next-visible-heading + :m "gk" 'markdown-previous-visible-heading ;; Assumes you have a markdown renderer plugin in chrome - :nv "M-r" (@λ (doom-open-with "Google Chrome")) + :n "M-r" 'browse-url-of-file ;; TODO: Make context sensitive :n "[p" 'markdown-promote :n "]p" 'markdown-demote + :n "[l" 'markdown-next-link + :n "]l" 'markdown-previous-link + :n "gf" 'markdown-follow-thing-at-point :i "M--" 'markdown-insert-hr (:localleader - :nv "i" 'markdown-insert-image - :nv "l" 'markdown-insert-link - :nv "L" 'markdown-insert-reference-link-dwim - :nv "b" 'markdown-preview))) + :nv "o" 'markdown-open + :nv "b" 'markdown-preview + (:prefix "i" + :nv "t" 'markdown-toc-generate-toc + :nv "i" 'markdown-insert-image + :nv "l" 'markdown-insert-link + :nv "L" 'markdown-insert-reference-link-dwim)))) (@def-package markdown-toc - :after markdown-mode) + :commands markdown-toc-generate-toc) - -(@def-package rst ; built-in - :mode ("\\.re?st$" . rst-mode) - :config (@set :builder '(rst-mode rst-compile-pdf-preview))) diff --git a/modules/lang/text/packages.el b/modules/lang/markdown/packages.el similarity index 73% rename from modules/lang/text/packages.el rename to modules/lang/markdown/packages.el index 250ee2d93..596a73e28 100644 --- a/modules/lang/text/packages.el +++ b/modules/lang/markdown/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; lang/text/packages.el +;;; lang/markdown/packages.el (@package markdown-mode) (@package markdown-toc) diff --git a/modules/lang/octave/config.el b/modules/lang/octave/config.el index 9be2bfecc..6cac56de6 100644 --- a/modules/lang/octave/config.el +++ b/modules/lang/octave/config.el @@ -1,18 +1,14 @@ -;;; module-octave.el +;;; lang/octave/config.el -(use-package octave +;; built-in +(@def-package octave :mode (("\\.m$" . octave-mode)) - :config - ;; (setq inferior-octave-program "/usr/local/bin/octave") - ) + :commands (octave-mode run-octave) + :config (@set :repl 'octave-mode 'run-octave)) ;; (use-package ac-octave ;; :config -;; (add-hook! octave-mode +;; (@add-hook octave-mode ;; (require 'ac-octave) ;; (setq ac-sources '(ac-source-octave)))) -(use-package octave-inf :commands run-octave) - -(provide 'module-octave) -;;; module-octave.el ends here diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index f91943d44..fd2dd9e66 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -1,24 +1,23 @@ -;;; module-php.el +;;; lang/php/config.el -(use-package hack-mode - :mode "\\.hh$" - :config (def-company-backend! hack-mode (capf))) +;; (@def-package hack-mode +;; :mode "\\.hh$" +;; :config +;; (@set :company-backend 'hack-mode '(company-capf))) -(use-package php-mode - :mode ("\\.php[s345]?$" "\\.inc$" ) + +(@def-package php-mode + :mode ("\\.php[s345]?$" "\\.inc$") :interpreter "php" :init (add-hook 'php-mode-hook 'flycheck-mode) - (setq php-template-compatibility nil - php-extras-eldoc-functions-file (concat doom-temp-dir "/php-extras-eldoc-functions")) - :config - (def-repl! php-mode php-boris) - (def-company-backend! php-mode '(php-extras-company company-yasnippet)) + (setq php-template-compatibility nil) - (map! :map php-mode-map (:localleader :nv ";" 'doom/append-semicolon)) + (@set :repl 'php-mode 'php-boris) + (@set :company-bakend 'php-mode '(php-extras-company company-yasnippet)) - (add-hook! php-mode (setq-local sp-max-pair-length 6)) + (@add-hook php-mode (setq-local sp-max-pair-length 6)) (sp-with-modes '(php-mode) (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))) @@ -27,14 +26,35 @@ (sp-local-pair "") (sp-local-pair "") (sp-local-pair "" :when '(("RET")) :post-handlers '("||\n[i]")) - (sp-local-pair "" :when '(("RET")) :post-handlers '("||\n[i]")))) + (sp-local-pair "" :when '(("RET")) :post-handlers '("||\n[i]"))) -(use-package php-extras + (@map :map php-mode-map + :localleader + :nv ";" 'doom/append-semicolon + + :prefix "r" + :n "cv" 'php-refactor--convert-local-to-instance-variable + :n "u" 'php-refactor--optimize-use + :v "xm" 'php-refactor--extract-method + :n "rv" 'php-refactor--rename-local-variable + + :prefix "t" + :n "r" 'phpunit-current-project + :n "a" 'phpunit-current-class + :n "s" 'phpunit-current-test)) + + +(@def-package php-extras :after php-mode - :init (add-hook 'php-mode-hook 'eldoc-mode) + :init + (add-hook 'php-mode-hook 'eldoc-mode) :config - (defun php-extras-company-setup ()) ;; company will set up itself - ;; Generate php-extras documentation and completion asynchronously + (setq php-extras-eldoc-functions-file (concat doom-cache-dir "/php-extras-eldoc-functions")) + + ;; company will set up itself + (advice-add 'php-extras-company-setup :override 'ignore) + + ;; Make expensive php-extras generation async (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el")) (async-start `(lambda () ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") @@ -44,56 +64,39 @@ (load (concat php-extras-eldoc-functions-file ".el")) (message "PHP eldoc updated!"))))) -(use-package php-refactor-mode - :after php-mode - :init (add-hook 'php-mode-hook 'php-refactor-mode) - :config - (mapc (lambda (x) - (let ((command-name (car x)) - (title (cadr x)) - (region-p (caddr x)) - predicate) - (setq predicate (cond ((eq region-p 'both) nil) - (t (if region-p - (lambda () (use-region-p)) - (lambda () (not (use-region-p))))))) - (emr-declare-command (intern (format "php-refactor--%s" (symbol-name command-name))) - :title title :modes 'php-mode :predicate predicate))) - '((convert-local-to-instance-variable "convert local var to instance var" nil) - (optimize-use "optimize FQNs in file" nil) - (extract-method "extract method" t) - (rename-local-variable "rename local variable" nil)))) -(use-package phpunit - :commands (phpunit-current-test phpunit-current-class phpunit-current-project) - :config - (map! :map php-mode-map - (:localleader - :n "tr" 'phpunit-current-project - :n "ta" 'phpunit-current-class - :n "ts" 'phpunit-current-test))) +(@def-package php-refactor-mode + :commands php-refactor-mode + :init (add-hook 'php-mode-hook 'php-refactor-mode)) + + +(@def-package phpunit + :commands (phpunit-current-test phpunit-current-class phpunit-current-project)) + + +(@def-package php-boris :commands php-boris) -(use-package php-boris :commands php-boris) ; PHP REPL ;; -(def-project-type! laravel "laravel" - :modes (php-mode yaml-mode web-mode nxml-mode js2-mode scss-mode) - :files ("artisan" "server.php")) +;; Projects +;; -(defvar php-composer-conf (make-hash-table :test 'equal)) -(def-project-type! composer "composer" - :modes (web-mode php-mode) - :files ("composer.json") - :when - (lambda (&rest _) - (let* ((project-path (doom/project-root)) - (hash (gethash project-path php-composer-conf)) - (package-file (f-expand "composer.json" project-path)) - deps) - (awhen (and (not hash) (f-exists? package-file) - (json-read-file package-file)) - (puthash project-path it php-composer-conf))) - t)) +;; (@def-project laravel "laravel" +;; :modes (php-mode yaml-mode web-mode nxml-mode js2-mode scss-mode) +;; :files ("artisan" "server.php")) + +;; (defvar php-composer-conf (make-hash-table :test 'equal)) +;; (@def-project composer "composer" +;; :modes (web-mode php-mode) +;; :files ("composer.json") +;; :when +;; (lambda (&rest _) +;; (let* ((project-path (doom/project-root)) +;; (hash (gethash project-path php-composer-conf)) +;; (package-file (expand-file-name "composer.json" project-path)) +;; deps) +;; (awhen (and (not hash) (file-exists-p package-file) +;; (json-read-file package-file)) +;; (puthash project-path it php-composer-conf))) +;; t)) -(provide 'module-php) -;;; module-php.el ends here diff --git a/modules/lang/php/packages.el b/modules/lang/php/packages.el new file mode 100644 index 000000000..ea449573e --- /dev/null +++ b/modules/lang/php/packages.el @@ -0,0 +1,13 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/php/packages.el + +(@package php-boris) +(@package php-extras :recipe (:fetcher github :repo "arnested/php-extras")) +(@package php-mode) +(@package php-refactor-mode) +(@package phpunit) + +;; (@package hack-mode +;; :recipe +;; (:fetcher url :url "https://raw.githubusercontent.com/facebook/hhvm/master/hphp/hack/editor-plugins/emacs/hack-mode.el")) + diff --git a/modules/lang/processing/config.el b/modules/lang/processing/config.el index da7de7d92..4fc08193e 100644 --- a/modules/lang/processing/config.el +++ b/modules/lang/processing/config.el @@ -1,46 +1,39 @@ ;;; module-processing.el -(use-package processing-mode - :when IS-MAC +(@def-package processing-mode :commands (processing-mode processing-find-sketch) :mode "\\.pde$" - :init (add-hook 'processing-compilation-mode-hook 'doom-hide-mode-line-mode) + :init + (add-hook 'processing-compilation-mode-hook 'doom-hide-modeline-mode) :config - (def-builder! processing-mode processing-sketch-build) - (def-popup! "*processing-compilation*" :align below :size 10 :noselect t) + (@set :build 'build-sketch 'processing-mode 'processing-sketch-build) + (@set :popup "*processing-compilation*" :size 10 :noselect t) + (@set :eval 'processing-mode + '((:command . ,processing-location) + (:exec . (lambda () (format "--sketch=%s --output=%s --force --run" + (doom/project-root) processing-output-dir))) + (:description . "Run Processing sketch"))) + (@set :company-backend 'processing-mode + '(company-keywords :with company-yasnippet company-dabbrev-code)) + (setq processing-location "/usr/local/bin/processing-java" processing-application-dir "/Applications/Processing.app" processing-sketchbook-dir "~/Dropbox/work/pde" processing-output-dir "/tmp") - (map! :map processing-mode-map + (@map :map processing-mode-map :nv "M-r" 'processing-sketch-run :m "gd" 'processing-find-in-reference :m "gF" 'processing-find-sketch - (:localleader - "e" 'processing-export-application - "h" 'processing-open-reference - "e" 'processing-open-examples - "o" 'processing-open-sketchbook)) - (after! quickrun - (quickrun-add-command - "processing" `((:command . ,processing-location) - (:exec . (lambda () (format "--sketch=%s --output=%s --force --run" - (doom/project-root) processing-output-dir))) - (:description . "Run Processing sketch")) - :mode 'processing-mode)) + :localleader + :n "e" 'processing-export-application + :n "h" 'processing-open-reference + :n "e" 'processing-open-examples + :n "o" 'processing-open-sketchbook) - (add-hook! processing-mode - (setq-local company-backends '((company-keywords - :with - company-yasnippet - company-dabbrev-code))) - (make-local-variable 'company-keywords-alist) - (add-to-list 'company-keywords-alist - (cons 'processing-mode (append processing-functions - processing-builtins - processing-constants))))) - -(provide 'module-processing) -;;; module-processing.el ends here + (@after company-keywords + (nconc company-keywords-alist + (cons 'processing-mode (append processing-functions + processing-builtins + processing-constants))))) diff --git a/modules/lang/processing/packages.el b/modules/lang/processing/packages.el new file mode 100644 index 000000000..d133bf69f --- /dev/null +++ b/modules/lang/processing/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/processing/packages.el + +(@package processing-mode) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index d4f847ba6..dd6f4cd51 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,82 +1,73 @@ -;;; module-python.el +;;; lang/python/config.el -(use-package python - :mode ("\\.py\\'" . python-mode) - :interpreter ("python" . python-mode) +(@def-package python :commands python-mode :init - (setq-default - python-environment-directory doom-temp-dir - python-shell-interpreter "ipython" - python-shell-interpreter-args "--deep-reload" - python-shell-prompt-regexp "In \\[[0-9]+\\]: " - python-shell-prompt-block-regexp "\\.\\.\\.\\.: " - python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " - python-shell-completion-setup-code - "from IPython.core.completerlib import module_completion" - python-shell-completion-string-code - "';'.join(get_ipython().Completer.all_completions('''%s'''))\n") + (setq python-environment-directory doom-cache-dir + python-shell-interpreter "ipython" + python-shell-interpreter-args "--deep-reload" + python-shell-prompt-regexp "In \\[[0-9]+\\]: " + python-shell-prompt-block-regexp "\\.\\.\\.\\.: " + python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " + python-shell-completion-setup-code + "from IPython.core.completerlib import module_completion" + python-shell-completion-string-code + "';'.join(get_ipython().Completer.all_completions('''%s'''))\n") (add-hook 'python-mode-hook 'flycheck-mode) :config - (def-company-backend! python-mode (anaconda)) - (def-repl! python-mode doom/inf-python) - (def-version-cmd! python-mode "python --version 2>&1 | cut -d' ' -f2") + (@set :repl 'python-mode '+python/repl) (define-key python-mode-map (kbd "DEL") nil)) ; interferes with smartparens -(use-package anaconda-mode + +(@def-package anaconda-mode :after python :init - (add-hook! python-mode '(anaconda-mode anaconda-eldoc-mode eldoc-mode)) - (setq anaconda-mode-installation-directory (concat doom-temp-dir "/anaconda/") + (add-hook 'python-mode-hook 'anaconda-mode) + (add-hook 'anaconda-mode-hook 'anaconda-eldoc-mode) + (setq anaconda-mode-installation-directory (concat doom-cache-dir "anaconda/") anaconda-mode-eldoc-as-single-line t) :config - (map! :map anaconda-mode-map :m "gd" 'anaconda-mode-find-definitions) - (map! :map anaconda-nav-mode-map :n [escape] 'anaconda-nav-quit) + (@set :company-backend 'python-mode '(company-anaconda)) + + (@map :map anaconda-mode-map :m "gd" 'anaconda-mode-find-definitions + :map anaconda-nav-mode-map :n [escape] 'anaconda-nav-quit) (advice-add 'anaconda-mode-doc-buffer :after 'doom*anaconda-mode-doc-buffer)) -(use-package company-anaconda +(@def-package company-anaconda :after anaconda-mode :config - (mapc (lambda (x) - (let ((command-name (car x)) - (title (cadr x)) - (region-p (caddr x)) - predicate) - (setq predicate (lambda () (and (anaconda-mode-running-p) - (not (use-region-p)) - (not (sp-point-in-string-or-comment))))) - (emr-declare-command (intern (format "anaconda-mode-%s" (symbol-name command-name))) - :title title :modes 'python-mode :predicate predicate))) - '((show-doc "view documentation" t) - (find-assignments "find assignments" t) - (find-definitions "find definitions" t) - (find-file "find assignments" t) - (find-references "show usages" nil)))) + (@set :emr 'python-mode + '(:nv anaconda-mode-show-doc "view documentation") + '(:nv anaconda-mode-find-assignments "find assignments") + '(:nv anaconda-mode-find-definitions "find definitions") + '(:nv anaconda-mode-find-file "find assignments") + '(:n anaconda-mode-find-references "show usages"))) -(use-package pip-requirements - :mode ("/requirements.txt$" . pip-requirements-mode) - :config (def-company-backend! pip-requirements-mode (capf))) -(use-package nose +(@def-package pip-requirements + :mode ("/requirements.txt$" . pip-requirements-mode)) + + +(@def-package nose :commands nose-mode - :preface (defvar nose-mode-map (make-sparse-keymap)) - :init (associate! nose-mode :match "/test_.+\\.py$" :in (python-mode)) + :preface + (defvar nose-mode-map (make-sparse-keymap)) + :init + (@associate nose-mode :match "/test_.+\\.py$" :in (python-mode)) :config - (def-popup! "*nosetests*" :align below :size 0.4 :noselect t) - (def-yas-mode! nose-mode) - (map! :map nose-mode-map - (:localleader - :n "tr" 'nosetests-again - :n "ta" 'nosetests-all - :n "ts" 'nosetests-one - :n "tv" 'nosetests-module - :n "tA" 'nosetests-pdb-all - :n "tO" 'nosetests-pdb-one - :n "tV" 'nosetests-pdb-module))) + (@set :popup "*nosetests*" :size 0.4 :noselect t) + (@set :yas-minor-mode 'nose-mode) + (@map :map nose-mode-map + :localleader + :n "tr" 'nosetests-again + :n "ta" 'nosetests-all + :n "ts" 'nosetests-one + :n "tv" 'nosetests-module + :n "tA" 'nosetests-pdb-all + :n "tO" 'nosetests-pdb-one + :n "tV" 'nosetests-pdb-module)) -(provide 'module-python) -;;; module-python.el ends here diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el new file mode 100644 index 000000000..3ba8b7bfa --- /dev/null +++ b/modules/lang/python/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/python/packages.el + +(@package anaconda-mode) +(@package nose) +(@package pip-requirements) + +(when (@featurep :completion company) + (@package company-anaconda)) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 56d006bd7..7d9bb716e 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -1,52 +1,50 @@ -;;; module-ruby.el +;;; lang/ruby/config.el -(use-package ruby-mode +(@def-package ruby-mode :mode ("\\.rb$" "\\.rake$" "\\.gemspec$" "\\.?pryrc$" "/\\(Gem\\|Cap\\|Vagrant\\|Rake\\)file$") :interpreter "ruby" - :init (add-hook 'ruby-mode-hook 'flycheck-mode) + :init + (add-hook 'ruby-mode-hook 'flycheck-mode) :config - (def-builder! ruby-mode "rake %s" "Rakefile") - (def-company-backend! ruby-mode (dabbrev-code)) - (def-electric! ruby-mode :words ("else" "end" "elseif")) - (def-repl! ruby-mode inf-ruby) - (def-version-cmd! ruby-mode "ruby --version | cut -d' ' -f2") + (@set :build 'rake 'ruby-mode '+ruby/rake) + (@set :company-backend 'ruby-mode '(company-dabbrev-code)) + (@set :electric 'ruby-mode :words "else" "end" "elseif") + (@set :repl 'ruby-mode 'inf-ruby) (setq ruby-deep-indent-paren t) ;; Don't interfere with my custom RET behavior - (define-key ruby-mode-map [?\n] nil)) + (define-key ruby-mode-map [?\n] nil) + + (@map :map ruby-mode-map + :localleader + :prefix "r" + :desc "toggle block" :nv "b" 'ruby-toggle-block + :desc "extract method" :nv "em" 'ruby-refactor-extract-to-method + :desc "extract local variable" :nv "ev" 'ruby-refactor-extract-local-variable + :desc "extract constant" :nv "ec" 'ruby-refactor-extract-constant + :desc "add parameter" :nv "ad" 'ruby-refactor-add-parameter + :desc "extract to let" :nv "el" 'ruby-refactor-extract-to-let + :desc "convert post conditional" :nv "cc" 'ruby-refactor-convert-post-conditional)) + + +(@def-package ruby-refactor + :commands + (ruby-refactor-extract-to-method ruby-refactor-extract-local-variable + ruby-refactor-extract-constant ruby-refactor-add-parameter + ruby-refactor-extract-to-let ruby-refactor-convert-post-conditional)) -(use-package ruby-refactor - :after ruby-mode - :config - (mapc (lambda (x) - (let ((command-name (car x)) - (title (cadr x)) - (region-p (caddr x)) - predicate) - (setq predicate (cond ((eq region-p 'both) nil) - (t (if region-p - (lambda () (use-region-p)) - (lambda () (not (use-region-p))))))) - (emr-declare-command (intern (format "ruby-%s" (symbol-name command-name))) - :title title :modes 'ruby-mode :predicate predicate))) - '((toggle-block "toggle block" nil) - (refactor-extract-to-method "extract method" t) - (refactor-extract-local-variable "extract local variable" t) - (refactor-extract-constant "extract constant" t) - (refactor-add-parameter "add parameter" nil) - (refactor-extract-to-let "extract to let" t) - (refactor-convert-post-conditional "convert post conditional" t)))) ;; Highlight doc comments -(use-package yard-mode +(@def-package yard-mode :commands yard-mode :init (add-hook 'ruby-mode-hook 'yard-mode)) -(use-package rspec-mode + +(@def-package rspec-mode :mode ("/\\.rspec$" . text-mode) :init - (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :in (ruby-mode yaml-mode) :files ("spec/")) + (@associate rspec-mode :match "/\\.rspec$") + (@associate rspec-mode :in (ruby-mode yaml-mode) :files ("/spec/")) (defvar rspec-mode-verifiable-map (make-sparse-keymap)) (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") @@ -56,23 +54,27 @@ ;; Rake (("task" "namespace") () "end"))) :config - (map! :map rspec-mode-map - (:localleader - :n "tr" 'rspec-rerun - :n "ta" 'rspec-verify-all - :n "ts" 'rspec-verify-single - :n "tv" 'rspec-verify))) + (@map :map rspec-mode-map + :localleader + :n "tr" 'rspec-rerun + :n "ta" 'rspec-verify-all + :n "ts" 'rspec-verify-single + :n "tv" 'rspec-verify)) -(use-package inf-ruby + +(@def-package inf-ruby :commands (inf-ruby inf-ruby-console-auto) - :config (def-company-backend! inf-ruby-mode (inf-ruby))) + :config + (@set :company-backend 'inf-ruby-mode '(company-inf-ruby))) -(use-package company-inf-ruby :after inf-ruby) + +(@def-package company-inf-ruby + :after inf-ruby) ;; -;; TODO Parse Rakefile for tasks -(def-project-type! rake "rake" - :files ("Rakefile")) +;; TODO Frameworks +;; + +;; (@def-project rake "rake" +;; :files ("Rakefile")) -(provide 'module-ruby) -;;; module-ruby.el ends here diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el new file mode 100644 index 000000000..8859d6239 --- /dev/null +++ b/modules/lang/ruby/packages.el @@ -0,0 +1,10 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/ruby/packages.el + +(@package inf-ruby) +(@package rspec-mode) +(@package ruby-refactor) +(@package yard-mode) + +(when (@featurep :completion company) + (@package company-inf-ruby)) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index e8cd639c6..222739a5a 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,25 +1,31 @@ ;;; module-rust.el -(use-package rust-mode +(@def-package rust-mode :mode "\\.rs$" - :init (add-hook 'rust-mode-hook 'flycheck-mode) + :init + (add-hook 'rust-mode-hook 'flycheck-mode) :config - (def-builder! rust-mode "cargo run" "Cargo.toml") - (def-builder! toml-mode "cargo run" "Cargo.toml")) + (@set :build 'cargo-run '(rust-mode toml-mode) + '+rust-is-cargo-project-p '+rust/cargo-run)) -(use-package flycheck-rust - :after rust-mode) -(defvar racer-cmd (concat doom-ext-dir "/racer")) -(defvar racer-rust-src-path (concat doom-ext-dir "/rust/src/")) -(use-package racer +(defvar racer-cmd (concat doom-cache-dir "racer")) +(defvar racer-rust-src-path (concat doom-cache-dir "rust/src/")) +(@def-package racer :after rust-mode - :when (f-exists? racer-cmd) - :init (add-hook! rust-mode '(racer-mode eldoc-mode flycheck-rust-setup)) + :when (file-exists-p racer-cmd) + :init + (@add-hook rust-mode '(racer-mode eldoc-mode flycheck-rust-setup)) :config ;; TODO Unit test keybinds - (def-company-backend! rust-mode (racer)) - (map! :map rust-mode-map :m "gd" 'racer-find-definition)) + (@set :company-backend 'rust-mode '(company-racer)) + (@map :map rust-mode-map :m "gd" 'racer-find-definition)) + + +(@def-package company-racer + :after racer) + + +(@def-package flycheck-rust + :after rust-mode) -(provide 'module-rust) -;;; module-rust.el ends here diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el new file mode 100644 index 000000000..8151c1ea6 --- /dev/null +++ b/modules/lang/rust/packages.el @@ -0,0 +1,10 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/rust/packages.el + +(@package racer) +(@package rust-mode) + +(when (@featurep :feature syntax-checker) + (@package flycheck-rust)) +(when (@featurep :completion company) + (@package company-racer)) diff --git a/modules/lang/rust/setup.sh b/modules/lang/rust/setup.sh new file mode 100755 index 000000000..4b392b30b --- /dev/null +++ b/modules/lang/rust/setup.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +source VARS + +# +echo "Setting up Rust" + +case "$OSTYPE" in + darwin*) + brew install rust + ;; + linux*) + if is-arch; then + sudo pacman --noconfirm -S rust cargo + elif is-deb; then + echo ... + exit 1 + fi +esac + +git-repo "https://github.com/rust-lang/rust.git" "rust" +git-repo "https://github.com/phildawes/racer.git" "racer-src" + +cd racer-src && cargo build --release +mv racer-src/target/release/racer ./racer diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 41337c8b2..79c4415c9 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -1,16 +1,18 @@ -;;; module-scala.el +;;; lang/scala/config.el -(use-package scala-mode +(@def-package scala-mode :mode "\\.s\\(cala\\|bt\\)$" - :init (add-hook 'scala-mode-hook 'eldoc-mode) - :config (def-company-backend! scala-mode '(ensime-company (company-yasnippet)))) + :init + (add-hook 'scala-mode-hook 'eldoc-mode) + :config + (@set :company-backend 'scala-mode '(ensime-company (company-yasnippet)))) -(use-package sbt-mode - :after scala-mode) -(use-package ensime +(@def-package sbt-mode :after scala-mode) + + +(@def-package ensime :commands (ensime ensime-mode ensime-scala-mode-hook) - :init (add-hook 'scala-mode-hook 'ensime-scala-mode-hook)) + :init + (add-hook 'scala-mode-hook 'ensime-scala-mode-hook)) -(provide 'module-scala) -;;; module-scala.el ends here diff --git a/modules/lang/scala/packages.el b/modules/lang/scala/packages.el new file mode 100644 index 000000000..80bfcde54 --- /dev/null +++ b/modules/lang/scala/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/scala/packages.el + +(@package ensime) +(@package sbt-mode) +(@package scala-mode) diff --git a/modules/lang/sh/autoload.el b/modules/lang/sh/autoload.el new file mode 100644 index 000000000..52e76da9c --- /dev/null +++ b/modules/lang/sh/autoload.el @@ -0,0 +1,49 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/sh/config.el + +(defvar sh-extra-font-lock--keywords + `((+sh--match-var-in-double-quoted-string + (2 font-lock-variable-name-face prepend)) + (,(concat + "\\<" + (regexp-opt '("sudo" "echo" "ls" "sleep" "tee" "cd" "cat" "service")) + "\\>") + (0 'font-lock-builtin-face)))) + +;;;###autoload +(defun +sh--in-double-quoted-string-p () + "Non-nil if point in inside a double-quoted string." + (let ((state (syntax-ppss))) + (eq (nth 3 state) ?\"))) + +;;;###autoload +(defun +sh--match-var-in-double-quoted-string (limit) + "Search for variables in double-quoted strings bounded by LIMIT." + (let (res) + (while + (and (setq res + (re-search-forward + "\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)" + limit t)) + (not (+sh--in-double-quoted-string-p)))) + res)) + +;;;###autoload +(defun +sh|extra-fontify () + "Activate sh-extra-font-lock." + (interactive) + (font-lock-add-keywords nil sh-extra-font-lock--keywords) + (if (fboundp 'font-lock-flush) + (font-lock-flush) + (when font-lock-mode + (with-no-warnings + (font-lock-fontify-buffer))))) + +;;;###autoload +(defun +sh/repl () + "Open a shell REPL." + (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))))) diff --git a/modules/lang/sh/boostrap.el b/modules/lang/sh/boostrap.el new file mode 100644 index 000000000..1693e02a2 --- /dev/null +++ b/modules/lang/sh/boostrap.el @@ -0,0 +1,14 @@ +;;; lang/sh/boostrap.el + +(bootstrap! + :title "{z,ba}sh" + :desc "Sets up the zshdb and bashdb debuggers, and shell-check" + + :if-debian + (sudo "apt-get update && apt-get install zshdb bashdb spellcheck") + + :if-arch + (sudo "pacman --noconfirm --needed -S zshdb bashdb shellcheck") + + :if-macos + (sh "brew install zshdb bashdb")) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 15f0b4934..f1ff5cfdb 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -1,24 +1,26 @@ -;;; module-sh.el +;;; lang/sh/config.el -(use-package sh-script - :mode (("\\.\\(ba\\|z\\)sh$" . sh-mode) - ("/\\.?z\\(sh\\(/.*\\|$\\)\\|profile\\|log\\(in\\|out\\)\\|sh\\(rc\\|env\\)\\)$" . sh-mode) - ("/\\.?bash\\(/.*\\|rc\\|_profile\\)$" . sh-mode) - ("/\\.?xinitrc$" . sh-mode) +(@def-package sh-script ; built-in + :mode (("\\.zsh$" . sh-mode) ("/bspwmrc$" . sh-mode)) - :init (add-hook! sh-mode '(flycheck-mode doom|sh-extra-font-lock-activate highlight-numbers-mode)) + :init + (@add-hook sh-mode '(flycheck-mode highlight-numbers-mode +sh|extra-fontify)) :config - (def-company-backend! sh-mode (shell)) - (def-electric! sh-mode :words ("else" "elif" "fi" "done" "then" "do" "esac" ";;")) - (def-repl! sh-mode doom/inf-shell) + (@set :company-backend 'sh-mode '(company-shell)) + (@set :electric 'sh-mode :words "else" "elif" "fi" "done" "then" "do" "esac" ";;") + (@set :repl 'sh-mode '+sh/repl) (setq sh-indent-after-continuation 'always) ;; [pedantry intensifies] - (add-hook! sh-mode (setq mode-name "sh"))) + (@add-hook sh-mode (setq mode-name "sh")) -(use-package company-shell + (defun +sh|detect-zsh () + (when (and buffer-file-name (string-match-p "\\.zsh\\'" buffer-file-name)) + (sh-set-shell "zsh"))) + (add-hook 'sh-mode-hook '+sh|detect-zsh)) + + +(@def-package company-shell :after sh-script :config (setq company-shell-delete-duplicates t)) -(provide 'module-sh) -;;; module-sh.el ends here diff --git a/modules/lang/sh/packages.el b/modules/lang/sh/packages.el new file mode 100644 index 000000000..f6411290f --- /dev/null +++ b/modules/lang/sh/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/sh/packages.el + +(when (@featurep :completion company) + (@package company-shell)) diff --git a/modules/lang/sh/setup.sh b/modules/lang/sh/setup.sh new file mode 100755 index 000000000..49a1ca27d --- /dev/null +++ b/modules/lang/sh/setup.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +source VARS + +# +echo "Setting up zsh/bash (zshdb, bashdb)" + +if is-mac; then + brew install zshdb bashdb +elif is-arch; then + sudo pacman --noconfirm -S zshdb bashdb +fi diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index fa39ec8fb..31a3877af 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -1,17 +1,18 @@ -;;; module-swift.el +;;; lang/swift/config.el ;; TODO Set up emacs task runners for fruitstrap -(use-package swift-mode + +(@def-package swift-mode :mode "\\.swift$" - :init (add-hook 'swift-mode-hook 'flycheck-mode) + :init + (add-hook 'swift-mode-hook 'flycheck-mode) :config - (def-company-backend! swift-mode (sourcekit yasnippet)) - (def-docset! swift-mode "swift") - (def-repl! swift-mode swift-mode-run-repl) ; TODO test this - (after! flycheck (push 'swift flycheck-checkers))) + (@set :repl 'swift-mode 'swift-mode-run-repl) ; TODO test this + (@after flycheck (push 'swift flycheck-checkers))) -(use-package company-sourcekit - :after swift-mode) -(provide 'module-swift) -;;; module-swift.el ends here +(@def-package company-sourcekit + :after swift-mode + :config + (@set :company-backend 'swift-mode '(company-sourcekit company-yasnippet))) + diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el new file mode 100644 index 000000000..00f382ce6 --- /dev/null +++ b/modules/lang/swift/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/swift/packages.el + +(@package swift-mode) + +(when (@featurep :completion company) + (@package company-sourcekit)) diff --git a/modules/lang/typescript/config.el b/modules/lang/typescript/config.el new file mode 100644 index 000000000..31f644633 --- /dev/null +++ b/modules/lang/typescript/config.el @@ -0,0 +1,44 @@ +;;; lang/typescript/config.el + +(@def-package typescript-mode + :mode "\\.ts$" + :init + (add-hook 'typescript-mode-hook 'rainbow-delimiters-mode) + :config + (@set :company-backend 'typescript-mode '(company-tide)) + (@set :electric 'typescript-mode :chars ?\} ?\) :words "||" "&&") + + ;; TODO emr definitions for: + ;; + tide-jump-back + ;; + (tide-jump-to-definition t) + (@set :emr 'typescript-mode + '(tide-find-references "find usages") + '(tide-rename-symbol "rename symbol") + '(tide-jump-to-definition "jump to definition") + '(tide-documentation-at-point "current type documentation") + '(tide-restart-server "restart tide server")) + + (defun +typescript|tide-setup () + (when (or (eq major-mode 'typescript-mode) + (and (eq major-mode 'web-mode) + buffer-file-name + (string= (file-name-extension buffer-file-name) "tsx"))) + (tide-setup) + (flycheck-mode +1) + (eldoc-mode +1))) + (@add-hook (typescript-mode web-mode) '+typescript|tide-setup) + + (advice-add 'tide-project-root :override 'doom-project-root) + + (@map :map typescript-mode-map + :m "gd" 'tide-jump-to-definition + :m "K" 'tide-documentation-at-point)) + + +(@def-package tide + :after typescript-mode + :config + (setq tide-format-options + '(:insertSpaceAfterFunctionKeywordForAnonymousFunctions t + :placeOpenBraceOnNewLineForFunctions nil))) + diff --git a/modules/lang/typescript/packages.el b/modules/lang/typescript/packages.el new file mode 100644 index 000000000..f99382fff --- /dev/null +++ b/modules/lang/typescript/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/typescript/packages.el + +(@package tide) +(@package typescript-mode) + diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el new file mode 100644 index 000000000..eae4c0114 --- /dev/null +++ b/modules/lang/web/+css.el @@ -0,0 +1,47 @@ +;;; lang/web/+css.el + +(sp-with-modes '(css-mode scss-mode less-css-mode stylus-mode) + (sp-local-pair "/*" "*/" :post-handlers '(("[d-3]||\n[i]" "RET") ("| " "SPC")))) + +(@map :map* (css-mode-map scss-mode-map less-css-mode-map) + :n "M-R" '+css/web-refresh-browser + :localleader + :nv ";" '+css/append-semicolon + :prefix "r" + :n "b" '+css/toggle-inline-or-block) + + +;; +;; Packages +;; + +(@def-package css-mode + :mode "\\.css$" + :mode ("\\.scss$" . scss-mode) + :init + (@add-hook css-mode + '(yas-minor-mode-on flycheck-mode rainbow-mode highlight-numbers-mode + ;; doom|counsel-css-imenu-setup + )) + + :config + (@set :company-backend '(css-mode scss-mode) '(company-css company-yasnippet)) + (@set :build 'scss 'scss-mode '+css/scss-build)) + + +(@def-package sass-mode + :mode "\\.sass$" + :config + (setq sass-command-options '("--style compressed")) + (@set :build 'sass 'sass-mode '+css/sass-build) + (@set :company-backend 'sass-mode '(company-css company-yasnippet))) + + +(@def-package less-css-mode + :mode "\\.less$") + + +(@def-package stylus-mode + :mode "\\.styl$" + :init (@add-hook stylus-mode '(yas-minor-mode-on flycheck-mode))) + diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el new file mode 100644 index 000000000..a6de48642 --- /dev/null +++ b/modules/lang/web/+html.el @@ -0,0 +1,63 @@ +;;; lang/web/config.el + +(@def-package web-mode + :mode ("\\.p?html?$" + "\\.\\(tpl\\|blade\\)\\(\\.php\\)?$" + "\\.erb$" + "\\.jsp$" + "\\.as[cp]x$" + "\\.mustache$" + "\\.tsx$" + "wp-content/themes/.+/.+\\.php$") + :init + (add-hook 'web-mode-hook 'turn-off-smartparens-mode) + :config + (@set :company-backend 'web-mode '(company-web-html company-yasnippet)) + (setq web-mode-enable-html-entities-fontification t) + + ;; Fix blank line numbers after unfolding + (advice-add 'web-mode-fold-or-unfold :after 'nlinum--flush) + + (@map :map web-mode-map + (:localleader :n "t" 'web-mode-element-rename) + "M-/" 'web-mode-comment-or-uncomment + :i "SPC" 'self-insert-command + :n "M-r" 'doom/web-refresh-browser + :n "za" 'web-mode-fold-or-unfold + :nv "]a" 'web-mode-attribute-next + :nv "[a" 'web-mode-attribute-previous + :nv "]t" 'web-mode-tag-next + :nv "[t" 'web-mode-tag-previous + :nv "]T" 'web-mode-element-child + :nv "[T" 'web-mode-element-parent) + + (@def-package company-web :after company)) + + +(@def-package haml-mode :mode "\\.haml$") + + +(@def-package pug-mode + :mode ("\\.jade$" "\\.pug$") + :config + (@set :company-backend 'pug-mode '(company-yasnippet)) + (@map :map pug-mode-map + :i [tab] 'doom/dumb-indent + :i [backtab] 'doom/dumb-dedent)) + + +;; +;; Tools +;; + +(@def-package emmet-mode + :commands emmet-mode + :preface (defvar emmet-mode-keymap (make-sparse-keymap)) + :init + (@add-hook (scss-mode web-mode html-mode haml-mode nxml-mode) 'emmet-mode) + :config + (setq emmet-move-cursor-between-quotes t) + (@map :map emmet-mode-keymap + :v "M-e" 'emmet-wrap-with-markup + :i "M-e" 'emmet-expand-yas + :i "M-E" 'emmet-expand-line)) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el new file mode 100644 index 000000000..b685e4ae4 --- /dev/null +++ b/modules/lang/web/autoload/css.el @@ -0,0 +1,7 @@ +;;; lang/web/+css.el + +;;;###autoload +(defun +css/scss-build ()) ; TODO + +;;;###autoload +(defun +css/sass-build ()) ; TODO diff --git a/modules/lang/web/autoload/evil.el b/modules/lang/web/autoload/evil.el new file mode 100644 index 000000000..debb4d680 --- /dev/null +++ b/modules/lang/web/autoload/evil.el @@ -0,0 +1,20 @@ +;;; lang/html/autoload/evil.el + +;;;###autoload (autoload '+html:encode-html-entities "lang/html/autoload/evil" nil t) +(evil-define-operator +html:encode-html-entities (beg end &optional input) + "Encodes HTML entities in the selected region." + (interactive "") + (cond (input + (insert (+html-encode-entities input))) + ((and beg end) + (+html/encode-entities-region beg end)))) + +;;;###autoload (autoload '+html:decode-html-entities "lang/html/autoload/evil" nil t) +(evil-define-operator +html:decode-html-entities (beg end &optional input) + "Decodes HTML entities in the selected region." + (interactive "") + (cond (input + (insert (+html-decode-entities input))) + ((and beg end) + (+html/decode-entities-region beg end)))) + diff --git a/modules/lang/web/autoload/html.el b/modules/lang/web/autoload/html.el new file mode 100644 index 000000000..35c8b7411 --- /dev/null +++ b/modules/lang/web/autoload/html.el @@ -0,0 +1,59 @@ +;;; lang/web/autoload/html.el + +;;;###autoload +(defvar +web-entities-list + [[" " " "] [" " " "] [" " " "] [" " " "] + ["‏" "‏"] ["‎" "‎"] ["‍" "‍"] ["‌" "‌"] + ["¡" "¡"] ["¢" "¢"] ["£" "£"] ["¤" "¤"] ["¥" "¥"] ["¦" "¦"] ["§" "§"] ["¨" "¨"] ["©" "©"] ["ª" "ª"] ["«" "«"] ["¬" "¬"] ["­" "­"] ["®" "®"] ["¯" "¯"] ["°" "°"] ["±" "±"] ["²" "²"] ["³" "³"] ["´" "´"] ["µ" "µ"] ["¶" "¶"] ["·" "·"] ["¸" "¸"] ["¹" "¹"] ["º" "º"] ["»" "»"] ["¼" "¼"] ["½" "½"] ["¾" "¾"] ["¿" "¿"] + ["À" "À"] ["Á" "Á"] ["Â" "Â"] ["Ã" "Ã"] ["Ä" "Ä"] ["Å" "Å"] ["Æ" "Æ"] ["Ç" "Ç"] ["È" "È"] ["É" "É"] ["Ê" "Ê"] ["Ë" "Ë"] ["Ì" "Ì"] ["Í" "Í"] ["Î" "Î"] ["Ï" "Ï"] ["Ð" "Ð"] ["Ñ" "Ñ"] ["Ò" "Ò"] ["Ó" "Ó"] ["Ô" "Ô"] ["Õ" "Õ"] ["Ö" "Ö"] ["×" "×"] ["Ø" "Ø"] ["Ù" "Ù"] ["Ú" "Ú"] ["Û" "Û"] ["Ü" "Ü"] ["Ý" "Ý"] ["Þ" "Þ"] ["ß" "ß"] ["à" "à"] ["á" "á"] ["â" "â"] ["ã" "ã"] ["ä" "ä"] ["å" "å"] ["æ" "æ"] ["ç" "ç"] ["è" "è"] ["é" "é"] ["ê" "ê"] ["ë" "ë"] ["ì" "ì"] ["í" "í"] ["î" "î"] ["ï" "ï"] ["ð" "ð"] ["ñ" "ñ"] ["ò" "ò"] ["ó" "ó"] ["ô" "ô"] ["õ" "õ"] ["ö" "ö"] + ["÷" "÷"] ["ø" "ø"] ["ù" "ù"] ["ú" "ú"] ["û" "û"] ["ü" "ü"] ["ý" "ý"] ["þ" "þ"] ["ÿ" "ÿ"] ["ƒ" "ƒ"] + ["Α" "Α"] ["Β" "Β"] ["Γ" "Γ"] ["Δ" "Δ"] ["Ε" "Ε"] ["Ζ" "Ζ"] ["Η" "Η"] ["Θ" "Θ"] ["Ι" "Ι"] ["Κ" "Κ"] ["Λ" "Λ"] ["Μ" "Μ"] ["Ν" "Ν"] ["Ξ" "Ξ"] ["Ο" "Ο"] ["Π" "Π"] ["Ρ" "Ρ"] ["Σ" "Σ"] ["Τ" "Τ"] ["Υ" "Υ"] ["Φ" "Φ"] ["Χ" "Χ"] ["Ψ" "Ψ"] ["Ω" "Ω"] ["α" "α"] ["β" "β"] ["γ" "γ"] ["δ" "δ"] ["ε" "ε"] ["ζ" "ζ"] ["η" "η"] ["θ" "θ"] ["ι" "ι"] ["κ" "κ"] ["λ" "λ"] ["μ" "μ"] ["ν" "ν"] ["ξ" "ξ"] ["ο" "ο"] ["π" "π"] ["ρ" "ρ"] ["ς" "ς"] ["σ" "σ"] ["τ" "τ"] ["υ" "υ"] ["φ" "φ"] ["χ" "χ"] ["ψ" "ψ"] ["ω" "ω"] ["ϑ" "ϑ"] ["ϒ" "ϒ"] ["ϖ" "ϖ"] + ["•" "•"] ["…" "…"] ["′" "′"] ["″" "″"] ["‾" "‾"] ["⁄" "⁄"] ["℘" "℘"] ["ℑ" "ℑ"] ["ℜ" "ℜ"] ["™" "™"] ["ℵ" "ℵ"] ["←" "←"] ["↑" "↑"] ["→" "→"] ["↓" "↓"] ["↔" "↔"] ["↵" "↵"] ["⇐" "⇐"] ["⇑" "⇑"] ["⇒" "⇒"] ["⇓" "⇓"] ["⇔" "⇔"] ["∀" "∀"] ["∂" "∂"] ["∃" "∃"] ["∅" "∅"] ["∇" "∇"] ["∈" "∈"] ["∉" "∉"] ["∋" "∋"] ["∏" "∏"] ["∑" "∑"] ["−" "−"] ["∗" "∗"] ["√" "√"] ["∝" "∝"] ["∞" "∞"] ["∠" "∠"] ["∧" "∧"] ["∨" "∨"] ["∩" "∩"] ["∪" "∪"] ["∫" "∫"] ["∴" "∴"] ["∼" "∼"] ["≅" "≅"] ["≈" "≈"] ["≠" "≠"] ["≡" "≡"] ["≤" "≤"] ["≥" "≥"] ["⊂" "⊂"] ["⊃" "⊃"] ["⊄" "⊄"] ["⊆" "⊆"] ["⊇" "⊇"] ["⊕" "⊕"] ["⊗" "⊗"] ["⊥" "⊥"] ["⋅" "⋅"] ["⌈" "⌈"] ["⌉" "⌉"] ["⌊" "⌊"] ["⌋" "⌋"] ["⟨" "〈"] ["⟩" "〉"] ["◊" "◊"] ["♠" "♠"] ["♣" "♣"] ["♥" "♥"] ["♦" "♦"] [""" "\""] ["Œ" "Œ"] ["œ" "œ"] ["Š" "Š"] ["š" "š"] ["Ÿ" "Ÿ"] ["ˆ" "ˆ"] ["˜" "˜"] ["–" "–"] ["—" "—"] ["‘" "‘"] ["’" "’"] ["‚" "‚"] ["“" "“"] ["”" "”"] ["„" "„"] ["†" "†"] ["‡" "‡"] ["‰" "‰"] ["‹" "‹"] ["›" "›"] ["€" "€"]] + "A list of sequence string pairs, representing an html entity and its decoded +character.") + +(defun +web--entities-string (text &optional decode-p) + "HTML encode/decode TEXT. Based on Xah's replace HTML named entities function +@ http://ergoemacs.org/emacs/elisp_replace_html_entities_command.html" + (interactive "") + (mapc (lambda (rep) + (let ((from (elt rep (if decode-p 0 1))) + (to (elt rep (if decode-p 1 0)))) + (when (s-contains-p from text) + (setq text (s-replace from to text))))) + +web-entities-list) + text) + +(defun +web--entities-region (beg end &optional decode-p) + "HTML encode/decode the selected region. Based on Xah's replace HTML named entities +function @ http://ergoemacs.org/emacs/elisp_replace_html_entities_command.html" + (save-restriction + (narrow-to-region beg end) + (let (case-fold-search) + (mapc (lambda (rep) + (goto-char (point-min)) + (while (search-forward (elt rep (if decode-p 0 1)) nil t) + (replace-match (elt rep (if decode-p 1 0)) 'FIXEDCASE 'LITERAL))) + reps)))) + +;;;###autoload +(defun +web-encode-entities (text) + "TODO" + (+web--entities-string text nil)) + +;;;###autoload +(defun +web-decode-entities (text) + "TODO" + (+web--entities-string text t)) + +;;;###autoload +(defun +web/encode-entities-region (beg end) + "Encode HTML entities in region." + (interactive "r") + (+web--entities-region beg end)) + +;;;###autoload +(defun +web/decode-entities-region (beg end) + "Decode HTML entities in region." + (interactive "r") + (+web--entities-region beg end t)) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index d26cbebf1..2f2e01dd5 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -1,113 +1,50 @@ -;;; module-web.el +;;; lang/web/config.el -(use-package haml-mode :mode "\\.haml$") - -(use-package pug-mode - :mode ("\\.jade$" "\\.pug$") - :config - (def-company-backend! pug-mode (yasnippet)) - (push '("jade" "html") projectile-other-file-alist) - (push '("pug" "html") projectile-other-file-alist) - (map! :map pug-mode-map - :i [tab] 'doom/dumb-indent - :i [backtab] 'doom/dumb-dedent)) - -(use-package web-mode - :mode ("\\.p?html?$" - "\\.\\(tpl\\|blade\\)\\(\\.php\\)?$" - "\\.erb$" - "\\.jsp$" - "\\.as[cp]x$" - "\\.mustache$" - "\\.tsx$" - "wp-content/themes/.+/.+\\.php$") - :init - (add-hook 'web-mode-hook 'turn-off-smartparens-mode) - :config - (def-company-backend! web-mode (web-html yasnippet)) - (setq web-mode-enable-html-entities-fontification t) - (push '("html" "jade" "pug" "jsx" "tsx") projectile-other-file-alist) - - (map! :map web-mode-map :i "SPC" 'self-insert-command) - - (after! nlinum - ;; Fix blank line numbers after unfolding - (advice-add 'web-mode-fold-or-unfold :after 'nlinum--flush)) - - (map! :map web-mode-map - "M-/" 'web-mode-comment-or-uncomment - :n "M-r" 'doom/web-refresh-browser - :n "za" 'web-mode-fold-or-unfold - (:localleader :n "t" 'web-mode-element-rename) - :nv "]a" 'web-mode-attribute-next - :nv "[a" 'web-mode-attribute-previous - :nv "]t" 'web-mode-tag-next - :nv "[t" 'web-mode-tag-previous - :nv "]T" 'web-mode-element-child - :nv "[T" 'web-mode-element-parent)) +(@load +html) +(@load +css) ;; -;; Tools +;; TODO Frameworks ;; -(use-package emmet-mode - :commands (emmet-mode) - :init - (add-hook! (scss-mode web-mode html-mode haml-mode nxml-mode) 'emmet-mode) - (defvar emmet-mode-keymap (make-sparse-keymap)) - :config - (setq emmet-move-cursor-between-quotes t) - (map! :map emmet-mode-keymap - :v "M-e" 'emmet-wrap-with-markup - :i "M-e" 'emmet-expand-yas - :i "M-E" 'emmet-expand-line)) +;; (defvar bower-conf (make-hash-table :test 'equal)) +;; (@def-project bower "bower" +;; :modes (web-mode js-mode coffee-mode css-mode sass-mode pug-mode) +;; :files ("bower.json") +;; :when +;; (lambda (&rest _) +;; (let* ((project-path (doom-project-root)) +;; (hash (gethash project-path bower-conf)) +;; (package-file (f-expand "bower.json" project-path)) +;; deps) +;; (awhen (and (not hash) (f-exists? package-file) +;; (ignore-errors (json-read-file package-file))) +;; (puthash project-path it bower-conf))) +;; t)) +;; (@def-project angularjs "angular" +;; :modes (nodejs-project-mode bower-project-mode) +;; :when +;; (lambda (&rest _) +;; (let* ((project (doom-project-root)) +;; (bower (gethash project bower-conf)) +;; (npm (gethash project npm-conf)) +;; (deps (append (cdr-safe (assq 'dependencies bower)) +;; (cdr-safe (assq 'dependencies npm)) +;; (cdr-safe (assq 'devDependencies bower)) +;; (cdr-safe (assq 'devDependencies npm))))) +;; (assq 'angular deps)))) -;; -;; Project types -;; +;; (@def-project jekyll ":{" +;; :modes (web-mode js-mode coffee-mode css-mode haml-mode pug-mode) +;; :match "/\\(\\(css\\|_\\(layouts\\|posts\\|sass\\)\\)/.+\\|.+.html\\)$" +;; :files ("config.yml" "_layouts/") +;; (@add-hook mode +;; (when (eq major-mode 'web-mode) +;; (web-mode-set-engine "django")))) -(defvar bower-conf (make-hash-table :test 'equal)) -(def-project-type! bower "bower" - :modes (web-mode js-mode coffee-mode css-mode sass-mode pug-mode) - :files ("bower.json") - :when - (lambda (&rest _) - (let* ((project-path (doom/project-root)) - (hash (gethash project-path bower-conf)) - (package-file (f-expand "bower.json" project-path)) - deps) - (awhen (and (not hash) (f-exists? package-file) - (ignore-errors (json-read-file package-file))) - (puthash project-path it bower-conf))) - t)) - -(def-project-type! angularjs "angular" - :modes (nodejs-project-mode bower-project-mode) - :when - (lambda (&rest _) - (let* ((project (doom/project-root)) - (bower (gethash project bower-conf)) - (npm (gethash project npm-conf)) - (deps (append (cdr-safe (assq 'dependencies bower)) - (cdr-safe (assq 'dependencies npm)) - (cdr-safe (assq 'devDependencies bower)) - (cdr-safe (assq 'devDependencies npm))))) - (assq 'angular deps)))) - -(def-project-type! jekyll ":{" - :modes (web-mode js-mode coffee-mode css-mode haml-mode pug-mode) - :match "/\\(\\(css\\|_\\(layouts\\|posts\\|sass\\)\\)/.+\\|.+.html\\)$" - :files ("config.yml" "_layouts/") - (add-hook! mode - (when (eq major-mode 'web-mode) - (web-mode-set-engine "django")))) - -(def-project-type! wordpress "wp" - :modes (php-mode web-mode css-mode haml-mode pug-mode) - :match "/wp-\\(\\(content\\|admin\\|includes\\)/\\)?.+$" - :files ("wp-config.php" "wp-content/")) - -(provide 'module-web) -;;; module-web.el ends here +;; (@def-project wordpress "wp" +;; :modes (php-mode web-mode css-mode haml-mode pug-mode) +;; :match "/wp-\\(\\(content\\|admin\\|includes\\)/\\)?.+$" +;; :files ("wp-config.php" "wp-content/")) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el new file mode 100644 index 000000000..2e25afa31 --- /dev/null +++ b/modules/lang/web/packages.el @@ -0,0 +1,18 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/web/packages.el + +;; config.el +;; n/a + +;; +html.el +(@package company-web) +(@package emmet-mode) +(@package haml-mode) +(@package pug-mode) +(@package web-mode) + +;; +css.el +(@package less-css-mode) +(@package sass-mode) +(@package stylus-mode) +