升级win10备忘

首先,接手电脑为win8.1,高兴去在线升级结果发现将会升级成win10家庭版,果断拒绝换路。
然后,策略再选择成把win8.1变成专业版,再online升级,如果再不行,就使用ISO了,( VK7JG-NPHTM-C97JM-9MPGT-3V66T)win10密钥吧。

1)升8再升10
保守治疗先,继续玩win8.1,右键“这台电脑”,在系统属性界面,选 择“获取新版本的Windows的更多功能”或者在控制面板中应该不难找到“向windows8.1添加功能”,然后,又是要输入产品密钥。
在这一步输入专业版的零售密钥,如果是升级到win8专业版,就输入8GDW2-NHD3Y-C79G4-B82C4-6Q4DH,(用的这个)
如果是升级到win8.1专业版,就输入 29NQY-3TDJ2-CPXXD-CHDMY-CWD2Y。
然后,漫长的等待windows update进度。注意,要确认本机是已经被激活的不然会升级不成功,并且是最后才给你结果,说不成功。当然如果是激活的,那么就关闭360,再重启。(本人采用方式)

2)ISO升10
直接点击ISO,win10不用虚拟光驱了,又一群要下岗的同行。但这样安装上的win10可能会出现问题。

3)ISO装10(或者用老毛桃啥的做个U盘,引导安装)
过程中选择不保留原有应用和个人文件夹等,那就没有以前版本的windows,回退都没有路子。

程序员的自我修养

四大神器,解决依赖:

ldd是用来查看执行文件或.a,.so的依赖关系利器(从链接的角度)。
nm———————查看静态符号表,观察依赖关系
-sD *.so
objdump -p t_sql.o | grep NEEDED

库命令:
file *.o—————看ELF信息
objdump -[看列表] *.o——看目标文件的结构和内容
基本信息(-h)
更多信息(-x)
依赖信息(-p)objdump -p t_sql.o | grep NEEDED

动态链接的可执行文件中包括got,有时有调用别模块时的共享对象也存在此段。

查看一个so是否PIC(地址无关性)编译的:
readelf -d .so | grep TEXTREL
如果有输出,用的是装载时重定位(虽多进程调用可以,但牺牲了效率),否则,证明编译时加了-fPIC,是地址无关。

readelf—————-看elf详细信息,包括(系统位,大小端,是否可执行)
文件头信息(-h)
详细的信息(-S)较权威的段表信息
从linker角度来查看链接器使用的dynamic段的信息(-d *.so)链接库的elf信息,同于ldd(宏观模块体现)。
-sD *.so查看动态符号表(从库提供服务或使用的角度),针对段.dynsym观察依赖关系
-l ../bin/devcomm | grep interpreter(链接器使用的段)查看生成它的链接器(可执行文件)
-r *.so查看重定向符号表

链接的秘密:

目标文件静态重定向—动态链接文件重定向——可执行动态链接文件重定向
rel.text——————rel.dyn———–针对数据引用,修正位于数据段中的got(全局变量的引用地址)
rel.data——————rel.plt————针对函数引用,修正got.plt

全局符号表

二元信号量:

信号量(多元):

互斥量:不同于二元信号量:哪线程存得,哪线程释放
相同二元信号量:都是约束线程排队的

临界区:在一点处与互斥量不同:其它进程不可见。(和内核对象名称不太相符)

条件变量:同时阻塞和唤醒多个线程

静态编译Qt5.5并应用成果

一直为打包Qt开发的东东依赖库发愁。只好研究下静态编译,当然选个最新的版本。
环境如下:
win7 x86
VS2012
perl5.16.2
python34(32bit)
ruby21
Qt5addin1.2.4

说明:ruby安装时要把三个都选择上,QT5addin插件安装要特有耐心,不然总会觉得,程序假死了。(后来发现是装集成help文档时占时间,可以不装它的)

以上安装在一个独立的虚机,方便以后改造,重要的一点是,一编译就2-3个小时,你对着屏发呆嘛?
下载Qt5.5的源码,进入其目录,需要改的有两处:
<src目录>\qtbase\mkspecs\win32-msvc2012\qmake.conf.

将以下三处 -MD修改为 -MT

QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
当环境不同,聪明的你会找到需要更改的位置。5.5源码包是mkspecs/comon/msvc-desktop.conf里面改。

