第二章: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 插件和配置 可以查看我的配置,地址是:https://github.com/gavinlin/vim-conf ##普通模式 当我们使用命令gvim [file],来打开文件时,gvim是处于普通模式的。gvim基本上有三种常用的模式,普通模式,编辑模式和命令模式。 其他很多编辑器默认只有一种模式,就是编辑模式,可能很多人会奇怪,为什么vim要分这么多种模式,而且默认是普通模式,而不是常识中的编辑模式。其实因为普通模式实在太重要了,很多操作都可以在普通模式中完成,这也是vim不同于其他编辑器的魅力所在,越深入学习,我就越认同了这点。 ###undos vim里面的undo,也就是撤销操作,可以通过在普通模式键入u来执行。如何从其他模式进入普通模式,我们只要按下Esc就可以了,通常是你键盘的左上角。u的强大之处在于,你对文本做的所有修改,都可以通过这个命令来撤销。这是我们经常会用到的命令。虽然人生不可以重来,但代码可以。 ###组成可重复的变化 有一段英文文本,我们想删除最后一个词,光标停留在最后一个词的最后位置,如何做才能做到高效率的删除单词动作? :::java 例如我们要删除以下句子的最后一个单词。 The end is nigh 有三种方法,分别是...

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. A的意思是移动到行尾然后编辑,代替了$+a,这样,只要我们移动下一行然后按下.,vim就会自动为我们在行的最后增加分号了。 这里列出一些二合一的命令,这些都是需要熟记和灵活运用的。 命令 相当于 C c$ s cl S ^C I ^i A $a o A<CR> O ko ##退一步海阔天空...

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

ubuntu发现不了android设备的高级解决办法

首先如果你按照官方的做法,发现不了android设备的话,这个方法可能可以帮助你,官方的方法可以看这个网址http://source.android.com/source/initializing.html的Configuring USB Access 或许有些朋友会觉得这个方法not work,就像我这样,adb device死活检测不到设备,我也百思不得其解,我开始怪这个设备不好,因为其他的设备都能检测出。 但是有点不心死,去google找找是不是别人你同样遭遇,结果,在stackoverflow找到相同遭遇的人,并有热心大牛给出了方法,网址可见这里:http://stackoverflow.com/questions/6484279/detecting-device-for-debugging-adb-does-not-work 我把方法搬运到这个blog里吧 首先是查看你的设备的vendorid,相信经过以前的折腾,你会记得lsusb这个命令 :::sh Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 007: ID 2207:0006 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 看到我的设备usb的vendorid是2207,然后打开~/.android/adb_usb.ini这个文件,没有就创建一个吧。添加下面的内容 :::sh 0x2207 没错就是填入vendorid。这样后adb kill-server然后再adb devices,应该就可以看到设备了。 然后大牛还有个友情提醒,更新sdk,这个文件可能会被覆盖,请重新上述步骤。

March 26, 2013

android:NDK调用系统接口的版本兼容问题

私有开源项目gplayer是一个android多功能播放器,其中画面显示调用本地接口surface和skia,音频播放调用了audiotrack。最大的问题是android每个版本的库和头文件都会不一样,不能做到编译一次,运行所有版本的目的。现在参考了另一个开源项目andless的做法,为调用android的本地库做一些兼容工作。 基本思想 开始时是直接调用surface和audiotrack的api,现在要把调用audiotrack和surface的api写在另外一个cpp文件中,就像给这些api包装了一下,然后单独给这个cpp编译成so,这个so是和系统库相关的,例如支持android2.3.3的so叫做audiotrack10.so和surface10.so。接着,我们的播放器根据系统的版本调用相应的so来完成功能。 具体实现 现在以audiotrack为例子说明一下。这里只截取了部分代码,用来说明问题,有兴趣可到我的github页面下载整个工程。 #define FROM_ATRACK_CODE 1 #include "audiotrack.h" #define TAG "AudioTrackWrapper" namespace android { extern "C" { static AudioTrack* track; int AndroidAudioTrack_register() { __android_log_print(ANDROID_LOG_INFO, TAG, "registering audio track"); track = new AudioTrack(); if(track == NULL) { return ANDROID_AUDIOTRACK_RESULT_JNI_EXCEPTION; } __android_log_print(ANDROID_LOG_INFO, TAG, "registered"); return ANDROID_AUDIOTRACK_RESULT_SUCCESS; } }// extern "C" }; //namespace android 可以看到只要我们调用了AndroidAudioTrack_regisger就可以获得一个audiorack对象。注意到在#include "audiotrack.h"前面出现的宏定义了吗?这是一个重点内容,我们看看audiotrack.h里面是什么东东。 #ifdef __cplusplus extern "C" { #endif #ifdef FROM_ATRACK_CODE int AndroidAudioTrack_register(); #else int (*AndroidAudioTrack_register)() __attribute__((weak)); #endif #ifdef __cplusplus } #endif Info 对于__attribute__不熟悉的话可以google一下,这里是声明了弱符号...

