在学习STM32的ADC和DMA时候,发现了很多有意思的事情,这里记录一下,网上的很多回答不是很好。

1、DMA_BufferSize到底是什么?

Specifies the buffer size, in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSize or DMA_MemoryDataSize members depending in the transfer direction

其实,这个缓冲区概念不是很准确,准确的应该是每次DMA传输的数据数量。在库函数stm32f10x_dma.c中可以找到:

DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;

那这个 CNDTR 是什么呢?在STM32参考手册里有说明, Number of data to be transferred (0 up to 65535). The transfer stops once the DMA_CNDTRx register reaches zero. 它就是一个计数器,这个计数器的值就是DMA_BufferSize,每传送一个数据就减一,变成0的时候,从ADC外设到内存的传输(或相反)停止。此时可产生中断信号。假设DMA_BufferSize=10,那么ADC采集10次后,DMA就停止传输ADC的采集数据了。

那为啥取名叫buffer 呢,我猜是为了和DMA_MemoryInc_Enable配合。虽然传输计数是减少的,但是内存地址是增长的。在声明DMA_MemoryBaseAddr时候,其实DMA的就指向(是指向,不是开辟!)一个大小为DMA_BufferSize的数组,数组的开始地址为DMA_MemoryBaseAddr。这个数组就是缓冲区。

每次ADC采样后,就通过DMA把数据放在内存中,从DMA_MemoryBaseAddr+0地址开始放,直到DMA_MemoryBaseAddr+DMA_BufferSize-1,此时CNDTR变成0,传输结束。

2、DMA_BufferSize的大小应该取多少?

上面的讨论很多同学就疑惑了,这个大小应该取多少呢?暂时我建议你需要多少数据就写多少。

__IO uint16_t ADC_ConvertedValue[NUM];

一般,我们会定义一个变量存我们的数据,然后

DMA_InitStruct.DMA_BufferSize = NUM;

DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;

这时候,缓冲区的大小和我们定义的数组一致,也方便我们操作。

但是如果DMA_BufferSize大于NUM会怎么样?根据上面问题1的解释,缓冲区地址其实就是我们的ADC_ConvertedValue地址,如果DMA_BufferSize为NUM+N,其实缓冲区就是ADC_ConvertedValue[NUM+N],再说一遍,Buffer的首地址和ADC_ConvertedValue相同,如果我们用指针访问,可以很好的验证。

__IO uint16_t *p;
p=ADC_ConvertedValue;

////省略代码,printf是串口通信改写的函数….

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));

printf(“%4x\n”,*(p+NUM+1));

你会很吃惊的发现,*(p+NUM)里面也有我们采样的数据。如果我们用ADC_ConvertedValue[NUM]访问则会出错,因为超出数组范围了。也就是说DMA_BufferSize可以大于NUM,但是大于NUM的地址属于不被定义的内容。从编程角度,它使用了未知的区域,如果这个地址定义别的变量,那么就会误操作这个变量。

__IO uint16_t ADC_ConvertedValue[NUM];
__IO uint16_t a[N];

比如我们定义时候,紧跟ADC_ConvertedValue定义一个a;一般编译器会把这两个变量的地址连在一起。那么在运行程序时候:

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,a[0]);

是一样的数据。

很危险吧。a[0]的数据就被DMA覆盖了。

 

3、ADC多通道DMA的真正采样顺序是什么?

很多同学想ADC多通道采样,比如两个通道,每个通道采10次。那么,到底是先把通道1采集10次,再轮到通道2采集10次。还是通道1和2轮流采集,第一次,先通道1,再通道2。第二次,先通道1,再通道2。直到第10次。这里假设的通道1比通道2优先级高。

很简单,ADC手册里写了,是通道1和2轮流采集。

你也可以做个实验,定义ADC_ConvertedValue[NUM],把两个通道接到不同电平,然后依次输出ADC_ConvertedValue[i],很明显可以看到数值交替。