建立个批处理文件,如vs2012.build.bat
内容如下:

::配置路径
set QT5_DIR=C:\qt_tool\qt-everywhere-opensource-src-5.5.0-alpha
set THIRDPARTY_DIR=C:\qt_tool\Build
::如果您用mingw可以在这儿设置下您的mingw目录
set PATH=%PATH%;C:\Perl\site\bin;C:\Perl\bin;C:\Python34;C:\Ruby21\bin;
set PATH=%PATH%;%QT5_DIR%\bin;%QT5_DIR%\qtbase\bin;%QT5_DIR%\gnuwin32\bin;

::配置依赖,mingw的可能需要您手动加上库和头文件位置,vs的话您可以打开相应的VS* X86/64 本机命令提示符
::set SQLITE3SRCDIR=%THIRDPARTY_DIR%\sqlite
::set LIB=%LIB%;%THIRDPARTY_DIR%\icu\win32\lib;%THIRDPARTY_DIR%\icu\win32\libs;%THIRDPARTY_DIR%\openssl\openssl32\lib
::set INCLUDE=%INCLUDE%;%THIRDPARTY_DIR%\icu\win32\include;%THIRDPARTY_DIR%\openssl\openssl32\include
::set PATH=%PATH%;%THIRDPARTY_DIR%\icu\win32\bin;%THIRDPARTY_DIR%\openssl\openssl32\bin

::配置QT,为了在输入configure配置qt编译选项,我就直接写到bat了、、、
cd %QT5_DIR%
configure -prefix C:\QtSdk\Win32_static -opensource -confirm-license -static -platform win32-msvc2012 -release -c++11 -qt-sql-sqlite -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-angle -no-icu -opengl desktop -nomake examples -nomake tests -no-compile-examples -skip qtwebkit
把它保存。不提倡改那个bat文件,因为,webkit是不能静态编译的,并且它很耗时,并且很多选项都是经验之谈。
然后,找nmake去。在开始菜单里找”vs2012 x86本机工具命令指示行“,
打开,进入源码目录,执行批处理。

你的环境一致,定能configure过。注意,要清除前一次的垃圾,需要用nmake distclean
后面的事就是敲nmake,泡杯茶了。

有时,你真的nmake成功了,但是不一定能nmake install正常。但我坚信install只是一系列拷贝操作。你要的那些lib已经OK了,你可以部署的时候再用他们。

当然,你可以坚持找原因,nmake install成功。

注意,不要轻易改变源码的位置,或节省空间删除它。否则,上帝保佑你。

后记:
以为装了Qt5addin,打开就可以看到Qt5的菜单,错了,还要真的装个Qt sdk才行。
Qtcreator静态编译了一下,的确可用,但是无法部署到同为32的xp下。可能是因为,Qt使用的编译器仍然是VS2012的,所以,再用VS2012+Qt5addin试一次,何况这是我们目标。
不过,我发现一个坑,Qt5addin1.2.4根本和VS2012不兼容,而且这不会提示你。
1.2.3装后,开始真正的应用静态编译的成果了。

项目设置:

为了让exe能跑在xp上,需要设置在工程—-属性—配置属性–常规–平台工具集v110_xp

因为,我编译的lib都是realse的,所以把项目设成realse
改成(release为MT,debug为MTD)
在工程—-属性—配置属性—c/c++—代码生成—-运行库
选择为“多线程(/MT)”
这样设置可能是约定了对lib的调用方式。
否则,编译时报错:runtimelibrary
error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

在工程—-属性—配置属性—链接器
本人的附加依赖项(备忘):$(QTDIR)\lib\Qt5Core.lib;$(QTDIR)\lib\Qt5Gui.lib;$(QTDIR)\lib\qtmain.lib;$(QTDIR)\lib\Qt5Widgets.lib;$(QTDIR)\plugins\platforms\qwindows.lib;$(QTDIR)\lib\Qt5PlatformSupport.lib;$(QTDIR)\plugins\platforms\qminimal.lib;$(QTDIR)\plugins\platforms\qoffscreen.lib;$(QTDIR)\lib\Qt5OpenGL.lib;$(QTDIR)\lib\Qt5OpenGLExtensions.lib;$(QTDIR)\lib\Qt5Sql.lib;winspool.lib;shlwapi.lib;rpcrt4.lib;$(QTDIR)\plugins\imageformats\qico.lib;$(QTDIR)\plugins\imageformats\qsvg.lib;$(QTDIR)\lib\Qt5Qml.lib;$(QTDIR)\lib\Qt5Quick.lib;comdlg32.lib;oleaut32.lib;imm32.lib;winmm.lib;glu32.lib;opengl32.lib;gdi32.lib;$(QTDIR)\lib\qtharfbuzzng.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;ole32.lib;advapi32.lib;ws2_32.lib;mpr.lib;%(AdditionalDependencies)

