Emacs使用教程(四)

上回介绍了在Emacs中如何插入删除文本的简单操作,以及一些杂七杂八的命令,都还是蛮容易的。这回先跳过编辑这部分,介绍Emacs中的Minibuffer,呃,翻译过来叫迷你缓冲,听着比较难受,后面还是用E文吧。

 

一、初识Minibuffer

  Minibuffer 乃是Emacs命令读取复杂参数的位置。比如说文件名,缓冲名,命令名以及Lisp表达式这些东西。Minibuffer 显示在echo area中,当Minibuffer处于使用状态时,会出现一个彩色的提示符并以冒号结尾,根据提示符信息输入参数,以回车提交。取消Minibuffer 使用C-g,也就是上节介绍的取消命令。
  其实Minibuffer并不是太神秘,最常见的地方就是打开文件时提示我们输入文件名:

  按下C-x C-f 后,回显区就会变成这个样子,其中Find file 就是Minibuffer的提示符,因为它是蓝色的。后面的路径是Minibuffer自动添加的默认值,我们可以把参数选项insert-default-directory设置为nil,关闭这个默认路径。
  这里插入一下如何设置Emacs参数选项,我们键入M-x set-variable RET insert-default-directory RET后输入nil 即可,这里的RET代表回车。改回默认,前面输入一样最后输入t 。其实我们按下M-x set-variable也激活了Minibuffer。

 

  二、在Minibuffer中编辑

  我们可以将Minibuffer看成和主输入区类似的缓冲,Minibuffer中也有个buffer嘛,就是说某些主输入区的命令Minibuffer也可以用。同样我们看上面那张图,使用C-a 可以把光标移到d字符的位置,再按C-e 光标又回到最后,还可以使用M-Backspace删除“info/” 回到上级目录。不过需要注意的一点是,RET是Minibuffer的结束符而不是换行符,所以如果我们需要插入新行就不能使用回车,而是用C-o。同样对于TAB、SPC、?(前两个分别对应Tab键和空格键)在Minibuffer中经常用于自动补全,所以也不能直接输入,我们需要使用C-q 来插入,比如TAB,就用C-q TAB来替换。可以说Minibuffer和主输入区基本上一样,同样的快捷键、同样的操作方式,复制粘贴功能一应俱全。
  通常情况,Minibuffer在屏幕中只有一行,随着你输入的增多,Minibuffer会自动调整大小来适应。变量 resize-mini-windows用于控制Minibuffer的大小变化,其默认值是grow-only,大小只增不减,设为t 后,如果你删除一行会自动缩小,设为nil,就不会动了。变量max-mini-window-height 控制Minibuffer高度的最大值,设为浮点数表示占整个窗口的百分比,整数表示最大可以有多少行。默认值是0.25。
  当我们操作Minibuffer时也可以控制另一个窗口,C-M-v 命令就是用来滚动另一个窗口的文本,这个是往下翻页,C-M-S-v 是往上翻页,大家要看清楚,这不是四个键一起按,如果你不小心按的是s键,你会发现出来的是QQ聊天窗口,所以出于对中国广大QQ用户的考虑,Emacs把它改成了大写的s,就是说还要加上Shift键,呃,这是我目前见的最长的按键了而且比较变态。其实,也有简洁的方式,M-PageUp和M-PageDown,不过这两个键不在主键盘区,就看各位心情了。
  Minibuffer 一般情况是不允许递归调用的,也就是我们不能连按两次C-x C-f,它会提示Minibuffer正在使用,我们也可以设置变量enable-recursive-minibuffers 为t 来激活递归调用,不过容易引起错误,大家还是尽量避免吧。

