白领们的新型代步工具——魔轮[图文+视频]_汽车工具

696980e0d8d0d5537586c82736e1e1991

  英国一家公司日前推出一款叫做“魔轮”(Magic Wheel)便携式代步工具,能让使用者在街道人群中自如穿行,对于饱受上班高峰交通堵塞困扰的城市白领来说,魔轮不但灵活便利,而且可随身携带,间接解决了防盗问题。

  魔轮红黑相间,由一个大轮和一个小轮组成,大轮直径约为26英寸(约66厘米),小轮则用于稳定整个车轮,使用者骑在上面,最大载重可达120公斤。 “魔轮”作用同自行车类似,只不过少了车座和车把,所以,使用者须将一只脚放在轮子一侧的踏板上,另一只脚则用力蹬地前行。车轮在聚集了足够的冲力时,使用者可以将这一只脚也放在踏板上面,随着车轮向前行。

  “魔轮”的设计师是匈牙利发明家Soma Ungar,目前这款产品已经受到一些商人的青睐,网上每辆售价80英镑。

视频来啦! 

穿越到未来的好办法

 建造蠹孔时光机器的三个步骤(不怎么容易喔)

1. 寻找或制造一个蠹孔: 这是连接空间中两地点的一种隧道。大的蠹孔也许自然存在于太空深处,是大霹雳的遗迹。要不然我们就只好拿次原子蠹孔来充数。它们可能自然存在(有人说它们就在你我周围不断冒出又消失),或是人造的(譬如此处所想像,由粒子加速器制造)。这些小蠹孔必须放大到有用的大小,譬如用上类似大霹雳后让空间膨胀的能量场。

2.使蠹孔稳定:注入负能量,譬如利用开斯米效应(Casimir effect)等量子方式,使讯号或物体得以安全穿越蠹孔。蠹孔倾向于挤压成一个密度无穷大或近乎无穷大的点,而负能量可对抗这个趋势;换言之,它会避免蠹孔变成黑洞。

3.拖曳蠹孔:假设有一艘具有高度先进科技的宇宙飞船,会将蠹孔的两个口分开。其中一个开口或许可置放于中子星表面附近。中子星是极度致密、有强大重力场的星球,此强重力场会使时间过得慢多了。由于时间在蠹孔的另一开口处过得较快,此两开口便在空间及时间上都被分开来了。

自制葡萄酒

●第一步:买葡萄选购葡萄时,可以挑选一些熟透的葡萄,哪怕是一颗颗散落的葡萄也不要紧。这些葡萄一是容易发酵,二是价位相对较低。常见的葡萄、提子、马奶子等,都是可以用来制作葡萄酒的。

●第二步:洗葡萄由于葡萄表皮很可能残留农药,清洗葡萄的环节就相当重要,最好能够逐颗清洗,再用自来水反复冲洗,同时剔除烂葡萄。一些爱干净的人,喜欢把葡萄去皮后酿酒,这也未尝不可,但是少了一些葡萄皮特有的营养。 晾干葡萄把葡萄盛在能漏水的容器当中,等葡萄表面没有水珠就可以倒入酒坛了。

●第三步:选择容器酒坛子可以是陶瓷罐子,也可以是玻璃瓶,但不主张用塑料容器,因为塑料很可能会与酒精发生化学反应,并产生一些有毒物质,危害人体健康。 捏好葡萄放进容器双手洗净后,直接捏葡萄,操作办法是抓起一把葡萄使劲一握,操作前须将手、木棒、容器等先用高锰酸钾水洗一次,再用清水冲一次,然后再去操作,以防止杂菌污染,同时要注意不要使用铁、铜等金属的工具和容器(或用干净铝勺在杯中经消毒)将葡萄捣碎。然后放入酒坛中,再把糖放在葡萄上面,葡萄和糖的比例是10∶3,即10斤葡萄放3斤糖(不喜欢吃甜的朋友,可以放2斤糖,但是不能不放糖,因为糖是葡萄发酵的重要因素)。

加封保存将酒坛子密封,如果是陶瓷罐的话,可以到买黄酒的小店要点酒泥,加水后糊住封口。加封后,酒坛子需放在阴凉处保存,平时不要随意去翻动或打开盖子。 发酵是将葡萄皮汁中的糖分经酵母的作用产生酒精和二氧化碳,红葡萄酒的前发酵过程是皮汁混在一起的,酵母在葡萄破碎时已接入汁中,因为葡萄皮上的白霜存在有酵母,所以自制葡萄酒在发酵时可以不另外加入酵母。发酵的温度最好在15~25℃,不应超出35℃,但用小型容器发酵,散热较容易,一般可以达到不超过32℃。当皮汁装入容器后,一般经过一天即可开始发酵。