上面配置解决了一个ub_buffer_create……destroy啥的编译错误。

QT5设置:
VS中设置好Qt versions为静态的sdk,然后在Qt project setting—–properties页的最后一个设置上。
即version属性选择下拉中的静态sdk(有时忘记它,其实主要开关在这里)

最后构建你的程序吧。不过还是有坑的。虽然没有报error了,但当你运行它会提示你:
……Failed to load platform plugin windows……

这次改main.cpp吧

#include
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

编译通过,这次把exe放到没有Qt5安装的xp下,都如愿运行,出画面了。

大胆的写Qt吧,一次编写,到处部署(很方便)

win7+ubuntu双系统备忘

前情提要:
双系统你值得拥有,开始共存的挺好,由grub2来引导两系统。后来我装了个ext2fsd。虽然,在window下可以看到ubuntu的文件了,但是,同时也破坏了分区卷标或格式什么的。反正就出现grub rescue>了。于是,开始了救赎。下一了个万能引导光盘,boot-repair-iso这个东东,直接就让我引导到了window,可是ubuntu没有了引导入口。不甘心,继续研究easybcd方式,于是,windows这次当主人引导ubuntu了。

环境:
一般linux系统中/boot都不独分一区
同时MBR一般也都装在第一块硬盘上

所以,引导时也都是在MBR上装grub2再里面引导双系统。
当然可以先用window的bootmgr(名字不确定)来引导,然后再easyBCD来图形化操作设置
加上grub的引导。就是指针的指针了。
本人以前就是:
MBR—-grub2—-bootmgr
现在:
MBR—-bootmgr—-grub

参考:
http://redmaple34.blog.51cto.com/2621361/604298

grub小结
一般会碰到两种提示符,前者是救援,后者是grub控制台
grub rescue>
当它出现,这是由于引导分区对应不上了。即mbr中的原路径,对应不了/boot/grub路径。
所以,在有限的命令下(ls,set,insmod,normal)一步步来吧。
用ls先找:
ls (hd0,msdosX)/
其中的X为变量,根据实际存在的分区数为准。
用set显示当前情况。若不对就变化。
set root=(hd0,msdos8)
set prefix=(hd0,msdos8)/boot/grub
insmod /boot/grub/normal.mod
normal

一般上述步骤操作完,可以在启动选项界面,敲“C”进入命令行模式
A:
grub >set root=hd0,msdos7
grub >set prefix=(hd0,msdos7)/boot/grub
grub >linux /vmlinuz-xxx-xxx root=/dev/sda7 //里边的xxxx可以按Tab键,如果有acpi问题,在最后加一句acpi=off
grub >initrd /initrd.img-xxx-xxx
grub >boot
//end A

或者跳过A
重启后,应该sudo -i
update-grub2
此时重建了grub.cfg
grub-install /dev/sda
此时重建了sda的mbr

应该可以解决问题了。

下面是常用命令。
grub>

find /boot/grub/core.img

root (hdx,y)

kernel /boot/grub/core.img

boot

grub错误提示

1 : Filename must be either an absolute filename or blocklist
解释 :1号错误表示文件名格式错误。在 GRUB 中要么是以绝对路径给出文件
例子 :
grub> kernel vmlinuz root=label=/
Error 1: Filename must be either an absolute pathname or blocklist
grub>

引用:
2 : Bad file or directory type
解释 :2号错误表示命令期望的是一个普通文件,但相应文件名的对象是一个符号链接、目录、FIFO
例子 :
grub> kernel /testdir root=LABEL=/
Error 2: Bad file or directory type
grub>