三、自动补全

  Emacs中的命令有那么多,我们也不可能每一个都记的住,电脑里的路径也很长,记漏几个字符也很正常,这个时候自动补全就显得很重要了。常用的自动补全有四个键TAB、SPC、RET和?。我们先看它们的准确定义。
  TAB    尽可能的补全Minibuffer中的字符,如果没有满足要求的,则列出所有可能的补全。对应命令minibuffer-complete。
  SPC    最多补全Minibuffer中的一个词,如果没有满足要求的,则列出所有可能的补全,在输入路径时SPC不可用。对应命令minibuffer-complete-word。
  RET    提交Minibuffer中的文本,或者选取第一个可能的补全提交。对应命令minibuffer-complete-and-exit。
  ?      列出所有可能的补全。对应命令minibuffer-completion-help。
  下图就是我们按ins TAB TAB后自动补全的例子:

  第一个TAB补全了“ert-”,第二TAB列出了所有可能的补全。
  再仔细解读下这几个键,TAB是用的最多的自动补全,可以说每个操作系统的shell都支持TAB自动补全,它的设计目标也是尽可能的补全我们的输入,而一次补全需要满足下面三个准则:

  • 光标前Minibuffer中的文本必须和补全候选项中开头的内容一致,如果光标后还有文本则其需为补全候补项剩下内容的字串。

  • 如果不满足上一条件,则使用部分匹配补全,即将Minibuffer中的文本以”-“或者空格分开,分别补全。比如输入”em-l-m”,再按TAB,则会补全至”emacs-list-mode”。

  • 如果仍无满足的候选项,则继续使用第一条准则,不过忽略光标后的文本。

  空格键的匹配模式与TAB类似,不过它只匹配到下一个”-“或者空格,比如输入auto-f 后按空格会完成auto-fill-,需要再按一个空格才会完全补全为auto-fill-mode。此外,在TAB和SPC的匹配当中可以使用通配符”*”,代表任意一个或多个字符。
  在没有完全匹配项时,Emacs会列出所有满足条件的匹配,我们可以使用多种方法来选择某一项。
  Mouse-1, Mouse-2,就是鼠标左右键。
  或者在Minibuffer中按M-v,就会切换到补全候选项窗口,然后我们可以使用RET选择光标位置的项(choose-completion)。或者使用左右箭头键移动光标(next-completion、previous-completion)。很遗憾,除了使用上下左右,没有更快的方法了,M-f 和M-b 都是移到”-“字符的位置。再说明一点,上面几个命令想要能用,就必须把Minibuffer递归调用打开。
  在我们使用RET提交输入时,会出现三种不同情况的自动补全,三种情况根据提交内容的使用情况区分。

  • 严格匹配,故名思意,就是说输入的内容要完全匹配某一项才行。我们使用C-x k 来关闭某一个buffer时会提示输入buffer名,这个时候就是使用的严格匹配。如果找不到这个buffer 命令就不会执行。

  • 谨慎匹配,这个和严格匹配类似,区别在于回车后如果没有找到一个完全匹配的项Minibuffer不会退出,而是进行自动补全,再按RET就可以提交输入,然后退出Minibuffer。谨慎匹配用在读取必须存在的文件时。

  • 宽松匹配,C-x C-f 就是典型的宽松匹配,有一致的就打开这个文件,没有一至的就新建个文件。

  自动补全还有种icomplete 模式,使用M-x icomplete-mode 启动,作用是自动更新可能的补全。

  接下来再介绍一些自动补全的变量。
  completion-auto-help ,设为nil 时不会出现补全候选项列表,必须使用? 手动调出。设为lazy,在按第二次TAB时会出现补全候选项列表。
  completion-ignored-extensions,它的值包含了一些字符串,包含了比如”.o”, “.elc”, “~” 之类的,这样在输入文件名自动补全时就不会选择以这些结尾的文件了,不过当所有可能的候选都在忽略后缀里面,所有忽略全部无效。比如有foo.c 和 foo.elc 两个文件,输入foo TAB,会得到foo.c,但你输入foo.e TAB 还是会出现foo.elc。此外如果它的某项值是以”/” 结尾,则代表的是一个文件夹。
  read-file-name-completion-ignored-case ,值为non-nil 表示忽略大小写,nil 为不忽略大小写。

四、Minibuffer 历史

  在Minibuffer中的每次输入都保存在Minibuffer的历史当中,我们可以很方便的调出之前输入的某次命令。
  M-p 移到Minibuffer历史中的前一条,previous-history-element。
  M-n 移到Minibuffer历史中的后一条,next-history-element。M-r regexp RET 移到Minibuffer历史中的前一条,使用正则表达式,previous-matching-history-element。
  M-s regexp RET 移到Minibuffer历史中的后一条,使用正则表达式,next-matching-history-element。
  提醒一下,这些要Minibuffer处于激活状态才能使用。每次移动后取出的历史会替换当前的输入,而当我们在最后一条记录时继续使用M-n,还是会照样出现一条记录,不过这个记录是Emacs猜的。此外还需要说明的是,Emacs 维护了多个不同的历史,比如我们打开文件的路径历史,或者我们调用编译器的编译参数历史,而Emacs搜索历史也是在相应的历史列表中进行。
  关于Minibuffer历史的参数常用有两个,history-length 历史队列最大值,history-delete-duplicates 是否删除相同的历史。都是字面意思就不仔细说了。
  如果我们现在在主窗口也可以快速的调出最近执行的命令,使用C-x ESC ESC (repeat-complex-command)再执行一次最近的Minibuffer中的命令,Emacs会提示你是否执行。我们还可以使用M-p, M-n 来选择其他的历史。命令M-x list-command-history 可以列出最近所有的历史。
  最后说下Minibuffer历史的本质,它们都是储存在Lisp变量command-history中项,其中每一项都保存的每次执行的命令和参数。

小结:

  这次讲的东西不少哈。

按键

命令

作用

(none) set-variable 设置变量
C-M-v scroll-other-window 向下滚动另一个窗口
M-PageDown 同上 同上
C-M-S-v scroll-other-window-down 向上滚动另一个窗口
M-PageUp 同上 同上
TAB minibuffer-complete 自动补全Minibuffer
SPC minibuffer-complete-word 自动补全Minibuffer中一个词
RET minibuffer-complete-and-exit 提交Minibuffer
? minibuffer-completion-help 列出所有可能补全
RET(候选列表中) choose-completion 选择候选项
previous-completion 上一个候选项
next-completion 下一个候选项
C-x k kill-buffer 关闭一个buffer
(none) icomplete-mode 自动更新补全模式
M-p previous-history-element 前一历史
M-n next-history-element 后一历史
M-r (regexp) previous-matching-history-element 前一历史,使用正则表达式
M-s (regexp) next-matching-history-element 后一历史,使用正则表达式
C-x ESC ESC repeat-complex-command 重复最近一次命令
(none) list-command-history 列出所有命令历史

   

变量

作用

insert-default-history 打开文件是否插入默认路径
resize-mini-window Minibuffer大小变化模式
max-mini-window-height Minibuffer最大高度
enable-recursive-minibuffers 是否允许Minibuffer递归调用
completion-auto-help 自动补全帮助模式
completion-ignored-extensions 自动补全忽略后缀名列表
read-file-name-completion-ignored-case 自动补全是否大小写敏感
history-length 自动补全历史长度
history-delete-duplicates 自动补全是否删除重复项

Emacs使用教程(三)