液面开始是平静,这时已有微弱的二氧化碳气泡产生,表示酵母已开始繁殖,经过2~3天有大量二氧化碳放出,皮渣上浮结成一层帽盖,口尝果汁,甜味渐减,酒味渐增。发酵时每天应将上浮的葡萄皮用消毒筷子压到汁内两次,这样做一方面防止葡萄皮生霉,变酸,同时可将皮上的色素浸入汁中,且排出CO2,使酵母得到氧气,发酵更旺盛。高潮后,发酵势头开始减弱,此时可以进行加糖,加糖是用葡萄原酒来溶解,而不要用水化糖后再加入,等白糖完全溶解后,继续在容器中进行发酵,最后二氧化碳放出至微弱而接近平静,酒精味很浓、糖分减少至1%以下,汁液开始清晰,即为发酵结束,进行压榨,将皮汁分离。


●第四步:压榨。压榨的方法是用洁净的布袋或纱布,进行挤压或扭压,红葡萄酒液即流出来,称为元酒。

●第五步:现在已经可以饮用。但要求卖相的话,可以加入蛋清,30毫升葡萄原酒约加鸡蛋清一个。方法是将鸡蛋清打成泡沫状,用少量酒充分搅拌混合,然后加入酒中,再充分搅拌和静置,至酒液清透明,将沉淀物弃掉。

●第六步:葡萄酒的加糖。大多数人的习惯是觉得葡萄酒应该是甜的,因此,需将葡萄酒进行加糖调配,加糖量约12~14%,溶解糖时要用原酒搅拌溶解。这样,具有浓厚的“玫瑰”香味,酸甜适口的红葡萄酒制成了,但如果在容器中密闭贮存2个月,则酒的风味更加醇厚。

人人可做的小闪电 – 马克思发生器

首先推荐一下该站,挺不错的!

前些日子介绍了特斯拉线圈的做法,效果相当壮观,但是工程也相当浩大,造价挺高,并不是每人都能亲手做一个的。

如果你只是想领略一下高压电火花的魅力,马克思发生器是一个比较好的选择。只要几个电容、电阻,简单的组合一下,很容易得到几厘米长的电弧,相当漂亮。

下面是一款简版的马克思发生器电路图:

这款马克思发生器总共有六级,每一级由0.002uF 20kV的电容和两个1m欧姆的电阻构成。左边是一个霓虹灯变压器(9kV 30mA),它产生的高压交流电,通过10个1N4007串联组成的整流器整为直流电,给并联的六组电容充电,当电容充到一定电压的时,就会击穿电容间的放电尖隙,这时6组电容就变成了串联的形式,电压骤增,开始放电,发出很大的声响并能产生5厘米左右的电弧,大约每2~3秒放电一次。把电容间的放电尖隙改造成球隙,电弧长度还可以大幅度提高,达到15厘米左右。够简单吧!

简单组装:

放电效果:

下面这款是改进型,主要是将上面的霓虹灯变压器换成了自制的高压发生器。它由555时基集成电路和高压晶体管构造而成,驱动一个电视机用的高压包,产生12kV~20kV的高压。

换成自制的高压发生器以后,整个体积就袖珍下来了,可以全部装配在一块小木板上。需要注意的是高压晶体管容易发热,需要配块大点的散热片,最好还装个小小的散热风扇。这款高压发生器可以拉出10厘米长的电弧,够你乐一阵子了!

往下看,还有款9级的,国人制造。

友情提醒:高压危险,玩的时候小心点!

淘宝网:前端安全须知

一、网络安全

机密性(加密)、完整性(防伪造)、来源可靠性(签名)

程序漏洞

二、web前端安全

XSS:Cross Site Script(跨站攻击脚本)

往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行。

XSS的种类:

1.XSS-基于DOM的XSS

产生原因:当web page含有一些不受服务器端控制的DOM的时候发生,通过form、referer、location修改页面DOM。

解决方法:避免客户端的脚本对DOM的重写、重定向及其它敏感的操作,需要在客户端对form输入进行过滤。

