背景

观看 https://www.youtube.com/watch?v=oJTwQvgfgMM 时的记录

起因

文本文件便于读取,比较,版本控制,编译运行等等。而且文本文件用于转化项目,任务等也是很自然的事情,所以才有了 org-mode.

优点

  • 和各种文件,email,聊天工具等等可以 link
  • plain text 表达表格。
  • 可以直接使用 plain text 表达 latex.
  • 可以用于 gtd,父级相应的属性可以传给子级。
  • 可以每天日程安排
  • 表格能够写计算公式,并计算结果

快捷键

  • tab 展开和收起
  • s-tab 全部展开,全部收起
  • m-up, m-down 同一层目录下面的上下移动,m-left, m-right 层级的改变
  • m-s-up, m-s-down 所有层级之间都可以上下移动,m-s-left, m-s-right 层级的改变
  • m-left, m-up ??? 表格列移动交换位置??? (31:00)

org 执行语句

#+BEGIN_SRC emacs-lisp
(+ 2 3)
#+END_SRC
  • 在有语句的那一行 c-x c-e,就能够看到 minibuffer 中的结果了。
  • 在 org-mode 中,我们还可以 c-c c-c 来执行,执行的时候会提示我们是否执行,确定执行后,会在下面的 result 里面显示结果,具体如下:
#+BEGIN_SRC emacs-lisp
(+ 2 3)
#+END_SRC

#+RESULTS:
: 5

source code mode

对于源码块,可以使用 C-c ' 打开一个新的窗口来展示源码部分,在源文件里面这个代码块会高亮。新的窗口可以使用 再次c-c ' 或者 c-c c-k 来关闭。

在这个代码窗口中,可以使用 c-x c-e 来执行,修改好了之后, c-c ' 相应的改动会回到原来的文件中去。
甚至可以放个俄罗斯方块的游戏在里面:

#+BEGIN_SRC emacs-lisp
  (tetris)
#+END_SRC

org 文件加入 init.el中

把 org 文件加载到 init.el 中,需要注意 org 文件名不能是 init.org,因为 init.el 中包含的 org 文件,都会被编译为 el 文件,所以如果是 init.org 文件,编译了之后,就变成 init.el 就会覆盖掉原来的 el 文件。

;; add org in init, notice that, file name must not "init.org"
(org-babel-load-file (expand-file-name "~/.emacs.d/myinit.org"))

这样,下次打开的时候,就会自动运行俄罗斯方块了。

