美文网首页
我也说说Emacs吧(3) - 文件基本操作

我也说说Emacs吧(3) - 文件基本操作

作者: Jtag特工 | 来源:发表于2017-05-27 21:48 被阅读100次

    Spacemacs文件基本操作

    有了前两讲的积累,我们知道了:

    1. 我们既要学习emacs的操作,也要学习vi的操作
    2. emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方案,spacemacs. spacemacs已经集成好了很多插件,比如模拟vi的evil,自动补全的ido等
    3. 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)))
    

    退出emacs

    spacemacs对此没有扩展,都是使用save-buffers-kill-terminal函数,绑定到C-x C-c键上。

    (defun save-buffers-kill-terminal (&optional arg)
      (interactive "P")
      (if (frame-parameter nil 'client)
          (server-save-buffers-kill-terminal arg)
        (save-buffers-kill-emacs arg)))
    ```
    
    ## 文件操作小结
    
    本节涉及的插件:ido, helm
    
    |功能|函数|快捷键|leader键|
    |--|--|--|
    |打开文件|spacemacs/helm-find-files|C-x C-f|空格 f f|
    ||find-file|无|无|
    ||ido-find-file|无|无|
    ||helm-find-files|无|空格 f F|
    |打开另一个文件|ido-find-alternate-file|C-x C-v|无|
    ||find-alternate-file|无|无|
    |将另一个文件的内容插入到当前文件|ido-insert-file|C-x i|无|
    ||insert-file|无|无|
    |保存文件|save-buffer|C-x C-s|空格 f s|
    |另存为文件|ido-write-file|C-x C-w|无|
    |以二进制的方式打开文件|hexl-find-file|无|空格 f h|
    |退出emacs|save-buffers-kill-terminal|C-x C-c|无|
    

    相关文章

      网友评论

          本文标题:我也说说Emacs吧(3) - 文件基本操作

          本文链接:https://www.haomeiwen.com/subject/tioqfxtx.html