diff --git a/init.el b/init.el index 70b569c..5f1d146 100644 --- a/init.el +++ b/init.el @@ -1,270 +1,149 @@ ;;; Below are fragments from my Emacs configuration file -;;; (`~/.emacs.d/init.el`). - -;;; +;;; (`~/.emacs.d/init.el`) using +;;; [straight.el](https://github.com/raxod502/straight.el) instead of +;;; Emacs builtin `package.el`. (For old `package.el` based version +;;; see [here](/dotemacs/2022-02-15/)). ;;; The newest version of this config is available from a [github ;;; repo](https://github.com/lukpank/.emacs.d). -;;; I recommend watching the following video by BuildFunThings called -;;; [My GNU Emacs configuration for programming](https://www.youtube.com/watch?v=I28jFkpN5Zk). -;;; If you put this config on a new machine with no Emacs packages -;;; installed then you will be asked if you want automatically install -;;; all packages used below. +;;; Bootstrap straight.el +;;; --------------------- -;;; Later, if you add new packages you can temporary set -;;; `use-package-always-ensure` below to `t` start Emacs and then set -;;; it back to `nil` (or always have it set to `t`, if you prefer). +(defvar bootstrap-version) +(let ((bootstrap-file + (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) + (bootstrap-version 5)) + (unless (file-exists-p bootstrap-file) + (with-current-buffer + (url-retrieve-synchronously + "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" + 'silent 'inhibit-cookies) + (goto-char (point-max)) + (eval-print-last-sexp))) + (load bootstrap-file nil 'nomessage)) -;;; **Note** that for Emacs 25 you first need to install new ELPA -;;; signing key as described -;;; [here](https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html). - - -;;; Basic settings -;;; -------------- - - -;;; ### Directory with local Emacs lisp files ### - -;;; I add a directory to the lisp search path where I can add my own -;;; lisp code and (now less often) downloaded lisp code which is not -;;; available through [MELPA](https://melpa.org). Then I initialize -;;; secure downloading from GNU and MELPA archives of Emacs packages. - - -(let ((path (expand-file-name "~/.emacs.d/lisp"))) - (if (file-accessible-directory-p path) - (add-to-list 'load-path path t))) - - -;;; ### Add MELPA package list ### - -;;; You can install many Emacs packages from [MELPA](https://melpa.org) -;;; repository. To add MELPA to the package list add the following to your -;;; `~/.emacs.d/init.el` file - - -(require 'package) -(setq package-archives - '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa-stb" . "https://stable.melpa.org/packages/") - ("melpa" . "https://melpa.org/packages/")) - tls-checktrust t - tls-program '("gnutls-cli --x509cafile %t -p %p %h") - gnutls-verify-error t) - -;;; This also turns on checking TLS certificates (in both possible -;;; modes) with `tls-program` set to only the first value from the -;;; default value (for more info see [Your Text Editor Is -;;; Malware](https://glyph.twistedmatrix.com/2015/11/editor-malware.html)). - -;;; We use major version specific package directory (but only if the -;;; directory already exists, meaning you may be switching between -;;; more than one version of Emacs). - -(let ((path (format "~/.emacs.d/elpa-%s" emacs-major-version))) - (if (file-accessible-directory-p path) - (setq package-user-dir path))) - -;;; Now we are ready to initialize package system. - -(package-initialize) - -(setq use-package-always-ensure nil) - -;;; Now you can list available packages by running `M-x list-packages`. -;;; Mark packages you want to install by pressing `i` and later press `x` -;;; to install all marked packages (the necessary dependencies will be -;;; installed automatically). - -;;; Now, load [use-package](https://github.com/jwiegley/use-package/) -;;; package or propose automatic installation if it is not yet -;;; installed. - -(unless (require 'use-package nil t) - (if (not (yes-or-no-p (concat "Refresh packages, install use-package and" - " other packages used by init file? "))) - (error "you need to install use-package first") - (package-refresh-contents) - (package-install 'use-package) - (require 'use-package) - (setq use-package-always-ensure t))) - -;;; After loading `use-package` we can use it to configure other -;;; packages. - - -;;; ### Workaround for security vulnerability in Emacs >= 21.1 and < 25.3 ### -;;; -;;; See [Changes in Emacs 25.3](https://www.gnu.org/software/emacs/news/NEWS.25.3) - -(eval-after-load "enriched" - '(defun enriched-decode-display-prop (start end &optional param) - (list start end))) +(setq package-enable-at-startup nil + straight-use-package-by-default t) +(straight-use-package 'use-package) ;;; Productivity ;;; ------------ - ;;; ### Key discoverability ### -;;; If you type a prefix key (such as `C-x r`) and wait some time then -;;; display window with keys that can follow. - (use-package which-key + :init + (setq which-key-idle-delay 2.0 + which-key-idle-secondary-delay 1.0) :config (which-key-mode)) -;;; List of personal key bindings - -(global-set-key (kbd "C-c h b") 'describe-personal-keybindings) - -(use-package remind-bindings - :bind ("H-?" . remind-bindings-togglebuffer)) - - ;;; ### More efficient buffer/file selection ### +;;; Requires: [fzf](https://github.com/junegunn/fzf) and +;;; [ripgrep](https://github.com/BurntSushi/ripgrep) (rg), and git. + (setq recentf-max-saved-items 100) (global-set-key "\C-cq" #'bury-buffer) -(use-package flx - :after ivy) +(use-package prescient + :config + (prescient-persist-mode)) + +(use-package ivy-prescient + :after counsel + :config + (ivy-prescient-mode)) (use-package counsel :demand + :bind (("C-c a" . swiper-all) + ("C-c e" . counsel-flycheck) + ("C-c f" . counsel-fzf) + ("C-c g" . counsel-git) + ("C-c i" . counsel-imenu) + ("C-c j" . counsel-git-grep) + ("C-c L" . counsel-locate) + ("C-c o" . counsel-outline) + ("C-c r" . counsel-rg) + ("C-c R" . counsel-register) + ("C-c T" . counsel-load-theme) + ("C-S-s" . swiper) + ([remap dired] . counsel-dired)) :init - (setq ivy-use-virtual-buffers t - ivy-re-builders-alist - '((counsel-git-grep . ivy--regex-plus) - (counsel-rg . ivy--regex-plus) - (swiper . ivy--regex-plus) - (swiper-all . ivy--regex-plus) - (t . ivy--regex-fuzzy))) + (setq ivy-use-virtual-buffers t) :config - (add-to-list 'ivy-ignore-buffers "\\`\\*remind-bindings\\*") (ivy-mode 1) - (counsel-mode 1) - :bind - (("C-c E" . counsel-flycheck) - ("C-c f" . counsel-fzf) - ("C-c g" . counsel-git) - ("C-c j" . counsel-git-grep) - ("C-c L" . counsel-locate) - ("C-c o" . counsel-outline) - ("C-c r" . counsel-rg) - ("C-c R" . counsel-register) - ("C-c T" . counsel-load-theme))) + (counsel-mode 1)) (use-package ivy-rich + :after ivy :config - (setq ivy-rich-display-transformers-list - (plist-put ivy-rich-display-transformers-list - 'ivy-switch-buffer - '(:columns - ((ivy-switch-buffer-transformer (:width 40)) - (ivy-rich-switch-buffer-project - (:width 15 :face success)) - (ivy-rich-switch-buffer-path - (:width (lambda (x) - (ivy-rich-switch-buffer-shorten-path - x (ivy-rich-minibuffer-width 0.3)))))) - :predicate (lambda (cand) (get-buffer cand))))) (ivy-rich-mode 1)) -;;; For `counsel-fzf` install [fzf](https://github.com/junegunn/fzf) and for -;;; `counsel-rg` install [ripgrep](https://github.com/BurntSushi/ripgrep) (rg). +(use-package helpful + :init + (setq counsel-describe-function-function #'helpful-callable) + (setq counsel-describe-variable-function #'helpful-variable)) -;;; File explorer sidebar + +;;; ### File explorer sidebar ### + +;;; Install fonts with `M-x all-the-icons-install-fonts`. + +(use-package dired-sidebar + :bind ("C-c s" . dired-sidebar-toggle-sidebar)) + +(use-package all-the-icons + :defer) + +(use-package all-the-icons-dired + :hook (dired-mode . all-the-icons-dired-mode)) + +(use-package all-the-icons-ivy-rich + :after ivy-rich + :config (all-the-icons-ivy-rich-mode 1)) (use-package treemacs - :bind - (("C-c t" . treemacs) - ("s-a" . treemacs))) - -;;; Cycle through buffers' history - -(use-package buffer-flip - :bind - (("H-f" . buffer-flip) - :map buffer-flip-map - ("H-f" . buffer-flip-forward) - ("H-F" . buffer-flip-backward) - ("C-g" . buffer-flip-abort))) + :bind ("C-c S" . treemacs)) ;;; ### Window selection enhancements ### -(use-package ace-window - :init - (setq aw-scope 'frame ; limit to single frame - aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)) - :bind - ("C-x o" . ace-window)) - (use-package windmove - :demand - :bind - (("H-w j" . windmove-down) - ("H-w k" . windmove-up) - ("H-w h" . windmove-left) - ("H-w l" . windmove-right)) - :config - (windmove-default-keybindings)) + :bind (("H-w j" . windmove-down) + ("H-w k" . windmove-up) + ("H-w h" . windmove-left) + ("H-w l" . windmove-right))) (use-package windswap - :demand - :bind - (("H-w J" . windswap-down) - ("H-w K" . windswap-up) - ("H-w H" . windswap-left) - ("H-w L" . windswap-right)) - :config - (windswap-default-keybindings)) - -;;; Allow for Undo/Redo of window manipulations (such as `C-x 1`) - -(winner-mode 1) + :bind (("H-w J" . windswap-down) + ("H-w K" . windswap-up) + ("H-w H" . windswap-left) + ("H-w L" . windswap-right))) ;;; ### In buffer movement enhancements ### -;;; Improved in buffer search +;;; Search (use-package ctrlf :config - (ctrlf-mode 1)) + (ctrlf-mode)) -;;; Type substring and wait to select one of its visible occurrences -;;; (even in other windows) with a single or two letters. +;;; Improved in buffer search -(use-package avy - :bind - (("H-." . avy-goto-char-timer) - ("H-," . avy-goto-line))) - -;;; Bind key `o` to selection of a link in help or info buffers by a -;;; single or two letters. - -(use-package ace-link - :config - (ace-link-setup-default)) - -;;; Select from visible errors by a single letter - -(use-package avy-flycheck - :bind - ("C-c '" . avy-flycheck-goto-error)) +(use-package ace-jump-mode + :bind ("C-." . ace-jump-mode)) ;;; Go to last change in the current buffer (use-package goto-chg - :bind - ("C-c G" . goto-last-change)) + :bind ("C-c G" . goto-last-change)) ;;; ### Editing enhancements ### @@ -272,14 +151,20 @@ ;;; Context aware insertion of pairs of parenthesis (use-package smartparens - :defer) + :hook ((prog-mode . smartparens-mode) + (emacs-lisp-mode . smartparens-strict-mode)) + :init + (setq sp-base-key-bindings 'sp) + :config + (define-key smartparens-mode-map [M-backspace] #'backward-kill-word) + (define-key smartparens-mode-map [M-S-backspace] #'sp-backward-unwrap-sexp) + (require 'smartparens-config)) ;;; Edit with multiple cursors (use-package multiple-cursors - :bind - (("C-c n" . mc/mark-next-like-this) - ("C-c p" . mc/mark-previous-like-this))) + :bind (("C-c n" . mc/mark-next-like-this) + ("C-c p" . mc/mark-previous-like-this))) ;;; Fix trailing spaces but only in modified lines @@ -287,65 +172,6 @@ :hook (prog-mode . ws-butler-mode)) -;;; Expand region - -(use-package expand-region - :bind ("H-e" . er/expand-region)) - - -;;; ### Spell checking ### - -(setq ispell-dictionary "american") - -(defun my-american-dict () - "Change dictionary to american." - (interactive) - (setq ispell-local-dictionary "american") - (flyspell-mode 1) - (flyspell-buffer)) - -(defun my-polish-dict () - "Change dictionary to polish." - (interactive) - (setq ispell-local-dictionary "polish") - (flyspell-mode 1) - (flyspell-buffer)) - -(defalias 'ir #'ispell-region) - - -;;; ### Shell and terminal ### - -(use-package shell-pop - :init - (setq shell-pop-full-span t) - :bind (("C-c s" . shell-pop))) - -(use-package vterm - :defer) - -(use-package vterm-toggle - :bind (("H-z" . vterm-toggle) - ("H-F" . vterm-toggle-forward) - ("H-B" . vterm-toggle-backward))) - - -;;; ### Git ### - -(use-package magit - :bind (("C-x g" . magit-status) - ("C-x M-g" . magit-dispatch))) - -(use-package git-commit - :hook (git-commit-mode . my-american-dict)) - -(use-package git-messenger - :bind ("C-x G" . git-messenger:popup-message) - :config - (setq git-messenger:show-detail t - git-messenger:use-magit-popup t)) - - ;;; ### Switching buffers ### ;;; Bind keys from `H-r a` to `H-r z` to switch to buffers from a @@ -354,8 +180,7 @@ (defalias 'pr #'point-to-register) (defun my-switch-to-register () - "Switch to buffer given by a register named by last character -of the key binding used to execute this command." + "Switch to buffer given by key binding last character." (interactive) (let* ((v (this-command-keys-vector)) (c (aref v (1- (length v)))) @@ -378,394 +203,153 @@ of the key binding used to execute this command." (setq-default abbrev-mode 1) (use-package yasnippet - :hook (after-init . yas-global-mode) - :bind - (:map yas-minor-mode-map - ("C-c & t" . yas-describe-tables) - ("C-c & &" . org-mark-ring-goto))) + :defer 2 + :config + (yas-global-mode 1)) (use-package yasnippet-snippets :defer) (use-package ivy-yasnippet - :bind - (("C-c y" . ivy-yasnippet))) + :bind ("C-c y" . ivy-yasnippet)) -;;; Programming languages -;;; --------------------- +;;; Programming modes +;;; ----------------- - -;;; ### Common settings for programming modes ### +;;; ### company and lsp-mode ### ;;; For modes using [company](https://company-mode.github.io/) for tab ;;; completion add (use-package company - :init - (setq company-idle-delay nil ; avoid auto completion popup, use TAB - ; to show it - company-async-timeout 15 ; completion may be slow - company-tooltip-align-annotations t) - :hook (after-init . global-company-mode) - :bind - (:map prog-mode-map - ("C-i" . company-indent-or-complete-common) - ("C-M-i" . counsel-company))) + :bind (:map prog-mode-map + ("C-i" . company-indent-or-complete-common) + ("C-M-i" . counsel-company)) + :hook (emacs-lisp-mode . company-mode)) -;;; For modes that also use Language Server Protocol from -;;; [lsp-mode](https://github.com/emacs-lsp/lsp-mode) add +(use-package company-prescient + :after company + :config + (company-prescient-mode)) -(defun my-lsp-format-buffer () - (if (eq major-mode 'go-mode) - (lsp-format-buffer))) - -(defun my-lsp-organize-imports () - (if (eq major-mode 'go-mode) - (lsp-organize-imports))) +;;; For modes that also use Language Server Protocol from [lsp-mode] +;;; add (use-package lsp-mode - :commands lsp + :hook ((c-mode c++-mode d-mode go-mode js-mode kotlin-mode python-mode typescript-mode + vala-mode web-mode) + . lsp) :init - (setq lsp-keymap-prefix "H-l") + (setq lsp-keymap-prefix "H-l" + lsp-rust-analyzer-proc-macro-enable t) :config - (lsp-enable-which-key-integration t) - ;; reformat Go code and add missing (or remove old) imports - :hook ((before-save . my-lsp-format-buffer) - (before-save . my-lsp-organize-imports)) - :bind (("C-c e n" . flymake-goto-next-error) - ("C-c e p" . flymake-goto-prev-error) - ("C-c e r" . lsp-find-references) - ("C-c e R" . lsp-rename) - ("C-c e i" . lsp-find-implementation) - ("C-c e t" . lsp-find-type-definition))) + (lsp-enable-which-key-integration t)) (use-package lsp-ui :init - (setq lsp-ui-doc-enable nil - lsp-ui-sideline-delay 5.0) + (setq lsp-ui-doc-position 'at-point + lsp-ui-doc-show-with-mouse nil) :bind (("C-c d" . lsp-ui-doc-show) - ("C-c i" . lsp-ui-imenu))) + ("C-c I" . lsp-ui-imenu))) + +(use-package flycheck + :defer) + +;;; [lsp-mode]: https://emacs-lsp.github.io/lsp-mode/ ;;; Compilation (global-set-key "\C-ck" #'compile) - -;;; [my common settings for programming modes]: #common-settings-for-programming-modes +;;; [company and lsp-mode]: #company-and-lsp-mode ;;; ### C and C++ ### -;;; The following needs [clangd](https://clangd.llvm.org/) to be in -;;; you PATH. You also need to [provide compiler -;;; flags](https://clangd.llvm.org/config.html#compileflags). You may -;;; also look at available -;;; [keybindings](https://emacs-lsp.github.io/lsp-mode/page/keybindings/) -;;; (I use `H-l` instead of `s-l` as the prefix). +;;; Requires: [company and lsp-mode], +;;; [clangd](https://clangd.llvm.org/). -;;; For **tab completion** and **lsp** support also add [my common -;;; settings for programming modes]. - -(setq-default c-basic-offset 8) - -(defun my-c-c++-mode-hook-fn () - (lsp) - (lsp-headerline-breadcrumb-mode) - (smartparens-mode) - (local-set-key (kbd "") #'company-indent-or-complete-common)) - -(add-hook 'c-mode-hook #'my-c-c++-mode-hook-fn) -(add-hook 'c++-mode-hook #'my-c-c++-mode-hook-fn) +(use-package cc-mode + :straight nil + :bind (:map c-mode-map + ("C-i" . company-indent-or-complete-common) + :map c++-mode-map + ("C-i" . company-indent-or-complete-common)) + :init + (setq-default c-basic-offset 8)) -;;; ### Lisp and Emacs lisp ### +;;; ### D ### -;; in emacs 25.1: M-. runs xref-find-definitions, M-, jumps back -(global-set-key (kbd "C-c e l") #'find-library) +;;; Requires: [company and lsp-mode], `dmd`, `dub`, +;;; [dcd](https://code.dlang.org/packages/dcd), and +;;; [dtools](https://code.dlang.org/packages/dtools) (for `rdmd`) to +;;; build [serve-d](https://code.dlang.org/packages/serve-d) (but +;;; first check for newer version) with -(setq slime-lisp-implementations '((sbcl ("sbcl"))) - slime-default-lisp 'sbcl - slime-contribs '(slime-fancy)) +;;; $ dub fetch serve-d@0.7.4 +;;; $ dub run serve-d --build=release +;;; $ ln -s ~/.dub/packages/serve-d-0.7.4/serve-d/serve-d ~/.local/bin/ -(let ((path "/usr/local/share/doc/HyperSpec/")) - (if (file-accessible-directory-p path) - (setq common-lisp-hyperspec-root (concat "file://" path)))) +(use-package d-mode + :bind (:map d-mode-map + ("C-i" . company-indent-or-complete-common))) -(use-package lispy - :hook (eval-expression-minibuffer-setup . lispy-mode)) -(use-package paren-face - :defer) +;;; ### Dart ### -(defun my-emacs-lisp-mode-hook-fn () - (set (make-local-variable 'lisp-indent-function) #'lisp-indent-function) - (lispy-mode 1) - (local-set-key (kbd "C-c S") (global-key-binding (kbd "M-s"))) - (local-set-key (kbd "C-c C-z") - (lambda () (interactive) (switch-to-buffer "*scratch*"))) - (local-set-key (kbd "C-M-i") #'counsel-company) - (show-paren-mode 1) - (paren-face-mode)) +;;; Requires: [company and lsp-mode], `flutter` in `PATH`, +;;; `flutter doctor` should be OK, and `M-x lsp-dart-dap-setup`. -(use-package slime-company - :defer) +(use-package dart-mode) -(use-package slime - :demand - :config - (slime-setup '(slime-fancy slime-company slime-cl-indent))) +(use-package lsp-dart + :hook (dart-mode . lsp) + :bind (:map lsp-mode + ("C-M-x" . lsp-dart-dap-flutter-hot-reload))) -(defun my-lisp-mode-hook-fn () - (set (make-local-variable 'lisp-indent-function) - #'common-lisp-indent-function) - (lispy-mode 1) - (local-set-key (kbd "C-c S") (global-key-binding (kbd "M-s"))) - (show-paren-mode 1) - (paren-face-mode) - (set (make-local-variable 'company-backends) '(company-slime)) - (company-mode) - (local-set-key "\C-i" #'company-indent-or-complete-common)) -(add-hook 'emacs-lisp-mode-hook #'my-emacs-lisp-mode-hook-fn) -(add-hook 'lisp-mode-hook #'my-lisp-mode-hook-fn) +;;; ### Emacs lisp ### + +;;; Requires: [company and lsp-mode] (actually just `company`) and +;;; [smartparens](#editing-enhancements). + + +;;; ### Go ### + +;;; Requires: [company and lsp-mode], +;;; [gopls](https://github.com/golang/tools/blob/master/gopls/README.md#installation). + +(defun my-go-before-save () + "Format buffer and organize imports in Go mode." + (when (eq major-mode 'go-mode) + (lsp-organize-imports) + (lsp-format-buffer))) + +(use-package go-mode + :hook (before-save . my-go-before-save)) ;;; ### JavaScript ### -;;; See also [TypeScript](#typescript) section below where -;;; [tide](https://melpa.org/#/tide) is enabled for javascript files. +;;; Requires: [company and lsp-mode] `ts-ls` (proposed by [lsp-mode] +;;; when missing). -(setq js-indent-level 4) - - -;;; -;;; ### Go (golang) ### - -;;;
-;;; This is my new Go setup (partially) based on gopls (which is -;;; still in alpha stage) and may not work for you if that is the case -;;; try my old Go setup -;;; (below). gopls supports Go modules outside of -;;; GOPATH (some Go tools, for example guru -;;; does not). -;;;
- -;;; I use the following setup for the [go-mode] in my -;;; `~/.emacs.d/init.el`. This adds syntax highlighting but without -;;; fontifing names of called functions, autocompletion and info on -;;; called function in mode line, auto formatting of the code on save -;;; with adding of missing imports. - -;;; It is quite long as I define two interactive functions: - -;;; 1. `my-go-electric-brace` which is bind to `{` key and inserts an -;;; indented pair of braces (if previous character is a space, -;;; otherwise it inserts single opening brace), - -;;; 2. `my-godoc-package` which is bind to `C-c P` key and display -;;; documentation for a package choosen from a list of installed -;;; packages. - -;;; [go-mode]: https://github.com/dominikh/go-mode.el - -;;; For **tab completion** and **lsp** support also add [my common -;;; settings for programming modes]. - -(defun my-go-electric-brace () - "Insert an opening brace may be with the closing one. -If there is a space before the brace also adds new line with -properly indented closing brace and moves cursor to another line -inserted between the braces between the braces." - (interactive) - (insert "{") - (when (looking-back " {") - (newline) - (indent-according-to-mode) - (save-excursion - (newline) - (insert "}") - (indent-according-to-mode)))) - -(defun my-godoc-package () - "Display godoc for given package (with completion)." - (interactive) - (godoc (ivy-read "Package: " (go-packages) :require-match t))) - -(use-package go-guru - :after go-mode) - -(use-package go-mode +(use-package js + :straight nil + :bind (:map js-mode-map + ([remap js-find-symbol] . xref-find-definitions)) :init - (setq go-fontify-function-calls nil) ; fontifing names of called - ; functions is too much for me - :bind - (:map go-mode-map - ("C-c e g" . godoc) - ("C-c P" . my-godoc-package) - ("{" . my-go-electric-brace)) - :hook ((go-mode . lsp) - (go-mode . smartparens-mode))) - -;; Go/speedbar integration - -(eval-after-load 'speedbar - '(speedbar-add-supported-extension ".go")) + (setq js-indent-level 4)) -;;; Now, in go buffers you can use `M-.` to jump to the definition of -;;; the identifier at point (use `M-,` to jump back as for normal tags -;;; in Emacs 25.1) and you can also use `C-c C-d` for a short -;;; description of the identifier at point (actually it is constantly -;;; displayed in the mode line by enabled lsp support). You can -;;; use `C-c d` for a longer description of the identifier at point. +;;; ### Kotlin ### -;;; For this to work you have to +;;; Requires: +;;; [kotlin-language-server](https://github.com/fwcd/kotlin-language-server). -;;; 1. After adding above to your emacs config file see how to -;;; [install from MELPA all required packages](#add-melpa-package-list). -;;; Or just install [go-mode], [go-guru]. - -;;; 2. Install Go compiler. Under Debian you may install `golang` package -;;; (but in Debian 10 Buster it is 1.11 compared to the current 1.14, -;;; so you may consider -;;; [downloading the current version of Go](https://golang.org/dl/)). Otherwise -;;; search for the package for your system or -;;; see [Getting started](https://golang.org/doc/install). - -;;; 3. Install [gopls](https://github.com/golang/tools/blob/master/gopls/README.md) with -;;; (but in your home directory, not inside some Go module) - -;;; ``` -;;; $ go install golang.org/x/tools/gopls@latest -;;; ``` - -;;; 4. Install [guru](https://godoc.org/golang.org/x/tools/cmd/guru) -;;; with - -;;; ``` -;;; $ go get -u golang.org/x/tools/cmd/guru -;;; ``` - -;;; 5. Add your `$GOPATH/bin` to your `PATH` environment variable (or -;;; copy the `gopls` and `guru` executables from -;;; `$GOPATH/bin` to some directory which is in your `PATH`). - -;;; See also -;;; [Go, pls stop breaking my editor - GopherCon SG 2019](https://www.youtube.com/watch?v=gZ7N3HulAb0) -;;; and [Writing Go in Emacs](http://dominik.honnef.co/posts/2013/03/writing_go_in_emacs/) -;;; for more info. - -;;; [go-guru]: https://melpa.org/#/go-guru - - -;;; {{old-go.el}} - - -;;; -;;; ### D (Dlang) ### - -;;; Install [dcd](https://code.dlang.org/packages/dcd) and -;;; [dtools](https://code.dlang.org/packages/dtools) (for `rdmd`) -;;; either by following instructions on previous two links or on Arch -;;; Linux you can also run - -;;; ``` -;;; $ sudo pacman -S dcd dtools -;;; ``` - -;;; And install [serve-d](https://code.dlang.org/packages/serve-d) -;;; (but check the link for newer version) with - -;;; ``` -;;; $ dub fetch serve-d@0.7.0-beta.5 -;;; $ dub run serve-d --build=release -;;; ``` - -;;; For **tab completion** and **lsp** support also add [my common -;;; settings for programming modes]. - -(use-package lsp-mode - :commands lsp - :config - (add-to-list 'lsp-language-id-configuration '(vala-mode . "D")) - (lsp-register-client - (make-lsp-client :new-connection (lsp-stdio-connection '("serve-d")) - :major-modes '(d-mode) - :server-id 'serve-d))) - -(defun my-d-mode-hook-fn () - (setq c-basic-offset 4 - indent-tabs-mode nil) - (company-mode 1) - (local-set-key "\C-i" #'company-indent-or-complete-common) - (lsp 1)) - -(use-package d-mode - :hook (d-mode . my-d-mode-hook-fn)) - - -;;; ### Python ### - -;;; Install [pylsp](https://pypi.org/project/python-lsp-server/). - -(use-package python - :hook (python-mode . lsp)) - - -;;; ### Rust ### - -;;; If you have Emacs 26 than you need [Rustup] and using Rustup you -;;; should install components [rls](https://github.com/rust-lang/rls) -;;; and `rust-src` with the command -;;; -;;; ``` -;;; $ rustup component add rls rust-src -;;; ``` -;;; -;;; For **tab completion** and **lsp** support add [my common settings -;;; for programming modes] and then add - -;;; [Rustup]: https://www.rust-lang.org/learn/get-started - -(when (>= emacs-major-version 26) - (defun my-rustic-mode-hook-fn () - "needed for lsp-format-buffer to indent with 4 spaces" - (setq tab-width 4 - indent-tabs-mode nil)) - - (use-package rustic - :init - ;; to use rustic-mode even if rust-mode also installed - (setq auto-mode-alist (delete '("\\.rs\\'" . rust-mode) auto-mode-alist)) - :hook (rustic-mode . my-rustic-mode-hook-fn))) - -;;; But if you have Emacs older than 26 than you should install -;;; [Rustup] and [racer](https://github.com/racer-rust/racer) and with -;;; Rustup install component `rust-src` with the command -;;; -;;; ``` -;;; $ rustup component add rust-src -;;; ``` -;;; -;;; for **tab completion** add [my common settings for programming -;;; modes] and then add - -(when (< emacs-major-version 26) - (use-package cargo - :defer) - - (use-package racer - :defer) - - (use-package rust-mode - :init - (setq rust-format-on-save t) - :hook ((rust-mode . company-mode) - (rust-mode . cargo-minor-mode) - (rust-mode . racer-mode) - (rust-mode . eldoc-mode)))) +(use-package kotlin-mode) ;;; ### Meson build system ### @@ -775,349 +359,152 @@ inserted between the braces between the braces." :init (setq meson-indent-basic 4)) -;;; To use `cmake-ide` with Meson build system -;;; [see](https://github.com/atilaneves/cmake-ide/#non-cmake-projects). + +;;; ### Python ### + +;;; Requires: [company and lsp-mode], +;;; [pylsp](https://pypi.org/project/python-lsp-server/). -;;; ### Vala ### +;;; ### Rust ### -;;; You need to install -;;; [vala-language-server](https://github.com/benwaffle/vala-language-server). +;;; Requires: [company and lsp-mode], `rust-src` from [Rustup] +;;; and [rust-analyzer]. -;;; For **tab completion** and **lsp** support also add [my common -;;; settings for programming modes]. +;;; [Rustup]: https://www.rust-lang.org/learn/get-started +;;; [rust-analyzer]: (https://rust-analyzer.github.io/manual.html#installation). -(use-package lsp-mode - :commands lsp - :config - (add-to-list 'lsp-language-id-configuration '(vala-mode . "vala")) - (lsp-register-client - (make-lsp-client :new-connection (lsp-stdio-connection - '("vala-language-server")) - :major-modes '(vala-mode) - :server-id 'vala-ls))) - -(defun my-vala-mode-hook-fn () - (setq c-basic-offset 4 - tab-width 8 - indent-tabs-mode nil) - (company-mode 1) - (local-set-key "\C-i" #'company-indent-or-complete-common) - (lsp 1)) - -(use-package vala-mode - :hook (vala-mode . my-vala-mode-hook-fn)) - - -;;; ### Dart ### - -;;; NOTE: `pub` and `dart` must be in `PATH` for lsp to start in -;;; dart-mode. - -;;; For **tab completion** and **lsp** support also add [my common -;;; settings for programming modes]. - -(use-package dart-mode - :init - (setq lsp-dart-analysis-sdk-dir "~/local/flutter/bin/cache/dart-sdk/") - :hook ((dart-mode . smartparens-mode) - (dart-mode . lsp))) - -(use-package flutter - :after dart-mode - :init - (setq flutter-sdk-path "~/local/flutter/") - :bind - (:map dart-mode-map - ("C-M-x" . #'flutter-run-or-hot-reload))) - - -;;; ### PHP ### - -;;; For fully functional PHP support apart from below code -;;; block you also need the content of [web-mode section] below. - -(use-package php-mode +(use-package rustic :defer) -(use-package company-php - :defer) - -(defun my-php-mode-hook-fn() - (when (require 'company-php nil t) - (set (make-local-variable 'company-backends) - '(company-ac-php-backend)) - (company-mode t) - (local-set-key (kbd "M-.") #'ac-php-find-symbol-at-point))) - -(add-hook 'php-mode-hook #'my-php-mode-hook-fn) - ;;; ### TypeScript ### -;;; For fully functional TypeScript support apart from below code -;;; block you also need the content of [web-mode section] below. -;;; -;;; Your should have -;;; [tsconfig.json](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) -;;; file in the root of your project. +;;; Requires: [company and lsp-mode], [web-mode settings] (for tsx), +;;; `ts-ls` (proposed by [lsp-mode] when missing), +;;; [tsconfig.json](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). -(defun my-setup-tide-mode () - (interactive) - (tide-setup) - (flycheck-mode 1) - (setq flycheck-check-syntax-automatically '(save mode-enabled)) - (eldoc-mode 1) - (tide-hl-identifier-mode +1) - (company-mode 1)) - -(defun my-tide-jump-to-type-definiton () - (interactive) - (tide-jump-to-definition 1)) - -(use-package tide - :after (:any js typescript-mode) - :bind (:map tide-mode-map - ("C-c e n" . flycheck-next-error) - ("C-c e p" . flycheck-prev-error) - ("C-c e L" . tide-project-errors) - ("C-c e r" . tide-references) - ("C-c e R" . tide-rename-symbol) - ("C-c e i" . tide-jump-to-implementation) - ("C-c e t" . my-tide-jump-to-type-definiton)) - :hook ((before-save . tide-format-before-save) - (typescript-mode . my-setup-tide-mode) - (js-mode . my-setup-tide-mode))) - -(use-package ng2-mode +(use-package typescript-mode :defer) +;;; ### Vala ### + +;;; Requires: [company and lsp-mode], +;;; [vala-language-server](https://github.com/Prince781/vala-language-server#installation). + +(use-package vala-mode + :defer) + + +;;; ### Web mode ### + +;;; Requires: [company and lsp-mode]. + +(use-package web-mode + :mode "\\.\\([jt]sx\\)\\'") + +;;; [web-mode settings]: #web-mode + + ;;; Other modes ;;; ----------- +(use-package ansible + :straight (:nonrecursive t)) -;;; ### Web mode ### +(use-package devdocs + :bind ("C-c D" . devdocs-lookup)) -;;; For **tab completion** support also add first code block with -;;; `use-package company` from [my common settings for programming -;;; modes] (the second code block with `use-package lsp` is not -;;; required for Web mode). +(use-package diff-hl + :defer) -(defun my-web-mode-hook-fn () - (cond - ((string= web-mode-engine "php") - (my-php-mode-hook-fn)) - ((string-match-p "^[jt]sx$" (file-name-extension (or (buffer-file-name) ""))) - (my-setup-tide-mode)))) - -(use-package web-mode - :mode "\\.\\(jsx\\|php\\|tsx\\)\\'" - :init - (add-hook 'web-mode-hook #'my-web-mode-hook-fn)) - - -;;; [web-mode section]: #web-mode - - -;;; ### CSS ### +(use-package htmlize + :defer) (use-package rainbow-mode - :hook (css-mode . rainbow-mode)) + :hook css-mode) +(use-package restclient + :defer) -;;; ### Org mode ### - -(use-package org - :init - (setq org-default-notes-file "~/org/notes.org" - org-highlight-latex-and-related '(latex) - org-hide-leading-stars t - org-ellipsis "…" - org-catch-invisible-edits 'smart - gnuplot-program "pyxplot") - (defun my-org-timer-done () - (shell-command "echo Timer timed out; date &")) - :bind - (("C-c A" . org-agenda) - ("C-c B" . org-switchb) - ("C-c c" . org-capture) - ("C-c l" . org-store-link)) - :hook ((org-timer-done . my-org-timer-done)) - :config - (require 'ox-beamer)) - - -;;; ### Search engines ### - -(use-package engine-mode - :config - (engine-mode t) - (defengine duckduckgo - "https://duckduckgo.com/?q=%s" - :keybinding "d") - (defengine google - "http://www.google.com/search?ie=utf-8&oe=utf-8&q=%s" - :keybinding "g")) - - -;;; ### WWW browsers ### - -(setq my-browsers - '(("Firefox" . browse-url-firefox) - ("Chromium" . browse-url-chromium) - ("EWW" . eww-browse-url))) - -(defun my-browse-url (&rest args) - "Select the prefered browser from a menu before opening the URL." - (interactive) - (let ((browser (ivy-read "WWW browser: " my-browsers :require-match t))) - (apply (cdr (assoc browser my-browsers)) args))) - -(setq browse-url-browser-function #'my-browse-url) - -(defun my-eww-scale-adjust () - "Slightly bigger font but text shorter than text." - (interactive) - (text-scale-adjust 0) - (text-scale-adjust 1) - (eww-toggle-fonts) - (split-window-right) - (eww-toggle-fonts) - (other-window 1) - (sleep-for 1) - (delete-window)) - - -;;; ### Mail ### - -(use-package notmuch +(use-package vterm :defer :init - (setq notmuch-search-oldest-first nil)) + (dolist (i (number-sequence 0 9)) + (global-set-key (kbd (format "H-%d" i)) `(lambda () (interactive) (vterm ,i))))) + +(use-package yaml-mode + :defer) -;;; ### API documentation ### +;;; ### Git ### -(when (require 'devdocs-lookup nil t) - (devdocs-setup)) +(use-package magit + :bind (("C-x g" . magit-status) + ("C-x M-g" . magit-dispatch)) + :init + (setq project-switch-commands nil)) ; avoid magit error on C-n/C-p + +(use-package git-messenger + :bind ("C-x G" . git-messenger:popup-message) + :config + (setq git-messenger:show-detail t + git-messenger:use-magit-popup t)) + +(use-package git-timemachine + :bind ("C-c t" . git-timemachine)) -;;; Appearance and custom file -;;; -------------------------- - +;;; Appearance +;;; ---------- ;;; ### Minimalistic look ### -(setq inhibit-startup-screen t - frame-title-format "%b" - ediff-window-setup-function #'ediff-setup-windows-plain) -(add-to-list 'global-mode-string - `(t (,(user-login-name) "@" system-name " ")) t) +(setq inhibit-startup-screen t) (set-scroll-bar-mode 'right) (menu-bar-mode 0) (tool-bar-mode 0) (scroll-bar-mode 0) -;;; ### Easy switching between some fonts ### +;;; ### Mode line ### -(setq my-font-list - '("Fantasque Sans Mono" "Fira Code Light" "Go mono" "IBM 3270" - "Inconsolata" "Iosevka Light" "Iosevka Slab Light" "Monofur" "Monoid" "mononoki")) - -(defun my-set-frame-font (font-name size &optional frames) - "Set font to one of the fonts from `my-font-list' -Argument FRAMES has the same meaning as for `set-frame-font'" - (interactive - (list (ivy-read "Font name: " my-font-list) - (read-number "Font size: "))) - (set-frame-font - (format "%s:pixelsize=%d:antialias=true:autohint=true" font-name size) - nil frames)) - -(global-set-key (kbd "C-c F") #'my-set-frame-font) +(use-package smart-mode-line + :config + (setq sml/no-confirm-load-theme t + sml/theme 'respectful) + (sml/setup)) -;;; ### Toggle between dark and light themes with a key ### +;;; ### Switching themes ### -;;; Toggle between [my own dark and light -;;; themes](https://lupan.pl/lupan-themes/) if available in -;;; `~/.emacs.d/lupan-themes` otherwise falls back to another themes. +(use-package zenburn-theme + :defer) -(let ((path (expand-file-name "~/.emacs.d/lupan-themes"))) - (when (file-accessible-directory-p path) - (add-to-list 'load-path path t))) +(use-package apropospriate-theme + :defer) -(defun my-preferred-theme (themes) - (let ((theme (car themes))) - (cond - ((symbolp theme) theme) - ((require (car theme) nil t) (cdr theme)) - ((cdr themes) (my-select-theme (cdr themes)))))) +(use-package faff-theme + :defer) -(setq my-dark-theme - (my-preferred-theme - '((undersea-theme . undersea) - (lupan-themes . lupan-dark) - (apropospriate-theme . apropospriate-dark) - deeper-blue)) - my-light-theme - (my-preferred-theme - '((cloud-theme . cloud) - (lupan-themes . lupan-light) - (apropospriate-theme . apropospriate-light) - adwaita))) +(setq my-dark-theme 'zenburn + my-light-theme 'apropospriate-light) (defun my-select-theme (theme) (mapc #'disable-theme custom-enabled-themes) - (load-theme (cond - ((eq theme 'dark) my-dark-theme) - ((eq theme 'light) my-light-theme) - (t theme)) - t)) + (load-theme (cond + ((eq theme 'dark) my-dark-theme) + ((eq theme 'light) my-light-theme) + (t theme)) + t) + (sml/setup)) (defun my-toggle-theme () - "Toggle between dark and light themes" + "Toggle between dark and light themes." (interactive) (my-select-theme (if (custom-theme-enabled-p my-dark-theme) my-light-theme my-dark-theme))) (global-set-key (kbd "C-S-") #'my-toggle-theme) - -(use-package apropospriate-theme - :defer) - -(if (or (require 'lupan-themes nil t) - (require 'apropospriate-theme nil t)) - (my-toggle-theme)) - -(defun my-frame-setup-fn (&optional frame) - (unless (display-graphic-p frame) - (set-face-background 'default "unspecified-bg" - (or frame (selected-frame))))) - -(add-hook 'after-make-frame-functions #'my-frame-setup-fn) -(add-hook 'window-setup-hook #'my-frame-setup-fn) - - -;;; ### Hyper bindings - -(dolist (k '(("H-1" . "C-x 1") - ("H-2" . "C-x 2") - ("H-3" . "C-x 3") - ("H-0" . "C-x 0") - ("H-b" . "C-x b") - ("H-g" . "C-x g") - ("H-k" . "C-x k") - ("H-o" . "C-x o"))) - (global-set-key (kbd (car k)) - (lookup-key (current-global-map) (kbd (cdr k))))) - - -;;; ### Use separate custom file ### - -(setq custom-file "~/.emacs.d/custom.el") -(if (file-exists-p custom-file) - (load custom-file)) diff --git a/old-go.el b/old-go.el deleted file mode 100644 index 6b4f85b..0000000 --- a/old-go.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; #### Old Go setup #### - -;;;
-;;; This is my old Go setup, you may try the new setup -;;; (above) based (partially) on gopls if the -;;; new one does not work for you try this one. -;;;
- -;;; I used the following setup for the [go-mode] in my `~/.emacs.d/init.el`. This -;;; adds syntax highlighting but without fontifing names of called -;;; functions, autocompletion and [eldoc] support, auto formatting of the -;;; code on save with adding of missing imports ([goimports]). - -;;; It is quite long as I define two interactive functions: - -;;; 1. `my-go-electric-brace` which is bind to `{` key and inserts an -;;; indented pair of braces (if previous character is a space, -;;; otherwise it inserts single opening brace), - -;;; 2. `my-godoc-package` which is bind to `C-c P` key and display -;;; documentation for a package choosen from a list of installed -;;; packages. - -;;; [go-mode]: https://github.com/dominikh/go-mode.el -;;; [eldoc]: http://emacswiki.org/emacs/ElDoc -;;; [goimports]: https://godoc.org/golang.org/x/tools/cmd/goimports - -(defun my-go-electric-brace () - "Insert an opening brace may be with the closing one. -If there is a space before the brace also adds new line with -properly indented closing brace and moves cursor to another line -inserted between the braces between the braces." - (interactive) - (insert "{") - (when (looking-back " {") - (newline) - (indent-according-to-mode) - (save-excursion - (newline) - (insert "}") - (indent-according-to-mode)))) - -(defun my-godoc-package () - "Display godoc for given package (with completion)." - (interactive) - (godoc (ivy-read "Package: " (go-packages) :require-match t))) - -(use-package flycheck - :defer) - -(use-package go-eldoc - :defer) - -(use-package company-go - :defer) - -(use-package go-guru - :after go-mode) - -(use-package go-mode - :init - (setq gofmt-command "goimports" ; use goimports instead of gofmt - go-fontify-function-calls nil ; fontifing names of called - ; functions is too much for me - company-idle-delay nil) ; avoid auto completion popup, use TAB - ; to show it - :bind - (:map go-mode-map - ("M-." . go-guru-definition) - ("C-c d" . godoc-at-point) - ("C-c g" . godoc) - ("C-c h" . go-guru-hl-identifier) - ("C-c P" . my-godoc-package) - ("{" . my-go-electric-brace) - ("C-i" . company-indent-or-complete-common) - ("C-M-i" . company-indent-or-complete-common)) - :config - ;; run gofmt/goimports when saving the file - (add-hook 'before-save-hook #'gofmt-before-save) - - (defun my-go-mode-hook-fn () - (go-eldoc-setup) - (set (make-local-variable 'company-backends) '(company-go)) - (company-mode) - (smartparens-mode 1) - (flycheck-mode 1) - (setq imenu-generic-expression - '(("type" "^type *\\([^ \t\n\r\f]*\\)" 1) - ("func" "^func *\\(.*\\) {" 1)))) - - (add-hook 'go-mode-hook #'my-go-mode-hook-fn)) - -;; Go/speedbar integration - -(eval-after-load 'speedbar - '(speedbar-add-supported-extension ".go")) - - -;;; Now, in go buffers you can use `M-.` to jump to the definition of -;;; the identifier at point (use `M-,` to jump back as for normal tags -;;; in Emacs 25.1) and you can also use `C-c C-d` for a short -;;; description of the identifier at point (actually it is constantly -;;; displayed in the mode line by enabled Go [eldoc] support). You can -;;; use `C-c d` for a longer description of the identifier at point. - -;;; For this to work you have to - -;;; 1. Install [from MELPA](#add-melpa-package-list) the following Emacs -;;; packages: [go-mode], [company-go], [go-eldoc], and [go-guru]. - -;;; 2. Install Go compiler. Under Debian you may install `golang` package -;;; (but in Debian 10 Buster it is 1.11 compared to the current 1.14, -;;; so you may consider -;;; [downloading the current version of Go](https://golang.org/dl/)). Otherwise -;;; search for the package for your system or -;;; see [Getting started](https://golang.org/doc/install). - -;;; 3. Install [godef](https://godoc.org/github.com/rogpeppe/godef) -;;; with - -;;; ``` -;;; $ go get github.com/rogpeppe/godef -;;; ``` - -;;; 4. Install [goimports] which can be installed from Debian package -;;; `golang-go.tools` or with - -;;; ``` -;;; $ go get golang.org/x/tools/cmd/goimports -;;; ``` - -;;; 5. Install [gocode](https://github.com/stamblerre/gocode) (a fork -;;; with Go modules support) which can be installed with - -;;; ``` -;;; $ go get -u github.com/stamblerre/gocode -;;; ``` - -;;; 6. Install [guru](https://godoc.org/golang.org/x/tools/cmd/guru) -;;; with - -;;; ``` -;;; $ go get golang.org/x/tools/cmd/guru -;;; ``` - -;;; 7. Add your `$GOPATH/bin` to your `PATH` environment variable (or copy -;;; the `godef`, `goimports`, `gocode`, and `guru` executables from -;;; `$GOPATH/bin` to some directory which is in your `PATH`). - -;;; See also -;;; [Writing Go in Emacs](http://dominik.honnef.co/posts/2013/03/writing_go_in_emacs/) -;;; for more info. - -;;; [company-go]: https://melpa.org/#/company-go -;;; [go-eldoc]: https://melpa.org/#/go-eldoc -;;; [go-guru]: https://melpa.org/#/go-guru diff --git a/straight/versions/default.el b/straight/versions/default.el new file mode 100644 index 0000000..bdb295b --- /dev/null +++ b/straight/versions/default.el @@ -0,0 +1,84 @@ +(("Emacs-D-Mode" . "199743df55c6bfce3cdb08405bd8519768c8dfa9") + ("ace-jump-mode" . "8351e2df4fbbeb2a4003f2fb39f46d33803f3dac") + ("ace-window" . "0577c426a9833ab107bab46c60d1885c611b2fb9") + ("all-the-icons-dired" . "147ed0dfd1034a686795a08dc63e2c293128597e") + ("all-the-icons-ivy-rich" . "328047e1b107baa1f7df3c706000a1ec9e8f51db") + ("all-the-icons.el" . "2c963ebb75f211d2f7ac3d2db5f4a9ee2f3e27da") + ("apropospriate-theme" . "1761bf480cd62859e452ca492b69f09024bb308a") + ("avy" . "ba5f035be33693d1a136a5cbeedb24327f551a92") + ("bui.el" . "f3a137628e112a91910fd33c0cff0948fa58d470") + ("cfrs" . "f3a21f237b2a54e6b9f8a420a9da42b4f0a63121") + ("company-mode" . "5e4cff936ea5e4365b799990e902b4a279f21bb4") + ("ctrlf" . "38b5e94bf718eeea0b880a78ed52926dec89fea9") + ("dap-mode" . "6933fca0b53ea5d2d65a0545e5a4ae6424d32e9b") + ("dart-mode" . "3bac14200f9f8f8fcebc383087572da5c3823c34") + ("dash.el" . "da167c51e9fd167a48d06c7c0ee8e3ac7abd9718") + ("devdocs.el" . "cdc1a7cc3f05235883ffb098fe1c5a8963ed06e2") + ("diff-hl" . "4a08b02afec1fc6b1e84de46cc34f75f6c9c3bcc") + ("dired-hacks" . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") + ("dired-sidebar" . "3635a36f4b4febc8e79e18a0684c8d031adffd92") + ("el-get" . "9353309744e4f8a7c9b1adf22ec99536fb2146b0") + ("elisp-refs" . "8f84280997d8b233d66fb9958a34b46078c58b03") + ("emacs-ansible" . "d89ac0ee57742cca0f0e0a3453d9dcc521575690") + ("emacs-faff-theme" . "f1a1cf6c900cccc2b189d49ed6bc4557cfb1593b") + ("emacs-htmlize" . "dd27bc3f26efd728f2b1f01f9e4ac4f61f2ffbf9") + ("emacs-libvterm" . "a940dd2ee8a82684860e320c0f6d5e15d31d916f") + ("emacs-which-key" . "1217db8c6356659e67b35dedd9f5f260c06f6e99") + ("emacsmirror-mirror" . "641994eed3590a39a778431a16758c2c041963a9") + ("epl" . "78ab7a85c08222cd15582a298a364774e3282ce6") + ("f.el" . "50af874cd19042f17c8686813d52569b1025c76a") + ("flycheck" . "784f184cdd9f9cb4e3dbb997c09d93e954142842") + ("git-messenger" . "eade986ef529aa2dac6944ad61b18de55cee0b76") + ("git-timemachine" . "3381797bcbf906b18dff654a2361032d2d01b4a3") + ("gnu-elpa-mirror" . "b9591336dc6ece42784901c4c00dded50be415fa") + ("go-mode.el" . "3273fcece5d9ab7edd4f15b2d6bce61f4e5a0666") + ("goto-chg" . "278cd3e6d5107693aa2bb33189ca503f22f227d0") + ("helpful" . "67cdd1030b3022d3dc4da2297f55349da57cde01") + ("ht.el" . "c4c1be487d6ecb353d07881526db05d7fc90ea87") + ("hydra" . "9e9e00cb240ea1903ffd36a54956b3902c379d29") + ("ivy-rich" . "600b8183ed0be8668dcc548cc2c8cb94b001363b") + ("ivy-yasnippet" . "83402d91b4eba5307f71884a72df8e11cc6a994e") + ("kotlin-mode" . "3e0c34087ba4965a8bf08d3f27325f0a1e631bfb") + ("let-alist" . "592553db5929b54db40af0df90c5add0aaca045b") + ("lsp-dart" . "40aa90d8ad0ec6d5f9682e135eefb794b675dc9a") + ("lsp-mode" . "ec57aab424b881ead7a8cf7af977ca4db4bc04d8") + ("lsp-treemacs" . "72d367757a89453a712f6ba1df9b6e789ece2bbd") + ("lsp-ui" . "21ce926eedd41ef305c2d89412506ce59b1a7eac") + ("magit" . "10b5407131d4299ca9ed038a23a3a41bcaac14fc") + ("markdown-mode" . "521658eb32e456681592443e04ae507c3a59ed07") + ("melpa" . "144364ae1ab127dd4e630a848741eb561e00ab24") + ("meson-mode" . "1a2e2abb098c9288c2cdb3affbad76edd98abf59") + ("multiple-cursors.el" . "8a60fc7ef0ae6e5ca089a7c95264cd0ae83e7274") + ("pfuture" . "bde5b06795e3e35bfb2bba4c34b538d506a0856e") + ("pkg-info" . "76ba7415480687d05a4353b27fea2ae02b8d9d61") + ("popup-el" . "37a04117ac83b3ed24a2cba894443a32795c2f1a") + ("posframe" . "c91d4d53fa479ceb604071008ce0a901770eff57") + ("prescient.el" . "3dbcef387502d309d130a518a18d48cd2f0e15b7") + ("project" . "4fe1eec8035969d59ab461eb1674343378182a0b") + ("rainbow-mode" . "949166cc0146bc9fabf74ce70c1c4a097f4cffd4") + ("restclient.el" . "9e2cfa86529133eba6c9ef53794be182f15e4c21") + ("rich-minority" . "a03e693f6f9232cf75363aaaf1cb041f21675c19") + ("rust-mode" . "26ecc903c50b2ffd289bbe981f9ad03626fc0057") + ("rustic" . "f4b5c288af2a9833a104bc54850ddabe3996b8be") + ("s.el" . "08661efb075d1c6b4fa812184c1e5e90c08795a9") + ("smart-mode-line" . "abcb0ab6f7110a03d6c7428bae67cf8731496433") + ("smartparens" . "37f77bf2e2199be9fe27e981317b02cfd0e8c70e") + ("spinner" . "34905eae12a236753fa88abc831eff1e41e8576e") + ("straight.el" . "af5437f2afd00936c883124d6d3098721c2d306c") + ("swiper" . "c97ea72285f2428ed61b519269274d27f2b695f9") + ("transient" . "45ef6df3fbc7f4fc87fd0db20b48334f61b521e0") + ("treemacs" . "b18a05b1f62074a40e6011d83cd4c92cbee040dd") + ("typescript.el" . "88f317f0b6aef8f8d232e912fdbc679799580c56") + ("use-package" . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") + ("vala-mode" . "d696a8177e94c81ea557ad364a3b3dcc3abbc50f") + ("web-mode" . "f70277774a725e177774cc81ecbd228792cd6656") + ("windswap" . "1a334f6543e0a30c55ea1e6071e9732d948f9e4b") + ("with-editor" . "f514f23258af67a10fc8e1c431bfe94702b6e65b") + ("ws-butler" . "e3a38d93e01014cd47bf5af4924459bd145fd7c4") + ("xref" . "2cc73a20741be0e6eb698060a0e14f2cdf3953a7") + ("xterm-color" . "1a4012854c69a5cdaeb5a73d2ad705011892fca3") + ("yaml-mode" . "535273d5a1eb76999d20afbcf4d9f056d8ffd2da") + ("yasnippet" . "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6") + ("yasnippet-snippets" . "b7c09f1ad7e1a62da6f6042bfaa2b26d111c7e81") + ("zenburn-emacs" . "cef1e26146c1b8b32fc5ce346f2cfa9861eb67d4")) +:beta