init.el 内容移到 myinit.org

  • init.el 中除了 elpa 和 use-package 的,其他所有的全部移动到 org 中去。
  • 在 org 中,输入 <s 然后按 tab 就可以扩展为代码块的外壳。别忘了后面写上 emacs-lisp,表明代码是 elisp
  • (global-set-key (kbd "<f5>") 'revert-buffer) 这个代码块中输入 c-c c-c 来执行一下,然后就可以使用<f5> 来刷新了

别忘了在开头加上: #+STARTUP: overview,在里面增加:

;; use y and n instead yes and no
(fset 'yes-or-no-p 'y-or-n-p)

;; bind <f5> to revert-buffer
(global-set-key (kbd "<f5>") 'revert-buffer)

参考:

Using Emacs - 10 - org init files
https://cestlaz.github.io/posts/using-emacs-10-org-init/

using-emacs
https://github.com/zamansky/using-emacs/tree/aca7b431853b51205c0fed8ffdb1f2ad66b48ba1

系统 theme

m-x customize-theme 可以选择自带的主题,比如说 manoj-dark, tango-dark 等等都不错。

也可以使用 m-x load-theme 来加载指定的主题。

如果需要每次都加载指定主题,需要修改 init.el,增加:

(load-theme 'tango-dark t)

color-theme

这个是第三方主题,但是这个已经太旧了,推荐使用 color-theme-modern,如果已经安装了这个旧的,那么需要卸载,卸载的方法是 m-x list-package 找到 color-theme 然后 d 标记删除,x 执行。

;;(use-package color-theme
;;  :ensure t)

可以使用 color-theme-select 来选择需要加载的主题。

zenburn-theme

这个也是第三方主题

;; zenburn-theme: https://github.com/bbatsov/zenburn-emacs
(use-package zenburn-theme
  :ensure t
  :config (load-theme 'zenburn t))

暂时感觉,还是tango-dark 更加好看一点。

参考:

Using Emacs - 9 - Themes
https://cestlaz.github.io/posts/using-emacs-9-themes/

color-theme
https://github.com/emacsattic/color-theme

color-theme-modern
https://github.com/emacs-jp/replace-colorthemes#color-theme-modern--

zenburn-theme
https://github.com/bbatsov/zenburn-emacs

emacs常用命令:包安装、卸载
https://www.douban.com/note/515975650

原版的自动补全

emacs 有自己内置的自动补全,只需要 m-/ 就可以补全当前的内容。

第三方自动补全主要有:auto-complete 和 company,这次就先使用 auto-complete

;; auto-complete: https://github.com/auto-complete
(use-package auto-complete
  :ensure t
  :init
  (progn
    (ac-config-default)
    (global-auto-complete-mode t)
    ))

使用的时候,至少需要两个字符,等待0.5秒,就可以自动弹出选择栏,然后使用 m-n, m-p 来进行上下选择即可。

参考:

Using Emacs - 8 - Autocomplete
https://cestlaz.github.io/posts/using-emacs-8-autocomplete/

Emacs 安装 auto-complete (转)
https://www.cnblogs.com/yourihua/archive/2012/04/19/2457825.html

swiper 重新整理配置

(use-package swiper
  :ensure t
  :bind (("C-s" . swiper)
;;   ("C-r" . swiper)
     ("C-c C-r" . ivy-resume)
     ("M-x" . counsel-M-x)
     ("C-x C-f" . counsel-find-file))
  :config
  (progn
    (ivy-mode)
    (setq ivy-use-virtual-buffers t)
    (setq enable-recursive-minibuffers t)
    (setq ivy-display-style 'fancy)
    (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
    ))

bind 是用来绑定按键的, define-key 指的是,在 minibuffer-local-map 这个模式下,c-r 代表 counsel-minibuffer-history

avy,在搜索的时候,把屏幕上每个匹配的都分配不同的字符,输入相应的字符就可以跳转到对应的位置

;; avy; https://github.com/abo-abo/avy
(use-package avy
  :ensure t
  :bind (("M-s" . avy-goto-char)
     ("M-g f" . avy-goto-line)
     ("M-g w" . avy-goto-word-1)
     ("C-c C-j" . avy-resume)
     ))

注意: 在 c-s 这个正常的搜索模式下,也可以通过 C-c C-j 来标识相应的位置,然后直接跳转,但是跳转了之后,需要用 <esc> <esc> <esc> 来结束,普通的 c-g 很难结束。

如果想直接使用默认的配置,可以这样:

(use-package avy
:ensure t
:config
(avy-setup-default))

参考:

Using Emacs - 7- Navigation with Avy
https://cestlaz.github.io/posts/using-emacs-7-avy/

Emacs入坑之旅——按键(快捷键)绑定的多种方式
https://www.jianshu.com/p/07996a1af7b0

查看包的描述信息

m-x describe-package, 查看包描述。
在包的描述中一般有相应的配置命令,比如 (lorem-ipsum-use-default-bindings),那么直接在这一句的后面 c-x c-e,就可以执行这条语句,并且立刻用起来了。

lorem-ipsum

在包描述里面执行配置命令后,就可以在 scratch 这个窗口就可以直接运行了 c-c c-l p 来插入相应的段落,这种段落比较长,可以在段落里面使用 m-q 来变成短的段落。

搜索

内置的搜索可以用,但是 swiper 更加好用。

;; swiper: https://github.com/abo-abo/swiper
(use-package swiper
  :ensure t
  :config
  (progn
    (ivy-mode)
    (setq ivy-use-virtual-buffers t)
    (setq enable-recursive-minibuffers t)
    ;; enable this if you want `swiper' to use it
    ;; (setq search-default-mode #'char-fold-to-regexp)
    (global-set-key "\C-s" 'swiper)
    (global-set-key (kbd "C-c C-r") 'ivy-resume)
    (global-set-key (kbd "<f6>") 'ivy-resume)
    (global-set-key (kbd "M-x") 'counsel-M-x)
    (global-set-key (kbd "C-x C-f") 'counsel-find-file)
    (global-set-key (kbd "<f1> f") 'counsel-describe-function)
    (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
    (global-set-key (kbd "<f1> o") 'counsel-describe-symbol)
    (global-set-key (kbd "<f1> l") 'counsel-find-library)
    (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
    (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
    (global-set-key (kbd "C-c g") 'counsel-git)
    (global-set-key (kbd "C-c j") 'counsel-git-grep)
    (global-set-key (kbd "C-c k") 'counsel-ag)
    (global-set-key (kbd "C-x l") 'counsel-locate)
    (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
    (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
    ))

还是使用 progn 这个套路,从 swiper 里面把配置文件复制过来,放到这个 progn 这个块里面,然后使用 tab 来每行进行对齐上一行。
注意,如果c-x c-e 的时候,没有这个包,那么还要 m-x package-refresh-content 来更新包才行。

注意: 视频里面旧版的 swiper 还需要先安装 counsel,但是现在的不需要了。旧版的需要增加如下配置:

(use-package counsel
  :ensure t
  )

注意: 使用了 swiper,就不需要再使用 ido-mode 了,可以注释掉 ido-mode了。

参考:

Using Emacs - 6 - Searching a Swiper
https://cestlaz.github.io/posts/using-emacs-6-swiper/

virtual box 设置加大空间

管理 -> 虚拟介质管理,把里面的硬盘空间拉大。

linux 分配加大的空间

  • sudo apt install gparted 安装分区工具
  • 打开分区工具,在 extened 上面右键选择 resize,然后把剩余的容量全部加上去。
  • /dev/sda5 上面右键选择 resize,然后把剩余的容量全部加上去。
  • 点击工具栏的勾,就可以执行扩容了。
  • df -h 检查一下容量对不对。

参考:

为VirtualBox下Linux-Ubuntu虚拟机增加虚拟硬盘容量(傻瓜化操作,全程UI下完成)
https://www.cnblogs.com/r0xFED/p/12121724.html

多窗口

  • c-x 2 下方窗口
  • c-x 1 回到单个窗口
  • c-x 3 右方窗口
  • c-x o 跳到其他窗口
  • c-x 0 关闭本身这个窗口

窗口之间可以再次细分为更小的窗口。

winner-mode

;; winner-mode
;; global minor mode that allows you to “undo” and “redo” changes in WindowConfiguration
(winner-mode 1)

运行之后,当我们 c-x 1 只保留一个窗口之后,c-c left 表示恢复以前的多窗口布局,c-c right 继续回到一个窗口。

windmove

;; windmove: s-left, s-up, s-right
(windmove-default-keybindings)

windmove 默认使用 s-up, s-down, s-right 等分别进入不同方向的窗口。

progn

use-package init 阶段需要执行多条语句,就需要使用 progn 把多条语句框起来,作为一个整体来看待。

ace-window

这个可能内置的没有,别忘了 m-x package-refresh-content 刷新包。

;; ace-window: https://github.com/abo-abo/ace-window
;; progn: more than one command
(use-package ace-window
  :ensure t
  :init
  (progn
    (global-set-key [remap other-window] 'ace-window)
    ))

使用 ace-window 来代替原生的 other-window,当 c-x o 的时候,每个 window 的左上角都会有一个数字标识,随后输入你想要的那个标识,就可以跳转到你想要的窗口了。

;; ace-window: https://github.com/abo-abo/ace-window
;; progn: more than one command
(use-package ace-window
  :ensure t
  :init
  (progn
    (global-set-key [remap other-window] 'ace-window)
    (custom-set-faces
     '(aw-leading-char-face
       ((t (:inherit ace-jump-face-foreground :height 3.0)))))
    ))

上面增加的这一段的作用,只是为了按 c-x o 的时候,各个窗口左上角的数字比较大而已。

参考:

Using Emacs - 5 - Windows
https://cestlaz.github.io/posts/using-emacs-5-windows/

切换文件

如果是经常使用的两个buffer,可以直接 c-x b 这样两个互相切换。 如果是第三个buffer,那么需要使用名字才能切换。

关闭不用的文件。

c-x k 可以用来关闭当前不再使用的 buffer. 或者输入文件名,用于关闭对应的文件。

新建 buffer

c-x c-f 可以用来新建 buffer,当觉得可以保存的时候,c-x c-s,这时候才真正作为一个文件保存下来,否则前面一直是在内存里面的。

ido-mode 提供选项代替输入,特别是 buffer 切换的时候

;; ido-mode https://www.masteringemacs.org/article/introduction-to-ido-mode
(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)

每一条语句后面都要 c-x c-e.

类似于 ido-mode 的还有 helm, Swiper, counsel, anything 等等。

替换 list-buffers

;; use ibuffer instead list-buffers
;; http://xahlee.info/emacs/emacs/emacs_buffer_management.html
;; https://mytechrants.wordpress.com/2010/03/25/emacs-tip-of-the-day-start-using-ibuffer-asap/
(defalias 'list-buffers 'ibuffer)
;; (defalias 'list-buffers 'ibuffer-other-window)

执行完了之后,再次按 c-x c-b 出来的就是 ibuffer 了,在这个界面中按 h 可以查看相应的帮助,按 d 可以标记需要删除的 buffer,标记完了之后,按 x 就可以执行了。 执行完之后,选择相应的 buffer <ret> 就可以进入了。

如果想要在另外一个窗口中显示 ibuffer,那么可以 m-x ibuffer-other-window

tab 标签展示

如果喜欢像浏览器那样的标签 buffer, 可以这样设置:

;; tarbar
(use-package tabbar
  :ensure t
  :config
  (tabbar-mode 1))

但是不太推荐这种方式。

加法

(+ 2 3) ,输入 m-x eval-last-sexp 或者 c-x c-e 就可以执行这条语句,下面会有结果生成。

设置变量

(setq v 100)
(+ v v)

设置 v 为 100, 结果是 200.

执行内置函数

c-h k 查到 c-p 对应的函数是 previous-line.

(previous-line 5)

上面这条语句执行,就是光标向上移动 5 行。

查看输入的历史

m-x view-lossage 可以看到以前输入的命令。

设置隐藏工具栏

init.el 中添加:

;; hide tool-bar
(tool-bar-mode -1)