某些情况下,你不得不停下当前文件的编辑工作,退出Vim,处理其他的事情,然后重新打开Vim继续刚才的工作。我总是希望Vim打开某个文件的时候,光标停在上次关闭文件时所停留的位置。Vim的默认配置似乎也是这样的,但直到我添加了自己的~/.vimrc和各种插件、模板文件后,Vim的”记忆”似乎被抹去了。每次打开文件,光标总是在文件的第一个字节处闪烁。于是我只能使用’.或者`.使光标移动到最后修改过的地方,但是,你知道的,我的注意力并不是总在刚刚修改过的地方。通常,光标在哪里,我的瞳孔就朝向哪里。
这个问题折磨我好久了,我终于下决心要整治一下。我先把那些插件给禁掉,又把map的很多键也禁了,最后把自定义的.vimrc也清空了,但问题依旧……这让我很是无奈。
Google了半天,据说viminfo保存了文件的一些状态信息,包括光标信息。:h viminfo,得知’0保存了Vim上次退出时光标的位置信息。但’0还不是我想要的,因为它保存的是一个”全局”的位置信息。比如,我先打开foo.c,光标移动到非开头处,退出,再打开bar.c,移动到非开头处,退出,再打开foo.c,按下’0,Vim自动打开bar.c并跳到退出时的位置。
开场白
Vim是一个十分强大的文本编辑器,被誉为”编辑器之神”,熟练地使用Vim会使你处理文本、编辑代码的效率提升n个数量级!如果你现在还在使用gedit甚至是”记事本”的话,我奉劝你赶快把它扔到垃圾桶,马上开始你的Vim之旅。这里列出一些我经常使用的基本的Vim命令和技巧,Vim的使用是一个长期的学习、实践、再学习、再实践的过程。Here we go.
安装Vim/Gvim
如果你现在没使用过Vim/Gvim,你首先需要安装它们,当前的版本为7.2。Debian/Ubuntu下面,sudo apt-get install vim-gnome即可。其他系统也有相应的包管理程序来直接安装。对于Windows,你需要到Vim的官方网站来下载安装。安装时记得选中”设置Vim环境变量”的选项,这样你就可以直接在cmd下使用vim了。
在正式开始之前,最好在终端(cmd)里运行vimtutor,一步步按照提示操作,以对vim的操作有一个初步的了解。
快速的移动
别在总在插入模式里呆着
除了敲代码,不要总在插入模式里呆着,因为这样的Vim就和诸如gedit等普通的编辑器就没什么区别了。这就是为什么一些新手总是在插入模式的原因了,”好用”或者说”友好”。但是,Vim真正的威力却在于其命令模式,你将会发现,随着你对Vim的了解和熟练,你用插入模式的时间会越来越少。
| 键 | 描述 |
|---|---|
| Tab | 自动补全文件名或者目录名,按下两次会列出多个选项 |
| Ctrl + w | 删除左侧的一个单词 |
| Ctrl + u | 向左删除字符至行首 |
| Ctrl + k | 同上一个命令,但向右删除 |
| Ctrl + y | 在光标处粘贴Ctrl + w等所删除的字符序列 |
| Ctrl + t | 交换光标前的两个字符 |
| Alt + t | 交换光标前的两个单词 |
| Ctrl + -或者 Ctrl + xu | 取消上次编辑动作 |
| Ctrl + p | 同方向键Up,显示上一个命令 |
| Ctrl + n | 同方向键Down,显示下一条命令 |
| Ctrl + b | 同方向键Left |
| Ctrl + f | 同方向键Right |
| Ctrl + l(L) | 清屏 |
| Alt + b | 光标左移一个word(连续非空字符串) |
| Alt + f | 光标右移一个word |
| Ctrl + c | 终止当前命令 |
| Ctrl + z | 将当前命令移至后台执行,fg可招回 |
| Ctrl + d | 终止当前会话 |
| !! | 重复上一个命令 |
| Ctrl + r | 搜索命令history |
| ^foo^bar | 替换上一个命令中的foo为bar并执行 |
| cd – | 返回上一个目录,alias — -=’cd -’后,-即可 |
为了使Tab补全时忽略字母的大小写,你需要在.bashrc中加入bind ‘set completion-ignore-case on’
本文通过一个文件拷贝程序的三个不同实现,来说明标准库fread/fwrite、系统调用read/write在缓冲机制上的不同。系统调用没有缓冲(这里不考虑内核缓冲),拿write来说,它的原型int write(int fd, char *buf, size)。write将buf处的size个字节立即写入文件描述符fd指名的文件,而不经过任何缓冲。而C标准库中的f系列函数(fwrite/fread/fgetc/fputc)在FILE结构中内部维护了一个缓冲区(大小是多少?),通常情况下只有当这个缓冲区被写满时才会调用write将其真正地写入文件,fflush(FILE* stream)会强制将缓冲区内容写出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | int main (int argc, char **argv) { int c; //~ fgetc()返回int FILE* fdin = fopen("51.tar.gz", "r"); FILE* fdout = fopen("51.tar.gz.bak", "w"); if (!fdout || !fdin) { fprintf(stderr, "open failure\n"); exit(1); } while ((c = fgetc(fdin)) != EOF) { fputc(c, fdout); } fclose(fdout); fclose(fdin); return 0; } |
| 命令 | 描述 |
|---|---|
| backtrace(或bt) | 查看各级函数调用及参数 |
| finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
| frame(或f) 帧编号 | 选择栈帧 |
| info(或i) locals | 查看当前栈帧局部变量的值 |
| list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
| list 行号 | 列出从第几行开始的10行源代码 |
| list 函数名 | 列出某个函数的源代码 |
| next(或n) | 执行下一行语句 |
| print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
| quit(或q) | 退出gdb调试环境 |
| set var | 修改变量的值 |
| start | 开始执行程序,停在main函数第一行语句前面等待命令 |
| step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |
| break(或b) 行号 | 在某一行设置断点 |
一个演示脚本
下面的这个脚本修改自《A Practical Guide to Linux Command, Editions, and Shell Programming》。不提供参数时,它将标准输入输出到标准输出;提供一个文件名参数时,将该文件输出到标准输出;提供两个文件名参数时,它将提一个文件复制到第二个文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #! /bin/sh case $# in 0) exec 3<&0 4>&1 ;; 1) exec 3<$1 4<&1 ;; 2) exec 3<$1 4>$2 ;; *) echo "Usage: `basename $0` [source [dest]]" exit 1 ;; esac cat <&3 >&4 exec 3<&- 4>&- exit 0 |
好久没写C++没用STL了,今天在STLChina泡了一下午。完整的代码只写了这么一个,贴上来吧。
写了两个类,Max_Heap和Min_Heap,以他们特例化priority_queue,可以方便地实现最大、最小堆。写完了忽然又觉得这俩类似乎是多此一举了,完全可以用greater
最后还写了测试用例:找出n个数中最大的k个。
1 2 3 4 5 6 7 8 9 10 11 | /*
template < class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
explicit priority_queue ( const Compare& x = Compare(),
const Container& y = Container() );
template <class InputIterator>
priority_queue ( InputIterator first, InputIterator last,
const Compare& x = Compare(),
const Container& y = Container() );
*/ |
Youtube走了,走吧,我用的不多。
Blogger走了,走吧,我才刚开始用。
Sites走了,走吧,我有自己的site。
Facebook走了,走吧,我讨厌SNS。
Twitter走了,走吧,我只是看客,忠实点罢了。
Groups走了,走吧,我偶尔才去TL。
Picasa走了,走吧,又不是非用不可。
G.cn走了,走吧,我用.com。
GReader也走了,走吧,我疯了。
低调;
我还是得低调,低调地做一个屁民,什么游行我都不参与。
我还要感谢国家,是它给了我低调的自由,沉默的权利。
I’m feeling fucky.
对,我就是疯了。
我家住在一个工厂的职工家属大院里,小时候一大帮年纪差不多大的孩子经常在一起玩。在我们这些人里面,有一个孩子比我们大好几岁,长得又高又壮,我们都得喊他老大,有什么好东西都得先孝敬他,有什么好事情都得先感谢他。他看谁不顺眼就经常骂几句踹两脚,因为我们打不过他,谁也不敢吭声,甚至还得在一旁叫好。不过老大也并不一直是这样,有时心情好了还是挺和善的。虽然也经常有人心里犯嘀咕,觉得这个老大不怎么样,但是据说是他保卫了我们的正常生活,而且据说以前的老大特别凶狠霸道,还有外面的更狠的老大们总来找麻烦,是我们现在这个老大把他们全都赶跑了,我们才有今天来之不易的幸福生活,想到这些,我们就觉得我们为他做些事,偶尔被他欺负一下,这些也都是理所当然的了。
要说作为一个普通孩子的我看法,我是支持古哥的,我支持他是因为这么长时间以来终于出现了一个敢向老大挑战的人,无论他是阴谋家还是慈善家,我们总需要这样的变化,游戏才能玩得下去。不然的话,我们只能在老大的看管下日复一日地无知和愚昧下去。有人说,因为我们还很无知,所以不能什么都让我们知道,不然会出乱子,但我觉得恰恰是不让我们知道,才导致我们无知。所以我不接受这个倒果为因的解释,我不想在一段时间以后,外面的孩子看我们的眼光,就像我们现在看东北角那个邻居院子里的孩子们一样。