Compare commits

...

20 Commits

Author SHA1 Message Date
Zelong Kuang
4a779a480c Update 2026-04-11 00:00:04 +10:00
Zelong Kuang
7fb855f332 replace moodline with Doom modeline 2026-04-10 23:59:41 +10:00
Zelong Kuang
b03af9e719 Update 2026-04-10 18:21:13 +10:00
Zelong Kuang
3490e9daa9 Update 2026-04-08 15:25:39 +10:00
Zelong Kuang
14ecd3b17a Update 2026-04-06 19:51:57 +10:00
Zelong Kuang
2fe4ba46e8 Update 2026-04-05 21:31:02 +10:00
Zelong Kuang
a47707a471 small mod 2026-04-03 22:48:09 +11:00
Zelong Kuang
2b6faa0e39 Update 2026-04-03 19:00:38 +11:00
Zelong Kuang
c3b368711e Update 2026-04-03 15:54:22 +11:00
Zelong Kuang
154c0c3fb8 Update 2026-04-03 15:12:32 +11:00
Zelong Kuang
4607880ca4 Better dvisvgm latex preview 2026-04-03 15:12:01 +11:00
Zelong Kuang
204c683083 Update 2026-04-03 00:22:19 +11:00
Zelong Kuang
f2ec25c9d9 Moving back to elpaca, again 2026-04-02 19:21:30 +11:00
Zelong Kuang
abaeeb6486 Update 2026-04-02 15:31:43 +11:00
Zelong Kuang
a416bffb54 Update 2026-04-02 13:27:43 +11:00
Zelong Kuang
3e88318f79 Update 2026-03-30 16:37:02 +11:00
Zelong Kuang
a3468b833e Lot of optimisation, replace eglot with lsp-mode 2026-03-30 11:49:18 +11:00
Zelong Kuang
e1374b0e88 Reframed with straight.el 2026-03-29 19:12:45 +11:00
Zelong Kuang
6b017648ef Update 2026-03-24 22:21:29 +11:00
Zelong Kuang
a56b36b3f5 Update 2026-03-24 22:02:04 +11:00
63 changed files with 1199 additions and 1774 deletions

4
.gitignore vendored
View File

@@ -35,6 +35,7 @@ rime
.yas-compiled-snippets.el
flycheck_*.el
tabsession.el
.lsp-session-v1
emacs.desktop
history
!alias
@@ -42,6 +43,7 @@ history
# generated by elisp packages at root
/.local/
/.cask/
/tabspaces/
/auto/
/auto-save-list/
/cask/
@@ -65,3 +67,5 @@ history
/..emacs.d-tabspaces-session.el
/easysession
/tramp-rpc
/straight/
/eaf/

View File

@@ -1,2 +1 @@
* Basically there is nothing extra you need to do
run M-x my/generate-envvar-file
* Just Pull and run. Enjoy

View File

