iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
0
Software Development

Emacs 來寫程式系列 第 5

[Emacs-5] 套件管理及基本設定

  • 分享至 

  • xImage
  •  

Emacs 套件管理

  • Emacs 啟動時會預先載入設定檔,預設的設定檔會從 ~/.emacs, ~/.emacs.el~/.emacs.d/init.el 去找,如果不想載入設定檔,可以用 $Emacs -q
  • 原始 Emacs 所帶的功能並不多,大部分新的強大的功能都需要安裝套件,而套件的安裝又分為兩種,一種是在 Emacs 24 版 (2012 年中)以前,需要下載跟載入 (load) 套件,有時候有些套件為了跟舊版 Emacs 相容會特別提出這種安裝方式,例如
(add-to-list 'load-path "~/.emacs.d/site-lisp/magit/lisp")
(require 'magit)
  • 這種方式當然在版本更新時,也會需要人工處理,比較麻煩,新的方式是在 24 版之後使用,例如
(require 'package)

(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/"))

(package-initialize)
  • 預設的套件資料庫是 elpa,但有時裡面的套件缺少時,建議加入 melpa 資料庫,而 org 資料庫是因為 Emacs 內帶的 org-mode 比較不常更新,有些依賴的套件需要較新版的 org-mode,建議也一並加入
  • 這種新的套件管理有以下功能
    • 套件列表: 使用 Meta-x package-list-packages 來列出所有套件,要安裝套件時,只要游標移到那的套件,按 i (install) 然後 x (execute) 回覆 yes 即可安裝,要移除的話,一樣游標移到套件,按 d (delete) 然後 x (execute) 回覆 yes pacakge list
    • 安裝套件: 使用 Meta-x package-install 然後輸入套件名稱
    • 移除套件: 使用 Meta-x package-delete 然後套件名稱

使用 use-package

  • 上述手動的方式有個缺點,每次要用新的環境,這些使用的套件要一個一個手工安裝一次,也是很麻煩,因此有一個套件 use-package 是用來管理套件的安裝用,使用這個套件,你只要將 ~init.el~ 檔拷貝到新的機器,它會自動下載一些未安裝的套件
  • use-package 還有一個重要的功能,延遲載入, 意思是只有在某些主模式下,才載入一些套件,這對於 Emacs 的啟動有相當大的幫助,因為剛啟動時,有些套件並不一定用得到,use-package 讓你決定何時載入一些套件
  • 它的設定如下
;; 如果未安裝 use-package,安裝它
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

;; 使用 diminish (隱藏)及 bind-key 套件
(use-package diminish :ensure t)
(use-package bind-key :ensure t)

;; 使用自動更新套件
(use-package auto-package-update
  :ensure t
  :config
  (setq auto-package-update-delete-old-versions t)
  (setq auto-package-update-hide-results t)
  (auto-package-update-maybe))
  • use-package 的參數相當多,詳細可以直接參考官網 use-package,重要的參數像是 :ensure 就是如果套件未安裝的話,逕行安裝
  • 而如果使用 :bind, :mode, interpreter 等關鍵字,就會有延遲載入的效果,其中 :mode 最為常見

基本設定

  • 接下來設定一些跟編輯器外觀有關的參數
;; 關掉 menu-bar
menu-bar-mode -1)

;; 顯示配對的括號
(show-paren-mode t)

;; 使用 monoj-dark 主題
(load-theme 'manoj-dark t)

;; 自動加入右括號及右 '
(electric-pair-mode t)
(setq electric-pair-pairs '(
			    (?\' . ?\')
			    ))
;; 不使用 tab
(setq-default indent-tabs-mode nil)

;; 移動視窗
(winner-mode t)
  • 這部份的設定比較主觀,有些人喜歡的外觀跟習慣可能不同,尤其主題的部分,甚至還可以下載來安裝,手工安裝如下 Meta-x customize-themes,按下 Enter 鍵可以預覽效果 Theme
  • electric-pair-mode 是內建套件的自動加右括號,但需要啟動來使用,因為 ' 在Emacs 排除在 electric-pair 外,如果不常使用 Emacs Lisp,可以考慮加入如上
  • 在編輯程式時,大部分的語法檢查都不喜歡 tab 或者 \t 可以考慮取消 indent-tabs-mode

設定客製化參數檔案

  • Emacs 會將一些客製化完的參數寫下來,例如安裝的套件...,如果不指定的話,會直接寫在 init.el 上,個人比較喜歡把他們寫在一個單獨的檔案上,當然要記得載入它
(setq custom-file "~/.emacs.d/custom-variables.el")
(when (file-exists-p custom-file)
    (load custom-file))

設定自動儲存及備份目錄

  • Emacs 有自動儲存的功能,也就是一定時間內如果不儲存的話,即使當機,也可以從備份檔案回復,如果不設定的話,預設會在同一個目錄下,例如原先的檔案是 init.el 自動儲存的檔案會是 ~init.el,個人習慣將這些檔案放在 temp 下,因為說實在用到的機會可能不太多
(defconst emacs-tmp-dir (format "%s%s%s/" temporary-file-directory "emacs" (user-uid)))
(setq backup-directory-alist `((".*" . ,emacs-tmp-dir)))
(setq auto-save-file-name-transforms `((".*" ,emacs-tmp-dir t)))
(setq auto-save-list-file-prefix emacs-tmp-dir)

安裝次模式

  • 安裝兩個常用的次模式,如果不明白次模式,可以參考 [Emacs - 2] 基本使用及操作
  • hideshow-mode: 程式折疊,如果程式檔案太長,可以使用這個內建的套件來做折疊跟顯示
  • multiple-cursor: 多重游標,有時候編輯程式要一次修改多重地方,例如改變數名稱,可以使用這個套件
  • 安裝如下
;;
;; hideshow
;;
(add-hook 'prog-mode-hook #'hs-minor-mode)

;;
;; multiple cursors
;;
(use-package multiple-cursors
  :ensure t
  :bind (
         ("M-3" . mc/mark-next-like-this)
         ("M-4" . mc/mark-previous-like-this)
         :map ctl-x-map
         ("\C-m" . mc/mark-all-dwim)
         ("<return>" . mule-keymap)
         ))
  • 關於 hideshow 模式,可以參考 hideshow,其中重要的組合鍵有
    • C-c @ C-M-s show all
    • C-c @ C-M-h hide all
    • C-c @ C-s show block
    • C-c @ C-h hide block
    • C-c @ C-c toggle hide/show
  • multiple-cursors 我們設定 Meta-3 下一個相同字, Meta-4 上一個相同字,跟 Ctrl-enter 來選擇多個要修改單字

要看我的這段影片,請點 Emacs 套件管理

相關簡報,請看 我的部落格


上一篇
[Emacs-4] Emacs Lisp 簡介 - 2
下一篇
[Emacs-6] 讓你更快速執行指令的套件, Ivy-mode
系列文
Emacs 來寫程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言