可被攻击者利用的脚本:

URL相关操作

document.location=…
document.location.hostname=…
document.location.replace(…)
document.location.assign(…)
document.URL=…
document.referrer
document.URLUnencoded
window.navigate(…)
window.location

直接运行脚本

eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)

直接写入html代码

document.write(…)
document.writeln(…)
document.body.innerHtml=…

直接修改DOM

document.forms[0].action=…
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body
window.attachEvent(…)

打开或修改窗口

document.open(…)
window.open(…)
window.location.href=…

2.XSS-非持久性跨站

产生原因:直接将form或者query(cookie)中的字符带入到页面中,危险query字符参与html的构成(query字符并不被存储)。

解决方法:对输入进行过滤,对输出进行编码。

3.XSS-持久性跨站

产生原因:其破坏页面html结构的原理和非持久XSS一样,只是危险脚本来源不是query字符,而是数据库数据。

解决办法:对输入进行过滤,对输出进行编码。

4.XSS-基于字符集的跨站

产生原因:页面字符集不固定,用户输入非期望字符集的字符,有时会绕过前端的过滤。

解决办法:Web页面一定要指定字符集(GBK),XML中不仅要指定字符集,而且标签要闭合。

5.XSS-基于flash的跨站

产生原因:As脚本可以接受用户输入并操作cookie,攻击者可以配合其他XSS方法将恶意swf文件嵌入页面中。

解决办法:严格管理cookie的读写权限,对flash能接受的用户输入进行过滤和限定。

6.XSS- Self-inflicted XSS

产生原因:攻击者先把页面搞出漏洞,让其他用户再浏览这个有漏洞的页面的时候遭受攻击。这里已经不是严格意义上的XSS了。

解决方法:页面登录超时。

7.XSS-未经验证的跳转构成的跨站

产生原因:如果服务器端做302跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本。
解决方法:在后端来限定所接收的URL来自淘宝并做过滤。

8.XSS-Cookie构成的跨站

产生原因:破坏页面结构的原理和非持久跨站一致,Js或as可操作cookie,通过cookies提交query。

解决办法:一切来自客户端的cookie是不可信的,后端必须对客户端cookie做验证。

9.XSS- Escape-based XSS

产生原因:其破坏页面语义构成的原理和非持久XSS一致,使用畸形的UTF8字符串拼成URL。

解决方法:对输入进行过滤,对输出进行编码。

CSRF:Cross Site Request Forgery(通过肉鸡)(跨站伪造请求)

CSRF的发生:所有需要登录页面中的交互、表单提交、AJAX

CSRF的防范:临时签名(验证码、时间戳)、crumb

淘宝对CSRF的防范:在表单中指定token;

<input type=”hidden” value=”{$token}” name=”_tb_token_”>

在cookie中指定_tb_token_;尽量使用POST方法;Ajax时附带token。

 三、Javascript安全须知

  1. 禁止使用外部引用的js,外链应当完全使用a.tbcdn.cn上的资源文件
  2. 慎用eval,setTimeout,setInterval和从不可信站点获取的字符串操作的函数。
  3. cookies操作一定要征询后端工程师的意见,避免撑破cookies的大小限制了。
  4. 前端代码禁止获取referer,所有referer的操作由后端工程师处理。
  5. 禁止发送页面相关信息到第三方站点
  6. 如果JSON返回的信息里含有用户的私密信息,需要加_tb_token_
  7. 禁止使用script标签来达到跨域访问的目的,应当使用flash实现跨域访问,可信域之间的跨域可以使用iframe
  8. 所有使用的数据必须经过服务端的验证。
  9. js代码需要经过jslint的测试

我们还需要安全规范

页面级的html规范/标准

  • 统一的编码标准(URL/GBK/js unicode)
  • 标签完整性

代码级的coding规范

  • 统一的ajax接口规格
  • 页面中php/jsp和js代码的参数传递
  • 规范的javascript编写习惯

代码review制度

PPT下载:http://www.box.net/shared/qr9t7559a3

我的第五代选择器Icarus – 司徒正美 – 博客园

Icarus是我目前匹配精度最高(通过470个单元测试保证精度),速度最快(IE67下力压jQuery,其他浏览器都是使用querySelectorAll不分上下)的选择器,并且它全面支持CSS3的所有新增伪类,支持jQuery所有自定义伪类,并且支持对XML的查找,支持XML带命名空间的元素的查找(jQuery只能支持不带命名空间的,并且非常容易报错)。