引用:
3 : Bad or corrupt data while decompressing file
解释 :3号错误表示解压文件时发生错误。可能是因为这个文件被损坏了

引用:
4 : Bad or incompatible header in compressed file
解释 :4号错误表示压缩文件的头部格式不被兼容或者错误

引用:
5 : Partition table invalid or corrupt
解释 :5 号错误表示分区表无效或者被破坏。这是一个不好的预兆

引用:
6 : Mismatched or corrupt version of stage1/stage2
解释 :6号错误表示 install 命令发现 stage1 和 stage2 的颁布号不被兼容

引用:
7 : Loading below 1MB is not supported
解释 :This error is returned if the lowest address in a kernel is below
the 1MB boundary. The Linux zImage format is a special case and
can be handled since it has a fixed loading address and maximum size

引用:
8 : Kernel must be loaded before booting
解释 :8号错误表示执行 boot 命令之前没有先执行 kernel 命令

引用:
9 : Unknown boot failure
解释 :9 号错误表示未知的引导错误

引用:
10 : Unsupported Multiboot features requested
解释 :10 号错误表示请求 Multiboot header 所要求功能不被 GRUB 所支持。

引用:
11 : Unrecognized device string
解释 :11 号错误表示无法识别的设备字符串。
例子 :
grub> root hd0
Error 11: Unrecognized device string
grub>

引用:
12 : Invalid device requested
解释 :12 号错误表示请求的设备无效
例子 :
grub> root (hd2)
Error 21: Selected disk does not exist
grub> kernel /grub/grub.conf root=LABEL=/
Error 12: Invalid device requested
grub>

引用:
13 : Invalid or unsupported executable format
解释 :13 号错误表示无效或者无法识别的可执行格式
例子 :
grub> kernel /grub/grub.conf root=LABEL=/
Error 13: Invalid or unsupported executable format
grub>

引用:
14 : Filesystem compatibility error, cannot read whole file
解释 :14 号错误表示文件系统兼容性错误,无法读取整个文件

引用:
15 : File not found
解释 :请求的文件无法找到
例子 :
grub> find /grub-noexist/grub.conf
Error 15: File not found
grub>

引用:
16 : Inconsistent filesystem structure
解释 :16 号错误表示不一致的文件系统结构。可能是文件系统结构被破坏了。

引用:
17 : Cannot mount selected partition
解释 :17号错误表示无法挂载指定分区。例如 swap 分区
例子 :
grub> root (hd0,2) 这是一个 swap 分区
Filesystem type unknown, partition type 0x82
grub> kernel /vmlinuz
Error 17: Cannot mount selected partition
grub>

引用:
18 : Selected cylinder exceeds maximum supported by BIOS
解释 :18 号错误表示选择的柱面超过了 BIOS 支持的最大能力。这通常发生在不支持 LBA 模式
的硬盘上。

引用:
19 : Linux kernel must be loaded before initrd
解释 :19 号错误表示执行 initrd 命令前必须先执行 kernel 命令

引用:
20 : Multiboot kernel must be loaded before modules
解释 :20 号错误表示执行 module 或者 moduleunzip 命令前必须先执行 kernel 命令

引用:
21 : Selected disk does not exist
解释 :21 号错误表示选择的磁盘不存在
例子 :
grub> root (hd2)
Error 21: Selected disk does not exist
grub>

引用:
22 : No such partition
解释 :22 号错误表示分区不存在
例子 :
grub> root (hd0,10)
Error 22: No such partition
grub>

引用:
23 : Error while parsing number
解释 :23 号错误表示参数解释错误,希望是一个数值,但参数却是其他类型
例子 :
grub> root (hda,0)
Error 23: Error while parsing number
grub>

引用:
24 : Attempt to access block outside partition
解释 :24 号错误表示尝试访问的 block 超出了分区

引用:
25 : Disk read error
解释 :25 号错误表示磁盘读错误

引用:
26 : Too many symbolic links
解释 :26 号错误表示太多的符号连接(默认最多允许5个)

引用:
27 : Unrecognized command
解释 :无法识别的命令

引用:
28 : Selected item cannot fit into memory
解释 :选择的对象无法被加载到内存中。
例子 :
[root@monitor boot]# dd if=/dev/zero of=vmlinuz-2.4.20-31.9 bs=1024 count=1 seek=1
读入了 1+0 个块
输出了 1+0 个块

