有了前两讲的积累,我们知道了:
我们既要学习emacs的操作,也要学习vi的操作emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方案,spacemacs. spacemacs已经集成好了很多插件,比如模拟vi的evil,自动补全的ido等emacs本质上是一些函数的组合,通过Alt-x执行函数名,或者通过绑定到快捷键上使用,其本质是一样的有了以上基础知识,我们正式开始学习emacs. 我们先从最简单的打开和保存文件开始。
emacs的标准做法是使用find-file函数,绑定在C-x C-f键上。在spacemacs中,曾经默认将C-x C-f绑定到ido-find-file上。而现在,C-x C-f绑定到spacemacs/helm-find-files上:
(defun spacemacs/helm-find-files (arg) "Custom spacemacs implementation for calling helm-find-files-1. Removes the automatic guessing of the initial value based on thing at point. " (interactive "P") (let* ((hist (and arg helm-ff-history (helm-find-files-history))) (default-input hist) (input (cond ((and (eq major-mode 'dired-mode) default-input) (file-name-directory default-input)) ((and (not (string= default-input "")) default-input)) (t (expand-file-name (helm-current-directory)))))) (set-text-properties 0 (length input) nil input) (helm-find-files-1 input)))也可以通过『空格 f f』的方式来使用spacemacs/helm-find-files.可能通过【空格 f F】的方式来直接使用helm插件包中的helm-find-files:
(defun helm-find-files (arg) (interactive "P") (let* ((hist (and arg helm-ff-history (helm-find-files-history))) (smart-input (or hist (helm-find-files-initial-input))) (default-input (expand-file-name (helm-current-directory))) (input (cond (helm-find-file-ignore-thing-at-point default-input) ((and (eq major-mode 'org-agenda-mode) org-directory (not smart-input)) (expand-file-name org-directory)) ((and (eq major-mode 'dired-mode) smart-input) (file-name-directory smart-input)) ((and (not (string= smart-input "")) smart-input)) (t default-input))) (input-as-presel (null (nth 0 (file-attributes input)))) (presel (helm-aif (or hist (and input-as-presel input) (buffer-file-name (current-buffer)) (and (eq major-mode 'dired-mode) smart-input)) (if (and helm-ff-transformer-show-only-basename (null hist)) (helm-basename it) it)))) (set-text-properties 0 (length input) nil input) (helm-find-files-1 input (and presel (null helm-ff-no-preselect) (concat "^" (regexp-quote presel))))))Helm和ido一样,也是一个交互式补全的插件:https://emacs-helm.github.io/helm/Helm只在emacs 24.4以上版本上才可以用。
标准emacs做法是find-alternate-file函数,绑定到C-x C-v键上。spacemacs上,这个键被绑定到ido-find-alternate-file函数上。
(defun ido-find-alternate-file () ... (interactive) (ido-file-internal 'alt-file 'find-alternate-file nil "Find alternate file: "))标准emacs的做法是insert-file函数,绑定到C-x i键上。spacemacs默认绑定到ido-insert-file函数上。
(defun ido-insert-file () (interactive) (ido-file-internal 'insert 'insert-file nil "Insert file: " nil nil 'ido-enter-insert-buffer))emacs默认没有将其绑定到快捷键上,这个功能是hexl-find-file函数来实现的。打开后会进入hexl-mode.spacemacs将其绑定到『空格 f h』上。
保存文件不涉及交互操作,所以ido和helm都不管,还是用的emacs默认的save-buffer函数。emacs默认将其绑定在C-x C-s键上,spacemacs又提供了"空格 f s"的快捷键
(defun save-buffer (&optional arg) (interactive "p") (let ((modp (buffer-modified-p)) (make-backup-files (or (and make-backup-files (not (eq arg 0))) (memq arg '(16 64))))) (and modp (memq arg '(16 64)) (setq buffer-backed-up nil)) (if (and modp (buffer-file-name) (not noninteractive) (not save-silently)) (message "Saving file %s..." (buffer-file-name))) (basic-save-buffer (called-interactively-p 'any)) (and modp (memq arg '(4 64)) (setq buffer-backed-up nil))))另存为文件又涉及交互操作了,标准emacs使用write-file函数,而spacemacs使用ido-write-file函数。它们都是绑定到C-x C-w键上。
(defun ido-write-file () (interactive) (let ((ido-process-ignore-lists t) (ido-work-directory-match-only nil) (ido-ignore-files (cons "[^/]\\'" ido-ignore-files)) (ido-report-no-match nil) (ido-confirm-unique-completion t) (ido-auto-merge-work-directories-length -1)) (ido-file-internal 'write 'write-file nil "Write file: " nil nil 'ignore)))spacemacs对此没有扩展,都是使用save-buffers-kill-terminal函数,绑定到C-x C-c键上。
本节涉及的插件:ido, helm
功能函数快捷键leader键打开文件spacemacs/helm-find-filesC-x C-f空格 f ffind-file无无ido-find-file无无helm-find-files无空格 f F打开另一个文件ido-find-alternate-fileC-x C-v无find-alternate-file无无将另一个文件的内容插入到当前文件ido-insert-fileC-x i无insert-file无无保存文件save-bufferC-x C-s空格 f s另存为文件ido-write-fileC-x C-w无以二进制的方式打开文件hexl-find-file无空格 f h退出emacssave-buffers-kill-terminalC-x C-c无 相关资源:敏捷开发V1.0.pptx