Icarus与jQuery1.7在slickspeed中的速度比赛结果(数值最大代表越慢):

Icarus jQuery1.7 比率
IE7 443 657 1.5
IE6 975 1570 1.6

如果对比早期的jQuery.42就更不用说了,是其两倍以上。

Icarus最大亮点是对XML的完美支持,为此它用得到xpath与getElementsByTagName,对于命名空间的支持,请使用”aaa\\:bbb”方式来查找。

以下就是Icarus用到原生查找API:

  • getElementById
  • getElementsByTagName
  • getElementsByTagNameNS
  • getElementsByClassName
  • evaluate (xpath)
  • selectNodes (xpath)
  • querySelectorAll

Icarus的代码量为930行(不依赖dom的其他模块),jQuery的Sizzle为1500行。

Icarus对CSS3伪类是按W3C的规范来查找,比如:not反选伪类,只支持单个表达式,如div:not(.a),不能用div:not(.a.b),要用就需要多个的反选,div:not(.a):not(.b)。

Icarus虽然支持jQuery的自定义伪类,但并不提倡使用,如位置伪类(:first,:last,:even,:odd,:eq…),我们完全可以使用标准的子元素过滤伪类要代替(:last-child,:first-child,:nth-child(even)…),对于jQuery的自定义表单伪类(:text,:radio….),我们也完全可以使用属性选择器来代替(input[type=text],input[type=radio]….)。总之,不标准的东西活不长,希望大家切记。

下面是Icarus对命名空间的支持演示,例子是inline SVG,由于IE9不支持,请在高版本的标准浏览器中看。在IE10支持SVG后,SVG的应用就大大增多了,因此命名空间的支持是必须的。

        <head>
            <title>icarus svg by 司徒正美</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <script src="http://files.cnblogs.com/rubylouvre/icarus.js"></script>
            <script>
            
                window.onload = function(){
                    alert(dom.query("svg\\:feOffset:first")[0].tagName)
                }
            </script>
        </head>
        <body>
        <svg:svg height="0">
            <!-- Create the filter. Make sure it uses the sRGB colorspace or you're in for some nasty surprises. -->
            <svg:filter color-interpolation-filters="sRGB" id="perspDisp" filterUnits="userSpaceOnUse" x="0%" y="0%" width="512" height="512"  >
                <!-- Move the video 128px to the bottom/right so that the displacement filter can reach 128px to the top/left without reaching beyond the image -->
                <svg:feOffset
                    x="128" y="128" width="256" height="256"
                    dx="128" dy="128"
                    result="displacement"
                    />
                <!-- This actually loads our texture-->
                <svg:feImage
                    id="textureLoader"
                    x="0" y="0" width="256" height="256"
                    xlink:href="texture.tinman.png"
                    />
                <!-- Tile the texture to fill the whole viewport so that the displacement filter can also reach 128px to the bottom/right without leaving the texture -->
                <svg:feTile
                    x="0" y="0" width="512" height="512"
                    result="texture"
                    />
                <!-- Apply the displacement -->
                <svg:feDisplacementMap
                    x="128" y="128" width="256" height="256"
                    in="texture"  in2="displacement"
                    scale="255"
                    xChannelSelector="R" yChannelSelector="G"
                    />
                <!-- Apply the alpha of the displacement map to the final image, so that whatever is transparent in the map is also transparent in the final image -->
                <svg:feComposite
                    in2="displacement"
                    operator="in"
                    />
                <!-- Move the image back to the top/left -->
                <svg:feOffset
                    x="0" y="0" width="256" height="256"
                    dx="-128" dy="-128"
                    />
            </svg:filter>
        </svg:svg>
    </body>
</html>

后话,javascript的选择器基本是为了兼容IE678(IE8的querySelectoAll支持种类太少),以后的选择器基本上是用querySelectorAll与evaluate与matchesSelector来写了,CSS4也很快到来了,带来更多伪类,因此jQuery的自定义伪类基本没有存在的必要。

平衡计算过程分析 翻译

https://sites.google.com/site/onewheeledselfbalancing/Home/links-to-other-self-balancing-projects/self-balancing-software

//手动测试获取一个平衡点的值. 设置这个值让她保持平衡
balance_point = 520; // 它的取值范围为 0 – 1023 需要根据自己的做的设备找个平衡值

