【写在前面】
以下的所有内容主要参照:
https://github.com/yangyangwithgnu/use_vim_as_ide 。
原blog作者写的非常用心,建议大家都去看看。(个人觉得通过这个blog大大提升了学习vim配置环境的效率,因此给作者捐了顿外卖的钱)这个随笔就是学习上述blog内容的辅助记录,并不能代替学习原著;把学习过程中遇到的一些坑列出来,初步做一下知识沉淀。
以前我个人的学习理念是“重剑无锋、大巧不工”,瞧不上这些快捷键之类的“奇技淫巧”。但是,打磨完了vim的开发环境后,我改变了这个看法:知识可以厚,但是顺手的工具必须要用心去一点点儿打磨锋利,提高工作效率的‘量变’会带来能力水平的‘质变’。
另,本人纯vim初学者,因此学习过程中肯定存在吃不透甚至错误的地方。一方面后续会自我不断改进,另一方面也非常欢迎大家拍砖指点。
【系统环境 & 内容提纲】
我用操作系统环境:
mac OS X Yosemite 10.10.3
脚本环境用的zsh:
搭建完成后的编辑环境如下:
可以看到:标签(函数变量)、工程目录、自动补全、状态栏提示、语法分析错误提示都集成在了里面。在实现了一个IDE的主要功能同时,VIM还可以让你最大程度自由定制个人的开发环境,快捷键等等。
全文的提纲汇总如下:
(一)重新编译安装vim7.4
(二)编辑界面显示美化插件
(三)安装pathogen插件管理工具
(四)语法高亮、代码缩进、代码折叠、强命名下的接口与实现快速切换
(五)基于标签的代码导航
(六)内容查找、内容替换、批量注释
(七)代码模板
(八)代码自动补全
(九)工程文件浏览 & 多文档编辑
(十)静态语法分析器
(十一)快速移动功能
下面对上述十一块内容逐一说明,各个部分有前后逻辑限制,改变顺序不保证每个功能都能实现正确。
【步入正题】
(一)重新编译安装vim7.4
我的mac上自带的vim版本是7.3,但有个极其重要的自动补全插件YouCompletetMe需要的vim版本是7.4,因此必须再装一套高版本vim。
vim7.4压缩包地址:ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
基本上按照blog中步骤执行如下命令(假设上述文件解压到了~/Download/vim74中):
./configure --with-features=huge --enable-rubyinterp --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config/ --enable-perlinterp --enable-gui=gtk2 --enable-cscope --prefix=/usr --enable-luainterp
make
报错:
简单分析一下error,应该是命名冲突了。google了http://zhouyichu.com/vim/Vim-in-Mac.html。
解决方案是在vim74/src/os_unix.h中加入#include <AvailabilityMacros.h>。Done。
再执行
输入root密码后,Done。
再输入vim,版本就升级到7.4了
===================================================================
注意./configure的参数中
--prefix=/usr是vim安装路径的,如果不想替换系统原有的,就可以把vim安装到自定义的路径下。再使用alias命令,在.bashrc中加一句
alias vi="vim安装路径/vim"。
再注意,如果你跟我一样用了zsh这类的bash加强版,就需要在~/.zshrc中再加一句 source ~/.bashrc,如下图
这样你每次输入vi启动的才是vim7.4,否则zsh还是会默认调用原来系统自定义的vim。
===================================================================
另外,要想成功编译安装vim,还需要python-devel、python3-devel、ruby-devel、libX11-devel、gtk-devel、gtk2-devel、gtk3-devel、ncurses-devel等支持。(我在服务器端安装的时候,就遇到了ncurses没有的情况,这个后续再去解决)
(二)编辑界面显示美化插件
(由于pathogen无法管理界面美化插件,因此界面美化单独拎出来)
1. 界面配色
(1)建立.vim/colors/文件夹,并将三个配色的vim文件copy到.vim/colors/文件夹下面,如下图所示
(2).vimrc增加配置,使界面美化生效
在.vimrc中添加的命令如下
set background=dark
"colorscheme solarized
colorscheme molokai
"colorscheme phd
仅仅这样还不够,此时vim的编辑环境还是黑白的,还要让vim开启语法高亮并且能够应用配色文件。需要继续在.vimrc中添加下面的配置;
syntax on
这样,再次打开vim的编辑环境,语法高亮配色就体现出来了:
2. 添加辅助信息
为了防止编程过程中串行了,在设置一些辅助信息如下:
set laststatus=2
" 显示光标当前位置
set ruler
" 开启行号显示
set number
" 高亮显示当前行/列
set cursorline
set cursorcolumn
" 高亮显示搜索结果
set hlsearch" 禁止折行
set nowrap
添加了这些信息后,可以看到vim编辑界面如下(光标、高亮、行号、状态栏都有了):
经过上述的配置,现在vim的编辑环境有了颜色,有了行号。但仅仅是一个带语法颜色提示的txt,其他强大的功能还要借助于各种插件。
要想管理好各类插件,就要使用下面一节介绍的pathogen插件管理工具。
(三)安装pathogen插件管理工具
用pathogen来管理vim插件的特色是:.vim/bundle/下每个插件有独立的文件夹,插件之间几乎是完全解耦。
这样带来的好处是:在添加、删除某个插件时,几乎不影响其他的插件。
1. 安装pathogen
pathogen虽说是管理vim插件的,但是它自身就是一个插件。安装过程如下。
(1)在~/.vim路径下执行如下命令
(2)下载pathogen.vim到autoload
https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim
执行如下命令:
如下:
(3)在.vimrc中增加配置信息
一是告诉vim,pathogen在哪;二是告诉vim执行path
缘起:路由器被刷成半砖
Linksys wrt54gs v4路由器,已刷入 tomato-dualwlan 1.23。使用数年,未出现任何故障。
在日用的wifi网络上,通过web界面刷入了错误的tomato-dualwlan的 R2 firmware。
路由器毫无意外地挂了。后查资料得知,以上的每一步都有风险,选错firmware则是致命的。
正确的刷机过程是:
路由器和刷机用的计算机脱离日用网络。用一根网线(有线而不是无线)链接路由器和计算机,组成一个干净的微型网络。
计算机上设置固定的ip地址。
刷机前进入路由器配置界面恢复缺省值。
仔细查看资料,确认正确的固件。如有任何疑问,放弃是理性的选择。
选择头脑清醒的时间,在适合工作的场所,跟懂技术的朋友交流讨论,不要喝酒……
唯一的好消息是路由器处于半砖状态。所谓半砖是指路由器的CFE(相当于计算机的BIOS)工作正常。
CFE只能通过JTAG刷,不用JTAG就刷不坏(其实用TTL线也可以更新CFE,这是后话)。
也就是说,此时的路由器相当于一台没有接显示器和键盘,有硬盘(flash芯片),
但操作系统已经不能正常工作的计算机。
故障现象
插入电源后,全部灯亮,迅速熄灭,仅留下插网线的端口所对应的灯亮。
用计算机 ping 不通。该计算机已设置为:
地址:192.168.1.106
子网:255.255.255.0
网关:192.168.1.1
tftp刷机失败
既然无法 ping 通,说明计算机无法与路由器建立TCP连接,那么,web界面肯定用不了。
下一步只能尝试tftp刷机。tftp ,顾名思义是基于网络ftp的协议。理论上有两种方式上传新的 firmware 固件:
路由器开tftp服务程序,操作计算机运行tftp客户端上传文件。
计算机开tftp服务程序,操作路由器运行tftp客户端从服务器上读取软件。
以上任何一种方式都需要 ping 通计算机,于是问题又回到起点。
经过查资料和实测可以用短路法,即将路由器的flash芯片(mx29lv320)的16、17脚短接,使路由器进入safe mode,恢复ping,同时打开tftp服务,使用上述第1种方式从计算机上传新的固件到路由器。
又据网络资料称,正常情况下路由器上电后启动运行CFE,然后进入linux操作系统,期间有0-1秒的时间运行了tftp服务程序,此时可以用计算机上传固件。
于是为了这个0-1秒的时间,我们使用了各种奇怪而扭曲的操作方案。
我设置计算机的网络链接。打开 CMD 窗口,执行ping命令:
ping 192.168.1.1 -t
计算机上安装的是windows 2008,缺省未安装tftp,需要增加新功能……熟悉tftp命令……另开一个 CMD 窗口输入tftp命令:
tftp -t -i 192.168.11.1 put xxx.bin
旋转计算机屏幕以利于观察何时接通。
硬件攻城狮用镊子短接flash 芯片的16、17脚.
软件攻城狮(我)插上电源,观察屏幕。在 ping 通1秒以内,按下回车键。
tftp命令的结果有两个:
Invalid code partern
Timeout
根据网路上的案例,前者是文件头不对,后者是tcp链接失败。
于是,在网络上搜索各种固件。固件的文件头有两个:
W54S
WRT54GS-v4_1.06.3.002_fw.bin
WRT54GV4.0_4.20.9_SC_code.bin
FreemanBasic_V1.0.2_wrt54gs.bin
tomato_dual_1.23\Firmware\WRT54GSv4.bin
dd-wrt.v24_mini_wrt54gs.binHDR0
Tomato-1.28.2890-R1-4M.trx
然现在的问题并没有那么简单。路由器原来用的是tomato_dual_1.23\Firmware\WRT54GSv4.bin
,刷的是Tomato-1.28.2890-R1-4M.trx
,那么问题来了,路由器里边是1.23还是1.28的文件头呢?
操作结果是两种文件头都试过了,都没有成功。
分析问题,提出新的技术方案
经过多次刷机失败以后,攻城狮们放弃了……坐下来认真分析。
路由器上电后,网络链接并未建立。在 Linux 中这通常意味着驱动出错,或者网络被关闭。
无法确认tftp服务程序是否开通过,何时开通。
此路不通……必须另外设想其它的方案。可选的有TTL刷机,JTAG刷机。
TTL接口其实是串行端口。对软件攻城狮来说就是类似com1―9600速率―N81
的东西。对硬件攻城狮来说就是RX接收,TX发送,GND地
三条线,±12V。只不过由于终端设备的电源供电通常为0~3.3/5V,因此对数据0和1的高低电平、临界值进行了调整,接计算机时需要升压电路。
串行端口在终端上通常具有多重功能,显示信息(串行终端,在unix系统上常见),输入命令,传递数据。它是类似路由器这样的设备的显示接口键盘接口和数据接口。
JTAG是并行接口。对软件攻城狮来说就是类似ltp1
的东西。对硬件攻城狮来说就是25pin,多条数据线,控制线和地,0~5V电平,多用于数据输出接打印机扫描仪等,数据传输速率高。
因此,使用TTL接口时,路由器被视为主机,计算机则是作为提供输入输出的显示器和键盘的外围设备。使用JTAG接口时,计算机是主机,路由器是被控制的外围设备。
最后,我们选择的是TTL接口。硬件攻城狮首先在路由器的TTL接口(和JTAG接口)上焊接了双排插针。
选购USB-TTL刷机线,建立调试环境
熟悉TTL接口的知识以后,下一步就是上某宝购买TTL接口线。我们公司一直在某宝上购买硬件设备,尤其是这类小接口。一般来说,不要选最便宜的,如果一个芯片10元左右,你要是买个10元左右的板子……只能祝福您了,相信您能从中学到很多经验和知识,呵呵。
收到模块后,仔细阅读说明书,安装USB驱动。将USB插入计算机,在系统中查看USB串口的端口号,一般是COM3。
下载并运行串行通讯软件。我选用的是putty。SecureCRT也可以,但这是付费软件。实际上windows的超级终端也可以。
设置端口为Serial COM3,速率为115200,N81。速率如果设置错了,收到的信息显示为乱码,试试改成9600/14400/57600等。
wrt54g有两个TTLL串口,分别为:
串口1, uart0,pin 4/6/10
串口2, uart1,pin 3/5/9
我的路由器上用的是串口1。用杜邦线连接串口模块和wrt54g上对应的双排插针。注意不要连接到3.3v/5v的电源脚。
路由器上电,在USB-TTL转换板上能看到RX灯闪烁,putty的窗口上显示接收到的数据。若无反应,拔掉路由器电源,换一个路由器串口重新接线试试。
再次拔掉/插入路由器电源,注意观察putty窗口上显示的数据。
wrt54g是一台嵌入式的Linux主机
此时感觉就很不一样了!wrt54g不再只是一个黑匣子,而是一台"主机",透过运行在计算机上的putty和TTL连线,我们有了"显示器","键盘",它还有操作系统――Linux,硬盘――Flash芯片,文件系统,串口,网卡等等。
路由器上电以后首先启动CFE(Common Firmware Environment),然后启动Linux操作系统。
CFE相当于计算机上用的ntldr,grub for dos,common.com,是路由器的Boot loader。以下为CFE的刷屏:
CFE version 1.0.37 for BCM947XX (32bit,SP,LE)
Build Date: Tue Aug 7 17:14:08 CST 2007 (crazy@sw1.rd)
Copyright (C) 2000,2001,2002,2003 Broadcom Corporation.
Initializing Arena
Initializing Devices.
No DPN
et0: Broadcom BCM47xx 10/100 Mbps Ethernet Controller 3.90.37.0
CPU type 0x29008: 200MHz
Total memory: 16384 KBytes
Total memory used by CFE: 0x80300000 - 0x803A39B0 (670128)
Initialized Data: 0x803398C0 - 0x8033BFD0 (10000)
BSS Area: 0x8033BFD0 - 0x8033D9B0 (6624)
Local Heap: 0x8033D9B0 - 0x803A19B0 (409600)
Stack Area: 0x803A19B0 - 0x803A39B0 (8192)
Text (code) segment: 0x80300000 - 0x803398C0 (235712)
Boot area (physical): 0x003A4000 - 0x003E4000
Relocation Factor: I:00000000 - D:00000000
Boot version: v3.7
The boot is CFE
mac_init(): Find mac [00:06:25:00:02:DB] in location 0
Nothing...
No eou key find
Device eth0: hwaddr 00-06-25-00-02-DB, ipaddr 192.168.1.1, mask 255.255.255.0
gateway not set, nameserver not set
Loader:raw Filesys:raw Dev:flash0.os File: Options:(null)
Loading: .. 5192 bytes read
Entry at 0x80001000
Closing network.
Starting program at 0x80001000
显然,半砖路由器的CFE启动正常,运行Linux(Starting program at 0x80001000)即挂死。
短接Flash芯片的16、17脚导致CFE读取Linux的image文件异常,不停地显示:
Reading :: Failed.: Timeout occured
路由器被停在了CFE中。如果CFE中有tftp服务程序,高版本的CFE还有web服务程序,那么,您此时可以在计算机上用tftp刷机或者用浏览器刷机。
但说好的tftp和web在这台路由器的CFE中――并不存在,CFE版本low至3.7。二位攻城狮以各种时间序列凹出各种造型,然都没有用。
好消息是CFE打开了网络口,正常,直到退出CFE。在计算机侧输入命令:
pint 192.168.1.1 -t
是成功。
玩不坏的 CFE
拔掉路由器电源。
在计算机上激活putty终端窗口,左手放在键盘的Ctrl C
上。
右手插入路由器电源,电源接通后,左手立刻按下Ctrl C
――中断CFE的自动运行命令,进入CFE命令环境。
putty上显示:
No eou key find
Device eth0: hwaddr 00-06-25-00-02-DB, ipaddr 192.168.1.1, mask 255.255.255.0
gateway not set, nameserver not set
Automatic startup canceled via Ctrl-C
CFE> ^C
CFE> ^C
CFE>
- ^C,就是我们在计算机上按
Ctrl C
此即进入 CFE 命令模式。在计算机键盘输入help
,回车:
CFE> help
Available commands:
rndis Broadcom USB RNDIS utility.
et Broadcom Ethernet utility.
modify Modify flash data.
nvram NVRAM utility.
reboot Reboot.
flash Update a flash memory device
memtest Test memory.
f Fill contents of memory.
e Modify contents of memory.
d Dump memory.
u Disassemble instructions.
autoboot Automatic system bootstrap.
batch Load a batch file into memory and execute it
go
没有评论:
发表评论