adb 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
-d: 让唯一连接到该PC端的真实安卓设备执行命令,如果发现USB中连接有多部设备,将会报错
-e: 让唯一连接到该PC端的模拟器执行命令,如果发现开启了多个模拟器,将会报错
-s:通过设备的序列号进行指定设备执行命令
adb devices
adb get-serialno 获取连接到的手机的序列号
adb -s <serialNumber> get-state 获取设备的连接状态
adb wait-for-device 该命令将会阻塞一直到默认连接的那部机器状态变为device,也就是连接成功。
adb kill-server
adb start-server
adb install (apk在PC上的路径/)*.apk (将apk文件上传到了模拟器自带操作系统的data/app目录下了)
adb uninstall apk的包名(用EC切换到DDMS的File Explorer中查看,data/data下) 命令行用uninstall
adb shell (进入模拟器自带的操作系统)
adb remount 可能会挂载失败,提示remount failed: Operation not permitted, 用rm方法删除
cd data/app (切换到apk的安装目录)
rm ***.apk (用EC切换到DDMS的File Explorer中查看,data/app下)
adb shell
mount 1、系统分区
其挂载方式和 Linux 非常类似。其中需要说明一下的可能是 /dev/block/mtdblock* 这几个核心分区(写入 ROM 的),他们都是使用 yaffs2 文件系统(基于 FLASH 存储),其中是 /system 这个分区只有特殊的 readonly 只读权限,由此可见 Android 在安全性设计方面所下的一些功夫。另外 /dev/block/vold 据说是设计来替代 udev 的功能,主要用于支持一些热插拔设备。

adb pull 手机文件地址 本地目录 就是从真机上拷贝文件到您的PC上。
adb push 本地apk路径 /system/priv-app #安装系统app,直接将apk文件push到/system/priv-app目录下,重启手机即可
删除:
adb shell
cd /system/priv-app
rm apk包名.apk
cd /data/data
rm -rf 应用包名

