evol128[Blog]

I am the bone of my code

Vim 攻略<5> Registers

一天两更,我还真是勤快~

 

在vim中,我们每次执行复制,剪切,删除,粘贴操作,其结果都是和寄存器息息相关的,所以,为了更好地使用这些操作,我们有必要了解一下vim的各个寄存器

在之前的文章中我讲过了,寄存器是以"开头,后面跟寄存器的名字,vim中一共有如下几种寄存器:
1. 默认寄存器 ""
2. 10个数字寄存器 "0 到 "9
3. The small delete register(不会翻) "-
4. 26个命名寄存器 "a 到 "z 或者 "A 到 "Z, 不区分大小写
5. 四个只读寄存器 ":, "., "% 和 "#
6. 表达式寄存器 "=
7. 选择和拖拽寄存器 "*, "+ and "~
8. 黑洞寄存器(直译的。。。black hole= =) "_
9. 搜索表达式寄存器 "/
要查看每个寄存器中都存了些什么,只要输入:reg就好了

下面我们来一一介绍下这些寄存器的作用:
1. 默认寄存器 ""
当进行任何删除操作(d,c,s,x),或者复制操作(y)的时候,不管有没有指定寄存器,结果都会被存储在默认寄存器中。任何没有指定寄存器的粘贴(p)操作,会复制默认寄存器中的值

2. 10个数字寄存器 "0 到 "9
这10个寄存器中的值也是自动存储的。
寄存器"0存最近一次复制操作的值,除非那次复制指定了寄存器。
寄存器"1存储了最近一次删除操作的结果,除非那次删除指定了寄存器,或者删除内容少于一行。
寄存器"2存储了倒数第二次删除操作的结果,除非那次删除指定了寄存器,或者删除内容少于一行。
寄存器"3到"9,同理,倒数第三次到第九次删除操作的结果,除非那次删除指定了寄存器,或者删除内容少于一行。

3. small delete register "-
如果某次删除操作删掉了少于一行结果,那那次删除结果会被存在"-中,除非特别指定了寄存器。

4. 命名寄存器"a到"z
不会自动填充,全部交给用户使用。注意:用小写字母表示替换寄存器中的内容,而大写字母表示append!!!

5. 只读寄存器 ":, "., "% 和 "#
这四个寄存器是只读的,用户不可以手动往里面写数据。
".    最近一次插入的文字
"%    当前文件名
"#    其他打开的文件名
":    最近一次执行的指令名

6. 表达式寄存器 "=
用来存表达式的,在表达式那一章我会再提(如果有那一章的话)

7. 选择和拖拽寄存器 "*, "+ and "~
"*, "+  这俩寄存器就是传说中的剪贴板。其实它们是有略微区别的,不过介于我这篇教程是面向初学者的,我果断决定无视= =
"~      拖到vim里面的东西,会存在这个寄存器里

8. 黑洞寄存器 "_
顾名思义,往里面填数据的时候,什么都不会发生,从里面读数据的时候,什么都没有......
这个蛋疼东西的作用呢,有些时候,我们删除某样东西的同时却不希望它的值被自动写到寄存器里,这时候就把它往黑洞里扔吧。。。

9. 搜索表达式寄存器 "/
最后一次使用的搜索表达式,在pattern一章我会细说(如果有的话。。。)

最后给大家一个小tip,如果在command mode下想要使用register,只要输入ctrl-r再跟上寄存器名就好啦

Vim 攻略<4> Windows

通过windows,我们可以在同一个vim中打开多个文件。

有人可能会问,为什么不打开几个vim呢?其实,在同一个vim中编辑多个文件有很多好处:
手指不用离开键盘
可以使用通用寄存器(如果跨进程的话就只能用clipboard了)
有command历史记录
可以共用macro

打开文件:
:edit foo.txt

上下切分窗口
:split


关闭当前窗口
:close

关闭除当前窗口外所有窗口
:only

切分窗口并打开另一个文件:
:split two.c

用空白文件切分窗口:
:new

切成n份:
:nsplit text.c

增加当前窗口的大小:
Ctrl-W +

减少当前窗口的大小:
Ctrl-W -

将窗口大小设为一个特定值:
{height}Ctrl-W _

水平划分:
上面所有的split,用vsplit替换就可以了;new用vertical new替换,窗口大小的命令格式完全一样,只是高度变成了宽度

在窗口间移动:
CTRL-W h    移到左边的窗口
CTRL-W j    移到下面的窗口
CTRL-W k    移到上面的窗口
CTRL-W l    移到右边的窗口

CTRL-W t    移到最上面的窗口
CTRL-W b    移到最下面的窗口

这些移动按键和normal mode下的光标移动时一样的,很好记