4、ADC多通道内存数组为何定义为?

一般我们定义二维数组来存放采集的数据。如:

ADC_ConvertedValue[Sample_Num][Channel_Num]

那么为啥是这么写呢?不能是ADC_ConvertedValue[Channel_Num][Sample_Num]吗?

这个翻翻C语言的教材,C数组是按行存储的。加上ADC是轮流采样通道的,因此ADC_ConvertedValue[Sample_Num][Channel_Num]刚好每一列都是通道采样值。

 

5、DMA_Mode 的DMA_Mode_Circular与DMA_Mode_Normal 区别?

DMA_Mode_Normal ,普通模式: 在DMA传输结束时, DMA通道被自动关闭,进一步的DMA请求将不被满足。也就是说当传输结束时候,DMA就不工作了。要想工作要重新配置DMA。

DMA_Mode_Circular,循环模式:用于处理一个环形的缓冲区,每轮传输结束时数据传输的配置会自动地更新为初始状态, DMA传输会连续不断地进行。意思就是说,每次CNDTR变成0时候,就自动重新按照程序初始化时候的DMA配置再配置一遍。然后重新运行。

In circular mode, after the last transfer, the DMA_CNDTRx register is automatically reloaded

with the initially programmed value. The current internal address registers are reloaded with
the base address values from the DMA_CPARx/DMA_CMARx registers.

6、DMA中断时候,还在传数据吗?

DMA在循环模式时候,如果中断了,那么DMA还工作吗?答案是DMA仍然工作!

也就是说进入中断后,DMA还在传数据,ADC_ConvertedValue里的值还是变化的!

为什么?想想DMA是干什么的吧,中断是CPU的工作。DMA本来就和CPU没关系的。

 

未完…

Class ‘Home\Controller\QRcode’ not found

THINKPHP3.2 整合phpqrcode 生成二维码,QRcode::png不好用,解决方法如下:

 

<?php
public function qrcode($url){
//引入phpqrcode文件.源码放在vendor/qr文件夹里
vendor(“qr.phpqrcode”);
//纠错级别, 纠错级别越高,生成图片会越大
//L水平    7%的字码可被修正
//M水平    15%的字码可被修正
//Q水平    25%的字码可被修正
//H水平    30%的字码可被修正
$level = “L”;
//图片每个黑点的像素。
$size = “8”;
//生成图片 第二个参数:是否保存成文件 如需要保存文件,第二个参数改为文件名即可,如:’qrcode.png’
$qr = new \QRcode();
//p($url);die;
$qr->png($url, false, $level, $size);
}
?>

_t 代表type,是被typedef定义的。

一般不推荐使用,和什么POSIX的约定有关。用也可以,加前缀比较安全,如ngx_str_t.

参考文献:

[1] http://www.cnblogs.com/swnuwangyun/archive/2011/06/10/2077389.html

[2] http://stackoverflow.com/questions/3225386/if-i-do-a-typedef-in-c-or-c-when-should-i-add-t-at-the-end-of-typedefed

[3] http://stackoverflow.com/questions/231760/what-does-a-type-followed-by-t-underscore-t-represent

 

———————-部分回答————–

As Douglas Mayle noted, it basically denotes a type name. Consequently, you would be ill-advised to end variable or function names with ‘_t’ since it could cause some confusion. As well as size_t, the C89 standard defines wchar_t, off_t, ptrdiff_t, and probably some others I’ve forgotten. The C99 standard defines a lot of extra types, such as uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t, and so on. These new types are formally defined in <stdint.h> but most often you will use <inttypes.h> which (unusually for standard C headers) includes <stdint.h>. It (<inttypes.h>) also defines macros for use with the printf() and scanf().

As Matt Curtis noted, there is no significance to the compiler in the suffix; it is a human-oriented convention.

