;;初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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,请大神多多指教
cireu
2
系统类型记录在变量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 "...")))
cireu
3
随便写了个基于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 测试过于复杂了
cireu
6
没有必要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"
"")