;;; --- 1. 包管理与镜像源 --- (require 'package) (setq package-archives '(("gnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/") ("nongnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/nongnu/") ("melpa" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/"))) (package-initialize) ;; 自动安装基础包 (unless package-archive-contents (package-refresh-contents)) (dolist (pkg '(use-package company orderless rust-mode cargo)) (unless (package-installed-p pkg) (package-install pkg))) (with-eval-after-load 'ox (require 'ox-md)) ;; 记得下载doom-themes: M-x package-install doom-themes ;; 或者是 timu-macos t ;; 1. 先设置变体为浅色 ;;(setq timu-macos-variant "light") ;; 2. 再加载主题 ;;(use-package timu-macos-theme ;; :ensure t ;; :config ;; (load-theme 'timu-macos t)) ;;(customize-set-variable 'timu-macos-flavour "light") ;;(load-theme 'modus-operandi-tinted t) (load-theme 'doom-snazzy t) ;; 关闭工具栏 (带图标的那一栏) (tool-bar-mode -1) ;; 如果你觉得菜单栏(File, Edit...)也占地方,可以顺便关掉 ;;(menu-bar-mode -1) ;; 如果你在图形界面下,滚动条也可以关掉 (scroll-bar-mode -1) ;; 性能优化:提升 LSP 通讯读取限制 (setq read-process-output-max (* 1024 1024)) (setq gc-cons-threshold (* 100 1024 1024)) ;;; --- 2. 基础 UI 与编码设置 --- (set-language-environment "UTF-8") (setq inhibit-startup-screen t) (global-display-line-numbers-mode t) (electric-pair-mode t) (set-face-attribute 'default nil :family "Consolas" :height 160) (dolist (charset '(kana han symbol cjk-misc bopomofo)) (set-fontset-font (frame-parameter nil 'font) charset (font-spec :family "Microsoft YaHei"))) ; 中文 (setq-default indent-tabs-mode nil) (setq-default tab-width 4) ;; 设置剪贴板编码为 utf-8 (set-selection-coding-system 'utf-8) ;; 更加全面的编码设置(推荐) (set-language-environment "UTF-8") (set-default-coding-systems 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (prefer-coding-system 'utf-8) (if (eq system-type 'windows-nt) ;; Windows 专用设置 (set-selection-coding-system 'utf-16le-dos) ;; Linux/macOS 专用设置 (set-selection-coding-system 'utf-8)) ;; 备份设置 (setq backup-directory-alist `(("." . "~/.emacs.d/backups/"))) (setq vc-make-backup-files t) ;;; --- 3. Company 补全配置 --- (setq company-minimum-prefix-length 2) (setq company-idle-delay 0.1) (setq company-show-quick-access t) (add-hook 'after-init-hook 'global-company-mode) (with-eval-after-load 'company (define-key company-active-map (kbd "RET") nil) (define-key company-active-map (kbd "") nil) (define-key company-active-map (kbd "TAB") #'company-complete-selection) (define-key company-active-map [tab] #'company-complete-selection)) ;;; --- 4. Eglot (LSP) 核心配置 --- (use-package eglot :ensure nil :hook ((python-mode . eglot-ensure) (c-mode . eglot-ensure) (c++-mode . eglot-ensure) (rust-mode . eglot-ensure) (go-mode . eglot-ensure) (java-mode . eglot-ensure)) :config (setq eglot-autoshutdown t) (setq eglot-format-on-save nil) (setq flymake-no-changes-timeout 2.0) ;; 禁用不必要的能力,保持响应速度 (add-to-list 'eglot-ignored-server-capabilities :inlayHintProvider) (add-to-list 'eglot-ignored-server-capabilities :documentOnTypeFormattingProvider) ;; 确保保存时不自动格式化 (add-hook 'eglot-managed-mode-hook (lambda () (remove-hook 'before-save-hook 'eglot-format-buffer t)))) ;;; --- 5. 编程语言专属设置 --- ;; ** Rust ** ;;1 rust-analyzer: 这是 LSP 的大脑。 ;;安装命令:rustup component add rust-analyzer ;;2 clippy: 更好的静态检查。 ;;安装命令:rustup component add clippy ;;rustfmt: 虽然你关闭了自动格式化,但建议保留以备手动调用。 ;;安装命令:rustup component add rustfmt (use-package rust-mode :ensure t :mode "\\.rs\\'" :config (setq rust-format-on-save nil) (add-hook 'rust-mode-hook (lambda () (setq-local rust-indent-offset 4))) ;; 配置 rust-analyzer 细节 (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs `(rust-mode . ("rust-analyzer" :initializationOptions (:checkOnSave t; :check (:command "clippy") :procMacro (:enable t) :cargo (:loadOutDirsFromCheck t))))))) (use-package cargo :ensure t :hook (rust-mode . cargo-minor-mode)) ;; ** Python ** (use-package python :ensure nil :config (setq python-indent-offset 4)) ;; ** C/C++ ** (defun my-c-mode-setup () (c-set-style "k&r") (setq c-basic-offset 4) (c-set-offset 'substatement-open 0) (c-set-offset 'case-label '+)) (add-hook 'c-mode-hook 'my-c-mode-setup) (add-hook 'c++-mode-hook 'my-c-mode-setup) ;; ** Java ** (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs `(java-mode . ("java" "-jar" "d:/JavajDK/jdt-language-server-1.9.0-202203031534/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar" "-configuration" "D:/JavaJDK/jdt-language-server-1.9.0-202203031534/config_win/" "-data" "~/.emacs.d/cache/jdtls-workspace")))) ;;; --- 6. Org-mode --- ;;; --- 6. Org-mode --- (with-eval-after-load 'org (add-hook 'org-mode-hook #'visual-line-mode) (setq org-startup-with-latex-preview t org-startup-indented t org-src-fontify-natively t org-confirm-babel-evaluate nil) (org-babel-do-load-languages 'org-babel-load-languages '((C . t) (shell . t) (python . t)))) (with-eval-after-load 'org ;; 1. 开启视觉换行 (视觉上自动折行,不改变文件内容) (add-hook 'org-mode-hook #'visual-line-mode) ;; 2. 彻底禁用自动填充 (防止按空格时插入硬换行符) (add-hook 'org-mode-hook (lambda () (auto-fill-mode -1))) ;; 3. 额外保险:即使全局开启了 auto-fill,在 org 里也关掉它 (setq-local auto-fill-function nil) ) ;; 允许编辑隐藏区域,它会自动展开而不是报错拦截 (setq org-fold-catch-invisible-edits 'show-and-error) ;; 或者更彻底一点,允许直接修改 (setq org-fold-catch-invisible-edits 'smart) ;;; --- 7. 搜索与便捷功能 --- (use-package orderless :ensure t :custom (completion-styles '(orderless basic)) (completion-category-overrides '((file (styles basic partial-completion))))) (use-package projectile :ensure t :init (projectile-mode +1) :bind-keymap ("C-c p" . projectile-command-map)) (use-package vertico :ensure t :init (vertico-mode)) (use-package treemacs :ensure t :bind ("C-c t" . treemacs-select-window)) ; 按 C-c t 快速跳到文件树 (with-eval-after-load 'treemacs (treemacs-follow-mode t) ; Tree 自动跟随当前 buffer (treemacs-filewatch-mode t)) ; 硬盘文件变动时 Tree 自动刷新 (setq treemacs-python-executable "python") (with-eval-after-load 'treemacs (setq treemacs-deferred-git-apply t ; 异步处理 Git 状态 treemacs-file-event-delay 2000 ; 延长刷新延迟 treemacs-read-string-input 'from-minibuffer ; 优化输入方式 treemacs-tag-follow-delay 1.5 ; 减慢跟随速度,减少计算 )) (use-package consult :ensure t :bind (("C-s" . consult-line) ; 替代默认搜索,带实时预览 ("C-x b" . consult-buffer) ; 增强版 buffer 切换 ("M-y" . consult-yank-pop) ; 历史粘贴板 ;; 修改这里:不要直接 bind "C-c p s" ;; 而是把命令绑定到 projectile 的 map 里 :map projectile-command-map ("s" . consult-ripgrep))) ; 这样你按 C-c p s 就能触发全局搜索了 (use-package marginalia :ensure t :init (marginalia-mode)) (global-set-key (kbd "") (lambda () (interactive) (find-file user-init-file))) (defun my-toggle-lsp-and-flymake () "一键切换智能模式与自由模式" (interactive) (if (bound-and-true-p eglot--managed-mode) (progn (flymake-mode -1) (company-mode -1) (when (eglot-current-server) (eglot-shutdown (eglot-current-server))) (message ">>> [自由模式] LSP & Company 已关闭")) (progn (eglot-ensure) (flymake-mode 1) (company-mode 1) (message ">>> [智能模式] 服务已开启")))) (global-set-key (kbd "C-") 'my-toggle-lsp-and-flymake) (use-package which-key :ensure t :init (which-key-mode)) (use-package avy :ensure t :bind ("C-c s" . avy-goto-char-timer)) ;; --- 自动生成配置 (保持在末尾) --- (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(custom-safe-themes '("f64189544da6f16bab285747d04a92bd57c7e7813d8c24c30f382f087d460a33" "7771c8496c10162220af0ca7b7e61459cb42d18c35ce272a63461c0fc1336015" "d97ac0baa0b67be4f7523795621ea5096939a47e8b46378f79e78846e0e4ad3d" "d481904809c509641a1a1f1b1eb80b94c58c210145effc2631c1a7f2e4a2fdf4" "720838034f1dd3b3da66f6bd4d053ee67c93a747b219d1c546c41c4e425daf93" "b7a09eb77a1e9b98cafba8ef1bd58871f91958538f6671b22976ea38c2580755" "0f1341c0096825b1e5d8f2ed90996025a0d013a0978677956a9e61408fcd2c77" "f1e8339b04aef8f145dd4782d03499d9d716fdc0361319411ac2efc603249326" "15cdf123689e3d76ca08c1bcd9ef6d85f37df994d577686b7593c6114a8fa165" "4594d6b9753691142f02e67b8eb0fda7d12f6cc9f1299a49b819312d6addad1d" "a9eeab09d61fef94084a95f82557e147d9630fbbb82a837f971f83e66e21e5ad" "8d3ef5ff6273f2a552152c7febc40eabca26bae05bd12bc85062e2dc224cde9a" "b5fd9c7429d52190235f2383e47d340d7ff769f141cd8f9e7a4629a81abc6b19" "8c7e832be864674c220f9a9361c851917a93f921fedb7717b1b5ece47690c098" "e8ceeba381ba723b59a9abc4961f41583112fc7dc0e886d9fc36fa1dc37b4079" "42a6583a45e0f413e3197907aa5acca3293ef33b4d3b388f54fa44435a494739" "9b9d7a851a8e26f294e778e02c8df25c8a3b15170e6f9fd6965ac5f2544ef2a9" "e4a702e262c3e3501dfe25091621fe12cd63c7845221687e36a79e17cf3a67e0" "3613617b9953c22fe46ef2b593a2e5bc79ef3cc88770602e7e569bbd71de113b" "aec7b55f2a13307a55517fdf08438863d694550565dee23181d2ebd973ebd6b8" "7c3d62a64bafb2cc95cd2de70f7e4446de85e40098ad314ba2291fc07501b70c" "0325a6b5eea7e5febae709dab35ec8648908af12cf2d2b569bedc8da0a3a81c1" default)) '(package-selected-packages '(cargo company consult doom-themes marginalia orderless projectile rust-mode treemacs vertico))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. )