加速度计信号处理:

  / *减去偏移* /

 x_acc=(float) (accsum/20) – Balance_point;  // 采集20个加速度值样本,求平均值  再减去我们上面测试出的平衡点, 这样x_acc的平衡点就是0

 if (x_acc<-250) x_acc=-250;  //让加速度值保持在 [-250, 250] 超过的就已经没有意义了. 直接取最大值

  if (x_acc>250) x_acc=250;

/* 测试一个合理的量,我们这里以3.45个单位量等于1度 ( 其实就是吧0-1023区间转换成了 0-360, 这样就可以很清晰的被我们理解, 这样x_acc就变成度数了 ) */

 x_accdeg= (float) x_acc/-3.45; // 这里的这个负号 只是改变下加速度方向

陀螺仪信号处理:

 

  / *减去偏移:传感器读数是1023,因此将是“平衡点”,即我所需的零点,读数减去512 * /

//gangleratedeg 这是角度变化率, 这基本和加数据的处理方法一样.

gangleratedeg=(float)(gyrosum/20 – 508)/4.096;

//限制下取值范围

if (gangleratedeg < -92) gangleratedeg=-92;

if (gangleratedeg >92) gangleratedeg=92;

/*

接下来需要测量下程序运行周期, 测试的时候可以在程序中写入

 PORTB &= (0<<PB2);

然后将示波器接在B2口上这样主程序每次循环的时候都会变化, 这样就能检测出程序的周期了

*/

// 接下来的cycle_time 就是程序的运行周期了, ti 是一个缩放因子 

gyroangledt = (float)ti*cycle_time*gangleratedeg;

// 1度=π/180弧度( ≈0.017453弧度 )  这里是将角度转换为弧度

gangleraterads=(float)gangleratedeg*0.017453;

aa=0.01; // 这个是指在一个周期中, 使用多少加速度去修正上一周期角度, aa 是一个比例值

angle = (float)((1-aa) * (angle+gyroangledt)) + (aa * x_accdeg);

 anglerads=(float)angle*0.017453; //转换为弧度

//定义水平值在-1 与 +1 ,这就代表电机占空, 应该可以理解为平衡

//下面 机器平衡与移动 所要使用的公式:

//level=(float)((k1*anglerads)*overallgain

// 机器的角度乘以 扭矩     陀螺仪测量角度乘以功率  计算出转矩

balance_torque=(float)(4.5*anglerads) + (0.5*gangleraterads);

// 其中 anglerads 这个值包含了陀螺仪的值, 相当于实际的倾斜角, 并且这个值是经过长时间的纠正了的.  gangleraterads反应了陀螺仪长期的值….. 这样做实际上用到P(比例),I(积分)和D(微分)计算上面的公式

// cur_speed 这是一个稳定移动过程中速度的值,移动过程中角度可能会发生一些变化希望能保持一定值, cur_speed 是一个平衡值,  在后面乘以0.999 防止在前进过程中,突然向导致移动突然停止

cur_speed = (float)(cur_speed + (Throttle_pedal * balance_torque * cycle_time)) * 0.999;

// overallgain 这个是启动速度调整

 level = (balance_torque + cur_speed) * overallgain;

//开始做写安全方面的判断

//当电机已经达到最大马力时, 如果还继续向前倾斜, 这将是相当危险的, 所以我们就必须要做个提示器,避免危险发生, 在B1口安装一个LED灯提示或者蜂鸣器, 提示是否走的太快了.

  if (level<-0.7 || level>0.7) {

   PORTB |= (1<<PB1);    //i.e. turn on a warning buzzer

                   }

  else {

   PORTB &= (0<<PB1);

                   }

 //开始启动过程, 每个周期添加0.001 是为了让这启动过程像加速度, 避免突然启动.

  softstart = (float) softstart+0.001;

  if (softstart>1.0) softstart=1.0;

 

刚刚开始测试的时候, 尽量在有护的地方进行. 避免事故

AirScouter 通过小型镭射投影仪投影到视网膜上