However, you should also note that POSIX defines a lot of extra type names ending in ‘_t’, and reserves the suffix for the implementation. That means that if you are working on POSIX-related systems, defining your own type names with the convention is ill-advised. The system I work on has done it (for more than 20 years); we regularly get tripped up by systems defining types with the same name as we define.

shareimprove this answer
edited Sep 8 ’09 at 1:18

Orion Edwards
59.6k32155227
answered Oct 23 ’08 at 22:29

Jonathan Leffler
343k45357637

it seems reasonable that OS and common runtime libraries define types with genericish names; but shouldn’t your company’s types also be prepended with a prefix or something? – Toybuilder Oct 23 ’08 at 22:38

Yes, they should. Unfortunately, I wasn’t in charge of the naming convention at the time when it was used. And global search and replace isn’t something that’s sanctioned – though it could be used to fix a lot of problems, even in a monstrous code base. – Jonathan Leffler Oct 23 ’08 at 23:29
3
I use _type instead of _t on my typedefs precisely to avoid that. – CesarB Oct 23 ’08 at 23:51

@Jonathan Leffler — What naming convention would you use for user-defined types? – J. Andrew Laughlin Apr 18 ’11 at 21:43
5
@Andrew: if you have a convenient abbreviation to use as a prefix, then you may be safe to use abbr_xxxxx_t type names. Without such a prefix, you may get caught any time. Generally, the standardized _t types use all lower-case (FILE and DIR are two exceptions, twice – all caps, and no _t), so you could use CamelCase_t with moderate safety, with or without the leading caps. The system I mainly work on tends to live dangerously and use _t anyway, but it has bitten us on occasions. I tend to use CamelCase without a suffix for my own work; my functions are usually all lower-case. – Jonathan Leffler Apr 18 ’11 at 22:45

@JonathanLeffler, I’ve started using that convention, CamelCase for types, lower_case for functions. I searched this question hoping I wasn’t the only one. Thanks for the validation! – Austin Mullins Jun 13 ’14 at 22:26

 

三维软件的种类非常之多,对于一个非机械专业的学生不知该学什么好,虽然什么东西学好了都很牛,但是免不了比较一番,百度一下,发现@zenki1984的回答很好,这里转载一下,2015年2月。

作为非专业工业设计类人士,我个人选择了:
二维:AutoCAD
三维绘图:Solidworks
三维渲染:KeyShot 与 CINEMA 4D

==================

三维软件,分两类,这两类的用途有本质区别。一类是工业设计类软件(如机械设计,结构设计,产品设计),一类是三维动画软件。

(一)
工业设计类三维软件,其实就是三维版的CAD。这类软件主要用于机械,冶金,产品开发,优点是尺寸非常精确,制作的模型,可以被工厂生产成实物,比如你做了个汽车模型,工厂就可以根据这个模型,生产出一辆汽车来。缺点是,建模过程非常死板,做些方方正正的模型虽然很容易,但想要制作比较复杂的造型(比如动物,植物等),非常困难。这类软件都存在一个通病,就是渲染能力非常差,也就是说,最终出效果图的时候,图片画面很生硬,不逼真。所以通常都要结合动画软件来进行渲染,这里推荐C4D,两者一起学,有相辅相成的作用,一点也不冲突。这类软件的最终成品,并非是三维图,而是通过三维,来反求一张二维工程图。

这类软件,常见的有四种,分别是SOLIDWORKS,PRO/E,UG,CATIA

1、SOLIDWORKS主要优势是钣金设计,价格最便宜。适合做一些小型产品,如手机,电脑机箱等。最好学,功能也最弱。SOLIDWORKS最大的优点是简单好学(相对于其他软件来讲),定位低端的原因,主要在于它有两个缺点:一是曲面功能比较差,二是只支持设计,不支持编程 (当然这是达索公司刻意为之,为了避免与CATIA产生冲突,没有任何一家公司,会让自己旗下的两款产品产生竞争关系)。不过以上两个缺点,可以通过安装插件,在一定程度上得到改善。

