spacemacs/layers/+lang/elixir/funcs.el
syl20bnr ac30247811 [lsp] When used, make LSP the default backend for all supported lang
* Added a new function to each language to select the backend
* Use these new functions in all `pcase`.
2019-09-30 00:49:44 -04:00

133 lines
4 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; funcs.el --- Elixir Layer functions File for Spacemacs
;;
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(defun spacemacs//elixir-backend ()
"Returns selected backend."
(if elixir-backend
elixir-backend
(cond
((configuration-layer/layer-used-p 'lsp) 'lsp)
(t 'alchemist))))
(defun spacemacs//elixir-setup-backend ()
"Conditionally setup elixir backend."
(pcase (spacemacs//elixir-backend)
(`alchemist (spacemacs//elixir-setup-alchemist))
(`lsp (spacemacs//elixir-setup-lsp))))
(defun spacemacs//elixir-setup-company ()
"Conditionally setup company based on backend."
(pcase (spacemacs//elixir-backend)
(`alchemist (spacemacs//elixir-setup-alchemist-company))
(`lsp (spacemacs//elixir-setup-lsp-company))))
(defun spacemacs//elixir-setup-dap ()
"Conditionally setup elixir DAP integration."
;; currently DAP is only available using LSP
(pcase (spacemacs//elixir-backend)
(`lsp (spacemacs//elixir-setup-lsp-dap))))
;;alchemist
(defun spacemacs//elixir-setup-alchemist ()
(alchemist-mode))
(defun spacemacs//elixir-setup-alchemist-company ()
(when (configuration-layer/package-used-p 'alchemist)
(progn
(spacemacs|add-company-backends
:backends alchemist-company
:modes elixir-mode alchemist-iex-mode)
(company-mode))))
;;lsp
(defun spacemacs//elixir-setup-lsp ()
"Setup lsp backend."
(if (configuration-layer/layer-used-p 'lsp)
(progn (add-to-list 'exec-path elixir-ls-path) (lsp))
(message "`lsp' layer is not installed, please add `lsp' layer to your dotfile.")))
(defun spacemacs//elixir-setup-lsp-company ()
"Setup lsp auto-completion."
(if (configuration-layer/layer-used-p 'lsp)
(progn
(spacemacs|add-company-backends
:backends company-lsp
:modes elixir-mode
:append-hooks nil
:call-hooks t)
(company-mode))
(message "`lsp' layer is not installed, please add `lsp' layer to your dotfile.")))
(defun spacemacs//elixir-setup-lsp-dap ()
"Setup DAP integration."
(require 'dap-elixir))
;; others
(defun spacemacs//elixir-default ()
"Default settings for elixir buffers"
;; highlight all breakpoints
(spacemacs/elixir-annotate-pry)
;; make C-j work the same way as RET
(local-set-key (kbd "C-j") 'newline-and-indent))
(defun spacemacs//elixir-looking-back-special-p (expr)
(save-excursion
(when (or (looking-back " ")
(looking-back "-")) (backward-char))
(looking-back expr)))
(defun spacemacs//elixir-point-after-fn-p (id action context)
(save-excursion
(when (looking-back id) (backward-char))
(looking-back "fn")))
(defun spacemacs//elixir-do-end-close-action (id action context)
(when (eq action 'insert)
(cond ((spacemacs//elixir-looking-back-special-p id)
(insert " ") (backward-char))
((looking-back "(")
(insert ") ") (backward-char) (backward-char))
(t
(newline-and-indent)
(forward-line -1)
(indent-according-to-mode)))))
(defun spacemacs//elixir-enable-compilation-checking ()
"Enable compile checking if `elixir-enable-compilation-checking' is non nil."
(when (or elixir-enable-compilation-checking)
(flycheck-mix-setup)
;; enable credo only if there are no compilation errors
(flycheck-add-next-checker 'elixir-mix '(warning . elixir-credo))))
(defun spacemacs/elixir-annotate-pry ()
"Highlight breakpoint lines."
(interactive)
(highlight-lines-matching-regexp "require IEx; IEx.pry"))
(defun spacemacs/elixir-toggle-breakpoint ()
"Add a breakpoint line or clear it if line is already a breakpoint."
(interactive)
(let ((trace "require IEx; IEx.pry")
(line (thing-at-point 'line)))
(if (and line (string-match trace line))
(kill-whole-line)
(progn
(back-to-indentation)
(insert trace)
(newline-and-indent)))))