March 20, 2013

ubuntu12.04不能连接cmcc等热点的解决办法

出现的现象是可以连接ChinaNet,但是连接不上cmcc,公司的路由也连接不上,上网搜索,说是ubuntu12.04的网卡驱动没有支持11n,具体没有深究,这里给出了解决方法。 解决方发其实就是禁用无线的11n,首先是打开文件/etc/modprobe.d/iwlwifi-disable11n.conf,没有的话就建立一个把。填入以下内容。 :::java options iwlwifi 11n_disable=1 接着重启计算机,连上应该就可以了,亲测可行。

March 16, 2013

just for today

Just for today I will try to live through this day only and not tackle my whole life problem at once. I can do something for twelve hours that would appall me if I had keep it up for a lifetime. Just for today I will be happy, This assumes to be true what Abraham Lincoln said, that “Most folks are as happy as they make up their minds to be....

March 14, 2013

为android编译ffmpeg

之前的教程是在桌面系统上实现的,由于系统已经为我们提供好了相关的库,所以我们之需要调用库的接口就可以使用ffmpeg为我们提供的功能了。但是我们现在需要在android系统上面调用这些函数,ffmpeg没有为我们提供可在android上运行的动态链接库。这时候我们需要。 此次移植的是ffmpeg0.11.2,使用的编译工具是android提供的android-r8d,编译脚本与Android.mk参考了abitno。 First of the first,我们需要在ffmpeg主页下载源代码。到目前为止,ffmpeg的版本已经发展到了1.1.3,可我们的目标却是0.11.2,真是个固步自封的熊孩子。说话回来,我们不是在追求最新,只是追求可用。 ffmpeg的链接: http://www.ffmpeg.org/download.html,其实ffmpeg已经把代码托管到github,把github的版本库拉回来,想用哪个版本就切换到那个版本会更方便点。 ##config.h config.h是一个很重要的配置文件,但是这个文件不是手工编写或者默认提供,而是需要通过configure得到。configure又是如何使用的?ffmpeg源代码目录敲入命令./configure --help,可以列出configure的相关选项。下面我提供了一个脚本,里面记录了configure的选项,只要我们运行脚本,就会配置ffmpeg了。 :::sh #!/bin/sh ANDROID_NDK=/home/gavin/android-ndk-r8d SYSROOT=$ANDROID_NDK/platforms/android-14/arch-arm TOOLCHAIN=`echo $ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86` export PATH=$TOOLCHAIN/bin:$PATH FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a " FLAGS="$FLAGS --sysroot=$SYSROOT" FLAGS="$FLAGS --disable-avdevice --disable-static --enable-shared --disable-ffplay --disable-doc --disable-ffmpeg --disable-ffprobe --disable-ffserver --disable-avfilter --disable-encoders --disable-muxers --disable-filters --disable-devices --enable-version3 --enable-asm --enable-neon " EXTRA_CFLAGS="-I$ANDROID_NDK/sources/cxx-stl/system/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -fPIC -march=armv7-a -mfloat-abi=softfp -mfpu=neon" #EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16" EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -nostdlib" EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti" ABI="armeabi-v7a" echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > info.txt ./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee configuration....

March 10, 2013

棉记糖水

棉记糖水在东莞,我出生的地方,这家店在花园路吉之岛附近,成院的同学应该非常熟悉,作为本地人,不知道从什么时候开始知道有这间店的存在了。 这家店的价格走的是亲民路线,但是品质是上乘的*(对于本人来说)*,虽然说是糖水店,但是里面不单单只卖糖水,还提供小吃,饭,捞面,东莞特色食品龙船饭,咸面等等等等。 对于我来说除了吃,这家店还承受着更重要的意义,:-)。 捞面是我必点的食物,严重推荐 当然,来吃东西不止吃一样,我是喜欢把店里所有的东西都尝试一遍的。 黄色那些是炸过的蒜。 这里的装潢一般,但是很大,忙时可能找不到座位。

March 9, 2013

G类写作Task1学习笔记

摘抄自*《十天突破雅思写作》* Important 书信部分使用齐头式,署名在左下角。 ##书信三大纪律 书信考的六大类 Making a request 提出要求或者请求的信 Making a suggestions 提出建议的信 Making an apology 道歉信 Making a complaint 抱怨信 Thank-you letters 感谢信 Extending an invitation 邀请信 可以联想 用词追求稳妥 注意时间

March 8, 2013