Update modules/lang/*

This commit is contained in:
Henrik Lissner 2017-02-19 18:57:16 -05:00
parent f0adef1b01
commit e14e25ecb4
68 changed files with 1487 additions and 750 deletions

View file

@ -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

View file

@ -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)

View file

@ -0,0 +1,6 @@
;; -*- no-byte-compile: t; -*-
;;; lang/assembly/packages.el
(@package mips-mode)
(@package haxor-mode)
(@package nasm-mode)

View file

@ -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[^<]+"))))

View file

@ -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) :commands (c-mode c++-mode objc-mode java-mode)
:mode ("\\.mm" . objc-mode) :mode ("\\.mm" . objc-mode)
:init :init
(add-hook! (c-mode c++-mode) 'doom|extra-fontify-c/c++) ;; Auto-detect C++ header files
(add-hook 'c-mode-hook 'highlight-numbers-mode) (push (cons (lambda ()
(add-hook 'c++-mode-hook 'doom|extra-fontify-c++) (and (equal (file-name-extension buffer-file-name) "h")
(add-hook 'c-initialization-hook 'doom|init-c/c++-settings) (or (file-exists-p (expand-file-name
(concat (file-name-sans-extension buffer-file-name)
;; C++ header files ".cpp")))
(push (cons (lambda () (and (f-ext? buffer-file-name "h") (when-let (file (car-safe (projectile-get-other-files
(or (f-exists? (f-swap-ext buffer-file-name "cpp")) buffer-file-name
(awhen (car-safe (projectile-get-other-files (buffer-file-name) (projectile-current-project-files))) (projectile-current-project-files))))
(f-ext? it "cpp"))))) (equal (file-name-extension file) "cpp")))))
'c++-mode) 'c++-mode)
magic-mode-alist) magic-mode-alist)
;; Obj-C ;; Auto-detect Obj-C header files
(push (cons (lambda () (and (f-ext? buffer-file-name "h") (push (cons (lambda () (and (equal (file-name-extension buffer-file-name) "h")
(re-search-forward "@\\<interface\\>" magic-mode-regexp-match-limit t))) (re-search-forward "@\\<interface\\>" magic-mode-regexp-match-limit t)))
'objc-mode) 'objc-mode)
magic-mode-alist) magic-mode-alist)
:config :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 (setq c-tab-always-indent nil
c-electric-flag 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-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"))) (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC")))
;; Doxygen blocks ;; Doxygen blocks
(sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC"))) (sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC")))
(sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC")))) (sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC"))))
;; Improve indentation of inline lambdas in C++11 ;; 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 :commands modern-c++-font-lock-mode
:init (add-hook 'c++-mode-hook '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 :after cc-mode
:config :config
(setq irony-server-install-prefix (concat doom-ext-dir "/irony-mode/server/build/irony/")) (setq irony-server-install-prefix (concat doom-cache-dir "irony-server/"))
(add-hook! c++-mode (@add-hook 'irony-mode-hook '(irony-eldoc flycheck-mode))
(@add-hook 'c++-mode-hook
(make-local-variable 'irony-additional-clang-options) (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) (@def-package irony-eldoc :after irony)
(require 'company-irony)
(require 'company-irony-c-headers)
(require 'flycheck-irony)
(flycheck-irony-setup)
;; some c-mode dervied modes wrongfully trigger these hooks (like php-mode) (@def-package flycheck-irony :after irony :config (flycheck-irony-setup))
(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))))
(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$" :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$") (@def-package demangle-mode
(use-package demangle-mode
:commands demangle-mode :commands demangle-mode
:init (add-hook 'llvm-mode-hook 'demangle-mode)) :init (add-hook 'llvm-mode-hook 'demangle-mode))
(provide 'module-cc)
;;; module-cc.el ends here

View file

@ -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))

48
modules/lang/cc/setup.sh Executable file
View file

@ -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

View file

@ -1,16 +1,11 @@
;;; module-crystal.el ;;; module-crystal.el
(use-package crystal-mode (@def-package crystal-mode
:mode "\\.cr$" :mode "\\.cr$"
:interpreter "crystal" :interpreter "crystal"
:config :config
(def-docset! crystal-mode "crystal") (@set :eval 'crystal-mode
(after! quickrun '((:command . "crystal")
(quickrun-add-command (:exec . "%c %s")
"crystal" '((:command . "crystal") (:description . "Run Crystal script"))))
(:exec . "%c %s")
(:description . "Run Crystal script"))
:mode 'crystal-mode)))
(provide 'module-crystal)
;;; module-crystal.el ends here

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/crystal/packages.el
(@package crystal-mode :recipe (:fetcher github :repo "dotmilk/emacs-crystal-mode"))

View file

@ -1,49 +1,49 @@
;;; module-csharp.el --- -*- no-byte-compile: t; -*- ;;; module-csharp.el
(use-package csharp-mode (@def-package csharp-mode
:mode "\\.cs$" :mode "\\.cs$"
:init (add-hook 'csharp-mode-hook 'flycheck-mode)) :init (add-hook 'csharp-mode-hook 'flycheck-mode))
(use-package shader-mode :mode "\\.shader$") ; unity shaders
(use-package omnisharp (@def-package omnisharp
:commands (omnisharp-mode) :commands omnisharp-mode
:preface :preface
(setq omnisharp-auto-complete-want-documentation nil (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) :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 :config
(def-company-backend! csharp-mode (omnisharp)) (@set :company-backend 'csharp-mode '(company-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"))))
;; Map all refactor commands (see emr) ;; Map all refactor commands (see emr)
(mapc (lambda (x) (@map :map omnisharp-mode-map
(let ((command-name (car x)) :n "gd" 'omnisharp-go-to-definition
(title (cadr x)))
(emr-declare-command :localleader
(intern (format "omnisharp-%s" (symbol-name command-name))) :n "b" 'omnisharp-recompile
:title title :modes 'omnisharp-mode)))
'((find-usages "find usages") :prefix "r"
(find-implementations "find implementations") :n "fu" 'omnisharp-find-usages
(fix-code-issue-at-point "fix code issue at point") :n "fi" 'omnisharp-find-implementations
(fix-usings "fix usings") :n "i" 'omnisharp-fix-code-issue-at-point
(rename "rename") :n "u" 'omnisharp-fix-usings
(current-type-information "current type information") :n "r" 'omnisharp-rename
(current-type-documentation "current type documentation") :n "ti" 'omnisharp-current-type-information
(navigate-to-current-file-member "navigate to current file member") :n "td" 'omnisharp-current-type-documentation
(navigate-to-solution-member "navigate to solution member") :n "gf" 'omnisharp-navigate-to-current-file-member
(navigate-to-solution-file-then-file-member "navigate to solution file then member") :n "gm" 'omnisharp-navigate-to-solution-member
(navigate-to-solution-file "navigate to solution file") :n "gM" 'omnisharp-navigate-to-solution-file-then-file-member
(navigate-to-region "navigate to region") :n "gF" 'omnisharp-navigate-to-solution-file
(show-last-auto-complete-result "last auto complete result") :n "gr" 'omnisharp-navigate-to-region
(show-overloads-at-point "show overloads at point") :n "a" 'omnisharp-show-last-auto-complete-result
(recompile "recompile")))) :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

View file

@ -0,0 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; lang/csharp/packages.el
(@package csharp-mode)
(@package omnisharp)
(@package shader-mode)

11
modules/lang/csharp/setup.sh Executable file
View file

@ -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

View file

@ -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

View file

@ -1,40 +1,52 @@
;;; module-data.el ;;; 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$") (@def-package nxml-mode
:mode "\\.plist$"
(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$"
:config :config
(def-docset! dockerfile-mode "docker") (@set :company-backend 'nxml-mode '(company-nxml company-yasnippet)))
(def-builder! dockerfile-mode dockerfile-build-buffer "Dockerfile"))
(@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 ;; For ROM hacking or debugging
(use-package hexl-mode (@def-package hexl-mode
:mode ("\\.hex$" "\\.nes$")) :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" ;; (@def-project ansible-mode "ans"
:files ("Vagrantfile")) ;; :modes (yaml-mode)
;; :files ("roles/"))
;; (@def-project vagrant "vagrant"
;; :files ("Vagrantfile"))
(provide 'module-data)
;;; module-data.el ends here

View file

@ -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)

View file

@ -1,14 +1,14 @@
;;; lang/emacs-lisp/config.el ;;; lang/emacs-lisp/config.el
(@def-package elisp-mode (@def-package elisp-mode ; built-in
:mode ("/Cask$" . emacs-lisp-mode) :mode ("/Cask$" . emacs-lisp-mode)
:init :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 :config
(@map :map emacs-lisp-mode-map (@map :map emacs-lisp-mode-map
:m "gd" '+emacs-lisp/find-function :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') ;; Don't affect lisp indentation (only `tab-width')
(setq editorconfig-indentation-alist (setq editorconfig-indentation-alist
@ -19,11 +19,15 @@
(setq mode-name "Elisp") ; [pedantry intensifies] (setq mode-name "Elisp") ; [pedantry intensifies]
(add-hook 'before-save-hook 'delete-trailing-whitespace nil t) (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 (font-lock-add-keywords
nil `(;; Display "lambda" as λ nil `(;; Display "lambda" as λ
("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) 'decompose-region)))) ("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) 'decompose-region))))
;; Highlight doom/module functions ;; 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+) ;; Highlight doom macros (no need, macros are fontified in emacs 25+)
;; ("\\(^\\|\\s-\\)(\\(@[^) ]+\\)[) \n]" (2 font-lock-preprocessor-face append)) ;; ("\\(^\\|\\s-\\)(\\(@[^) ]+\\)[) \n]" (2 font-lock-preprocessor-face append))
)) ))
@ -38,20 +42,13 @@
("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1)
("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1)
("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\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-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)
("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) ("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) ("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 ;; Plugins
;; ;;

View file

@ -1,43 +1,37 @@
;;; module-go.el ;;; lang/go/config.el
(use-package go-mode (@def-package go-mode
:mode "\\.go$" :mode "\\.go$"
:interpreter "go" :interpreter "go"
:init :init
(add-hook 'go-mode-hook 'flycheck-mode) (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 :config
(def-builder! go-mode "go build") (@set :build 'go-build 'go-mode '+go/build)
(def-company-backend! go-mode (go yasnippet)) (@set :company-backend 'go-mode '(company-go company-yasnippet))
(def-repl! go-mode gorepl-run) (@set :repl 'go-mode 'gorepl-run)
(map! :map go-mode-map
(@map :map go-mode-map
:n "gd" 'godef-jump :n "gd" 'godef-jump
(:leader :n "h" 'godef-describe)
(:localleader (:localleader
:n "tr" 'doom:go-test-run-all :n "k" 'godef-describe
:n "ta" 'doom:go-test-run-all :prefix "r"
:n "ts" 'doom:go-test-run-package)) :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)) :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

View file

@ -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))

View file

@ -1,20 +1,20 @@
;;; module-haskell.el ;;; module-haskell.el
(use-package haskell (@def-package haskell
:mode (("\\.hs$" . haskell-mode) :mode (("\\.hs$" . haskell-mode)
("\\.ghci$" . ghci-script-mode) ("\\.ghci$" . ghci-script-mode)
("\\.cabal$" . haskell-cabal-mode)) ("\\.cabal$" . haskell-cabal-mode))
:interpreter (("runghc" . haskell-mode) :interpreter (("runghc" . haskell-mode)
("runhaskell" . 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 :config
(def-popup! "*debug:haskell*" :size 20) (@set :popup "*debug:haskell*" :size 20)
(def-repl! haskell-mode switch-to-haskell) (@set :repl 'haskell-mode 'switch-to-haskell)
(push ".hi" completion-ignored-extensions)) (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) (@def-package inf-haskell ; part of haskell
;;; module-haskell.el ends here :commands (inferior-haskell-mode inf-haskell-mode switch-to-haskell)
:config (@map :map inf-haskell-mode-map "ESC ESC" 'doom/popup-close))

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/haskell/packages.el
(@package haskell-mode)

View file

@ -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"))))

View file

@ -1,37 +1,35 @@
;;; module-java.el ;;; lang/java/config.el
(use-package meghanada (@def-package meghanada
:commands meghanada-mode :commands meghanada-mode
:init :init
(add-hook! java-mode '(meghanada-mode flycheck-mode)) (@add-hook java-mode '(meghanada-mode flycheck-mode))
:config :config
(def-docset! java-mode "java,javafx,grails,groovy,playjava,spring,cvj,processing,javadoc") (@set :build 'compile-file 'java-mode 'meghanada-compile-file)
(def-builder! java-mode meghanada-compile-project) (@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-company t
meghanada-use-flycheck t meghanada-use-flycheck t
meghanada-use-auto-start t) meghanada-use-auto-start t)
(unless (f-exists? (meghanada--locate-server-jar)) (@map :map meghanada-mode-map :m "gd" 'meghanada-jump-declaration)
(meghanada-install-server))
(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 :commands android-mode
:init :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 :config
(def-yas-mode! android-mode) (@set :yas-minor-mode 'android-mode)
(after! company-dict (@set :company-dict-minor-mode 'android-mode))
(push 'android-mode company-dict-minor-mode-list)))
(use-package groovy-mode
:mode "\\.g\\(radle\\|vy\\|roovy\\)$" (@def-package groovy-mode
:mode "\\.g\\(radle\\|roovy\\)$"
:config :config
(after! quickrun (@set :eval 'groovy-mode "groovy"))
(push '("\\.gvy$" . "groovy") quickrun-file-alist)))
(provide 'module-java)
;;; module-java.el ends here

View file

@ -0,0 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; lang/java/packages.el
(@package meghanada)
(@package android-mode)
(@package groovy-mode)

View file

@ -165,12 +165,13 @@
"REACTIONS" "BODYPARTS_ALL" "RESOURCES_ALL" "COLORS_ALL")) "REACTIONS" "BODYPARTS_ALL" "RESOURCES_ALL" "COLORS_ALL"))
(project! screeps "screeps" ;; TODO
:match "/screeps/.+$" ;; (@def-project screeps "screeps"
:modes (nodejs-project-mode)) ;; :match "/screeps/.+$"
;; :modes (nodejs-project-mode))
(@add-hook screeps-project-mode ;; (@add-hook screeps-project-mode
(when (eq major-mode 'js2-mode) ;; (when (eq major-mode 'js2-mode)
(add-to-list 'flycheck-disabled-checkers 'javascript-jshint) ;; (add-to-list 'flycheck-disabled-checkers 'javascript-jshint)
(setq js2-additional-externs (append '("_") screeps-objects screeps-constants)))) ;; (setq js2-additional-externs (append '("_") screeps-objects screeps-constants))))

View file

@ -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")))

View file

@ -1,58 +1,84 @@
;; lang/javascript/config.el ;; lang/javascript/config.el
;; TODO (@load +screeps)
(@def-package js2-mode (@def-package js2-mode
:mode "\\.js$" :mode "\\.js$"
:interpreter "node" :interpreter "node"
:init :config
(setq js2-skip-preprocessor-directives t (setq js2-skip-preprocessor-directives t
js2-highlight-external-variables nil js2-highlight-external-variables nil
js2-mode-show-parse-errors nil) js2-mode-show-parse-errors nil)
:config (@add-hook js2-mode '(tern-mode flycheck-mode highlight-indent-guides-mode))
(@add-hook '(tern-mode flycheck-mode highlight-indent-guides-mode)) ;; Conform switch-case indentation to editorconfig's config
;; Only way to conform switch-case indentation to editorconfig's config (@add-hook js2-mode (setq js-switch-indent-offset js-indent-level))
(@add-hook (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-backend 'js2-mode '(company-tern))
(@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")))
(@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 jsx-mode :mode "\\.jsx$")
(@def-package coffee-mode (@def-package coffee-mode
:mode "\\.coffee$" :mode "\\.coffee$"
:init (setq coffee-indent-like-python-mode t)) :init (setq coffee-indent-like-python-mode t))
@ -62,15 +88,15 @@
;; Projects ;; Projects
;; ;;
(project! npm ;; (project! npm
:modes (web-mode js2-mode) ;; :modes (web-mode js2-mode)
:files ("package.json") ;; :files ("package.json")
:config ;; :config
(let* ((project-path (doom-project-root)) ;; (let* ((project-path (doom-project-root))
(hash (gethash project-path npm-conf)) ;; (hash (gethash project-path npm-conf))
(package-file (expand-file-name "package.json" project-path)) ;; (package-file (expand-file-name "package.json" project-path))
deps) ;; deps)
(-when-let (json (and (not hash) (f-exists? package-file) ;; (when-let (json (and (not hash) (file-exists-p package-file)
(ignore-errors (json-read-file package-file)))) ;; (ignore-errors (json-read-file package-file))))
(puthash project-path json npm-conf)))) ;; (puthash project-path json npm-conf))))

View file

@ -2,9 +2,12 @@
;;; lang/javascript/packages.el ;;; lang/javascript/packages.el
(@package coffee-mode) (@package coffee-mode)
(@package company-tern :needs +company)
(@package js2-mode) (@package js2-mode)
(@package js2-refactor) (@package js2-refactor)
(@package jsx-mode) (@package jsx-mode)
(@package nodejs-repl)
(@package tern) (@package tern)
(when (@featurep :completion company)
(@package company-tern))

View file

@ -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))))

View file

@ -1,11 +1,8 @@
;;; module-julia.el ;;; lang/julia/config.el
(use-package julia-mode (use-package julia-mode
:mode "\\.jl$" :mode "\\.jl$"
:interpreter "julia" :interpreter "julia"
:config :config
(def-docset! julia-mode "julia") (@set :repl 'julia-mode '+julia/repl))
(def-repl! julia-mode doom/julia-repl))
(provide 'module-julia)
;;; module-julia.el ends here

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/julia/packages.el
(@package julia-mode)

View file

@ -1,40 +1,61 @@
;;; module-latex.el ;;; lang/latex/config.el
(defvar doom-bibtex-dir "~/Dropbox/docs/biblio") ;; TODO Test me
(use-package reftex (defvar +latex-bibtex-dir "~/work/writing/biblio/"
:commands turn-on-reftex "Where bibtex files are kept.")
:init
(setq reftex-plug-into-AUCTeX t (defvar +latex-bibtex-default-file "default.bib"
reftex-ref-style-default-list '("Cleveref" "Hyperref" "Fancyref") "TODO")
reftex-default-bibliography
`(,(expand-file-name "phys.bib" doom-bibtex-dir)))
(add-hook! (LaTeX-mode latex-mode) 'turn-on-reftex)) ;;
;; Plugins
(use-package helm-bibtex ;;
:commands helm-bibtex
(@def-package auctex
:mode ("\\.tex$" . LaTeX-mode)
:init :init
(add-hook 'LaTeX-mode-hook 'turn-on-auto-fill)
:config
(setq TeX-auto-save t (setq TeX-auto-save t
TeX-parse-self t TeX-parse-self t
bibtex-dialect 'biblatex TeX-source-correlate-start-server nil
bibtex-align-at-equal-sign t LaTeX-fill-break-at-separators nil)
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)
(@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 :config
(setq helm-bibtex-bibliography (setq bibtex-dialect 'biblatex
(list (f-expand "phys.bib" doom-bibtex-dir)) bibtex-align-at-equal-sign t
bibtex-text-indentation 20
bibtex-completion-bibliography (list +latex-bibtex-default-file))
helm-bibtex-library-path (@map :map bibtex-mode-map
(list (f-expand "phys-pdf" doom-bibtex-dir)) "C-c \\" 'bibtex-fill-entry))
helm-bibtex-notes-path (f-expand "notes.org" doom-bibtex-dir)
helm-bibtex-pdf-open-function (@def-package reftex ; built-in
(lambda (fpath) (async-start-process "open-pdf" "/usr/bin/open" nil fpath)))) :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

View file

@ -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))

View file

@ -0,0 +1,9 @@
;;; lang/lua/autoload.el
;;;###autoload
(defun +lua/repl ()
(interactive)
(lua-start-process "lua" "lua")
(pop-to-buffer lua-process-buffer))

View file

@ -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$" :mode "\\.lua$"
:interpreter "lua" :interpreter "lua"
:init (add-hook 'lua-mode-hook 'flycheck-mode) :init
(add-hook 'lua-mode-hook 'flycheck-mode)
:config :config
(def-company-backend! lua-mode (lua yasnippet)) (@set :company-backend 'lua-mode '(company-lua company-yasnippet))
(def-electric! lua-mode :words ("else" "end")) (@set :electric 'lua-mode :words "else" "end")
(def-repl! lua-mode doom/inf-lua) (@set :repl 'lua-mode '+lua/repl)
;; sp's lua-specific rules are obnoxious, so we disable them ;; sp's lua-specific rules are obnoxious, so we disable them
(setq sp-pairs (delete (assq 'lua-mode sp-pairs) sp-pairs))) (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) :mode ("\\.moon$" . moonscript-mode)
:config :config
(push '(moonscript-mode moonscript-indent-offset) editorconfig-indentation-alist)) (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" ;; (def-project-type! love "♥"
:modes (lua-mode markdown-mode) ;; :modes (lua-mode markdown-mode json-mode)
:match "/\\.?hammerspoon/.+\\.lua$" ;; :files ("main.lua" "conf.lua")
:build "open hammerspoon://reload") ;; :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

View file

@ -0,0 +1,9 @@
;; -*- no-byte-compile: t; -*-
;;; lang/lua/packages.el
(@package lua-mode)
(@package moonscript)
(when (@featurep :completion company)
(@package company-lua))

View file

@ -1,11 +1,11 @@
;;; lang/text/autoload.el ;;; lang/markdown/autoload.el
;; Implement strike-through formatting ;; Implement strike-through formatting
(defvar +text--markdown-regex-del (defvar +text--markdown-regex-del
"\\(^\\|[^\\]\\)\\(\\(~\\{2\\}\\)\\([^ \n \\]\\|[^ \n ]\\(?:.\\|\n[^\n]\\)*?[^\\ ]\\)\\(\\3\\)\\)") "\\(^\\|[^\\]\\)\\(\\(~\\{2\\}\\)\\([^ \n \\]\\|[^ \n ]\\(?:.\\|\n[^\n]\\)*?[^\\ ]\\)\\(\\3\\)\\)")
;;;###autoload ;;;###autoload
(defun +text/markdown-insert-del () (defun +markdown/insert-del ()
"Surround region in github strike-through delimiters." "Surround region in github strike-through delimiters."
(interactive) (interactive)
(let ((delim "~~")) (let ((delim "~~"))

View file

@ -1,4 +1,4 @@
;;; lang/text/config.el ;;; lang/markdown/config.el
(@def-package markdown-mode (@def-package markdown-mode
:mode ("\\.m\\(d\\|arkdown\\)$" "/README$" :mode ("\\.m\\(d\\|arkdown\\)$" "/README$"
@ -11,6 +11,8 @@
markdown-gfm-additional-languages '("sh")) markdown-gfm-additional-languages '("sh"))
:config :config
(@set :electric 'markdown-mode :chars "+" "#")
(@add-hook markdown-mode (@add-hook markdown-mode
(auto-fill-mode +1) (auto-fill-mode +1)
(setq line-spacing 2 (setq line-spacing 2
@ -20,33 +22,38 @@
'(markdown-mode gfm-mode) '(markdown-mode gfm-mode)
"\`\`\`" "\`\`\`" :post-handlers '(("||\n" "RET"))) "\`\`\`" "\`\`\`" :post-handlers '(("||\n" "RET")))
(@set :electric-chars "+" "#") (@map :map gfm-mode-map
(@map :map gfm-mode-map "`" 'self-insert-command) "`" 'self-insert-command
(@map :map markdown-mode-map
:map markdown-mode-map
"<backspace>" nil "<backspace>" nil
"<M-left>" nil "<M-left>" nil
"<M-right>" nil "<M-right>" nil
"M-*" 'markdown-insert-list-item "M-*" 'markdown-insert-list-item
"M-b" 'markdown-insert-bold "M-b" 'markdown-insert-bold
"M-i" 'markdown-insert-italic "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 ;; 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 ;; TODO: Make context sensitive
:n "[p" 'markdown-promote :n "[p" 'markdown-promote
:n "]p" 'markdown-demote :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 :i "M--" 'markdown-insert-hr
(:localleader (:localleader
:nv "i" 'markdown-insert-image :nv "o" 'markdown-open
:nv "l" 'markdown-insert-link :nv "b" 'markdown-preview
:nv "L" 'markdown-insert-reference-link-dwim (:prefix "i"
:nv "b" 'markdown-preview))) :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 (@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)))

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/text/packages.el ;;; lang/markdown/packages.el
(@package markdown-mode) (@package markdown-mode)
(@package markdown-toc) (@package markdown-toc)

View file

@ -1,18 +1,14 @@
;;; module-octave.el ;;; lang/octave/config.el
(use-package octave ;; built-in
(@def-package octave
:mode (("\\.m$" . octave-mode)) :mode (("\\.m$" . octave-mode))
:config :commands (octave-mode run-octave)
;; (setq inferior-octave-program "/usr/local/bin/octave") :config (@set :repl 'octave-mode 'run-octave))
)
;; (use-package ac-octave ;; (use-package ac-octave
;; :config ;; :config
;; (add-hook! octave-mode ;; (@add-hook octave-mode
;; (require 'ac-octave) ;; (require 'ac-octave)
;; (setq ac-sources '(ac-source-octave)))) ;; (setq ac-sources '(ac-source-octave))))
(use-package octave-inf :commands run-octave)
(provide 'module-octave)
;;; module-octave.el ends here

View file

@ -1,24 +1,23 @@
;;; module-php.el ;;; lang/php/config.el
(use-package hack-mode ;; (@def-package hack-mode
:mode "\\.hh$" ;; :mode "\\.hh$"
:config (def-company-backend! hack-mode (capf))) ;; :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" :interpreter "php"
:init :init
(add-hook 'php-mode-hook 'flycheck-mode) (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 :config
(def-repl! php-mode php-boris) (setq php-template-compatibility nil)
(def-company-backend! php-mode '(php-extras-company company-yasnippet))
(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-with-modes '(php-mode)
(sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))) (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC")))
@ -27,14 +26,35 @@
(sp-local-pair "<?php " " ?>") (sp-local-pair "<?php " " ?>")
(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 "<?php" "?>" :when '(("RET")) :post-handlers '("||\n[i]")))) (sp-local-pair "<?php" "?>" :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 :after php-mode
:init (add-hook 'php-mode-hook 'eldoc-mode) :init
(add-hook 'php-mode-hook 'eldoc-mode)
:config :config
(defun php-extras-company-setup ()) ;; company will set up itself (setq php-extras-eldoc-functions-file (concat doom-cache-dir "/php-extras-eldoc-functions"))
;; Generate php-extras documentation and completion asynchronously
;; 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")) (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el"))
(async-start `(lambda () (async-start `(lambda ()
,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$")
@ -44,56 +64,39 @@
(load (concat php-extras-eldoc-functions-file ".el")) (load (concat php-extras-eldoc-functions-file ".el"))
(message "PHP eldoc updated!"))))) (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 (@def-package php-refactor-mode
:commands (phpunit-current-test phpunit-current-class phpunit-current-project) :commands php-refactor-mode
:config :init (add-hook 'php-mode-hook 'php-refactor-mode))
(map! :map php-mode-map
(:localleader
:n "tr" 'phpunit-current-project (@def-package phpunit
:n "ta" 'phpunit-current-class :commands (phpunit-current-test phpunit-current-class phpunit-current-project))
:n "ts" 'phpunit-current-test)))
(@def-package php-boris :commands php-boris)
(use-package php-boris :commands php-boris) ; PHP REPL
;; ;;
(def-project-type! laravel "laravel" ;; Projects
: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 laravel "laravel"
(def-project-type! composer "composer" ;; :modes (php-mode yaml-mode web-mode nxml-mode js2-mode scss-mode)
:modes (web-mode php-mode) ;; :files ("artisan" "server.php"))
:files ("composer.json")
:when ;; (defvar php-composer-conf (make-hash-table :test 'equal))
(lambda (&rest _) ;; (@def-project composer "composer"
(let* ((project-path (doom/project-root)) ;; :modes (web-mode php-mode)
(hash (gethash project-path php-composer-conf)) ;; :files ("composer.json")
(package-file (f-expand "composer.json" project-path)) ;; :when
deps) ;; (lambda (&rest _)
(awhen (and (not hash) (f-exists? package-file) ;; (let* ((project-path (doom/project-root))
(json-read-file package-file)) ;; (hash (gethash project-path php-composer-conf))
(puthash project-path it php-composer-conf))) ;; (package-file (expand-file-name "composer.json" project-path))
t)) ;; 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

View file

@ -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"))

View file

@ -1,46 +1,39 @@
;;; module-processing.el ;;; module-processing.el
(use-package processing-mode (@def-package processing-mode
:when IS-MAC
:commands (processing-mode processing-find-sketch) :commands (processing-mode processing-find-sketch)
:mode "\\.pde$" :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 :config
(def-builder! processing-mode processing-sketch-build) (@set :build 'build-sketch 'processing-mode 'processing-sketch-build)
(def-popup! "*processing-compilation*" :align below :size 10 :noselect t) (@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" (setq processing-location "/usr/local/bin/processing-java"
processing-application-dir "/Applications/Processing.app" processing-application-dir "/Applications/Processing.app"
processing-sketchbook-dir "~/Dropbox/work/pde" processing-sketchbook-dir "~/Dropbox/work/pde"
processing-output-dir "/tmp") processing-output-dir "/tmp")
(map! :map processing-mode-map (@map :map processing-mode-map
:nv "M-r" 'processing-sketch-run :nv "M-r" 'processing-sketch-run
:m "gd" 'processing-find-in-reference :m "gd" 'processing-find-in-reference
:m "gF" 'processing-find-sketch :m "gF" 'processing-find-sketch
(:localleader
"e" 'processing-export-application
"h" 'processing-open-reference
"e" 'processing-open-examples
"o" 'processing-open-sketchbook))
(after! quickrun :localleader
(quickrun-add-command :n "e" 'processing-export-application
"processing" `((:command . ,processing-location) :n "h" 'processing-open-reference
(:exec . (lambda () (format "--sketch=%s --output=%s --force --run" :n "e" 'processing-open-examples
(doom/project-root) processing-output-dir))) :n "o" 'processing-open-sketchbook)
(:description . "Run Processing sketch"))
:mode 'processing-mode))
(add-hook! processing-mode (@after company-keywords
(setq-local company-backends '((company-keywords (nconc company-keywords-alist
:with (cons 'processing-mode (append processing-functions
company-yasnippet processing-builtins
company-dabbrev-code))) processing-constants)))))
(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

View file

@ -0,0 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/processing/packages.el
(@package processing-mode)

View file

@ -1,82 +1,73 @@
;;; module-python.el ;;; lang/python/config.el
(use-package python (@def-package python
:mode ("\\.py\\'" . python-mode)
:interpreter ("python" . python-mode)
:commands python-mode :commands python-mode
:init :init
(setq-default (setq python-environment-directory doom-cache-dir
python-environment-directory doom-temp-dir python-shell-interpreter "ipython"
python-shell-interpreter "ipython" python-shell-interpreter-args "--deep-reload"
python-shell-interpreter-args "--deep-reload" python-shell-prompt-regexp "In \\[[0-9]+\\]: "
python-shell-prompt-regexp "In \\[[0-9]+\\]: " python-shell-prompt-block-regexp "\\.\\.\\.\\.: "
python-shell-prompt-block-regexp "\\.\\.\\.\\.: " python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: "
python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " python-shell-completion-setup-code
python-shell-completion-setup-code "from IPython.core.completerlib import module_completion"
"from IPython.core.completerlib import module_completion" python-shell-completion-string-code
python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
"';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
(add-hook 'python-mode-hook 'flycheck-mode) (add-hook 'python-mode-hook 'flycheck-mode)
:config :config
(def-company-backend! python-mode (anaconda)) (@set :repl 'python-mode '+python/repl)
(def-repl! python-mode doom/inf-python)
(def-version-cmd! python-mode "python --version 2>&1 | cut -d' ' -f2")
(define-key python-mode-map (kbd "DEL") nil)) ; interferes with smartparens (define-key python-mode-map (kbd "DEL") nil)) ; interferes with smartparens
(use-package anaconda-mode
(@def-package anaconda-mode
:after python :after python
:init :init
(add-hook! python-mode '(anaconda-mode anaconda-eldoc-mode eldoc-mode)) (add-hook 'python-mode-hook 'anaconda-mode)
(setq anaconda-mode-installation-directory (concat doom-temp-dir "/anaconda/") (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) anaconda-mode-eldoc-as-single-line t)
:config :config
(map! :map anaconda-mode-map :m "gd" 'anaconda-mode-find-definitions) (@set :company-backend 'python-mode '(company-anaconda))
(map! :map anaconda-nav-mode-map :n [escape] 'anaconda-nav-quit)
(@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)) (advice-add 'anaconda-mode-doc-buffer :after 'doom*anaconda-mode-doc-buffer))
(use-package company-anaconda (@def-package company-anaconda
:after anaconda-mode :after anaconda-mode
:config :config
(mapc (lambda (x) (@set :emr 'python-mode
(let ((command-name (car x)) '(:nv anaconda-mode-show-doc "view documentation")
(title (cadr x)) '(:nv anaconda-mode-find-assignments "find assignments")
(region-p (caddr x)) '(:nv anaconda-mode-find-definitions "find definitions")
predicate) '(:nv anaconda-mode-find-file "find assignments")
(setq predicate (lambda () (and (anaconda-mode-running-p) '(:n anaconda-mode-find-references "show usages")))
(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))))
(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 :commands nose-mode
:preface (defvar nose-mode-map (make-sparse-keymap)) :preface
:init (associate! nose-mode :match "/test_.+\\.py$" :in (python-mode)) (defvar nose-mode-map (make-sparse-keymap))
:init
(@associate nose-mode :match "/test_.+\\.py$" :in (python-mode))
:config :config
(def-popup! "*nosetests*" :align below :size 0.4 :noselect t) (@set :popup "*nosetests*" :size 0.4 :noselect t)
(def-yas-mode! nose-mode) (@set :yas-minor-mode 'nose-mode)
(map! :map nose-mode-map (@map :map nose-mode-map
(:localleader :localleader
:n "tr" 'nosetests-again :n "tr" 'nosetests-again
:n "ta" 'nosetests-all :n "ta" 'nosetests-all
:n "ts" 'nosetests-one :n "ts" 'nosetests-one
:n "tv" 'nosetests-module :n "tv" 'nosetests-module
:n "tA" 'nosetests-pdb-all :n "tA" 'nosetests-pdb-all
:n "tO" 'nosetests-pdb-one :n "tO" 'nosetests-pdb-one
:n "tV" 'nosetests-pdb-module))) :n "tV" 'nosetests-pdb-module))
(provide 'module-python)
;;; module-python.el ends here

View file

@ -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))

View file

@ -1,52 +1,50 @@
;;; module-ruby.el ;;; lang/ruby/config.el
(use-package ruby-mode (@def-package ruby-mode
:mode ("\\.rb$" "\\.rake$" "\\.gemspec$" "\\.?pryrc$" :mode ("\\.rb$" "\\.rake$" "\\.gemspec$" "\\.?pryrc$"
"/\\(Gem\\|Cap\\|Vagrant\\|Rake\\)file$") "/\\(Gem\\|Cap\\|Vagrant\\|Rake\\)file$")
:interpreter "ruby" :interpreter "ruby"
:init (add-hook 'ruby-mode-hook 'flycheck-mode) :init
(add-hook 'ruby-mode-hook 'flycheck-mode)
:config :config
(def-builder! ruby-mode "rake %s" "Rakefile") (@set :build 'rake 'ruby-mode '+ruby/rake)
(def-company-backend! ruby-mode (dabbrev-code)) (@set :company-backend 'ruby-mode '(company-dabbrev-code))
(def-electric! ruby-mode :words ("else" "end" "elseif")) (@set :electric 'ruby-mode :words "else" "end" "elseif")
(def-repl! ruby-mode inf-ruby) (@set :repl 'ruby-mode 'inf-ruby)
(def-version-cmd! ruby-mode "ruby --version | cut -d' ' -f2")
(setq ruby-deep-indent-paren t) (setq ruby-deep-indent-paren t)
;; Don't interfere with my custom RET behavior ;; 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 ;; Highlight doc comments
(use-package yard-mode (@def-package yard-mode
:commands yard-mode :commands yard-mode
:init (add-hook 'ruby-mode-hook 'yard-mode)) :init (add-hook 'ruby-mode-hook 'yard-mode))
(use-package rspec-mode
(@def-package rspec-mode
:mode ("/\\.rspec$" . text-mode) :mode ("/\\.rspec$" . text-mode)
:init :init
(associate! rspec-mode :match "/\\.rspec$") (@associate rspec-mode :match "/\\.rspec$")
(associate! rspec-mode :in (ruby-mode yaml-mode) :files ("spec/")) (@associate rspec-mode :in (ruby-mode yaml-mode) :files ("/spec/"))
(defvar rspec-mode-verifiable-map (make-sparse-keymap)) (defvar rspec-mode-verifiable-map (make-sparse-keymap))
(defvar evilmi-ruby-match-tags (defvar evilmi-ruby-match-tags
'((("unless" "if") ("elsif" "else") "end") '((("unless" "if") ("elsif" "else") "end")
@ -56,23 +54,27 @@
;; Rake ;; Rake
(("task" "namespace") () "end"))) (("task" "namespace") () "end")))
:config :config
(map! :map rspec-mode-map (@map :map rspec-mode-map
(:localleader :localleader
:n "tr" 'rspec-rerun :n "tr" 'rspec-rerun
:n "ta" 'rspec-verify-all :n "ta" 'rspec-verify-all
:n "ts" 'rspec-verify-single :n "ts" 'rspec-verify-single
:n "tv" 'rspec-verify))) :n "tv" 'rspec-verify))
(use-package inf-ruby
(@def-package inf-ruby
:commands (inf-ruby inf-ruby-console-auto) :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 ;; TODO Frameworks
(def-project-type! rake "rake" ;;
:files ("Rakefile"))
;; (@def-project rake "rake"
;; :files ("Rakefile"))
(provide 'module-ruby)
;;; module-ruby.el ends here

View file

@ -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))

View file

@ -1,25 +1,31 @@
;;; module-rust.el ;;; module-rust.el
(use-package rust-mode (@def-package rust-mode
:mode "\\.rs$" :mode "\\.rs$"
:init (add-hook 'rust-mode-hook 'flycheck-mode) :init
(add-hook 'rust-mode-hook 'flycheck-mode)
:config :config
(def-builder! rust-mode "cargo run" "Cargo.toml") (@set :build 'cargo-run '(rust-mode toml-mode)
(def-builder! toml-mode "cargo run" "Cargo.toml")) '+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-cmd (concat doom-cache-dir "racer"))
(defvar racer-rust-src-path (concat doom-ext-dir "/rust/src/")) (defvar racer-rust-src-path (concat doom-cache-dir "rust/src/"))
(use-package racer (@def-package racer
:after rust-mode :after rust-mode
:when (f-exists? racer-cmd) :when (file-exists-p racer-cmd)
:init (add-hook! rust-mode '(racer-mode eldoc-mode flycheck-rust-setup)) :init
(@add-hook rust-mode '(racer-mode eldoc-mode flycheck-rust-setup))
:config :config
;; TODO Unit test keybinds ;; TODO Unit test keybinds
(def-company-backend! rust-mode (racer)) (@set :company-backend 'rust-mode '(company-racer))
(map! :map rust-mode-map :m "gd" 'racer-find-definition)) (@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

View file

@ -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))

25
modules/lang/rust/setup.sh Executable file
View file

@ -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

View file

@ -1,16 +1,18 @@
;;; module-scala.el ;;; lang/scala/config.el
(use-package scala-mode (@def-package scala-mode
:mode "\\.s\\(cala\\|bt\\)$" :mode "\\.s\\(cala\\|bt\\)$"
:init (add-hook 'scala-mode-hook 'eldoc-mode) :init
:config (def-company-backend! scala-mode '(ensime-company (company-yasnippet)))) (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) :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

View file

@ -0,0 +1,6 @@
;; -*- no-byte-compile: t; -*-
;;; lang/scala/packages.el
(@package ensime)
(@package sbt-mode)
(@package scala-mode)

View file

@ -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)))))

View file

@ -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"))

View file

@ -1,24 +1,26 @@
;;; module-sh.el ;;; lang/sh/config.el
(use-package sh-script (@def-package sh-script ; built-in
:mode (("\\.\\(ba\\|z\\)sh$" . sh-mode) :mode (("\\.zsh$" . sh-mode)
("/\\.?z\\(sh\\(/.*\\|$\\)\\|profile\\|log\\(in\\|out\\)\\|sh\\(rc\\|env\\)\\)$" . sh-mode)
("/\\.?bash\\(/.*\\|rc\\|_profile\\)$" . sh-mode)
("/\\.?xinitrc$" . sh-mode)
("/bspwmrc$" . 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 :config
(def-company-backend! sh-mode (shell)) (@set :company-backend 'sh-mode '(company-shell))
(def-electric! sh-mode :words ("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (@set :electric 'sh-mode :words "else" "elif" "fi" "done" "then" "do" "esac" ";;")
(def-repl! sh-mode doom/inf-shell) (@set :repl 'sh-mode '+sh/repl)
(setq sh-indent-after-continuation 'always) (setq sh-indent-after-continuation 'always)
;; [pedantry intensifies] ;; [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 :after sh-script
:config (setq company-shell-delete-duplicates t)) :config (setq company-shell-delete-duplicates t))
(provide 'module-sh)
;;; module-sh.el ends here

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/sh/packages.el
(when (@featurep :completion company)
(@package company-shell))

12
modules/lang/sh/setup.sh Executable file
View file

@ -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

View file

@ -1,17 +1,18 @@
;;; module-swift.el ;;; lang/swift/config.el
;; TODO Set up emacs task runners for fruitstrap ;; TODO Set up emacs task runners for fruitstrap
(use-package swift-mode
(@def-package swift-mode
:mode "\\.swift$" :mode "\\.swift$"
:init (add-hook 'swift-mode-hook 'flycheck-mode) :init
(add-hook 'swift-mode-hook 'flycheck-mode)
:config :config
(def-company-backend! swift-mode (sourcekit yasnippet)) (@set :repl 'swift-mode 'swift-mode-run-repl) ; TODO test this
(def-docset! swift-mode "swift") (@after flycheck (push 'swift flycheck-checkers)))
(def-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) (@def-package company-sourcekit
;;; module-swift.el ends here :after swift-mode
:config
(@set :company-backend 'swift-mode '(company-sourcekit company-yasnippet)))

View file

@ -0,0 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; lang/swift/packages.el
(@package swift-mode)
(when (@featurep :completion company)
(@package company-sourcekit))

View file

@ -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)))

View file

@ -0,0 +1,6 @@
;; -*- no-byte-compile: t; -*-
;;; lang/typescript/packages.el
(@package tide)
(@package typescript-mode)

47
modules/lang/web/+css.el Normal file
View file

@ -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)))

63
modules/lang/web/+html.el Normal file
View file

@ -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))

View file

@ -0,0 +1,7 @@
;;; lang/web/+css.el
;;;###autoload
(defun +css/scss-build ()) ; TODO
;;;###autoload
(defun +css/sass-build ()) ; TODO

View file

@ -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 "<r><a>")
(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 "<r><a>")
(cond (input
(insert (+html-decode-entities input)))
((and beg end)
(+html/decode-entities-region beg end))))

View file

@ -0,0 +1,59 @@
;;; lang/web/autoload/html.el
;;;###autoload
(defvar +web-entities-list
[["&nbsp;" " "] ["&ensp;" ""] ["&emsp;" ""] ["&thinsp;" ""]
["&rlm;" ""] ["&lrm;" ""] ["&zwj;" ""] ["&zwnj;" ""]
["&iexcl;" "¡"] ["&cent;" "¢"] ["&pound;" "£"] ["&curren;" "¤"] ["&yen;" "¥"] ["&brvbar;" "¦"] ["&sect;" "§"] ["&uml;" "¨"] ["&copy;" "©"] ["&ordf;" "ª"] ["&laquo;" "«"] ["&not;" "¬"] ["&shy;" "­"] ["&reg;" "®"] ["&macr;" "¯"] ["&deg;" "°"] ["&plusmn;" "±"] ["&sup2;" "²"] ["&sup3;" "³"] ["&acute;" "´"] ["&micro;" "µ"] ["&para;" ""] ["&middot;" "·"] ["&cedil;" "¸"] ["&sup1;" "¹"] ["&ordm;" "º"] ["&raquo;" "»"] ["&frac14;" "¼"] ["&frac12;" "½"] ["&frac34;" "¾"] ["&iquest;" "¿"]
["&Agrave;" "À"] ["&Aacute;" "Á"] ["&Acirc;" "Â"] ["&Atilde;" "Ã"] ["&Auml;" "Ä"] ["&Aring;" "Å"] ["&AElig;" "Æ"] ["&Ccedil;" "Ç"] ["&Egrave;" "È"] ["&Eacute;" "É"] ["&Ecirc;" "Ê"] ["&Euml;" "Ë"] ["&Igrave;" "Ì"] ["&Iacute;" "Í"] ["&Icirc;" "Î"] ["&Iuml;" "Ï"] ["&ETH;" "Ð"] ["&Ntilde;" "Ñ"] ["&Ograve;" "Ò"] ["&Oacute;" "Ó"] ["&Ocirc;" "Ô"] ["&Otilde;" "Õ"] ["&Ouml;" "Ö"] ["&times;" "×"] ["&Oslash;" "Ø"] ["&Ugrave;" "Ù"] ["&Uacute;" "Ú"] ["&Ucirc;" "Û"] ["&Uuml;" "Ü"] ["&Yacute;" "Ý"] ["&THORN;" "Þ"] ["&szlig;" "ß"] ["&agrave;" "à"] ["&aacute;" "á"] ["&acirc;" "â"] ["&atilde;" "ã"] ["&auml;" "ä"] ["&aring;" "å"] ["&aelig;" "æ"] ["&ccedil;" "ç"] ["&egrave;" "è"] ["&eacute;" "é"] ["&ecirc;" "ê"] ["&euml;" "ë"] ["&igrave;" "ì"] ["&iacute;" "í"] ["&icirc;" "î"] ["&iuml;" "ï"] ["&eth;" "ð"] ["&ntilde;" "ñ"] ["&ograve;" "ò"] ["&oacute;" "ó"] ["&ocirc;" "ô"] ["&otilde;" "õ"] ["&ouml;" "ö"]
["&divide;" "÷"] ["&oslash;" "ø"] ["&ugrave;" "ù"] ["&uacute;" "ú"] ["&ucirc;" "û"] ["&uuml;" "ü"] ["&yacute;" "ý"] ["&thorn;" "þ"] ["&yuml;" "ÿ"] ["&fnof;" "ƒ"]
["&Alpha;" "Α"] ["&Beta;" "Β"] ["&Gamma;" "Γ"] ["&Delta;" "Δ"] ["&Epsilon;" "Ε"] ["&Zeta;" "Ζ"] ["&Eta;" "Η"] ["&Theta;" "Θ"] ["&Iota;" "Ι"] ["&Kappa;" "Κ"] ["&Lambda;" "Λ"] ["&Mu;" "Μ"] ["&Nu;" "Ν"] ["&Xi;" "Ξ"] ["&Omicron;" "Ο"] ["&Pi;" "Π"] ["&Rho;" "Ρ"] ["&Sigma;" "Σ"] ["&Tau;" "Τ"] ["&Upsilon;" "Υ"] ["&Phi;" "Φ"] ["&Chi;" "Χ"] ["&Psi;" "Ψ"] ["&Omega;" "Ω"] ["&alpha;" "α"] ["&beta;" "β"] ["&gamma;" "γ"] ["&delta;" "δ"] ["&epsilon;" "ε"] ["&zeta;" "ζ"] ["&eta;" "η"] ["&theta;" "θ"] ["&iota;" "ι"] ["&kappa;" "κ"] ["&lambda;" "λ"] ["&mu;" "μ"] ["&nu;" "ν"] ["&xi;" "ξ"] ["&omicron;" "ο"] ["&pi;" "π"] ["&rho;" "ρ"] ["&sigmaf;" "ς"] ["&sigma;" "σ"] ["&tau;" "τ"] ["&upsilon;" "υ"] ["&phi;" "φ"] ["&chi;" "χ"] ["&psi;" "ψ"] ["&omega;" "ω"] ["&thetasym;" "ϑ"] ["&upsih;" "ϒ"] ["&piv;" "ϖ"]
["&bull;" ""] ["&hellip;" ""] ["&prime;" ""] ["&Prime;" ""] ["&oline;" ""] ["&frasl;" ""] ["&weierp;" ""] ["&image;" ""] ["&real;" ""] ["&trade;" ""] ["&alefsym;" ""] ["&larr;" ""] ["&uarr;" ""] ["&rarr;" ""] ["&darr;" ""] ["&harr;" ""] ["&crarr;" ""] ["&lArr;" ""] ["&uArr;" ""] ["&rArr;" ""] ["&dArr;" ""] ["&hArr;" ""] ["&forall;" ""] ["&part;" ""] ["&exist;" ""] ["&empty;" ""] ["&nabla;" ""] ["&isin;" ""] ["&notin;" ""] ["&ni;" ""] ["&prod;" ""] ["&sum;" ""] ["&minus;" ""] ["&lowast;" ""] ["&radic;" ""] ["&prop;" ""] ["&infin;" ""] ["&ang;" ""] ["&and;" ""] ["&or;" ""] ["&cap;" ""] ["&cup;" ""] ["&int;" ""] ["&there4;" ""] ["&sim;" ""] ["&cong;" ""] ["&asymp;" ""] ["&ne;" ""] ["&equiv;" ""] ["&le;" ""] ["&ge;" ""] ["&sub;" ""] ["&sup;" ""] ["&nsub;" ""] ["&sube;" ""] ["&supe;" ""] ["&oplus;" ""] ["&otimes;" ""] ["&perp;" ""] ["&sdot;" ""] ["&lceil;" ""] ["&rceil;" ""] ["&lfloor;" ""] ["&rfloor;" ""] ["&lang;" ""] ["&rang;" ""] ["&loz;" ""] ["&spades;" ""] ["&clubs;" ""] ["&hearts;" ""] ["&diams;" ""] ["&quot;" "\""] ["&OElig;" "Œ"] ["&oelig;" "œ"] ["&Scaron;" "Š"] ["&scaron;" "š"] ["&Yuml;" "Ÿ"] ["&circ;" "ˆ"] ["&tilde;" "˜"] ["&ndash;" ""] ["&mdash;" ""] ["&lsquo;" ""] ["&rsquo;" ""] ["&sbquo;" ""] ["&ldquo;" ""] ["&rdquo;" ""] ["&bdquo;" ""] ["&dagger;" ""] ["&Dagger;" ""] ["&permil;" ""] ["&lsaquo;" ""] ["&rsaquo;" ""] ["&euro;" ""]]
"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 "<!><r>")
(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))

View file

@ -1,113 +1,50 @@
;;; module-web.el ;;; lang/web/config.el
(use-package haml-mode :mode "\\.haml$") (@load +html)
(@load +css)
(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))
;; ;;
;; Tools ;; TODO Frameworks
;; ;;
(use-package emmet-mode ;; (defvar bower-conf (make-hash-table :test 'equal))
:commands (emmet-mode) ;; (@def-project bower "bower"
:init ;; :modes (web-mode js-mode coffee-mode css-mode sass-mode pug-mode)
(add-hook! (scss-mode web-mode html-mode haml-mode nxml-mode) 'emmet-mode) ;; :files ("bower.json")
(defvar emmet-mode-keymap (make-sparse-keymap)) ;; :when
:config ;; (lambda (&rest _)
(setq emmet-move-cursor-between-quotes t) ;; (let* ((project-path (doom-project-root))
(map! :map emmet-mode-keymap ;; (hash (gethash project-path bower-conf))
:v "M-e" 'emmet-wrap-with-markup ;; (package-file (f-expand "bower.json" project-path))
:i "M-e" 'emmet-expand-yas ;; deps)
:i "M-E" 'emmet-expand-line)) ;; (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))))
;; ;; (@def-project jekyll ":{"
;; Project types ;; :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 wordpress "wp"
(def-project-type! bower "bower" ;; :modes (php-mode web-mode css-mode haml-mode pug-mode)
:modes (web-mode js-mode coffee-mode css-mode sass-mode pug-mode) ;; :match "/wp-\\(\\(content\\|admin\\|includes\\)/\\)?.+$"
:files ("bower.json") ;; :files ("wp-config.php" "wp-content/"))
: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

View file

@ -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)