Linux notes

ssh keys

An SSH key allows you to establish a secure connection between your computer and server

ssh-keygen -t rsa -C "example@gmail.com"

show the public key

cat ~/.ssh/id_rsa.pub

Copy the key

Windows:

clip < ~/.ssh/id_rsa.pub

Mac:

pbcopy < ~/.ssh/id_rsa.pub

GNU/Linux(requires xclip)

xclip -sel clip < ~/.ssh/id_rsa.pub

参考:https://gitlab.com/help/ssh/README

screen

常用命令

screen -S name    启动
screen -ls        查看screen列表
screen -r name    恢复
  • GNU’s Screen 官方站点:http://www.gnu.org/software/screen/
  • 更多内容参考:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

命令参数

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
参数说明
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

一些网站

开源世界旅行手册


2015-05-17 linux , notes

ASCII Unicode GBK UTF-8字符编码的区别与联系

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为”字节“。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。

开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上0×10, 终端就换行,遇上0×07, 终端就向人们嘟嘟叫,例好遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0×20以下的字节状态称为”控制码”。他们又把所有的空 格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉 很好,于是大家都把这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称”扩展字符集“。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!

等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。 后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS“(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣 们都要每天念下面这个咒语数百遍: “一个汉字算两个英文字符!一个汉字算两个英文字符……”

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么”倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎么办? 真是计算机的巴比伦塔命题啊!

正在这时,大天使加百列及时出现了——一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。 unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从unicode开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在unicode中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。

unicode同样也不完美,这里就有两个的问题,一个是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费,文本文件的大小会因此大出二三倍,这是难以接受的。

unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

Unicode符号范围 UTF-8编码方式
(十六进制) (二进制)
——————————— ——————————————————
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

之前一直对字符编码很模糊,网查资料被忽悠地晕头转向,看完这篇风趣的文章,把之前模糊的知识点串联起来,并稍加总结,我和我的小伙伴们都明白了!

转载:http://dengo.org/archives/901

更多中文编码知识请看:中文编码


2015-05-17 encoding , 编码 , Unicode , UTF8 , ASCII

字库格式介绍

##Bitmap字库 点阵字库是最早被采用的一种数字化字库的格式,每个字形以黑白像素点阵矩阵组成。因随着字号变大,数据量会呈几何级数增长,所以不适于复杂的大字号中文字形显示。但它在描述小字号时有明显的优势,可以加入人工的笔画取舍、合并和变形,是字形尽可能地清楚表达。 随着显示设备分辨率和处理器性能的提高,点阵字已被曲线字所取代,或部分嵌入在曲线字中以提高小字的清晰度。它更多的应用是在低分辨率的设备上,例如手机、掌上电脑、仪器仪表、数码相机、收款机、银行或者邮局的票据打印机等。

##PostScript字库

PostScript 是美国 Adobe 公司发展的一种页面描述语言。所谓页面描述语言,实际上是一种专门的计算机语言用来描述和记录版面上的内容和结构。它以精确的坐标数据,精密的数学公式和规定的格式来定义页面上的各种元素,如文字、色彩、图形图像的位置、形状等等。 PostScript 字形描述技术是用美国 Adobe 公司的 PostScript 页面描述语言来描述字形的一种技术。 CID 字库是美国 Adobe 公司发表的最新字库格式,所有字形描述都采用 PostScript Type 1格式,他具有易扩充、速度快、兼容性好、简便、灵活等特点,这种标准格式保证了跨平台的高质量输出。

##OpenType字库

OpenType 字库是美国微软公司与 Adobe 公司联合开发的用来替换 TrueType 字型的数字化曲线轮廓字库格式。OpenType 字库采用 Unicode 编码,是 TrueType 格式的扩展延伸,扩展了 Adobe CID-Keyed font 技术。它在继承了 TrueType 格式的基础上增加了对 PostScript 字型数据的支持,所以 OpenType 字体中的字型轮廓数据既可以选择在‘glyf’表中 TrueType 格式轮廓,也可以选择在‘CFF’表中的CFF(压缩字体格式,Compact Font Format)格式轮廓。 OpenType 字库信息小,字形可以所以缩放、变形(旋转、倾斜、弯曲)而不失真,具有很强的兼容性及独特丰富的排版特性。

##CID字库

CID(character identifier)字符识别码,总字符集包括了一种特定语言中所有常用的字符,把这些字符排序,他们在总字符集中排列的次序号就是各个字符的CID标识码。CMap(character Map)字符映射文件,将字符的编码映射到字符的CID标识码,再用CID标识码从CIDFont 文件中取到字形信息。 CIDFont文件中不仅存储了字库中所有字符的描述,还包含了字体的提示(HINT)信息,它既能控制笔画的粗细,还能控制笔画之间空白,使解释器在字体比较小,设备分辨率低的情况下,得到细小清晰的笔画复杂的中日韩文字形。

##TrueType

TrueType 是由美国苹果公司和微软公司联合提出的一种用数学函数描述电脑字体轮廓的技术。TrueType 采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,含有字形构造、颜色填充、数学描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。 TrueType 字体的主要特点在于它所见即所得。由于 TrueType 字体是由指令对字形进行描述,因此它与分辨率无关,均以设备的分辨率输出,既可以屏幕显示,又可以打印输出,无论放大缩小,字符总是光滑的,不会有锯齿出现。但是相对 PostScript 字体来说,特别是在文字太小时,其表现质量要差一些。


2015-05-16 font

中文编码

##Unicode编码

Unicode 是基于国际标准化组织(International Organization for Standardization,简称ISO)所制定的 ISO/IEC 10646 ,即通用字符集(Universal Character Set,简称 UCS)的标准来发展,在1991年首次以书本的形式(The Unicode Standard)对外发布。 Unicode 的编码方式与 ISO 10646 的通用字符集(UCS)概念相对应,使用16位编码空间。16位Unicode字符构成基本多文种平面(Basic Multilingual Plane,简称BMP),最多可以表示65536个字符。基本满足各种语言的使用。最新的 Unicode 版本定义了16个辅助平面,两者合起来达到32位编码空间,可以涵盖一切语言所用的符号。目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字中。

##GB2312 编码

GB 2312-80 编码是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集基本集》标准号为GB 2312-80(GB是“国标”二字的汉语拼音缩写),由中华人民共和国国家标准总局发布,1981年5与1号发布,1981年10月1日实施。它是一个简化字汉字的编码,通行于中国大陆地区及海外使用简体中文的地区(如新加坡等)。 GB 2312-80 收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母、共7445个图形字符。其中汉字以外的图形字符682个,汉字6763个。 GB 2312-80 把收录的汉字分成两级。第一级汉字是常用汉字,计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字,计3008个,置于56~87区,按部首/笔画顺序排列。字音以普通话审音委员会发表的《普通话异读词三次审音总表初稿》(1963年出版)为准,字形以中华人民共和国文化部、中国文字改革委员会公布的《印刷通用汉字字形标》(1964年出版)为准。

##GBK编码

GBK 编码标准,全称《汉字内码扩展规范》(GBK),英文名称 Chinese Internal Code Specification,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制定,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函[1995]229号文件的形式,将它确定为技术规范指导性文件,发布和实施。这一版的GBK规范为1.0版。GB即“国标”,K是“扩展”的汉语拼音第一个字母。 GBK向下与GB 2312编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过度过程中的一个承上启下的标准。 GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。

##GB 18030编码

GB 18030有两个版本:GB 18030-2000和GB 18030-2005. GB 18030-2000是GBK的取代版本,它的主要特点是在GBK的基础上增加了CJK统一汉字扩充A的汉字,GB 18030-2005的主要特点是在GB 18030-2000基础上增加了CJK统一汉字扩充B的汉字。 GB 18030-2000,全称《信息技术 信息交换用汉字编码字符集 基本集的扩充》,中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17号发布。GB 18030-2000共收录27533个汉字。 GB 18030,全称:国家标准 GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现在最新的内码字符集,是GB 18030-2000的修订版。GB18030-2005 共收录汉字70244个。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施。此规格为在中国境内所有软件产品支持的强制规格。

##BIG 5字符集

BIG-5 码是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。 BIG-5 码收录13468个符号和汉字,符号408个,汉字13060个,分为常用字和次常用字两部分,各部分中的汉字按照笔画/部首排列。其中:常用字5401个,次常用字7659。

##GB/T 12345编码

GB/T 12345-90 编码全称《信息交换用汉字编码字符集 辅助集》,标准号为GB/T 12345-90,1990年6月13日发布,1990年12月1日实施,是一个关于繁体字的编码标准。所谓“辅助集”,是与“基本集”(GB2312-80)相对应而言。即:GB/T 12345 是与GB2312相对应的图形字符集。原则上,本字符集是将GB2312中的简化字用相应的繁体字替换而成。因此,这些替代的繁体字具有与被替代的简化字相同的编码;未曾简化的汉字以及非汉字图形字符,仍是GB2312中的汉字和图形字符,并具有与之相同的编码。 GB/T 12345-90 共收录7583 个图形字符。汉字以外的图形字符716个,汉字6866个,其中一级汉字3755个,二级汉字3008个,增补汉字103个。 关于繁体字替换简化字的原则,GB/T 12345 注明:“本标准原则上按照《简化字总表》中所列繁体字与简化字的对应关系进行替换。”《简化字总表》由中国文字改革委员会1964年5月发表,后经国家语言文字工作委员会作个别修改,国务院1986年6月4号批准发表。

##748编码

748编码仅用于方正软件和系统,不做介绍


2015-05-15 encoding

msi笔记本型号对比

最近看笔记本,有一同学十分钟爱MSI的笔记本,于是乎就查阅了一下该笔记本的型号,顺手做一下笔记。以下就是MSI(微星)游戏笔记本常见型号,命名的解释。

##GE系列 入门级 体积与效能的平衡点 高端性价比

GE是主打影音系列,属于体积与效能的平衡点,体积并不会像GT或GX那样的庞大,不过仍有不错的效能。也可以说是入门级别的游戏本,主要是价格相对便宜。其中CPU可以自行更换,显卡为焊死在主板上的无法更换,单2.5寸硬盘位(SATA3接口)+单MSATA硬盘位(SATA3接口,主要用于MSATA接口的SSD升级)。相比GT和GX系列重量较轻,便携,因空间较小所以CPU和显卡及散热风扇为一体式设计,散热略差。 GE适合普通大学生用的,高端性价比选择,使用中端显卡,入门电竞规格,价格普遍便宜6000–9000左右。 GE可以上PCIE接口的SSD硬盘,不能再上另一块机械硬盘。但是GT本身是二个硬盘位,是可以上二块机械硬盘。GE散热是三根铜管,GT系列有五根散热导管。

##GS系列 超级本 GE基准的轻薄本 性能中高

GS 是以GE为基准再更加的轻薄,非常轻薄性能中高,配置和GE差不多,价格好像是13000左右,想要金属质感与薄型就买GS70。

##GT系列 发烧级游戏本 极致的规格、粗壮的体格加上高昂的价格

GT是主打游戏系列,纯种的高端发烧游戏本,档次从中到高都有,价格也相对贵些。简单来说就是极致的规格、粗壮的体格加上高昂的价格。其中CPU和显卡均可自行更换,升级性和扩张性好。 双2.5寸硬盘(SATA2+SATA3),支持RAID 0,同时支持微星独家的SUPER RAID技术,需通过微星独家的RAID卡实现,也因此牺牲了一个SATA3的硬盘位。相比GE系列重量较重,得益于大空间,散热为CPU独立散热+显卡独立散热+单风扇双风道设计,散热较好。特色功能有一键超频,另外丹纳音箱和赛睿的七彩背光键盘也很拉风。GT是一般都是目前顶级的显卡CPU,玩游戏最好,10000-30000W左右

##GX系列 中高级 AMD处理器 着重于GPU的效能

GX是主打单机游戏系列,奇葩的3A组合,显卡暴强而U爆弱,价格介于GE和GT之间。主要着重于GPU的效能(使用AMD的顶级显卡),CPU是使用中间的规格(像GX*40的Core i5,或是现在的AMD),所以价格又比GT系列来的更便宜。其中CPU和显卡均可自行更换,但是目前5750M已经是这台平台的最顶级U了,下代平台据说要更换新的接口了,7970M貌似可以升级8970M,有待验证。AMD的芯片组支持多SATA3,所以GX系列是双SATA3硬盘位+光驱位也是SATA3,同时也支持微星独家的SUPER RAID技术,需通过微星独家的RAID卡实现。GX系列外观和GT系列基本相同,内部构造则完全相同,得益于AMD平台的良好温控,散热是G系列里面最好的。GX是3A平台,虽然显卡是顶级的,但是CPU特差,玩一些网游和吃CPU的游戏直接跪,价格比GT便宜一些8000–10000。

##GP系列 以GE系列为基准将GPU降规来达到便宜的目的

GP最入门级的, GP系列以GE系列为基准将GPU降规来达到便宜的目的,纯粹是文书机,挂上G系列其实是来乱的。 如果你是土豪就用GT70 红龙吧,顶级CPU+780M顶规显卡,而且还可以上双显卡。优点是绝大部分游戏可Full HD特效全开且音质很棒,搭配多彩背光电竞键盘及杀手网卡与耳机强化输出。缺点是这机器至少3.5kg以上,此外变压器也很大颗,


2015-05-11 msi , laptop

Vim小技巧

这篇文章主要总结了我在使用 Vim 过程中遇到的一些问题及解决方案,都是一些比较零碎的内容,如果要看 Vim 系统的内容可以参考之前的几篇文章。

查看 Vim 使用的配置

在 vim 中输入

:script 来查看 Vim 加载使用的配置

查看 Vim 的版本

:version 来查看 Vim 的版本

在有一次使用 Vim 的时候总是无法将 Vim 选中的内容和系统粘贴板用到一起 "+y"+p 根本无法使用,后来经过网上一查, 通过 :version 一查才知道原来本地安装的 Vim 版本根本没有把 clipboard 支持编译进去。所有有的时候遇到问题第一时间检查一下版本还是比较重要的。

查看 Vim 中所有的快捷键映射

使用 :map 来查看当前 Vim 配置中所有的快捷键映射。

列选

  1. 进入 Visual Block Mode Ctrl + V
  2. 选中编辑的列
  3. Shift + i 进入编辑模式 Insert Mode
  4. 输入编辑
  5. esc 两次

批量缩进代码

如果使用VS,或者IDE的同学应该都知道,如果要批量缩进代码,在这些IDE中都能够选择+tab键实现,而Vim中则不太一样,之前困扰我很久,现在终于有了解决方案。在之前的文章中已经提到了Vim的模式,现在我们要用到其中的一种—-选择模式。

批量缩进代码的方式如下:

  • 按下 v , 进入选择模式
  • j/k 移动光标选择需要缩进行
  • 按一次> 缩进一次,按 < 回缩

如果是需要选中的行数比较多可以使用 数字num+j 方法移动num行,对于有括号 { } 的方法,例如

function functionName(){
// a lot of code
}

则可以使用 % 进行括号匹配, 按下 v 进入选择模式,将光标移动到 { ,按下 % ,Vim自动找到匹配的括号并选择该函数,利用 > 即可缩进该函数。

那么,其实单行缩进就是两个大于号 >> , 回缩就是两个小于号 <<

不重启使vimrc文件生效

在学习阶段,我经常改动vimrc文件,而每一次改动就要重启一下Vim,甚是烦恼。偶然间看到Google Group中有人讨论一些无关紧要的问题,其中看到写了不重启使vimrc文件生效的代码,尝试一下确实可行,做一下记录:

在命令模式下运行
:so #MYVIMRC
去帮助查看so,其实so是source的缩写

当然你也可以在vimrc文件中加入

"编辑vimrc之后,重新加载
autocmd! bufwritepost _vimrc source $VIM/_vimr

这样每一次保存vimrc文件就自动加载vimrc文件,使之生效。而如果在vimrc文件中存在函数,可能会遇到vim警告“函数 已存在,请加!强制替换”,同样讨厌,虽然作为新手的我还不知道为什么出现这些警告,但总之解决方法就是把vimrc中的函数全部定义成 function! 这种形式。但其实那些警告不影响效果,不定义成 function! 也行,但是很烦人。

均匀插入空行

均匀的在行与行之间插入空行,原先的空行保留。

Vim 的 :g 命令就是为类似的任务设计的,给每一行运行单独的命令。使用如下命令完成目标:

:g/.\n\n\@!/norm o

正则匹配 /.\n\n\@!/ ,拆分成不同部分来解释:

  • . 匹配行中所有字符。(这个例子中用来排除空行)
  • \n 匹配行末尾
  • \n\@! 如果有连续两个换行则匹配失败

用命令 :h E59 查看 \@! 更多信息。我们使用 :g 命令正则匹配到符合规则的行之后,我们告诉Vim执行 norm o ,也就是 Normal Mode 下的 o 命令,也就是在当前行下插入空行。

总结来说,这行命令匹配所有下一行不是空行的行,然后在他们下面增加一行空行。通过这个例子,你也许想要查看一下vim的wiki Power of G 来学习一下 :g 命令,已经它的姐妹命令 :v

This note is taken from superuser

从 vim 中复制到粘贴板

使用 shift+v 选中几行内容之后,如果只使用y 无法复制到系统的粘贴板中,此时在选中的情况下输入 "+y , 即可将所选内容复制到粘贴板。注意需要输入的是:引号+加号+ 小写y。

而这样做需要输入三次,可以使用 map 绑定到喜欢的快捷键上,比如:

vmap <C-c> "+y

这一行配置的含义就是在可视模式下,Ctrl+c,就是将所选择内容复制到粘贴板。 但是需要注意的是如果运行 :echo has('clipboard') 返回的结果是0,那么这个方法就没用,因为该版本的 vim 在编译的时候没有将 +clipboard 加入。

同理,如果想要从系统粘贴板中粘贴内容到 vim 中,使用 "+y or "*y, 引号+加号+y,来从系统粘贴板中将内容粘贴到 vim 中。

NERDTree Tip

Vim 中极好用的文件管理插件,用了也有一些时间了,但是有些内容并没有仔细地看,今天突然有些需求就看了一下。常用的 NERDTree 命令有:

  • o 打开或关闭文件或目录
  • i 在水平分割的新窗口打开文件
  • s 在垂直分割的窗口中打开文件
  • t 在新标签页中打开文件
  • j/k 移动
  • J/K 到第一个或者最后一个节点
  • ? 帮助菜单

创建目录与文件

打开 NERDTree,在 NERDTree 中使用m 然后选择a,来创建文件或者文件夹,要创建文件夹只需要在输入的名字后面加上/

删除文件与目录

同理,在 NERDTree 中按下 m 会由很多选项可选,使用 d 就可以删除结点,也就是删除文件或者文件夹。

显示隐藏文件

在 NERDTree 中使用Shift+i 来显示隐藏文件。

vim 删除偶数行

使用命令:

:g/^/+d

:g 命令在所有匹配正则的行上执行

:g/LinesMatchThisRegex/ExecuteThisCommand

举例:

:g/hello/d

以上命令会删除所有包含 “hello” 的行

而与此同时 :%s 仅仅提供正则的搜索和替换,命令最后的 g 表示全局,整个文件中

:%s/hello/world/g

因此该命令会替换文中所有的 hello 为 world.

:%s 中的 s 表示替换 (substitute) , 而 % 表示整个 buffer. 因此 :%s 表示从整个文件 buffer 中替换, :%s 还可以指定行范围:

:10,15s/hello/world/g

搜索并替换10至15行中的 hello 为 world.

快速移动

在 vim 中移动 hjkl, 左下上右移动光标已经不用多说, wb,向后向前移动一个 word。

gg 移动到第一行, G 移动到最后一行,这是最基本的,也可以使用 nG 来移动到第 n 行。

翻页技能,使用 Ctrl D 向下移动半页, Ctrl U 向上移动半页

Ctrl B 向上翻页, Ctrl F 向下翻页

* 号用来向下查找整个单词

# 号用来将光标移动到上一个在光标下的字符,比如光标正在单词 String 上,使用 # 来向上查找上一个 String。

% 百分号用来在匹配的括号之间跳转。

fx 光标跳转到下一个 x 位置,可以用来快速跳转到下一个预期的字符 x

Fx 向前跳跃到字符 x 位置

tx til 下一个 x,光标在 x 前面

Tx 上一个 x

让vim支持系统粘贴板

sudo apt install vim-gnome

配置 leader

配置的 leader 要在 map 之前

let mapleader = ","
let g:mapleader = ","

Vim 自动保存

使用现在的配置有一段时间了,不过最近有一篇文章,因为没有使用 Vim 的保存,而丢失了部分,所以想到了 Vim 应该能够自动保存的。再我丢失部分为保存内容的时候,我想起了 Vim 的 swp 文件,可惜的是我再 vimrc 配置中禁用了 swp 文件

set noswapfile

所以丢失了swp文件的我,依然找不回来丢失的内容。网上大致搜了一下,真的有解决方法,在 vim 丢失 focus 的时候自动保存

:au FocusLost * silent! wa

把这句话放到 vimrc 中,保存。另外一种方法就是 autocmd CursorHold * update 这种方式我还没有尝试。

在插入模式下移动 {#move under insert mode}

前段时间听到一个问题:“Vim如何在插入模式下移动?“,一开始听到这个问题的时候,我有点楞,但是对于这个问题,我开始相信有解法的,毕竟 Vim remap 还是很强大的,大致搜了一下,大部分的答案是使用 imap <C-n> <Down> 这样将 Ctrl + n 来映射到向下移动,但直到我看到了这样一则评论:

Vim is designed for navigation to be done in normal mode and text insertion to be done in insert mode. You will be much happier and more productive in the long term if you learn to use Vim the way it was designed to be used instead of fighting it. If you try it for a while and find you really don’t like a moded editor, you may want to try Emacs. It is another very powerful editor, but lets you navigate and edit without changing modes. – garyjohn Jan 7 ‘13 at 7:05

顿时我恍然大悟,Vim 设计的一大准则就是将文本的移动放到了 normal mode 中,只有插入文本的时候才会进入 insert mode。而对于这个问题,其实本质上是对 Vim 设计的挑战。所以才有了 Emacs,可以在不切换模式的情况下在编辑器中快速移动。我平时在使用的时候,其实这个需求也很少,并且 ESC ,从插入模式到Normal mode 也不是很难的操作,所以对于我来说还好,不过可能对于许多刚刚接触 Vim ,并且对以前无模式编辑器使用比较深入的人来说,可能是一个比较难越过的坎。

不过 Vim 在 Insert mode 下还是有两个比较常用的快捷键

  • 在插入模式下,删除该行当前输入的文字,通过 `:help i_CTRL-U` 查看帮助
  • 在插入模式下,删除光标前的word, 通过 `:help i_CTRL-W` 查看帮助

参考配置


2015-05-08 vim , tips

Vim 学习笔记2: 组合命令

Vim 学习笔记进阶版,初级版可以参考这篇文章

这篇文章主要分为替换操作,多窗口操作,Vim 的 Tab 操作,以及Visual mode 命令模式等等。

组合命令 combine command

Vim 所有的操作都是原子化的,将操作组合起来能够实现非常快捷的Input

.    (dot) will repeat the last command 点命令重复上一个命令
n<commmand>    will repeat the command n times 将命令重复 n 次

for example:

2dd    will delete 2 lines
3p 	   will paste the text 3 times
40idesu [ESC] will write "desu " 40 times
5w     向后移动5个单词
6j     向下移动6行

Vim 还支持另一种组合

di"   光标在引号内, (d)elete (i)nside "  删除在引号之间的内容
yi(   光标在括号内, (y)ank (i)nside ()  复制在()中的内容
vi]   光标在中括号内, 选中[] 内的内容
dtx   向后删除字符直到遇到第一个 `x` 字符, (d)elete (t)ill x
ytx   先后复制内容直到遇到第一个 `x` 字符

文件中快速跳转

NG    go to line N, N is a number, like 23G means go to line 23
:x    跳转到第 x 行 x为行号
gg    shortcut for 1G - 跳转到第一行
G     跳转到最后一行

标记和宏 macro

ma    将当前位置标记为a,26个字母都可以作为标记,`mb`, `mc` 等
'a    跳转到 a 标记位置
qa    将所有的键盘操作录制下来,直到再次在命令模式按下 <kbd>q</kbd>, 并存储在 <kbd>a</kbd> 中
@a    执行刚刚记录在 <kbd>a</kbd> 中的键盘操作
@@    执行上一次 macro 操作

宏命令是 Vim 中最神奇的操作之一,需要慢慢体会,关于宏命令可以参考这篇

批量替换

在全文中用一个单词替换另外一个单词

:%s/想要被替换的字串/新字串/g g模式全局替换
  • ”%” 范围前缀表示在所有行中执行替换,%为当前文件, 相当于:1,$s/,如果不加 % 则表示在当前行中
  • “g” 标记表示替换行中所有匹配点。

替换的语法为::[addr]s/源字符/目的字符/[option]

[addr] 表示检索范围, 省略表示当前行。

  • :n1,n2s/word1/word2/g 从 n1 行到 n2 行,替换 word1 为 word2 全局替换
  • :%s/ = :1,$s/
  • :.,$/word1/word2/g 从当前行到尾行

s: 表示替换操作

[option]表示操作类型

  • g 全局替换
  • c 确认,如果加上 c 选项,每次都需要确认 confirm
  • p 逐行显示结果

省略 option 时只对每一行的第一个匹配串进行替换

删除所有空行

:g/^$/d

删除所有空白行和空行

:g/^[ ][ ]*$/d

在每行开始插入两个空白

:%s/^/  /

在接下来5行末尾加入"

:.,5/$/"/

多窗口操作

新建与关闭窗口

在 Normal 模式下使用以下命令新建窗口

:split 			水平分割窗口,内容一样
:10split 		水平分割窗口,新窗口高度10行
:split filename 窗口中打开新文件
:new 			功能和split一样
:sp 			split 缩写
Ctrl-w s,v 		分割窗口的快捷方式,s水平分割,v垂直分割
:vsplit 		垂直分割窗口,简写 :vs
Ctrl-w c 		关闭当前窗口

窗口间移动

Ctrl-w h,j,k,l    Ctrl按下,按下w 松开,Ctrl松开,按hjkl 对应左下上右

移动窗口

Ctrl-w H,J,K,L    大写HJKL,移动窗口

窗口最大化

Ctrl-w o    让当前文件占据整个窗口

调整窗口大小

Ctrl-w < > 调整窗口宽度,<缩小当前窗口宽度,向左扩展一列,>增加当前窗口宽度,向右扩展一列。当然 Ctrl-w 之后可以使用 n+< 调整多列宽度 Ctrl-w - + 调整窗口高度

在使用 Nerd tree 插件后,可以使用 Nerd tree 内置的快捷键,在 Nerd tree 中

  • i split 一个新窗口打开选中的文件,并跳转到该窗口
  • s vsplit 一个新窗口打开选中文件,并跳到该窗口

Tabs

在 Vim 中 Tab 和 Windows 是不一样的概念,如果平时使用 Chrome 或者 Firefox,就很好理解 Tab,在 Vim 中每一个 Tab 能够包含多个窗口。

Create New tab

有很多方法可以创建新 Tab , 这里是最简单方式:

:tabnew 	create a empty new tab
:tabedit {file} 	edit specified file in new tab

Manage tabs

Some ways to close tabs:

:tabclose 	close current tab
:tabclose {i} 	close i-th tab
:tabonly 	close all other tabs

Some ways to move tabs:

:tabm 0 	move current tab to first
:tabm 		move current tab to last
:tabm {i} 	move current tab to position i+1
:tabs 		list all tabs including their opening windows

Ways to move between tabs:

:tabn 		go to next tab
:tabp 		go to previous tab
:tabfirst 	go to first tab
:tablast 	go to last tab

While in normal mode, you can type:

gt 			go to next tab
gT 			go to previous tab
{i}gt 		go to tab in position i

修改文本

Insert模式下

<BS>  退格键,删除光标前
<Del> Delete键,删除光标后
<C-W> 删除一个单词
<C-U> 删除光标前的字符,保留光标之后的文本,保留行首的缩进,只删除第一个非空字符至光标位置之间的文本。

可视Visual mode

v 按字符选择,在Normal mode下按下v进入Visual mode
V 按行选择
Ctrl+Q 块选择,Windows下,其他平台下Ctrl+V

选择字符之后操作

d 剪切选择内容到剪贴板
y 拷贝选择内容到剪贴板
c 剪贴选择内容到剪贴板并进入Insert mode

命令模式

:! command 暂时离开 vi 到命令模式下执行 command

把命令的结果读入 Vim

在命令模式下,可以不离开 Vim 进行操作,但如果想要把命令的结果粘贴到 Vim 中,就需要使用 read 命令

:read !ls -al

Vim 会在当前光标处插入命令执行的结果。

增减数字

将光标停在数字上,Vim 中 Ctrl + X 会将数字减1, 而 Ctrl + A</kdb> 能将数字加1 ,默认为8进制。

Other

:verbose set tabstop?    in Vim, it will tell you where the tapstop option value is coming from
:help + command  查看Vim命令的帮助,比如想要查看 c 命令的帮助直接使用 `:h c` 就能查到。
g <C-g>  单词统计

差不多看到这里就能够直接看文档了:http://vimcdoc.sourceforge.net/ 通过文档学习更多符合自己使用习惯的命令或者操作。

还有一些参考资料

reference


2015-05-07 vim , command , linux , editor

Vim 学习笔记

Vim 入门及简单使用,包括简单介绍 Vim 模式,移动,和编辑命令。

模式切换 Change between modes

如果你不知道Vim 的各种模式,可以参考Vim 模式

Insert -> Normal : ESC/Ctrl-[
Insert -> Command : (Insert -> Normal) -> :

Normal -> Command : :
Normal -> Insert : iIsScCoO
Command -> Normal : Enter

插入模式

i 进入 insert mode,在光标为之前进入插入模式
I 行首非空字符前插入 , I 等同于 `^i`
s 删除光标下字符,并进入insert mode, 等同于 `cl`
S 删除光标所在一行,并进入insert mode行首 , 等同于 `^C`
a 光标之后进入insert mode
A 光标移动到行尾并进入insert mode , 等同于 `$a`
o 在光标下一行插入一行,并进入insert mode , 等同于 `A<CR>`
O 在光标上一行插入新行,并进入insert mode , O 等同于 `ko`
C 删除光标后到行尾内容,并进入insert mode , C 其实等同于 `c$` 
cc 删除行,并进入插入模式

replace mode

按如下两个按键进入替换模式:

r replace the letter under cursor
R replace under cursor till you press Esc

move

简单的移动

    k
    ^
h <   > l
    v
    j

advanced Move

在Vim中,Word有两种含义,开始我也没搞明白,过了很久才渐渐明白。广义的 WORD 可以是任何两个空格之间的内容,比如 this is a word ,就是四个大写的 WORD 。侠义的 word ,英文单词、标点符号和非字母字符都被当成一个字。如$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、\、<、>、/等,均被当成是一个字。

举例说明,比如 sub-directory 就是两个 word 但是是一个 WORD 。关于 word 的参考可以见word ,一般情况下记住大写的 WORD 是空格分割的词就行。

Vim中使用大写命令一般将字作为广义,小写命令就是作为侠义对待。命令都是成对出现,w 和 W,b 和 B,e 和 E:

w 词向后移动
W WORD is splited by space
b 词向前移动
B WORD向前移动
e 移下一个单词词末
ge 前一个单词词末
E 如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。
0 光标移动到行首
^ 光标移动到行首非空白字符
$ 光标移动到行尾非空白字符
g_ 光标移动到行尾,包括空白字符

以下命令可以用来翻页

Ctrl+f  下一页
Ctrl+b  上一页
Ctrl+d  下半页
Ctrl+u  上半页
H       Move to first letter on top of screen
M 		Move to first letter on middle of screen
L 		Move to first letter on bottom of screen

行内移动 move inline

fx  向前查找本行中的字符x, 比如想要移动到下一个双引号时,可以使用 `f"` 来实现行内快速移动
F   向左查找

复制粘贴 Copy/Paste

p   光标之后粘贴 (p)aste
P   paste before the cursor
yy  复制当前行
y   Yank 复制. Example: yw (yank word) 光标停留到词第一个字母上 yw 复制单词
y0  copy the data from cursor to begining of the line
y$  copy the data from cursor to end of the line

删除 delete

x   删除光标下单个字符,将其放到粘贴板,剪切
X   向前删除一个字符,相当于 Backspace
dd  删除光标所在一行,并把该行复制
dw  删除光标所在词 (d)elete (w)ord
d0  删除光标到该行最前
d^  删除光标到行首非空白字符
d$  删除光标到该行最后
J   删除光标所在行的换行符

剪切x ,删除dd ,dw用的情况还挺多的。

在插入模式下删除

在 Vim 插入模式下可以使用下面的命令来删除字符、单词或者行

<C-h>    向前删除一个字符
<C-w> 	 先前删除一个单词
<C-u>    删除至行首
<C-k>    删除至行尾

这 bash 的快捷键一致

撤销/重做 redo

u   撤销上一次编辑 undo
<C-r> Ctrl-R redo

搜索与替换 search replace

/pattern  - 正向搜索,从光标处开始向文件末搜索
?pattern  - 反向搜索,从光标处开始向文件首搜索
n  - 下一个,往下执行搜索命令
N  - 上一个
*  - Word under cursor - forward (bounded)
g* - Word under cursor - forward (unbounded) 不包含单词边界 `\<\>`
#  - Word under cursor - backward (bounded)
g# - Word under cursor - backward (unbounded)
:s/p1/p2/g -将当前行中所有p1均用p2替代
:n1, n2s/p1/p2/g -将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g -将文件中所有p1均用p2替换

Load/Save/Quit/Change File

:e <path/to/file> open file
:w save
:saveas <path/to/file> save to <path/to/file>
:x, ZZ or :wq save and quit (:x only save if necessary)
:q! quit without saving. :qa! to quit even if there are modified hidden buffers
:q! 放弃修改之后可用 :e! 恢复修改 :e! 为放弃为保存的修改

Other

gg     移动光标到文件开头
G      移动光标到文件末尾
Ctrl-]
Ctrl-O 跳转到上一个位置
Ctrl-T 标签退栈

参考


2015-05-06 vim , linux , command

Vim插件Vundle

简单介绍

Code Rush推荐,之后又陆陆续续看到很多在使用这款插件,所以在入门插件的时候就第一个安装了此插件,VIM如果不依靠插件来增强功能可谓鸡肋。而VIM提供的插件又很多,新手可能无从下手。幸好让我接触到了这个Vundle插件,Vundle用来安装,管理其他插件,这样以后安装插件卸载插件的问题就迎刃而解了。用Vundle管理插件有以下好处:

  • 自动下载安装插件
  • 自动更新插件
  • 只需要保存一份配置文件即可在新环境下安装所有插件
  • 自动清理没用的插件

安装

下载地址

https://github.com/gmarik/Vundle.vim

Mac和Linux安装

  1. 安装git客户端 Mac和Linux一般默认已经安装

  2. 下载并安装Vundle

     git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    
  3. vimrc配置

    把以下的配置放到vimrc最前面

     set nocompatible              " be iMproved, required
     filetype off                  " required
    
     " set the runtime path to include Vundle and initialize
     set rtp+=~/.vim/bundle/Vundle.vim
     call vundle#begin()
     " alternatively, pass a path where Vundle should install plugins
     "call vundle#begin('~/some/path/here')
    
     " let Vundle manage Vundle, required
     Plugin 'gmarik/Vundle.vim'
    
     " The following are examples of different formats supported.
     " Keep Plugin commands between vundle#begin/end.
     " plugin on GitHub repo
     Plugin 'tpope/vim-fugitive'
     " plugin from http://vim-scripts.org/vim/scripts.html
     Plugin 'L9'
     " Git plugin not hosted on GitHub
     Plugin 'git://git.wincent.com/command-t.git'
     " git repos on your local machine (i.e. when working on your own plugin)
     Plugin 'file:///home/gmarik/path/to/plugin'
     " The sparkup vim script is in a subdirectory of this repo called vim.
     " Pass the path to set the runtimepath properly.
     Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
     " Avoid a name conflict with L9
     Plugin 'user/L9', {'name': 'newL9'}
    
     " All of your Plugins must be added before the following line
     call vundle#end()            " required
     filetype plugin indent on    " required
     " To ignore plugin indent changes, instead use:
     "filetype plugin on
     "
     " Brief help
     " :PluginList       - lists configured plugins
     " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
     " :PluginSearch foo - searches for foo; append `!` to refresh local cache
     " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
     "
     " see :h vundle for more details or wiki for FAQ
     " Put your non-Plugin stuff after this line
    
  4. 安装插件

    启动vim,并运行:PluginInstall

Windows下安装

查看官方教程,官方的教程有点问题,完全按照所写配置并不能成功。

vim74     #主程序目录 对应变量 $VIMRUNTIME
vimfiles  #配置文件目录 对应变量 $VIM	
  1. 同样需要Git,并且需要Curl

  2. 下载安装msysgit,add Path to your environment.安装过程中选择Run git from Windows command prompt option安装完成之后在终端运行git --version,如果出现类似以下情况即可:

     C:\> git --version
     git version 1.7.4.msysgit.0
    
  3. 设置Curl

    以下内容保存成curl.cmd,并存到msysgit安装目录中C:\Program Files\Git\cmd\curl.cmd,在终端运行curl --version出现以下类似内容即可:

     C:\> curl --version
     curl 7.21.1 (i686-pc-mingw32) libcurl/7.21.1 OpenSSL/0.9.8k zlib/1.2.3
     Protocols: dict file ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
     Features: Largefile NTLM SSL SSPI libz
    
  4. 因为Windows下和mac,linux环境不同,vim的配置地址也不同,所以git clone到的目录如下:

     git clone https://github.com/gmarik/Vundle.vim.git vimfiles/bundle/Vundle.vim
    
  5. _vimrc

    需要将Mac和Linux中相应位置代码修改成如下代码:

     " 配置同Mac,只需要按照下面修改rtp的路径即可
     set rtp+=$VIM/vimfiles/bundle/Vundle.vim/
     let path='$VIM/vimfiles/bundle'
     call vundle#rc(path)
    

使用

使用方法很简单,只需3步使新插件生效即可

  1. 将目标插件配置进vimrc或vundle_vimrc
  2. 执行:PluginInstall
  3. 重启

常用命令

:PluginList       - 枚举已安装的插件列表
:PluginInstall    - 安装插件或者后面加上'!'更新
:PluginUpdate     - 更新插件 同 :PluginInstall!
:PluginSearch foo - 查找插件。例如查找名称为foo的插件。或者后面加'!'更新本地缓存
:PluginClean      - 清理无用插件或者后面加'!'自动清理

更多使用方法查看帮助 :h vundle

参考:


2015-05-04 vim , vim-plugin , vundle

Vim模式

Vim 是一种多模式的编辑器,不同于一般的编辑器,进入便是编辑模式,可以在编辑模式下对文本进行各种编辑,Vim 进入之后是在普通模式(Normal mode) 下。

基本模式

普通模式 Normal mode

在普通模式中,用户可以执行一般的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反 (大多数编辑器默认模式为插入模式)。

Vim 强大的编辑能力中很大部分是来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令”dd”删除当前行,但是第一 个”d”的后面可以跟另外的移动命令来代替第二个”d”,比如用移动到下一行的”j”键就可以删除当前行和下一行。另外还可以指定命令重复次 数,”2dd”(重复”dd”两次),和”dj”的效果是一样的。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活 组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。

在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按”a”(append/追加, 光标移动到行尾并进入插入模式)键或者直接使用”i”(insert/插入)键进入。

插入模式 Insert mode

在普通模式下按下 “i” 键进入, 在这个模式中,大多数按键都会向文本缓冲中插入文本。这是大多数文本编辑器的默认模式,也是大多数新用户希望文本编辑器编辑过程中保持的模式。但是 Vim 的设计哲学告诉我们,只有在真正输入文本的时候进入该模式,否则立即按下 ESC 退出到普通模式。

在插入模式中,可以按ESC键回到普通模式。

可视模式 Visual mode

在普通模式下按下 “v” 键进入,使用“V”可按行选择, 这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到 这块高亮的区域上。Vim的”文本对象”也能和移动命令一样用在这个模式中。

  • v命令进入的字符可视化模式(Characterwise visual mode)。文本选择是以字符为单位的。
  • V命令进入的行可视化模式(Linewise visual mode)。文本选择是以行为单位的。
  • Ctrl-V进入的块可视化模式(Blockwise visual mode)。可以选择一个矩形内的文本。(注意:在Windows中,Ctrl-V可能已经被影射为粘贴操作,可以使用Ctrl-Q进入块可视化模式。)

在 Vim 中使用如下命令查看更多官方帮助

:h 04.4

选择模式 Select mode

这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。选择模式与可视模式相似,这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。选择模式更多在 MS-Windows 中用到,其他系统如需启动选择模式,首先需要激活:

:set selectmode+=mouse

在 Vim 中使用如下命令查看更多官方帮助

:h 09.4

命令行模式

在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(”:”键),搜索(”/”和”?”键)或者过滤命令(”!”键)。在命令执行之 后,Vim返回到命令行模式之前的模式,通常是普通模式。

常用的命令模式有替换和搜索,比如使用 :%/a/b/g 将文本中所有的 a 替换成 b。

或者使用 /abc 来搜索文本中的 abc 字符串

Ex模式

这和命令行模式比较相似,在使用”:visual”命令离开Ex模式前,可以一次执行多条命令。我至今没用过,也不知道怎么弄,如果需要 Google 关键词: Vim Ex模式。

普通模式下按 Q 进入 Ex 模式,多行 Command Line 模式

派生模式

操作符等待模式

这个派生模式指普通模式中,执行一个操作命令后Vim等待一个”动作”来完成这个命令。Vim也支持在操作符等待模式中使用”文本对象”作为动作, 包括”aw”一个单词(a word)、”as”一个句子(a sentence)、”ap”一个段落(a paragraph)等等。

比如,在普通模式下”d2as”删除当前和下一个句子。在可视模式下”apU”把当前段落所有字母大写。

插入普通模式

这个模式是在插入模式下按下ctrl-o键的时候进入。这个时候暂时进入普通模式,执行完一个命令之后,Vim返回插入模式

插入可视模式

这个模式是在插入模式下按下ctrl-o键并且开始一个可视选择的时候开始。在可视区域选择取消的时候,Vim返回插入模式。

插入选择模式

通常这个模式由插入模式下鼠标拖拽或者shift方向键来进入。当选择区域取消的时候,Vim返回插入模式。

替换模式

这是一个特殊的插入模式,在这个模式中可以做和插入模式一样的操作,但是每个输入的字符都会覆盖文本缓冲中已经存在的字符。在普通模式下按”R”键进入。

vim key command


2015-05-01 vim , linux

Google+

最近文章

  • 又一款抓包分析软件 wireshark Wireshark 是一款网络分析工具,也是学习网络协议的工具,原先介绍过的 Charles ,mitmproxy 等HTTP抓包工具,都局限于 HTTP/HTTPS 请求,对于更底层的 TCP/IP,UDP 等协议就无能为力了。Wireshark 可以抓取网卡上的网络包,并实时展示,Wireshark 包括了过滤器,协议显示等等工具。
  • 关于游戏的一些想法 最近国内又火了一个答题游戏,回答正确12题平分多少多少万奖金。先不说他们都抄袭 HQ Trivia 这款App,但我这两天一直在想一个问题,为什么这一类的应用能火起来,难道就是因为最后平分100万,200万,现金带来的刺激吗?我想答案一定不是的,除了最开始的玩家或许还能分到几十块钱,在入场玩家越来越多的情况下,每个人瓜分到的奖励一定是越来越少的。那到底是什么能让一个应用一夜之间火到大江南北?
  • Android 电视盒子可用的应用备份 用盒子也已经很多年了,几年来家里,自己用,也积累了一些常用的应用。这两天又拿到了 T1 盒子,又才想起来整理这样一份单子,这样不用每一次都一遍一遍的尝试了。记得以前 VST ,泰捷视频都还很不错的时候,再后来广电发了禁令,再后来这片市场混乱发展,各家大型网站优酷,爱奇艺又不敢公开大搞,却又在背后偷偷摸摸。再到现在几乎被什么芒果,CIBN垄断,内容没什么可看,却什么都要收费。我始终抱有一个观点,如果电视盒子这一块开放发展,国内的厂家完全能够占领全世界的盒子市场,好几年前用的 Android 盒子就已经能够满足我的大部分需求,并且应用设计也早 Google 自己推出 Android TV 盒子以及规范 Android TV 应用好多年。可惜这一块市场被一道禁令打到了地下。
  • okhttp 使用 OkHttp是一个非常高效的HTTP客户端,默认情况下:
  • 斐讯 T1 盒子去除广告 斐讯投资送硬件这路子是着魔了,所以在斐讯 K2P 之后又入手了这个 T1 的盒子,配置2G RAM,16G Sdcard,配置还不错。接口有 USB,网口,HDMI 口,还有 一个 AV 输出口,日常使用是没有任何问题的,初尝试一下非常流畅,不过让我不爽的是,第一次进入竟然需要验证手机,说是 CIBN 盒子的验证,如果不注册还不让进入。