Emacs配置初步

Emacs配置初步

date:2019-04-20

前言

僅僅emacs入門,先主要將emacs作爲一個文本編輯器來使用,學習路線主要參考子龍山人21天emacs
現在完成了前十天的基礎內容

現就其中的一些基本操作以及基本 packages 的功能作簡單的介紹。

個人配置可參考配置地址

基本快捷鍵

這裏只記錄自己常用的一些快捷鍵:

光標切換:

  • C-f,C-b,C-n,C-p 分別爲向前,後,上,下移動
  • C-a,C-e 分別爲移動到行首,行末
  • S-a,S-e 分別爲隔行向上,下移動
  • S->,S-< 分別爲移動到文首,文末
  • S-g g 爲移動到指定行
  • C-l 切換光標所在頁面的位置:中央-上端-下端-原位置

buffer切換:

  • C-x C-b 打開窗口顯示所有buffer
  • C-x b 切換到相應buffer
  • C-x k 刪除相應buffer

窗口相關:

  • C-x 0 關閉當前窗口
  • C-x 1 只顯示當前窗口
  • C-x 2 水平復制當前窗口
  • C-x 3 垂直複製當前窗口
  • C-x 4 f 在垂直打開的窗口中打開對應文件
  • C-x 4 d 在垂直打開的窗口中打開對應文件夾(dired-mode)
  • C-x o 在各個窗口間切換光標

區域編輯:

  • C-S-Space 開始選中模式,移動光標進行選擇
  • C-k 刪除光標後行
  • C-/ 撤銷操作
  • C-w 區域刪除
  • M-w 複製
  • C-y 粘貼

文件相關:

  • C-x C-f 在當前文件夾內查找文件
  • C-x C-s 保存當前文件
  • C-x s 依次保存buffer中的文件

其他功能相關:

  • C-h,v,f 尋找快捷鍵,變量,函數的幫助信息
  • C-g 關閉命令
  • M-x xxx 打開相關的 xxx mode或者函數功能等
  • C-x C-e 執行某段lisp代碼

Lisp相關:
lisp 語言可參考官方快速指南

改變默認的Emacs設置