前段时间有不少朋友被谷歌眼镜的趣味与实用性所叹服,而事实上日本兄弟公司早在2年前就已推出过功能类似的头戴式显示眼镜了,最近它们对老产品进行了升级,也就是这两款带镜片的WD-100G(裸眼)和不带镜片的WD-100A(戴眼镜人士专用)。其中WD-100G镜片具备视力矫正功能,两款眼镜显示分辨率均为800 × 600 ,显示效果就像是站在1米远的地方观看16英寸显示屏,如果你有兴趣可以试试站在10米远的地方,这时的效果就类似于观看156英寸的显示屏了。

Brother AirScouter使用时需与电脑连接,支持网络电话和实时摄像功能。目前只知道售价可能是199,800日元也就是15495元人民币,我滴个天啊真心贵,不过感兴趣的童鞋可到Brother的官网进行订购,今年8月份上市哟。

购买链接: http://www.brother.co.jp/product/hmd/info/wd100ga/photo/index.htm
https://secure6.brother.co.jp/enquete/form/wid/index.htm

Google 宣布针对青少年的在线科学博览会

小学老师最爱带孩子们去旅游的地方就是科技馆了,这可以让青少年对科学产生浓厚的兴趣,在娱乐中获得知识。于是Google也宣布了一个针对青少年的活动:在线科学博览会(Google Science Fair)

Google Science Fair是跟CERN、乐高集团、国家地理和科学美国人联手举办的在线活动,向全球13-18岁青少年开放,个人或团队可以通过照片和视频提交一个项目、新想法,也可使用Google Site来全方位对自己的想法进行阐述,比如像这样

获奖者将可跟随国家地理探险到加拉帕戈斯群岛探险,可获得奖学金,甚至是可以获得一份工作机会。Google将把所有进入半决赛的15份作品放到网上,邀请他们于7月中旬到Google总部展示自己的项目。

简明Vim练级攻略

导读:本文来自《Learn Vim Progressively》,译文来自酷壳网陈皓整理编译的《简明Vim练级攻略》。这是一篇给新手最好的VIM的升级教程了,没有列举所有的命令,只是列举了那些最有用的命令。非常不错。

文章内容如下:

Vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法。

Vim the Six Billion Dollar editor

Better, Stronger, Faster.

学习vim并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。

我建议下面这四个步骤:

1.存活

2.感觉良好

3.觉得更好,更强,更快

4.使用VIM的超能力

当你读完这篇文章,你会成为一个Vim的superstar。

在开始学习以前,我需要给你一些警告:

  • 学习vim在开始时是痛苦的。
  • 需要时间
  • 需要不断地练习,就像你学习一个乐器一样。
  • 不要期望你能在3天内把vim练得比别的编辑器更有效率。
  • 事实上,你需要2周时间的苦练,而不是3天。

第一级 存活

1.安装 vim

2.启动Vim

3.什么也别干!请先阅读

当你安装好一个编辑器后,你一定会想在其中输入点什么东西,然后看看这个编辑器是什么样子。但vim不是这样的,请按照下面的命令操作:

  • 启动Vim后,vim在 Normal 模式下。
  • 让我们进入Insert模式,请按下键i。(陈皓注:你会看到vim左下角有一个–insert–字样,表示,你可以以插入的方式输入了)
  • 此时,你可以输入文本了,就像你用“记事本”一样。
  • 如果你想返回Normal模式,请按ESC键。

现在,你知道如何在Insert和NormaL模式下切换了。下面是一些命令,可以让你在Normal模式下幸存下来:

i → Insert 模式,按ESC回到Normal模式.

x → 删当前光标所在的一个字符。

:wq → 存盘+退出(:w存盘:q退出)(注::w后可以跟文件名)

dd →删除当前行,并把删除的行存到剪贴板里

p →粘贴剪贴板

推荐:

hjkl(强例推荐使用其移动光标,但不必需)→你也可以使用光标键(←↓↑→).注:j就像下箭头。

:help <command>→显示相关命令的帮助。你也可以就输入 :help 而不跟命令。(注:退出帮助需要输入:q)

你能在vim幸存下来只需要上述的那5个命令,你就可以编辑文本了,你一定要把这些命令练成一种下意识的状态。于是你就可以开始进阶到第二级了。

当是,在你进入第二级时,需要再说一下Normal模式。在一般的编辑器下,当你需要copy一段文字的时候,你需要使用 Ctrl键,比如:Ctrl-C。也就是说,Ctrl键就好像功能键一样,当你按下了功能键Ctrl后,C就不在是C了,而且就是一个命令或是一个快键键了,VIMNormal模式下,所有的键就是功能键了。这个你需要知道。