2、PRO/E是最主流的软件,出图难用,学起来最难。模具领域应用也比较早,所以比较流行。ProE在机械电子玩具行业用的多一些

3、UG的强项是数控编程。高端的软件,UG在航空航天类用的多(不过国内航空五所也用solidworks) 汽车类用做设计的也比较多 (奇瑞 catia 通用ug)另外UG的加工不错,在欧洲 用的最多的是pow mill和ug 波音公司采用的也是ug加工 。

4、CATIA是由军火公司开发的软件,通常用于大型设备的设计制造。大名鼎鼎的阵风战斗机,就是由CATIA开发而成。CATIA和SOLIDWORKS如今是同一家公司的软件,算是同门师兄弟。CATIA定位大型装备制造业,可以看成是SW的加强版,但相应的,比较难学,SOLIDWORKS定位小产品设计。做机械设计,产品开发,最好的是CATIA。小到打火机,大到航空母舰,都可能是由它设计而成。

(二)
三维动画软件,看名字便知道,这类软件最擅长的是动画,而且建模很随意,即使没有尺寸,也能凭感觉进行制作,可以有效的制作出眼睛能看到的几乎任何物体,而缺点也是很明显的,模型仅能用来看,而不能被生产(可以3D打印),通常用于电影特效,动漫设计,建筑表现,图片制作等围绕视觉艺术的行业。 另一类是CG类建模,这类模型,通常仅追求外形相似,并不要求特别精确,即使没有尺寸,也可以完全凭感觉快速的建出各种形状,就像捏泥人一样,并不需要特别规定公差是多少,只要看着符合比例就可以。一般用于建筑,动画,电影等对尺寸要求并不是特别高的情况下。优点是建模过程没那么多束缚,模型可以做的很有艺术性

这类软件,常见的也是四种,分别是MAYA,3DMAX,C4D,SOFTIMAGE

1:3DMAX——因为3DMAX的效果和功能在同类软件里是最差的,不符合电影公司的需要,而各大电影公司全都看不上3DMAX。。纷纷拒绝。。于是3DMAX始终都找不到进入好莱屋的路子,一直到今天3DMAX也没制作过任何一部商业电影,于是AUTODESK就把这个软件推销到了建筑行业。。建筑公司用它来做建筑效果图,尤其以中国最为普及。。逐渐成为了中国建筑行业的标准软件

2:LIGHTWAVE——LIGHTWAVE制作了《泰坦尼克号》等成功的电影。。获奖无数。。但软件公司却没因此赚到钱。。可这个软件却因此在日本广为人知了,于是被制作电子游戏的厂商们纷纷引进到日本,用来制作游戏,。不过在中国这个软件的知名度很低。。用户寥寥无几,

3:CINEMA 4D——这个软件跟别的软件是反着来的,它一开始压根就没打算在电影业混,一开始制作出来,是用来做产品外观设计的,比如宝马汽车,三星手机等就是用这个软件来设计产品外型的,但是它的功能和人性化等方面,具备众多优点,完全可以胜任电影的制作。。果然有一天,它被电影公司看中了,之后就一发不可收拾的制作了《蜘蛛侠》《阿凡达》《2012》等众多轰动世界的大片,最近几年在中国也逐渐开始流行。。由于和影视后期软件——AE可以无缝结合,因此主要流行于制作电视节目,广告等视频相关的行业。另外还有它的本行——工业渲染和产品外观设计做影视动画,工业渲染,最好的是C4D,(所向披靡的新教主)理由:《阿凡达》《2012》《蜘蛛侠》《变形金刚》,出道虽晚,却已经把在好莱坞称霸多年的MAYA搞得满目狼藉,以宝马汽车和三星手机为代表的产品表现,又引领了一个新的时代。

