diff --git a/.lsp-session-v1 b/.lsp-session-v1 new file mode 100644 index 0000000..621bb99 --- /dev/null +++ b/.lsp-session-v1 @@ -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)) \ No newline at end of file diff --git a/early-init.el b/early-init.el index 0dbef17..4ff6b73 100644 --- a/early-init.el +++ b/early-init.el @@ -1,13 +1,12 @@ ;; -*- lexical-binding: t -*- -(setq gc-cons-threshold most-positive-fixnum - gc-cons-percentage 0.6) +(if noninteractive ; in CLI sessions + (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 -(add-hook 'emacs-startup-hook - (lambda () - (setq gc-cons-threshold #x6400000 - gc-cons-percentage 0.1))) +(setq read-process-output-max (* 1024 1024)) (setq package-enable-at-startup nil) @@ -18,23 +17,23 @@ (setq use-package-enable-imenu-support t) (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) ;; Inhibit resizing frame (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) (push '(menu-bar-lines . 0) default-frame-alist) (push '(tool-bar-lines . 0) default-frame-alist) diff --git a/init.el b/init.el index 44aded1..077da40 100644 --- a/init.el +++ b/init.el @@ -2,39 +2,53 @@ ;;; Commentary: ;;; 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-straight) (require 'init-gc) (require 'init-better-default) +(require 'init-hydra) + (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-window) +(require 'init-shell) +;; (require 'init-treemacs) ;; not working +(require 'init-workspace) ;; (require 'init-god) ;; (require 'init-meow) -(require 'init-hydra) - -(require 'init-utils) -(require 'init-completion) (require 'init-input) -(require 'init-edit) -(require 'init-window) +(require 'init-utils) -(require 'init-bindings) - -(require 'init-dired) - -(require 'init-llm) - -(require 'init-snippet) (require 'init-coding) (require 'init-vcs) -(require 'init-shell) +(require 'init-llm) (require 'init-check) -;; (require 'init-treemacs) ;; not working -(require 'init-eglot) -;; (require 'init-lsp) ;; not working +;; (require 'init-eglot) +(require 'init-lsp) (require 'init-org) (require 'init-tex) @@ -46,8 +60,6 @@ (require 'init-rust) (require 'init-ocaml) -(require 'init-workspace) - (provide 'init) ;;; Code: ;;; alskdjasd diff --git a/lisp/init-better-default.el b/lisp/init-better-default.el index a32dd2c..d3c50b5 100644 --- a/lisp/init-better-default.el +++ b/lisp/init-better-default.el @@ -1,5 +1,12 @@ ;; -*- 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 (defvar elemacs-incremental-packages '(t) "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) - -(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)) (use-package exec-path-from-shell + :commands exec-path-from-shell-initialize :init + (setq exec-path-from-shell-arguments '("-l")) (exec-path-from-shell-initialize))) (setq custom-file (expand-file-name "~/.emacs.d/custom.el")) (add-hook 'after-init-hook (lambda () (load custom-file 'no-error 'no-message))) +;; Start server (use-package server - :ensure nil - :hook (after-init . server-mode)) + :hook (emacs-startup . (lambda () + (unless server-mode + (server-mode 1))))) + +;; Save place +(use-package saveplace + :hook (after-init . save-place-mode)) (use-package display-line-numbers - :ensure nil + :straight nil :hook (text-mode . display-line-numbers-mode) :hook (prog-mode . display-line-numbers-mode) :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)))) (setq display-line-numbers-type 'relative) ) - -(add-hook 'prog-mode #'delete-trailing-whitespace-mode) -(add-hook 'text-mode #'delete-trailing-whitespace-mode) +(use-package del-trailing-white + :straight nil + :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 - :ensure nil + :straight nil :diminish :hook (prog-mode minibuffer-setup)) (use-package paren - :ensure nil + :straight nil :hook (after-init . show-paren-mode)) -;; Show trailing whitespace only in prog-mode and text-mode -(add-hook 'prog-mode-hook (lambda () (setq show-trailing-whitespace t))) -(add-hook 'text-mode-hook (lambda () (setq show-trailing-whitespace t))) +;; ;; Show trailing whitespace only in prog-mode and text-mode +;; (add-hook 'prog-mode-hook (lambda () (setq show-trailing-whitespace t))) +;; (add-hook 'text-mode-hook (lambda () (setq show-trailing-whitespace t))) (use-package recentf - :ensure nil + :straight nil :hook (after-init . recentf-mode) - :custom - (recentf-max-saved-items 500) - (recentf-exclude - '("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks" - "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$" - "\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/" - "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/" - (lambda (file) (file-in-directory-p file package-user-dir)))) + :init + (setq recentf-max-saved-items 500 + recentf-exclude + '("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks" + "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$" + "\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/" + "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/" + (lambda (file) (file-in-directory-p file package-user-dir)))) :config - (elemacs-load-packages-incrementally '(easymenu tree-widget timer)) (push (expand-file-name recentf-save-file) recentf-exclude) (add-to-list 'recentf-filename-handlers #'abbreviate-file-name) ) (use-package savehist - :ensure nil + :straight nil :hook (after-init . savehist-mode) :init (setq enable-recursive-minibuffers t ; Allow commands in minibuffers history-length 1000 @@ -158,6 +172,7 @@ If this is a daemon session, load them all immediately instead." savehist-autosave-interval 300)) (setq-default cursor-type 'bar) +(setq kill-whole-line t) (setq make-backup-files nil) (setq use-short-answers t) ;; (setq frame-title-format "\n") @@ -239,6 +254,10 @@ If this is a daemon session, load them all immediately instead." (lambda (button) (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 create-lockfiles nil) ;; (setq auto-save-file-name-transforms diff --git a/lisp/init-bindings.el b/lisp/init-bindings.el index d5ce8e7..5ef471e 100644 --- a/lisp/init-bindings.el +++ b/lisp/init-bindings.el @@ -15,4 +15,23 @@ (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) diff --git a/lisp/init-cc.el b/lisp/init-cc.el index f888374..36b0ba1 100644 --- a/lisp/init-cc.el +++ b/lisp/init-cc.el @@ -1,13 +1,13 @@ ;; -*- lexical-binding: t; -*- (use-package cc-mode - :ensure nil + :straight nil :init (setq-default c-basic-offset 2)) (when (treesit-available-p) (use-package c-ts-mode - :ensure nil + :straight nil :functions treesit-available-p :init (setq c-ts-mode-indent-offset 2) @@ -19,10 +19,10 @@ (add-to-list 'major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode))))) -(with-eval-after-load 'eglot - (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"))) - +;; (with-eval-after-load 'eglot +;; (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"))) + (provide 'init-cc) diff --git a/lisp/init-completion.el b/lisp/init-completion.el index 7cb7cc5..896340a 100644 --- a/lisp/init-completion.el +++ b/lisp/init-completion.el @@ -64,7 +64,7 @@ ;; :hook (vertico-mode . vertico-posframe-mode)) (use-package vertico-multiform - :ensure nil + :straight nil :hook (vertico-mode . vertico-multiform-mode) :config (defvar +vertico-transform-functions nil) @@ -258,7 +258,7 @@ ;; A few more useful configurations... (use-package emacs - :ensure nil + :straight nil :custom ;; TAB cycle if there are only few candidates ;; (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-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-nonexclusive) + ;; (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster) + ;; (advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive) (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-nonexclusive)) ;; (use-package yasnippet-capf diff --git a/lisp/init-dired.el b/lisp/init-dired.el index 8d91230..1007ebd 100644 --- a/lisp/init-dired.el +++ b/lisp/init-dired.el @@ -1,7 +1,7 @@ ;; -*- lexical-binding: t -*- (use-package dired - :ensure nil + :straight nil :bind (:map dired-mode-map ("C-c C-p" . wdired-change-to-wdired-mode) ("b" . dired-up-directory)) diff --git a/lisp/init-edit.el b/lisp/init-edit.el index 7917ffe..f7b5a79 100644 --- a/lisp/init-edit.el +++ b/lisp/init-edit.el @@ -30,33 +30,31 @@ ;; 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) - "[" 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 -(use-package hungry-delete - :diminish - :hook (after-init . global-hungry-delete-mode) - :init (setq hungry-delete-chars-to-skip " \t\f\v" - hungry-delete-except-modes - '(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode))) +;; ;; Hungry deletion +;; (use-package hungry-delete +;; :diminish +;; :hook (after-init . global-hungry-delete-mode) +;; :init (setq hungry-delete-chars-to-skip " \t\f\v" +;; hungry-delete-except-modes +;; '(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode))) (use-package abbrev - :ensure nil + :straight nil :diminish :config (setq-default abbrev-mode t) (setq abbrev-file-name (expand-file-name "abbrev.el" user-emacs-directory))) (use-package autorevert - :ensure nil + :straight nil :diminish :hook (after-init . global-auto-revert-mode)) (use-package goto-addr - :ensure nil + :straight nil :hook ((text-mode . goto-address-mode) (prog-mode . goto-address-prog-mode))) @@ -123,7 +121,7 @@ ;; Process (use-package proced - :ensure nil + :straight nil :init (setq-default proced-format 'verbose) (setq proced-auto-update-flag t diff --git a/lisp/init-eglot.el b/lisp/init-eglot.el index 3619bbc..b383174 100644 --- a/lisp/init-eglot.el +++ b/lisp/init-eglot.el @@ -25,10 +25,12 @@ :config (eglot-booster-mode)) (use-package flycheck-eglot + :after eglot :hook (eglot-managed-mode . flycheck-eglot-mode)) (use-package consult-eglot - :after consult eglot + :after consult + :after eglot :bind (:map eglot-mode-map ([remap xref-find-apropos] . consult-eglot-symbols)) :config @@ -38,10 +40,12 @@ ;; :hook (eglot-managed-mode . eldoc-box-hover-at-point-mode)) (use-package eldoc - :ensure nil + :after eglot + :straight nil :diminish) (use-package eldoc-mouse + :after eldoc :diminish :hook eldoc-mode) diff --git a/lisp/init-gc.el b/lisp/init-gc.el index 701ed83..5df2d12 100644 --- a/lisp/init-gc.el +++ b/lisp/init-gc.el @@ -3,10 +3,10 @@ (use-package gcmh :diminish - :straight (:wait t) ;; what does this do in elpaca - :init - (gcmh-mode 1) + :hook (emacs-startup . gcmh-mode) :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) diff --git a/lisp/init-haskell.el b/lisp/init-haskell.el index 7176349..2671597 100644 --- a/lisp/init-haskell.el +++ b/lisp/init-haskell.el @@ -12,8 +12,7 @@ :config (setq haskell-process-suggest-remove-import-lines t haskell-process-auto-import-loaded-modules t) - (add-to-list 'completion-ignored-extensions ".hi") - (add-hook 'haskell-mode-hook #'eglot-ensure)) + (add-to-list 'completion-ignored-extensions ".hi")) (provide 'init-haskell) diff --git a/lisp/init-lsp.el b/lisp/init-lsp.el index 887e8ab..134538f 100644 --- a/lisp/init-lsp.el +++ b/lisp/init-lsp.el @@ -1,8 +1,14 @@ ;; -*- lexical-binding: t; -*- +;; LSP booster + + + (use-package lsp-mode :diminish + :defines (lsp-diagnostics-disabled-modes lsp-clients-python-library-directories) :autoload lsp-enable-which-key-integration + :commands (lsp-format-buffer lsp-organize-imports lsp lsp-deferred) :hook ((prog-mode . (lambda () (unless (derived-mode-p 'emacs-lisp-mode 'lisp-mode @@ -12,7 +18,9 @@ ((markdown-mode yaml-mode yaml-ts-mode) . lsp-deferred) (lsp-mode . (lambda () ;; 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 ("C-c c d" . lsp-describe-thing-at-point) ([remap xref-find-definitions] . lsp-find-definition) @@ -20,6 +28,9 @@ :init (setq lsp-use-plists t lsp-log-io nil + lsp-enable-suggest-server-download t + ;; lsp-auto-configure t + lsp-keymap-prefix "C-c c" lsp-keep-workspace-alive nil lsp-signature-auto-activate nil @@ -27,6 +38,12 @@ lsp-modeline-diagnostics-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-progress-spinner-type 'progress-bar-filled @@ -34,15 +51,33 @@ lsp-enable-folding nil lsp-enable-symbol-highlighting nil lsp-enable-text-document-color nil + lsp-enable-imenu t 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 (use-package consult-lsp :bind (:map lsp-mode-map ("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 :custom-face (lsp-ui-sideline-code-action ((t (:inherit warning)))) @@ -114,34 +149,40 @@ ,(face-foreground 'font-lock-string-face) ,(face-foreground 'font-lock-constant-face) ,(face-foreground 'font-lock-variable-name-face)))) - - (use-package lsp-pyright - :functions lsp-pyright-format-buffer - :hook (((python-mode python-ts-mode) . (lambda () - (require 'lsp-pyright) - (add-hook 'after-save-hook #'lsp-pyright-format-buffer t t)))) - :init - ;; (when (executable-find "python3") - ;; (setq lsp-pyright-python-executable-cmd "python3")) - - (defun lsp-pyright-format-buffer () - "Use `yapf' to format the buffer." - (interactive) - (when (and (executable-find "yapf") buffer-file-name) - (call-process "yapf" nil nil nil "-i" buffer-file-name)))) - - (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)))) - + + :preface + (defun lsp-booster--advice-json-parse (old-fn &rest args) + "Try to parse bytecode instead of json." + (or + (when (equal (following-char) ?#) + (let ((bytecode (read (current-buffer)))) + (when (byte-code-function-p bytecode) + (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-booster--advice-final-command (old-fn cmd &optional test?) + "Prepend emacs-lsp-booster command to lsp CMD." + (let ((orig-result (funcall old-fn cmd test?))) + (if (and (not test?) ;; for check lsp-server-present? + (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) + + ) + (provide 'init-lsp) diff --git a/lisp/init-ocaml.el b/lisp/init-ocaml.el index 0d5c8a3..e3487db 100644 --- a/lisp/init-ocaml.el +++ b/lisp/init-ocaml.el @@ -8,15 +8,6 @@ (setq tuareg-prettify-symbols-full t) (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 opam-switch-mode @@ -25,10 +16,19 @@ (setq tuareg-opam-insinuate t)) (use-package ocp-indent - :hook (ocaml-eglot . ocp-setup-indent)) + :hook (tuareg-mode . ocp-setup-indent)) (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 ;; :hook (tuareg-mode . +ocaml-init-merlin) ;; :init @@ -41,7 +41,7 @@ ;; (use-package merlin-eldoc ;; :hook (merlin-mode . merlin-eldoc-setup)) -;; (use-package flycheck-ocaml) +(use-package flycheck-ocaml) diff --git a/lisp/init-org.el b/lisp/init-org.el index f78fbb6..102d872 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -214,7 +214,7 @@ the element after the #+HEADER: tag." (yas-activate-extra-mode 'LaTeX-mode))) (use-package org-latex-preview - :ensure nil + :straight nil :hook (org-mode . org-latex-preview-mode) :hook (org-latex-preview-mode . org-latex-preview-center-mode) :config @@ -327,4 +327,40 @@ the element after the #+HEADER: tag." :config (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) diff --git a/lisp/init-python.el b/lisp/init-python.el index 2faa45d..3514c26 100644 --- a/lisp/init-python.el +++ b/lisp/init-python.el @@ -3,7 +3,7 @@ ;; Python Mode ;; Install: pip install pyflakes autopep8 (use-package python - :ensure nil + :straight nil :functions exec-path-from-shell-copy-env :hook (inferior-python-mode . (lambda () (process-query-on-exit-flag @@ -23,9 +23,9 @@ (with-eval-after-load 'exec-path-from-shell (exec-path-from-shell-copy-env "PYTHONPATH"))) -(with-eval-after-load 'eglot - (add-hook 'python-ts-mode-hook #'eglot-ensure) - (add-to-list 'eglot-server-programs '((python-mode python-ts-mode) . ("pyright-langserver" "--stdio")))) +;; (with-eval-after-load 'eglot +;; (add-hook 'python-ts-mode-hook #'eglot-ensure) +;; (add-to-list 'eglot-server-programs '((python-mode python-ts-mode) . ("pyright-langserver" "--stdio")))) (provide 'init-python) diff --git a/lisp/init-shell.el b/lisp/init-shell.el index efa6e7b..f8a189d 100644 --- a/lisp/init-shell.el +++ b/lisp/init-shell.el @@ -1,7 +1,7 @@ ;; -*- lexical-binding: t; -*- (use-package shell - :ensure nil + :straight nil :hook ((shell-mode . my/shell-mode-hook) (comint-output-filter-functions . comint-strip-ctrl-m)) :init diff --git a/lisp/init-snippet.el b/lisp/init-snippet.el index 37e63f4..aa7598c 100644 --- a/lisp/init-snippet.el +++ b/lisp/init-snippet.el @@ -9,7 +9,7 @@ :config (elemacs-load-packages-incrementally '(eldoc easymenu help-mode)) (use-package warnings - :ensure nil + :straight nil :config (cl-pushnew '(yasnippet backquote-change) warning-suppress-types diff --git a/lisp/init-tex.el b/lisp/init-tex.el index 6d3d245..70a6fab 100644 --- a/lisp/init-tex.el +++ b/lisp/init-tex.el @@ -9,6 +9,7 @@ :hook (LaTeX-mode . prettify-symbols-mode) :hook (LaTeX-mode . visual-line-mode) :hook (LaTeX-mode . turn-on-reftex) + :hook (LaTeX-mode . lsp-deferred) :bind (:map LaTeX-mode-map ("C-S-e" . latex-math-from-calc) ("C-c x" . TeX-clean) @@ -26,13 +27,16 @@ (TeX-show-compilation nil) (TeX-command-extra-options "-shell-escape") (TeX-view-program-selection '((output-pdf "displayline"))) + (LaTeX-indent-level 0) + (LaTeX-item-indent 0) + (TeX-newline-function 'newline) :config (add-hook 'LaTeX-mode-hook '(lambda () (setq TeX-command-default "LaTeXMk"))) ;; 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) @@ -56,11 +60,10 @@ ;; (setq TeX-view-program-selection '((output-pdf "PDF Tools"))) ;; (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 :diminish diff --git a/lisp/init-typst.el b/lisp/init-typst.el index e2c8f77..fcab324 100644 --- a/lisp/init-typst.el +++ b/lisp/init-typst.el @@ -3,20 +3,19 @@ (use-package typst-ts-mode :straight (:type git :host codeberg :repo "meow_king/typst-ts-mode") - :hook (typst-ts-mode . eglot-ensure) :custom ;; (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-enable-raw-blocks-highlight t) :config (keymap-set typst-ts-mode-map "C-c C-c" #'typst-ts-tmenu) - (with-eval-after-load 'eglot - (with-eval-after-load 'typst-ts-mode - (add-to-list 'eglot-server-programs - `((typst-ts-mode) . - ,(eglot-alternatives `(,typst-ts-lsp-download-path - "tinymist" - "typst-lsp")))))) + ;; (with-eval-after-load 'eglot + ;; (with-eval-after-load 'typst-ts-mode + ;; (add-to-list 'eglot-server-programs + ;; `((typst-ts-mode) . + ;; ,(eglot-alternatives `(,typst-ts-lsp-download-path + ;; "tinymist" + ;; "typst-lsp")))))) (setq typst-ts-preview-function 'find-file-other-window)) (use-package typst-preview diff --git a/lisp/init-ui.el b/lisp/init-ui.el index 3020d42..3ad5be6 100644 --- a/lisp/init-ui.el +++ b/lisp/init-ui.el @@ -28,7 +28,6 @@ (add-to-list 'default-frame-alist '(undecorated-round . t)) (use-package solaire-mode - :ensure nil :hook (after-init . solaire-global-mode)) (use-package modus-themes @@ -105,17 +104,20 @@ :hook text-mode :hook prog-mode) -(use-package doom-modeline - :hook (after-init . doom-modeline-mode) - :config - (setq doom-modeline-support-imenu t - doom-modeline-height 30 - doom-modeline-buffer-file-name-style 'relative-from-project - doom-modeline-enable-word-count t - ;; doom-modeline-project-name t - doom-modeline-check 'simple - doom-modeline-buffer-encoding nil - doom-modeline-major-mode-icon nil)) +(use-package mood-line + :hook emacs-startup) + +;; (use-package doom-modeline +;; :hook (after-init . doom-modeline-mode) +;; :config +;; (setq doom-modeline-support-imenu t +;; doom-modeline-height 30 +;; doom-modeline-buffer-file-name-style 'relative-from-project +;; doom-modeline-enable-word-count t +;; ;; 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 :autoload turn-off-hide-mode-line-mode diff --git a/lisp/init-utils.el b/lisp/init-utils.el index 36d67e6..579e06e 100644 --- a/lisp/init-utils.el +++ b/lisp/init-utils.el @@ -29,7 +29,7 @@ (which-key-add-key-based-replacements "C-x v" "version control")) (use-package grep - :ensure nil + :straight nil :autoload grep-apply-setting :init (when (executable-find "rg") diff --git a/lisp/init-vcs.el b/lisp/init-vcs.el index 4e290af..912eac3 100644 --- a/lisp/init-vcs.el +++ b/lisp/init-vcs.el @@ -49,7 +49,7 @@ (user-error "Cannot revert the timemachine buffer")))))) (use-package smerge-mode - :ensure nil + :straight nil :diminish :pretty-hydra ((:title (pretty-hydra-title "Smerge" 'octicon "nf-oct-diff") diff --git a/lisp/init-window.el b/lisp/init-window.el index a5d88b0..674da7c 100644 --- a/lisp/init-window.el +++ b/lisp/init-window.el @@ -2,7 +2,7 @@ ;; Restore old window configurations (use-package winner - :ensure nil + :straight nil :commands (winner-undo winner-redo) :hook after-init :init (setq winner-boring-buffers '("*Completions*"