怎么优化我的emacs配置

;;初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; list the packages you want(要安装的包列表)
(setq package-list '(solarized-theme
		     company flymake
		     rainbow-delimiters
		     ;highlight-indentation ;; 
		     flycheck
		     helm
		     geiser ;;Scheme
		     magit orgit
		     org-plus-contrib org-bullets graphviz-dot-mode
		     markdown-mode
		     web-mode
		     pass
		     ))

(require 'package)
;(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")("melpa" . "https://melpa.org/packages/")("org" . "https://orgmode.org/elpa/"))) ;;;国际源
(setq package-archives '(("gnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")("melpa" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")("org" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/org/"))) ;;;国际源不可用时使用
(unless package-archive-contents(package-refresh-contents));;;自动更新源, 必须放 package-initialize 前, 但 emacs 启动时会执行变导致慢.
(setq package-load-list '(all)) 
(when (version< emacs-version "27.0")(package-initialize)) ;;;emacs 27.0之后不再需要调用package-initialize

;;;自动安装缺少的包
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))
;;初始化-END;;;;;;;;;;;;;;;;;;;;;;;;;;;

上面是我初始化的基本配置及问题, 有请大神帮我优化下.

  • 想实现秒启动
  • 自动根据网速度选择源.
  • 判断当前os自动设置字体

限制条件不能多安装其他包.

我菜鸡刚学emacs,请大神多多指教

系统类型记录在变量system-type上,读docstring就知道怎么用了

(set-frame-font (pcase system-type
                  ;; Match linux
                  (`gnu/linux "...")
                  ;; Match bsd
                  (`gnu/kfreebsd "...")
                  ;; Match windows
                  ((or `ms-dos `windows-nt `cygwin)
                   "...")
                  ;; Mathc MacOS
                  (`darwin "...")))

随便写了个基于ping的测速。速度越快的排越前面

(require 'cl-lib)
(eval-when-compile (require 'rx))

(defvar cm/ping-send-package-count 5)

(defun cm/sort-url-by-speed (&rest urls)
  (let (candidates)
    (dolist (url urls)
      (with-temp-buffer
        (erase-buffer)
        (shell-command (format "ping -c %d %s"
                               cm/ping-send-package-count url)
                       (current-buffer))
        (goto-char (point-min))
        ;; Discard bad url
        (when (re-search-forward "rtt" nil t)
          (let ((delay (string-to-number
                        (dotimes (_ 2 (match-string 1))
                          (re-search-forward
                           (rx (group-n 1 (1+ digit (optional "." (1+ digit))) "/")))))))
            (push (cons delay url) candidates)))))
    (mapcar #'cdr (cl-sort candidates #'< :key #'car))))
ELISP> (cm/sort-url-by-speed "www.baidu.com"
                             "elpa.emacs-china.org"
                             "www.bing.com"
                             "v2ex.com")
("www.bing.com" "www.baidu.com" "elpa.emacs-china.org" "v2ex.com")

(unless package-archive-contents(package-refresh-contents))

被上面这行自动更新托慢了启动速度, 有办法改进下吗?大佬

第二回复使用 ping 测试过于复杂了

不用ping我找不到更好的办法

没有必要refresh pacakge-archive-contents,安装包之前才需要刷新一下。每次启动emacs的时候这个值是nil。所以你这句是必然运行的。

写了个异步并发ping的版本,不用同步串行执行ping命令傻等了

;;; -*- lexical-binding: t; -*-
(require 'cl-lib)
(eval-when-compile (require 'rx))

(defvar cm/ping-send-package-count 5)

(defun cm/sort-url-by-speed (cb &rest urls)
  (let ((len (length urls))
        (count 0)
        candidates)
    (dolist (url urls)
      (let* ((proc-name (concat " *" (make-temp-name "cm/ping-") "*"))
             (proc-buffer (get-buffer-create proc-name))
             (proc (start-process proc-name proc-buffer
                                  "ping" "-c" (format "%d" cm/ping-send-package-count) url)))
        (set-process-sentinel
         proc
         (lambda (process _msg)
           (when (and (eq (process-status process) 'exit)
                      (zerop (process-exit-status process)))
             (with-current-buffer (process-buffer process)
               (goto-char (point-min))
               (when (re-search-forward "rtt" nil t)
                 (let ((delay (string-to-number
                               (dotimes (_ 2 (match-string 1))
                                 (re-search-forward
                                  (rx (group-n 1 (1+ digit (optional "." (1+ digit))) "/")))))))
                   (push (cons delay url) candidates)))))
           (cl-incf count)
           (if (= count len)
               (funcall cb (mapcar #'cdr (cl-sort candidates #'< :key #'car))))))))))

(cm/sort-url-by-speed (lambda (list) (message "%s" list))
                      "elpa.emacs-china.org"
                      "v2ex.com"
                      "www.baidu.com"
                      "www.bing.com"
                      "")