4:MAYA——这个软件一直监守本行,在很多年的时间中一直在电影业扮演着幕后老大的角色,但是自从被AUTODESK收购之后,MAYA就开始逐渐退步,在CINEMA 4D和HOUDINI被挖掘出来之后,不思进取的MAYA逐渐丧失了技术优势。。很多功能相比之下已经显的有些落后了。。后又因数字领域倒闭,这个软件逐渐的在好莱屋开始衰退,很多特效公司开始放弃MAYA。。但是由于之前是行业老大,因此尽管技术上已经并不太先进了,但毕竟还有着众多用户基础,因此今天在好莱屋仍然还占有着一席之地。。只是我不看好它的未来。做游戏开发,CG行业,最好的是MAYA,(风采依旧的老天王)理由:尽管C4D近年做了《剑灵》和《最终幻想14》,但在CG行业,MAYA仍还是压的住的,以暴雪和AE为代表,MAYA依旧是CG行业的统帅MAYA比较适合动漫行业,优点是适用度强,缺点是比较难学

5、SOFTIMAGE已停止开发,前途难料,不建议学习

6、做曲面,复杂模型,最好的是RHINO,(专攻建模的小犀牛)理由:如果只做正正方方的模型,那没什么可吹嘘的,如果你要做一条鲨鱼,一只蚊子,又要尺寸精确,那RHINO就是你的不二之选

这类软件涉及的行业多种多样,因此使用哪个软件要根据自身行业来选择。。比如与建筑相关的,首选3DMAX,原因在于设计院和房地产公司全是用3DMAX,你用别的软件,跟同事配合就是个严重问题,。而动画和影视行业,建议从CINEMA 4D和MAYA之中选择,因为它们确实相比3DMAX要更有优势,因为3DMAX不具备一些高端动画的必备功能。。比如表达式,3D(需要戴眼镜观看的那种3D电影)等功能,都是3DMAX所欠缺的,尤其是没有表达式,导致3DMAX无法胜任大型动画。

举个例子:
假如你想做100个方块,而这100个方块的大小各不一样。。旋转角度各不相同,用3DMAX做,需要先阵列出100个大小和角度完全相同的方块,再一个一个的去缩放这些方块,让它们大小不一。再一个个的去把它们旋转成不同角度,这就需要几百个步骤的操作,可能需要好几天才可以完成,用MAYA或C4D做,同样是阵列100个大小和角度一样的方块。。之后创建表达式,输入缩放随机和角度随机的命令。。再指定随机的范围。。这些方块就会变的大小,角度各不相同。。仅仅需要4个步骤,几分钟就能搞定,而MAYA和C4D之间,个人推荐C4D,因为MAYA非常难,学习过程是极其漫长的,需要好几年,C4D相比之下,难度大约等同于3DMAX,可在两三个月内掌握,而且尽管现在MAYA在国内的用户数量是高于C4D的,但在流程上C4D却比MAYA要先进和高效的多。。由于有ADOBE公司保驾护航,现在又和AE可以无缝结合,把老态龙钟的MAYA赶下台几乎只是时间问题,其中3DMAX和C4D相对简单,MAYA很难,个人推荐C4D,因为它是由目前最先进的技术开发而成,其他三个则相对技术古老一些,C4D不仅效率很高,而且效果也不错,尤其得益于更先进的软件结构,导致制作过程变得轻松了很多,动力学,毛发等功能,像是在玩游戏,《阿凡达》《2012》《变形金刚4》《蜘蛛侠4》等电影,《最终幻想14》《剑灵》《塞尔达传说Wii U》等游戏,均是由C4D主刀,