adb shell screenrecord /sdcard/demo.mp4 屏幕开始录像并且储存到/sdcard中,同时名字为demo.mp4
adb shell stop 关闭设备请求,开启设备
adb shell start
adb reboot
adb shutdown
adb get-serialno 获取序列号
adb devices 查看连接计算机的设备:
adb reboot 重启机器:
adb reboot bootloader 重启到bootloader,即刷机模式:
adb reboot recovery 重启到recovery,即恢复模式:
adb kill-server 终止adb服务进程:
adb start-server 重启adb服务进程:
adb install -r <apkfile> //比如:adb install -r baidu.apk 保留数据和缓存文件,重新安装apk:
adb install -s <apkfile> // 比如:adb install -s baidu.apk 安装apk到sd卡:
adb uninstall -k <package> //比如:adb uninstall -k com.baidu.search 卸载app但保留数据和缓存文件:
adb shell top 查看设备cpu和内存占用情况:
adb shell top -m 6 查看占用内存前6的app:
adb shell top -n 1 刷新一次内存信息,然后返回:
adb shell procrank 查询各进程内存使用情况:
adb shell kill [pid] 杀死一个进程:
adb shell ps -x [PID] 查看指定进程状态:
adb shell service list 查看后台services信息:
adb shell cat /proc/meminfo 查看当前内存占用:
adb shell cat /proc/iomem 查看IO内存分区:
adb shell rename path/oldfilename path/newfilename 重命名文件:
adb shell cat /data/misc/wifi/*.conf 查看wifi密码:

adb logcat 查看log:
adb logcat -c 清除log缓存:
adb bugreport 查看bug报告:
adb shell cat /system/build.prop 获取设备名称:
adb shell cat /sys/class/net/wlan0/address 获取机器MAC地址:
adb shell cat /proc/cpuinfo 获取CPU序列号:
adb help
adb shell monkey -v -p your.package.name 500 跑monkey:
adb shell am start -n <package_name>/.<activity_class_name> 启动应用
adb shell am start -a android.intent.action.VIEW -n cn.uc.test/.MainActivity -d http://www.baidu.com ## 进行app的开启,并且传递一定的参数过去,比如:

## disable <PACKAGE_OR_COMPONENT> 其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
adb shell su disable com.UCMobile/.main.UCMobile
adb shell su enable com.UCMobile/.main.UCMobile 让一个apk从禁用状态恢复过来
adb shell pm path com.UCMobile 查看一个apk所在的路径
pm list packages 查看手机中装的所有的包

目录概览

1、mnt 挂载点目录
2、etc 系统主要配置文件
3、system Android 系统文件
1、usr 用户文件夹,包含共享、键盘布局、时间区域文件等
  2、app 常规下载的应用程序,这些 apk 包都是受保护的哦
  3、lib 系统底层库,如平台运行时库等
  4、etc 系统的配置文件,比如APN接入点设置等核心配置等
  5、framework Android 系统平台核心 framework 的文件
  6、build.prop Android 系统属性配置文件
  7、xbin 常用开发工具,比如 tcpdump/sqlite3 等
  8、bin 系统工具,比如 ps/cp/pm 等
  9、priv-app 系统应用程序
4、sys Linux 内核文件
5、proc 运行时文件
6、init.rc 启动脚本
7、default.prop 系统属性配置文件
8、data 用户程序目录
1、data 存放安装后的apk数据
  2、app 存放apk文件
9、dev 设备文件

常见错误

以下错误,部分是由于权限不足引起的,在调试错误前,请保证可以获得手机的root权限

  1. remount failed: Permission denied
    fix:

    1
    2
    adb root 
    adb remount
  2. error: device not found
    尝试在任务管理器中关闭adb.exe进行,然后重试

  3. INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
    安装包签名不一致,你需要卸载旧的安装包再重新安装。 对于普通app和系统app,分别按照上文方式进行卸载、安装即可。

  4. Read-only file system
    也就是文件只能读,fix:

    • remount或者chmod 777修改目录的读写权限(如果你是root用户)。
      • 顺序执行:
        1、adb shell
        2、mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
        或,
        adb shell mount -o remount rw /system
        此时,对大部分设备而言均可解决。
        
        • 可先把文件PUSH到/DATA目录,然后到adb shell下面,使用su命令进行搬运到最终地址。
          1、adb shell
          2、su
          3、cat /data/test.so > /system/lib/test.so

7、INSTALL_FAILED_INVALID_URI
在安装apk过程中,遇到这个错误,貌似root过的手机比较常出现,可以尝将/data/local目录的权限
从 rwxrwxr– 修改为 rwxrwxrwx

挂载目录为可读写、只读命令:

1
2
3
4
5
6
7
8
su
mount -o remount rw /system (挂载/system为可读写)
或 busybox mount -o remount,rw /system (挂载/system为可读写)
busybox mount -o remount,ro /system (挂载/system为只读)
busybox df -h
reboot 重启命令
reboot -p 关机命令
reboot recovery 重启至recovery模式

超级终端命令备份 system、data、cache、boot、recodvery等分区为 .img文件:

1
2
3
4
cat /proc/mtd
假设mtd1对应recovery分区,mtd2对应system分区,备份命令如下:
cat /dev/mtd/mtd1 > /sdcard/recovery.img
cat /dev/mtd/mtd2 > /sdcard/system.img

 
mmcblk 等具体对应哪些分区可参考:APP2SD+开启原理及用Re管理器开启app2sd+方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
挂载EXT分区命令 ,假设mmcblk0p2对应内存卡第二分区(ext格式)
mount -t ext2 /dev/block/mmcblk0p2 /system/sd-ext
重新挂载Fat32格式的内存卡到/system/sd-fat,假设mmcblk0p1对应内存卡第一分区(FAT32格式),在/system 下新建一个空目录 sd-fat 来挂载:
mount -o remount -t vfat /mmcblk0p1 /system/sd-fat
重新挂载回/sdcard:
mount -o remount -t vfat /mmcblk0p1 /sdcard
App2sd+完整开启命令,可参考:APP2SD+开启原理及用Re管理器开启app2sd+方法
su
busybox mount -o remount,rw /system (挂载/system为可读写)
mkdir /system/sd-ext (/system目录下新建目录 sd-ext)
mount -t ext2 /dev/block/mmcblk0p2 /system/sd-ext (将第二分区ext分区挂载到sd-ext)
cp -a /data/app /system/sd-ext/   (将/data/app目录复制到/system/sd/下)  
rm -r /data/app   (删除/data/app目录) 
ln -s /system/sd-ext/app /data/app  (建立软链接)  
reboot   (重启手机)

USB方式及网络方式。

一般手机及平板默认会设置为USB方式, 配置的属性为:
service.adb.tcp.port <- 监听的网络端口

> 以上属性的值 > 0    :    adbd将监听网络对应的端口(一般为5555)
    以上属性的值 <=-1:  adbd将监听USB  

enable adb over wifi:
adb tcpip 5555
setprop service.adb.tcp.port -1
stop adbd
start adbd
adb connect 192.168.1.5:5555 (:5555可省略) #如果连接成功会进行相关的提示,如果失败的话,可以先kill-server命令,然后重试连接。
adb kill-server
adb disconnect 192.168.1.5:5555

adb client

每当我们发起一个adb命令的时候,就会开启一个client程序。当然,当我们开启DDMS或者ADT的时候,也会自动创建client。当我们开启一个client的时候,它首先会去检测后台是否已经有一个server程序在运行着,否则会开启一个adb-server进程。所有的client都是通过5037端口与adb-server进行通信的。

adb daemon(adbd) 管理大家在电脑端的adb命令连接,

作为一个后台进程运行在模拟器/真实Android设备中的, 使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:

    Emulator 1, console: 5554
    Emulator 1, adb: 5555
  也正因为每个设备都分一组两个端口, adb连接手机的最大数量为16。 其中偶数端口是用于server 与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。
adb server
 当一个server开启的时候,他会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。

http://developer.android.com/tools/help/adb.html#IntentSpec
https://code.google.com/p/adb-fastboot-install/downloads/list
http://blog.csdn.net/ddna/article/details/6939608
http://wojiushiwolxw.spaces.eepw.com.cn/articles/article/item/97054
http://blog.csdn.net/crazy__chen/article/details/50221177
1
2
3

基准测试

新版本:
http://activemq.apache.org/examples.html
${ACTIVEMQ_HOME}/bin/activemq producer
${ACTIVEMQ_HOME}/bin/activemq consumer

老版本的测试工具:

1
2
3
消费者:ant consumer
生产者:ant producer
设置几百万条消息做压力测试,然后逐步调整heap、perm内存空间大小,慢慢调出最稳定最优的MQ配置

特征

  1. queue与topic的技术特点对比
对比项 Topic Queue
概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点
有无状态 topic数据默认不落地,是无状态的。 Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。
完整性 并不保证publisher发布的每条数据,Subscriber都能接受到。 Queue保证每条数据都能被receiver接收。
消息是否会丢失 一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。 Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。
消息发布接收策略 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。
最大区别 topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息 queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。

测试数据

集群部署

  1. Master-Slave的部署方式, 优点 故障恢复,但是没有负载均衡

    • 主从 persistenceAdapter
      1
      2
      3
      4
      5
      6
      <broker masterConnectorURI="tcp://masterhost:61617" shutdownOnMasterFailure="false"> 
      ...
      <transportConnectors>
      <transportConnector uri="tcp://slavehost:61616"/>
      </transportConnectors>
      </broker>
    • 根据文件系统的排它锁 Shared File System Master Slave
    • shared database Master-Slave方式
      与shared filesystem方式类似,只是共享的存储介质由文件系统改成了数据库
    • Replicated LevelDB Store方式
      这种主备方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node开启并接受客户端连接。
      其他node转入slave模式,连接master并同步他们的存储状态。slave不接受客户端连接。所有的存储操作都将被复制到连接至Master的slaves。

      如果master死了,得到了最新更新的slave被允许成为master。fialed node能够重新加入到网络中并连接master进入slave mode。所有需要同步的disk的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2. Master将会存储并更新然后等待 (2-1)=1个slave存储和更新完成,才汇报success。至于为什么是2-1,熟悉Zookeeper的应该知道,有一个node要作为观擦者存在。

      单一个新的master被选中,你需要至少保障一个法定node在线以能够找到拥有最新状态的node。这个node将会成为新的master。因此,推荐运行至少3个replica nodes,以防止一个node失败了,服务中断。

MQ 各Broker节点通过共享文件目录来实现主从的热备,所有的节点都在不断地获取共享目录的排它锁,哪个应用抢到了排它锁,它就成为Master,其他节点为Slave。如果Master节点宕机,它会释放排它锁,从而抢到独占锁的Slave节点可以接管。

因此使用这种主从热备的方式,不仅需要一个多服务器可以共享目录的机制(比如磁盘柜或分布式文件系统),而且文件系统需要支持文件排它锁。

多台节点启动时,先启动的节点获取排它锁,成为Master节点,其他节点成为Slave节点并等待获取共享目录的排它锁。

  1. Broker Cluster 有集群负载均衡的功能

源码编译

mvn eclipse:eclipse
mvn idea:idea

stomp
activemq
Ac​t​i​v​e​M​Q​集​群​的​使​用​与​配​置

vi常用操作

  1. 文件操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    vi FileName 打开文件 FileName,并将光标置于第一行首。 
    vi +n FileName 打开文件 FileName,并将光标置于第 n 行首。
    vi + FileName 打开文件 FileName,并将光标置于最后一行。
    vi + /pattern File 打开文件 File,并将光标置于其中第一个于 pattern 匹配的字符串处。
    vi –r FileName 在上次正用 vi 编辑 FileName 发生系统崩溃后,恢复FileName
    vi File1 … Filen 打开多个文件,依次对之进行编辑。
    :%!xxd 按十六进制查看当前文件
    :%!xxd -r 从十六进制返回正常模式

    :n1,n2 co n3 将 n1 行到 n2 行之间的内容拷贝到第 n3 行下。
    :n1,n2 m m3 将 n1 行到 n2 行之间的内容移至第 n3 行下。
    :n1,n2 d 将 n1 行到 n2 行之间的内容删除。
    :n1,n2 w filename 将 n1 行到 n2 行之间的内容保存到文件 filename 中
    :n1,n2 w! Command 将文件中n1行到n2行的内容作为 Command的输入并执行之,
    若不指定 n1、n2,则将整个文件内容作为 Command 的输入。
    :r! Command 将命令 Command 的输出结果放到当前行。
    :nr <文件> 把<文件>插入到第n行
    :so <文件> 读取<文件>,再执行文件里面的命令(文件中的命令应该都是一些ex命令)
    :l1,l2w <文件> 把第l1和第l2行之间的文本写到<文件>中去
    :w >> <文件> 添加到<文件>末尾. 也可以使用行号
    :e! 重新编辑当前文件,忽略所有的修改
    :w !sudo tee % 编辑了没有权限的文件时
  2. 光标移动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    h 光标左移一个字符。 
    l 光标右移一个字符。
    w 或 W 光标右移一个字至字首。
    B 或 b 光标左移一个字至字首。
    Ee 光标右移一个字至字尾。
    ·句} 光标移至句尾。
    ( 光标移至句首。
    ·段) 光标移至段落开头。
    { 光标移至段落结尾。
    ·行k 或 Ctrl+p 光标上移一行。
    j 或 Ctrl+n 光标下移一行。
    Enter 光标下移一行。
    nG 光标移至第 n 行首。
    n+ 光标下移 n 行。
    n- 光标上移 n 行。
    n$ 光标移至第 n 行尾。
    0 光标移至当前行首。
    $ 光标移至当前行尾。
    H 光标移至屏幕顶行。
    M 光标移至屏幕中间行。
    L 光标移至屏幕最后行。
    Ctrl+u 向文件首翻半屏。
    Ctrl+d 向文件尾翻半屏。
    Ctrl+f 向文件尾翻一屏。
    Ctrl+b 向文件首翻一屏。
    nz 将第 n 行滚至屏幕顶部。不指定 n 时将当前行滚至屏幕顶。
  3. 插入

    1
    2
    3
    4
    5
    6
    7
    8
    # 在文件中插入行号(不是显示行号,是插入!) 
    :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
    i 在光标前插入。
    a 在光标后插入。
    I 在当前行首插入。
    A 在当前行尾插入。
    o 在当前行之下一新行插入。
    O 在当前行之上新开一行插入。
  4. 替换

    1
    2
    3
    4
    5
    6
    7
    r 替换当前字符。 
    R 替换当前字符及其后的字符,直至按 ESC 键。
    s 从当前光标位置处开始,以输入的文本代替指定数目的字符。
    S 删除指定数目的行,并以所输入的文本代替。
    :.,+3 s/^/#/g 注释从当前行起的后三行(不含当前行)
    :ranges/pat1/pat2/g
    range 可以使用百分号(%)表示所有行,使用点(.)表示当前行,使用美元符号($)表示最后一行。你还可以使用行号,例如10,20表 示第1020行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数第五行,等等。
  5. 修改

    1
    2
    3
    ncw 或 nCW 修改指定数目的字符。 
    nCC 修改指定数目的行。
    :r filename 将文件 filename 插入在当前行之下
  6. 查找替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /<C-R><C-W> 把狭义单词 <cword> 写到 搜索命令 行 
    /<C-R><C-A> 把广义单词 <cWORD> 写到 搜索命令 行
    :g/str/s/str1/str2/g
    :%s/f $/for$/g 将每一行尾部的“f ”(f键和空格键)替换为for
    :%s/^/mv /g 在每一行的头部添加“mv ”(mv键和空格键)
    :s/fred/<c-r>a/g 替换fred成register a中的内容,呵呵
    :g/<input|<form/p 显示含<input或<form的行
    # 替换一个visual区域
    # 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
    :'<,'>s/Emacs/Vim/g 前面的'<,'>是vim自动添加的
    # 在多个文档中搜索
    :bufdo /searchstr
    :argdo /searchstr
    复制与剪切
    xp 交换前后两个字符的位置
    ddp 上下两行的位置交换
    :g/fred/t$ 拷贝行,从fred到文件末尾(EOF)
  7. 窗口操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    :vne [filename] 
    :sp [filename]
    :S [filename]
    :new [filename]
    :^w + ^r 交换两个窗口的位置
    ^w = 窗口等宽
    :res -n 窗口高度减小n
    :res +n 窗口高度增大n
    :vert res -n
    :vert res +n
  8. 删除操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    :%s/r//g 删除DOS方式的回车^M 
    :%s= *$== 删除行尾空白

    :%s/^(.*)n1/1$/ 删除重复行

    :%s/^.{-}pdf/new.pdf/ 只是删除第一个pdf

    :%s/<!--_.{-}-->// 又是删除多行注释(咦?为什么要说「又」呢?)

    :g/^s*$/d 删除所有空行
    :g!/^dd/d 删除不含字符串'dd'的行
    :v/^dd/d 同上 (译释:v == g!,就是不匹配!)

    :g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行


    :v/./.,/./-1join 压缩空行
    :g/^$/,/./-j 压缩空行

    ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。
    d0 删至行首。
    d$ 删至行尾。
    ndd 删除当前行及其后 n-1 行。
    x 或 X 删除一个字符。
    Ctrl+u 删除输入方式下所输入的文本。
    ^R 恢复u的操作
    J 把下一行合并到当前行尾
    V 选择一行
    ^V 按下^V后即可进行矩形的选择了
    aw 选择单词
    iw 内部单词(无空格)
    as 选择句子
    is 选择句子(无空格)
    ap 选择段落
    ip 选择段落(无空格)
    D 删除到行尾
    x,y 删除与复制包含高亮区

    dl 删除当前字符(与x命令功能相同)
    d0 删除到某一行的开始位置
    d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
    dw 删除到某个单词的结尾位置
    d3w 删除到第三个单词的结尾位置
    db 删除到某个单词的开始位置
    dW 删除到某个以空格作为分隔符的单词的结尾位置
    dB 删除到某个以空格作为分隔符的单词的开始位置
    d7B 删除到前面7个以空格作为分隔符的单词的开始位置
    d) 删除到某个语句的结尾位置
    d4) 删除到第四个语句的结尾位置
    d( 删除到某个语句的开始位置
    d) 删除到某个段落的结尾位置
    d{ 删除到某个段落的开始位置
    d7{ 删除到当前段落起始位置之前的第7个段落位置
    dd 删除当前行
    d/text 删除从文本中出现“text”中所指定字样的位置,
    一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
    dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
    dtc 删除当前行直到下一个字符“c”所出现位置之间的内容
    D 删除到某一行的结尾
    d$ 删除到某一行的结尾
    5dd 删除从当前行所开始的5行内容
    dL 删除直到屏幕上最后一行的内容
    dH 删除直到屏幕上第一行的内容
    dG 删除直到工作缓存区结尾的内容
    d1G 删除直到工作缓存区开始的内容
    修改命令操作
    r 更改当前字符
    cw 修改到某个单词的结尾位置
    c3w 修改到第三个单词的结尾位置
    cb 修改到某个单词的开始位置
    cW 修改到某个以空格作为分隔符的单词的结尾位置
    cB 修改到某个以空格作为分隔符的单词的开始位置
    c7B 修改到前面7个以空格作为分隔符的单词的开始位置
    c0 修改到某行的结尾位置
    c} 修改到某个语句的结尾位置
    c4} 修改到第四个语句的结尾位置
    c( 修改到某个语句的开始位置
    c) 修改到某个段落的结尾位置
    c{ 修改到某个段落的开始位置
    c7{ 修改到当前段落起始位置之前的第7个段落位置
    ctc 修改当前行直到下一个字符c所出现位置之间的内容
    C 修改到某一行的结尾
    cc 修改当前行
    5cc 修改从当前行所开始的5行内容
    . 重复上一次修改!
  9. Set 选项设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    set all 列出所有选项设置情况。 
    set term 设置终端类型。
    set ignorecase 在搜索中忽略大小写。
    set list 显示制表位(^I)和行尾标志($)。
    set number 显示行号。
    set showmode 示用户处在什么模式下
    set report 显示由面向行的命令修改国的行数目。
    set terse 显示简短的警告信息。
    set warn 在转到别的文件时,若没有保存当前文件则显示 No write 信息。
    set autowrite 在“:n”和“:!”命令之前都自动保存文件
    set nomagic 允许在搜索模式中,使用前面不带/的特殊字符。
    set nowrapscan 禁止 vi 在搜索到达文件两端时,又从另一端开始。
    set mesg 允许 vi 显示其他用户用 write 写到自己终端上的信息。

    autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐
    autoprint (ap) ap 每条命令之后都显示出修改之处
    autowrite (aw) noaw 在:n,:!命令之前都自动保存文件
    beautify (bf) nobf 在输入的时候忽略所有的控制字符(除了制表键(tab),换行(newline),进纸(formfeed))
    directory= (dir=) /tmp 存放缓冲区的目录名
    edcompatible noedcompatible 在替换的时候使用类ed的用法
    errorbells (eb) errorbells 出错的时候响铃
    exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件
    hardtabs= (ht=) 8 设置硬制表的边界
    ignore case (ic) noic 正规式里忽略大小写
    lisp nolisp 打开lisp模式
    list nolist 显示所有的制表键和行的结尾
    magic agic 可以使用更多的正规表达式
    mesg mesg 允许向终端发送消息
    number (nu) nonumber 显示行号
    open open 允许开放和可视化
    optimize (opt) optimize 优化吞吐量,打印时不发回车
    paragraphs= (para=) IPLPPPQPPLIbp 设置{ & }的分界符
    prompt prompt 命令模式下的输入给出:的提示符
    readonly (ro) noro 除非用!号否则不准保存文件
    redraw noredraw 当编辑的时候重绘屏幕
    remap remap 允许宏指向其他的宏
    report= 5 如果影响的行数>这个数的话就报告
    scroll 1/2 window 下卷屏幕时滚动屏幕的数目, 同样这也是z命令输出的行数(z 输出2倍滚屏的大小)
    sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)
    shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量
    shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数
    showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况
    showmode noshowmode 显示你处在什么模式下面
    slowopen (slow) 插入之后不要立刻更新显示
    tabstop= (ts=) 8 设置制表停止位(tabstop)的长度
    taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)
    tags= tag, /usr/lib/tags 定义包含标记的文件路径
    term= 设置终端类型
    terse noterse 显示简短的错误信息
    timeout (to) timeout 一秒钟后键盘映射超时
    ttytype= 设置终端类型
    warn warn 显示"No write since last change"信息
    window= (w=) 可视模式下窗口的行数
    wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置
    wrapscan (ws) ws 查找到文件尾后再重头开始
    writeany (wa) nowa 可以保存到任意一个文件去
  10. 排序

    1
    2
    3
    :%!sort -u 使用sort程序排序整个文件(用结果重写文件) 
    !1) sort -u 排序当前段落 (只能在normal模式下使用!!)
    :.,+5!sort 排序当前行及以下5行
  11. 列操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    :%s= [^ ]+$=&&= 复制最后一列 
    :%s= f+$=&&= 一样的功能
    :%s= S+$=&& ft,还是一样

    :s/(.*).*)/2"1/ 颠倒用:分割的两个字段

    :%s(w+s+){2})str1:1str2: 处理列,替换所有在第三列中的str1

    :%sw+)(.*s+)(w+)$:321: 交换第一列和最后一列 (共4列)
  12. DOS格式文本转成Unix格式文本

    1
    :1,$s/^M//g
  13. 书签
    在阅读和编写大的程序文件时,利用标记(书签)功能定位是十分有帮助的。
    将光标移到想做标记的位置。假如做一个名为“debug1”的标记,那么用户可在命令模式下输入做标记的命令“mdebug1”,然后敲入回车键,一个名 为“debug1”的标记就做好了。
    接下来用户可以随意将光标移到其它的位置,当在命令模式下输入“`debug1”后,就能快速回到“debug1”的标记所在行的行首。

  14. 特殊字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ^ 匹配字符串位于行首。 
    $ 匹配字符串位于行尾。
    . 用在模式串中,表示任何单个字符。
    在命令模式下,重复上次的命令。
    * 在模式串中,表示其前字符可出现任意多次。
    [] 用在模式串中,表示指定方位内字符,其中可用-表示一个字
    符范围,用^表示不在某个范围内的字符。
    ESC 从插入状态转换到命令状态
    ^[ 功能同 ESC
  15. 大小写转换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    guu 行小写 
    gUU 行大写
    g~~ 行翻转(当然指大小写啦)
    guw 字小写(狭义字) 译注:建议对比iw
    gUw 字大写(狭义字)
    g~w 字翻转(狭义字)
    vEU 字大写(广义字)
    vE~ 字翻转(广义字)
    ggguG 把整个文章全部小写(ft!bt!)
  16. 跳转足迹’. 跳到最后修改的那一行

    1
    2
    3
    4
    `. 不仅跳到最后修改的那一行,还要定位到修改点 
    <C-O> 依次沿着你的跳转记录向回跳 (从最近的一次开始)
    <C-I> 依次沿着你的跳转记录向前跳
    :ju(mps) 列出你跳转的足迹
  17. 命令历史

    1
    2
    3
    4
    5
    6
    :history 列出历史命令记录 
    :his c 命令行命令历史
    :his s 搜索命令历史
    q/ 搜索命令历史的窗口
    q 命令行命令历史的窗口
    :<C-F> 历史命令记录的窗口
  18. 寄存器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 列出寄存器(Registers) 
    :reg 显示所有当前的registers
    "1p 表示引用register,1表示一个名字叫做1的register,p就是粘贴(paste)命令
    "也用来定义register
    先输入 ",表示定义register
    然后输入名字,如0~9,a~z
    然后执行删除或复制命令,如dd或y,
    或者是visual模式下的d(删除选中的部分)或y(复制选中的部分)
    则被删除或复制的部分就被存入了这个命名的register

    观察:一个特殊的register, "" ,里面存储了一个匿名的删除/复制
    在你执行dd或y的时候,被作用的部分被存到了""

virtualbox shared folder

默认会员
sudo usermod -aG vboxsf $(whoami)

in order to use shared folder functionality few prerequisites need to be met:

Make sure that Guest Additions are properly installed on the guest OS.
Users in a guest Ubuntu must be in the group vboxsf to be able to access shares.
Define a directory on the host that will be used in the virtual machine using the settings dialogue of Virtual Box.
Do not share personal folders like /home/username or My Documents
avoid special characters or empty spaces in the path to the shared folder
use different names for share and mountpoint
create a mountpoint on the guest OS (best in your HOME directory).

Testing shared folders functionality can thus be done by creating a shared directory on the host (e.g. C:\myshare), define this as a shared folder for your guest system in Virtual Box settings (e.g. share), create a mount point in your guest os (e.g. mkdir /home/username/host)and mount this in the guest OS with the command:

sudo mount -t vboxsf -o uid=1000,gid=1000 share /home/username/host

where the option -o makes sure that you will have access to the mount (that will otherwise be owned by root).

For further information on shared folders see also the Virtual Box User Manual.

Files or directories can also be shared over the network by using Samba on the host and the guest.
http://askubuntu.com/questions/30396/error-mounting-virtualbox-shared-folders-in-an-ubuntu-guest