Lot of optimisation, replace eglot with lsp-mode

This commit is contained in:
Zelong Kuang
2026-03-30 11:49:18 +11:00
parent e1374b0e88
commit a3468b833e
24 changed files with 311 additions and 179 deletions

1
.lsp-session-v1 Normal file
View File

@@ -0,0 +1 @@
#s(lsp-session ("/Users/zelongk/.emacs.d" "/Users/zelongk/programming/ocaml" "/Users/zelongk/uni/undergrad/26s1") nil #s(hash-table test equal) #s(hash-table test equal) #s(hash-table test equal))

View File

@@ -1,13 +1,12 @@
;; -*- lexical-binding: t -*- ;; -*- lexical-binding: t -*-
(setq gc-cons-threshold most-positive-fixnum (if noninteractive ; in CLI sessions
gc-cons-percentage 0.6) (setq gc-cons-threshold #x8000000 ; 128MB
;; Backport from 29 (see emacs-mirror/emacs@73a384a98698)
gc-cons-percentage 1.0)
(setq gc-cons-threshold most-positive-fixnum))
;; After init, use gcmh (setq read-process-output-max (* 1024 1024))
(add-hook 'emacs-startup-hook
(lambda ()
(setq gc-cons-threshold #x6400000
gc-cons-percentage 0.1)))
(setq package-enable-at-startup nil) (setq package-enable-at-startup nil)
@@ -18,23 +17,23 @@
(setq use-package-enable-imenu-support t) (setq use-package-enable-imenu-support t)
(setq load-prefer-newer noninteractive) (setq load-prefer-newer noninteractive)
(setenv "LSP_USE_PLISTS" "true")
;; PERF: Many elisp file API calls consult `file-name-handler-alist'.
;; Setting it to nil speeds up startup significantly.
;; We restore it in init.el after startup.
(setq file-name-handler-alist nil)
;; PERF: Reduce file-name operations on `load-path'.
;; No dynamic modules are loaded this early, so we skip .so/.dll search.
;; Also skip .gz to avoid decompression checks.
(setq load-suffixes '(".elc" ".el")
load-file-rep-suffixes '(""))
(prefer-coding-system 'utf-8) (prefer-coding-system 'utf-8)
;; Inhibit resizing frame ;; Inhibit resizing frame
(setq frame-inhibit-implied-resize t) (setq frame-inhibit-implied-resize t)
;; Optimize `auto-mode-alist`
(setq auto-mode-case-fold nil)
(unless (or (daemonp) noninteractive init-file-debug)
;; Temporarily suppress file-handler processing to speed up startup
(let ((default-handlers file-name-handler-alist))
(setq file-name-handler-alist nil)
;; Recover handlers after startup
(add-hook 'emacs-startup-hook
(lambda ()
(setq file-name-handler-alist
(delete-dups (append file-name-handler-alist default-handlers))))
101)))
;; Faster to disable these here (before they've been initialized) ;; Faster to disable these here (before they've been initialized)
(push '(menu-bar-lines . 0) default-frame-alist) (push '(menu-bar-lines . 0) default-frame-alist)
(push '(tool-bar-lines . 0) default-frame-alist) (push '(tool-bar-lines . 0) default-frame-alist)

50
init.el
View File

@@ -2,39 +2,53 @@
;;; Commentary: ;;; Commentary:
;;; blablabla ;;; blablabla
;; Optimize `auto-mode-alist`
(setq auto-mode-case-fold nil)
;; Restore file-name-handler-alist after startup.
(unless (or (daemonp) noninteractive init-file-debug)
;; Temporarily suppress file-handler processing to speed up startup
(let ((default-handlers file-name-handler-alist))
(setq file-name-handler-alist nil)
;; Recover handlers after startup
(add-hook 'emacs-startup-hook
(lambda ()
(setq file-name-handler-alist
(delete-dups (append file-name-handler-alist default-handlers))))
101)))
;; (require 'init-elpaca) ;; (require 'init-elpaca)
(require 'init-straight) (require 'init-straight)
(require 'init-gc) (require 'init-gc)
(require 'init-better-default) (require 'init-better-default)
(require 'init-hydra)
(require 'init-ui) (require 'init-ui)
(require 'init-edit)
(require 'init-completion)
(require 'init-snippet)
(require 'init-bindings)
(require 'init-dired)
;; (require 'init-dashboard) ;; not working ;; (require 'init-dashboard) ;; not working
(require 'init-window)
(require 'init-shell)
;; (require 'init-treemacs) ;; not working
(require 'init-workspace)
;; (require 'init-god) ;; (require 'init-god)
;; (require 'init-meow) ;; (require 'init-meow)
(require 'init-hydra)
(require 'init-utils)
(require 'init-completion)
(require 'init-input) (require 'init-input)
(require 'init-edit) (require 'init-utils)
(require 'init-window)
(require 'init-bindings)
(require 'init-dired)
(require 'init-llm)
(require 'init-snippet)
(require 'init-coding) (require 'init-coding)
(require 'init-vcs) (require 'init-vcs)
(require 'init-shell) (require 'init-llm)
(require 'init-check) (require 'init-check)
;; (require 'init-treemacs) ;; not working
(require 'init-eglot) ;; (require 'init-eglot)
;; (require 'init-lsp) ;; not working (require 'init-lsp)
(require 'init-org) (require 'init-org)
(require 'init-tex) (require 'init-tex)
@@ -46,8 +60,6 @@
(require 'init-rust) (require 'init-rust)
(require 'init-ocaml) (require 'init-ocaml)
(require 'init-workspace)
(provide 'init) (provide 'init)
;;; Code: ;;; Code:
;;; alskdjasd ;;; alskdjasd

View File

@@ -1,5 +1,12 @@
;; -*- lexical-binding: t -*- ;; -*- lexical-binding: t -*-
(use-package benchmark-init
:demand t
:config
;; To disable collection of benchmark data after init is done.
;; (add-hook 'emacs-startup-hook 'benchmark-init/deactivate)
)
;; Load some component of large package (org, magit etc.) before complete mount ;; Load some component of large package (org, magit etc.) before complete mount
(defvar elemacs-incremental-packages '(t) (defvar elemacs-incremental-packages '(t)
"A list of packages to load incrementally after startup. Any large packages "A list of packages to load incrementally after startup. Any large packages
@@ -77,27 +84,28 @@ If this is a daemon session, load them all immediately instead."
(add-hook 'emacs-startup-hook #'elemacs-load-packages-incrementally-h) (add-hook 'emacs-startup-hook #'elemacs-load-packages-incrementally-h)
(use-package benchmark-init
:demand t
:config
;; To disable collection of benchmark data after init is done.
(add-hook 'after-init-hook 'benchmark-init/deactivate))
(when (memq window-system '(mac ns x)) (when (memq window-system '(mac ns x))
(use-package exec-path-from-shell (use-package exec-path-from-shell
:commands exec-path-from-shell-initialize
:init :init
(setq exec-path-from-shell-arguments '("-l"))
(exec-path-from-shell-initialize))) (exec-path-from-shell-initialize)))
(setq custom-file (expand-file-name "~/.emacs.d/custom.el")) (setq custom-file (expand-file-name "~/.emacs.d/custom.el"))
(add-hook 'after-init-hook (lambda () (load custom-file 'no-error 'no-message))) (add-hook 'after-init-hook (lambda () (load custom-file 'no-error 'no-message)))
;; Start server
(use-package server (use-package server
:ensure nil :hook (emacs-startup . (lambda ()
:hook (after-init . server-mode)) (unless server-mode
(server-mode 1)))))
;; Save place
(use-package saveplace
:hook (after-init . save-place-mode))
(use-package display-line-numbers (use-package display-line-numbers
:ensure nil :straight nil
:hook (text-mode . display-line-numbers-mode) :hook (text-mode . display-line-numbers-mode)
:hook (prog-mode . display-line-numbers-mode) :hook (prog-mode . display-line-numbers-mode)
:config :config
@@ -111,42 +119,48 @@ If this is a daemon session, load them all immediately instead."
(add-hook mode (lambda () (display-line-numbers-mode -1)))) (add-hook mode (lambda () (display-line-numbers-mode -1))))
(setq display-line-numbers-type 'relative) (setq display-line-numbers-type 'relative)
) )
(use-package del-trailing-white
(add-hook 'prog-mode #'delete-trailing-whitespace-mode) :straight nil
(add-hook 'text-mode #'delete-trailing-whitespace-mode) :hook ((prog-mode markdown-mode conf-mode) . enable-trailing-whitespace)
:init
(setq-default show-trailing-whitespace nil)
(defun enable-trailing-whitespace ()
"Show trailing spaces and delete on saving."
(setq show-trailing-whitespace t)
(add-hook 'before-save-hook #'delete-trailing-whitespace nil t))
)
(use-package subword (use-package subword
:ensure nil :straight nil
:diminish :diminish
:hook (prog-mode minibuffer-setup)) :hook (prog-mode minibuffer-setup))
(use-package paren (use-package paren
:ensure nil :straight nil
:hook (after-init . show-paren-mode)) :hook (after-init . show-paren-mode))
;; Show trailing whitespace only in prog-mode and text-mode ;; ;; Show trailing whitespace only in prog-mode and text-mode
(add-hook 'prog-mode-hook (lambda () (setq show-trailing-whitespace t))) ;; (add-hook 'prog-mode-hook (lambda () (setq show-trailing-whitespace t)))
(add-hook 'text-mode-hook (lambda () (setq show-trailing-whitespace t))) ;; (add-hook 'text-mode-hook (lambda () (setq show-trailing-whitespace t)))
(use-package recentf (use-package recentf
:ensure nil :straight nil
:hook (after-init . recentf-mode) :hook (after-init . recentf-mode)
:custom :init
(recentf-max-saved-items 500) (setq recentf-max-saved-items 500
(recentf-exclude recentf-exclude
'("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks" '("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks"
"\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$" "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$"
"\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/" "\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/"
"^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/" "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/"
(lambda (file) (file-in-directory-p file package-user-dir)))) (lambda (file) (file-in-directory-p file package-user-dir))))
:config :config
(elemacs-load-packages-incrementally '(easymenu tree-widget timer))
(push (expand-file-name recentf-save-file) recentf-exclude) (push (expand-file-name recentf-save-file) recentf-exclude)
(add-to-list 'recentf-filename-handlers #'abbreviate-file-name) (add-to-list 'recentf-filename-handlers #'abbreviate-file-name)
) )
(use-package savehist (use-package savehist
:ensure nil :straight nil
:hook (after-init . savehist-mode) :hook (after-init . savehist-mode)
:init (setq enable-recursive-minibuffers t ; Allow commands in minibuffers :init (setq enable-recursive-minibuffers t ; Allow commands in minibuffers
history-length 1000 history-length 1000
@@ -158,6 +172,7 @@ If this is a daemon session, load them all immediately instead."
savehist-autosave-interval 300)) savehist-autosave-interval 300))
(setq-default cursor-type 'bar) (setq-default cursor-type 'bar)
(setq kill-whole-line t)
(setq make-backup-files nil) (setq make-backup-files nil)
(setq use-short-answers t) (setq use-short-answers t)
;; (setq frame-title-format "\n") ;; (setq frame-title-format "\n")
@@ -239,6 +254,10 @@ If this is a daemon session, load them all immediately instead."
(lambda (button) (lambda (button)
(helpful-variable (button-get button 'apropos-symbol)))))))) (helpful-variable (button-get button 'apropos-symbol))))))))
(setq delete-by-moving-to-trash t
inhibit-compacting-font-caches t
make-backup-files nil)
(setq-default auto-save-default nil) (setq-default auto-save-default nil)
(setq create-lockfiles nil) (setq create-lockfiles nil)
;; (setq auto-save-file-name-transforms ;; (setq auto-save-file-name-transforms

View File

@@ -15,4 +15,23 @@
(global-set-key (kbd "C-c C-c") #'compile) (global-set-key (kbd "C-c C-c") #'compile)
(defun delete-this-file ()
"Delete the current file, and kill the buffer."
(interactive)
(unless (buffer-file-name)
(error "No file is currently being edited"))
(when (yes-or-no-p (format "Really delete '%s'?"
(file-name-nondirectory buffer-file-name)))
(delete-file (buffer-file-name))
(kill-this-buffer)))
(defun reload-init-file ()
"Reload Emacs configurations."
(interactive)
(load user-init-file))
(bind-keys ("s-r" . revert-buffer-quick)
("C-x K" . delete-this-file)
("C-c C-l" . reload-init-file))
(provide 'init-bindings) (provide 'init-bindings)

View File

@@ -1,13 +1,13 @@
;; -*- lexical-binding: t; -*- ;; -*- lexical-binding: t; -*-
(use-package cc-mode (use-package cc-mode
:ensure nil :straight nil
:init (setq-default c-basic-offset 2)) :init (setq-default c-basic-offset 2))
(when (treesit-available-p) (when (treesit-available-p)
(use-package c-ts-mode (use-package c-ts-mode
:ensure nil :straight nil
:functions treesit-available-p :functions treesit-available-p
:init :init
(setq c-ts-mode-indent-offset 2) (setq c-ts-mode-indent-offset 2)
@@ -19,10 +19,10 @@
(add-to-list 'major-mode-remap-alist (add-to-list 'major-mode-remap-alist
'(c-or-c++-mode . c-or-c++-ts-mode))))) '(c-or-c++-mode . c-or-c++-ts-mode)))))
(with-eval-after-load 'eglot ;; (with-eval-after-load 'eglot
(add-hook 'c-ts-mode-hook #'eglot-ensure) ;; (add-hook 'c-ts-mode-hook #'eglot-ensure)
(add-hook 'c++-ts-mode-hook #'eglot-ensure) ;; (add-hook 'c++-ts-mode-hook #'eglot-ensure)
(add-to-list 'eglot-server-programs '((c++-mode c-mode) "clangd"))) ;; (add-to-list 'eglot-server-programs '((c++-mode c-mode) "clangd")))
(provide 'init-cc) (provide 'init-cc)

View File

@@ -64,7 +64,7 @@
;; :hook (vertico-mode . vertico-posframe-mode)) ;; :hook (vertico-mode . vertico-posframe-mode))
(use-package vertico-multiform (use-package vertico-multiform
:ensure nil :straight nil
:hook (vertico-mode . vertico-multiform-mode) :hook (vertico-mode . vertico-multiform-mode)
:config :config
(defvar +vertico-transform-functions nil) (defvar +vertico-transform-functions nil)
@@ -258,7 +258,7 @@
;; A few more useful configurations... ;; A few more useful configurations...
(use-package emacs (use-package emacs
:ensure nil :straight nil
:custom :custom
;; TAB cycle if there are only few candidates ;; TAB cycle if there are only few candidates
;; (completion-cycle-threshold 3) ;; (completion-cycle-threshold 3)
@@ -290,8 +290,8 @@
(advice-add 'lsp-completion-at-point :around #'cape-wrap-noninterruptible) (advice-add 'lsp-completion-at-point :around #'cape-wrap-noninterruptible)
(advice-add 'lsp-completion-at-point :around #'cape-wrap-nonexclusive) (advice-add 'lsp-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'comint-completion-at-point :around #'cape-wrap-nonexclusive) (advice-add 'comint-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'eglot-completion-at-point :around #'cape-wrap-buster) ;; (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
(advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive) ;; (advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'pcomplete-completions-at-point :around #'cape-wrap-nonexclusive)) (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-nonexclusive))
;; (use-package yasnippet-capf ;; (use-package yasnippet-capf

View File

@@ -1,7 +1,7 @@
;; -*- lexical-binding: t -*- ;; -*- lexical-binding: t -*-
(use-package dired (use-package dired
:ensure nil :straight nil
:bind (:map dired-mode-map :bind (:map dired-mode-map
("C-c C-p" . wdired-change-to-wdired-mode) ("C-c C-p" . wdired-change-to-wdired-mode)
("b" . dired-up-directory)) ("b" . dired-up-directory))

View File

@@ -30,33 +30,31 @@
;; Don't do square-bracket space-expansion where it doesn't make sense to ;; Don't do square-bracket space-expansion where it doesn't make sense to
(sp-local-pair '(emacs-lisp-mode org-mode markdown-mode markdown-ts-mode gfm-mode) (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode markdown-ts-mode gfm-mode)
"[" nil :post-handlers '(:rem ("| " "SPC"))) "[" nil :post-handlers '(:rem ("| " "SPC"))))
;; resolve conflict with hungry-delete
(defadvice hungry-delete-backward (before sp-delete-pair-advice activate) (save-match-data (sp-delete-pair (ad-get-arg 0)))))
;; Hungry deletion ;; ;; Hungry deletion
(use-package hungry-delete ;; (use-package hungry-delete
:diminish ;; :diminish
:hook (after-init . global-hungry-delete-mode) ;; :hook (after-init . global-hungry-delete-mode)
:init (setq hungry-delete-chars-to-skip " \t\f\v" ;; :init (setq hungry-delete-chars-to-skip " \t\f\v"
hungry-delete-except-modes ;; hungry-delete-except-modes
'(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode))) ;; '(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode)))
(use-package abbrev (use-package abbrev
:ensure nil :straight nil
:diminish :diminish
:config :config
(setq-default abbrev-mode t) (setq-default abbrev-mode t)
(setq abbrev-file-name (expand-file-name "abbrev.el" user-emacs-directory))) (setq abbrev-file-name (expand-file-name "abbrev.el" user-emacs-directory)))
(use-package autorevert (use-package autorevert
:ensure nil :straight nil
:diminish :diminish
:hook (after-init . global-auto-revert-mode)) :hook (after-init . global-auto-revert-mode))
(use-package goto-addr (use-package goto-addr
:ensure nil :straight nil
:hook ((text-mode . goto-address-mode) :hook ((text-mode . goto-address-mode)
(prog-mode . goto-address-prog-mode))) (prog-mode . goto-address-prog-mode)))
@@ -123,7 +121,7 @@
;; Process ;; Process
(use-package proced (use-package proced
:ensure nil :straight nil
:init :init
(setq-default proced-format 'verbose) (setq-default proced-format 'verbose)
(setq proced-auto-update-flag t (setq proced-auto-update-flag t

View File

@@ -25,10 +25,12 @@
:config (eglot-booster-mode)) :config (eglot-booster-mode))
(use-package flycheck-eglot (use-package flycheck-eglot
:after eglot
:hook (eglot-managed-mode . flycheck-eglot-mode)) :hook (eglot-managed-mode . flycheck-eglot-mode))
(use-package consult-eglot (use-package consult-eglot
:after consult eglot :after consult
:after eglot
:bind (:map eglot-mode-map :bind (:map eglot-mode-map
([remap xref-find-apropos] . consult-eglot-symbols)) ([remap xref-find-apropos] . consult-eglot-symbols))
:config :config
@@ -38,10 +40,12 @@
;; :hook (eglot-managed-mode . eldoc-box-hover-at-point-mode)) ;; :hook (eglot-managed-mode . eldoc-box-hover-at-point-mode))
(use-package eldoc (use-package eldoc
:ensure nil :after eglot
:straight nil
:diminish) :diminish)
(use-package eldoc-mouse (use-package eldoc-mouse
:after eldoc
:diminish :diminish
:hook eldoc-mode) :hook eldoc-mode)

View File

@@ -3,10 +3,10 @@
(use-package gcmh (use-package gcmh
:diminish :diminish
:straight (:wait t) ;; what does this do in elpaca :hook (emacs-startup . gcmh-mode)
:init
(gcmh-mode 1)
:config :config
(setq gcmh-high-cons-threshold #x6400000)) (setq gcmh-high-cons-threshold #x4000000
gcmh-idle-delay 'auto
gcmh-auto-idle-delay-factor 10))
(provide 'init-gc) (provide 'init-gc)

View File

@@ -12,8 +12,7 @@
:config :config
(setq haskell-process-suggest-remove-import-lines t (setq haskell-process-suggest-remove-import-lines t
haskell-process-auto-import-loaded-modules t) haskell-process-auto-import-loaded-modules t)
(add-to-list 'completion-ignored-extensions ".hi") (add-to-list 'completion-ignored-extensions ".hi"))
(add-hook 'haskell-mode-hook #'eglot-ensure))
(provide 'init-haskell) (provide 'init-haskell)

View File

@@ -1,8 +1,14 @@
;; -*- lexical-binding: t; -*- ;; -*- lexical-binding: t; -*-
;; LSP booster
(use-package lsp-mode (use-package lsp-mode
:diminish :diminish
:defines (lsp-diagnostics-disabled-modes lsp-clients-python-library-directories)
:autoload lsp-enable-which-key-integration :autoload lsp-enable-which-key-integration
:commands (lsp-format-buffer lsp-organize-imports lsp lsp-deferred)
:hook ((prog-mode . (lambda () :hook ((prog-mode . (lambda ()
(unless (derived-mode-p (unless (derived-mode-p
'emacs-lisp-mode 'lisp-mode 'emacs-lisp-mode 'lisp-mode
@@ -12,7 +18,9 @@
((markdown-mode yaml-mode yaml-ts-mode) . lsp-deferred) ((markdown-mode yaml-mode yaml-ts-mode) . lsp-deferred)
(lsp-mode . (lambda () (lsp-mode . (lambda ()
;; Integrate `which-key' ;; Integrate `which-key'
(lsp-enable-which-key-integration)))) (lsp-enable-which-key-integration)
(add-hook 'before-save-hook #'lsp-format-buffer t t)
(add-hook 'before-save-hook #'lsp-organize-imports t t))))
:bind (:map lsp-mode-map :bind (:map lsp-mode-map
("C-c c d" . lsp-describe-thing-at-point) ("C-c c d" . lsp-describe-thing-at-point)
([remap xref-find-definitions] . lsp-find-definition) ([remap xref-find-definitions] . lsp-find-definition)
@@ -20,6 +28,9 @@
:init (setq lsp-use-plists t :init (setq lsp-use-plists t
lsp-log-io nil lsp-log-io nil
lsp-enable-suggest-server-download t
;; lsp-auto-configure t
lsp-keymap-prefix "C-c c" lsp-keymap-prefix "C-c c"
lsp-keep-workspace-alive nil lsp-keep-workspace-alive nil
lsp-signature-auto-activate nil lsp-signature-auto-activate nil
@@ -27,6 +38,12 @@
lsp-modeline-diagnostics-enable nil lsp-modeline-diagnostics-enable nil
lsp-modeline-workspace-status-enable nil lsp-modeline-workspace-status-enable nil
lsp-completion-enable t
lsp-completion-provider :none ;; using corfu
lsp-completion-enable-additional-text-edit t
lsp-enable-snippet t
lsp-completion-show-kind t
lsp-semantic-tokens-enable t lsp-semantic-tokens-enable t
lsp-progress-spinner-type 'progress-bar-filled lsp-progress-spinner-type 'progress-bar-filled
@@ -34,15 +51,33 @@
lsp-enable-folding nil lsp-enable-folding nil
lsp-enable-symbol-highlighting nil lsp-enable-symbol-highlighting nil
lsp-enable-text-document-color nil lsp-enable-text-document-color nil
lsp-enable-imenu t
lsp-enable-indentation nil lsp-enable-indentation nil
lsp-enable-on-type-formatting nil) lsp-enable-on-type-formatting nil
;; For diagnostics
lsp-diagnostics-disabled-modes '(markdown-mode gfm-mode))
:config :config
(use-package consult-lsp (use-package consult-lsp
:bind (:map lsp-mode-map :bind (:map lsp-mode-map
("C-M-." . consult-lsp-symbols))) ("C-M-." . consult-lsp-symbols)))
(with-no-warnings
;; Disable `lsp-mode' in `git-timemachine-mode'
(defun my/lsp--init-if-visible (fn &rest args)
(unless (bound-and-true-p git-timemachine-mode)
(apply fn args)))
(advice-add #'lsp--init-if-visible :around #'my/lsp--init-if-visible))
;; Enable `lsp-mode' in sh/bash/zsh
(defun my/lsp-bash-check-sh-shell (&rest _)
(and (memq major-mode '(sh-mode bash-ts-mode))
(memq sh-shell '(sh bash zsh))))
(advice-add #'lsp-bash-check-sh-shell :override #'my/lsp-bash-check-sh-shell)
(add-to-list 'lsp-language-id-configuration '(bash-ts-mode . "shellscript"))
(use-package lsp-ui (use-package lsp-ui
:custom-face :custom-face
(lsp-ui-sideline-code-action ((t (:inherit warning)))) (lsp-ui-sideline-code-action ((t (:inherit warning))))
@@ -115,33 +150,39 @@
,(face-foreground 'font-lock-constant-face) ,(face-foreground 'font-lock-constant-face)
,(face-foreground 'font-lock-variable-name-face)))) ,(face-foreground 'font-lock-variable-name-face))))
(use-package lsp-pyright :preface
:functions lsp-pyright-format-buffer (defun lsp-booster--advice-json-parse (old-fn &rest args)
:hook (((python-mode python-ts-mode) . (lambda () "Try to parse bytecode instead of json."
(require 'lsp-pyright) (or
(add-hook 'after-save-hook #'lsp-pyright-format-buffer t t)))) (when (equal (following-char) ?#)
:init (let ((bytecode (read (current-buffer))))
;; (when (executable-find "python3") (when (byte-code-function-p bytecode)
;; (setq lsp-pyright-python-executable-cmd "python3")) (funcall bytecode))))
(apply old-fn args)))
(advice-add (if (progn (require 'json)
(fboundp 'json-parse-buffer))
'json-parse-buffer
'json-read)
:around
#'lsp-booster--advice-json-parse)
(defun lsp-pyright-format-buffer () (defun lsp-booster--advice-final-command (old-fn cmd &optional test?)
"Use `yapf' to format the buffer." "Prepend emacs-lsp-booster command to lsp CMD."
(interactive) (let ((orig-result (funcall old-fn cmd test?)))
(when (and (executable-find "yapf") buffer-file-name) (if (and (not test?) ;; for check lsp-server-present?
(call-process "yapf" nil nil nil "-i" buffer-file-name)))) (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper
lsp-use-plists
(not (functionp 'json-rpc-connection)) ;; native json-rpc
(executable-find "emacs-lsp-booster"))
(progn
(when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH)
(setcar orig-result command-from-exec-path))
(message "Using emacs-lsp-booster for %s!" orig-result)
(cons "emacs-lsp-booster" orig-result))
orig-result)))
(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)
(use-package ccls )
:hook ((c-mode c++-mode objc-mode cuda-mode) . (lambda () (require 'ccls)))
:config
(with-no-warnings
;; FIXME: fail to call ccls.xref
;; @see https://github.com/emacs-lsp/emacs-ccls/issues/109
(cl-defmethod my-lsp-execute-command
((_server (eql ccls)) (command (eql ccls.xref)) arguments)
(when-let* ((xrefs (lsp--locations-to-xref-items
(lsp--send-execute-command (symbol-name command) arguments))))
(xref--show-xrefs xrefs nil)))
(advice-add #'lsp-execute-command :override #'my-lsp-execute-command))))
(provide 'init-lsp) (provide 'init-lsp)

View File

@@ -8,15 +8,6 @@
(setq tuareg-prettify-symbols-full t) (setq tuareg-prettify-symbols-full t)
(add-hook 'tuareg-mode-hook (lambda () ))) (add-hook 'tuareg-mode-hook (lambda () )))
(use-package ocaml-eglot
:straight t
:after tuareg
:hook (tuareg-mode . ocaml-eglot)
:hook (ocaml-eglot . eglot-ensure)
:config
(setq ocaml-eglot-syntax-checker 'flycheck))
(use-package dune) (use-package dune)
(use-package opam-switch-mode (use-package opam-switch-mode
@@ -25,10 +16,19 @@
(setq tuareg-opam-insinuate t)) (setq tuareg-opam-insinuate t))
(use-package ocp-indent (use-package ocp-indent
:hook (ocaml-eglot . ocp-setup-indent)) :hook (tuareg-mode . ocp-setup-indent))
(use-package utop) (use-package utop)
;; (use-package ocaml-eglot
;; :straight t
;; :after tuareg
;; :hook (tuareg-mode . ocaml-eglot)
;; :hook (ocaml-eglot . eglot-ensure)
;; :config
;; (setq ocaml-eglot-syntax-checker 'flycheck))
;; (use-package merlin ;; (use-package merlin
;; :hook (tuareg-mode . +ocaml-init-merlin) ;; :hook (tuareg-mode . +ocaml-init-merlin)
;; :init ;; :init
@@ -41,7 +41,7 @@
;; (use-package merlin-eldoc ;; (use-package merlin-eldoc
;; :hook (merlin-mode . merlin-eldoc-setup)) ;; :hook (merlin-mode . merlin-eldoc-setup))
;; (use-package flycheck-ocaml) (use-package flycheck-ocaml)

View File

@@ -214,7 +214,7 @@ the element after the #+HEADER: tag."
(yas-activate-extra-mode 'LaTeX-mode))) (yas-activate-extra-mode 'LaTeX-mode)))
(use-package org-latex-preview (use-package org-latex-preview
:ensure nil :straight nil
:hook (org-mode . org-latex-preview-mode) :hook (org-mode . org-latex-preview-mode)
:hook (org-latex-preview-mode . org-latex-preview-center-mode) :hook (org-latex-preview-mode . org-latex-preview-center-mode)
:config :config
@@ -327,4 +327,40 @@ the element after the #+HEADER: tag."
:config :config
(use-package djvu)) (use-package djvu))
;; Enable lsp in org-babel
(cl-defmacro lsp-org-babel-enable (lang)
"Support LANG in org source code block."
(cl-check-type lang string)
(let* ((edit-pre (intern (format "org-babel-edit-prep:%s" lang)))
(intern-pre (intern (format "lsp--%s" (symbol-name edit-pre)))))
`(progn
(defun ,intern-pre (info)
(setq buffer-file-name (or (->> info caddr (alist-get :file))
"org-src-babel.tmp"))
(when (fboundp 'lsp-deferred)
;; Avoid headerline conflicts
(setq-local lsp-headerline-breadcrumb-enable nil)
(lsp-deferred)
(_
(user-error "LSP:: invalid type"))))
(put ',intern-pre 'function-documentation
(format "Enable lsp-mode in the buffer of org source block (%s)."
(upcase ,lang)))
(if (fboundp ',edit-pre)
(advice-add ',edit-pre :after ',intern-pre)
(progn
(defun ,edit-pre (info)
(,intern-pre info))
(put ',edit-pre 'function-documentation
(format "Prepare local buffer environment for org source block (%s)."
(upcase ,lang))))))))
(defconst org-babel-lang-list
'("go" "python" "ipython" "ruby" "js" "css" "sass" "c" "rust" "java" "cpp" "c++" "shell")
"The supported programming languages for interactive Babel.")
(dolist (lang org-babel-lang-list)
(eval `(lsp-org-babel-enable ,lang)))
(provide 'init-org) (provide 'init-org)

View File

@@ -3,7 +3,7 @@
;; Python Mode ;; Python Mode
;; Install: pip install pyflakes autopep8 ;; Install: pip install pyflakes autopep8
(use-package python (use-package python
:ensure nil :straight nil
:functions exec-path-from-shell-copy-env :functions exec-path-from-shell-copy-env
:hook (inferior-python-mode . (lambda () :hook (inferior-python-mode . (lambda ()
(process-query-on-exit-flag (process-query-on-exit-flag
@@ -23,9 +23,9 @@
(with-eval-after-load 'exec-path-from-shell (with-eval-after-load 'exec-path-from-shell
(exec-path-from-shell-copy-env "PYTHONPATH"))) (exec-path-from-shell-copy-env "PYTHONPATH")))
(with-eval-after-load 'eglot ;; (with-eval-after-load 'eglot
(add-hook 'python-ts-mode-hook #'eglot-ensure) ;; (add-hook 'python-ts-mode-hook #'eglot-ensure)
(add-to-list 'eglot-server-programs '((python-mode python-ts-mode) . ("pyright-langserver" "--stdio")))) ;; (add-to-list 'eglot-server-programs '((python-mode python-ts-mode) . ("pyright-langserver" "--stdio"))))
(provide 'init-python) (provide 'init-python)

View File

@@ -1,7 +1,7 @@
;; -*- lexical-binding: t; -*- ;; -*- lexical-binding: t; -*-
(use-package shell (use-package shell
:ensure nil :straight nil
:hook ((shell-mode . my/shell-mode-hook) :hook ((shell-mode . my/shell-mode-hook)
(comint-output-filter-functions . comint-strip-ctrl-m)) (comint-output-filter-functions . comint-strip-ctrl-m))
:init :init

View File

@@ -9,7 +9,7 @@
:config :config
(elemacs-load-packages-incrementally '(eldoc easymenu help-mode)) (elemacs-load-packages-incrementally '(eldoc easymenu help-mode))
(use-package warnings (use-package warnings
:ensure nil :straight nil
:config :config
(cl-pushnew '(yasnippet backquote-change) (cl-pushnew '(yasnippet backquote-change)
warning-suppress-types warning-suppress-types

View File

@@ -9,6 +9,7 @@
:hook (LaTeX-mode . prettify-symbols-mode) :hook (LaTeX-mode . prettify-symbols-mode)
:hook (LaTeX-mode . visual-line-mode) :hook (LaTeX-mode . visual-line-mode)
:hook (LaTeX-mode . turn-on-reftex) :hook (LaTeX-mode . turn-on-reftex)
:hook (LaTeX-mode . lsp-deferred)
:bind (:map LaTeX-mode-map :bind (:map LaTeX-mode-map
("C-S-e" . latex-math-from-calc) ("C-S-e" . latex-math-from-calc)
("C-c x" . TeX-clean) ("C-c x" . TeX-clean)
@@ -26,13 +27,16 @@
(TeX-show-compilation nil) (TeX-show-compilation nil)
(TeX-command-extra-options "-shell-escape") (TeX-command-extra-options "-shell-escape")
(TeX-view-program-selection '((output-pdf "displayline"))) (TeX-view-program-selection '((output-pdf "displayline")))
(LaTeX-indent-level 0)
(LaTeX-item-indent 0)
(TeX-newline-function 'newline)
:config :config
(add-hook 'LaTeX-mode-hook '(lambda () (add-hook 'LaTeX-mode-hook '(lambda ()
(setq TeX-command-default "LaTeXMk"))) (setq TeX-command-default "LaTeXMk")))
;; Format math as a Latex string with Calc ;; Format math as a Latex string with Calc
(add-hook 'LaTeX-mode-hook #'eglot-ensure) ;; (add-hook 'LaTeX-mode-hook #'eglot-ensure)
(setq-default LaTeX-indent-environment-list nil) (setq-default LaTeX-indent-environment-list nil)
@@ -56,11 +60,10 @@
;; (setq TeX-view-program-selection '((output-pdf "PDF Tools"))) ;; (setq TeX-view-program-selection '((output-pdf "PDF Tools")))
;; (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) ;; (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
(setq reftex-plug-into-AUCTeX t) ;; (with-eval-after-load 'eglot
;; (add-to-list 'eglot-server-programs '((LaTeX-mode latex-mode) "texlab")))
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs '((LaTeX-mode latex-mode) "texlab"))))
(setq reftex-plug-into-AUCTeX t))
(use-package cdlatex (use-package cdlatex
:diminish :diminish

View File

@@ -3,20 +3,19 @@
(use-package typst-ts-mode (use-package typst-ts-mode
:straight (:type git :host codeberg :repo "meow_king/typst-ts-mode") :straight (:type git :host codeberg :repo "meow_king/typst-ts-mode")
:hook (typst-ts-mode . eglot-ensure)
:custom :custom
;; (typst-ts-watch-options "--open") ;; (typst-ts-watch-options "--open")
(typst-ts-mode-grammar-location (expand-file-name "tree-sitter/libtree-sitter-typst.so" user-emacs-directory)) (typst-ts-mode-grammar-location (expand-file-name "tree-sitter/libtree-sitter-typst.so" user-emacs-directory))
(typst-ts-mode-enable-raw-blocks-highlight t) (typst-ts-mode-enable-raw-blocks-highlight t)
:config :config
(keymap-set typst-ts-mode-map "C-c C-c" #'typst-ts-tmenu) (keymap-set typst-ts-mode-map "C-c C-c" #'typst-ts-tmenu)
(with-eval-after-load 'eglot ;; (with-eval-after-load 'eglot
(with-eval-after-load 'typst-ts-mode ;; (with-eval-after-load 'typst-ts-mode
(add-to-list 'eglot-server-programs ;; (add-to-list 'eglot-server-programs
`((typst-ts-mode) . ;; `((typst-ts-mode) .
,(eglot-alternatives `(,typst-ts-lsp-download-path ;; ,(eglot-alternatives `(,typst-ts-lsp-download-path
"tinymist" ;; "tinymist"
"typst-lsp")))))) ;; "typst-lsp"))))))
(setq typst-ts-preview-function 'find-file-other-window)) (setq typst-ts-preview-function 'find-file-other-window))
(use-package typst-preview (use-package typst-preview

View File

@@ -28,7 +28,6 @@
(add-to-list 'default-frame-alist '(undecorated-round . t)) (add-to-list 'default-frame-alist '(undecorated-round . t))
(use-package solaire-mode (use-package solaire-mode
:ensure nil
:hook (after-init . solaire-global-mode)) :hook (after-init . solaire-global-mode))
(use-package modus-themes (use-package modus-themes
@@ -105,17 +104,20 @@
:hook text-mode :hook text-mode
:hook prog-mode) :hook prog-mode)
(use-package doom-modeline (use-package mood-line
:hook (after-init . doom-modeline-mode) :hook emacs-startup)
:config
(setq doom-modeline-support-imenu t ;; (use-package doom-modeline
doom-modeline-height 30 ;; :hook (after-init . doom-modeline-mode)
doom-modeline-buffer-file-name-style 'relative-from-project ;; :config
doom-modeline-enable-word-count t ;; (setq doom-modeline-support-imenu t
;; doom-modeline-project-name t ;; doom-modeline-height 30
doom-modeline-check 'simple ;; doom-modeline-buffer-file-name-style 'relative-from-project
doom-modeline-buffer-encoding nil ;; doom-modeline-enable-word-count t
doom-modeline-major-mode-icon nil)) ;; ;; doom-modeline-project-name t
;; doom-modeline-check 'simple
;; doom-modeline-buffer-encoding nil
;; doom-modeline-major-mode-icon nil))
(use-package hide-mode-line (use-package hide-mode-line
:autoload turn-off-hide-mode-line-mode :autoload turn-off-hide-mode-line-mode

View File

@@ -29,7 +29,7 @@
(which-key-add-key-based-replacements "C-x v" "version control")) (which-key-add-key-based-replacements "C-x v" "version control"))
(use-package grep (use-package grep
:ensure nil :straight nil
:autoload grep-apply-setting :autoload grep-apply-setting
:init :init
(when (executable-find "rg") (when (executable-find "rg")

View File

@@ -49,7 +49,7 @@
(user-error "Cannot revert the timemachine buffer")))))) (user-error "Cannot revert the timemachine buffer"))))))
(use-package smerge-mode (use-package smerge-mode
:ensure nil :straight nil
:diminish :diminish
:pretty-hydra :pretty-hydra
((:title (pretty-hydra-title "Smerge" 'octicon "nf-oct-diff") ((:title (pretty-hydra-title "Smerge" 'octicon "nf-oct-diff")

View File

@@ -2,7 +2,7 @@
;; Restore old window configurations ;; Restore old window configurations
(use-package winner (use-package winner
:ensure nil :straight nil
:commands (winner-undo winner-redo) :commands (winner-undo winner-redo)
:hook after-init :hook after-init
:init (setq winner-boring-buffers '("*Completions*" :init (setq winner-boring-buffers '("*Completions*"