上回说到怎么在Emacs中移动光标,这回将介绍如何在Emacs中编辑文本。
任何一款文本编辑软件的核心功能当然就是编辑文本,Emacs也不例外,虽然它也有许多其它强大的本领,但都离不开文本编辑。闹,文本编辑说白了也就是打字,专业点说我们需要实现一种所见即所得输入方式。在Emacs中打字和Notepad中没什么区别,一样也是打开一个文件直接往里面敲字符就可以了,中文也行。这个和Vim区别比较大,我们还需要知道自己是在哪个模式下,不然乱敲一气也不见屏幕有什么反应。

一、文件操作

刚才我们说到编辑文本就是打开一个文件往里面敲字符,所以我们第一件事就是打开一个文件。
C-x C-f 输入这个命令后在回显区会看到一个提示“Find file: ”,然后是我的文档的路径,这时需要输入你编辑的文件的名称。注意,这里的输入的文件名可以包含路径,比如 D:\text.txt,或者是相对路径。还有就是在Windows中我们可以使用Windows风格的反斜杠”\”,当然了也可以使用正斜杠”/”。如果输入了一个新的路径,Emacs的当前路径会跳转到你输入的地方,(实际上是新开了一个buffer)。如果Emacs没找到你输入的文件,它会以你输入的名字自动新建一个文件。另外Emacs还支持拖拽,就是说可以把文件图标拖到Emacs中来打开它。
当你不小心错打开一个文件时,可以使用C-x C-v 来换一个,操作和C-x C-f 一样,这个区别嘛是Emacs在buffer中处理有些不同。
C-x C-s 这个命令是用来保存文件的,另存是C-x C-w ,这两个都比较简单,一看就会。

二、输入文本

除了一些基本的输入方式,Emacs还可以输入非打印字符,就是ASCII表中前面的那些字符。
使用C-q (n), 这里的n代表一个八进制数,就能打出n对应的ASCII表中的符号。
还有就是Unicode字符比如日文啊韩文啊,使用C-x 8 后面接Unicode标准中字符的名字或者编码就可以输出这个乱七八糟的东西了。这我相信不会有谁闲的无聊来记这种一长串数字的,而且我们有更为先进的方案,(广告时间)当。。当。。当。。,现在隆重推出Unicode字符超级输入工具——搜狗软键盘,省去了你记忆一大堆16进制数的烦恼,还能输入中文,实在是居家旅行必备良品。

三、删除文本

相比输入,Emacs删除文本的花样就比较多了。
Backspace,退格键,这个比较传统就不说了。
Del键,删除光标处的字符,虽然这个也很常见,但它违背了Emacs的原则,“你的手不用离开主键盘区”,所以我们用C-d来代替。
M-d ,这个用来删除一个单词(记住在中文中单词表示两个相邻标点符号中的句子,所以如果你是打中文这个键还是少用,稍不留神多长一截句子就不见了)。而且它删除的是从光标当前位置到单词结束,还会把单词前半截留给你。
相对应,删除单词前半截可以用,M-Backspace。
M-k, 删除一段句子,这个在中英文有些不同。中文里面它只会删除到句号为止,包括句号。而英文中,它不认’.’, ‘!‘,这些东西,而是把整段都删了(英文的分段用两个回车表示)。和M-d一样,它也是从光标处开始删。对应删回去是C-x Backspace。
C-k, 从光标起删除当前行。
一个比较详细的例子见下图:(宽线覆盖的文字就是使用箭头指向的命令删除的部分,注意中英文的区别)

四、撤销命令

操作难免有失误之处,Windows里面Ctrl + z 命令使用频率也是蛮高的,不过在Emacs中按Ctrl + z 会发现窗口最小化了。Emacs中要达到撤销效果使用的是 C-/ ,同样还可以使用 C-_ 或者 C-x u ,这三个都对应的是Undo命令。
和Vim 类似,Emacs中删除的内容也保存在一个缓冲中,相当于一个剪贴板,我们可以很方便的调出某一次放进去的东西,这个地方我还没仔细看,放到以后再讲。
上面说的是撤销文本上的操作,还有个比较常用的命令C-g ,这个是用来撤销命令的,当你输了一半命令发现不对就可以用它了。

五、一些杂项命令

有些比较零碎的命令又比较常用,呃,其实应该放到第一章的,先搁在这儿吧。
帮助命令:
C-h t 调出Emacs Tutorial。
C-h r 调出Emacs Manual。
C-h k (command) ,调出对应command的帮助,比如C-h k C-n 就是查看C-n的帮助。
空白行:
插入空行,C-o 。删除空行C-x C-o ,注意,如果有许多空行时,这个命令会删的只剩一个空行,只有一个就直接删了。这两个命令并不是完全对应,插入空行实际是插入一个回车换行符,而删除空行的标准是这一行什么文字都没有才删了,如果我们在一行文字中间按C-o,光标后面的内容会移到下一行,再按C-x C-o 却没有反应,因为这行前面还有内容。
重复命令:
上章介绍两个数字参数的重复命令,这儿还有一个不带数字参数的。C-x z ,这个命令的对象是它前面输的命令,比如,先按C-n ,再按C-x z,就会重复一次C-n,然后我们每按一次 z, 就再往下走一行,相当方便。

小结:

按键

命令

作用

C-x C-f find-file 打开文件
C-x C-v find-alternate-file 打开另一个文件
C-x C-s save-buffer 保存文件
C-x C-w write-file 另存文件
C-q (n) quoted-insert 插入字符,n表示字符的八进制ASCII码
C-x 8 ucs-insert 插入Unicode字符

C-d

delete-char

删除光标处字符

Backspace

delete-backward-char

删除光标前字符

M-d

kill-word

删除光标起单词

M-Backspace

