第四章:可视模式

##遇见可视模式 什么是可视模式,那是一种可以让你任意选择文本的模式。最其他编辑器中,我们可能很习惯地用鼠标选择一段文本,复制,粘贴。但是在vim中,你会看到选择文本,可以玩出很多花样。 怎么进入可是模式?我们可以在普通模式使用v进入,然后用h j k l来移动。然后可以用c来删除选择的文字并进入编辑模式,或者可以y来复制这一段文字,或者只是d来删除。 除了普通的v,还有其他的可视快捷键,分别如下: 命令 效果 v 字符选择模式 V 整行选择模式 <C-v> 列选择模式 gv 重选上次选过的字符 我们可以在这几种模式之间切换,只要在选择模式下直接按那种模式的快捷键就可以了。而且我们可以用o来切换光标的位置。 现在我们可以来实践一下,相关命令如下 :::java vbb o e ##可以的话请使用操作符 可视模式对于点操作有短板,这个短板可以使用操作符来解决。例子如下: 假设我们需要把标签里面的小写转为大写 :::java <a href="#">one</a> <a href="#">two</a> <a href="#">three</a> 我们可以使用vit来选择one这样的被标签包围的字符。详细可以使用:h it来看到其详细的介绍。 接着,我们可以使用U来把选中的小写变大写,就像下面的操作那样 :::java vit U j. j. 看到了吗,在大三行的three,执行.只是把三个字符变成了大写。 使用普通模式操作符 看来可视模式解决不了问题,这个时候我们可以使用普通模式的操作符来解决这个问题。 在普通模式,使用gU来把小写变成大写,结合it,就可以改变标签包围着的字符的大小了。 :::java gUit j. j. ##用列模式来格式化表格 ...

April 11, 2013

第三章:vim-编辑模式

##编辑模式下的快速改正 当我们使用vim编写文章的时候难免会打错字,除了按下退格键,在编辑模式下,我们可以使用其他方式来快速改正错误。 盲打的意A思并不仅仅是不看键盘打字,而是用感觉去打字(你觉得我走火入魔了么-_-!)。当盲打的时候,手指的感觉会比眼接收信息的速度快。我们不希望这时候节奏被打断,但是错误是在所难免的,如何快速改正错误变得非常重要。 在vim里面,可能你知道,在编辑模式下,除了使用退格键删除正在编辑的字符,还可以退回到普通模式,改正错误,再回到编辑模式。但这两种方法都感觉不太快速,因为退格键离键盘有点远,而后一种模式感觉更慢了,但是不用怕,vim为我们提供一些在编辑模式下使用的快捷键。 按键 效果 <C-h> 删除一个字符(退格键) <C-w> 删除一个英文单词 <C-u> 删除直到行的开始 你可能会问,为什么是\<C-h\>,而不是其他快捷键。我觉得是因为在vim中我们使用hjkl来移动,而h是向左移动,用\<C-h\>作为快捷键是非常直观的。 这些快捷键不仅可以在vim中使用,在bash中同样有效。 ##返回普通模式 我们在普通模式的时间可能会多于在编辑模式的时间(编写文章的时候除外),如何快速在这两种模式之间切换变得很重要,我们除了使用Esc来退回到普通模式,vim还为我们提供了快捷键。 按键 效果 <Esc> 转到普通模式 <C-[> 转到普通模式 <C-o> 转到临时普通模式 我们看到有一种新的模式是临时普通模式,这是什么?在这种模式下我们可以使用单一的普通模式下的命令然后立即返回到编辑模式。这个功能有什么实际用处吗?举一个例子,在普通模式下,我们可以使用zz来使光标所在的行移动到屏幕的中间。当我们写文章的时候,我们想把正在编辑的底部的文章上移到屏幕中间,我们不需要打一大串\<CR\>,我们只需要输入\<C-o\>zz,不需要回到普通模式,不需要狂按Enter,我们的文章已经从底部移动到屏幕中央。 ##不退出编辑模式粘贴暂存区内容 现在有以下文本,我们想把第一行的Learning Vim,复制到第二行的尾部。 :::java Learning Vim,by Gavin Lin Read Gavin Lin's 我们可以这样做: :::java yt, jA<space> <C-r>0 .<Esc> 我们来看一下这些命令都干了些什么,首先yt,是复制当前光标直到遇到,,jA<space>是移动到下一行,编辑行尾,然后输入空格。\<C-r\>0是在编辑模式下粘贴暂存区0的内容。再输入句号退出。 ##编辑的时候计算 当我们编j辑的时候需要做些简单的运算,不需要切换到计算机,vim就可以帮助你。 只要在编辑模式输入<C-r>=,就可以使用vim的计算器并返回计算结果。 ...

