远方有多远,请你告诉我!

Emacs : 第二天 - 高级自定义

Posted on By 赵赵赵小白

如果想深入学习Emacs Lisp 可以阅读GNU提供的 An Introduction to Programming in Emacs Lisp .(也可以M-x info然后选择Emacs Lisp Intro)

setq设置当前缓冲区中的变量值,setq-default设置全局变量的值。举个例子子:

;; 这个根据意思就能看出来 光标类型 设置为bar的样式
(setq-default cursor-type 'bar)

;; 创建备份文件为空,也就是不创建备份文件
(setq make-backup-files nil)

关于Emacs分屏.

  • C-x 1 仅保留当前窗口
  • C-x 2 在当前窗口下边创建一个窗口
  • C-x 3 在当前窗口右边创建一个窗口

使用下边配置可以加入最打开过的文件选项

(require 'recentf)
(recentf-mode 1)
(setq recentf-max-menu-item 10)

;; 这个快捷键绑定可以用之后的插件 counsel 代替
;; (global-set-key (kbd "C-x C-r" 'recentf-open-files)

require的意思为从文件中加载特性.

替换选中文字

``(delete-selection-mode 1)

下面这些函数可以让你找到不同的函数,变量以及快捷键所定义文件位置。

  • find-function (C-h C-f)
  • find-variable (C-h C-v)
  • find-function-on-key (C-h C-k)

准备定制Emacs

配置插件源

在进行美化之前我们需要配置插件源(默认的源太少了),经常用的源是MELPA(Milkypostman’s Emacs Lisp Package Archive).这个大概有3000多个插件.M-x package-list-packages 来查看所有的MELPA插件了。I标记安装,D标记删除,U更新 ,X确认


 (when (>= emacs-major-version 24)
     (require 'package)
     (package-initialize)
     (setq package-archives '(("gnu"   . "http://elpa.emacs-china.org/gnu/")
     ("melpa" . "http://elpa.emacs-china.org/melpa/"))))

;; 注意 elpa.emacs-china.org 是 Emacs China 中文社区在国内搭建的一个 ELPA 镜像

 ;; 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))))

 ;; Find Executable Path on OS X
 (when (memq window-system '(mac ns))
   (exec-path-from-shell-initialize))
;; 第一种
(setq package-selected-packages my/packages)
;; 第二种
(setq package-selected-packages `my/packages)
;; 第三种
(setq package-selected-packages (quote my/packages))

第一种设置是在缓冲区中设置一个名为package-selected-packages的变量将值赋给my/packages,第二种和第三种相同只是写法不同,将一个名为packages-selected-packages的变量设置为my/packages,相当于赋值和重命名的意思

默认窗口全屏,后边 maximized 最大化

(setq initial-frame-alist (quote ((fullscreen . maximized))))
;;这两个相同
(setq initial-frame-alist '((fullscreen . maximized)))

当前行高亮,更容易找到光标

(global-hl-line-mode 1)

安装主题

(add-to-list 'my/packages 'monokai-theme)

;;每次打开编辑器就加载主题
(load-theme 'monokai 1)

推荐插件

JavaScript IDE Emacs 提供的默认 JavaScript Major Mode 并不是非常好用。所以我们可以将默认的模式 替换成 js2-mode 一个比默认模式好用的 Major Mode。我们可以通过 MELPA 来下载它,然 后用下面的代码将其启用。

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

你可以在这里(How Emacs Chooses a Major Mode)找到 Emacs 是如何选择何时该选用何 种 Major Mode 的方法。

在这里我们需要知道 auto-mode-alist 的作用,这个变量是一个 AssociationList,它 使用正则表达式(REGEXP)的规则来匹配不同类型文件应使用的 Major Mode。 下面是几个 正则表达式匹配的例子,

(("\\`/tmp/fol/" . text-mode)
 ("\\.texinfo\\'" . texinfo-mode)
 ("\\.texi\\'" . texinfo-mode)
 ("\\.el\\'" . emacs-lisp-mode)
 ("\\.c\\'" . c-mode)
 ("\\.h\\'" . c-mode)
 )

下面是如何添加新的模式与对应文件类型的例子(与我们配置 js2-mode 时相似的例子),

(setq auto-mode-alist
  (append
   ;; File name (within directory) starts with a dot.
   '(("/\\.[^/]*\\'" . fundamental-mode)
     ;; File name has no dot.
     ("/[^\\./]*\\'" . fundamental-mode)
     ;; File name ends in ‘.C’.
     ("\\.C\\'" . c++-mode))
   auto-mode-alist))

在 js2-mode 模式中会提供

  • 语法高亮
  • 语法检查器(Linter)

执行缓冲区的代码可以使用 nodejs-repl 插件,它需要你的机器上已经安装了 NodeJS。 然而在 Mac OS X 上可能会出现找不到 NodeJS 可执行文件的问题,要解决这个问题你需要 安装另外一个 exec-path-from-shell 的插件并将其启用。

(when (memq window-system '(mac ns))
  (exec-path-from-shell-initialize))

有了 nodejs-repl 我们就可以方便的测试和开发我们的 JavaScript 代码了(你可以在 这里找到更多关于它的使用方法)。

Org-mdoe 进阶

在 Org-mode 中你可以直接开启新的缓冲区(Buffer)直接用相应的 Major Mode 来编辑代 码块内的内容。在代码块中使用 C-c ‘ 会直接打开对应模式的缓冲区(不仅限于 Lisp)。 这样就使在 Org-mode 中编辑代码变的十分方便快捷。

使用 <s 然后 Tab 可以直接插入代码块的代码片段(Snippet),更多类似的代码片段 (Org-mode Easy Templates)可以在这里找到。

#+BEGIN_SRC emacs-lisp
  ;; Your code goes here
  ;; 你的代码写在这里
#+END_SRC

添加 Org-mode 文本内语法高亮

(require 'org)
(setq org-src-fontify-natively t)

在 Org-mode 中重置有序列表序号可以直接使用 M-<RET>

Agenda 的使用

;; 设置默认 Org Agenda 文件目录
(setq org-agenda-files '("~/org"))

;; 设置 org-agenda 打开快捷键
(global-set-key (kbd "C-c a") 'org-agenda)

你只需将你的 *.org 文件放入上面所指定的文件夹中就可以开始使用 Agenda 模式了。

  • C-c C-s 选择想要开始的时间
  • C-c C-d 选择想要结束的时间
  • C-c a 可以打开 Agenda 模式菜单并选择不同的可视方式( r )