backward-kill-word

删除光标前单词

C-k

kill-line

删除光标起当前行

M-k

kill-sentence

删除光标起句子

C-x Backspace

backward-kill-sentence

删除光标前句子

(none) kill-paragraph 删除光标起段落
(none) backward-kill-paragraph 删除光标前段落

C-/

undo

撤销

C-_ undo 撤销
C-x u undo 撤销
C-g keyboard-quit 撤销命令
C-h t help-with-tutorial 调出Emacs Tutorial
C-h r info-emacs-manual 调出Emacs Manual
C-h k (command) describe-key 查看对应command帮助
C-o open-line 插入空行
C-x C-o delete-blank-line 删除空行
C-x z repeat 重复前个命令

Emacs使用教程(二)

上回开了个头,简单的介绍了Emacs的一些基本常识,这回继续说基本常识,怎么移动你的光标。可能有人会说,这上下左右键不是很好用吗,还用你来讲。呶,Emacs的强大在于你能够只使用键盘左边那堆键来完成任何事情(不包括顶上的ESC和Function),这也是Emacs的设计宗旨。
  为了试验这些按键,大家在进入Emacs时选择页面中间的Emacs Tutorial,这里面可以随便乱按不用担心出什么岔子。

一、基本导航

  看下面这张图片:
  

  可以这么记,p-previous,n-next,b-backward,f-forward。这里所说的字符对于E文,就是一个字母,而中文是一个汉字,其实Emacs对中文支持还是很厚道的,后面慢慢可以看出来。不过在这儿我个人感觉这个光标移动没有Vim方便,别人就HJKL,一个键就能动了,这需要两个,Ctrl 有时还觉得按着很别扭,不太和谐呀。
  在按C-n 时,如果越过了页尾,不像一般Windows编辑器是往下滚一行,而是往下滚半夜,当前光标会置于页面中间。C-p 也是一样的。
  另外两个使用较多的是C-v 往下翻页,M-v 往上翻页。呃,还有一个C-l 就是把当前行提到页面中间,感觉Emacs对页面中似乎情有独钟啊。

二、中级导航

  按字符移的上节说了,然后说按单词移动:

  M-f 向前移动一个单词,Emacs理解的中文单词是两个标点符号之间的东西,所以中文就是移到下一个标点符号的位置。往回是M-b ,向后移动一个单词。
  C-a 移动到行首,C-e 移动到行尾。
  M-a 移动到句首,M-e 移动到句尾,在中文中一般就是跑到句号的位置,这里我不得不说一下,现在很多年轻人写文章有一逗到底的习惯,就只在文章最后加个句号,如果用Emacs来看你的文章,一个M-e 啥都不用干了。作为一个有一定文学素养的人,在此我严厉反对这种写文章的作风,不和谐。
  M-} 移动到下一段, M-{ 移动到上一段。
  还有两个跑的更快的导航,M-< 移到文档首,这里要注意是小于符号<,不是逗号, ,所以我们是按Alt + Shift + ,  切记。移到文档尾是M->。
  C-x [ 和 C-x ] ,分别是往上一页和往下一页。这里页是由分页符控制的,在Emacs Tutorial 中是没有分页符的,所有这两个键会跑到文档头和文档尾去。

  例图:

  阴影处是当前光标的位置,其它箭头所指是按相应键后光标的位置。

三、高级导航

  M-r 移动到页面中间行首位置,holly shit,又是页面中间,真XX阴魂不散。
  M-x goto-char (n),这个比较复杂,先按M-x,然后空格输goto-char回车,另外Emacs有Tab键补全功能,大家可以试试,如果有多个选项会有提示,最后输入一个整数。这个东西会移动到从头数第n个字符的位置,我估计不会有人变态到能记住每个字是第几个字符。
  M-g M-g [n],按两次M-g,不用回车,提示输入一个数字,移动到指定行n,两个M-g,也可以输M-g g 。
  还有一个比较罕见的,C-x C-n, 这个是设置当前列为目标列。这是什么意思呢,本来我们按C-n 和C-p 时,光标会往下或往上移一行,而列的位置就是当前光标列的位置,除非下一行列没那么多(就是字符没那么多),光标会到距当前列最近的列。而我们可以用这个组合键重新设一个目标列,这样在按C-n 和C-p 时,光标会跑到我们设的目标列上。如果你不幸按了,而且又不习惯,可以使用C-u C-x C-n 来取消目标列设置。补充一点,这两个命令都是禁用命令,是Emacs考虑大家多半不会用,而且比较怪的命令,所以通常就禁用了,你不小心调出时会给出提示问你是否需要继续。

就像这个样子:

  大家按个空格稍微试下就行了。
  最后还有两个重复命令:
  M-n, n是数字,意思是重复下个命令n次,比如M-3 C-f,就是向前移三个字符。
  C-u n,n还是数字,也是重复下个命令n次。 如果省略n,就是4次。按两次C-u,就是重复16次。

 

小结:

 

按键

命令

作用

C-f

forward-char

向前一个字符

C-b

backward-char

向后一个字符

C-p

previous-line

上移一行

C-n

next-line

下移一行

M-f

forward-word

向前一个单词

M-b

backward-word

向后一个单词

C-a

beginning-of-line

移到行首

C-e

end-of-line

移到行尾

M-e

forward-sentence

移到句首

M-a

backward-sentence

移到句尾

M-}

forward-paragraph

下移一段

M-{

backward-paragraph

上移一段

C-v

scroll-up

下移一屏

M-v

scroll-down

上移一屏

C-x ]

forward-page

下移一页