从今技术角度分析,建模按照方法不同,分为两种方式:
一类是NURBS建模(或者叫曲面建模),一类是POLYGONS建模(或者叫多边形建模,简称POLY),C4D的奇怪之处,也正在于此,NURBS通常是先画线条,之后对这些线条施加命令,形成模型,比如挤出,放样,扫描,这些就是常见的NURBS建模命令,建模过程比较抽象,但可以制作出很圆滑的过度,POLY建模是指,对模型的点,线,面进行编辑,就是前面提到的捏泥人,最常用到的命令就是挤压,焊接,之类的命令,建模直观,但棱角分明,工业类建模软件,全都是NURBS建模,因为这类软件没有点,线,面的概念,CG类的建模软件,通常是既有NURBS,又有POLY,这也是这类软件建模可以比较随意的原因,区别只是软件不同,这两种方式所占的比重不一样,按照老外的说法,大脑发达的人,比较适合NURBS建模,小脑发达的人,适合POLY,因为NURBS比较考验人的思维能力,而POLY不需要太费脑子,但过程却很枯燥,MAYA,是70%的NURBS + 30%的POLY,所以MAYA适合比较聪明,但没什么耐性的人,3DMAX,是70%的POLY + 30%的NURBS,而3DMAX适合有耐性,但不怎么聪明的人

参考网址:
[1]http://zhidao.baidu.com/link?url=5erEMX6Wzw4SAWdBkJWgsRBUiRnbnSAcCTt_xPIIvUTlA5E50QlGWnJOy_izvVZh16KDzIzba_o6NH0gb7Wj-juOVRASY_MrhmnhHYE74Q_
[2] http://zhidao.baidu.com/question/1924432904364782187.html?from=pubpage&msgtype=2
[3] http://zhidao.baidu.com/question/1860975544243867227.html?from=pubpage&msgtype=2
[4]http://zhidao.baidu.com/question/1958392644268042860.html?from=pubpage&msgtype=2

一不小心写了个大题目,可我表示不会写很多。

最近韩寒重新开始微博,随之而来的是一长微博。
长微博是什么?是图片。本来140字的微博用长微博可以弄个几千字都没问题。
可是,问题是,搜索引擎如何处理这些长微博?
众所周知,搜索引擎被很多微博屏蔽,微博,这个世界上最新的数据库无法被检索,人们通过搜索引擎获取信息的途径被弱化,这不利于知识的平等与挖掘。

搜索引擎对微博,facebook的数据垂涎,可是各种利益,各种隐私是一个跨不过的鸿沟,人们获取信息的成本,隐形中变大。

对于长微博来说,本来在博客里的东西,变成了图片,虽然在技术上提取这些字没问题,可是搜索引擎如何对付大量这些图片,是一个有意思的事情。

长微博是把双刃剑,可以推动社会进步,也可以造成信息壁垒,搜索引擎应认真对待。

问题:下了一个protel99se的教程,添加封装库的时候找不到 “通用封装.DDB”这个文件,如图,怎么能添加这个呢?

protel 99se精彩教程绝对经典,但是通用封装库.ddb没有自带,我在网上找到一个版本,放在了百度网盘里面

http://pan.baidu.com/share/link?shareid=359912&uk=4164263528

话说,protel 99se活了这么久还没死真是奇迹

网上一直有传言有廉价iPhone,我觉得概率不大,因为这是降低利润,降低身份,降低品牌的事情,所以不会有廉价苹果。

但是,廉价IOS就有可能了,毕竟体验和生态已经完整,苹果需要更多设备来为商店带来可持续发展,但是,向华为之类是不可能的,因为品质问题,是苹果关心的。所以更可能的是,苹果自己设计,但是售价很低,最重要的是,不叫iPhone,会起个其他名字,用于区别低端和高端。

我同时觉得以后苹果会同时更新两种iPhone,一个是iPhone5的屏幕尺寸,一个是更大尺寸,嗯,更大尺寸早晚会有的。

fedora可以很方便的建立wifi热点,步骤如下:

1、在应用程序里找到“网络链接”
2、选中无线这个标签点击“添加”
wifi1

3、分别设置以下参数
wifi2
wifi3
wifi4
wifi5

4、保存,然后在屏幕右上角网络管理里面打开无线,连上你设置的网络mywifi,就ok了,可以用手机搜索看看吧~