;; 關閉工具欄,tool-bar-mode 即爲一個 Minor Mode
(tool-bar-mode -1)
;; 開啓全局Company補全
(global-company-mode 1)
;; 關閉備份文件(~後綴的文件)
(setq make-backup-files nil)
;; 關閉文件滑動控件
(scroll-bar-mode -1)
;; 顯示行號
(global-linum-mode 1)
;; 更改光標的樣式
(setq cursor-type 'bar)
;; 關閉啓動幫助畫面
(setq inhibit-splash-screen 1)
;; 更改顯示字體大小 16pt
(set-face-attribute 'default nil :height 160)
;; 快速打開配置文件
(defun open-init-file()
  (interactive)
  (find-file "~/.emacs.d/init.el"))
;; 這一行代碼,將函數 open-init-file 綁定到 <f2> 鍵上
(global-set-key (kbd "<f2>") 'open-init-file)
;; 設置選中背景顏色爲藍色
(set-face-background 'region "blue")
;; 將emacs的刪除功能設置與其他圖形界面編輯器相同
(delete-selection-mode 1)
;; 高亮當前行
(global-hl-line-mode 1)
;; 關閉默認的嗶嗶提示音
(setq ring-bell-function 'ignore)

特性相關

特性的加載與Package的安裝

Emacs自帶了很多特性,常見的有 recentf:用於打開最近打開的文件 等,
此外還可以通過其他插件安裝多種特性。

常用 require 命令進行特性加載, require 從文件中加載特性:

(require 'recentf)
;; 打開該mode
(recentf-mode 1)
;; 設置最大的文件數目
(setq recentf-max-menu-item 10)
;; 設置快捷鍵
(global-set-key (kbd "C-x C-r") 'recentf-open-files)
;; 默認文本解碼設置爲UTF-8
(set-language-environment "UTF-8")

對於不同模塊可以根據類型進行模塊式設計,如在文件夾下的 lisp 目錄下,
添加不同類型的模塊,但需要在初始化文件 init.el 中添加文件位置:
(add-to-list 'load-path "~/.emacs.d/lisp/") ,同時在模塊文件中
添加 (provide 'modul-name) ,
則在 init.el 文件便可通過 =require=命令調用

在開啓有些mode的時候往往會在某些條件下才會觸發,這是會用到鉤子(hook) ,如:

(add-hook 'emacs-lisp-mode-hook 'show-paren-mode)

該命令表示在啓動 emacs-lisp-mode 的時候纔會啓動 show-paren-mode
用於括號匹配顯示。

由於默認的插件源非常有限(可以通過 M-x package-list-packages 查看),
可以通過外在的插件源頭來更新,常用的有MELPA ,包含了3000左右的插件,
可以通過以下命令進行設置:

(require 'package)
     (package-initialize)
     (setq package-archives '(("gnu"   . "http://elpa.emacs-china.org/gnu/")
                      ("melpa" . "http://elpa.emacs-china.org/melpa/"))))

在得到的 packages 表單裏可以通過 I 來標記安裝, D 來標記刪除,
U 來標記更新,標記完成後需要通過 X 來確認。

最後通過以下命令對Packages List內的Packages進行安裝:

;; cl - Common Lisp Extension
(require 'cl)

;; Add Packages
(defvar my/packages '(
               ;; --- Auto-completion ---
               company
               ;; --- Better Editor ---
               hungry-delete
               swiper
               counsel
               smartparens
               ;; --- Major Mode ---
               js2-mode
               ;; --- Minor Mode ---
               nodejs-repl
               exec-path-from-shell
               ;; --- Themes ---
               monokai-theme
               ;; solarized-theme
               ) "Default packages")

(setq package-selected-packages my/packages)

(defun my/packages-installed-p ()
    (loop for pkg in my/packages
          when (not (package-installed-p pkg)) do (return nil)
          finally (return t)))

(unless (my/packages-installed-p)
    (message "%s" "Refreshing package database...")
    (package-refresh-contents)
    (dolist (pkg my/packages)
      (when (not (package-installed-p pkg))
        (package-install pkg))))

基本特性介紹

這裏就對一些Emacs自帶的特性作簡單的介紹:

Major Mode: 整體文件模式對應的模式類型,有text-mode, special-mode, prog-mode

Minor Mode: 增強性功能的Mode

可以定義對不同的文件開啓不同的Major Mode:

(setq auto-mode-alist
      (append
       '(("\\.js\\'" . js2-mode))
       '(("\\.html\\'" . web-mode))
       auto-mode-alist))

自帶的一些特性介紹:

  • recentf : 近期打開的文件, 更改快捷鍵後 C-c C-r 打開最近文件
  • cl : Common Lisp Extension
  • Org-mode相關:參照個人博客Org-mode介紹

常用插件介紹

安裝完插件後可以通過 M-x customize-group 選擇對應的插名稱進行功能設置

  • company :提供了各種自動補全的功能, 將其應用於全局:=(global-company-mode t)= ,company依靠 company-backends 進行補全,如需要對Python進行補全的話,則需要在模式鉤子下激活 anaconda-mode ,

當前的 backends 值可以通過 C-h v company-backends 得到

  • hungry-delete :一次性用於刪除多個空格或者換行
  • swiper :該插件其實集成了 swiper , counsel , Ivy 三個插件,Ivy用於補全操作(用於文件查找匹配等),swiper用於當前文件查找字符所在位置,counsel實現了更多功能並與emacs命令進行匹配,能夠更好的應用Ivy,

C-s 可實現查找功能,同樣命令可在搜索結果之間進行切換

  • smartparens :用於顯示對應匹配的括號

  • popwin-mode :將光標移動到新開的窗口中

  • Hippie :提供更多補全功能,如其他buffer中的字符的補全

  • Dired :提供了強大的文件管理相關的功能, C-x d 可以進入 Dired-mode,可以在該模式下進行文件操作,可以通過 C-x C-q 進行編輯操作(如重命名),其他便捷操作有:

    • + :創建目錄
    • C :拷貝
    • D :刪除
    • d :標記刪除
    • u :取消標記
    • x :執行標記
  • expand-region :能夠通過 C-= 進行內容的選中,該快捷鍵需要綁定:

    (global-set-key (kbd "C-=") 'er/expand-region)
    
  • Occur-mode :能夠查詢字符並對字符所在行顯示,可在顯示的緩存內進行編輯, M-s o進行選中內容的搜索顯示,按 =e可進行編輯模式

  • iedit-mode :能夠對選中的內容進行共同編輯,選中內容後,通過 M-s e 進入iedit模式(快捷鍵需要綁定):

    (global-set-key (kbd "M-s e") 'iedit-mode)
    
  • Evil :實現了Vim的大部分功能

  • Cask :Cask能夠輔助Packages的管理,安裝後會在 .emacs.d 目錄下生成 Cask 文件,集成Packages, 通過 cask install 自動安裝包, 之後結合 pallet 進行包的安裝管理即可,需要在初始化文件中設置:

    require 'cask "<path-to-cask>/cask.el")
    (cask-initialize)    ; 類似於 package-initialize
    
  • pallet :基於Cask的包管理工具,可實現不同版本Emacs的包管理等功能,配置過程如下:

    ;; 激活過程
    (pallet-mode)  
    (pallet-init)    ; 在.emacs.d 中生成一個 Cask 文件, 寫入源與現有包
    (pallet-install) ; 將 elpa 中的 package 拷貝到.Cask/<you version>/elpa 目錄中
    
    ;; 配置過程
    (require 'pallet)
    (pallet-mode t)      ; 激活 pallet, 在安裝包時將 Cask 文件寫入相應信息
    
  • use-package :更安全的加載包的方式,部分包出錯的時候不會讓整個Emacs停止工作,可以對各個包的配置進行集中設置,方便實現auto-load和鍵綁定,簡單使用如下:

    (use-package package-name
      :commands
      (global-company-mode) ;;auto-load實現
      ;;快捷鍵設置
      :bind (("M-s O" . moccur)
             :map isearch-mode-map
             ("M-o" . isearch-moccur)
             ("M-O" . isearch-moccur-all))
      :init
      (setq my-var1 "xxx")
      :config
      (progn
        (setq my-var2 "xxx")
        (setq my-var3 "xxx")
        )
      :defer t
      )
    
  • JavaScript相關:

    • js2-mode :js2-mode主要提供了:語法高亮+語法檢查器(Linter)
    • nodejs-repl :可用於執行緩衝區的代碼,需要系統自身已經安裝了NodeJS
    • js2-refactor :用於重構JavaScript的Minor Mode,可以通過 C-c C-m 進行功能前綴的加入
  • web-mode :常用的編輯前端代碼的Major Mode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章