C-x [

backward-page

上移一页

M-<

beginning-of-buffer

移到文档头

M->

end-of-buffer

移到文档尾

M-g g n

goto-line

移到第n行

(none)

goto-char

移到第n个字符

C-l

recenter

将当前位置放到页面中间(Emacs最喜欢的地方)

M-n

digit-argument

重复下个命令n次

C-u n

universal-argument

重复下个命令n次,n默认为4

 

注:这里命令这列就是按了M-x后输的东东。

 

Emacs使用教程(一)

前言的前言:本人也是初学Emacs,之前对Vim也只接触了一点,所以也谈不上对哪个更喜欢,也分不出哪个更好。写这个教程的目的一是方便自己更好的学习Emacs,二是没事找事。如果有专家路过还望多指点。

前言:大名鼎鼎的Emacs,传说中程序员的终极武器,已经跨越了文本编辑器,IDE的境界,可以替代操作系统GUI的东东。怀着一种膜拜的心情我决定开始学习Emacs,期望有一天也能成为一代Emacs大侠。

参考书目:
1. GNU Emacs Manual (Emacs 官网有下)
2. O’Relly Learning GNU Emacs, 3rd Edition

一、Emacs的安装使用

学习软件的第一件事当然是把它下下来, http://ftp.gnu.org/pub/gnu/emacs/windows/emacs-23.1-bin-i386.zip 目前最新版23.1,这个版本号够吓人的,Opera的10.0还不及别人的一半。本人不幸,使用的是Windows版本。
安装过程异常简单,直接解压就行,但路径中不能包含空格,所以就表往Program Files文件夹下面丢了,我是直接放在根目录的,找起来也方便。运行bin目录下的addpm.exe可以添加开始菜单快捷方式。也可以直接运行runemacs.exe 来启动Emacs。
卸载也很方便,Emacs不会对系统写任何垃圾东东,直接删除文件夹即可卸载,还有你的快捷方式。
启动Emacs后的界面如下:

猛的一看,没什么太出彩的地方,感觉比较简陋。上面依次是标题栏、菜单栏、工具栏,中间一大块就是编辑文本的地方,下面两行是mode line 和echo area。
echo area是你输入命令和显示消息的地方。
在mode line中第一个字符表示字符集,c代表chinese-gbk,后面那个 \ 符号表示换行类型,\是指DOS的CRLF换行,另外还有Unix的LF换行和Mac的CR换行。然后一个字符,表示打开的文件是否可写(先称为文件便于理解,实际上是buffer),%表示只读,- 和 * 表示可写。再一个字符表示文件是否已写,% 或 – 表示还没动,*表示已经更改。这两个字符组合起来有四个状态。

符号 表示
%% 只读,未更改
可写,未更改
** 可写,已更改
%* 只读,已更改

再后面一个 – 表示路径,后面黑体的 GNU Emacs 表示buffer的名称。后面的All表示光标的位置,当文件在一页就能显示完的时,这里是All,此外还有Top, Bot,以及当前位置百分比。L5表示第五行。Fundamental 是模式名,模式种类很多,这个以后介绍。
如果是第一次使用,点击Emacs Tutorial,里面也有Emacs的一些基本介绍,而且是中文。

二、Emacs按键

Vim 把控制和编辑分成了两个模式,单独操作,互不影响。而Emacs是同时进行编辑和控制,只不过控制命令需要使用控制键。
Emacs的控制键就三个Control,Shift和 Meta,Control 和 Shift 键盘上都有,Meta 在美式键盘中就是Alt,在苹果键盘上是那个很花的四个圈的键,如果键盘上没有Alt (这个要某些欧洲人才会遇到)可以使用Esc 代替,另外Esc 不想Alt 通常当组合键用,它要单独按一下,再按另外的。
以后控制命令就这样表示:
C-f       Ctrl+f
C-M-f   Ctrl+Alt+f
C-_    Ctrl+Shift+-
Emacs中,这些组合键其实是一些函数的快捷方式,比如C-n 是next-line的快捷方式。我们除了使用组合键意外,还可以直接调用函数。
按下M-x,然后输入函数名就可以调用函数了。

三、进入退出Emacs

进入前面已经说了,现在说怎么退出。
最直接的办法,点右上角的叉,当然这个没什么技术含量。
比较文明的方法,C-x C-c ,如果当前文件已经修改会问你是否保存。
野蛮点的方法,调用函数kill-emacs,即M-x kill-emacs,直接退出,不管是否修改。
不过直接退出后,Emacs会在相同目录下保留一个以#号开头结尾的相同文件名文件,下次启动可以使用M-x recover-file来恢复。如果是多次保存后,还会有个以~结尾的文件,保存了上次信息。

2014年底回顾

蓦然间发现  原来今天已经到了2014年的倒数第二天
回顾这一年  我只能说自己不曾后悔

唯一的感觉是累  然后就是自己的付出与收获有点不成正比
作为一名运维人员  我觉得我是成功的  但又是失败的

怎么说呢   年初住在安贞 离上班的地点不是很远  这段时间刚好还有着工资的缓慢增长 所以每月都有点小激动  算是每月的神秘大礼吧
而且当时自己接手的事情也比较多  终端到交易平台 再到商户信息平台  每一次测试实际上都是对代码掌控能力的一次巩固   这样的日子 忙却安定……

不记得从哪个月开始  公司那边蔓延一种离职之风   一个个老员工慢慢的退出了福尔这个平台
当时  也没有想太多  毕竟是自己的第一份工作  就算是工资少点   自己看得都不是那么重
记得第一个走的好像是终端的届哥  然后就到了本组的财哥  信息的说姐   具体的顺序不是太记得了  只是感觉中层骨干人员在慢慢流失
当时对此看的也不是太重  毕竟雏鹰总得要经历风雨才能翱翔蓝天  中层的退出不外乎是我们新人的一次历练
虽然过程或许曲折  但前景应该是一片光明……

不得不承认期间自己犯了很多错
拖了很多后腿  时间进度控制的往往差强人意
但终归也算是体验到了成功的喜悦
也算是在一步步的成长吧

到了年中  发现自己已经毕业工作一年了
在几个好友的聚会上   总免不了会谈及到工作生活中的一些琐事
结果发现 虽然自己的生活忙碌而充实  但总少了些许东西
细想了下  应该是工作的激情~~~
想当年工作的时候都是载着满满的热情  但是那段时间  所有的一切感觉总是忙碌而没有新知识的收获
便想着挤点时间去充充电  考个软考证……
虽然明白  就算是拿到证了  或许对自己而言魅族实际上的好处  但至少总可以证明自己的青春没有白费

接下来就开始学霸的日子  周末跑去国图  徜徉在书香之中
好吧  得要承认   去那边不仅仅是纯粹的为了考试   也想着体验纸质书的那种触动以及学习的氛围
这种  或许也可以算是对考研生活中被动学习的一种弥补吧
毕竟  得不到的永远在骚动……

结果 很神奇的  这次软考竟然通过了
有点有激动  但更多的只是一种  只要有付出 总归会有收获的人生态度的认可
只是接下来的搬家让我有点淡淡的忧伤
住的远了  自己需要负担的房租还涨幅了
刚好当时奶头也刚好跟我“分道扬镳”  分住在帝都的南北
不过  兴庆的是龙宝过来了  有了大厨  自己的饮食质量总归是有指数级的增长
不过  问题也就来了   要知道吃货总归是抵挡不了美食的诱惑的
三个月增长近15斤就是一个非常明显的佐证

到下半年了  在帝都也参与了一次大学同学的游玩 —— 世界公园一日游
期间不可避免的涉及到了薪资浮动的相关事宜
想想公司从7月提出薪酬变更计划  到现在都还是“静若处子”   一下子感觉自己的工作生涯貌似缺少了点什么动力
不得不承认   运维的工资要比开发的要少  但是自己从不认为自己的能力就要比其他孩子低   只是整个行情是这样  自己也无力吐槽一点……
好吧  准切来说  也正是由于那一次的聚会  心里总感觉有些许躁动
但是  生活又总那么忙碌  基本上找不到任何空闲的时间来充实自己的技术
没办法  只能充分利用公交上的1个小时了

努力说服自己买了个手机 将自己的盛大换成了现在的荣耀
其实  最主要是准备换个双卡的手机  不要让自己接电话的时候  总在背包里面翻半天  而且也充分利用起湖南号的那100条免费短信 

然而 坏事年年有  今年特别多
在龙宝准备回广西的那几天  合租房说要拆隔断  而且还说房子已经被房东没卖出去了
没办法  自己也没有太多的精力去跟他们据理力争   只能默默的接受生活的无奈
更要命的当时  王小兵也回深圳办理离职  也就是说自己得要开始一个人接手两个人的工作了
曾记否 每天晚上拖着疲惫不堪的身躯  穿梭在天通苑周边的各个小区  回家之后看到其他租客都已经退房  只留下垃圾一片
当时真是有一种直接放弃的冲动
干脆直接回深圳办理离职!!!
终归强行制止了自己的冲动 理性的继续穿梭于房子周边  要命的是不知哪个挨千刀的将路由给顺走  搞得连续几天都木有网络~~   只能拿着手机在赶集 58上搜索合租房的信息
现在想想  也挺兴庆 当时公司那边没做监管  还是可以上外网  手机也还有足够的流量来进行搜查  不然当时估计还会是各种凌乱……
在此  还是得要非常感谢圈的收留  让我在最后的几个月里还没沦落到睡马路的境地
同时也感谢梁哥当天直接非常给力的房屋搬迁  
至少  年底的这一两个月还是相当顺利……

之后  在月底又开始筹备自己工作的转型
在拉勾 内推等网络上投递了无数次简历  每天晚上明明已经很晚了  却还在修改简历
只能说否极泰来吧 竟然第一次面试就让我直接拿到offer了
这也算是我一年来工作的认可吧~~
只是之后百度游戏及UC的电话面试 让我对电话面试累觉不爱
其实  也不是自己能力不够  而是电话面试 自己总不能在第一时间明白对方的需求  让自己有些丧失优势
毕竟  运维虽然说很多需要进行尝试与学习的  但说白了 很多时候只要建立起一套自己的理念   其他的应当都不是事

好了  感觉自己洋洋洒洒的做了年度流水账   夜深了  只能休息了 
争取年底前把总结的后半部分给写完……

UC面试

运气比较衰  今天参加UC的电话面试  前面聊的还算OK

虽然说也出现了些差错 但是多多少少不像上次百度游戏的面试一样纯粹出现了鸡同鸭讲的情况

但是  也有一件很忧桑的事情   刚刚跟他讲nginx 准备和他谈及自己站点及部署过程中的一些情况

结果人家直接华丽丽的来了一句  现在站点502!!

 

好吧 当时就震惊了

其实 也没有什么好震惊的  毕竟早上的时候 稍微瞄了一眼 站点是打开有些缓慢

但是至少也没有出现502这样直接打不开的错误……

 

哎  但是又没有办法,虽然知道是已经出现了这个问题 但是今天活本来就比较多

根本就抽不出时间来处理这个  只能想想看晚上有没有时间来处理了

 

只能承认  一旦忙起来 很多事情都忘了

下完班  跟新同事讲解了下平台运行原理及账务处理流程

结果却忘了修复站点的问题……

 

好吧  只能等圈回来  占用他电脑来处理一下站点情况了

 

首先查看一下双机使用情况,结果发现应用程序运行正常

查看了一下主机日志,结果发现他在前一刻还有访问记录
[codesyntax lang=”text”]

148.251.124.173 - - [24/Dec/2014:21:11:30 +0800] "GET /robots.txt HTTP/1.0" 200 654 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)" "-"
148.251.124.173 - - [24/Dec/2014:21:11:46 +0800] "GET /?author=11 HTTP/1.0" 301 0 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)" "-"
111.202.0.63 - - [24/Dec/2014:21:26:42 +0800] "GET / HTTP/1.1" 200 48591 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" "-"

