Skip to content

Commit d9b039f

Browse files
committed
”翻译了一些Emacs_Redux上的博客
1 parent 101db8f commit d9b039f

13 files changed

+407
-0
lines changed

%USERPROFILE%/IETldCache/index.dat

16 KB
Binary file not shown.

Emacs_Redux/focus-hooks.org

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#+TITLE: focus-hooks
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
Emacs24.4新增加了两个focus hook:focus-in-hook和focus-out-hook.
6+
7+
focus-in-hook顾名思义就是当frame获取到了焦点时所触发的动作. 而focus-out-hook则在frame失去焦点时会触发动作.
8+
9+
因此,若我们希望做到,当Emacs Frame是和iqu焦点后就自动保存当前buffer,可以用下面的代码来实现
10+
#+BEGIN_SRC emacs-lisp
11+
(add-hook 'focus-out-hook 'save-buffer)
12+
#+END_SRC
13+
14+
当然,更近一步,你可以保存所有的buffer
15+
#+BEGIN_SRC emacs-lisp
16+
(add-hook 'focus-out-hook (lambda () (save-some-buffers t)))
17+
#+END_SRC
18+
19+
我相信,你们还能够为这两个新hook找到其他一些更有用的使用方式的.

Emacs_Redux/locate.org

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#+TITLE: locate
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
locate是一款使用很普遍的unix命令,它允许你在一个预生成的数据库中搜索文件的路径.
6+
7+
然而可能很少人知道Emacs也提供了对locate命令的封装. 使用M-x locate,然后输入要搜索的字符串,就会将从locate数据库中的搜索结果展现出来.
8+
9+
展现locate结果的buffer处于locate-mode下,该mode提供了很多类似dired-mode的快捷键.
10+
11+
通过更改变量`locate-command`的值,你可以按照需要更改Emacs执行locate命令时所执行的命令. 例如在OSX下,你可能需要使用mdfind命令而不是locate命令.
12+
#+BEGIN_SRC emacs-lisp
13+
(setq locate-command "mdfind")
14+
#+END_SRC
15+
16+
显然你可以将`locate-command`的值设为任何命令,只要该命令接受一个字符串参数然后返回一列文件路径即可.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#+TITLE: prettify-symbols-mode一览
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
Emacs24.4中出现了一个新的minor mode,名为prettify-symbols-mode. 该mode的用处是可以将各种标识/符号的文本展示用更美观的字符(可自定义)代替(例如可以用unicode中的各种数学符号的代替ascii形式的符号名称)
6+
7+
使用prettify-symbols-mode的一个经典例子是,使用希腊字母 λ (small lambda)来代替各种Lisp方言中的lambda关键字.
8+
9+
通过在在各major-mode中初始化`prettify-symbols-alist`变量或`major-mode名称--prettify-symbols-alist`变量,向其中定义映射规则,prettify-symbols-mode可以做到这一点.
10+
11+
要实现上面的例子,只需要定义lisp--prettify-symbols-alist即可:
12+
#+BEGIN_SRC emacs-lisp
13+
(defconst lisp--prettify-symbols-alist
14+
'(("lambda" . ?λ)))
15+
#+END_SRC
16+
上面代码的意思是,在lisp-mode中,只有lambda会被替代为字符λ. 当然你还可以为不同的major-mode定义更多的映射关系.
17+
#+BEGIN_SRC emacs-lisp
18+
(add-hook 'emacs-lisp-mode-hook
19+
(lambda ()
20+
(push '(">=" . ?≥) prettify-symbols-alist)))
21+
#+END_SRC
22+
23+
经过这样设置之后,假设有一段Emacs Lisp代码
24+
#+BEGIN_SRC emacs-lisp
25+
(lambda (x y)
26+
(if (>= x y)
27+
(something)
28+
(something-else)))
29+
#+END_SRC
30+
在执行M-x prettify-symbols-mode后,会显示为
31+
#+BEGIN_SRC emacs-lisp
32+
(λ (x y)
33+
(if (≥ x y)
34+
(something)
35+
(something-else)))
36+
#+END_SRC
37+
38+
可以通过(add-hook 'some-mode-hook 'prettify-symbols-mode)来为特定的mode开启prettify-symbols-mode. 若想全局启用prettify-symbols-mode,则只需要添加下面代码到你的配置文件中即可:
39+
#+BEGIN_SRC emacs-lisp
40+
(global-prettify-symbols-mode 1)
41+
#+END_SRC
42+
43+
顺带一提,符号美化是无止境的. 一个极端的例子就是vim的插件haskell-conceal. 该插件为hashell代码引入个各种数学符号. 使用prettify-symbols-mode,我们也能达到类似的效果,但是请合理地使用它的能力.

Emacs_Redux/superword-mode一览.org

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#+TITLE: superword-mode一览
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
Emacs24.4开始提供了一个新的minor mode:subword-mode. 它会改变基于word的命令的行为模式.
6+
7+
一般情况下,Emacs会以下划线`_`和横杠`-`作为单词与单词之间的分隔符. 所有的基于单词的命令:forward-word,backward-word,kill-word等,都是基于这个前提来操作的.
8+
9+
下面是一些例子(竖线|表示光标的位置):
10+
#+BEGIN_SRC emacs-lisp
11+
;; 带-的单词
12+
|some-word
13+
;; 按一次M-f (forward-word)
14+
some|-word
15+
16+
;; 再按一次 M-f
17+
some-word|
18+
19+
;; 按一次 M-b (backward-word)
20+
some-|word
21+
22+
;; 带_的单词
23+
|some_word
24+
25+
;; 按一次 M-f
26+
some|_word
27+
28+
;; 再按一次 M-f
29+
some_word|
30+
31+
;; 按一次 M-b
32+
some_|word
33+
34+
;; 驼峰试的单词 (没有启动subword-mode)
35+
|someWord
36+
37+
;; 按一次 M-f
38+
someWord|
39+
40+
;; 驼峰试的单词 (启动了subword-mode)
41+
|someWord
42+
43+
;; 按一次 M-f
44+
some|Word
45+
#+END_SRC
46+
47+
个人认为,在开启了subword-mode后,Emacs对单词跳转的把握已经相当到位了. 尤其当进行Ruby和Lisp编程时,提供在复杂变量名的中间快速定位的能力非常有用. 但也不是所有人都喜欢这种方式.
48+
49+
当开启了superword-mode后,上面所有的例子,都当成是一个单词来处理. 例如:
50+
#+BEGIN_SRC emacs-lisp
51+
;; 带-的单词
52+
|some-word
53+
54+
;; 按一次M-f
55+
some-word|
56+
57+
;; 带_的单词
58+
|some_word
59+
60+
;; 按一次M-f
61+
some_word|
62+
63+
;; 驼峰式的单词
64+
|someWord
65+
66+
;; 按下M-f
67+
someWord|
68+
#+END_SRC
69+
70+
需要注意的是,你不能同时开启superword-mode和subword-mode. 开启一个的同时会关闭另一个.
71+
72+
个人认为,superword-mode作为一个一直开启的mode,意义不大. 但在做一些特殊编辑时,会特别有用.

Emacs_Redux/which-function-mode.org

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#+TITLE: which-function-mode
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
每个开发者应该偶尔会遇到这么一种情况吧:你正在查看一个类或方法的定义代码,这时候你想看看这个类/方法的名称是什么,但是很有可能这个类/方法的名称并同时也没有显示在编辑区中.
6+
当然,你可以往上拖动滚动条然后查看一下类/方法的名称,但其实有一个更加简便的方法,那就是使用Emacs内建的which-function-mode.
7+
8+
当开启了which-function-mode后,你会在buffer modeline的中间位置看到光标所在处的代码所表示的定义的名称.
9+
10+
开启which-function-mode的方式很简单:
11+
#+BEGIN_SRC emacs-lisp
12+
(which-function-mode)
13+
#+END_SRC
14+
这样就会对所有支持which-function-mode的major mode都开启该功能了.
15+
16+
若你只想在特定的几个major mode下开启该功能,可以这样做:
17+
#+BEGIN_SRC emacs-lisp
18+
(add-to-list 'which-func-modes 'ruby-mode)
19+
(add-to-list 'which-func-modes 'emacs-lisp-mode)
20+
#+END_SRC
21+
22+
默认情况下,当which-function-mode不能检测到定义的名称时,会显示`???`. 但你也可以通过下面的语句来更改这个显示方式:
23+
#+BEGIN_SRC emacs-lisp
24+
(setq which-func-unknown "n/a")
25+
#+END_SRC
26+
27+
那么,如果你希望把定义的名称显示在buffer的header-line而不是modeline该怎么办呢? 下面的代码能做到这一点(由Sebastian Wiesner提供)
28+
#+BEGIN_SRC emacs-lisp
29+
;; Show the current function name in the header line
30+
(which-function-mode)
31+
(setq-default header-line-format
32+
'((which-func-mode ("" which-func-format " "))))
33+
(setq mode-line-misc-info
34+
;; We remove Which Function Mode from the mode line, because it's mostly
35+
;; invisible here anyway.
36+
(assq-delete-all 'which-func-mode mode-line-misc-info))
37+
#+END_SRC

Emacs_Redux/删除重复的行.org

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#+TITLE: 删除重复的行
2+
#+AUTHOR: Administrator
3+
#+OPTIONS: ^:{}
4+
5+
Emacs24.4开始有了一个新的命令:delete-duplicate-lines
6+
7+
M-x delete-duplicate-lines会删除选中region中的重复行. 举个例子,假设选中的region为:
8+
#+BEGIN_EXAMPLE
9+
test
10+
dup
11+
dup
12+
one
13+
12345678910 two
14+
one
15+
three
16+
one
17+
test
18+
five
19+
#+END_EXAMPLE
20+
则,在执行M-x delete-duplicate-lines后,region的内容变为:
21+
#+BEGIN_EXAMPLE
22+
test
23+
dup
24+
123456 one
25+
two
26+
three
27+
five
28+
#+END_EXAMPLE
29+
30+
默认情况下若存在多个重复行,则从上到下第一次出现的行会保留下来. 若想保留的是最后一次出现的行,则使用C-u M-x delete-duplicate-lines. 这样的话,region会变为:
31+
#+BEGIN_EXAMPLE
32+
dup
33+
two
34+
123456 three
35+
one
36+
test
37+
five
38+
#+END_EXAMPLE
39+
40+
注意到:与UNIX的uniq命令不同的是,在判断重复行时,并不要求重复行是相互毗邻的,若要实现类似uniq的效果,可以使用C-u C-u M-x delete-duplicate-lines.
41+
42+
若要保留重复的空白行,则需要使用C-u C-u C-u M-x delete-duplicate-lines
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#+TITLE: Quckly_Open_an_Info_Manual
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
每个用过Emacs的人都知道Emacs自带了很多info文档. 大多数人都知道使用C-h i(M-x info)来查看内建的这些文档,甚至有些人还知道可以使用C-h r (M-x info-emacs-manual)来直接查看Emacs manual.
6+
7+
然而,如果你知道想要查看的手册名称,这里有一个鲜为人知的命令:info-display-manual. 该命令会在minibuffer中提示你输入要查看的手册(可以使用自动补全功能哦)
8+
9+
为了让你更直观的感受到该命令相对info命令的有点,下面举个例子,用两种命令分别来查看Emacs Lisp Manual.
10+
11+
当使用info命令时,你需要输入
12+
#+BEGIN_EXAMPLE
13+
M-x info RET m elisp RET
14+
#+END_EXAMPLE
15+
16+
而使用info-emacs-manual,则只需要输入
17+
#+BEGIN_EXAMPLE
18+
M-x info-emacs-manual RET elisp RET
19+
#+END_EXAMPLE
20+
21+
如果你认为这个命令很好用,我推荐为它分配一个快捷键
22+
#+BEGIN_SRC emacs-lisp
23+
(define-key 'help-command (kbd "C-i") 'info-display-manual)
24+
#+END_SRC
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#+TITLE: 快速定位Emacs_Lisp源代码
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
使用Emacs的过程中,经常会要查看各种库,函数或变量定义的源代码. 一般的方法是使用C-h f(describe-function), C-h v (describe-variable) 和 C-h k (describe-key) 这些命令来跳转到源代码的位置.
6+
7+
现在让我们试着优化这一流程
8+
9+
* find-func
10+
11+
find-func是Emacs内建的一个库, 它提供了很多有用的命令来帮助我们快速定位源代码的位置. 下面简单介绍一下:
12+
13+
* find-library命令
14+
15+
可以使用M-x find-library定位库的源代码. 假设你想要定位到ido的源代码处,可以执行:
16+
#+BEGIN_EXAMPLE
17+
M-x find-library RET ido RET
18+
#+END_EXAMPLE
19+
20+
推荐将该命令绑定到快捷键C-h C-l
21+
#+BEGIN_SRC emacs-lisp
22+
(define-key 'help-command (kbd "C-l") 'find-library)
23+
#+END_SRC
24+
25+
* find-function命令
26+
27+
使用M-x find-function来定位到某个函数的源代码处. 例如
28+
#+BEGIN_EXAMPLE
29+
M-x find-function RET find-function RET
30+
#+END_EXAMPLE
31+
32+
推荐将该函数绑定到C-h C-f
33+
#+BEGIN_SRC emacs-lisp
34+
(define-key 'help-command (kbd "C-f") 'find-function)
35+
#+END_SRC
36+
37+
* find-function-on-key
38+
39+
可以使用M-x find-function-on-key来查找快捷键所代表的命令的源代码. 下面的例子展示了如何查找绑定到C-a快捷键的命令(beginning-of-line)的源代码:
40+
#+BEGIN_EXAMPLE
41+
M-x find-function-on-key RET C-a
42+
#+END_EXAMPLE
43+
44+
推荐将该命令绑定到C-h C-k
45+
#+BEGIN_SRC emacs-lisp
46+
(define-key 'help-command (kbd "C-k") 'find-function-on-key)
47+
#+END_SRC
48+
49+
* find-variable
50+
51+
可以使用M-x find-variable来查找定义变量的源代码.
52+
#+BEGIN_EXAMPLE
53+
M-x find-variable RET large-file-warning-threshold RET
54+
#+END_EXAMPLE
55+
56+
推荐将该命令绑定到C-h C-v
57+
#+BEGIN_SRC emacs-lisp
58+
(define-key 'help-command (kbd "C-v") 'find-variable)
59+
#+END_SRC
60+
61+
除了上面所列函数,find-func库还提供了其他有用的命令,比如find-function-at-point和find-variable-at-point.
62+
63+
若你不喜欢上面推荐的快捷键,可以考虑直接使用find-function-setup-keys代替. 它默认定义了C-x F,C-x V,C-x K等快捷键.
64+
65+
* elisp-slime-nav
66+
67+
另一个很酷的浏览Elisp源代码(和文档)的库是第三方的elisp-slime-nav. 安装这个库后,可以用下面的代码启用它:
68+
#+BEGIN_SRC emacs-lisp
69+
(require 'elisp-slime-nav)
70+
(dolist (hook '(emacs-lisp-mode-hook ielm-mode-hook))
71+
(add-hook hook 'elisp-slime-nav-mode))
72+
#+END_SRC
73+
74+
一旦启用了elisp-slime-nav-mode,就可以使用`M-.`来跳转到光标所在函数或变量的定义处. 然后还可以使用`M-,`跳回来. 还可以使用C-c C-d(或者C-c C-d d)来查看光标所在的object的文档描述.
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#+TITLE: 用Emacs打开大文件
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
我想每个人在用Emacs打开一个较大的文件时,都会收到一个警告:"File foo.bar is large (XX.XM), really open?"
6+
7+
默认情况下,Emacs打开打超过10MB的文件时都会显示该警告信息,这让人很烦,何况现代的计算机打开一个比这大的多的文件也并会让Emacs变慢什么.
8+
9+
幸运的是,可以通过设置`large-file-warning-threshold`的值,来改变产生警告的阀值. 推荐把它修改为100MB左右:
10+
#+BEGIN_SRC emacs-lisp
11+
;; 只有当打开的文件超过100MB时,才产生警告
12+
(setq large-file-warning-threshold 100000000)
13+
14+
#+END_SRC
15+
16+
当然你也可以把该变量设为nil,这表示不管打开的文件有多大,永远不要产生这种警告.
17+
18+
PS. 我们确实也不推荐在Emacs中直接打开一个超级巨大的文件(例如1GB). 若你真的需要打开一个如此巨大的文件,推荐你使用[[https://github.com/m00natic/vlfi][vlfi]]这个package.

Emacs_Redux/配置scratch_buffer.org

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#+TITLE: 配置scratch_buffer
2+
#+AUTHOR: lujun9972
3+
#+OPTIONS: ^:{}
4+
5+
相信大家对*scratch* buffer应该都挺熟悉了,毕竟每次启动Emacs,都会显示这个buffer. 若设置inhibit-startup-screen为t,则它会是你打开Emacs后看到的第一个buffer(除非你修改了initial-buffer-choice,这样的话,它所指的buffer会成为地一个显示的buffer)
6+
7+
*scratch* buffer可以很方便的用来临时记录一些便贴,或做一些Emacs Lisp的实验, 然而很多人可能并不常写Emacs Lisp,这样的话,*scratch* buffer对他们的价值就不是那么高了.
8+
9+
很少人知道的是,我们可以配置*scratch* buffer的major-mode(默认为lisp-interaction-mode).
10+
11+
如果你是个Ruby开发人员,可以通过下面代码来让*scratch* buffer默认使用ruby-mode
12+
#+BEGIN_SRC emacs-lisp
13+
(setq initial-major-mode 'ruby-mode)
14+
#+END_SRC
15+
16+
当然,你也可以更改*scratch* buffer的初始内容,默认情况下初始内容为:
17+
#+BEGIN_SRC emacs-lisp
18+
;; This buffer is for notes you don't want to save, and for Lisp evaluation.
19+
;; If you want to create a file, visit that file with C-x C-f,
20+
;; then enter the text in that file's own buffer.
21+
#+END_SRC
22+
23+
而若你设置了*scratch* buffer默认为ruby-mode,则可以将初始内容修改为:
24+
#+BEGIN_SRC emacs-lisp
25+
(setq initial-scratch-message "\
26+
# This buffer is for notes you don't want to save, and for Ruby code.
27+
# If you want to create a file, visit that file with C-x C-f,
28+
# then enter the text in that file's own buffer.")
29+
#+END_SRC
30+
31+
当然,你也可以直接将initial-scratch-message设置为nil,则初始内容为空.

0 commit comments

Comments
 (0)