标记:

  • 下面的文字中,如果是 Ctrl-λ我会写成 <C-λ>.
  • 以 : 开始的命令你需要输入 <enter>回车,例如—如果我写成 :q 也就是说你要输入 :q<enter>.

第二级 感觉良好

上面的那些命令只能让你存活下来,现在是时候学习一些更多的命令了,下面是我的建议:(陈皓注:所有的命令都需要在Normal模式下使用,如果你不知道现在在什么样的模式,你就狂按几次ESC键)

1.各种插入模式

  • a → 在光标后插入
  • o → 在当前行后插入一个新行
  • O → 在当前行前插入一个新行
  • cw → 替换光标所在位置的一个单词

2.简单的移动光标

  • 0 → 数字零,到行头
  • ^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
  • $ → 到本行行尾
  • g_ → 到本行最后一个不是blank字符的位置。
  • /pattern → 搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)

3.拷贝/粘贴 (陈皓注:下面的P应该不分大小写)

  • P → 粘贴
  • yy → 拷贝当前行当行于 ddP

4.Undo/Redo

  • u → undo
  • <C-r> → redo

5.打开/保存/退出/改变文件(Buffer)

  • :e <path/to/file>→打开一个文件
  • :w →存盘
  • :saveas <path/to/file>→另存为 <path/to/file>
  • :x, ZZ 或 :wq→保存并退出(:x表示仅在需要时保存,ZZ不需要输入冒号并回车)
  • :q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
  • :bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)

花点时间熟悉一下上面的命令,一旦你掌握他们了,你就几乎可以干其它编辑器都能干的事了。但是到现在为止,你还是觉得使用vim还是有点笨拙,不过没关系,你可以进阶到第三级了。

第三级 更好,更强,更快

先恭喜你!你干的很不错。我们可以开始一些更为有趣的事了。在第三级,我们只谈那些和vi可以兼容的命令。

更好

下面,让我们看一下vim是怎么重复自己的:

1.. →(小数点)可以重复上一次的命令

2.N<command>→重复某个命令N次

下面是一个示例,找开一个文件你可以试试下面的命令:

2dd → 删除2行

3p → 粘贴文本3次

100idesu [ESC] → 会写下 “desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu “

. →重复上一个命令——100 “desu“.

3. →重复 3 次 “desu”(注意:不是300,你看,VIM多聪明啊).

更强

你要让你的光标移动更有效率,你一定要了解下面的这些命令,千万别跳过

1.NG→到第N行(注:注意命令中的G是大写的,另我一般使用:N到第N行,如:137到第137行)

2.gg→到第一行。(注:相当于1G,或:1)

3.G→到最后一行。

4.按单词移动:

w →到下一个单词的开头。

e →到下一个单词的结尾。

如果你认为单词是由默认方式,那么就用小写的e和w。默认上来说,一个单词由字母,数字和下划线组成(陈皓注:程序变量)

如果你认为单词是由blank字符分隔符,那么你需要使用大写的E和W。(陈皓注:程序语句)

下面,让我来说说最强的光标移动:

  • % : 匹配括号移动,包括 (, {, [. (陈皓注:你需要把光标先移到括号上)
  • * 和 #:匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

相信我,上面这三个命令对程序员来说是相当强大的。

更快

你一定要记住光标的移动,因为很多命令都可以和这些移动光标的命令连动。很多命令都可以如下来干:

<start position><command><end position>

例如 0y$ 命令意味着:

  • 0 → 先到行头
  • y → 从这里开始拷贝
  • $ → 拷贝到本行最后一个字符

你可可以输入 ye,从当前位置拷贝到本单词的最后一个字符。

你也可以输入 y2/foo 来拷贝2个“foo”之间的字符串。

还有很多时间并不一定你就一定要按y才会拷贝,下面的命令也会被拷贝:

  • d (删除 )
  • v (可视化的选择)
  • gU (变大写)
  • gu (变小写)
  • 等等

(注:可视化选择是一个很有意思的命令,你可以先按v,然后移动光标,你就会看到文本被选择,然后,你可能d,也可y,也可以变大写等)

第四级 Vim 超能力

你只需要掌握前面的命令,你就可以很舒服的使用VIM了。但是,现在,我们向你介绍的是VIM杀手级的功能。下面这些功能是我只用vim的原因。

在当前行上移动光标: 0 ^ $ f F t T , ;

  • 0 →到行头
  • ^ →到本行的第一个非blank字符
  • $ →到行尾
  • g_ →到本行最后一个不是blank字符的位置。
  • fa →到下一个为a的字符处,你也可以fs到下一个为s的字符。
  • t, →逗号前的第一个字符。逗号可以变成其它字符。
  • 3fa →在当前行查找第三个出现的a。
  • F 和 T →和 f 和 t 一样,只不过是相反方向。

还有一个很有用的命令是 dt” →删除所有的内容,直到遇到双引号—— “。

区域选择<action>a<object><action>i<object>

在visual模式下,这些命令很强大,其命令格式为

<action>a<object> 和 <action>i<object>

  • action可以是任何的命令,如 d(删除), y (拷贝),v(可以视模式选择)。
  • object可能是: w一个单词, W一个以空格为分隔的单词, s一个句字, p一个段落。也可以是一个特别的字符:”、 ‘、 )、 }、 ]。