April 5, 2013

第二章:vim安装与普通模式

##vim的安装 强烈推荐使用gvim而不是使用vim,因为gvim提供了比vim更丰富的功能,例如颜色和光标的表现。 ###安装依赖库 :::java sudo apt-get build-dep vim sudo apt-get install mercurial ###下载vim 源程序 :::java hg clone https://vim.googlecode.com/hg gvim cd gvim hg tags hg update [tags] ###配置与安装vim :::java ./configure \ --enable-multibyte \ --enable-perlinterp=yes \ --enable-pythoninterp=yes \ --enable-tclinterp \ --enable-rubyinterp \ --enable-cscope \ --enable-sniff \ --with-features=huge \ --enable-gui=gnome2 \ --with-compiledby=gavin make && sudo make install ###vim 插件和配置 ...

April 4, 2013

第一章:vim思维

身边使用vim作为编辑器的同学比较少,非常可惜他们没用上这神器,现在我几乎所有的文本编辑都使用vim来完成了。 vim的魅力在于快捷键,插件只是锦上添花,要知道vim如何神奇,还需要从具体示例入手。 ##遇见点命令 .在vim命令模式是重复上一个动作的意思(看帮助:h .),实际中我们可以这样用。 我们想把这个 :::java Line one Line two Line three Line four 变成这样 :::java Line one Line two Line three Line four 使用的命令是 :::java >G j. j. . >G就是从光标到最后都增加一个tab,j是向下移动一格,.就是重复>G了。 ##拒绝重复 看到如下代码,如果要在最后加上;,你会怎样做? :::c int foo = 1; char * string = "hello" char bar = 'a' 或许你会$ a j ESC然后j $ .,直到所有修改完毕,但是有个更好的方法 :::java A; j. j. ...

April 2, 2013

一些有趣的c题目

最近几天都发现了一些c语言的有趣的c题目,有些还蛮实用的。 ##题目1 请问下面的程序打印的是什么? :::c #include <stdlib.h> #include <stdio.h> int main(int argc, const char *argv[]) { unsigned int a =6; int b = -20; (a+b > 6) ? printf("bigger than 6 \n") : printf("not bigger than 6 \n"); printf("a+b is %u\n",a+b); return 0; } 答案是bigger than 6,然后a+b是4294967295 这个问题涉及到c语言算术运算的隐式转换,对于本例子,a+b的结果被转换为了无符号数再和6做比较,结果可想而知,关于隐式转换,这里有一篇不错的文章:http://www.hookcn.org/2011/01/implicit-conversions-of-usual.html ##题目2 有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值。 答案: :::c int searchRepeatNumber(const int * a,int length){ int noRepeatNumber; int totalNumber = 0; int loopnumber; if(length <= 0 || a == NULL){ return -1; } noRepeatNumber = (length*(length - 1)) >> 1; for(loopnumber = 0; loopnumber < length; loopnumber++){ totalNumber += a[loopnumber]; } return totalNumber - noRepeatNumber; } 我这个解答的时间复杂度是O(n),因为有一个循环。思路很简单,计算数组里面的数的总和,减去没有重复数的总和,得到的就是那个重复数了。 ...

March 28, 2013