[/codesyntax]
好吧 那主机肯定是没有问题的

那也就是说明今天面试的时候估计蛋疼的是那边刚好访问到备机了

而且 最要命的是当初做双机负载的时候采用的

针对一个ip访问 只能访问其中的一台服务器

哎  运气真心忧桑……

 

好吧  赶紧上备机上查看一下err文件
[codesyntax lang=”text”]

2014/12/25 05:20:11 [error] 26729#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 123.125.71.125, server: favorinfo.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "favorinfo.com", referrer: "http://favorinfo.com/"
2014/12/25 05:20:24 [error] 26729#0: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 111.202.0.63, server: iprayz.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.iprayz.com"
2014/12/25 05:20:24 [error] 26729#0: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 111.202.0.63, server: iprayz.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.iprayz.com"

[/codesyntax]
好吧  问题很明显 CGI接口出现故障 不能讲数据传入进行处理

赶紧用netstat查看了一下9000端口的情况  果不其然  端口还真是没有启动

然后果断查看一下是否是当时转发出问题了

netstat | grep 9000
ps ef | grep php-fpm

好吧 果不其然 真是转接出问题了

解决起来比较容易了 直接启动对应server 就OK了

service php-fpm start

​Over了  站点至此可以正常访问了……

 

常用CI工具汇总