桌面:Gnome3
系统:Fedora/Ubuntu

一、编辑器
1、gvim
2、LibreOffice

二、互联网应用
1、chrome
2、Firefox
3、FileZilla(FTP)
4、Deluge(BT下载)
5、Empathy
6、Axel(命令行式多线程断点续传下载工具, 类似的有wget)
7、Openfetion(飞信)
8、amule(电驴)

三、编程应用
1、Git(版本控制)
2、Cola git GUI(Git的GUI应用)
3、Giggle(GUI 方便的进行commit push等)
4、Eclipse(编程IDE)
5、GCC(编译器)

四、学术
1、XeTeX(TexLive)
2、Lyx
3、Zotero(文献管理插件)
4、Adobe Reader

五、图形
1、GIMP(处理图像代替PS)
2、Dia(流程图)

六、其他
1、Gnote(TomBoy便签)
2、Fcitx(输入法)
3、星际译王(字典)
4、VirtualBox(虚拟机)
5、音乐,视频什么的用系统里的

vim感觉还是很强大的,只要自己配置好,下面是自己网上找的,留作备忘。

VimL语言: 代码高亮由发芽网提供

001 “=========================================================================
002 ” DesCRiption: 适合自己使用的vimrc文件,for Linux/Windows, GUI/Console
003 
004 ” Aaron Chen
005 
006 ” 本人从互联网收集,非常感谢原作者!
007 “=========================================================================
008 
009 set nocompatible            ” 关闭 vi 兼容模式
010 syntax on                   ” 自动语法高亮
011 colo rainbow_neon           ” 设定配色方案
012 set number                  ” 显示行号
013 set cursorline              ” 突出显示当前行
014 set ruler                   ” 打开状态栏标尺
015 set wrap                    “设置自动折行
016 ” set nowrap                  “设置不自动折行
017 
018 ” hi LineNr guibg=#111111 guifg=#09C7F7        
019                             “行菜单颜色改变
020 
021 set shiftwidth=4            ” 设定 << 和 >> 命令移动时的宽度为 4
022 set softtabstop=4           ” 使得按退格键时可以一次删掉 4 个空格
023 set tabstop=4               ” 设定 tab 长度为 4
024 
025 set nobackup                ” 覆盖文件时不备份
026 set autochdir               ” 自动切换当前目录为当前文件所在的目录
027 
028 filetype plugin indent on   ” 开启插件
029 set backupcopy=yes          ” 设置备份时的行为为覆盖
030 set ignorecase smartcase    ” 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
031 set nowrapscan              ” 禁止在搜索到文件两端时重新搜索
032 set incsearch               ” 输入搜索内容时就显示搜索结果
033 set hlsearch                ” 搜索时高亮显示被找到的文本
034 set noerrorbells            ” 关闭错误信息响铃
035 set novisualbell            ” 关闭使用可视响铃代替呼叫
036 set t_vb=                   ” 置空错误铃声的终端代码
037 ” set showmatch               ” 插入括号时,短暂地跳转到匹配的对应括号
038 ” set matchtime=2             ” 短暂跳转到匹配括号的时间
039 set magic                   ” 设置魔术
040 set hidden                  ” 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
041 set guioptions-=T           ” 隐藏工具栏
042 ” set guioptions-=m           ” 隐藏菜单栏
043 set smartindent             ” 开启新行时使用智能自动缩进
044 set backspace=indent,eol,start
045                             ” 不设定在插入状态无法用退格键和 Delete 键删除回车符
046 set cmdheight=1             ” 设定命令行的行数为 1
047 set laststatus=1            ” 显示状态栏 (默认值为 1, 无法显示状态栏)
048 set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)
049                             ” 设置在状态行显示的信息
050 ” set foldenable              ” 开始折叠
051 ” set foldmethod=syntax       ” 设置语法折叠
052 ” set foldcolumn=0            ” 设置折叠区域的宽度
053 ” setlocal foldlevel=1        ” 设置折叠层数为
054 ” set foldclose=all           ” 设置为自动关闭折叠                            
055 ” nnoremap <space> @=((foldclosed(line(‘.’)) < 0) ? ‘zc’ : ‘zo’)<CR>
056                             ” 用空格键来开关折叠
057 
058 “———————————————
059 ” Use CTRL-S for saving, also in Insert mode
060 “———————————————
061 noremap <CS> :update<CR>
062 vnoremap <CS> <CC>:update<CR>
063 inoremap <CS> <CO>:update<CR>
064 
065 
066 “———————————————
067 “英文字体设置
068 “———————————————
069 set guifont=Arial_monospaced_for_SAP:h10:cANSI
070 
071 
072 “———————————————
073 ” 自动补全括号
074 “———————————————
075 :inoremap ()<ESC>i
076 :inoremap <cr>=ClosePair(‘)’)<CR>
077 :inoremap { {}<ESC>i
078 :inoremap } <cr>=ClosePair(‘}’)<CR>
079 :inoremap [ []<ESC>i
080 :inoremap ] <cr>=ClosePair(‘]’)<CR>
081 :inoremap < <><ESC>i
082 :inoremap > <cr>=ClosePair(‘>’)<CR>
083 :inoremap ” “”<ESC>i
084 :inoremap ‘ ‘<ESC>i
085 
086 function ClosePair(char)
087 if getline(‘.’)[col(‘.’ 1== a:char
088     return “\<Right>”
089 else
090     return a:char
091 endif
092 endf
093 
094 
095 “———————————————
096 ” vim 在windows下的编码设置
097 “———————————————
098 set encoding=utf-8
099 set fileencodings=utf-8,chinese,latin-1
100 if has(“win32”)
101     set fileencoding=chinese
102 else
103     set fileencoding=utf-8
104 endif
105 “解决菜单乱码
106 source $VIMRUNTIME/delmenu.vim
107 source $VIMRUNTIME/menu.vim
108 “解决consle输出乱码
109 language messages zh_CN.utf-8
110 
111 
112 “———————————————
113 ” 设置= + – * 前后自动空格
114 ” 设置逗号后面自动添加空格
115 “———————————————
116 let g:equ=1
117 if exists(“g:equ”)
118     :inoremap = <cr>=EqualSign(‘=’)<CR>
119     :inoremap + <cr>=EqualSign(‘+’)<CR>
120     :inoremap  <cr>=EqualSign(‘-‘)<CR>
121     :inoremap * <cr>=EqualSign(‘*’)<CR>
122     :inoremap / <c-r>=EqualSign(‘/)<CR>
123     :inoremap , ,<space>
124 
125 ” HTML中会和标签引起冲突
126 ”    :inoremap > <c-r>=EqualSign(‘>’)<CR>
127 ”    :inoremap < <c-r>=EqualSign(‘<‘)<CR>
128 endif
129 
130 function! EqualSign(char)
131 if getline(‘.’)[col(‘.’ 3=~ “[\*-=+\/]”
132     return “\<ESC>xa”.a:char.”\<SPACE>”
133 else
134     return “\<SPACE>”.a:char.”\<SPACE>\<ESC>a”
135 endif
136 endf
137 
138 
139 “———————————————
140 ” F4快捷格式化js代码
141 “———————————————
142 nnoremap <F4> :call g:Jsbeautify()<CR>
143 
144 
145 “———————————————
146 ” F11全屏显示
147 “———————————————
148 if has(‘win32’)
149     map <F11> <Esc>:call libcallnr(“gvimfullscreen.dll”, “ToggleFullScreen”, 0)<CR>    “非插入模式下F11全屏
150     imap <F11> <Esc>:call libcallnr(“gvimfullscreen.dll”, “ToggleFullScreen”, 0)<CR>    “插入模式下F11全屏
151 endi