移动窗口位置:
和上面一样的,只是把小写字母换成了大写
 

既然gcc是用c语言写的,那么我们是怎么编译gcc的?

 

今天看到一则新闻,gcc新版本引入c++实现的patch

忽然想起来,既然gcc是用c语言写的,那么人们是如何编译gcc的?

其实,大学里宋健健老师的教导我还依稀记得啦= =  为了确保准确性,我特地去翻了一下wikipedia,编译用X语言写的X编译器有以下几种方法:

1.最简单的方法,已经有别人用Y语言写了X的编译器,那你用它编译一下就好了

2.如果没有上面那种好事,那就只好自己用Y写一个了,譬如说,pascal最早的编译器是用fortran写的

3.上面方法的优化版本,用Y写的时候,你不用实现全部功能,只需要一个能够编译X编译器源代码的最低程度的子集就好了,然后用这个子集去编译X的编译器,Java和Haskell就是这样弄的

4.可以使用cross-compiler技术将别的平台上的X编译器迁移过来,C语言一般都是这样玩的

5.最牛逼的方法,先用X语言写一个X编译器,然后手动编译这个编译器(说白了就是直接写汇编,不过不需要完全优化),然后,用得到的结果去编译X编译器的源代码。

那么,gcc到底是如何编译的呢?

3个步骤:

1.在线编译第一个原始版本的编译器,这个编译器不管是效率也好功能也好都不完善

2. 用这个原始版本的编译器去编译gcc,这样我们得到了一个功能完善但是效率不怎么好的第二个编译器

3.用第二个编译器再次编译gcc,最终我们得到了完美优化过的第三个版本

感觉碉堡了吧,最后,列一下有自编译编译器的语言吧:

 

reference:http://en.wikipedia.org/wiki/Bootstrapping_(compilers)

 

Vim攻略 Catalog

<1> Overview

<2> Basic Operations

<3> Configuration

<4> Windows

<5> Registers

<6> mapping

<7> Pattern

<8> Macro

<9> Scripting

 

我呢,其实一点都不擅长写教程啦,这个系列算是欠某人的吧。现在,一切都over了,我也得向前move on了。

farewell

 

Update:

09/05/2012: 和预想的一样,我懒了= =好歹更新完了,虽然后面都是贴manual....

08/28/2012: Finish(误) <6><7>   OK, I'm a very very lazy guy...

08/23/2012: Finish <4> <5>

08/07/2012 : Finish <1>, update <2> and <3>

08/06/2012 : Finish <3>

08/05/2012 : Finish <2>

Vim攻略 <3> Configuration

<1>仍然没有写完,上班太累了。。。

使用方法: 在command模式下输入命令

 

 

" 界面优化

set ruler               " 在屏幕下方显示

set showcmd             " 显示你正在敲的command

set incsearch           " 搜索每敲一个字符,都会跳至匹配  (这项不要开,跳来跳去太人了)

set showmatch           " 输入 } ) ], 高亮对应的左括号

set number              "显示行号

 

" 自定义样式

set term=xterm-color " 设置终端颜色

syntax on               " 高亮

color derek             " 设置颜色题,用户定制主题放在~/.vim/colors/下

set guifont=inconsolata\ 12  "字体\字号,用字体放在~/.fonts/下

 

" 缩进

set expandtab         " 用空格代替tab

set shiftwidth=4        " <<>> command缩进距离

set softtabstop=4       " 输入tab后的缩进距离

set tabstop=8           " \t字符所占的字符数(不要和上面弄混了)

set smarttab            " 当开启这项功能后,在一行开始入tab,会根据shiftwidth来决定缩进距离,无softtabstop或者tabstop

set columns=88 终端宽

set lines=49 " 终端高度

set autoindent " 自动缩进

set cindent          " 根据C语法缩进

 

" 代折叠

setlocal foldmethod=indent "折叠方式(根据缩进来折叠

autocmd FileType c setlocal foldmethod=syntax "于C source file,根据法来折叠

autocmd FileType cpp setlocal foldmethod=syntax "对于cpp source file,根据语法来折叠

set foldnestmax=10      " 最多折叠10

set foldenable        " 折叠

 

如果设置了某个功能,想要取消怎么办? 只要输入set no[config]就可以了,e.g. set noincsearch 关闭渐进搜索

不过呢,上面这些设置,只针对某个特定的vim实例,关掉vim以后就会消失的。如果想要永久设置该怎么办?很简单,把对应的command写到~/.vimrc文件里就可以了

最后,推建一个好用的主题: wombat  好用的字体: inconsolata 

最后效果大概是这样子的:

 

Vim攻略 <2> Basic Operations