@@ -1,49 +1,60 @@
;; -*- lexical-binding: t -*-
(setq gc-cons-threshold most-positive-fixnum
gc-cons-percentage 0.6)
(if noninteractive ; in CLI sessions
(setq-default gc-cons-threshold 100000000 ; 128MB
;; Backport from 29 (see emacs-mirror/emacs@73a384a98698)
gc-cons-percentage 1.0)
(setq-default 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)
(setq native-comp-jit-compilation t)
(setq native-comp-jit-compilation nil)
(setq native-comp-async-report-warnings-errors nil)
(add-to-list 'load-path (expand-file-name "lisp/" user-emacs-directory))
(add-to-list 'load-path (expand-file-name "site-lisp/" user-emacs-directory))
(setq use-package-enable-imenu-support t)
(setq load-prefer-newer noninteractive)
(setenv "LSP_USE_PLISTS" "true") ;; Lsp-mode plists
(setenv "LIBGS" "/opt/homebrew/lib/libgs.dylib")
;; 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)))
;; Suppress GUI features
(setq use-file-dialog nil
use-dialog-box nil
inhibit-startup-screen t
inhibit-startup-echo-area-message user-login-name
inhibit-default-init t
;; initial-major-mode 'l-mode
initial-scratch-message nil)
;; 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)
(push '(vertical-scroll-bars . 0) default-frame-alist)
(push '(vertical-scroll-bars . nil) default-frame-alist)
(push '(horizontal-scroll-bars . nil) default-frame-alist)
(when (featurep 'ns)
(push '(ns-transparent-titlebar . t) default-frame-alist))
;; (push '(ns-appearance . light) default-frame-alist))
;; (push '(ns-appearance . light) default-frame-alist))
;; Prevent flash of unstyled mode line
;; (setq mode-line-format nil)
(setq mode-line-format nil)
(provide 'early-init)

16
history
View File

@@ -1,16 +0,0 @@
;; -*- mode: emacs-lisp; lexical-binding: t; coding: utf-8-emacs-unix -*-
;; Minibuffer history file, automatically generated by savehist.
(setq savehist-minibuffer-history-variables '(minibuffer-history consult--line-history rg-files-history rg-pattern-history file-name-history extended-command-history buffer-name-history))
(setq minibuffer-history '("cmake-mode MELPA"))
(setq consult--line-history '("ss"))
(setq rg-files-history '("elisp"))
(setq rg-pattern-history '("ss"))
(setq file-name-history '("~/.emacs.d/init.el" "~/.emacs.d/lisp/" "~/.emacs.d/lisp/init-coding.el" "~/.emacs.d/lisp/init-better-default.el" "~/.emacs.d/lisp/init-coding.el" "~/.emacs.d/lisp/init-shell.el" "~/.emacs.d/init.el" "~/.emacs.d/lisp/init-snippet.el" "~/.emacs.d/lisp/init-ui.el" "~/.emacs.d/lisp/init-vcs.el" "~/.emacs.d/lisp/init-workspace.el" "~/.emacs.d/early-init.el" "~/.emacs.d/lisp/init-edit.el" "~/.emacs.d/lisp/init-utils.el" "~/uni/Seminars/Algebraic Geometry/exer.tex" "~/.emacs.d/lisp/init-completion.el" "~/.emacs.d/lisp/init-eglot.el" "~/org/roam/20260222193638-ring.org" "~/org/yunnan.org" "~/org/workout.org" "~/org/todo.org" "~/org/notes.org" "~/org/learn-haskell.org" "~/org/diary.org" "~/org/roam/20260105223044-ideal_of_ring.org" "~/Library/texmf/tex/latex/local/elegantbook.cls" "~/.emacs.d/auctex/elegantbook.el" "~/Library/Rime/wubi091.dict.yaml" "~/Library/Rime/wubi091.schema.yaml" "~/.emacs.d/snippets/LaTeX-mode/in" "~/.emacs.d/snippets/LaTeX-mode/not in" "~/Library/Rime/pinyin_simp.txt" "~/.emacs.d/rime/user.yaml" "~/.emacs.d/snippets/LaTeX-mode/sqrt" "~/.emacs.d/bookmarks.eld" "~/org/roam/20260322143810-noetherian_topological_space_is_compact.org" "~/.config/aerospace/aerospace.toml" "~/.config/sketchybar/plugins/current_space.sh" "~/.config/sketchybar/sketchybarrc" "~/.config/sketchybar/plugins/aerospace.sh" "~/.emacs.d/lisp/init-org.el" "~/.emacs.d/elpaca/builds/org/org-loaddefs.el" "~/.emacs.d/lisp/init-tex.el" "~/uni/undergrad/26s1/Geometry/ass1/main.tex" "~/.emacs.d/snippets/LaTeX-mode/.yas-ignore-filenames-as-triggers" "~/uni/undergrad/26s1/Geometry/" "~/uni/undergrad/26s1/PFi/main.tex" "~/.emacs.d/snippets/LaTeX-mode/chastar.yasnippet" "~/.emacs.d/snippets/LaTeX-mode/star" "~/.emacs.d/snippets/LaTeX-mode/substar.yasnippet" "~/.emacs.d/snippets/LaTeX-mode/Display Math" "~/.emacs.d/snippets/LaTeX-mode/implied by" "~/.emacs.d/snippets/LaTeX-mode/less or equal" "~/.emacs.d/snippets/LaTeX-mode/lesser lesser" "~/.emacs.d/snippets/LaTeX-mode/greater or equal" "~/.emacs.d/snippets/LaTeX-mode/lrangle" "~/.emacs.d/eshell/alias" "~/.emacs.d/.gitignore" "~/.latexmkrc" "~/.emacs.d/lisp/init-window.el" "~/uni/undergrad/26s1/.projectile" "~/.emacs.d/snippets/LaTeX-mode/bigop.yasnippet" "~/org/roam/20260222194140-category_theory.org" "~/uni/Seminars/Representation theory/.projectile" "~/uni/Seminars/Representation theory/main.tex" "~/.emacs.d/snippets/LaTeX-mode/odot" "~/.emacs.d/snippets/LaTeX-mode/supset" "~/Library/texmf/tex/latex/local/auto/elegantbook.el" "~/uni/Seminars/Algebraic Geometry/auto/exer.el" "~/.config/nvim/LuaSnip/tex/math-commands.lua" "~/.emacs.d/snippets/LaTeX-mode/supseteq" "~/uni/Seminars/Representation theory/auto/main.el" "~/.emacs.d/auctex/auto/elegantbook.el" "~/org/roam/20260307170815-the_first_isomorphism_theorem.org" "~/org/roam/20251208162138-eu4_chinese_on_linux.org" "~/org/roam/20251207033411-quant.org" "~/org/roam/20251117171745-emacs.org" "~/.emacs.d/README.org" "~/.cache/org-persist/d8/df010c-12af-4345-96ea-38c574c74b6f-782ac370c3e966153f81b05909bf82d8.png" "~/org/todo.org_archive" "~/build-emacs-for-macos/flake.nix" "~/build-emacs-for-macos/go.mod" "~/build-emacs-for-macos/Brewfile" "~/.emacs.d/lisp/init-hydra.el" "~/docker_compose/yama.toml" "~/.emacs.d/snippets/LaTeX-mode/cap" "~/.emacs.d/snippets/LaTeX-mode/cup" "~/.emacs.d/snippets/LaTeX-mode/template" "~/build-emacs-for-macos/builds/Emacs.app/Contents/Resources/lisp/loaddefs.el.gz" "~/uni/undergrad/25s1/VCA/Notes/Vector-Calculus-Note.tex" "~/.emacs.d/lisp/init-dashboard.el"))
(setq extended-command-history '("easysession-reset" "elpaca-browse" "savehist-mode" "xref-find-definitions" "elisp-enable-lexical-binding" "elpaca-browse" "transient-posframe-mode" "elpaca-browse" "elisp-enable-lexical-binding" "transient-posframe-mode" "elpaca-browse" "proced" "elpaca-browse" "eldoc-mode" "benchmark-init/show-durations-tabulated"))
(setq buffer-name-history '("*Proced*"))
(setq projectile-project-command-history '#s(hash-table test equal))
(setq mark-ring 'nil)
(setq global-mark-ring 'nil)
(setq search-ring '(#("cod" 0 3 (isearch-case-fold-search t isearch-regexp-function nil)) #("recentf" 0 7 (isearch-case-fold-search t isearch-regexp-function nil)) #("doom-mode" 0 9 (isearch-case-fold-search t isearch-regexp-function nil)) #("easy" 0 4 (isearch-case-fold-search t isearch-regexp-function nil)) #("use-package rg" 0 14 (isearch-case-fold-search t isearch-regexp-function nil))))
(setq regexp-search-ring 'nil)

55
init.el
View File

@@ -2,50 +2,65 @@
;;; 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-ui)
;; (require 'init-dashboard) ;; not working
(require 'init-god)
;; (require 'init-meow)
(require 'init-hydra)
(require 'init-utils)
(require 'init-completion)
(require 'init-input)
(require 'init-ui)
(require 'init-edit)
(require 'init-window)
(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-llm)
;; (require 'init-god)
;; (require 'init-meow)
(require 'init-input)
(require 'init-utils)
;; (require 'init-eaf)
(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-writing)
(require 'init-eglot)
;; (require 'init-lsp) ;; not working
;; (require 'init-eglot)
(require 'init-lsp)
(require 'init-org)
(require 'init-tex)
(require 'init-markdown)
(require 'init-typst)
(require 'init-cc)
(require 'init-python)
(require 'init-haskell)
(require 'init-rust)
(require 'init-ocaml)
(require 'init-typst)
(require 'init-workspace)
(provide 'init)
;;; Code:

View File

@@ -1,23 +1,106 @@
;; -*- lexical-binding: t -*-
(use-package benchmark-init
:ensure t
:demand t
:config
;; To disable collection of benchmark data after init is done.
(add-hook 'elpaca-after-init-hook 'benchmark-init/deactivate))
(use-package benchmark-init :demand t
:hook (elpaca-after-init . 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
here may cause noticeable pauses, so it's recommended you break them up into
sub-packages. For example, `org' is comprised of many packages, and can be
broken up into:
(elemacs-load-packages-incrementally
'(calendar find-func format-spec org-macs org-compat
org-faces org-entities org-list org-pcomplete org-src
org-footnote org-macro ob org org-clock org-agenda
org-capture))
This is already done by the lang/org module, however.
If you want to disable incremental loading altogether, either remove
`doom-load-packages-incrementally-h' from `emacs-startup-hook' or set
`doom-incremental-first-idle-timer' to nil. Incremental loading does not occur
in daemon sessions (they are loaded immediately at startup).")
(defvar elemacs-incremental-first-idle-timer 2.0
"How long (in idle seconds) until incremental loading starts.
Set this to nil to disable incremental loading.")
(defvar elemacs-incremental-idle-timer 0.75
"How long (in idle seconds) in between incrementally loading packages.")
(defvar elemacs-incremental-load-immediately (daemonp)
"If non-nil, load all incrementally deferred packages immediately at startup.")
(defun elemacs-load-packages-incrementally (packages &optional now)
"Registers PACKAGES to be loaded incrementally.
If NOW is non-nil, load PACKAGES incrementally, in `doom-incremental-idle-timer'
intervals."
(if (not now)
(setq elemacs-incremental-packages (append elemacs-incremental-packages packages ))
(while packages
(let* ((gc-cons-threshold most-positive-fixnum)
(req (pop packages)))
(unless (featurep req)
(message "Incrementally loading %s" req)
(condition-case-unless-debug e
(or (while-no-input
;; If `default-directory' is a directory that doesn't exist
;; or is unreadable, Emacs throws up file-missing errors, so
;; we set it to a directory we know exists and is readable.
(let ((default-directory user-emacs-directory)
(inhibit-message t)
file-name-handler-alist)
(require req nil t))
t)
(push req packages))
(error
(message "Failed to load %S package incrementally, because: %s"
req e)))
(if (not packages)
(message "Finished incremental loading")
(run-with-idle-timer elemacs-incremental-idle-timer
nil #'elemacs-load-packages-incrementally
packages t)
(setq packages nil)))))))
(defun elemacs-load-packages-incrementally-h ()
"Begin incrementally loading packages in `elemacs-incremental-packages'.
If this is a daemon session, load them all immediately instead."
(if elemacs-incremental-load-immediately
(mapc #'require (cdr elemacs-incremental-packages))
(when (numberp elemacs-incremental-first-idle-timer)
(run-with-idle-timer elemacs-incremental-first-idle-timer
nil #'elemacs-load-packages-incrementally
(cdr elemacs-incremental-packages) t))))
(add-hook 'emacs-startup-hook #'elemacs-load-packages-incrementally-h)
(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 'elpaca-after-init-hook (lambda () (load custom-file 'no-error 'no-message)))
;; Start server
(use-package server
:ensure nil
:hook (elpaca-after-init . server-mode))
:autoload server-running-p
:hook (emacs-startup . (lambda ()
(unless (server-running-p)
(server-mode 1)))))
(use-package saveplace
:ensure nil
:hook (elpaca-after-init . save-place-mode))
(use-package display-line-numbers
:ensure nil
@@ -34,15 +117,17 @@
(add-hook mode (lambda () (display-line-numbers-mode -1))))
(setq display-line-numbers-type 'relative)
)
(column-number-mode 1)
(scroll-bar-mode -1)
;; (use-package delete-trailing
;; (use-package del-trailing-white
;; :ensure nil
;; :hook (text-mode delete-trailing-whitespace-mode)
;; :hook (prog-mode delete-trailing-whitespace-mode))
(add-hook 'prog-mode #'delete-trailing-whitespace-mode)
(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
:ensure nil
@@ -53,25 +138,26 @@
:ensure nil
:hook (elpaca-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
:hook (elpaca-after-init . recentf-mode)
:custom
(recentf-max-saved-items 500)
(recentf-exclude
: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))))
"^/tmp/" "^/var/folders/.+$" "^/ssh:" "^/rpc:" "/persp-confs/"
"^/sshx:" "^/sudo:"
(lambda (file) (file-in-directory-p file package-user-dir)))
recentf-auto-cleanup 'never)
:config
(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
:ensure nil
@@ -86,9 +172,15 @@
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")
(setq frame-title-format
'((:eval (if (and (boundp 'projectile-mode)
projectile-mode
(projectile-project-p))
(format "[%s] %s" (projectile-project-name) (buffer-name)) ;; Add project name in front when avaliable
"%b")))) ;; Otherwise buffer name only
(setq custom-safe-themes t)
(add-to-list 'default-frame-alist '(drag-internal-border . 1))
@@ -109,14 +201,6 @@
x-stretch-cursor t
window-combination-resize t)
(define-key global-map (kbd "C-<wheel-up>") nil)
(define-key global-map (kbd "C-<wheel-down>") nil)
(global-set-key (kbd "s-a") 'mark-whole-buffer) ;;对应Windows上面的Ctrl-a 全选
(global-set-key (kbd "s-c") 'kill-ring-save) ;;对应Windows上面的Ctrl-c 复制
(global-set-key (kbd "s-s") 'save-buffer) ;; 对应Windows上面的Ctrl-s 保存
(global-set-key (kbd "s-v") 'yank) ;对应Windows上面的Ctrl-v 粘贴
(global-set-key (kbd "s-z") 'undo) ;对应Windows上面的Ctrol-z 撤销
(setq kill-ring-max 200)
;; Save clipboard contents into kill-ring before replace them
(setq save-interprogram-paste-before-kill t)
@@ -167,14 +251,23 @@
(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
;; `((".*" ,(concat user-emacs-directory "auto-save/") t)))
(use-package tramp-hlo
(use-package tramp
:config
(tramp-hlo-setup))
(setq tramp-default-method "rpc"))
(use-package tramp-hlo
:hook (elpaca-after-init . tramp-hlo-setup))
(use-package msgpack)
(use-package tramp-rpc
:ensure (tramp-rpc :host github :repo "ArthurHeymans/emacs-tramp-rpc")
:config

View File

@@ -1,12 +1,13 @@
;; -*- lexical-binding: t -*-
(define-prefix-command 'orgmode-map)
(global-set-key (kbd "C-c n") 'orgmode-map)
(define-key orgmode-map (kbd "a") #'org-agenda)
(define-key orgmode-map (kbd "n") #'org-capture)
(define-key orgmode-map (kbd "t") #'org-todo-list)
(define-key global-map (kbd "C-<wheel-up>") nil)
(define-key global-map (kbd "C-<wheel-down>") nil)
(global-set-key (kbd "s-a") 'mark-whole-buffer) ;;对应Windows上面的Ctrl-a 全选
(global-set-key (kbd "s-c") 'kill-ring-save) ;;对应Windows上面的Ctrl-c 复制
(global-set-key (kbd "s-s") 'save-buffer) ;; 对应Windows上面的Ctrl-s 保存
(global-set-key (kbd "s-v") 'yank) ;对应Windows上面的Ctrl-v 粘贴
(global-set-key (kbd "s-x") 'execute-extended-command) ;对应Windows上面的Ctrol-z 撤销
(global-set-key (kbd "s-z") 'undo) ;对应Windows上面的Ctrol-z 撤销
(setq duplicate-line-final-position 1)
(global-set-key (kbd "M-p") #'duplicate-dwim)
@@ -15,4 +16,24 @@
(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)
("C-c C-w 0" . desktop-clear))
(provide 'init-bindings)

View File

@@ -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)

View File

@@ -20,13 +20,13 @@
;; Display errors a little quicker (default is 0.9s)
flycheck-display-errors-delay 0.25))
(use-package flyover
:diminish
:hook prog-mode
:config
;; Disable flyover-mode in emacs-lisp-mode
(add-hook 'emacs-lisp-mode-hook (lambda () (flyover-mode -1)))
:custom (flyover-checkers '(flycheck)))
;; (use-package flyover
;; :diminish
;; :hook prog-mode
;; :config
;; ;; Disable flyover-mode in emacs-lisp-mode
;; (add-hook 'emacs-lisp-mode-hook (lambda () (flyover-mode -1)))
;; :custom (flyover-checkers '(flycheck)))
(provide 'init-check)

View File

@@ -11,39 +11,13 @@
(setq xref-show-definitions-function #'xref-show-definitions-completing-read
xref-show-xrefs-function #'xref-show-definitions-completing-read))
(use-package apheleia
:diminish
:hook (elpaca-after-init . apheleia-global-mode))
(use-package apheleia :diminish
:hook (prog-mode))
(use-package editorconfig
:diminish
:hook elpaca-after-init)
(use-package cask-mode)
(use-package csv-mode)
(use-package cue-sheet-mode)
(use-package dart-mode)
(use-package lua-mode)
(use-package v-mode)
(use-package vimrc-mode)
(use-package julia-ts-mode)
(use-package scala-ts-mode)
(use-package yaml-ts-mode
:ensure nil
:mode ("\\.yaml\\'" . yaml-ts-mode))
;; Fish shell mode and auto-formatting
(use-package fish-mode
:commands fish_indent-before-save
:defines eglot-server-programs
:hook (fish-mode . (lambda ()
"Integrate `fish_indent` formatting with Fish shell mode."
(add-hook 'before-save-hook #'fish_indent-before-save)))
:config
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
'(fish-mode . ("fish-lsp" "start")))))
(use-package docker-compose-mode)
(use-package treesit-auto

View File

@@ -32,7 +32,7 @@
;; Optionally use the `orderless' completion style.
(use-package orderless
:custom
(completion-styles '(orderless basic))
(completion-styles '(orderless partial-completion basic))
(completion-category-defaults nil)
(completion-category-overrides '((file (styles orderless partial-completion))))
(orderless-component-separator #'orderless-escapable-split-on-space))
@@ -111,16 +111,14 @@
;; Consulting completing-read
(use-package consult
:commands consult-customize
:bind (("C-." . consult-imenu)
("C-c T" . consult-theme)
([remap Info-search] . consult-info)
;; ([remap isearch-forward] . consult-line)
([remap recentf-open-files] . consult-recent-file)
([remap bookmark-jump] . consult-bookmark)
("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command
;; Custom M-# bindings for fast register access
("M-#" . consult-register-load)
("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated)
@@ -150,7 +148,7 @@
("M-g k" . consult-keep-lines)
("M-g u" . consult-focus-lines)
("C-x C-r" . consult-recent-file)
("C-x B" . consult-buffer)
("C-x b" . consult-buffer)
("M-g e" . consult-isearch-history)
:map isearch-mode-map
@@ -165,11 +163,9 @@
(setq xref-show-xrefs-function #'consult-xref
xref-show-definitions-function #'consult-xref))
;; (use-package consult-projectile)
(use-package consult-flycheck)
(use-package consult-dir
:ensure t
:bind (("C-x C-d" . consult-dir)
:map minibuffer-local-completion-map
("C-x C-d" . consult-dir)
@@ -240,6 +236,7 @@
circe-mode
help-mode
gud-mode
eat-mode
vterm-mode)
t))
:custom-face
@@ -255,10 +252,9 @@
(advice-add #'persistent-scratch-save :before #'corfu-quit)
(add-to-list 'corfu-continue-commands #'corfu-move-to-minibuffer))
;; (use-package nerd-icons-corfu
;; :init
;; (with-eval-after-load 'corfu
;; (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)))
(use-package nerd-icons-corfu
:init
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
;; A few more useful configurations...
(use-package emacs
@@ -294,14 +290,10 @@
(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
;; :after cape
;; :config
;; (add-to-list 'completion-at-point-functions #'yasnippet-capf))
(provide 'init-completion)

View File

@@ -9,38 +9,30 @@
;; Always delete and copy recursively
(setq dired-recursive-deletes 'always
dired-recursive-copies 'always
dired-dwim-target t
dired-kill-when-opening-new-dired-buffer t)
;; Show directory first
(setq dired-listing-switches "-alh --group-directories-first"
dired-use-ls-dired t)
dired-use-ls-dired t))
;; Colorful dired
(use-package diredfl
;; Colorful dired
(use-package diredfl
:diminish
:hook dired-mode
:hook dirvish-directory-view-mode)
;; Extra Dired functionality
(use-package dired-aux :ensure nil))
;; Extra Dired functionality
(use-package dired-aux :ensure nil)
(use-package nerd-icons-dired
:diminish
:functions (nerd-icons-icon-for-dir my-nerd-icons-icon-for-dir)
:hook dired-mode
:init
(defface nerd-icons-dired-dir-face
'((t (:inherit 'font-lock-doc-face)))
"Face for the directory icon."
:group 'nerd-icons-faces)
(defun my-nerd-icons-icon-for-dir (dir)
(nerd-icons-icon-for-dir dir :face 'nerd-icons-dired-dir-face))
(setq nerd-icons-dired-dir-icon-function #'my-nerd-icons-icon-for-dir))
:hook
(dired-mode . nerd-icons-dired-mode))
;; (use-package dirvish
;; :bind ("C-c o p" . dirvish-side)
;; :init (dirvish-override-dired-mode)
;; :config
;; (setq dirvish-use-header-line nil
;; dirvish-use-mode-line nil))

28
lisp/init-eaf.el Normal file
View File

@@ -0,0 +1,28 @@
;; -*- lexical-binding: t; -*-
(use-package eaf
:defer nil
:load-path "~/.emacs.d/site-lisp/emacs-application-framework/"
:custom ; See https://github.com/emacs-eaf/emacs-application-framework/wiki/Customization
(eaf-browser-continue-where-left-off t)
(eaf-browser-enable-adblocker t)
;; (browse-url-browser-function 'eaf-open-browser)
:defines eaf-pdf-viewer-keybinding
:config
(require 'eaf-pdf-viewer)
(require 'eaf-music-player)
;; (require 'eaf-jupyter)
(require 'eaf-mindmap)
(require 'eaf-markdown-previewer)
(require 'eaf-system-monitor)
(require 'eaf-js-video-player)
(require 'eaf-image-viewer)
(eaf-bind-key scroll_up "C-n" eaf-pdf-viewer-keybinding)
(eaf-bind-key scroll_down "C-p" eaf-pdf-viewer-keybinding)
)
(provide 'init-eaf)

View File

@@ -4,53 +4,45 @@
:ensure nil
:hook (elpaca-after-init . delete-selection-mode))
(use-package smartparens
:diminish
:hook (elpaca-after-init . smartparens-global-mode)
;; :hook (elpaca-after-init . smartparens-global-strict-mode)
:init (sp-use-paredit-bindings)
(use-package electric-pair-mode
:ensure nil
:hook elpaca-after-init
:config
;; Autopair quotes more conservatively; if I'm next to a word/before another
;; quote, I don't want to open a new pair or it would unbalance them.
(let ((unless-list '(sp-point-before-word-p
sp-point-after-word-p
sp-point-before-same-p)))
(sp-pair "'" nil :unless unless-list)
(sp-pair "\"" nil :unless unless-list))
(dolist (brace '("(" "{" "["))
(sp-pair brace nil
:post-handlers '(("||\n[i]" "RET") ("| " "SPC"))
;; Don't autopair opening braces if before a word character or
;; other opening brace. The rationale: it interferes with manual
;; balancing of braces, and is odd form to have s-exps with no
;; whitespace in between, e.g. ()()(). Insert whitespace if
;; genuinely want to start a new form in the middle of a word.
:unless '(sp-point-before-word-p sp-point-before-same-p)))
(dolist (mode '(LaTeX-mode-hook org-mode-hook))
(add-hook mode
(lambda ()
(setq-local electric-pair-pairs
(append electric-pair-pairs '((?\\ . ?\\))))
(setq-local electric-pair-text-pairs electric-pair-pairs)))))
(sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p))
(use-package puni
:hook (elpaca-after-init . puni-global-mode)
:custom
(puni-confirm-when-delete-unbalanced-active-region nil)
:bind (:map puni-mode-map
("M-s" . puni-splice)
("DEL" . my-backspace)
("C-=" . puni-expand-region)
)
:init
(defun my-backspace ()
(interactive)
(if (looking-back (rx line-start (+ blank)))
(delete-region (line-beginning-position) (point))
(puni-backward-delete-char))))
;; 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")))
;; 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)))))
;; (use-package electric-pair
;; :ensure nil
;; :hook elpaca-after-init)
;; Hungry deletion
(use-package hungry-delete
:diminish
:hook (elpaca-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 combobulate
;; :ensure (:host github :repo "mickeynp/combobulate")
;; :hook prog-mode
;; :config
;; ;; You can customize Combobulate's key prefix here.
;; ;; Note that you may have to restart Emacs for this to take effect!
;; (setq combobulate-key-prefix "C-c o")
;; )
(use-package abbrev
:diminish
:ensure nil
:diminish
:config
(setq-default abbrev-mode t)
(setq abbrev-file-name (expand-file-name "abbrev.el" user-emacs-directory)))
@@ -78,8 +70,8 @@
:map mc/keymap
("C-|" . mc/vertical-align-with-space)))
(use-package smart-region
:hook (after-init . smart-region-on))
;; (use-package expand-region
;; :bind ("C-=" . er/expand-region))
(use-package mwim
:bind (([remap move-beginning-of-line] . mwim-beginning)
@@ -138,10 +130,18 @@
(use-package olivetti
:hook org-mode
:diminish
:bind ("<f7>" . olivetti-mode)
:bind (("<f7>" . olivetti-mode))
:custom
(olivetti-style 'fancy)
(olivetti-margin-width 5)
(olivetti-body-width 90))
(olivetti-body-width 80))
(setq-default bidi-display-reordering 'left-to-right
bidi-paragraph-direction 'left-to-right
bidi-display-reordering nil)
(setq bidi-inhibit-bpa t
long-line-threshold 1000
large-hscroll-threshold 1000
syntax-wholeline-max 1000)
(provide 'init-edit)

View File

@@ -1,9 +1,7 @@
;; -*- lexical-binding: t; -*-
(use-package jsonrpc)
(use-package eglot
:defer t
:commands (eglot eglot-ensure)
:hook ((prog-mode . (lambda ()
(unless (derived-mode-p
'emacs-lisp-mode 'lisp-mode
@@ -27,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
@@ -40,10 +40,12 @@
;; :hook (eglot-managed-mode . eldoc-box-hover-at-point-mode))
(use-package eldoc
:after eglot
:ensure nil
:diminish)
(use-package eldoc-mouse
:after eldoc
:diminish
:hook eldoc-mode)

View File

@@ -39,12 +39,6 @@
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))
;; Install a package via the elpaca macro
;; See the "recipes" section of the manual for more details.
;; (elpaca example-package)
;; Uncomment for systems which cannot create symlinks:
(when (eq system-type 'windows-nt)
(elpaca-no-symlink-mode))
@@ -60,13 +54,34 @@
;;For example:
;;(use-package general :ensure (:wait t) :demand t)
(setq elpaca-lock-file (expand-file-name "lock-file.eld" user-emacs-directory))
(setq use-package-always-ensure t
use-package-expand-minimally t
use-package-always-defer t)
(use-package diminish)
(use-package elpaca-ui
:ensure nil
:bind (:map elpaca-ui-mode-map
("p" . previous-line)
("F" . elpaca-ui-mark-pull))
:hook (elpaca-log-mode . elpaca-log-update-mode)
:after popper
:init
(add-to-list 'popper-reference-buffers
'elpaca-log-mode)
(setf (alist-get '(major-mode . elpaca-log-mode)
display-buffer-alist
nil nil #'equal)
'((display-buffer-at-bottom
display-buffer-in-side-window)
(side . below)
(slot . 49)
(window-height . 0.4)
(body-function . select-window))
(alist-get "\\*elpaca-diff\\*" display-buffer-alist
nil nil #'equal)
'((display-buffer-reuse-window
display-buffer-in-atom-window)
(side . right))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -3,10 +3,10 @@
(use-package gcmh
:diminish
:ensure (: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)

View File

@@ -1,3 +1,5 @@
;; -*- lexical-binding: t; -*-
(use-package god-mode

View File

@@ -12,8 +12,18 @@
: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"))
(use-package haskell-ts-mode
:custom
(haskell-ts-font-lock-level 4)
(haskell-ts-use-indent t)
(haskell-ts-ghci "ghci")
(haskell-ts-use-indent t)
:config
(add-to-list 'major-mode-remap-alist '(haskell-mode . haskell-ts-mode)))
(use-package lsp-haskell)
(provide 'init-haskell)

View File

@@ -4,6 +4,14 @@
:custom
(default-input-method "rime")
(rime-librime-root "/opt/homebrew")
(rime-emacs-module-header-root "~/build-emacs-for-macos/builds/Emacs.app/Contents/Resources/include/"))
(rime-emacs-module-header-root "~/build-emacs-for-macos/builds/Emacs.app/Contents/Resources/include/")
(rime-show-candidate 'posframe)
(rime-posframe-properties nil))
;; (use-package sis
;; :hook ((elpaca-after-init . sis-global-respect-mode)
;; (elpaca-after-init . sis-global-context-mode)
;; (elpaca-after-init . sis-global-inline-mode)))
(provide 'init-input)

View File

@@ -5,7 +5,7 @@
:bind (("C-c l s" . gptel-send)
("C-c l m" . gptel-menu))
:config
(setq gptel-model 'claude-sonnet-4.5)
(setq gptel-model 'gpt-5.2)
(setq gptel-backend (gptel-make-gh-copilot "Copilot"))
(setq gptel-default-mode #'org-mode)
(setq gptel-display-buffer-action nil) ; if user changes this, popup manager will bow out

View File

@@ -1,25 +1,41 @@
;; -*- 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
'makefile-mode 'snippet-mode
'ron-mode)
'lisp-data-mode 'ron-mode)
(lsp-deferred))))
((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))))
:hook (lsp-completion-mode . my/lsp-mode-setup-completion)
:bind (:map lsp-mode-map
("C-c c d" . lsp-describe-thing-at-point)
([remap xref-find-definitions] . lsp-find-definition)
([remap xref-find-references] . lsp-find-references))
:init (setq lsp-use-plists t
:init
(defun my/lsp-mode-setup-completion ()
(setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
'(orderless)))
(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 +43,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,16 +56,64 @@
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
(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"))
: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)
(append (list "emacs-lsp-booster" "--") orig-result))
orig-result)))
(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)
)
(use-package consult-lsp
:bind (:map lsp-mode-map
("C-M-." . consult-lsp-symbols)))
(use-package lsp-ui
(use-package lsp-ui
:custom-face
(lsp-ui-sideline-code-action ((t (:inherit warning))))
:pretty-hydra
@@ -115,33 +185,5 @@
,(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))))
(provide 'init-lsp)

View File

@@ -81,13 +81,27 @@
'("Y" . meow-sync-grab)
'("z" . meow-pop-selection)
'("'" . repeat)
'("<escape>" . ignore)))
'("<escape>" . ignore))
(meow-define-keys
'beacon
'("C-g" . meow-grab))
)
(use-package meow
:demand t
:hook (elpaca-after-init . meow-global-mode)
:config
(meow-setup)
(add-to-list 'meow-mode-state-list '(magit-mode . insert))
(add-to-list 'meow-mode-state-list '(eat-mode . insert))
(add-to-list 'meow-mode-state-list '(eshell-mode . insert))
(add-to-list 'meow-mode-state-list '(git-commit-elisp-text-mode . insert))
(define-key input-decode-map (kbd "C-[") [control-bracketleft])
(define-key meow-insert-state-keymap [control-bracketleft] 'meow-insert-exit)
(setq meow-keypad-leader-dispatch "C-c"
meow-use-clipboard t)
(setq meow-replace-state-name-list
'((normal . "<N>")
(motion . "<M>")
@@ -96,4 +110,40 @@
(beacon . "<B>")))
(setq meow-cursor-type-normal 'bar))
;; Meow jk exit
(use-package meow
:disabled t
:after meow
:config
;; Use jk to escape from insert state to normal state
(defvar meow-two-char-escape-sequence "jk")
(defvar meow-two-char-escape-delay 0.5)
(defun meow--two-char-exit-insert-state (s)
"Exit meow insert state when pressing consecutive two keys.
S is string of the two-key sequence."
(when (meow-insert-mode-p)
(let ((modified (buffer-modified-p))
(undo-list buffer-undo-list))
(insert (elt s 0))
(let* ((second-char (elt s 1))
(event
(if defining-kbd-macro
(read-event nil nil)
(read-event nil nil meow-two-char-escape-delay))))
(when event
(if (and (characterp event) (= event second-char))
(progn
(backward-delete-char 1)
(set-buffer-modified-p modified)
(setq buffer-undo-list undo-list)
(meow-insert-exit))
(push event unread-command-events)))))))
(defun meow-two-char-exit-insert-state ()
"Exit meow insert state when pressing consecutive two keys."
(interactive)
(meow--two-char-exit-insert-state meow-two-char-escape-sequence))
(define-key meow-insert-state-keymap (substring meow-two-char-escape-sequence 0 1)
#'meow-two-char-exit-insert-state))
(provide 'init-meow)

View File

@@ -5,19 +5,9 @@
:ensure t
:mode (("\\.ocamlinit\\'" . tuareg-mode))
:config
(setq tuareg-prettify-symbols-full t)
(add-hook 'tuareg-mode-hook (lambda () )))
(setq tuareg-prettify-symbols-full t))
(use-package ocaml-eglot
:ensure 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
:hook (tuareg-mode . opam-switch-mode)
@@ -25,10 +15,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
;; :ensure 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 +40,7 @@
;; (use-package merlin-eldoc
;; :hook (merlin-mode . merlin-eldoc-setup))
;; (use-package flycheck-ocaml)
(use-package flycheck-ocaml)

View File

@@ -1,17 +1,12 @@
;; -*- lexical-binding: t -*-
;; (defun org-capture-init()
;; (setq org-capture-templates
;; '(("t" "Personal todo" entry ("Inbox")
;; "* TODO %?\n%i\n%a" :prepend t))))
(use-package org
:defer
:ensure (org :repo "https://code.tecosaur.net/tec/org-mode.git/"
:branch "dev")
:hook (org-mode . org-cdlatex-mode)
:hook (org-mode . org-indent-mode)
:hook (org-mode . visual-line-mode)
:hook ((org-mode . org-cdlatex-mode)
(org-mode . org-indent-mode)
(org-mode . visual-line-mode))
:pretty-hydra
;; See `org-structure-template-alist'
((:color blue :quit-key ("q" "C-g"))
@@ -57,8 +52,21 @@
(if (or (region-active-p) (looking-back "^\s*" 1))
(org-hydra/body)
(self-insert-command 1))))
("M-<return>" . org-insert-subheading))
("M-<return>" . org-insert-subheading)
("C-'" . nil))
:bind (("C-c n t" . org-todo-list)
("C-c n a" . org-agenda)
("C-c n n" . org-capture))
:config
(elemacs-load-packages-incrementally
'(calendar find-func format-spec org-macs org-compat
org-faces org-entities org-list org-pcomplete org-src
org-footnote org-macro ob org org-clock org-agenda
org-capture))
(add-hook 'org-mode-hook
(lambda ()
(yas-activate-extra-mode 'LaTeX-mode)))
;; For hydra
(defun hot-expand (str &optional mod)
"Expand org template.
@@ -91,6 +99,7 @@ the element after the #+HEADER: tag."
(setq org-pretty-entities t
org-pretty-entities-include-sub-superscripts nil)
(setq org-default-note-file (expand-file-name "notes.org" org-directory)
org-capture-templates
'(("t" "Personal todo" entry
@@ -101,16 +110,80 @@ the element after the #+HEADER: tag."
"* %u %?\n%i\n%a" :prepend t)
("j" "Journal" entry
(file+olp+datetree "diary.org")
"* %U %?\n%i\n%a" :prepend t))
org-todo-keywords
'((sequence "TODO(t)" "IN-PROGRESS(i)" "ON-HOLD(h)" "|" "DONE(d)" "NO(n)")))
"* %U %?\n%i\n%a" :prepend t)))
(with-no-warnings
(custom-declare-face '+org-todo-active '((t (:inherit (bold font-lock-constant-face org-todo)))) "")
(custom-declare-face '+org-todo-project '((t (:inherit (bold font-lock-doc-face org-todo)))) "")
(custom-declare-face '+org-todo-onhold '((t (:inherit (bold warning org-todo)))) "")
(custom-declare-face '+org-todo-cancel '((t (:inherit (bold error org-todo)))) ""))
(setq org-todo-keywords
'((sequence
"TODO(t)" ; A task that needs doing & is ready to do
"PROJ(p)" ; A project, which usually contains other tasks
"LOOP(r)" ; A recurring task
"STRT(s)" ; A task that is in progress
"WAIT(w)" ; Something external is holding up this task
"HOLD(h)" ; This task is paused/on hold because of me
"IDEA(i)" ; An unconfirmed and unapproved task or notion
"|"
"DONE(d)" ; Task successfully completed
"KILL(k)") ; Task was cancelled, aborted, or is no longer applicable
(sequence
"|"
"OKAY(o)"
"YES(y)"
"NO(n)"))
org-todo-keyword-faces
'(("[-]" . +org-todo-active)
("STRT" . +org-todo-active)
("[?]" . +org-todo-onhold)
("WAIT" . +org-todo-onhold)
("HOLD" . +org-todo-onhold)
("PROJ" . +org-todo-project)
("NO" . +org-todo-cancel)
("KILL" . +org-todo-cancel)))
(add-to-list 'org-src-block-faces '("latex" (:inherit default :extend t)))
(add-hook 'org-after-refile-insert-hook
(defun save-buffer-after-capture ()
(when (bound-and-true-p org-capture-is-refiling)
(save-buffer)))))
(save-buffer))))
;; ;; 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" "haskell")
"The supported programming languages for interactive Babel.")
(dolist (lang org-babel-lang-list)
(eval `(lsp-org-babel-enable ,lang)))
)
(use-package org-contrib)
@@ -157,8 +230,7 @@ the element after the #+HEADER: tag."
(run-at-time nil nil #'org-appear--set-elements))
(use-package hl-todo
:hook (prog-mode . hl-todo-mode)
:hook (yaml-mode . hl-todo-mode)
:hook (elpaca-after-init . global-hl-todo-mode)
:config
(setq hl-todo-highlight-punctuation ":"
hl-todo-keyword-faces
@@ -183,29 +255,49 @@ the element after the #+HEADER: tag."
("BUG" error bold)
("XXX" font-lock-constant-face bold))))
(add-hook 'org-mode-hook
(lambda ()
(yas-activate-extra-mode 'LaTeX-mode)))
(use-package org-latex-preview
:ensure nil
:hook (org-mode . org-latex-preview-mode)
:hook (org-latex-preview-mode . org-latex-preview-center-mode)
:bind ("C-c C-x SPC" . org-latex-preview-clear-cache)
:config
;; Higher resolution when using dvipng
(plist-put org-latex-preview-appearance-options :page-width 1.0)
;; (plist-put org-latex-preview-appearance-options :margin 1)
(plist-put org-latex-preview-appearance-options :scale 2.0)
;; preview buffer on enter
(add-hook 'org-mode-hook
(lambda ()
(run-with-idle-timer 0.5 nil
(lambda () (org-latex-preview '(16))))))
;; Add margin and rescale display math
(defvar my/org-latex-display-math-scale 1)
(defvar my/org-latex-display-math-margin 5)
(defun my/org-latex-preview-add-margin-advice (ov _path-info)
(save-excursion
(goto-char (overlay-start ov))
(when-let* ((elem (org-element-context))
((or (eq (org-element-type elem) 'latex-environment)
(string-match-p "^\\\\\\[" (org-element-property :value elem))))
(img (overlay-get ov 'preview-image))
((and (consp img) (eq (car img) 'image))))
(let* ((plist (copy-sequence (cdr img)))
(height (plist-get plist :height)))
(when (and (consp height) (numberp (car height)))
(setq plist
(plist-put plist :height
(cons (* my/org-latex-display-math-scale (car height))
(cdr height)))))
(setq plist (plist-put plist :margin my/org-latex-display-math-margin))
(let ((new-img (cons 'image plist)))
(overlay-put ov 'preview-image new-img)
(when (overlay-get ov 'display)
(overlay-put ov 'display new-img)))))))
(advice-add 'org-latex-preview--update-overlay :after
#'my/org-latex-preview-add-margin-advice)
;; ;; Block C-n, C-p etc from opening up previews when using `org-latex-preview-mode'
;; (setq org-latex-preview-mode-ignored-commands
;; '(next-line previous-line mwheel-scroll
;; scroll-up-command scroll-down-command))
(setq org-latex-preview-numbered t)
;; (setq org-latex-preview-numbered t)
(setq org-latex-preview-mode-display-live t)
(setq org-latex-preview-process-default 'dvipng)
(setq org-latex-preview-process-default 'dvisvgm)
(setq org-latex-preview-mode-update-delay 0.25)
;; Centre display maths
(defun my/org-latex-preview-uncenter (ov)
(overlay-put ov 'before-string nil))
(defun my/org-latex-preview-recenter (ov)
@@ -263,7 +355,6 @@ the element after the #+HEADER: tag."
(add-hook 'text-scale-mode-hook #'my/text-scale-adjust-latex-previews))
(use-package org-roam
:ensure t
:custom
(org-roam-directory (file-truename "~/org/roam"))
:bind (("C-c n l" . org-roam-buffer-toggle)
@@ -298,8 +389,7 @@ the element after the #+HEADER: tag."
(use-package valign
:hook (org-mode . valign-mode))
(use-package org-noter
:config
(use-package djvu))
(use-package djvu)
(use-package org-noter)
(provide 'init-org)

View File

@@ -23,9 +23,4 @@
(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"))))
(provide 'init-python)

View File

@@ -1,8 +1,7 @@
;; Rust -*- lexical-binding: t; -*-
(use-package rust-mode
:functions treesit-available-p
:init (setq rust-format-on-save t
rust-mode-treesitter-derive (treesit-available-p)))
:config
(add-to-list 'major-mode-remap-alist '(rust-mode . rust-ts-mode)))
(use-package ron-mode
:mode ("\\.ron" . ron-mode))

View File

@@ -34,6 +34,18 @@
(ansi-color-for-comint-mode-on)
(setq comint-input-sender 'my/shell-simple-send))))
;; Emacs command shell
(use-package eshell
:ensure nil
:defines eshell-prompt-function
:bind (:map eshell-mode-map
([remap recenter-top-bottom] . eshell/clear))
:config
;; (defun eshell/clear ()
;; (interactive)
;; (eshell/clear-scrollback))
(setq eshell-banner-message ""))
(use-package xterm-color
:defines (compilation-environment
eshell-preoutput-filter-functions
@@ -42,6 +54,18 @@
;; For shell and interpreters
(setenv "TERM" "xterm-256color")
(setq comint-output-filter-functions
(remove 'ansi-color-process-output comint-output-filter-functions))
(add-hook 'comint-preoutput-filter-functions 'xterm-color-filter)
(add-hook 'shell-mode-hook
(lambda ()
;; Disable font-locking to improve performance
(font-lock-mode -1)
;; Prevent font-locking from being re-enabled
(make-local-variable 'font-lock-function)
(setq font-lock-function #'ignore)))
;; For eshell
(with-eval-after-load 'esh-mode
(add-hook 'eshell-before-prompt-hook
(lambda ()
@@ -49,13 +73,20 @@
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
(setq eshell-output-filter-functions
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)))
(setq compilation-environment '("TERM=xterm-256color"))
(defun my/advice-compilation-filter (fn proc string)
(funcall fn proc
(if (eq major-mode 'rg-mode) ; compatible with `rg'
string
(xterm-color-filter string))))
(advice-add 'compilation-filter :around #'my/advice-compilation-filter)
(advice-add 'gud-filter :around #'my/advice-compilation-filter)
)
(setq eshell-banner-message "")
(use-package eat
:bind ("C-`" . eat-toggle)
:bind ("C-<escape>" . eat-toggle)
:bind ("C-`" . eshell-toggle)
:hook ((eshell-load . eat-eshell-mode)
(eshell-load . eat-eshell-visual-command-mode))
:ensure `(eat :repo "https://codeberg.org/akib/emacs-eat"
@@ -69,12 +100,20 @@
(eat-kill-buffer-on-exit t)
;; (eat-shell )
:config
(defun eat-toggle () (interactive)
(defun eshell-toggle () (interactive)
(if (string= (buffer-name) "*eshell*")
(delete-window)
(eshell)))
(defun eat-toggle () (interactive)
(if (string= (buffer-name) "*eat*")
(delete-window)
(eat)))
(setq tramp-remote-process-environment '("TERM=xterm-256color" "TERMINFO=''" "ENV=''" "TMOUT=0" "LC_CTYPE=''" "CDPATH=" "HISTORY=" "MAIL=" "MAILCHECK=" "MAILPATH=" "PAGER=cat" "autocorrect=" "correct="))
;; Improve latency
(setq process-adaptive-read-buffering t)
(with-eval-after-load 'tramp
(setq tramp-remote-process-environment '("TERM=xterm-256color" "TERMINFO=''" "ENV=''" "TMOUT=0" "LC_CTYPE=''" "CDPATH=" "HISTORY=" "MAIL=" "MAILCHECK=" "MAILPATH=" "PAGER=cat" "autocorrect=" "correct=")))
(when (eq system-type 'darwin)
(define-key eat-semi-char-mode-map (kbd "C-h") #'eat-self-input)
(define-key eat-semi-char-mode-map (kbd "<backspace>") (kbd "C-h"))))
@@ -84,8 +123,8 @@
:defines eshell-highlight-prompt
:autoload (epe-theme-lambda epe-theme-dakrone epe-theme-pipeline)
:init
(setq eshell-highlight-prompt t
eshell-prompt-function #'epe-theme-lambda))
(setq eshell-highlight-prompt t)
(setq eshell-prompt-function #'epe-theme-lambda))
;; (use-package eshell-z
;; :hook (eshell-mode . (lambda () (require 'eshell-z))))

View File

@@ -3,11 +3,22 @@
;; Yasnippet settings
(use-package yasnippet
:diminish
:ensure t
:hook (elpaca-after-init . yas-global-mode)
:hook ((LaTeX-mode . yas-minor-mode)
(post-self-insert . my/yas-try-expanding-auto-snippets))
:hook ((post-self-insert . my/yas-try-expanding-auto-snippets))
:commands (yas-minor-mode-on
yas-expand
yas-expand-snippet
yas-lookup-snippet
yas-insert-snippet
yas-new-snippet
yas-visit-snippet-file
yas-activate-extra-mode
yas-deactivate-extra-mode
yas-maybe-expand-abbrev-key-filter)
:init
(defvar yas-verbosity 2)
:config
(elemacs-load-packages-incrementally '(eldoc easymenu help-mode))
(use-package warnings
:ensure nil
:config
@@ -27,9 +38,8 @@
(let ((yas-buffer-local-condition ''(require-snippet-condition . auto)))
(yas-expand)))))
;; Collection of yasnippet snippets
(use-package yasnippet-snippets)
(use-package doom-snippets
:after yasnippet
:ensure (doom-snippets :type git :host github :repo "doomemacs/snippets" :files ("*.el" "*")))
(provide 'init-snippet)

24
lisp/init-straight.el Normal file
View File

@@ -0,0 +1,24 @@
;; -*- lexical-binding: t; -*-
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name
"straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(setq straight-use-package-by-default t
use-package-expand-minimally t
use-package-always-defer t)
(provide 'init-straight)

View File

@@ -1,16 +1,34 @@
;; -*- lexical-binding: t; -*-
(use-package latex
:after tex
:ensure (auctex :pre-build (("./autogen.sh")
("./configure" "--without-texmf-dir" "--with-lispdir=.")
("make")))
;; :ensure (auctex :type git :host nil :repo "https://git.savannah.gnu.org/git/auctex.git")
:defines (TeX-auto-save
TeX-parse-self
TeX-electric-escape
TeX-PDF-mode
TeX-DVI-via-PDFTeX
TeX-clean-confirm
TeX-source-correlate-mode
TeX-source-correlate-method
TeX-display-help
TeX-show-compilation
TeX-command-extra-options
TeX-view-program-selection)
:mode (("\\.tex\\'" . LaTeX-mode))
:hook (LaTeX-mode . prettify-symbols-mode)
:hook (LaTeX-mode . visual-line-mode)
:hook (LaTeX-mode . turn-on-reftex)
:hook ((LaTeX-mode . prettify-symbols-mode)
(LaTeX-mode . visual-line-mode)
(LaTeX-mode . turn-on-reftex)
(LaTeX-mode . lsp-deferred)
(LaTeX-mode . (lambda () (lsp-ui-mode -1)))
(LaTeX-mode . (lambda () (apheleia-mode -1))))
:bind (:map LaTeX-mode-map
("C-S-e" . latex-math-from-calc)
("C-c x" . TeX-clean))
("C-c x" . TeX-clean)
("S-s-<mouse-1>" . TeX-view))
:custom
(TeX-auto-save t)
(TeX-parse-self t)
@@ -23,13 +41,17 @@
(TeX-display-help t)
(TeX-show-compilation nil)
(TeX-command-extra-options "-shell-escape")
(TeX-view-program-selection '((output-pdf "displayline")))
:config
(add-hook 'LaTeX-mode-hook (lambda ()
(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)
(defun latex-math-from-calc ()
"Evaluate `calc' on the contents of line at point."
(interactive)
@@ -50,23 +72,30 @@
;; (setq TeX-view-program-selection '((output-pdf "PDF Tools")))
;; (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
;; (with-eval-after-load 'eglot
;; (add-to-list 'eglot-server-programs '((LaTeX-mode latex-mode) "texlab")))
(setq reftex-plug-into-AUCTeX t)
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs '((LaTeX-mode latex-mode) "texlab"))))
(use-package texpresso
:ensure (:host github :repo "let-def/texpresso" :files ("emacs/*.el"))
:hook (texpresso-mode . texpresso-sync-mode)
:after auctex
:bind (:map LaTeX-mode-map
("C-c C-p" . texpresso)))
)
(use-package cdlatex
:diminish
:ensure t
:hook (LaTeX-mode . turn-on-cdlatex)
;; :bind (:map cdlatex-mode-map
;; ("<tab>" . cdlatex-tab))
:config
(setq cdlatex-math-symbol-alist '((?f ("\\varphi" "\\phi"))
(?i ("\\iota"))
(?c ("\\circ"))
))
(setq cdlatex-math-modify-alist '((?f "\\mathbb" nil t nil nil)))
(defun tjh/cdlatex-yas-expand ()
"Resolve the conflict between cdlatex and yasnippet. When this
function returns true, the default `cdlatex-tab` will not be
@@ -79,10 +108,42 @@ expansion, then cdlatex expansion."
t
nil)
nil))
(add-hook 'cdlatex-tab-hook 'tjh/cdlatex-yas-expand))
(add-hook 'cdlatex-tab-hook 'tjh/cdlatex-yas-expand)
(cdlatex-reset-mode))
(use-package texpresso
:defer nil
:load-path "~/.emacs.d/lisp/packages/")
(use-package lazytab
:demand t
:after cdlatex latex
:ensure '(lazytab :type git :host github :repo "karthink/lazytab" :files ("*.el"))
:bind (:map LaTeX-mode-map
("C-x |" . (lambda () (interactive) (lazytab-position-cursor-and-edit))))
:bind (:map orgtbl-mode-map
("<tab>" . lazytab-org-table-next-field-maybe)
("TAB" . lazytab-org-table-next-field-maybe))
:config
(add-hook 'cdlatex-tab-hook #'lazytab-cdlatex-or-orgtbl-next-field 90)
(dolist (cmd '(("smat" "Insert smallmatrix env"
"\\left( \\begin{smallmatrix} ? \\end{smallmatrix} \\right)"
lazytab-position-cursor-and-edit
nil nil t)
("bmat" "Insert bmatrix env"
"\\begin{bmatrix} ? \\end{bmatrix}"
lazytab-position-cursor-and-edit
nil nil t)
("pmat" "Insert pmatrix env"
"\\begin{pmatrix} ? \\end{pmatrix}"
lazytab-position-cursor-and-edit
nil nil t)
("ali" "Insert pmatrix env"
"\\begin{aligned} ? \\end{aligned}"
lazytab-position-cursor-and-edit
nil nil t)
("tbl" "Insert table"
"\\begin{table}\n\\centering ? \\caption{}\n\\end{table}\n"
lazytab-position-cursor-and-edit
nil t nil)))
(push cmd cdlatex-command-alist))
(cdlatex-reset-mode)
)
(provide 'init-tex)

View File

@@ -17,7 +17,7 @@
treemacs-missing-project-action 'remove
treemacs-user-mode-line-format 'none
treemacs-sorting 'alphabetic-asc
treemacs-follow-after-init t
treemacs-follow-elpaca-after-init t
treemacs-width 30
treemacs-show-hidden-files nil
treemacs-silent-refresh t

View File

@@ -1,29 +1,17 @@
;; -*- lexical-binding: t;-*-
(use-package typst-ts-mode
:ensure (: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)
:hook (typst-ts-mode . lsp-deferred)
:config
;; (typst-ts-watch-options "--open")
(setq typst-ts-mode-grammar-location (expand-file-name "tree-sitter/libtree-sitter-typst.so" user-emacs-directory))
(setq typst-ts-mode-enable-raw-blocks-highlight t)
(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"))))))
(setq typst-ts-preview-function 'find-file-other-window))
(use-package typst-preview
:ensure (:type git :host github :repo "havarddj/typst-preview.el")
:init
(setq typst-preview-autostart t) ; start preview automatically when typst-preview-mode is activated
(setq typst-preview-open-browser-automatically t) ; open browser automatically when typst-preview-start is run
:custom
(typst-preview-browser "default") ; this is the default option; other options are `eaf-browser' or `xwidget'.
@@ -32,6 +20,8 @@
(typst-preview-partial-rendering t) ; enable partial rendering
:config
(setq typst-preview-autostart t) ; start preview automatically when typst-preview-mode is activated
(setq typst-preview-open-browser-automatically t) ; open browser automatically when typst-preview-start is run
(define-key typst-ts-mode-map (kbd "C-c C-j") 'typst-preview-send-position)
(define-key typst-ts-mode-map (kbd "C-c C-l") #'typst-preview-mode))

View File

@@ -5,14 +5,7 @@
;; (setq-default line-height 0.16)
;; (setq-local default-text-properties '(line-spacing 0.1 line-height 1.1))
;; Suppress GUI features
(setq use-file-dialog nil
use-dialog-box nil
inhibit-startup-screen t
inhibit-startup-echo-area-message user-login-name
inhibit-default-init t
initial-scratch-message nil)
(use-package diminish)
(setq-default cursor-in-non-selected-windows nil)
(setq highlight-nonselected-windows nil)
@@ -20,11 +13,10 @@
(setq fast-but-imprecise-scrolling t)
(setq redisplay-skip-fontification-on-input t)
(setq frame-inhibit-implied-resize t
frame-resize-pixelwise t)
(setq frame-resize-pixelwise t)
;; 隐藏 title bar
(setq default-frame-alist '((undecorated-round . t)))
(add-to-list 'default-frame-alist '(undecorated-round . t))
(use-package solaire-mode
:hook (elpaca-after-init . solaire-global-mode))
@@ -33,81 +25,81 @@
:init
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs t
modus-themes-mixed-fonts t))
;; (use-package standard-themes :demand t
;; :config
;; (modus-themes-load-theme 'standard-light-tinted))
modus-themes-mixed-fonts t)
:commands (modus-themes-load-random-dark
modus-themes-load-random-light
modus-themes-load-random))
(use-package doric-themes
:demand t
:bind ("<f5>" . doric-themes-load-random)
:bind ("C-<f5>" . doric-load-random-light)
:bind ("M-<f5>" . doric-load-random-dark)
;; :bind ("<f5>" . doric-themes-load-random)
;; :bind ("C-<f5>" . (lambda () (interactive) (doric-themes-load-random 'light)))
;; :bind ("M-<f5>" . (lambda () (interactive) (doric-themes-load-random 'dark)))
:commands doric-themes-load-random)
(use-package ef-themes
:bind ("<f5>" . modus-themes-load-random)
:bind ("C-<f5>" . modus-themes-load-random-light)
:bind ("M-<f5>" . modus-themes-load-random-dark)
:init
(defvar my/doric-dark-themes
'(doric-fire
doric-valley
doric-walnut
doric-mermaid
doric-pine
doric-plum
doric-water))
(defvar my/doric-light-themes
'(doric-oak
doric-jade
doric-wind
doric-beach
doric-coral
doric-earth
doric-almond))
(setq ef-themes-light-themes '(ef-arbutus ef-cyprus ef-day ef-duo-light ef-eagle ef-elea-light
ef-kassio ef-melissa-light ef-orange ef-reverie
ef-spring ef-summer ef-trio-light ef-tritanopia-light))
(defun synchronise-theme ()
(let* ((hour (string-to-number
(substring (current-time-string) 11 13)))
(theme-list (if (member hour (number-sequence 6 18))
my/doric-light-themes
my/doric-dark-themes))
(loaded (seq-random-elt theme-list)))
(mapc #'disable-theme custom-enabled-themes)
(load-theme loaded :no-confirm)))
(setq ef-themes-dark-themes '(ef-autumn ef-bio ef-cherie ef-dark ef-deuteranopia-dark ef-dream
ef-duo-dark ef-elea-dark ef-fig ef-maris-dark
ef-melissa-dark ef-night ef-owl ef-rosa ef-symbiosis
ef-trio-dark ef-tritanopia-dark ef-winter))
;; This makes the Modus commands listed below consider only the Ef
;; themes. For an alternative that includes Modus and all
;; derivative themes (like Ef), enable the
;; `modus-themes-include-derivatives-mode' instead. The manual of
;; the Ef themes has a section that explains all the possibilities:
;;
;; - Evaluate `(info "(ef-themes) Working with other Modus themes or taking over Modus")'
;; - Visit <https://protesilaos.com/emacs/ef-themes#h:6585235a-5219-4f78-9dd5-6a64d87d1b6e>
(ef-themes-take-over-modus-themes-mode 1))
(synchronise-theme)
(run-with-timer 3600 3600 'synchronise-theme)
(use-package auto-dark
:when (and (eq system-type 'darwin) (display-graphic-p))
:ensure t
;; :custom
;; (auto-dark-themes '((doric-beach) (leuven)))
;; (auto-dark-allow-osascript t)
;; (auto-dark-detection-method nil) ;; dangerous to be set manually
:hook
(auto-dark-dark-mode
. (lambda ()
;; something to execute when dark mode is detected
;; (doric-themes-load-random 'dark))
(ef-themes-load-random-dark)
))
(auto-dark-light-mode
. (lambda ()
;; something to execute when light mode is detected
;; (doric-themes-load-random 'light)
(ef-themes-load-random-light)
))
:hook elpaca-after-init)
(defun doric-load-random-light ()
(interactive)
(mapc #'disable-theme custom-enabled-themes)
(let ((loaded (seq-random-elt my/doric-light-themes)))
(load-theme loaded :no-confirm)))
(defun doric-load-random-dark ()
(interactive)
(mapc #'disable-theme custom-enabled-themes)
(let ((loaded (seq-random-elt my/doric-dark-themes)))
(load-theme loaded :no-confirm))))
(use-package rainbow-delimiters
:hook ((prog-mode . rainbow-delimiters-mode)
(typst-ts-mode . rainbow-delimiters-mode)
(python-ts-mode . rainbow-delimiters-mode)))
;; (use-package prism
;; :hook (prog-mode . prism-mode)
;; :hook (text-mode . prism-mode)
;; :hook (typst-ts-mode . prism-mode)
;; :hook (python-ts-mode . prism-whitespace-mode)
;; :config
;; (setq prism-parens t))
(use-package rainbow-mode
:hook text-mode
:hook prog-mode)
;; (use-package mood-line
;; :hook emacs-startup
;; :custom (mood-line-glyph-alist mood-line-glyphs-fira-code))
(use-package doom-modeline
:hook (elpaca-after-init . doom-modeline-mode)
:config
(setq doom-modeline-support-imenu t
doom-modeline-icons nil
doom-modeline-height 30
doom-modeline-buffer-file-name-style 'relative-from-project
doom-modeline-enable-word-count t
@@ -133,19 +125,19 @@
window-divider-default-right-width 1)
(add-hook 'window-setup-hook #'window-divider-mode)
(pcase system-type
('darwin ; macOS
(set-face-attribute 'default nil :font "Sarasa Mono TC Nerd Font-22") ; 20 * 1.5
(set-face-attribute 'variable-pitch nil :font "Bookerly-22" :weight 'light)
(set-face-attribute 'fixed-pitch nil :font "Sarasa Term SC-22")
;; (pcase system-type
;; ('darwin ; macOS
(set-face-attribute 'default nil :font "Sarasa Term SC-22") ; 20 * 1.5
(set-face-attribute 'variable-pitch nil :font "Bookerly-20" :weight 'light)
(set-face-attribute 'fixed-pitch nil :font "Sarasa Mono TC Nerd Font-22")
(add-to-list 'default-frame-alist '(height . 53))
(add-to-list 'default-frame-alist '(width . 90)))
(add-to-list 'default-frame-alist '(height . 53))
(add-to-list 'default-frame-alist '(width . 90))
('gnu/linux ; Linux (including Debian)
(set-face-attribute 'variable-pitch nil :font "Sarasa Mono TC Nerd Font-14") ; 20 * 1.5
(add-to-list 'default-frame-alist '(height . 40))
(add-to-list 'default-frame-alist '(width . 90))))
;; ('gnu/linux ; Linux (including Debian)
;; (set-face-attribute 'variable-pitch nil :font "Sarasa Mono TC Nerd Font-14") ; 20 * 1.5
;; (add-to-list 'default-frame-alist '(height . 40))
;; (add-to-list 'default-frame-alist '(width . 90))))
(use-package mixed-pitch
:diminish
@@ -181,28 +173,13 @@
:ensure (nerd-icons
:type git
:host github
:repo "rainstormstudio/nerd-icons.el"
:files (:defaults "data"))
:custom
;; The Nerd Font you want to use in GUI
;; "Symbols Nerd Font Mono" is the default and is recommended
;; but you can use any other Nerd Font if you want
(nerd-icons-font-family "Symbols Nerd Font Mono"))
(use-package nerd-icons-ibuffer
:ensure t
:hook (ibuffer-mode-hook . nerd-icons-ibuffer-mode))
;; Display transient in child frame
;; (use-package transient-posframe
;; :diminish
;; :commands transient-posframe-mode
;; :custom-face
;; (transient-posframe-border ((t (:inherit posframe-border :background unspecified))))
;; :hook elpaca-after-init
;; :init (setq transient-mode-line-format nil
;; transient-posframe-parameters '((left-fringe . 8)
;; (right-fringe . 8))))
:repo "rainstormstudio/nerd-icons.el"))
;; :files (:defaults "data"))
;; :custom
;; The Nerd Font you want to use in GUI
;; "Symbols Nerd Font Mono" is the default and is recommended
;; but you can use any other Nerd Font if you want
;; (nerd-icons-font-family "Symbols Nerd Font Mono"))
(with-no-warnings
(when (featurep 'ns)
@@ -211,12 +188,29 @@
;; Don't open a file in a new frame
(setq ns-pop-up-frames nil)))
(use-package beacon
:diminish
:hook elpaca-after-init)
;; hl current line
(use-package hl-line
:ensure nil
:hook ((elpaca-after-init . global-hl-line-mode)
((dashboard-mode eshell-mode shell-mode term-mode vterm-mode eat-mode) .
(lambda () (setq-local global-hl-line-mode nil)))))
;; (use-package beacon
;; :diminish
;; :hook elpaca-after-init)
(use-package spacious-padding
:diminish
:hook elpaca-after-init)
;; Eval result overlay
(use-package eros
:hook elpaca-after-init
:bind (([remap eval-defun] . eros-eval-defun)
([remap eval-last-sexp] . eros-eval-last-sexp)))
(use-package goggles
:diminish
:hook (prog-mode text-mode conf-mode))
(provide 'init-ui)

View File

@@ -1,5 +1,7 @@
;; -*- lexical-binding: t; -*-
(use-package transient)
(use-package which-key
:diminish
:functions childframe-completion-workable-p
@@ -11,7 +13,7 @@
which-key-show-remaining-keys t)
:config
(which-key-add-key-based-replacements "C-c a" "LSP")
(which-key-add-key-based-replacements "C-c c" "code")
(which-key-add-key-based-replacements "C-c b" "beframe")
(which-key-add-key-based-replacements "C-c c" "code")
(which-key-add-key-based-replacements "C-c n" "org")
(which-key-add-key-based-replacements "C-c l" "llm")
@@ -28,20 +30,6 @@
(which-key-add-key-based-replacements "C-x t" "tabs")
(which-key-add-key-based-replacements "C-x v" "version control"))
(use-package grep
:ensure nil
:autoload grep-apply-setting
:init
(when (executable-find "rg")
(grep-apply-setting
'grep-command "rg --color=auto --null -nH --no-heading -e ")
(grep-apply-setting
'grep-template "rg --color=auto --null --no-heading -g '!*/' -e <R> <D>")
(grep-apply-setting
'grep-find-command '("rg --color=auto --null -nH --no-heading -e ''" . 38))
(grep-apply-setting
'grep-find-template "rg --color=auto --null -nH --no-heading -e <R> <D>")))
;; Writable grep buffer
(use-package wgrep
:init (setq wgrep-auto-save-buffer t
@@ -49,23 +37,48 @@
;; Fast search tool `ripgrep'
(use-package rg
:hook (elpaca-after-init . rg-enable-default-bindings)
:bind ("C-c s" . rg-menu)
:bind (:map rg-global-map
("c" . rg-dwim-current-dir)
("f" . rg-dwim-current-file)
("m" . rg-menu))
:init (setq rg-show-columns t)
:config (add-to-list 'rg-custom-type-aliases '("tmpl" . "*.tmpl")))
(use-package pdf-tools
:config
(pdf-tools-install))
(add-to-list 'rg-custom-type-aliases '("tmpl" . "*.tmpl"))
(rg-enable-default-bindings)
)
;; (use-package keycast
;; :hook (elpaca-after-init . keycast-mode-line-mode)
;; :config
;; (setq keycast-mode-line-remove-tail-elements nil))
(use-package elcord)
;; (when (display-graphic-p)
;; (use-package pdf-view
;; :ensure pdf-tools
;; :diminish (pdf-view-themed-minor-mode
;; pdf-view-midnight-minor-mode
;; pdf-view-roll-minor-mode
;; pdf-view-printer-minor-mode)
;; :functions pdf-tools-install
;; :hook ((pdf-tools-enabled . pdf-view-auto-slice-minor-mode)
;; (pdf-tools-enabled . pdf-view-roll-minor-mode)
;; (pdf-tools-enabled . pdf-isearch-minor-mode))
;; ;; :mode ("\\.[pP][dD][fF]\\'" . pdf-view-mode)
;; :magic ("%PDF" . pdf-view-mode)
;; :bind (:map pdf-view-mode-map
;; ("C-s" . isearch-forward))
;; ;; :init (setq pdf-view-use-scaling t
;; ;; pdf-view-use-imagemagick nil)
;; :config
;; ;; Activate the package
;; (pdf-tools-install t nil t nil))
;; ;; Recover last viewed position
;; (use-package saveplace-pdf-view
;; :when (ignore-errors (pdf-info-check-epdfinfo) t)
;; :autoload (saveplace-pdf-view-find-file-advice saveplace-pdf-view-to-alist-advice)
;; :functions pdf-info-check-epdfinfo
;; :init
;; (advice-add 'save-place-find-file-hook :around #'saveplace-pdf-view-find-file-advice)
;; (advice-add 'save-place-to-alist :around #'saveplace-pdf-view-to-alist-advice)))
(provide 'init-utils)

View File

@@ -1,27 +1,28 @@
;; -*- lexical-binding: t; -*-
(use-package transient)
(use-package magit
:defer t
:bind (("C-c g" . magit-dispatch))
:custom
(magit-diff-refine-hunk t)
(git-commit-major-mode 'git-commit-elisp-text-mode)
:config
(elemacs-load-packages-incrementally '(dash f s with-editor eieio transient git-commit))
(setq magit-show-long-lines-warning nil))
;; Prime cache before Magit refresh
(use-package magit-prime
:diminish
:hook elpaca-after-init)
:config
(magit-prime-mode))
;; Show TODOs in Magit
(use-package magit-todos
:after magit-status
:hook magit
:commands magit-todos-mode
:init
(setq magit-todos-nice (if (executable-find "nice") t nil))
(magit-todos-mode 1))
(setq magit-todos-nice (if (executable-find "nice") t nil)))
;; Walk through git revisions of a file
(use-package git-timemachine

View File

@@ -39,7 +39,10 @@
(use-package ace-window
:hook (emacs-startup . ace-window-display-mode)
:bind (([remap other-window] . ace-window)
("M-o" . ace-window)
("C-c w" . ace-window-hydra/body))
:custom
(aw-scope 'frame)
:pretty-hydra
(("Actions"
(("TAB" other-window "switch")
@@ -47,7 +50,7 @@
("X" ace-delete-other-windows "delete other" :exit t)
("s" ace-swap-window "swap")
("a" ace-select-window "select" :exit t)
("m" toggle-frame-maximized "maximize" :exit t)
("m" maximize-window "maximize" :exit t)
("u" toggle-frame-fullscreen "fullscreen" :exit t))
"Resize"
(("h" shrink-window-horizontally "")

View File

@@ -8,74 +8,57 @@
;; Recommended keymap prefix on macOS
(define-key projectile-mode-map (kbd "s-p") 'projectile-command-map)
;; Recommended keymap prefix on Windows/Linux
(define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map))
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
(use-package ibuffer-projectile
(use-package ibuffer
:ensure nil
:bind ("C-x C-b" . ibuffer)
:bind (:map ibuffer-mode-map
("M-o" . nil))
:config
(add-to-list 'ibuffer-help-buffer-modes 'helpful-mode)
(add-to-list 'ibuffer-help-buffer-modes 'Man-mode)
:init (setq ibuffer-filter-group-name-face '(:inherit (font-lock-string-face bold))))
(use-package nerd-icons-ibuffer
:ensure t
:hook (ibuffer-mode-hook . nerd-icons-ibuffer-mode))
(use-package ibuffer-projectile
:init
(add-hook 'ibuffer-hook
(lambda ()
(ibuffer-projectile-set-filter-groups)
(unless (eq ibuffer-sorting-mode 'alphabetic)
(ibuffer-do-sort-by-alphabetic)))))
(use-package consult-projectile
:bind (([remap projectile-find-file] . consult-projectile-find-file)
([remap projectile-recentf] . consult-projectile-recentf)
([remap projectile-switch-project] . consult-projectile-switch-project)
([remap projectile-switch-to-buffer] . consult-projectile-switch-to-buffer)
([remap projectile-find-dir] . consult-projectile-find-dir)))
;; (use-package org-project-capture)
;; (use-package org-projectile
;; :config
;; (setq org-project-capture-default-backend
;; (make-instance 'org-project-capture-projectile-backend)))
(global-set-key (kbd "C-x C-b") #'ibuffer)
;; (use-package beframe
;; :hook elpaca-after-init
;; :bind (("C-x b" . beframe-switch-buffer)
;; ("C-x C-b" . beframe-buffer-menu)
;; ("C-x f" . other-frame-prefix))
;; :config
;; (define-key global-map (kbd "C-c b") #'beframe-prefix-map))
(use-package eyebrowse
(use-package beframe
:hook elpaca-after-init
:custom
(eyebrowse-new-workspace t))
(use-package easysession
:diminish
:demand t
;; :hook (elpaca-after-init easysession-scratch-mode)
;; :hook (elpaca-after-init easysession-magit-mode)
:bind (("s-1" . eyebrowse-switch-to-window-config-1)
("s-2" . eyebrowse-switch-to-window-config-2)
("s-3" . eyebrowse-switch-to-window-config-3)
("s-4" . eyebrowse-switch-to-window-config-4)
("s-5" . eyebrowse-switch-to-window-config-5)
("s-6" . eyebrowse-switch-to-window-config-6)
("s-7" . eyebrowse-switch-to-window-config-7)
("s-8" . eyebrowse-switch-to-window-config-8))
;; ("C-c C-s l" . easysession-switch-to)
;; ("C-c C-s L" . easysession-switch-to-and-restore-geometry)
;; ("C-c C-s s" . easysession-save)
;; ("C-c C-s r" . easysession-rename)
;; ("C-c C-s R" . easysession-reset)
;; ("C-c C-s u" . easysession-unload)
;; ("C-c C-s d" . easysession-delete))
:custom
(easysession-switch-to-save-session t)
(easysession-switch-to-exclude-current nil)
:bind ("C-x f" . other-frame-prefix)
:config
(setq easysession-setup-load-session t)
(easysession-setup)
(easysession-magit-mode)
(easysession-scratch-mode))
(define-key global-map (kbd "C-c b") #'beframe-prefix-map)
(setq beframe-functions-in-frames '(projectile-switch-project)
beframe-rename-function #'ignore
beframe-global-buffers '("*scratch*" "*Messages*" "*Backtrace*"))
(use-package embark
:defer
:config
(define-key embark-buffer-map (kbd "fu")
(defun my/beframe-unassume-buffer (buf)
(interactive "bUnassume: ")
(beframe--unassume
(list (get-buffer buf)))))
(define-key embark-buffer-map (kbd "fa")
(defun my/beframe-assume-buffer (buf)
(interactive "bAssume: ")
(beframe--assume
(list (get-buffer buf))))))
;; Beframe integration with other packages
(with-eval-after-load 'consult
(defun consult-beframe-buffer-list (&optional frame)
"Return the list of buffers from `beframe-buffer-names' sorted by visibility.
With optional argument FRAME, return the list of buffers of FRAME."
(beframe-buffer-list frame :sort #'beframe-buffer-sort-visibility))
(setq consult-buffer-list-function #'consult-beframe-buffer-list)))
(provide 'init-workspace)

19
lisp/init-writing.el Normal file
View File

@@ -0,0 +1,19 @@
;; -*- lexical-binding: t; -*-
(use-package flyspell
:ensure nil
:commands flyspell-mode
:bind (:map flyspell-mode-map
("C-M-i" . nil)
("C-;" . nil)
("C-," . nil)
("C-; C-4" . 'flyspell-auto-correct-previous-word)
;; ("C-; n" . 'flyspell-goto-next-error)
))
(use-package jinx
:hook ((text-mode prog-mode conf-mode org-mode) . jinx-mode)
:commands jinx-mode
:bind ([remap ispell-word] . jinx-correct))
(provide 'init-writing)

View File

@@ -1,236 +0,0 @@
;; -*- lexical-binding: t; -*-
(setq modus-themes-operandi-colors-override
'((bg-main "#fff0f2")
(bg-dim "#fbe6ef")
(bg-alt "#f5dae6")
(bg-hl-line "#fad8e3")
(bg-active "#efcadf")
(bg-inactive "#f3ddef")
(bg-active-accent "#ffbbef")
(bg-region "#dfc5d1")
(bg-region-accent "#efbfef")
(bg-region-accent-subtle "#ffd6ef")
(bg-header "#edd3e0")
(bg-tab-active "#ffeff2")
(bg-tab-inactive "#f8d3ef")
(bg-tab-inactive-accent "#ffd9f5")
(bg-tab-inactive-alt "#e5c0d5")
(bg-tab-inactive-alt-accent "#f3cce0")
(fg-main "#543f78")
(fg-dim "#5f476f")
(fg-alt "#7f6f99")
(fg-unfocused "#8f6f9f")
(fg-active "#563068")
(fg-inactive "#8a5698")
(fg-docstring "#5f5fa7")
(fg-comment-yellow "#a9534f")
(fg-escape-char-construct "#8b207f")
(fg-escape-char-backslash "#a06d00")
(bg-special-cold "#d3e0f4")
(bg-special-faint-cold "#e0efff")
(bg-special-mild "#c4ede0")
(bg-special-faint-mild "#e0f0ea")
(bg-special-warm "#efd0c4")
(bg-special-faint-warm "#ffe4da")
(bg-special-calm "#f0d3ea")
(bg-special-faint-calm "#fadff9")
(fg-special-cold "#405fb8")
(fg-special-mild "#407f74")
(fg-special-warm "#9d6f4f")
(fg-special-calm "#af509f")
(bg-completion "#ffc5e5")
(bg-completion-subtle "#f7cfef")
(red "#ed2f44")
(red-alt "#e0403d")
(red-alt-other "#e04059")
(red-faint "#ed4f44")
(red-alt-faint "#e0603d")
(red-alt-other-faint "#e06059")
(green "#217a3c")
(green-alt "#417a1c")
(green-alt-other "#006f3c")
(green-faint "#318a4c")
(green-alt-faint "#518a2c")
(green-alt-other-faint "#20885c")
(yellow "#b06202")
(yellow-alt "#a95642")
(yellow-alt-other "#a06f42")
(yellow-faint "#b07232")
(yellow-alt-faint "#a96642")
(yellow-alt-other-faint "#a08042")
(blue "#275ccf")
(blue-alt "#475cc0")
(blue-alt-other "#3340ef")
(blue-faint "#476ce0")
(blue-alt-faint "#575ccf")
(blue-alt-other-faint "#3f60d7")
(magenta "#bf317f")
(magenta-alt "#d033c0")
(magenta-alt-other "#844fe4")
(magenta-faint "#bf517f")
(magenta-alt-faint "#d053c0")
(magenta-alt-other-faint "#846fe4")
(cyan "#007a9f")
(cyan-alt "#3f709f")
(cyan-alt-other "#107f7f")
(cyan-faint "#108aaf")
(cyan-alt-faint "#3f80af")
(cyan-alt-other-faint "#3088af")
(red-active "#cd2f44")
(green-active "#116a6c")
(yellow-active "#993602")
(blue-active "#475ccf")
(magenta-active "#7f2ccf")
(cyan-active "#007a8f")
(red-nuanced-bg "#ffdbd0")
(red-nuanced-fg "#ed6f74")
(green-nuanced-bg "#dcf0dd")
(green-nuanced-fg "#3f9a4c")
(yellow-nuanced-bg "#fff3aa")
(yellow-nuanced-fg "#b47232")
(blue-nuanced-bg "#e3e3ff")
(blue-nuanced-fg "#201f6f")
(magenta-nuanced-bg "#fdd0ff")
(magenta-nuanced-fg "#c0527f")
(cyan-nuanced-bg "#dbefff")
(cyan-nuanced-fg "#0f3f60")
(bg-diff-heading "#b7cfe0")
(fg-diff-heading "#041645")
(bg-diff-added "#d6f0d6")
(fg-diff-added "#004520")
(bg-diff-changed "#fcefcf")
(fg-diff-changed "#524200")
(bg-diff-removed "#ffe0ef")
(fg-diff-removed "#891626")
(bg-diff-refine-added "#84cfa4")
(fg-diff-refine-added "#002a00")
(bg-diff-refine-changed "#cccf8f")
(fg-diff-refine-changed "#302010")
(bg-diff-refine-removed "#da92b0")
(fg-diff-refine-removed "#500010")
(bg-diff-focus-added "#a6e5c6")
(fg-diff-focus-added "#002c00")
(bg-diff-focus-changed "#ecdfbf")
(fg-diff-focus-changed "#392900")
(bg-diff-focus-removed "#efbbcf")
(fg-diff-focus-removed "#5a0010"))
modus-themes-vivendi-color-overrides
'((bg-main "#25152a")
(bg-dim "#2a1930")
(bg-alt "#382443")
(bg-hl-line "#332650")
(bg-active "#463358")
(bg-inactive "#2d1f3a")
(bg-active-accent "#50308f")
(bg-region "#5d4a67")
(bg-region-accent "#60509f")
(bg-region-accent-subtle "#3f285f")
(bg-header "#3a2543")
(bg-tab-active "#26162f")
(bg-tab-inactive "#362647")
(bg-tab-inactive-accent "#36265a")
(bg-tab-inactive-alt "#3e2f5a")
(bg-tab-inactive-alt-accent "#3e2f6f")
(fg-main "#debfe0")
(fg-dim "#d0b0da")
(fg-alt "#ae85af")
(fg-unfocused "#8e7f9f")
(fg-active "#cfbfef")
(fg-inactive "#b0a0c0")
(fg-docstring "#c8d9f7")
(fg-comment-yellow "#cf9a70")
(fg-escape-char-construct "#ff75aa")
(fg-escape-char-backslash "#dbab40")
(bg-special-cold "#2a3f58")
(bg-special-faint-cold "#1e283f")
(bg-special-mild "#0f3f31")
(bg-special-faint-mild "#0f281f")
(bg-special-warm "#44331f")
(bg-special-faint-warm "#372213")
(bg-special-calm "#4a314f")
(bg-special-faint-calm "#3a223f")
(fg-special-cold "#c0b0ff")
(fg-special-mild "#bfe0cf")
(fg-special-warm "#edc0a6")
(fg-special-calm "#ff9fdf")
(bg-completion "#502d70")
(bg-completion-subtle "#451d65")
(red "#ff5f6f")
(red-alt "#ff8f6d")
(red-alt-other "#ff6f9d")
(red-faint "#ffa0a0")
(red-alt-faint "#f5aa80")
(red-alt-other-faint "#ff9fbf")
(green "#51ca5c")
(green-alt "#71ca3c")
(green-alt-other "#51ca9c")
(green-faint "#78bf78")
(green-alt-faint "#99b56f")
(green-alt-other-faint "#88bf99")
(yellow "#f0b262")
(yellow-alt "#f0e242")
(yellow-alt-other "#d0a272")
(yellow-faint "#d2b580")
(yellow-alt-faint "#cabf77")
(yellow-alt-other-faint "#d0ba95")
(blue "#778cff")
(blue-alt "#8f90ff")
(blue-alt-other "#8380ff")
(blue-faint "#82b0ec")
(blue-alt-faint "#a0acef")
(blue-alt-other-faint "#80b2f0")
(magenta "#ff70cf")
(magenta-alt "#ff77f0")
(magenta-alt-other "#ca7fff")
(magenta-faint "#e0b2d6")
(magenta-alt-faint "#ef9fe4")
(magenta-alt-other-faint "#cfa6ff")
(cyan "#30cacf")
(cyan-alt "#60caff")
(cyan-alt-other "#40b79f")
(cyan-faint "#90c4ed")
(cyan-alt-faint "#a0bfdf")
(cyan-alt-other-faint "#a4d0bb")
(red-active "#ff6059")
(green-active "#64dc64")
(yellow-active "#ffac80")
(blue-active "#4fafff")
(magenta-active "#cf88ff")
(cyan-active "#50d3d0")
(red-nuanced-bg "#440a1f")
(red-nuanced-fg "#ffcccc")
(green-nuanced-bg "#002904")
(green-nuanced-fg "#b8e2b8")
(yellow-nuanced-bg "#422000")
(yellow-nuanced-fg "#dfdfb0")
(blue-nuanced-bg "#1f1f5f")
(blue-nuanced-fg "#bfd9ff")
(magenta-nuanced-bg "#431641")
(magenta-nuanced-fg "#e5cfef")
(cyan-nuanced-bg "#042f49")
(cyan-nuanced-fg "#a8e5e5")
(bg-diff-heading "#304466")
(fg-diff-heading "#dae7ff")
(bg-diff-added "#0a383a")
(fg-diff-added "#94ba94")
(bg-diff-changed "#2a2000")
(fg-diff-changed "#b0ba9f")
(bg-diff-removed "#50163f")
(fg-diff-removed "#c6adaa")
(bg-diff-refine-added "#006a46")
(fg-diff-refine-added "#e0f6e0")
(bg-diff-refine-changed "#585800")
(fg-diff-refine-changed "#ffffcc")
(bg-diff-refine-removed "#952838")
(fg-diff-refine-removed "#ffd9eb")
(bg-diff-focus-added "#1d4c3f")
(fg-diff-focus-added "#b4dfb4")
(bg-diff-focus-changed "#424200")
(fg-diff-focus-changed "#d0daaf")
(bg-diff-focus-removed "#6f0f39")
(fg-diff-focus-removed "#eebdba")))
(provide 'modus-summer-time)
;;

View File

@@ -1,192 +0,0 @@
;;; persp-mode-project-bridge.el --- Integration of persp-mode + project.el -*- lexical-binding: t -*-
;; Copyright (C) 2017 Constantin Kulikov
;; Copyright (C) 2021 Siavash Askari Nasr
;;
;; Author: Constantin Kulikov (Bad_ptr) <zxnotdead@gmail.com>
;; Siavash Askari Nasr <siavash.askari.nasr@gmail.com>
;; Maintainer: Siavash Askari Nasr <siavash.askari.nasr@gmail.com>
;; Version: 0.1
;; Package-Requires: ((emacs "27.1") (persp-mode "2.9"))
;; SPDX-License-Identifier: GPL-3.0-or-later
;; Keywords: vc, persp-mode, perspective, project, project.el
;; URL: https://github.com/CIAvash/persp-mode-project-bridge
;;; License:
;; This file is not part of GNU Emacs.
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3, or (at your option)
;; any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;;; Commentary:
;; Creates a perspective for each project.el project. (Based on the persp-mode-projectile-bridge)
;;; Usage:
;; Installation:
;; M-x package-install-file RET persp-mode-project-bridge RET
;; Example configuration:
;; (with-eval-after-load "persp-mode-project-bridge-autoloads"
;; (add-hook 'persp-mode-project-bridge-mode-hook
;; (lambda ()
;; (if persp-mode-project-bridge-mode
;; (persp-mode-project-bridge-find-perspectives-for-all-buffers)
;; (persp-mode-project-bridge-kill-perspectives))))
;; (add-hook 'after-init-hook
;; (lambda ()
;; (persp-mode-project-bridge-mode 1))
;; t))
;;
;; With use-package:
;; (use-package persp-mode-project-bridge
;; :hook
;; (persp-mode-project-bridge-mode . (lambda ()
;; (if persp-mode-project-bridge-mode
;; (persp-mode-project-bridge-find-perspectives-for-all-buffers)
;; (persp-mode-project-bridge-kill-perspectives))))
;; (persp-mode . persp-mode-project-bridge-mode))
;;; Code:
(require 'persp-mode)
(require 'project)
(require 'cl-lib)
(declare-function project-root "project")
(defvar persp-mode-project-bridge-mode nil)
(defgroup persp-mode-project-bridge nil
"persp-mode project.el integration."
:group 'persp-mode
:group 'project
:prefix "persp-mode-project-bridge-"
:link
'(url-link
:tag "Github" "https://github.com/CIAvash/persp-mode-project-bridge"))
(defcustom persp-mode-project-bridge-persp-name-prefix "[p] "
"Prefix to use for project perspective names."
:group 'persp-mode-project-bridge
:type 'string
:set (lambda (sym val)
(if persp-mode-project-bridge-mode
(let ((old-prefix (symbol-value sym)))
(custom-set-default sym val)
(let (old-name)
(mapc (lambda (p)
(when (and
p (persp-parameter
'persp-mode-project-bridge p))
(setq old-name
(substring (persp-name p)
(string-width old-prefix)))
(persp-rename (concat val old-name) p)))
(persp-persps))))
(custom-set-default sym val))))
(defun persp-mode-project-bridge-add-new-persp (name)
"Create a new perspective NAME."
(let ((persp (persp-get-by-name name *persp-hash* :nil)))
(if (eq :nil persp)
(prog1
(setq persp (persp-add-new name))
(when persp
(set-persp-parameter 'persp-mode-project-bridge t persp)
(set-persp-parameter 'dont-save-to-file t persp)
(persp-add-buffer (cl-remove-if-not #'get-file-buffer (project-files (project-current)))
persp nil nil)))
persp)))
(defun persp-mode-project-bridge-find-perspective-for-buffer (b)
"Find a perspective for buffer B."
(when (buffer-live-p b)
(with-current-buffer b
(when (and persp-mode-project-bridge-mode
(buffer-name b) (project-current))
(let ((persp (persp-mode-project-bridge-add-new-persp
(concat persp-mode-project-bridge-persp-name-prefix
(file-name-nondirectory
(directory-file-name
(if (fboundp 'project-root)
(project-root (project-current))
(car (project-roots (project-current))))))))))
(when persp
(persp-add-buffer b persp nil nil)
persp))))))
(defun persp-mode-project-bridge-hook-switch (&rest _args)
"Switch to a perspective when hook is activated."
(let ((persp
(persp-mode-project-bridge-find-perspective-for-buffer
(current-buffer))))
(when persp
(persp-frame-switch (persp-name persp)))))
(defun persp-mode-project-bridge-find-perspectives-for-all-buffers ()
"Find perspectives for all buffers."
(when persp-mode-project-bridge-mode
(mapc #'persp-mode-project-bridge-find-perspective-for-buffer
(buffer-list))))
(defun persp-mode-project-bridge-kill-perspectives ()
"Kill all bridge perspectives."
(when persp-mode
(mapc #'persp-kill
(mapcar #'persp-name
(cl-delete-if-not
(apply-partially
#'persp-parameter
'persp-mode-project-bridge)
(persp-persps))))))
(defvar persp-mode-project-bridge-switch-hooks
(list 'find-file-hook 'dired-mode-hook 'vc-dir-mode-hook 'eshell-mode-hook))
;;;###autoload
(define-minor-mode persp-mode-project-bridge-mode
"`persp-mode' and `project.el' integration.
Creates perspectives for project.el projects."
:require 'persp-mode-project-bridge
:group 'persp-mode-project-bridge
:init-value nil
:global t
(if persp-mode-project-bridge-mode
(if persp-mode
(progn
;; Add hooks
(add-hook 'persp-mode-hook
(lambda ()
(unless persp-mode
(persp-mode-project-bridge-mode -1))))
(dolist (hook persp-mode-project-bridge-switch-hooks)
(add-hook hook #'persp-mode-project-bridge-hook-switch)))
(message "You can not enable persp-mode-project-bridge-mode \
unless persp-mode is active.")
(setq persp-mode-project-bridge-mode nil))
;; Remove hooks
(dolist (hook persp-mode-project-bridge-switch-hooks)
(remove-hook hook #'persp-mode-project-bridge-hook-switch))))
(provide 'persp-mode-project-bridge)
;;; persp-mode-project-bridge.el ends here

View File

@@ -1,432 +0,0 @@
;;; texpresso.el --- Render and synchronize buffers with TeXpresso -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2023 Frédéric Bour
;; Hello world
;; Author: Frédéric Bour <frederic.bour@lakaban.net>
;; Maintainer: Frédéric Bour <frederic.bour@lakaban.net>
;; Created: March 25, 2023
;; Modified: March 25, 2023
;; Version: 0.0.1
;; Keywords: lisp local processes tex tools unix
;; Homepage: https://github.com/def/sync
;; Package-Requires: ((emacs "25.1"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; TeXpresso is a tool to recompute LaTeX documents and error log interactively.
;;
;;; Code:
;; Customizable variables
(defcustom texpresso-binary nil
"Path of TeXpresso binary."
:group 'tex
:risky t
:type '(choice (file :tag "Path")
(const :tag "Auto" nil)))
(defcustom texpresso-follow-edition nil
"If true, TeXpresso scrolls the view to the code being edited."
:group 'tex
:type 'boolean)
(defcustom texpresso-follow-cursor nil
"If true, TeXpresso scrolls the view to the cursor."
:group 'tex
:type 'boolean)
;; Main code
(defvar texpresso--process nil
"The running instance of TeXpresso as an Emacs process object, or nil.
`texpresso--process' is the latest process launched, it might be dead.
The process is also guaranteed to have a property named `'marker` that is
updated when synchronization state is reset.
When a buffer is synchronized with a process, it keeps a reference to the marker
object of that process. To check if incremental synchronization is possible, the
marker objects are compared for physical equality.
\(In practice they are `(cons nil nil)` objects, though their structural value is
not used anywhere.\)")
(defun texpresso--send (&rest value)
"Send VALUE as a serialized s-expression to `texpresso--process'."
(setq value (prin1-to-string value))
; (with-current-buffer (get-buffer-create "*texpresso-log*")
; (let ((inhibit-read-only t))
; (insert value)
; (insert "\n")))
(process-send-string texpresso--process value))
(defvar-local texpresso--state nil
"Internal synchronization state for current buffer.
The state is either nil (buffer not yet synchronized) or a list
`(list (buffer-file-name) texpresso--process marker)'.
The list is used to detect if, since last synchronization, the filename has
changed, the process has changed, or the synchronization state was reset
\(new marker\).")
(defvar-local texpresso--before-change nil
"A list (start end txt) saved during the last call to `texpresso--before-change'.
TeXpresso changes are expressed using byte offsets.
In the `after-change-functions' hook, one can only access the number of
characters removed by the change, and since the text has been already removed,
it is too late to access the number of bytes. To work around this limitation,
the changed region is saved by the `texpresso--before-change' function (a
`before-change-functions' hook).")
(define-minor-mode texpresso-mode
"A global minor mode that synchronizes buffer with TeXpresso.
Also launches a new TeXpresso process if none is running."
:init-value nil ; Initial value, nil for disabled
:global nil
:group 'tex
:lighter ""
(if texpresso-mode
(progn
(message "TeXpresso ☕ enabled")
(add-hook 'after-change-functions #'texpresso--after-change)
(add-hook 'before-change-functions #'texpresso--before-change)
(add-hook 'post-command-hook #'texpresso--post-command))
(message "TeXpresso ☕ disabled")
(remove-hook 'after-change-functions #'texpresso--after-change)
(remove-hook 'before-change-functions #'texpresso--before-change)
(remove-hook 'post-command-hook #'texpresso--post-command)))
(define-minor-mode texpresso-sync-mode
"A minor mode that forces a buffer to be synchronized with TeXpresso.
Otherwise a buffer is synchronized if its major mode derives from `tex-mode'."
:init-value nil ; Initial value, nil for disabled
:global nil
:group 'tex
:lighter ""
(setq texpresso--state nil))
(defvar-local texpresso--output-bound nil)
(defvar-local texpresso--output-timer nil)
(defun texpresso-move-to-cursor (&optional position)
"Scroll TeXpresso views to POSITION (or point)."
(interactive)
(when (texpresso--enabled-p)
(texpresso--send 'synctex-forward
(buffer-file-name)
(line-number-at-pos position t))))
(defun texpresso--output-truncate (buffer)
"Truncate TeXpresso output buffer BUFFER."
(with-current-buffer buffer
(when texpresso--output-timer
(cancel-timer texpresso--output-timer))
(when (and texpresso--output-bound
(<= texpresso--output-bound (point-max)))
(let ((inhibit-read-only t))
(delete-region texpresso--output-bound (point-max))))))
(defun texpresso--output-schedule-truncate (point)
"Schedule a truncation of current buffer to POINT.
Scheduling allows truncation to not happen too often, slowing down the editor
and causing it to flicker."
(when texpresso--output-timer
(cancel-timer texpresso--output-timer))
(setq texpresso--output-bound point)
(setq texpresso--output-timer
(run-with-timer 1 nil #'texpresso--output-truncate (current-buffer))))
(defun texpresso--enabled-p ()
"Check if TeXpresso is running and enabled for the current buffer."
(and (process-live-p texpresso--process)
(or texpresso-sync-mode
(derived-mode-p 'tex-mode))))
(defun texpresso--before-change (start end)
"A `before-change-functions' hook to update `texpresso--before-change' variable.
It records the number of bytes between START and END (the bytes removed)."
(when (texpresso--enabled-p)
; (message "before change %S %S" start end)
(setq texpresso--before-change
(list start end (buffer-substring-no-properties start end)))))
(defun texpresso--after-change (start end removed)
"An `after-change-functions' hook to synchronize the buffer with TeXpresso.
It instructs `texpresso--process' to replace REMOVED characters by the contents
between START and END.
Character counts are converted to byte offsets using `texpresso--before-change'."
(when (texpresso--enabled-p)
; (message "after change %S %S %S" start end removed)
(let ((filename (nth 0 texpresso--state))
(process (nth 1 texpresso--state))
(marker (nth 2 texpresso--state))
(bstart (nth 0 texpresso--before-change))
(bend (nth 1 texpresso--before-change))
(btext (nth 2 texpresso--before-change))
same-process)
(setq same-process
(and (eq filename (buffer-file-name))
(eq process texpresso--process)
(eq marker (process-get texpresso--process 'marker))))
(if (and same-process (<= bstart start (+ start removed) bend))
(let ((ofs (- start bstart)))
(texpresso--send 'change filename (1- (position-bytes start))
(string-bytes (substring btext ofs (+ ofs removed)))
(buffer-substring-no-properties start end)))
(when same-process
(message "TeXpresso: change hooks called with invalid arguments")
(message "(before-change %S %S %S)" bstart bend btext)
(message "(after-change %S %S %S)" start end removed))
(when (process-live-p process)
(process-send-string
process (prin1-to-string (list 'close filename))))
(setq texpresso--state
(list (buffer-file-name) texpresso--process
(process-get texpresso--process 'marker)))
(texpresso--send 'open (buffer-file-name)
(buffer-substring-no-properties
(point-min) (point-max))))
(when texpresso-follow-edition
(texpresso--send 'synctex-forward
(buffer-file-name)
(line-number-at-pos nil t))))))
(defun texpresso--post-command ()
"Function executed on post-command hook.
Sends cursor position to TeXpresso if `texpresso-follow-cursor'."
(when texpresso-follow-cursor
(texpresso-move-to-cursor)))
(defun texpresso--stderr-filter (process text)
"Save debug TEXT from TeXpresso PROCESS in *texpresso-stderr* buffer.
The output is truncated to ~50k."
(let ((buffer (process-buffer process)))
(when buffer
(with-current-buffer buffer
(save-excursion
(when (> (point-max) 49152)
(delete-region (point-min) 16384))
(goto-char (point-max))
(insert text))))))
(defun texpresso--display-output (buffer)
"Display BUFFER in a small window at bottom."
(if nil ;(fboundp '+popup/buffer)
(with-current-buffer buffer (+popup/buffer))
(display-buffer-at-bottom buffer '(nil (allow-no-window . t) (window-height . 0.2)))))
(defun texpresso--get-output-buffer (name &optional force)
"Return the buffer associated to TeXpresso channel NAME.
TeXpresso forwards different outputs of TeX process.
The standard output is named `'out' and the log file `'log'.
If it doesn't exists and FORCE is set, the buffer is created, otherwise nil is
returned."
(let (fullname buffer)
(setq fullname (cond
((eq name 'out) "*texpresso-out*")
((eq name 'log) "*texpresso-log*")
(t (error "TeXpresso: unknown buffer %S" name))))
(setq buffer (get-buffer fullname))
(when (and (not buffer) force)
(setq buffer (get-buffer-create fullname))
(with-current-buffer buffer
(setq buffer-read-only t
buffer-undo-list t)
(when (eq name 'out)
(compilation-mode)
(texpresso--display-output buffer))))
buffer))
(defun texpresso-display-output ()
"Open a small window to display TeXpresso output messages."
(interactive)
(texpresso--display-output (texpresso--get-output-buffer 'out 'force)))
(defun texpresso--stdout-dispatch (process expr)
"Interpret s-expression EXPR sent by TeXpresso PROCESS.
TeXpresso communicates with Emacs by writing a sequence of s-expressions on its
standard output. This function interprets one of these."
(let ((tag (car expr)))
(cond
((eq tag 'reset-sync)
(process-put process 'marker (cons nil nil)))
((eq tag 'truncate)
(let ((buffer (texpresso--get-output-buffer (nth 1 expr))))
(when buffer
(with-current-buffer buffer
(let ((pos (byte-to-position (1+ (nth 2 expr)))))
(when pos
(texpresso--output-schedule-truncate pos)))))))
((eq tag 'append)
(with-current-buffer (texpresso--get-output-buffer (nth 1 expr) 'force)
(let ((inhibit-read-only t)
(pos (byte-to-position (1+ (nth 2 expr))))
(text (nth 3 expr))
(window (get-buffer-window))
lines endpos)
(setq endpos (+ pos (length text)))
(unless (and (>= (point-max) endpos)
(string= text (buffer-substring pos endpos)))
(goto-char pos)
(setq lines (line-number-at-pos pos))
(insert text)
(setq lines (- (line-number-at-pos (point)) lines))
(when (> lines 0)
(save-excursion
(let ((beg (point)))
(forward-line lines)
(delete-region beg (point)))))
(when window (with-selected-window window
(goto-char (1- (point-max)))
(recenter -1))))
(texpresso--output-schedule-truncate endpos))))
((eq tag 'flush)
(dolist (buffer (list (texpresso--get-output-buffer 'out)
(texpresso--get-output-buffer 'log)))
(when buffer (texpresso--output-truncate buffer))))
((eq tag 'synctex)
(let ((fname (nth 1 expr)) buf)
(setq buf (and (file-exists-p fname)
(if (string= (buffer-name) "*TeXpresso window*")
(find-file-other-window fname)
(find-file fname))))
(if buf
(with-current-buffer buf
(goto-char (point-min))
(forward-line (1- (nth 2 expr)))
(switch-to-buffer buf))
(message "TeXpresso: unknown file %s" (nth 1 expr)))))
(t (message "Unknown message in texpresso output: %S" expr)))))
(defun texpresso--stdout-filter (process text)
"Interpret output of TeXpresso PROCESS.
TeXpresso communicates with Emacs by writing a sequence of textual s-expressions
on its standard output. This function receives a chunk of this TEXT, parses and
forwards the complete ones to `texpresso--stdout-dispatch', and buffers the
remainder."
(let ((prefix (process-get process 'buffer)))
(when prefix (setq text (concat prefix text))))
(let ((pos 0))
(condition-case nil
(while t
(let ((result (read-from-string text pos)))
(setq pos (cdr result))
(condition-case-unless-debug err
(texpresso--stdout-dispatch process (car result))
(error (message
"Error in texpresso--stdout-dispatch: %S\nWhile processing: %S"
err (car result))))))
((end-of-file)
(process-put process 'buffer (substring text pos))))))
(defun texpresso-reset ()
"Invalidate the synchronization state of all buffers."
(interactive)
(when texpresso--process
(process-put texpresso--process 'marker (cons nil nil))))
(defun texpresso-reset-buffer ()
"Invalidate the synchronization state of current buffer."
(interactive)
(setq texpresso--state nil))
(defadvice enable-theme (after texpresso--theme-change protect activate)
"Tell TeXpresso about new theme colors."
(when (process-live-p texpresso--process)
(texpresso--send 'theme
(color-name-to-rgb (face-attribute 'default :background))
(color-name-to-rgb (face-attribute 'default :foreground)))))
(defun texpresso--make-process (&rest command)
"Create and setup a new TeXpresso process with given COMMAND."
(when (process-live-p texpresso--process)
(kill-process texpresso--process))
(let ((texpresso-stderr (get-buffer-create "*texpresso-stderr*")))
(with-current-buffer texpresso-stderr (setq buffer-undo-list t))
(dolist (buffer (list (texpresso--get-output-buffer 'out 'force)
(texpresso--get-output-buffer 'log)))
(let ((inhibit-read-only t))
(when buffer
(with-current-buffer buffer
(delete-region (point-min) (point-max))))))
(setq texpresso--process
(make-process :name "texpresso"
:stderr texpresso-stderr
:connection-type 'pipe
:command command))
(set-process-filter (get-buffer-process texpresso-stderr)
#'texpresso--stderr-filter)
(set-process-filter texpresso--process
#'texpresso--stdout-filter)
(process-put texpresso--process 'marker (cons nil nil))
(texpresso--send 'theme
(color-name-to-rgb (face-attribute 'default :background))
(color-name-to-rgb (face-attribute 'default :foreground)))))
(defun texpresso-connect-debugger ()
"Create a new TeXpresso process using the debug proxy.
Normal TeXpresso processes are started using `texpresso-mode' or
`texpresso-restart'. This function is reserved for debugging purposes. It
connects to an existing TeXpresso instance launched in a terminal using
\"texpresso-debug\" shell command.
I came up with this workflow because Emacs (29.0.60 on macOS) bugged
when attaching a debugger to a process it launched. More specifically,
the bug was that the first interaction was successful, but then Emacs marked the
process as exited (in `process-status') and no more contents could be sent to
it, even though the process was still sending its stderr to Emacs."
(interactive)
(texpresso--make-process "texpresso-debug-proxy"))
(defun texpresso (&optional filename)
"Start a new TeXpresso process using FILENAME as the master TeX file.
When called interactively with a prefix argument, ask for the file.
If FILENAME is nil, use `TeX-master' from AUCTeX or `buffer-file-name'."
(interactive "P")
(unless texpresso-mode
(texpresso-mode 1))
(let ((tm-fn (when (boundp 'TeX-master)
(TeX-master-file t))))
(if (or (consp filename) (numberp filename)
(and (called-interactively-p) (null filename) (null tm-fn)))
;; called interactively with a prefix or default unavailable
(setq filename (read-file-name "TeX root file: " nil tm-fn))
;; called interactively without prefix or from lisp, fall back
(unless filename (setq filename tm-fn)))
(unless filename (error "TeXpresso: no valid TeX root file available.")))
(condition-case err
(texpresso--make-process (or texpresso-binary "texpresso")
(expand-file-name filename))
((file-missing)
(customize-variable 'texpresso-binary)
(message "Cannot launch TeXpresso. Please select the executable file and try again. (error: %S)"
(cdr err)))))
(defun texpresso-signal ()
"Tell TeXpresso processes to check filesystem for changed files.
This is an alternative, more manual, workflow.
During development, it can also be used to hot-reload TeXpresso code."
(interactive)
(call-process "killall" nil 0 nil "-SIGUSR1" "texpresso"))
(defun texpresso-previous-page ()
"Tell TeXpresso to move to previous page."
(interactive)
(texpresso--send 'previous-page))
(defun texpresso-next-page ()
"Tell TeXpresso to move to next page."
(interactive)
(texpresso--send 'next-page))
(provide 'texpresso)
;;; texpresso.el ends here

View File

@@ -2,4 +2,8 @@
# name: provide
# key: provide
# --
;; -*- lexical-binding: t; -*-
$0
(provide '${1:`(file-name-sans-extension (file-name-nondirectory (buffer-file-name)))`})$0

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor : Mads D. Kristensen <madsdk@gmail.com>
# key : abstract
# group: sections
# name : \abstract
# --
\begin{abstract}
$0
\end{abstract}

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor : Rasmus Borgsmidt <rasmus@borgsmidt.dk>
# key : align
# group: environments
# name : \begin{align} ... \end{align}
# --
\begin{align}
$0
\end{align}

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor : Rasmus Borgsmidt <rasmus@borgsmidt.dk>
# key : align*
# group: environments
# name : \begin{align*} ... \end{align*}
# --
\begin{align*}
$0
\end{align*}

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor : Peter Urbak <peter@dragonwasrobot.com>
# key : arr
# group: environments
# name : \begin{array} ... \end{array}
# --
\begin{array}{$1}
$0
\end{array}

View File

@@ -1,28 +0,0 @@
# -*- mode: snippet -*-
# contributor: Mads D. Kristensen <madsdk@gmail.com>
# contributor : Song Qiang <tsiangsung@gmail.com>
# key: article
# group: skeleton
# name: \documentclass{article} ...
# --
\documentclass[11pt]{article}
\usepackage{graphicx,amsmath,amssymb,subfigure,url,xspace}
\newcommand{\eg}{e.g.,\xspace}
\newcommand{\bigeg}{E.g.,\xspace}
\newcommand{\etal}{\textit{et~al.\xspace}}
\newcommand{\etc}{etc.\@\xspace}
\newcommand{\ie}{i.e.,\xspace}
\newcommand{\bigie}{I.e.,\xspace}
\title{${1:title}}
\author{${2:Author Name}}
\begin{document}
\maketitle
\bibliographystyle{${3:plain}}
\bibliography{${4:literature.bib}}
\end{document}

View File

@@ -1,37 +0,0 @@
# -*- mode: snippet -*-
# contributor: Claudio Marforio <marforio@gmail.com>
# key: beamer
# group: skeleton
# name: \documentclass{beamer} ...
# --
\documentclass[xcolor=dvipsnames]{beamer}
\usepackage{graphicx,subfigure,url}
% example themes
\usetheme{Frankfurt}
\usecolortheme{seahorse}
\usecolortheme{rose}
% put page numbers
% \setbeamertemplate{footline}[frame number]{}
% remove navigation symbols
% \setbeamertemplate{navigation symbols}{}
\title{${1:Presentation Title}}
\author{${2:Author Name}}
\begin{document}
\frame[plain]{\titlepage}
\begin{frame}[plain]{Outline}
\tableofcontents
\end{frame}
\section{${3:Example Section}}
\begin{frame}{${4:Frame Title}}
\end{frame}
\end{document}

View File

@@ -1,7 +0,0 @@
# -*- mode: snippet -*-
# key : beg
# name : \begin{} ... \end{}
# --
\begin{${1:$$(yas-choose-value (mapcar 'car LaTeX-environment-list))}}
$0
\end{$1}

View File

@@ -1,8 +0,0 @@
# -*- mode: snippet -*-
# contributor: Mads D. Kristensen <madsdk@gmail.com>
# key: bib
# group: misc
# name: \bibliography
# --
\bibliographystyle{plain}
\bibliography{$1}$0

View File

@@ -1,7 +1,8 @@
# -*- mode: snippet -*-
# contributor: François Garillot <francois@garillot.net>
# key: bigop
# key: bop
# group: math
# name: \bigop_{n}^{}
# condition: (and (texmathp) 'auto)
# --
\\big${1:$$(yas/choose-value '("oplus" "otimes" "odot" "cup" "cap" "uplus" "sqcup" "vee" "wedge"))}_{$2}^{$3}$0

View File

@@ -1,8 +0,0 @@
# -*- mode: snippet -*-
# contributor : Mads D. Kristensen <madsdk@gmail.com>
# key : cha*
# group: sections
# name : \chapter*
# --
\chapter*{${1:name}}
$0

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor : Mads D. Kristensen <madsdk@gmail.com>
# key: enum
# group: environments
# name : \begin{enumerate} ... \end{enumerate}
# --
\begin{enumerate}
\item $0
\end{enumerate}

View File

@@ -1,10 +0,0 @@
# -*- mode: snippet -*-
# contributor: Mads D. Kristensen <madsdk@gmail.com>
# key: eq
# group: math
# name: \begin{equation} ... \end{equation}
# --
\begin{equation}
\label{${1:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}}
$0
\end{equation}

View File

@@ -1,10 +0,0 @@
# -*- mode: snippet -*-
# contributor: Mads D. Kristensen <madsdk@gmail.com>
# key: eqs
# group: math
# name: \begin{align} ... \end{align}
# --
\begin{${1:$$(yas/choose-value '("align" "align*" "multline" "gather" "subequations"))}}
\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}}
$0
\end{$1}

View File

@@ -1,12 +0,0 @@
# -*- mode: snippet -*-
# contributor : Mads D. Kristensen <madsdk@gmail.com>
# key : fig
# group: environments
# name : \begin{figure} ... \end{figure}
# --
\begin{figure}[htbp]
\centering
$0
\caption{${1:caption}}
\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}}
\end{figure}

View File

@@ -3,5 +3,6 @@
# key: frac
# group: math
# name: \frac{numerator}{denominator}
# condition: (and (texmathp) 'auto)
# --
\frac{${1:numerator}}{${2:denominator}}$0

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor: Claudio Marforio <marforio@gmail.com>
# key: frame
# group: environments
# name : \begin{frame} ... \end{frame}
# --
\begin{frame}{${1:Frame Title$(capitalize yas-text)}}
$0
\end{frame}

View File

@@ -1,6 +1,6 @@
# -*- mode: snippet -*-
# contributor: Song Qiang <tsiangsung@gmail.com>
# key: integ
# key: int
# group: math
# condition: (and (texmathp) 'auto)
# name: Indefinite integral (all)

View File

@@ -4,4 +4,4 @@
# condition: (and (texmathp) 'auto)
# group: math
# --
^{\text{-}1}
^{-1}

View File

@@ -1,7 +1,7 @@
# -*- mode: snippet -*-
# name: limit
# key: lim
# conditon: (texmathp)
# condition: (and (texmathp) 'auto)
# group: math
# --
\\lim_{${1:n} \\to ${2:\\infty}} $0

View File

@@ -1,9 +0,0 @@
# -*- mode: snippet -*-
# contributor: Mads D. Kristensen <madsdk@gmail.com>
# key: minipage
# group: environments
# name: \begin{minipage}[position][width] ... \end{minipage}
# --
\begin{minipage}[${1:htbp}]{${2:1.0}${3:\linewidth}}
$0
\end{minipage}