[root@monitor boot]#grub
grub> kernel /vmlinuz-2.4.20-31.9 root=label=/
[Linux-bzImage, setup=0x1400, size=0xfffff200]

Error 28: Selected item cannot fit into memory

grub>

引用:
29 : Disk write error
解释 :磁盘写错误

引用:
30 : Invalid argument
解释 :无效参数
例子 :
grub> serial –noarg=0
Error 30: Invalid argument
grub>

引用:
31 : File is not sector aligned
解释 :This error may occur only when you access a ReiserFS partition by
block-lists (e.g. the command `install’). In this case, you should
mount the partition with the `-o notail’ option.

引用:
32 : Must be authenticated
解释 :要求输入口令才能继续进行下面的操作。例如配置文件中有 password 或者 lock 命令
例子 :
password root1234
title DOS
lock
rootnoverify (hd0,0)
chainloader +1

引用:
33 : Serial device not configured
解释 :33 号错误表示串口还没有配置。这一般发生在你执行 terminal serial 的时候

引用:
34 : No spare sectors on the disk
解释 :磁盘自由空间不足。可能发生在把 stage 1.5 嵌入到 MBR 之后的空间的时候。但这部分空间可能已经被分区表使用了

模块接口解惑

软件工程最依托的就是模块接口,所以,早研究为好

window不像linux的gcc编译器,默认把类库中所有函数都开放的。
可以说它更严格。当然gcc也是可以通过
__attribute__((visibility(“default”)))定义成宏开关的方式来放出个别函数和隐藏hidden。
暂且不表,只说:
__declspec(dllimport)——代号A
__declspec(dllexport)——代号B
B的作用是,想导出类和函数,必须用B声明,这样后台就会把要导出东东的声明无声的加入到.obj和编好的dll中。这时.def可有可无了。当然,你不想用B,那就带着.def给别人用吧。

A用的场景本人总结现在有二:
一,前提你是甲方时,即当你的app或者dll要调用别人的类或函数时,修饰用A,告诉编译器,这函数铁定去外面的dll找吧,当然需要外部dll声明了B,与你呼应了。
__declspec(dllexport) void __cdecl Function1(void);
class __declspec(dllexport) MyClass{/*类的定义*/};//
二,前提你是乙方时,当你的的导出类中有静态变量时,需要带着B的修饰,如:
#ifdef SIMPLEDLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
其实还有第三点,就是你为乙方的甲方,会用到丙方,那么带上B的修饰,不会让你头很大。

在讲上面概念时,我没有提显示和隐式链接。防止混淆。当你修饰了接口,那么编译器就知晓了呼应关系,那么自然用隐式链接了。但这不是唯一途径,比如:应用lib和VS配置(程序内声明有同样效果#pragma comment(lib,”XXX.lib”))。

而显示链接时,下面有两平台的代码参考。此时,用不着A,B的修饰了。
//windows
SyncCmd SyncExecute = (SyncCmd)GetProcAddress(hModule, “SyncExecute”);
//linux(使用so非a时)
SyncCmd SyncExecute = (SyncCmd )dlsym(hModule, “SyncExecute”);

另外,提一句,还一个维度在接口声明处,那就是
extern “C”——–模块之间的连接约定———位置在顶头
__cdecl————调用约定关键字——–返回值类型和函数名称之间

vim-ide技巧

乱码问题办法:以本人gvim为环境

set enc=cp936
set termencoding=chinese
language message cp936

export LANG=zh_CN.GBK
export LC_ALL=zh_CN.GBK

:help encoding-values

Image

“ctrl+]”—–光标会自动跳转到定义处
“ctrl+T”—–光标会从定义跳转回来
Tlist——–TagList窗口即出现在左侧
wm———–打开左侧两栏(文件和声明)
ctrl+Tab—–切换到前一个buffer,并在当前窗口打开文件;
ctrl+shift+Tab—切换到后一个buffer,并在当前窗口打开文件;
ctrl+箭头键—–可以切换到上下左右窗口中;
ctrl+h,j,k,l—-切换到上下左右的窗口中。

F12或:A或:AS,AV,AT或点击头文件后,gf
——–源码文件后,按F12即可以在c/h文件中切换,也可以通过输入:A实现.当使用了gf时,用ctrl+O来回退栈。
F3——将光标定位到要查找的内容上,按下F3,确定要查找的内容和搜索范围
F2——光标定位在需要添加书签的地方,按下ctrl+F2,即添加了书签.使用F2在书签之间正向切换,shift+F2反向切换。
Vimgrep Make ./*.c或在目录层vimgrep “content” **/*.cpp——–配合命令Cl,cn,cp,cw,copen,cclose
建立tags——cmd到源码目录,然后执行(本人环境下)“c:\Program Files\vim\vim73\ctags” -R *

sp,vs,vsp让人很爽的分屏

vi 查找忽略大小写
第一种方法:
/abc\c
第二种方法:
set ignorecase (或者简写 set ic)

linux下安装vim,在源光盘的包目录中依次装吧(前缀是vim-)
X11,common,enhanced,minimal

常用操作总结:
定律:

动作后,都进入插入模式
某些动作是返回了位置,前面可再加动作
动作,位置前都可以配合数值

动作:
i—插入–insert                         插入30x–30ix+esc键
I–当前行开始处插入
a–追加–append
x–删除当前,以字符为单位
X–删除之前
d–删除–delete
y–拷贝–copy
p–粘贴–paste
o–下方插行–open
O–上方插行open
u–撤消–undo
U–行撤消–undo
Ctrl+r–重做
c–更改–change
r–替换–replace
R–一直替换–replace,退格键是撤消替换
g–前往(gg文件首,G文件尾,数值G到行首)–go
f–查找–find
F–反向查找(向左)–find
t–到达和F区别于定位位置–to

位置:
w–移向下一个单词词首–word
W–同上,移动间隔不是单词而是字串
b–移向上一个单词词首–begin
B–同上,移动间隔包括了标点和符号
e–移向下一个单词词尾–end
E–同上,移动间隔包括了标点和符号
G–文件尾
^–行首非空字符
0–行首第一字符(同于home键,同于_键)
$–行尾,2$即下一行行尾,注意这是一个包括命令,即包括最后一个字符
hjkl–
H–屏幕范围内的左上角行,zt–headhome
M-屏幕范围内的中间行,zz–middle,大写可就是存盘退出了
L-屏幕范围内的左上角行,zb–last
%–对称符号的匹配定位
月光宝盒:
”–两位置,闪回
配合mark的扩展应用
[]最后修改的位置
Ctrl+o–跳回到更老的地方–older
——-i–跳回到更新的地方相当于tab

列块选择:

Ctrl+v,可视模式开启,在gvim中是使用ctrl+q

               v配合位置,即可选中欲操作的块,用一下o–other end来试试吧
     o    other end
     O    另一个对角
     ~    交换大小写
     U    转换为大写
     u    转换为小写
     r    以某个字符填充
     >    平移
     <    平移
     :set shiftwidth=4    "平移距离
     J    删除选中行的所有换行符
     gv    重复上次的可视选择------------这东东很好用
重复:

;–正向(用于ft,行内查找时)
,–反向(用于ft,行内查找时)
.–重复
屏幕操作:

ctrl+G–查看当前操作的文件和行数

Set ruler

Set number

Ctrl+u–向上滚半屏–up
Ctrl+d–向下滚半屏–down
——-e–向上多显一行one line Extra
——-y–向下多显一行

功能就是把当前行放到屏幕的上中下三个位置:(注此时光标不动所在屏幕动)
z+回车
z+.
z+-
前面都可以加行号码,注意不是行数.

当你想把光标放到屏幕的上下三个位置时(注此时屏幕内容不动,光标位置变化)
H
L

简单查询:
/+所查串正向
+所查串反向
备注:
字符 .*[]^%/?~$ 有特殊含义。如果你要查找它们,需要在前面加上一个
“”。
配合使用:

n,N

/<the>只查找the的句法

%s/old/new/g

简单修改:

x  表示  dl  (删除当前光标下的字符)
X  表示  dh  (删除光标左边的字符)
D  表示  d$  (删除到行尾)
C  表示  c$  (修改到行尾)
s  表示  cl  (修改一个字符)
S  表示  cc  (修改一整行)
.–重复最后一次的修改操作
组合拳:

     操作区域对
     <action>a<object> 和 <action>i<object>
   a是包含,i是inside
  • action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
  • object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:"、 '、 )、 }、 ]。

aw–a word

Is–inner sentence

as–a sentence

q!

e!

w!

Wq==ZZ
~ 大小写
ma 设书签
`a 定位书签
Ey,fb,ud
Set ic 区分大小写
Set autoindent
Set shiftwidth=4 设置缩进
vi一般用法
一般模式                             编辑模式                                     指令模式
h   左                               a,i,r,o,A,I,R,O                           :w   保存
j   下                                 进入编辑模式                                 :w!   强制保存
k   上                                 dd   删除光标当前行                       :q!   不保存离开
l   右                                 ndd   删除n行                                   :wq!   保存后离开
0   移动到行首                 yy   复制当前行                                 :e!   还原原始档
$   移动到行尾                 nyy   复制n行                                     :w   filename   另存为
H   屏幕最上                     p,P   粘贴                                           :set   nu   设置行号
M   屏幕中央                     u     撤消                                             :set   nonu   取消行号
L   屏幕最下                     [Ctrl]+r   重做上一个动作               ZZ   保存离开
G   档案最后一行             [ctrl]+z   暂停退出                         :set   nohlsearch       永久地关闭高亮显示
/work   向下搜索                                                         :sp   同时打开两个文档
?work   向上搜索                                                        [Ctrl]+w   两个文档设换
gg   移动到档案第一行                                        :nohlsearch         暂时关闭高亮显示
Vi同时编辑多文件
Vi -o file1.c file2.c

:e#1

:e#2

如果已经分屏
ctrl+W来切换(配合箭头方向键)

在linux里面遇到多行注释的时候,一个个去点,手有点累。
执行如下命令:
:.,+499 s/^/#/g
.    代表当前光标所在行
+499 和往后的499行
s/^/#/g 在行首加上#
:10,499 s/^/#/g
10   第十行开始
499 到第499行
其他都是一样的
本人根据以上摸索出多行注释的快捷技巧:
同理

:8,11 s/^////g

因为//是需要转义的,所以把//换成上面的#不就行了。同理要想在行首加入任何字符都是OK了。
正则表达式来查找或高亮:/#注释此为查找#(<w+>)_s*1
后台运算:ctrl+R = 2+2*3 enter
执行后看到结果了吧。
缩写替换:ab [缩写] [要替换的文字]
例子:ab asap as soon as possible
当忘记用root方式打开文件时的保存:
:w !sudo tee %
这会以root方式保存
自动补全:ctrl+n
ggVGg?说是能把全文加密,可是在gvim中没效果。
命令行下比较文件不同:
方法一:vimdiff [文件1] [文件2]
方法二:先用VSP,然后在第一窗口,diffthis,记得用diffoff来退出比较。
按时间回退文件:earlier 1m,文件回退到1分钟以前的状态,:later相反的操作
删除标记内文字:di[标记],这个应该是新瓶装老酒,我相信;di[标记]就是带标记删除了。
把VIM变成16进制编辑器:%!xxd成对的退出命令是:%!xxd -r
把内容变成html来高亮显示:%TOhtml或是%Tohtml(gvim是前者有效)

下面两个转来的参考图

Image

Image

Image

书路

一直想把自己的技术书藉名目整理总结一下,不包括那些电子书,需要说明的有一些书只是浅读的.列出来不是显示看过的书有很多,而是即方便将来查阅又可以书会友,有些可以为大家”书透”一下.哥们儿,你看过几本?有推荐的书和写过读书笔记的,欢迎发评论.如果你想借那么想想你拿哪本书和我换.

PS:没准儿,下岗后去开个书摊。

内功:
系统平台:
鸟哥的linux私房菜—基础学习篇
linux疑难排解实用手册

杂书:
正则指引
黑客与画家
Mactalk人生元编程
计算机图形学(opengl版)(第3版)
Opengl编程指南(第7版)传说中的红皮书
Open Scence Gragh三维渲染引擎设计与实践
新机器的灵魂
程序员面试宝典
UML基础案例与应用

数据库:
深入解析Oracle DBA入门
基于Linux平台的Oracle Databse10g管理
Mysql权威指南
Oracle数据库管理与应用系统开发
基于linux的oracle数据库管理
继续阅读书路