diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..ba29cb1dad --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + commit-message: + prefix: "chore" + include: "scope" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6d51a7b20f..cfdb564301 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,29 +8,27 @@ on: jobs: build: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental }} strategy: - fail-fast: false matrix: - os: [ubuntu-latest] emacs_version: - - 25.1 - - 25.2 - - 25.3 - 26.1 - 26.2 - 26.3 - 27.1 - 27.2 - - snapshot + - 28.1 + - 29.1 + experimental: [false] include: - - os: macos-latest - emacs_version: 27.2 + - emacs_version: snapshot + experimental: true steps: - uses: purcell/setup-emacs@master with: version: ${{ matrix.emacs_version }} - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Check startup run: ./test-startup.sh diff --git a/.gitignore b/.gitignore index d03d13d586..2905347d18 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ CVS cookies /newsticker \#* +/tree-sitter /elpa /elpa-* site-lisp/package/ diff --git a/README.md b/README.md index a47ed06a7d..e0b7479802 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ in the approximate order of how much I use them, from most to least: * Erlang In particular, there's a nice config for *autocompletion* with -[company](https://company-mode.github.io/), and +[corfu](https://github.com/minad/corfu), and `flymake` (re-using backends from [flycheck](http://www.flycheck.org)) is used to immediately highlight syntax errors in Ruby, Python, Javascript, Haskell and a number of other languages. @@ -36,11 +36,12 @@ LSP support is provided using `eglot`. ## Supported Emacs versions -The config should run on Emacs 25.1 or greater and is designed to -degrade smoothly - see the CI build - but note that much newer -versions are required for an increasing number of key packages, so to -get full functionality you should use the latest Emacs version -available to you. +Use the latest released Emacs version available to you. The author +typically uses the latest stable version. + +The config should run on Emacs 26.1 or greater and is designed to +degrade smoothly - see the CI build - but even basic enhancements +like completion may be unavailable if your Emacs is too old. Some Windows users might need to follow [these instructions](http://xn--9dbdkw.se/diary/how_to_enable_GnuTLS_for_Emacs_24_on_Windows/index.en.html) diff --git a/init.el b/init.el index 003e1a1e11..e188779ebc 100644 --- a/init.el +++ b/init.el @@ -9,10 +9,10 @@ ;; Produce backtraces when errors occur: can be helpful to diagnose startup issues ;;(setq debug-on-error t) -(let ((minver "25.1")) +(let ((minver "26.1")) (when (version< emacs-version minver) (error "Your Emacs is too old -- this config requires v%s or higher" minver))) -(when (version< emacs-version "26.1") +(when (version< emacs-version "27.1") (message "Your Emacs is old, and some functionality in this config will be disabled. Please upgrade if possible.")) (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) @@ -66,7 +66,7 @@ (require 'init-recentf) (require 'init-minibuffer) (require 'init-hippie-expand) -(require 'init-company) +(require 'init-corfu) (require 'init-windows) (require 'init-sessions) (require 'init-mmm) @@ -128,14 +128,13 @@ (require 'init-folding) (require 'init-dash) -;;(require 'init-twitter) -;; (require 'init-mu) (require 'init-ledger) +(require 'init-lua) + ;; Extra packages which don't require any configuration (require-package 'sudo-edit) (require-package 'gnuplot) -(require-package 'lua-mode) (require-package 'htmlize) (when *is-a-mac* (require-package 'osx-location)) @@ -151,6 +150,11 @@ (require 'init-direnv) +(when (and (require 'treesit nil t) + (fboundp 'treesit-available-p) + (treesit-available-p)) + (require 'init-treesitter)) + ;; Allow access from emacsclient diff --git a/lisp/init-clojure.el b/lisp/init-clojure.el index 0961d9979e..8c5e6329c1 100644 --- a/lisp/init-clojure.el +++ b/lisp/init-clojure.el @@ -4,13 +4,14 @@ ;; See also init-clojure-cider.el -(when (maybe-require-package 'clojure-mode) +(when (or (maybe-require-package 'clojure-ts-mode) + (maybe-require-package 'clojure-mode)) (require-package 'cljsbuild-mode) (require-package 'elein) (with-eval-after-load 'clojure-mode - (add-hook 'clojure-mode-hook 'sanityinc/lisp-setup) - (add-hook 'clojure-mode-hook 'subword-mode))) + (dolist (m '(clojure-mode-hook clojure-ts-mode-hook)) + (add-hook m 'sanityinc/lisp-setup)))) (provide 'init-clojure) diff --git a/lisp/init-corfu.el b/lisp/init-corfu.el new file mode 100644 index 0000000000..3119df3469 --- /dev/null +++ b/lisp/init-corfu.el @@ -0,0 +1,39 @@ +;;; init-corfu.el --- Interactive completion in buffers -*- lexical-binding: t -*- +;;; Commentary: +;;; Code: + +;; WAITING: haskell-mode sets tags-table-list globally, breaks tags-completion-at-point-function +;; TODO Default sort order should place [a-z] before punctuation + +(setq tab-always-indent 'complete) +(when (maybe-require-package 'orderless) + (with-eval-after-load 'vertico + (require 'orderless) + (setq completion-styles '(orderless basic)))) +(setq completion-category-defaults nil + completion-category-overrides nil) +(setq completion-cycle-threshold 4) + +(when (maybe-require-package 'corfu) + (setq-default corfu-auto t) + (with-eval-after-load 'eshell + (add-hook 'eshell-mode-hook (lambda () (setq-local corfu-auto nil)))) + (setq-default corfu-quit-no-match 'separator) + (add-hook 'after-init-hook 'global-corfu-mode) + + + + (with-eval-after-load 'corfu + (corfu-popupinfo-mode)) + + ;; Make Corfu also work in terminals, without disturbing usual behaviour in GUI + (when (maybe-require-package 'corfu-terminal) + (with-eval-after-load 'corfu + (corfu-terminal-mode))) + + ;; TODO: https://github.com/jdtsmith/kind-icon + ) + + +(provide 'init-corfu) +;;; init-corfu.el ends here diff --git a/lisp/init-csv.el b/lisp/init-csv.el index 3dfd8e02b8..77af1359c4 100644 --- a/lisp/init-csv.el +++ b/lisp/init-csv.el @@ -2,11 +2,10 @@ ;;; Commentary: ;;; Code: -(require-package 'csv-mode) +(when (maybe-require-package 'csv-mode) + (add-auto-mode 'csv-mode "\\.[Cc][Ss][Vv]\\'") -(add-auto-mode 'csv-mode "\\.[Cc][Ss][Vv]\\'") - -(setq csv-separators '("," ";" "|" " ")) + (setq csv-separators '("," ";" "|" " "))) (provide 'init-csv) ;;; init-csv.el ends here diff --git a/lisp/init-editing-utils.el b/lisp/init-editing-utils.el index 55f13c45e7..bf4b51a974 100644 --- a/lisp/init-editing-utils.el +++ b/lisp/init-editing-utils.el @@ -64,18 +64,10 @@ (require-package 'mode-line-bell) (add-hook 'after-init-hook 'mode-line-bell-mode) - - -(when (maybe-require-package 'beacon) - (setq-default beacon-lighter "") - (setq-default beacon-size 20) - (add-hook 'after-init-hook 'beacon-mode)) - -;;; Newline behaviour +;;; Newline behaviour (see also electric-indent-mode, enabled above) -(global-set-key (kbd "RET") 'newline-and-indent) (defun sanityinc/newline-at-end-of-line () "Move to end of line, enter a newline, and reindent." (interactive) @@ -153,6 +145,9 @@ ;;; Handy key bindings +(with-eval-after-load 'help + (define-key help-map "A" 'describe-face)) + (global-set-key (kbd "C-.") 'set-mark-command) (global-set-key (kbd "C-x C-.") 'pop-global-mark) diff --git a/lisp/init-flymake.el b/lisp/init-flymake.el index 22078f2ef6..1b964947a8 100644 --- a/lisp/init-flymake.el +++ b/lisp/init-flymake.el @@ -8,14 +8,15 @@ (when (maybe-require-package 'flymake-flycheck) ;; Disable flycheck checkers for which we have flymake equivalents (with-eval-after-load 'flycheck - (setq-default flycheck-disabled-checkers - (append (default-value 'flycheck-disabled-checkers) - '(emacs-lisp emacs-lisp-checkdoc emacs-lisp-package)))) + (setq-default + flycheck-disabled-checkers + (append (default-value 'flycheck-disabled-checkers) + '(emacs-lisp emacs-lisp-checkdoc emacs-lisp-package sh-shellcheck)))) (defun sanityinc/enable-flymake-flycheck () (setq-local flymake-diagnostic-functions - (append flymake-diagnostic-functions - (flymake-flycheck-all-chained-diagnostic-functions)))) + (seq-uniq (append flymake-diagnostic-functions + (flymake-flycheck-all-chained-diagnostic-functions))))) (add-hook 'flymake-mode-hook 'sanityinc/enable-flymake-flycheck) (add-hook 'prog-mode-hook 'flymake-mode) @@ -23,12 +24,17 @@ (with-eval-after-load 'flymake ;; Provide some flycheck-like bindings in flymake mode to ease transition + (define-key flymake-mode-map (kbd "C-c ! l") 'flymake-show-buffer-diagnostics) (define-key flymake-mode-map (kbd "C-c ! n") 'flymake-goto-next-error) (define-key flymake-mode-map (kbd "C-c ! p") 'flymake-goto-prev-error) (define-key flymake-mode-map (kbd "C-c ! c") 'flymake-start)) (unless (version< emacs-version "28.1") - (setq eldoc-documentation-function 'eldoc-documentation-compose)) + (setq eldoc-documentation-function 'eldoc-documentation-compose) + + (add-hook 'flymake-mode-hook + (lambda () + (add-hook 'eldoc-documentation-functions 'flymake-eldoc-function nil t)))) (provide 'init-flymake) ;;; init-flymake.el ends here diff --git a/lisp/init-git.el b/lisp/init-git.el index d3d57dec1e..fac54186e9 100644 --- a/lisp/init-git.el +++ b/lisp/init-git.el @@ -15,7 +15,7 @@ (require-package 'git-link) (when (maybe-require-package 'magit) - (setq-default magit-diff-refine-hunk t) + (setq-default magit-diff-refine-hunk 'all) ;; Hint: customize `magit-repository-directories' so that you can use C-u M-F12 to ;; quickly open magit on any one of your projects. diff --git a/lisp/init-github.el b/lisp/init-github.el index f5b8b4707f..e82e2b5c1d 100644 --- a/lisp/init-github.el +++ b/lisp/init-github.el @@ -12,5 +12,8 @@ (maybe-require-package 'forge) (maybe-require-package 'github-review) +(when (maybe-require-package 'flymake-actionlint) + (add-hook 'yaml-mode-hook 'flymake-actionlint-action-load-when-actions-file)) + (provide 'init-github) ;;; init-github.el ends here diff --git a/lisp/init-gui-frames.el b/lisp/init-gui-frames.el index 2e49da8a4d..5fb5f937ea 100644 --- a/lisp/init-gui-frames.el +++ b/lisp/init-gui-frames.el @@ -88,6 +88,10 @@ (require-package 'disable-mouse) + +(when (fboundp 'pixel-scroll-precision-mode) + (pixel-scroll-precision-mode)) + (provide 'init-gui-frames) ;;; init-gui-frames.el ends here diff --git a/lisp/init-javascript.el b/lisp/init-javascript.el index 3ab2fbf260..952dc5b207 100644 --- a/lisp/init-javascript.el +++ b/lisp/init-javascript.el @@ -48,19 +48,21 @@ (sanityinc/major-mode-lighter 'js2-jsx-mode "JSX2")) - +(require 'derived) (when (and (or (executable-find "rg") (executable-find "ag")) (maybe-require-package 'xref-js2)) (when (executable-find "rg") (setq-default xref-js2-search-program 'rg)) + (defun sanityinc/enable-xref-js2 () (add-hook 'xref-backend-functions #'xref-js2-xref-backend nil t)) - (with-eval-after-load 'js - (define-key js-mode-map (kbd "M-.") nil) - (add-hook 'js-mode-hook 'sanityinc/enable-xref-js2)) + + (let ((base-mode (if (fboundp 'js-base-mode) 'js-base-mode 'js-mode))) + (with-eval-after-load 'js + (add-hook (derived-mode-hook-name base-mode) 'sanityinc/enable-xref-js2) + (define-key js-mode-map (kbd "M-.") nil))) (with-eval-after-load 'js2-mode - (define-key js2-mode-map (kbd "M-.") nil) - (add-hook 'js2-mode-hook 'sanityinc/enable-xref-js2))) + (define-key js2-mode-map (kbd "M-.") nil))) diff --git a/lisp/init-ledger.el b/lisp/init-ledger.el index 44727531d7..80a0163ab6 100644 --- a/lisp/init-ledger.el +++ b/lisp/init-ledger.el @@ -13,7 +13,8 @@ (define-key ledger-mode-map (kbd "C-o") 'open-line)) (setq ledger-highlight-xact-under-point nil - ledger-use-iso-dates nil) + ledger-use-iso-dates nil + ledger-mode-should-check-version nil) (with-eval-after-load 'ledger-mode (when (memq window-system '(mac ns)) diff --git a/lisp/init-lisp.el b/lisp/init-lisp.el index b974f206f5..73b8f57593 100644 --- a/lisp/init-lisp.el +++ b/lisp/init-lisp.el @@ -47,7 +47,7 @@ (add-hook 'after-init-hook 'ipretty-mode)) -(defun sanityinc/make-read-only (expression out-buffer-name) +(defun sanityinc/make-read-only (_expression out-buffer-name &rest _) "Enable `view-mode' in the output buffer - if any - so it can be closed with `\"q\"." (when (get-buffer out-buffer-name) (with-current-buffer out-buffer-name @@ -178,26 +178,10 @@ there is no current file, eval the current buffer." "Enable features useful in any Lisp mode." (run-hooks 'sanityinc/lispy-modes-hook)) -(defun sanityinc/emacs-lisp-setup () - "Enable features useful when working with elisp." - (set-up-hippie-expand-for-elisp)) - -(defconst sanityinc/elispy-modes - '(emacs-lisp-mode ielm-mode) - "Major modes relating to elisp.") - -(defconst sanityinc/lispy-modes - (append sanityinc/elispy-modes - '(lisp-mode inferior-lisp-mode lisp-interaction-mode)) - "All lispy major modes.") - (require 'derived) -(dolist (hook (mapcar #'derived-mode-hook-name sanityinc/lispy-modes)) - (add-hook hook 'sanityinc/lisp-setup)) - -(dolist (hook (mapcar #'derived-mode-hook-name sanityinc/elispy-modes)) - (add-hook hook 'sanityinc/emacs-lisp-setup)) +(dolist (mode '(emacs-lisp-mode ielm-mode lisp-mode inferior-lisp-mode lisp-interaction-mode)) + (add-hook (derived-mode-hook-name mode) 'sanityinc/lisp-setup)) (when (boundp 'eval-expression-minibuffer-setup-hook) (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)) diff --git a/lisp/init-lua.el b/lisp/init-lua.el new file mode 100644 index 0000000000..60b7f7492d --- /dev/null +++ b/lisp/init-lua.el @@ -0,0 +1,16 @@ +;;; init-lua.el --- Support for Lua programming -*- lexical-binding: t -*- +;;; Commentary: +;;; Code: + +(require-package 'lua-mode) + +(setq-default lua-indent-level 2) + +(reformatter-define lua-format + :program "lua-format" + :args '("--indent-width=2" "--no-use-tab") + :lighter "LuaFmt ") + + +(provide 'init-lua) +;;; init-lua.el ends here diff --git a/lisp/init-minibuffer.el b/lisp/init-minibuffer.el index a6f0cf3201..34039b9b27 100644 --- a/lisp/init-minibuffer.el +++ b/lisp/init-minibuffer.el @@ -6,14 +6,6 @@ (when (maybe-require-package 'vertico) (add-hook 'after-init-hook 'vertico-mode) - (require-package 'orderless) - (with-eval-after-load 'vertico - (require 'orderless)) - - (defun sanityinc/use-orderless-in-minibuffer () - (setq-local completion-styles '(substring orderless))) - (add-hook 'minibuffer-setup-hook 'sanityinc/use-orderless-in-minibuffer) - (when (maybe-require-package 'embark) (with-eval-after-load 'vertico (define-key vertico-map (kbd "C-c C-o") 'embark-export) @@ -22,7 +14,7 @@ (when (maybe-require-package 'consult) (defmacro sanityinc/no-consult-preview (&rest cmds) `(with-eval-after-load 'consult - (consult-customize ,@cmds :preview-key (kbd "M-P")))) + (consult-customize ,@cmds :preview-key "M-P"))) (sanityinc/no-consult-preview consult-ripgrep @@ -30,17 +22,13 @@ consult-bookmark consult-recent-file consult-xref consult--source-recent-file consult--source-project-recent-file consult--source-bookmark) - (when (maybe-require-package 'projectile) - (setq-default consult-project-root-function 'projectile-project-root)) - - (when (and (executable-find "rg") (maybe-require-package 'affe)) - (defun sanityinc/affe-grep-at-point (&optional dir initial) + (when (and (executable-find "rg")) + (defun sanityinc/consult-ripgrep-at-point (&optional dir initial) (interactive (list prefix-arg (when-let ((s (symbol-at-point))) (symbol-name s)))) - (affe-grep dir initial)) - (global-set-key (kbd "M-?") 'sanityinc/affe-grep-at-point) - (sanityinc/no-consult-preview sanityinc/affe-grep-at-point) - (with-eval-after-load 'affe (sanityinc/no-consult-preview affe-grep))) + (consult-ripgrep dir initial)) + (sanityinc/no-consult-preview sanityinc/consult-ripgrep-at-point) + (global-set-key (kbd "M-?") 'sanityinc/consult-ripgrep-at-point)) (global-set-key [remap switch-to-buffer] 'consult-buffer) (global-set-key [remap switch-to-buffer-other-window] 'consult-buffer-other-window) diff --git a/lisp/init-nix.el b/lisp/init-nix.el index 47d886b9ee..6f8d235def 100644 --- a/lisp/init-nix.el +++ b/lisp/init-nix.el @@ -2,25 +2,12 @@ ;;; Commentary: ;;; Code: -(when (maybe-require-package 'nix-mode) +(when (or (maybe-require-package 'nix-ts-mode) + (maybe-require-package 'nix-mode)) (maybe-require-package 'nixpkgs-fmt) - (maybe-require-package 'nix-sandbox) - (maybe-require-package 'nix-buffer) - - (when (maybe-require-package 'nixos-options) - (when (maybe-require-package 'company-nixos-options) - (with-eval-after-load 'company - (with-eval-after-load 'nix-mode - ;; Patch pending https://github.com/travisbhartwell/nix-emacs/pull/46 - (with-eval-after-load 'company-nixos-options - (defun company-nixos--in-nix-context-p () - (unless (executable-find "nix-build") - (or (derived-mode-p 'nix-mode 'nix-repl-mode) - (let ((file-name (buffer-file-name (current-buffer)))) - (and file-name (equal "nix" (file-name-extension file-name)))))))) - - (add-to-list 'company-backends 'company-nixos-options)))))) + (with-eval-after-load 'eglot + (add-to-list 'eglot-server-programs '((nix-mode nix-ts-mode) . ("nil"))))) (provide 'init-nix) ;;; init-nix.el ends here diff --git a/lisp/init-ocaml.el b/lisp/init-ocaml.el index 209b180075..c3bf20b999 100644 --- a/lisp/init-ocaml.el +++ b/lisp/init-ocaml.el @@ -2,10 +2,6 @@ ;;; Commentary: ;;; Code: -(with-eval-after-load 'eglot - (put 'tuareg-mode 'eglot-language-id "ocaml") - (add-to-list 'eglot-server-programs '((tuareg-mode) . ("ocamllsp")) t)) - (when (maybe-require-package 'tuareg) (with-eval-after-load 'tuareg (defvar-local tuareg-previous-tuareg-buffer nil diff --git a/lisp/init-org.el b/lisp/init-org.el index ef409d3a2d..b651b7cb2e 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -363,7 +363,7 @@ typical word processor." 'org-babel-load-languages (seq-filter (lambda (pair) - (featurep (intern (concat "ob-" (symbol-name (car pair)))))) + (locate-library (concat "ob-" (symbol-name (car pair))))) '((R . t) (ditaa . t) (dot . t) diff --git a/lisp/init-paredit.el b/lisp/init-paredit.el index bd976e2c8e..60572be2d1 100644 --- a/lisp/init-paredit.el +++ b/lisp/init-paredit.el @@ -4,8 +4,9 @@ (require-package 'paredit) + (defun sanityinc/maybe-map-paredit-newline () - (unless (or (memq major-mode '(inferior-emacs-lisp-mode cider-repl-mode)) + (unless (or (derived-mode-p 'inferior-emacs-lisp-mode 'cider-repl-mode) (minibufferp)) (local-set-key (kbd "RET") 'paredit-newline))) @@ -15,8 +16,9 @@ (diminish 'paredit-mode " Par") ;; Suppress certain paredit keybindings to avoid clashes, including ;; my global binding of M-? - (dolist (binding '("C-" "C-" "C-M-" "C-M-" "M-s" "M-?")) - (define-key paredit-mode-map (read-kbd-macro binding) nil))) + (dolist (binding '("RET" "C-" "C-" "C-M-" "C-M-" "M-s" "M-?")) + (define-key paredit-mode-map (read-kbd-macro binding) nil)) + (define-key paredit-mode-map (kbd "M-") 'paredit-splice-sexp-killing-backward)) @@ -34,9 +36,10 @@ (defun sanityinc/conditionally-enable-paredit-mode () "Enable paredit during lisp-related minibuffer commands." - (if (memq this-command paredit-minibuffer-commands) - (enable-paredit-mode))) + (when (memq this-command paredit-minibuffer-commands) + (enable-paredit-mode))) +(add-hook 'sanityinc/lispy-modes-hook 'enable-paredit-mode) (provide 'init-paredit) ;;; init-paredit.el ends here diff --git a/lisp/init-php.el b/lisp/init-php.el index e45dfd62a8..e0aceef697 100644 --- a/lisp/init-php.el +++ b/lisp/init-php.el @@ -3,11 +3,7 @@ ;;; Code: (when (maybe-require-package 'php-mode) - (maybe-require-package 'smarty-mode) - - (when (maybe-require-package 'company-php) - (with-eval-after-load 'company - (add-to-list 'company-backends 'company-ac-php-backend)))) + (maybe-require-package 'smarty-mode)) (provide 'init-php) ;;; init-php.el ends here diff --git a/lisp/init-projectile.el b/lisp/init-projectile.el index df6928f1b0..61c8a9d6fe 100644 --- a/lisp/init-projectile.el +++ b/lisp/init-projectile.el @@ -9,7 +9,7 @@ (setq-default projectile-mode-line-prefix " Proj") (when (executable-find "rg") - (setq-default projectile-generic-command "rg --files --hidden")) + (setq-default projectile-generic-command "rg --files --hidden -0")) (with-eval-after-load 'projectile (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)) diff --git a/lisp/init-ruby.el b/lisp/init-ruby.el index d6dd10095b..0c2e80ea8a 100644 --- a/lisp/init-ruby.el +++ b/lisp/init-ruby.el @@ -57,10 +57,7 @@ ;;; Robe (when (maybe-require-package 'robe) (with-eval-after-load 'ruby-mode - (add-hook 'ruby-mode-hook 'robe-mode)) - (with-eval-after-load 'robe - (with-eval-after-load 'company - (add-to-list 'company-backends 'company-robe)))) + (add-hook 'ruby-mode-hook 'robe-mode))) diff --git a/lisp/init-slime.el b/lisp/init-slime.el index 6e0e3d46cf..e7183c3a20 100644 --- a/lisp/init-slime.el +++ b/lisp/init-slime.el @@ -2,14 +2,6 @@ ;;; Commentary: ;;; Code: -(require-package 'slime) -(push (expand-file-name "contrib" (file-name-directory (locate-library "slime"))) load-path) - -(when (maybe-require-package 'slime-company) - (setq slime-company-completion 'fuzzy - slime-company-after-completion 'slime-company-just-one-space) - (with-eval-after-load 'slime-company - (add-to-list 'company-backends 'company-slime))) ;;; Lisp buffers @@ -17,10 +9,8 @@ (with-eval-after-load 'slime (setq slime-protocol-version 'ignore) (setq slime-net-coding-system 'utf-8-unix) - (let ((features '(slime-fancy slime-repl slime-fuzzy))) - (when (require 'slime-company nil t) - (push 'slime-company features)) - (slime-setup features)) ) + (let ((features '(slime-fancy slime-repl slime-fuzzy slime-autodoc))) + (slime-setup features))) ;;; REPL diff --git a/lisp/init-sql.el b/lisp/init-sql.el index 891ee4534d..ada34f5c99 100644 --- a/lisp/init-sql.el +++ b/lisp/init-sql.el @@ -110,13 +110,6 @@ This command currently blocks the UI, sorry." (display-buffer (current-buffer)) (user-error "EXPLAIN failed"))))))))) - -;; Submitted upstream as https://github.com/stanaka/dash-at-point/pull/28 -(with-eval-after-load 'sql - (with-eval-after-load 'dash-at-point - (add-to-list 'dash-at-point-mode-alist '(sql-mode . "psql,mysql,sqlite,postgis")))) - - (with-eval-after-load 'page-break-lines (add-to-list 'page-break-lines-modes 'sql-mode)) diff --git a/lisp/init-terraform.el b/lisp/init-terraform.el index f24782ce59..edd2efb021 100644 --- a/lisp/init-terraform.el +++ b/lisp/init-terraform.el @@ -5,15 +5,13 @@ ;;; Terraform (when (maybe-require-package 'terraform-mode) - (when (maybe-require-package 'company-terraform) - (with-eval-after-load 'terraform-mode - (company-terraform-init) - - ;; I find formatters based on "reformatter" to be more reliable - ;; so I redefine `terraform-format-on-save-mode' here. - (when (maybe-require-package 'reformatter) - (reformatter-define terraform-format - :program "terraform" :args '("fmt" "-")))))) + ;; TODO: find/write a replacement for company-terraform + (with-eval-after-load 'terraform-mode + ;; I find formatters based on "reformatter" to be more reliable + ;; so I redefine `terraform-format-on-save-mode' here. + (when (maybe-require-package 'reformatter) + (reformatter-define terraform-format + :program "terraform" :args '("fmt" "-"))))) (provide 'init-terraform) ;;; init-terraform.el ends here diff --git a/lisp/init-treesitter.el b/lisp/init-treesitter.el new file mode 100644 index 0000000000..7e168fbc8d --- /dev/null +++ b/lisp/init-treesitter.el @@ -0,0 +1,69 @@ +;;; init-treesitter.el --- Enable Treesitter-based major modes -*- lexical-binding: t -*- +;;; Commentary: +;;; Code: + +;; You can download per-architecture pre-compiled release from +;; https://github.com/emacs-tree-sitter/tree-sitter-langs Rename +;; contained grammars to add prefix "libtree-sitter-", place in +;; ~/.emacs.d/tree-sitter. +;; +;; Nix users can pre-install all grammars alongside their Emacs, see +;; https://github.com/nix-community/emacs-overlay/issues/341 +;; +;; Note that grammar files from different sources can be differently +;; named and configured, so there could be different results. Some +;; common remappings are included below. +(setq treesit-load-name-override-list nil + major-mode-remap-alist nil) + +(defun sanityinc/auto-configure-treesitter () + "Find and configure installed grammars, remap to matching -ts-modes if present. +Return a list of languages seen along the way." + (let ((grammar-name-to-emacs-lang '(("c-sharp" . "csharp") + ("cpp" . "c++") + ("gomod" . "go-mod") + ("javascript" . "js"))) + seen-grammars) + (dolist (dir (cons (expand-file-name "tree-sitter" user-emacs-directory) + treesit-extra-load-path)) + (when (file-directory-p dir) + (dolist (file (directory-files dir)) + (let ((fname (file-name-sans-extension (file-name-nondirectory file)))) + (when (string-match "libtree-sitter-\\(.*\\)" fname) + (let* ((file-lang (match-string 1 fname)) + (emacs-lang (or (cdr (assoc-string file-lang grammar-name-to-emacs-lang)) file-lang))) + ;; Override library if its filename doesn't match the Emacs name + (unless (or (memq (intern emacs-lang) seen-grammars) + (string-equal file-lang emacs-lang)) + (let ((libname (concat "tree_sitter_" (replace-regexp-in-string "-" "_" file-lang)))) + (add-to-list 'treesit-load-name-override-list + (list (intern emacs-lang) fname libname)))) + ;; If there's a corresponding -ts mode, remap the standard mode to it + (let ((ts-mode-name (intern (concat emacs-lang "-ts-mode"))) + (regular-mode-name (intern (concat emacs-lang "-mode")))) + (when (fboundp ts-mode-name) + (add-to-list 'major-mode-remap-alist + (cons regular-mode-name ts-mode-name)))) + ;; Remember we saw this language so we don't squash its config when we + ;; find another lib later in the treesit load path + (push (intern emacs-lang) seen-grammars))))))) + seen-grammars)) + +(sanityinc/auto-configure-treesitter) + +;; When there's js-ts-mode, we prefer it to js2-mode +(when-let ((jsmap (alist-get 'js-mode major-mode-remap-alist))) + (add-to-list 'major-mode-remap-alist (cons 'js2-mode jsmap))) + +(when-let ((jsmap (alist-get 'clojure-mode major-mode-remap-alist))) + (add-to-list 'major-mode-remap-alist (cons 'clojurescript-mode 'clojurescript-ts-mode))) + + + +;; Default +(setq treesit-font-lock-level 4) + + + +(provide 'init-treesitter) +;;; init-treesitter.el ends here diff --git a/lisp/init-utils.el b/lisp/init-utils.el index cff9fab9c1..6b3f2f4307 100644 --- a/lisp/init-utils.el +++ b/lisp/init-utils.el @@ -51,18 +51,20 @@ ;; Rename the current file -(defun rename-this-file-and-buffer (new-name) - "Renames both current buffer and file it's visiting to NEW-NAME." - (interactive "sNew name: ") - (let ((name (buffer-name)) - (filename (buffer-file-name))) - (unless filename - (error "Buffer '%s' is not visiting a file!" name)) - (progn - (when (file-exists-p filename) - (rename-file filename new-name 1)) - (set-visited-file-name new-name) - (rename-buffer new-name)))) +(if (fboundp 'rename-visited-file) + (defalias 'rename-this-file-and-buffer 'rename-visited-file) + (defun rename-this-file-and-buffer (new-name) + "Renames both current buffer and file it's visiting to NEW-NAME." + (interactive "sNew name: ") + (let ((name (buffer-name)) + (filename (buffer-file-name))) + (unless filename + (error "Buffer '%s' is not visiting a file!" name)) + (progn + (when (file-exists-p filename) + (rename-file filename new-name 1)) + (set-visited-file-name new-name) + (rename-buffer new-name))))) ;; Browse current HTML file