为了实施CI,必须使用工作的支持,以使整个过程的自动化进行,以下把该过程涉及的各种工具汇集一下

必须的工具和功能

源代码控制系统

微软的工具: Microsoft Team Foundation Server (TFS) 或VSS

开源工具:

服务端:

Subversion:http://subversion.apache.org/

AnkhSVN (http://ankhsvn.open.collab.net/)

Visual SVN Server: http://www.visualsvn.com/server/download

客户端:

VisualSVN (www.visualsvn.com/visualsvn/) 和VS集成,需要付费

TortoiseSVN (http://tortoisesvn.tigris. org ) 很流程的Shell工具

现在很流行的分布式代码管理:

GIt,一个很好的中文参考资料: http://wenku.baidu.com/view/78898a1fa76e58fafab00377.html

持续集成服务器

反馈机制

团队成员需要知道构建的状态,如邮件、门户信息、SMS等

构建管理 BUILD MANAGER

NAnt

MSBuild

或sln等各种构建脚本等

单元测试框架UNIT TEST FRAMEWORK

NUnit  MbUnit and  xUnit.net

MSTest

各种的测试框架集成

其他工具

代码分析

构建的过程对于代码规范等各方面进行自动分析也很重要,这样可以持续保持代码的质量

FxCop代码静态分析工具  http://code.msdn.microsoft.com/codeanalysis

StyleCop 代码风格检查工具http://code.msdn.microsoft.com/sourceanalysis

http://stylecop.codeplex.com/

NDepend静态分析 www.ndepend.com 商业/开源

覆盖率工具

NCover:商业软件

PartCover :http://sourceforge.net/projects/partcover/)

VS2010自带的覆盖率测试工具

TeamCity 的代码重复分析工具

http://www.jetbrains.com/teamcity/download/download_thanks.jsp

http://www.harukizaemon.com/simian/

测试工具

工具 目的
NUnit

MSTest

Performing integration tests
Mocking framework Simulating the behavior of some objects while unit testing others

mocking framework that comes with NUnit. Many other good mock

ing frameworks are available, such as Rhino Mocks, Moq, and Typemock Isolator.

White Testing Windows Forms and Silverlight applications
Selenium Testing web applications

seleniumhq.org

FitNesse Performing acceptance testing in a highly sophisticated manner

fitnesse.org/

文档生成

GhostDoc是VS的一个扩展,可以自动编写XML的注释,可一定程度的提高编写效率,安装后根据提示设置,默认在方法上按Shift-Ctrl-D即可以看到自动的注释(http://submain.com/GhostDoc/)

Sandcastle工具:

Sandcastle Help File Builder (SHFB)

www.codeplex.com/Sandcastle

SHFB at http:// shfb.codeplex.com/

安装以上两个,把生成的XML文件和库加入建立工程即可生成文档

安装

WIX开源工具:

http://wixtoolset.org/

http://wix.sourceforge.net/

Visual Stuido的工具:

ClickOnce

Visual Studio Installer

Web Deploy

数据库CI

开源工具 :

http://code.google.com/p/roundhouse/

Visual Studio:

Visual Studio 的Database项目功能很强, 可进行存储过程的单元测试

 

Vi中常用操作

插入类操作:

i:在光标之前添加文本
I:在光标行首添加文本
a:在光标之后添加文本
A:在光标行末添加文本
o:在光标下插入新行
O:在光标上插入新行

 

命令类操作:

:set nu 回车设置行号
:set nonu 回车取消行号
:n 移至文件的第n行
:n1,n2d 删除n1到n2行的内容

 

位置类操作:

ZZ: 退出
h: 左移一个字符
j: 下移一个字符
k: 上移一个字符
l: 右移一个字符
$: 移至行尾
0: 移至行首
Enter:移至下行行尾
H: 移至屏幕上端
M: 移至屏幕中端
L: 移至屏幕下端
G: 移至文件的最后一行
nG:移至文件的第n行:
1G移至文件的第1行,
10G移至文件的第10行

 

编辑类操作:

x: 删除光标所在的一个字符(相当于向后删除)
X: 删除光标前面的一个字符(相当于向前删除)
dd: 删除光标所在的行
dG: 删除光标所在的行到末尾的内容
D: 删除光标所在处到行尾的内容
u:撤销
yy,Y: 复制当前行
nyy,nY:复制包括当前行在内的n行
p: 将已经选择复制或被删除的行放到当前行下(粘贴)
r: 取代光标所在处的字符
R: 从光标所在处开始替换字符,按ESC结束
s: 替换光标所在处字符并进入文本输入方式
S: 替换光标所在全行,按ESC结束
u: 取消上一步操作(取消到上次打开文件的点上,并不是上次保存的点上),ctrl+r取消取消的操作
U: 取消当前行的所有操作
:w 保存
:w new_filename 另存为
:wq 保存退出
:q 不保存退出
:q! 强制不保存退出
:wq!强制保存退出
:x
:x!
/string 搜索字符串
?string 搜索字符串
n 向下搜索(?向上)
N 向上搜索(?向下)
:%s/旧的字符串/新的字符串/g 将旧的内容全部替换为新的内容
:%s/旧的字符串//g 将旧的内容删除
:r 文件名
:!操作系统命令
vi -o file1 file2 同时打开多个文件(水平排列)
vi -O file1 file2 同时打开多个文件(垂直排列)
ctrl+ww 文件之前切换

 

基础级别命令汇总

今天想写个数据同步的cron命令,写完了却脑抽的忘了赋权的chmod命令了

看样子 短路的时候 总归是让人各种忧桑啊……

好吧 上网检索了一下 并将基础的一些命令给偷取过来吧^_^

1、显示日期的指令: date

2、显示日历的指令:cal



3、简单好用的计算器:bc


怎么10/100会变成0呢?这是因为bc预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=number ,那个number就是小数点位数,例如:

4、重要的几个热键[Tab],[ctrl]-c, [ctrl]-d

[Tab]按键—具有『命令补全』不『档案补齐』的功能

[Ctrl]-c按键—让当前的程序『停掉』

[Ctrl]-d按键—通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit

5、man

退出用q,

man -f man

6、数据同步写入磁盘:sync

输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中;所以,这个挃令在系统关机戒重新启劢乀前, 径重要喔!最好多执行几次!

7、惯用的关机指令:shutdown

此外,需要注意的是,时间参数请务必加入指令中,否则shutdown会自动跳到 run-level 1 (就是单人维护的登入情况),这样就伤脑筋了!底下提供几个时间参数的例子吧:

重启,关机: reboot, halt,poweroff

8、切换执行等级: init

Linux共有七种执行等级:

–run level 0 :关机
–run level 3 :纯文本模式
–run level 5 :含有图形接口模式
–run level 6 :重新启动

使用init这个指令来切换各模式:

如果你想要关机的话,除了上述的shutdown -h now以及poweroff之外,你也可以使用如下的指令来关机:

9、改变文件的所属群组:chgrp

10、改变文件拥有者:chown

他还可以顸便直接修改群组的名称

11、改变文件的权限:chmod

权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。

–数字类型改变档案权限:

–符号类型改变档案权限:

12、查看版本信息等

13、变换目录:cd

14、显示当前所在目录:pwd

15、建立新目录:mkdir


不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就回变得乱七八糟的

16、删除『空』的目录:rmdir

17、档案与目录的显示:ls


18、复制档案或目录:cp







19、移除档案或目录:rm



20、移动档案与目录,或更名:mv


21、取得路径的文件名与目录名:basename,dirname


22、由第一行开始显示档案内容:cat


23、从最后一行开始显示:tac(可以看出 tac 是 cat 的倒着写)

24、显示的时候,顺道输出行号:nl



25、一页一页的显示档案内容:more

26、与 more 类似,但是比 more 更好的是,他可以往前翻页:less

27、只看头几行:head

28、只看尾几行:tail

29、以二进制的放置读取档案内容:od


30、修改档案时间或新建档案:touch



31、档案预设权限:umask

32、配置文件档案隐藏属性:chattr



33、显示档案隐藏属性:lsattr

34、观察文件类型:file

35、寻找【执行挡】:which


36、寻找特定档案:whereis

37、寻找特定档案:locate

38、寻找特定档案:find


39、压缩文件和读取压缩文件:gzip,zcat


40、压缩文件和读取压缩文件:bzip2,bzcat


41、压缩文件和读取压缩文件:tar






Vi中输入中文乱码

Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding

它们的意义如下:

encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。
fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。 用英文菜单和提示最好,可以免去下面对菜单和提示信息(B,C部分)的设置如果用英文菜单和提示在安装gvim的时候,将支持本地语言的选项去掉。

解决vim文件乱码,打开文件乱码,菜单,提示信息乱码:

有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding 在linux中修改.vimrc(在win中是_vimrc)

A:设置文件的代码形式: 

set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,chinese,cp936

B:vim的菜单乱码解决: 

同样在 _vimrc文件里以上的中文设置后加上下列命令

source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

C:vim提示信息乱码的解决:

language messages zh_CN.utf-8