好吧,其实<1>差不多写完了,只是我对自个儿的文笔非常不满意,所以等润色下再发

下面这张列表,是笔者使用vim editor时经常用回到的一些按键,可以说,这些已经涵盖了90%的日常使用

虽然是用英文写的,不过原作者一定肯定坚决是我~ 吐槽我的英语:evol128@gmail.com

 

[n]<key>   means that this command takes an numeric argument, which repeats the function of the command by n times. n can be omitted. e.g. 3w means move cursor to the beginning of 3rd next words.

<key>· means this key should be followed by another key

# means a line number

All commands except Ctrl commands are case sensitive.

 

mode selection

esc normal mode

v viusal mode

i insert mode

: command mode

 

movement

h move 1 char left

l move 1 char right

j move 1 char down

k move 1 char up

当然,十字键也是同样的效果,那为什么我们需要这四个按键呢?我的理解,用这四个键可以省去把手从字母区移开的时间,将工作效率提升至极限

0 begin of line

$ end of line

同样,和home/end是重复的

[n]w move cursor to the begin of next word

[n]e move cursor to the end of current word

G go to last line

#G go to # line

gg go to first line

Ctrl+d scroll half window down

Ctrl+u scroll half window up

Ctrl+f scroll full window down

Ctrl+b scroll full window up

%  if coursor on (,),[,] or{,}, go to corresponding braket. else search backwards for the first (, [, or {

简单来讲就是找括号。。。

 

edit

x delete a char at cursor

used with movement operation, delete from cursor to the movement char. e.g. d$ delete from cursor to end of line 

s change a char at cursor

used with movement operation, delete from cursor position to the movement char,then get into insert mode. e.g. c3w changes from cursor position to next 3 words

i  enter insert mode, then you can insert chars into file

 

undo/redo

u undo

ctrl+r redo

 

copy/paste

y yank(copy)

p paste

*y/*p yank/paste from clipboard

 

search/replace

/<pattern> search for pattern

?<pattern> search for pattern backwards

n goto next occurrence of search pattern

N goto previous occurrence of search pattern

%s/<old>/<new>/g replace old pattern with new pattern

 

file operation

:q  quit

:q! quit without save

:w [filename]  save file

 

最后送大家一张图吧  基本上上面这些都标出来了

Vim攻略 <1>Overview

先给大家道个歉,过去一年,一直在忙于私事,所以都没有时间来打理博客。现在,一切都结束了,我也终于有时间来写点东西了

 

为什么我们需要文本编辑器?

简而言之,fast,strong & convenient

和诸如visual studio, eclipse之类重量级的ide比起来,text editor更加专注在文本编辑这单一的功能上,操作简便(不是简单= =),功能强大,速度飞快。可以说,当你习惯于使用vim或者emacs之后,你的编码效率会有大幅提高

为什么是vim?

其实世上好用的text editor还是挺多的,不过大部分都ask for money,免费的无非就只有vim和emacs而已。这两种编辑器各有优劣吧,vim的单键多模式 vs emacs的单模式组合键(真心不想扯太多,不然要战起来的)。根据o‘reilly的数据,vim教材的销量大概是emacs的2倍多,再加上一点点私人原因(好吧,我承认私人原因是主要原因= =),所以,我就选用vim啦

为什么你要写这篇文章?

首先我想说,vim自带的帮助文件,内容非常详尽,如果有时间的话,请务必去看一下呢。使用方法很简单,在vim中输入:help就好了。只是,这个doc实在是很长很长,而其中的大部分功能,对我们这样的初学者来说,是难得用到一次的。所以,我打算在工作之余,抽出点spare time帮大家把vim中的重要功能都一一整理出来。我的计划是花6-7篇文章的篇幅,由浅入深带着大家在浏览一遍vim的各种feature,之后么,就靠大家自个努力了。

Main Feature: Modes

在vim中,根据所处的mode不同,每个按键的作用也不同,所以,学习vim,第一步是弄清楚vim到底有哪些常用的mode

normal mode (进入方法: esc)

normal mode是vim中最常用的一个mode,文件操作,光标移动,以及大部分的文件编辑都需要在normal mode中进行。

insert mode (进入方法: i或者其他插入操作)

顾名思义,在insert mode中,用户可以向文本光标处输入字符。

visual mode (进入方法: v)

在visual mode中,可以通过移动光标来选择文本

 

command mode (进入方法: 冒号)

所有命令,都得在command模式中输入。另外,在command mode中还可以通过!来调用外部程序

此外,还有一些其他的mode,因为不是很经常用,就不在这儿介绍了

Some interesting C problems 2nd edition

总之就是很多很多关于C语言的问题啦。

本文稍稍有点长,点这里慢慢看吧