假设你有一个字符串 (map (+) (“foo”)).而光标键在第一个 o 的位置。

  • vi” → 会选择 foo.
  • va” → 会选择 “foo”.
  • vi) → 会选择 “foo”.
  • va) → 会选择(“foo”).
  • v2i) → 会选择 map (+) (“foo”)
  • v2a) → 会选择 (map (+) (“foo”))

块操作: <C-v>

块操作,典型的操作: 0 <C-v> <C-d> I– [ESC]

  • ^ →到行头
  • <C-v> →开始块操作
  • <C-d> →向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的)
  • I– [ESC] →I是插入,插入“–”,按ESC键来为每一行生效。

在Windows下的vim,你需要使用 <C-q>而不是 <C-v> ,<C-v> 是拷贝剪贴板。

自动提示: <C-n> <C-p>

在Insert模式下,你可以输入一个词的开头,然后按 <C-p>或是<C-n>,自动补齐功能就出现了……

宏录制:qa操作序列 q, @a, @@

  • qa把你的操作记录在寄存器 a。
  • 于是 @a 会replay被录制的宏。
  • @@是一个快捷键用来replay最新录制的宏。

示例

在一个只有一行且这一行只有“1”的文本中,键入如下命令:

  • qaYp<C-a>q→
    • qa开始录制
    • Yp复制行.
    • <C-a>增加1.
    • q停止录制.
    • @a →在1下面写下 2
    • @@ →在2 正面写下3
    • 现在做 100@@ 会创建新的100行,并把数据增加到 103.

可视化选择: v,V,<C-v>

前面,我们看到了 <C-v>的示例(在Windows下应该是<C-q>),我们可以使用 v和V。一但被选了,你可以做下面的事:

Once the selection made, you can:

  • J→把所有的行连接起来(变成一行)
  • <或>→左右缩进
  • = →自动给缩进(注:这个功能相当强大,我太喜欢了)

在所有被选择的行后加上点东西:

  • <C-v>
  • 选中相关的行(可使用 j 或 <C-d> 或是 /pattern 或是 % 等……)
  • $到行最后
  • A,输入字符串,按ESC。

分屏::splitvsplit.

下面是主要的命令,你可以使用VIM的帮助 :help split. 你可以参考本站以前的一篇文章VIM分屏

  • :split → 创建分屏 (:vsplit创建垂直分屏)
  • <C-w><dir> : dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。
  • <C-w>_ (或 <C-w>|) :最大化尺寸 (<C-w>| 垂直分屏)
  • <C-w>+ (或 <C-w>-):增加尺寸

结束语

  • 上面是作者最常用的90%的命令。
  • 我建议你每天都学1到2个新的命令。
  • 在两到三周后,你会感到vim的强大的。
  • 有时候,学习VIM就像是在死背一些东西。
  • 幸运的是,vim有很多很不错的工具和优秀的文档。
  • 运行vimtutor直到你熟悉了那些基本命令。
  • 其在线帮助文档中你应该要仔细阅读的是 :help usr_02.txt.
  • 你会学习到诸如 !, 目录,寄存器,插件等很多其它的功能。

学习vim就像学弹钢琴一样,一旦学会,受益无穷。

对于vi/vim只是点评一点:这是一个你不需要使用鼠标,不需使用小键盘,只需要使用大键盘就可以完成很多复杂功能文本编辑的编辑器。不然,Visual Studio也不就会有vim的插件了