等不上wwWaa962啦为什么相亲是否应该aa,是跳转到aa962cOm别的地方啦

404 Not Found
404 Not Found
The requested URL was not found on this server.
您要找的内容已被删除等不上wwWaa962啦为什么应该,是跳转到aa962cOm别的地方啦_百度知道
等不上wwWaa962啦为什么应该,是跳转到aa962cOm别的地方啦
我有更好的答案
可答开得你先去i57.p0q.biz吧
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&p&Python可以做的Perl基本上都可以做啊。另外也有些Perl可以做的Python做不了。先占个坑,晚上回家找几个链接给大家看看。&/p&&p&&br&&/p&&p&~~~~~~~~~~晚上到了的分割线~~~~~~~~~~&/p&&p&先贴几个最近看到的:&/p&&ul&&li&拯救强迫症患者&/li&&/ul&&p&油管的链接(需翻墙):&a href=&//link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DaJc5yYONBBc& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&youtube.com/watch?&/span&&span class=&invisible&&v=aJc5yYONBBc&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&这哥们每次开车出门后都会怀疑会不会家里车库门没关好,于是做了个web应用可以远程查看门的状态,并且如有需要可以远程关门。用到了Mojolicious。硬件上有树梅派,红外探头等等。&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//mojolicious.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mojolicious&/a&是现在Perl社区最重要的web框架,可比RoR的。这个强迫症患者Joel Berger,是Mojolicious的核心开发之一,今年的北美Perl大会上他还发表了用Mojolicious + Vue.js几十行代码实现在线聊天室的一个topic:&a href=&//link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DdDH10srLgVc& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&youtube.com/watch?&/span&&span class=&invisible&&v=dDH10srLgVc&/span&&span class=&ellipsis&&&/span&&/a&&/p&&ul&&li&神经网络&/li&&/ul&&p&今年有人写了一个&a href=&//link.zhihu.com/?target=https%3A//metacpan.org/pod/AI%3A%3AMXNet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MXNet的Perl binding&/a&,打破了Perl在该领域内的空白。作者写了三篇blog/tutorial:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//blogs.perl.org/users/sergey_kolychev/2017/02/machine-learning-in-perl.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Machine learning in Perl&/a&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//blogs.perl.org/users/sergey_kolychev/2017/04/machine-learning-in-perl-part2-a-calculator-handwritten-digits-and-roboshakespeare.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Machine learning in Perl, Part2: a calculator, handwritten digits and roboshakespeare.&/a&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//blogs.perl.org/users/sergey_kolychev/2017/10/machine-learning-in-perl-part3-deep-convolutional-generative-adversarial-network.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Machine learning in Perl, Part3: Deep Convolutional Generative Adversarial network&/a&&/p&&ul&&li&卫星通讯地面站&/li&&/ul&&p&在&a href=&//link.zhihu.com/?target=https%3A//www.reddit.com/r/perl/comments/72vjvi/what_is_everyone_currently_working_on_in_perl/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个reddit讨论&/a&里看到的,其中有两个哥们在NASA的毛里求斯站,在COSMIC2(美国和台湾合作的大气监测卫星)项目里分别用Perl在做不同的事情(一开始两个人互相还不知道)。其中一人提到他们的code base有10年历史,曾经尝试从Perl切换到C/C++写了6个月整出了一堆问题,结果回到Perl只3天就都改好了,另外还有计划把其他一些东西从Java迁移到Perl。&/p&&p&&br&&/p&&p&再贴几个Perl做的了而Python做不了的:&/p&&ul&&li&用Perl写英文诗&/li&&/ul&&p&这点知乎上很多人以前提到过,所以这里就只贴一个大骆驼书里的链接了:&a href=&//link.zhihu.com/?target=https%3A//docstore.mik.ua/orelly/perl/prog3/ch27_02.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Perl Poetry (Programming Perl)&/a&&/p&&ul&&li&DSL&/li&&/ul&&p&&a class=&member_mention& href=&//www.zhihu.com/people/2abf13eea52& data-hash=&2abf13eea52& data-hovercard=&p$b$2abf13eea52&&@yunjin tan&/a& 也有提到的。我这里举一个&a href=&//link.zhihu.com/?target=https%3A//metacpan.org/pod/distribution/Module-CPANfile/lib/cpanfile.pod& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cpanfile&/a&的例子。这是Perl社区里用的一种定义软件包依赖关系的格式。看上去有点像是一个普通的文本,实际上是它可运行的Perl代码。Module::CPANfile定义了requires/recommends/conflicts/on等等这些method,所以运行这种cpanfile的内容可以直接得到结构化的依赖信息。另外,Perl的=&符号(亦称fat-comma)在一些场合下可以提高代码可读性(除了下面cpanfile的使用,最常见的一个应用例子是在Moose/Moo的has attribute定义上面。)&/p&&div class=&highlight&&&pre&&code class=&language-perl&&&span class=&n&&requires&/span& &span class=&s&&'Plack'&/span&&span class=&p&&,&/span& &span class=&s&&'1.0'&/span&&span class=&p&&;&/span& &span class=&c1&&# 1.0 or newer&/span&
&span class=&n&&requires&/span& &span class=&s&&'JSON'&/span&&span class=&p&&,&/span& &span class=&s&&'&= 2.00, & 2.80'&/span&&span class=&p&&;&/span&
&span class=&n&&recommends&/span& &span class=&s&&'JSON::XS'&/span&&span class=&p&&,&/span& &span class=&s&&'2.0'&/span&&span class=&p&&;&/span&
&span class=&n&&conflicts&/span& &span class=&s&&'JSON'&/span&&span class=&p&&,&/span& &span class=&s&&'& 1.0'&/span&&span class=&p&&;&/span&
&span class=&n&&on&/span& &span class=&s&&'test'&/span& &span class=&o&&=&&/span& &span class=&k&&sub &/span&&span class=&p&&{&/span&
&span class=&n&&requires&/span& &span class=&s&&'Test::More'&/span&&span class=&p&&,&/span& &span class=&s&&'&= 0.96, & 2.0'&/span&&span class=&p&&;&/span&
&span class=&n&&recommends&/span& &span class=&s&&'Test::TCP'&/span&&span class=&p&&,&/span& &span class=&s&&'1.12'&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&span class=&n&&on&/span& &span class=&s&&'develop'&/span& &span class=&o&&=&&/span& &span class=&k&&sub &/span&&span class=&p&&{&/span&
&span class=&n&&recommends&/span& &span class=&s&&'Devel::NYTProf'&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&ul&&li&ASCII艺术&/li&&/ul&&p&下面这个骆驼形状的是一个Perl代码。试试看运行后会输出什么效果?&/p&&div class=&highlight&&&pre&&code class=&language-perl&&&span class=&c1&&#!/usr/bin/perl -w
# camel code&/span&
&span class=&k&&use&/span& &span class=&n&&strict&/span&&span class=&p&&;&/span&
&span class=&nv&&$_&/span&&span class=&o&&=&/span&&span class=&s&&'ev&/span&
&span class=&s&&
al(&seek\040D&/span&
&span class=&s&&
0;&);foreach(1..3)&/span&
&span class=&s&&
{&DATA&;}my
@camel1my$&/span&
&span class=&s&&
my$Cwhile(
&DATA&){$_=sprintf(&%-6&/span&
&span class=&s&&9s&,$_);my@dromedary
1=split(//);if(defined($&/span&
&span class=&s&&_=&DATA&)){@camel1hum
p=split(//);}while(@dromeda&/span&
&span class=&s&& ry1){my$camel1hump=0my$CAMEL=3;if(defined($_=shif&/span&
&span class=&s&&
t(@dromedary1
))&&/\S/){$camel1hump+=1&&$CAMEL;}&/span&
&span class=&s&&
$CAMEL--;if(d
efined($_=shift(@dromedary1))&&/\S/){&/span&
&span class=&s&&
$camel1hump+=1
&&$CAMEL;}$CAMEL--;if(defined($_=shift(&/span&
&span class=&s&&
@camel1hump))&&/\S/){$camel1hump+=1&&$CAMEL;}$CAMEL--;if(&/span&
&span class=&s&&
defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1&&$CAME&/span&
&span class=&s&&
L;;}$camel.=(split(//,&\040..m`{/J\047\134}L^7FX&))[$camel1h&/span&
&span class=&s&&
ump];}$camel.=&\n&;}@camel1hump=split(/\n/,$camel);foreach(@&/span&
&span class=&s&&
camel1hump){$Camel=$_;y/LJF7\173\175`\047/\061\062\063\&/span&
&span class=&s&&
064\065\066\067\070/;y//JL7F\175\173\047`/;$_=&/span&
&span class=&s&&
print&$_\040$Camel\n&;}foreach(@camel1hump){$Camel=$_;y&/span&
&span class=&s&&
/LJF7\173\175`\047//;y//JL7F\175\173\0 47`/;&/span&
&span class=&s&&
$_=print&\040$_$Camel\n&;}'&/span&&span class=&p&&;;&/span&&span class=&sr&&s/\s*//g&/span&&span class=&p&&;;&/span&&span class=&nb&&eval&/span&&span class=&p&&;&/span&
&span class=&nb&&eval&/span&
&span class=&p&&(&/span&&span class=&s&&&seek\040DATA,0,0;&&/span&&span class=&p&&);&/span&&span class=&nb&&undef&/span&&span class=&vg&&$/&/span&&span class=&p&&;&/span&&span class=&nv&&$_&/span&&span class=&o&&=&/span&&span class=&sr&&&DATA&&/span&&span class=&p&&;&/span&&span class=&sr&&s/\s*//g&/span&&span class=&p&&;(&/span&
&span class=&p&&);;&/span&&span class=&n&&s&/span&
&span class=&p&&;&/span&&span class=&o&&^.*&/span&&span class=&n&&_&/span&&span class=&p&&;;;&/span&&span class=&nb&&map&/span&&span class=&p&&{&/span&&span class=&nb&&eval&/span&&span class=&s&&&print\&$_\&&&/span&&span class=&p&&;}&/span&&span class=&sr&&/.{4}/g&/span&&span class=&p&&;&/span& &span class=&bp&&__DATA__&/span&
&span class=&o&&\&/span&&span class=&mi&&124&/span&
&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&50&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&165&/span&&span class=&o&&\&/span&&span class=&mi&&163&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&157&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span& &span class=&mi&&46&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&41&/span&&span class=&o&&\&/span&&span class=&mi&&0&/span&
&span class=&mi&&40&/span&&span class=&o&&\&/span&&span class=&mi&&143&/span&&span class=&o&&\&/span&&span class=&mi&&141&/span&
&span class=&o&&\&/span&&span class=&mi&&155&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span& &span class=&mi&&54&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&51&/span&&span class=&o&&\&/span&&span class=&mi&&155&/span&&span class=&o&&\&/span&
&span class=&mi&&141&/span&
&span class=&o&&\&/span&&span class=&mi&&147&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mi&&0&/span&
&span class=&mi&&40&/span&&span class=&o&&\&/span&&span class=&mi&&151&/span&&span class=&o&&\&/span&&span class=&mi&&156&/span& &span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&141&/span&
&span class=&o&&\&/span&&span class=&mi&&163&/span&&span class=&o&&\&/span&&span class=&mi&&16&/span& &span class=&mi&&3&/span&&span class=&o&&\&/span&
&span class=&mi&&157&/span&&span class=&o&&\&/span&&span class=&mi&&143&/span&&span class=&o&&\&/span&
&span class=&mi&&151&/span&&span class=&o&&\&/span&&span class=&mi&&141&/span&&span class=&o&&\&/span&&span class=&mi&&16&/span&
&span class=&mi&&4&/span&&span class=&o&&\&/span&&span class=&mi&&151&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&57&/span&&span class=&o&&\&/span&&span class=&mi&&156&/span&
&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&167&/span&
&span class=&o&&\&/span&&span class=&mi&&151&/span&&span class=&o&&\&/span&&span class=&mi&&164&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&50&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&
&span class=&mi&&120&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&45&/span&&span class=&o&&\&/span&&span class=&mi&&162&/span&&span class=&o&&\&/span&
&span class=&mi&&154&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&15&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mi&&163&/span&&span class=&o&&\&/span&
&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&14&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&64&/span&&span class=&o&&\&/span&&span class=&mi&&162&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&41&/span&&span class=&o&&\&/span&&span class=&mi&&144&/span&
&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&
&span class=&mi&&155&/span&&span class=&o&&\&/span&&span class=&mi&&14&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mi&&162&/span&&span class=&o&&\&/span&
&span class=&mi&&153&/span&&span class=&o&&\&/span&&span class=&mo&&04&/span&
&span class=&mi&&0&/span&&span class=&o&&\&/span&&span class=&mi&&157&/span&
&span class=&o&&\&/span&&span class=&mi&&146&/span&&span class=&o&&\&/span&
&span class=&mo&&040&/span&&span class=&o&&\&/span&&span class=&mi&&11&/span&
&span class=&mi&&7&/span&&span class=&o&&\&/span&&span class=&mo&&047&/span&&span class=&o&&\&/span&
&span class=&mi&&122&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&45&/span&&span class=&o&&\&/span&&span class=&mi&&15&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mi&&154&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&54&/span&&span class=&o&&\&/span&&span class=&mi&&171&/span&
&span class=&o&&\&/span&&span class=&mo&&040&/span&
&span class=&o&&\&/span&&span class=&mo&&046&/span&&span class=&o&&\&/span&
&span class=&mo&&012&/span&&span class=&o&&\&/span&&span class=&mi&&101&/span&&span class=&o&&\&/span&&span class=&mi&&16&/span&
&span class=&mi&&3&/span&&span class=&o&&\&/span&&span class=&mi&&16&/span&
&span class=&mi&&3&/span&&span class=&o&&\&/span&&span class=&mi&&15&/span&
&span class=&mi&&7&/span&&span class=&o&&\&/span&&span class=&mi&&143&/span&&span class=&o&&\&/span&&span class=&mi&&15&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mi&&14&/span&
&span class=&mi&&1&/span&&span class=&o&&\&/span&&span class=&mi&&16&/span&
&span class=&mi&&4&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mi&&163&/span&
&span class=&o&&\&/span&&span class=&mo&&054&/span&
&span class=&o&&\&/span&&span class=&mo&&040&/span&
&span class=&o&&\&/span&&span class=&mi&&111&/span&&span class=&o&&\&/span&&span class=&mi&&156&/span&&span class=&o&&\&/span&&span class=&mi&&14&/span&
&span class=&mi&&3&/span&&span class=&o&&\&/span&&span class=&mo&&056&/span&
&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&
&span class=&mi&&125&/span&&span class=&o&&\&/span&&span class=&mi&&163&/span&&span class=&o&&\&/span&&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mi&&14&/span&
&span class=&mi&&4&/span&&span class=&o&&\&/span&&span class=&mo&&040&/span&&span class=&o&&\&/span&
&span class=&mi&&167&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&51&/span&&span class=&o&&\&/span&&span class=&mi&&164&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&50&/span&&span class=&o&&\&/span&&span class=&mi&&0&/span&
&span class=&mi&&40&/span&&span class=&o&&\&/span&&span class=&mi&&160&/span&&span class=&o&&\&/span&
&span class=&mi&&145&/span&&span class=&o&&\&/span&&span class=&mi&&162&/span&
&span class=&o&&\&/span&&span class=&mi&&155&/span&&span class=&o&&\&/span&&span class=&mi&&151&/span&
&span class=&o&&\&/span&&span class=&mi&&163&/span&&span class=&o&&\&/span&&span class=&mi&&163&/span&
&span class=&o&&\&/span&&span class=&mi&&151&/span&&span class=&o&&\&/span&&span class=&mi&&1&/span&
&span class=&mi&&57&/span&&span class=&o&&\&/span&&span class=&mi&&156&/span&&span class=&o&&\&/span&&span class=&mo&&056&/span&
&/code&&/pre&&/div&
Python可以做的Perl基本上都可以做啊。另外也有些Perl可以做的Python做不了。先占个坑,晚上回家找几个链接给大家看看。 ~~~~~~~~~~晚上到了的分割线~~~~~~~~~~先贴几个最近看到的:拯救强迫症患者油管的链接(需翻墙):这哥们每次开…
&figure&&img src=&https://pic2.zhimg.com/v2-c50a7d3c805e8d7dde6a2f8_b.jpg& data-rawwidth=&837& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&837& data-original=&https://pic2.zhimg.com/v2-c50a7d3c805e8d7dde6a2f8_r.jpg&&&/figure&&p&在vim中写代码, 并不是, 我们所见到的代码都要一个个字符输进去, 一定不是这样的.&/p&&p&这篇, 让我们来谈谈如何进行快速编辑.&/p&&p&当然, 一篇文章只能概述, 给大家一些参考, 具体每项都可以自行找相关资料. 很多外链, 莫跳丢了&/p&&p&注意, 其中会涉及到比较多的插件, 而 &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim&/a& 用的是 &a href=&https://link.zhihu.com/?target=https%3A//github.com/junegunn/vim-plug& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-plug&/a&, 如果你用得是其他的插件管理工具, 自行转换.&/p&&h2&textobject&/h2&&p&文本对象, 是进行快速编辑的基础秘诀. 将一个单词, 句子, 段落当成一个对象看待, 可以进行快速选中/替换/删除等操作&/p&&p&有一篇文章解释得很清楚 &a href=&https://link.zhihu.com/?target=http%3A//blog.carbonfive.com//vim-text-objects-the-definitive-guide/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vim Text Objects: The Definitive Guide&/a&&/p&&p&简单说明&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&命令格式:
操作+范围+对象
&/code&&/pre&&/div&&p&对象&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&w
sentence句子
paragraph段落
' & ) ] } & 等成对的
&/code&&/pre&&/div&&p&范围&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&i
所有, 包括成对的引号等
&/code&&/pre&&/div&&p&操作&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&d
&/code&&/pre&&/div&&p&例子, |代表光标位置&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&123(a|bc)456
删除引号内的内容
=& 123()456
删除引号内容, 包括引号
选中引号内内容 abc
&/code&&/pre&&/div&&h2&textobject增强&/h2&&p&vim自带了很多文本对象, 但是还可以进一步增强, 例如, 以行l(line)/以文件e(entire file)/以缩进i(indent)&/p&&p&在 &a href=&https://link.zhihu.com/?target=http%3A//wklken/k-vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim&/a& 中, 加了如下的几个文本对象, 这样, 在写python代码时, 你可以很方便的批量选中同一个缩进里面的所有代码块, 即使代码之间有空行.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& text object
& 支持自定义文本对象
Plug 'kana/vim-textobj-user'
& 增加行文本对象: l
dal yal cil
Plug 'kana/vim-textobj-line'
& 增加文件文本对象: e
dae yae cie
Plug 'kana/vim-textobj-entire'
& 增加缩进文本对象: i
dai yai cii - 相同缩进属于同一块
Plug 'kana/vim-textobj-indent'
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-56aab2a2d7dbe6633f1a_b.jpg& data-rawwidth=&962& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&https://pic3.zhimg.com/v2-56aab2a2d7dbe6633f1a_r.jpg&&&/figure&&br&&p&还有很多插件, 提供了更加丰富的文本对象, 例如, 函数中的参数等. 可以根据需要自行加入&/p&&h2&代码补全&/h2&&p&代码补全, 是必需品, 也是提升效率的大杀器.&/p&&p&对比试用过非常多的补全插件之后, 最终选定了 &a href=&https://link.zhihu.com/?target=https%3A//github.com/valloric/YouCompleteMe& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&YouCompleteMe&/a&. 快速提示/模糊匹配/跳转到函数定义等等, 总之, 非常流畅, 体验很好.&/p&&p&这个插件唯一缺点是: 太难装. 没错, 就是太难装, 对vim版本有要求, 然后在天朝这种网络环境下要拉接近300M的文件下来不是一件很容易的事情, 下完之后还得编译&_&#&/p&&p&但是, 历经千辛万苦之后, 你会发现这是值得的, 有了 YCM, 写代码的速度和质量能提升非常非常非常非常多.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Plug 'Valloric/YouCompleteMe'
&/code&&/pre&&/div&&p&相关配置: &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/vimrc.bundles%23L368& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim vimrc.bundles#L368&/a&&/p&&p&几个常用快捷键,jd/,gd跳转到定义处, ctrl+空格主动触发补全(默认输入2个字符以上自动补, 可以什么都没输入触发补全), ctrl+j/k或者ctrl+p/n进行补全上下选中&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e378b7bc735a8ee49e270_b.jpg& data-rawwidth=&1612& data-rawheight=&677& class=&origin_image zh-lightbox-thumb& width=&1612& data-original=&https://pic3.zhimg.com/v2-e378b7bc735a8ee49e270_r.jpg&&&/figure&&br&&p&如果是golang, 使用 &a href=&https://link.zhihu.com/?target=https%3A//github.com/fatih/vim-go& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-go&/a&&/p&&h2&代码片段&/h2&&p&代码片段, 是代码补全的互补. 当你预先定义一些常用的片段, 就能输入关键字后, 触发补全整个代码片段&/p&&p&这里推荐的插件是 &a href=&https://link.zhihu.com/?target=https%3A//github.com/sirver/ultisnips& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ultisnips&/a&(代码片段补全工具) 配合 &a href=&https://link.zhihu.com/?target=https%3A//github.com/honza/vim-snippets& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-snippets&/a&(常用代码片段, 包含各类预研)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& Group dependencies, vim-snippets depends on ultisnips
& 代码片段快速插入 (snippets中,是代码片段资源,需要学习)
& Snippets are separated from the engine. Add this if you want them:
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
&/code&&/pre&&/div&&p&相关配置: &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/vimrc.bundles%23L410& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim vimrc.bundles#L410&/a&&/p&&p&注意, ultisnips快捷键和YCM冲突, 所以配置两个插件时需注意&/p&&p&举个栗子: 输入class 然后 Tab 触发补全, 就能进行类似完形填空的流程, 一路输入, 然后Tab到下一个框, 几下就能完成一段代码&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3f5f0ecc583b4ae510da125_b.jpg& data-rawwidth=&642& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&642& data-original=&https://pic3.zhimg.com/v2-3f5f0ecc583b4ae510da125_r.jpg&&&/figure&&br&&p&当然, 可以自己添加补充代码片段. &/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&let g:UltiSnipsSnippetsDir = '~/.vim/UltiSnips'
&/code&&/pre&&/div&&p&以python为例, 除了vim-snippets中带的那些补全关键字, 我还配置了很多单字符直接补全python关键字(&a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/UltiSnips/python.snippets& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&github python.snippets&/a&)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&t -& True
f -& False
r -& return
p -& print
&/code&&/pre&&/div&&h2&引号括号等及 html 标签不全&/h2&&p&另一个必须品, 当我们输入引号('' &&), 括号(() [] {}) 以及 html的标签&a&, 这类都是成对出现的, &/p&&p&当我们输入一半, 自动补全另一半字符. 这里用到的插件是 &a href=&https://link.zhihu.com/?target=https%3A//github.com/raimondi/delimitMate& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&delimitMate&/a& 和 &a href=&https://link.zhihu.com/?target=https%3A//github.com/docunext/closetag.vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&closetag.vim&/a&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 自动补全单引号,双引号等
Plug 'Raimondi/delimitMate'
& 自动补全html/xml标签
Plug 'docunext/closetag.vim', { 'for': ['html', 'xml'] }
&/code&&/pre&&/div&&p&然后, 针对Python做了个优化, 可以快速补全docstring&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&&&&
&/code&&/pre&&/div&&p&相关配置: &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/vimrc.bundles%23L442& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim vimrc.bundles#L442&/a&&/p&&p&之前一篇博客: &a href=&https://link.zhihu.com/?target=http%3A//www.wklken.me/posts//vim-plugin-delimitmate.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VIM插件: DELIMITMATE(符号自动补全)&/a&&/p&&h2&多光标编辑&/h2&&p&在编辑一段代码时, 例如, 想修改函数体内某个变量名, 除了用替换(查找+替换相对复杂), 还可以用 &a href=&https://link.zhihu.com/?target=https%3A//github.com/terryma/vim-multiple-cursors& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-multiple-cursors&/a&, 之前写的一篇博客 &a href=&https://link.zhihu.com/?target=http%3A//www.wklken.me/posts//vim-plugin-multiplecursors.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VIM插件: MULTIPLE-CURSORS(多光标操作)&/a&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 多光标选中编辑
& multiplecursors
Plug 'terryma/vim-multiple-cursors'
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-ed0615f65daf6b31e612f8f964fa2287_b.jpg& data-rawwidth=&988& data-rawheight=&305& class=&origin_image zh-lightbox-thumb& width=&988& data-original=&https://pic2.zhimg.com/v2-ed0615f65daf6b31e612f8f964fa2287_r.jpg&&&/figure&&br&&p&相关配置: &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/vimrc.bundles%23L518& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim vimrc.bundles#L518&/a&&/p&&p&配合 &a href=&https://link.zhihu.com/?target=https%3A//github.com/dyng/ctrlsf.vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ctrlsf&/a& 插件, 搜索后多光标直接编辑保存, 简直是重构神器, 后面细说&/p&&h2&快速注释&/h2&&p&很多时候要注释多行的代码, 或者解开注释. 你需要 &a href=&https://link.zhihu.com/?target=https%3A//github.com/scrooloose/nerdcommenter& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&nerdcommenter&/a&&/p&&p&你只需要 选中(shift+v+j/k) 然后 ,cc.
如果仅注释当前行的话, 可以省了选中这一步, 直接,cc&/p&&p&解开注释 ,cu(注意, 这里的,等于&leader&键)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& quick edit
& 快速注释
Plug 'scrooloose/nerdcommenter'
&/code&&/pre&&/div&&p&演示博客: &a href=&https://link.zhihu.com/?target=http%3A//www.wklken.me/posts//vim-plugin-nerdcommenter.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VIM插件: NERDCOMMENTER(快速注释)&/a&&/p&&h2&修改环绕字符&/h2&&p&场景: 给单词加引号, 给十个单词加引号, 删除某一对引号/括号, 加&h1&&/h1&将字符串括起来&/p&&p&用到两个插件 &a href=&https://link.zhihu.com/?target=https%3A//github.com/tpope/vim-surround& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-surround&/a&(负责环绕字符编辑) 和 &a href=&https://link.zhihu.com/?target=https%3A//github.com/tpope/vim-repeat& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-repeat&/a&(负责重复)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 快速加入修改环绕字符
& for repeat -& enhance surround.vim, . to repeat command
Plug 'tpope/vim-repeat' | Plug 'tpope/vim-surround'
&/code&&/pre&&/div&&p&吐槽下, vim-surround快捷键特别感人…..&/p&&p&博客说明: &a href=&https://link.zhihu.com/?target=http%3A//www.wklken.me/posts//vim-plugin-surround-repeat.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VIM插件: SURROUND & REPEAT(成对符号编辑)&/a&&/p&&h2&对齐&/h2&&p&偶尔的需求, 需要根据=或,或者空格, 将多行数据对齐, 之前的一篇博客说明 &a href=&https://link.zhihu.com/?target=http%3A//www.wklken.me/posts//vim-plugin-easyalign.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VIM插件: EASY-ALIGN(快速对齐)&/a&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& easyalign
& 快速赋值语句对齐
Plug 'junegunn/vim-easy-align'
&/code&&/pre&&/div&&p&相关配置: &a href=&https://link.zhihu.com/?target=https%3A//github.com/wklken/k-vim/blob/master/vimrc.bundles%23L466& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&k-vim vimrc.bundles#L466&/a&&/p&&h2&去行尾空格&/h2&&p&轻微强迫症, 忍不了每行代码行尾没用的空格&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& trailingwhitespace
& 快速去行尾空格 [, + &Space&]
Plug 'bronson/vim-trailing-whitespace'
&/code&&/pre&&/div&&p&配了 ,+空格, 一键去除当前文件所有的行尾空格&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& trailingwhitespace {{{
map &leader&&space& :FixWhitespace&cr&
&/code&&/pre&&/div&&p&后面文章会提及vim中那些被动技能, 会提到如何配置保存时自动去除行尾空格&/p&&h2&缩进&/h2&&p&写代码时, 有时候要进行缩进, 选中后, 例如shift-v加jk上下选中多行, &或者&可以进行整体缩进, 但是遇到个问题, 有时候需要多次缩进, 而默认, 缩进一次后, 选中消失, 要操作, 得再次选中…..(&_&#)&/p&&p&增加如下配置, 缩进完自动选中, 可以再次缩进&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 调整缩进后自动选中,方便再次操作
vnoremap & &gv
vnoremap & &gv
&/code&&/pre&&/div&&h2&快速替换/删除最近插入的内容&/h2&&p&当我们插入一段内容, 然后切换到普通模式后, 相对插入的内容进行快速选中, 然后删除或者替换, 可以&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 选中并高亮最后一次插入的内容
nnoremap gv `[v`]
&/code&&/pre&&/div&&h2&python开发&/h2&&p&两个插件推荐&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& 改变编辑时缩进行为, 更友好的缩进
Plug 'hynek/vim-python-pep8-indent'
& import 排序, 强迫症福音
Plug 'fisadev/vim-isort'
&/code&&/pre&&/div&&p&预告: 下一篇, 将快速导航, 如何在项目维度导航跳转&/p&&br&
在vim中写代码, 并不是, 我们所见到的代码都要一个个字符输进去, 一定不是这样的.这篇, 让我们来谈谈如何进行快速编辑.当然, 一篇文章只能概述, 给大家一些参考, 具体每项都可以自行找相关资料. 很多外链, 莫跳丢了注意, 其中会涉及到比较多的插件, 而 …
&p&本文为原创,欢迎转发:&/p&&p&欢迎关注微博与微信号:C语言编程技术分享&/p&&p&C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题。在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中也多多注意。&/p&&p&&b&一、野指针&/b&&br&&/p&&p&野指针这个东东是经常被人提及的,其危害也是大家有目共睹的。我很早之前写过一篇文章来说明野指针的,链接是:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&C程序中可怕的野指针 - 知乎专栏&/a&&br&&/p&&p&有兴趣的朋友可以看看,这里就不多废话了!&/p&&p&&b&二、越界访问&/b&&/p&&p&越界访问最常见的就是使用指针访问数组元素了。比如下面这段代码:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&cp&&#include&/span& &span class=&cpf&&&stdio.h&&/span&&span class=&cp&&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&void&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&};&/span&
&span class=&kt&&int&/span& &span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&number&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&index&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&&span class=&n&&index&/span& &span class=&o&&&&/span& &span class=&mi&&4&/span&&span class=&p&&;&/span& &span class=&n&&index&/span&&span class=&o&&++&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&p&&(&/span&&span class=&n&&p&/span& &span class=&o&&+&/span& &span class=&n&&index&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&代码很好理解,就是用一个指针p,逐个访问数组的每个元素,并打印出来。&/p&&p&当index为3的时候,p + index此时就越出数组的长度了,那么*(p + index)访问的就是数组以外的内容,输出啥呢?看下面的输出结果:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-01c4e71ca5cdeb17eaa7_b.jpg& data-rawwidth=&460& data-rawheight=&162& class=&origin_image zh-lightbox-thumb& width=&460& data-original=&https://pic4.zhimg.com/v2-01c4e71ca5cdeb17eaa7_r.jpg&&&/figure&&p&最后一个数字,是2293468,这是数组以外的元素。&/p&&p&本例中还好,对数组以外的内容只是读取一下而已,如果是写操作的话,会发生什么,看你的人品了!&/p&&p&本文作者:石先生&/p&&p&原文链接:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&C语言指针专题--使用指针要注意这些 - 知乎专栏&/a&&/p&&p&&b&三、指针不可相加&/b&&br&&/p&&p&两个指针相加,你见过吗?相乘呢?看下面的代码:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&cp&&#include&/span& &span class=&cpf&&&stdio.h&&/span&&span class=&cp&&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&void&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&};&/span&
&span class=&kt&&int&/span& &span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&q&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&number&/span&&span class=&p&&;&/span&
&span class=&n&&q&/span& &span class=&o&&=&/span& &span class=&o&&&&/span&&span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&];&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&p&/span& &span class=&o&&+&/span& &span class=&n&&q&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&我运行了下,报了一个错:&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-c4a664d55ea145dc5f7d036_b.jpg& data-rawwidth=&738& data-rawheight=&96& class=&origin_image zh-lightbox-thumb& width=&738& data-original=&https://pic4.zhimg.com/v2-c4a664d55ea145dc5f7d036_r.jpg&&&/figure&先不去管这个错误,我们可以自己想想,两个指针相加,有什么意义呢?指针的值,也是一个数字,只不过这个数字是别人的一个地址,两个指针相加,就是两个地址值相加,确实没啥意义!&/p&&p&但是如果两个指针相减呢?如代码中指针q减去指针p,这个就是有意义了,意义就在于两个指针相隔几个int型元素。有兴趣的朋友可以改下代码看看。&/p&&p&&b&四、多个指针指向同一个常量区域&/b&&br&&/p&&p&先上代码:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&cp&&#include&/span& &span class=&cpf&&&stdio.h&&/span&&span class=&cp&&&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&void&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&s&&&12345&&/span&&span class=&p&&;&/span&
&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&q&/span& &span class=&o&&=&/span& &span class=&s&&&12345&&/span&&span class=&p&&;&/span&
&span class=&k&&const&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&s&&&123456&&/span&&span class=&p&&;&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&p&/span& &span class=&o&&==&/span& &span class=&n&&q&/span&&span class=&p&&));&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&p&/span& &span class=&o&&==&/span& &span class=&n&&r&/span&&span class=&p&&));&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&运行下:&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-ddfce19a94f3_b.jpg& data-rawwidth=&463& data-rawheight=&160& class=&origin_image zh-lightbox-thumb& width=&463& data-original=&https://pic1.zhimg.com/v2-ddfce19a94f3_r.jpg&&&/figure&从结果中可以看到,指针p与q的值是一样的,也就是说,指针p与指针q是指向同一个字符串“12345”,而指针p与指针r就各自指向各自的字符串了。&/p&&p&对于常量字符串“12345”而言,在程序期间,只有自己这一个实体,没有其它的拷贝,指针p和指针q都指向它,这样设计可以节约存储空间。&/p&&br&&br&&p&&b&五、小心sizeof(指针)的用法&/b&&/p&&p&关于sizeof(指针),计算的是指针变量本身占用的字节数,认识不到这一点,就会闹出笑话,比如下面的程序:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&cp&&#include&/span& &span class=&cpf&&&stdio.h&&/span&&span class=&cp&&&/span&
&span class=&kt&&void&/span& &span class=&nf&&print&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&number&/span&&span class=&p&&[])&/span&
&span class=&p&&{&/span&
&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&index&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&&span class=&n&&index&/span& &span class=&o&&&&/span& &span class=&k&&sizeof&/span&&span class=&p&&(&/span&&span class=&n&&number&/span&&span class=&p&&)&/span& &span class=&o&&/&/span& &span class=&k&&sizeof&/span&&span class=&p&&(&/span&&span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]);&/span& &span class=&n&&index&/span&&span class=&o&&++&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&n&&index&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&void&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&number&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&};&/span&
&span class=&kt&&int&/span& &span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&number&/span&&span class=&p&&;&/span&
&span class=&n&&print&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在函数print中,原意是希望通过“sizeof(number) / sizeof(number[0])”来计算出数组的大小,来一个一个输出数组的元素。可实际上呢,根本不是。运行结果如下:&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-d9fa3473fed774099cdb19cd_b.jpg& data-rawwidth=&475& data-rawheight=&140& class=&origin_image zh-lightbox-thumb& width=&475& data-original=&https://pic3.zhimg.com/v2-d9fa3473fed774099cdb19cd_r.jpg&&&/figure&结果只输出了一个元素。&/p&&br&&p&函数print的形参number虽然写的是数组的形式,但是实际上它是一个指针,&/p&&p&sizeof(number) 计算的是指针本身占用的字节数,为4;&/p&&p&sizeof(number[0])计算的是int整型变量占用的字节数,也为4;&br&&/p&&p&因此for循环只循环了一次就结束了。&/p&&br&&p&我曾经也写过一篇文章,来讲解sizeof(数组)和sizeof(指针)的区别,有兴趣的朋友可以看看:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&别混淆了sizeof(数组名)和sizeof(指针) - 知乎专栏&/a&&/p&
本文为原创,欢迎转发:欢迎关注微博与微信号:C语言编程技术分享C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题。在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中也多多注意。一、野指针 野指针这个东东是经常…
&blockquote&Vim from zero to hero - Vim 从入门到精通&/blockquote&&ul&&li&原文地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/mhinz/vim-galore& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mhinz/vim-galore&/a&&/li&&li&原文作者:Marco Hinz&/li&&li&本文地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&&/li&&/ul&&h2&什么是 Vim?&/h2&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.vim.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vim&/a& 是一个历史悠久的文本编辑器,可以追溯到 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/QED_%2528text_editor%2529& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&qed&/a&。&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Bram_Moolenaar& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BramMoolenaar&/a& 于 1991 年发布初始版本。&/p&&p&该项目托管在 &a href=&https://link.zhihu.com/?target=http%3A//www.vim.org/index.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim.org&/a&。&/p&&p&获取 Vim:用包管理器安装或者直接到 &a href=&https://link.zhihu.com/?target=http%3A//vim.org& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&vim.org&/span&&span class=&invisible&&&/span&&/a& &a href=&https://link.zhihu.com/?target=http%3A//www.vim.org/download.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&下载&/a&。&/p&&p&讨论使用相关问题最好使用 &a href=&https://link.zhihu.com/?target=https%3A//groups.google.com/forum/%23%2521forum/vim_use& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim_use&/a& 邮件列表或者使用 IRC(&a href=&https://link.zhihu.com/?target=https%3A//freenode.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Freenode&/a&) 的 #vim 频道。&/p&&p&欢迎加入我们的中文讨论群:&/p&&p&项目在 &a href=&https://link.zhihu.com/?target=https%3A//github.com/vim/vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Github&/a& 上开发,项目讨论请订阅 &a href=&https://link.zhihu.com/?target=https%3A//groups.google.com/forum/%23%2521forum/vim_dev& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim_dev&/a& 邮件列表。&/p&&p&通过阅读 &a href=&https://link.zhihu.com/?target=http%3A//www.viemu.com/a-why-vi-vim.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Why, oh WHY, do those #?@! nutheads use vi?&/a& 来对 Vim 进行大致的了解。&/p&&h2&Vim 哲学&/h2&&p&Vim 采用模式编辑的理念,即它提供了多种模式,按键在不同的模式下作用不同。你可以在 &i&普通模式&/i& 下浏览文件,在 &i&插入模式&/i& 下插入文本,在 &i&可视模式&/i& 下选择行,在 &i&命令模式&/i& 下执行命令等等。起初这听起来可能很复杂,但是这有一个很大的优点:不需要通过同时按住多个键来完成操作,大多数时候你只需要依次按下这些按键即可。越常用的操作,所需要的按键数量越少。&/p&&p&和模式编辑紧密相连的概念是“操作符”和“动作”。_操作符_开始一些行为,例如:修改,删除,或者选择文本。之后你要用一个_动作_来指定需要操作的文本区域。比如,要改变括号内的文本,需要执行 ci( (读做 &i&change inner parentheses&/i&);删除整个段落的内容,需要执行 dap (读做:&i&delete&br&around paragraph&/i&)。&/p&&p&如果你能看见 Vim 老司机操作,你会发现他们使用 Vim 脚本语言就如同钢琴师弹钢琴一样。复杂的操作只需要几个按键就能完成。他们甚至不用刻意去想,因为这已经成为&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Muscle_memory& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&肌肉记忆&/a&了。这减少&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Cognitive_load& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&认识负荷&/a&并帮助人们专注于实际任务。&/p&&h2&入门&/h2&&p&Vim 自带一个交互式的教程,内含你需要了解的最基础的信息,你可以通过终端运行以下命令打开教程:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&$ vimtutor
&/code&&/pre&&/div&&p&不要因为这个看上去很无聊而跳过,按照此教程多练习。你以前用的 IDE 或者其他编辑器很少是有“模式”概念的,因此一开始你会很难适应模式切换。但是你 Vim 使用的越多,&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Muscle_memory& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&肌肉记忆&/a& 将越容易形成。&/p&&p&Vim 基于一个 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Vi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vi&/a& 克隆,叫做 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Stevie_%2528text_editor%2529& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stevie&/a&,支持两种运行模式:&compatible& 和 &nocompatible&。在兼容模式下运行 Vim 意味着使用 vi 的默认设置,而不是 Vim 的默认设置。除非你新建一个用户的 vimrc 或者使用 vim -N 命令启动 Vim,否则就是在兼容模式下运行 Vim!请大家不要在兼容模式下运行 Vim。&/p&&p&下一步&/p&&ol&&li&创建你自己的 &a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E7%25B2%25BE%25E7%25AE%%259A%2584-vimrc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vimrc&/a&。&/li&&li&在第一周准备&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%25A4%%25BF%%25BD%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&备忘录&/a&。&/li&&li&通读&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%259F%25BA%25E7%25A1%2580-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基础&/a&章节了解 Vim 还有哪些功能。&/li&&li&按需学习!Vim 是学不完的。如果你遇到了问题,先上网寻找解决方案,你的问题可能已经被解决了。Vim 拥有大量的参考文档,知道如何利用这些参考文档很有必要:&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E8%258E%25B7%25E5%258F%%25A6%25BB%25E7%25BA%25BF%25E5%25B8%25AE%25E5%258A%25A9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&获取离线帮助&/a&。&/li&&li&浏览&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E9%E5%258A%25A0%25E8%25B5%%25BA%2590& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&附加资源&/a&。&/li&&/ol&&p&最后一个建议:使用&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E6%258F%%25BB%25B6%25E7%25AE%25A1%25E7%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&插件&/a&之前,请先掌握 Vim 的基本操作。很多插件都只是对 Vim 自带功能的封装。&/p&&h2&精简的 vimrc&/h2&&p&用户的 vimrc 配置文件可以放在 ~/.vimrc,或者为了更好的分离放在 ~/.vim/vimrc,后者更便于通过版本控制软件备份和同步整个配置,比方说 Github。&/p&&p&你可以在网上找到许多精简的 vimrc 配置文件,我的版本可能并不是最简单的版本,但是我的版本提供了一套我认为良好的,非常适合入门的设置。&/p&&p&最终你需要阅读完那些设置,然后自行决定需要使用哪些。:-)&/p&&p&精简的 vimrc 地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn/blob/master/contents/minimal-vimrc.vim& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&minimal-vimrc&/a&&/p&&p&如果你有兴趣,这里是我(原作者)的 &a href=&https://link.zhihu.com/?target=https%3A//github.com/mhinz/dotfiles/blob/master/vim/vimrc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vimrc&/a&。&/p&&p&&b&建议&/b&:大多数插件作者都维护不止一个插件并且将他们的 vimrc 放在 Github 上展示(通常放在叫做 &vim-config& 或者 &dotfiles& 的仓库中),所以当你发现你喜欢的插件时,去插件维护者的 Github 主页看看有没有这样的仓库。&/p&&h2&我正在使用什么样的 Vim&/h2&&p&使用 :version 命令将向你展示当前正在运行的 Vim 的所有相关信息,包括它是如何编译的。&/p&&p&第一行告诉你这个二进制文件的编译时间和版本号,比如:7.4。接下来的一行呈现 Included patches: 1-1051,这是补丁版本包。因此你 Vim 确切的版本号是
7.4.1051。&/p&&p&另一行显示着一些像 Tiny version without GUI 或者 Huge version with GUI 的信息。很显然这些信息告诉你当前的 Vim 是否支持 GUI,例如:从终端中运行 gvim 或者从终端模拟器中的 Vim 内运行 :gui 命令。另一个重要的信息是 Tiny 和 Huge。Vim 的特性集区分被叫做 tiny,small,normal,big and huge,所有的都实现不同的功能子集。&/p&&p&:version 主要的输出内容是特性列表。+clipboard 意味这剪贴板功能被编译支持了,-clipboard 意味着剪贴板特性没有被编译支持。&/p&&p&一些功能特性需要编译支持才能正常工作。例如:为了让 :prof 工作,你需要使用 huge 模式编译的 Vim,因为那种模式启用了 +profile 特性。&/p&&p&如果你的输出情况并不是那样,并且你是从包管理器安装 Vim 的,确保你安装了 vim-x,vim-x11,vim-gtk,vim-gnome 这些包或者相似的,因为这些包通常都是 huge 模式编译的。&/p&&p&你也可以运行下面这段代码来测试 Vim 版本以及功能支持:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&& Do something if running at least Vim 7.4.42 with +profile enabled.
if (v:version & 704 || v:version == 704 && has('patch42')) && has('profile')
& do stuff
&/code&&/pre&&/div&&p&相关帮助:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:h :version
:h feature-list
:h +feature-list
&/code&&/pre&&/div&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%25A4%%25BF%%25BD%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&备忘录&/h2&&p&为了避免版权问题,我只贴出链接:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&people.csail.mit.edu/vg&/span&&span class=&invisible&&od/vim/vim-cheat-sheet-en.png&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//cdn.shopify.com/s/files/1//files/preview.png& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&cdn.shopify.com/s/files&/span&&span class=&invisible&&/1//files/preview.png&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.nathael.org/Data/vi-vim-cheat-sheet.svg& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&nathael.org/Data/vi-vim&/span&&span class=&invisible&&-cheat-sheet.svg&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&michael.peopleofhonoronly.com&/span&&span class=&invisible&&/vim/vim_cheat_sheet_for_programmers_screen.png&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.rosipov.com/images/posts/vim-movement-commands-cheatsheet.png& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&rosipov.com/images/post&/span&&span class=&invisible&&s/vim-movement-commands-cheatsheet.png&/span&&span class=&ellipsis&&&/span&&/a&&/li&&/ul&&p&或者在 Vim 中快速打开备忘录:&a href=&https://link.zhihu.com/?target=https%3A//github.com/lifepillar/vim-cheat40& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-cheat40&/a&。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%259F%25BA%25E7%25A1%2580-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&基础&/h2&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E7%25BC%%%25E5%258C%25BA%25E7%25AA%%258F%25A3%25E6%25A0%%25AD%25BE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&缓冲区,窗口,标签&/h2&&p&Vim 是一个文本编辑器。每次文本都是作为&b&缓冲区&/b&的一部分显示的。每一份文件都是在他们自己独有的缓冲区打开的,插件显示的内容也在它们自己的缓冲区中。&/p&&p&缓冲区有很多属性,比如这个缓冲区的内容是否可以修改,或者这个缓冲区是否和文件相关联,是否需要同步保存到磁盘上。&/p&&p&&b&窗口&/b& 是缓冲区上一层的视窗。如果你想同时查看几个文件或者查看同一文件的不同位置,那样你会需要窗口。&/p&&p&请别把他们叫做_分屏_。你可以把一个窗口分割成两个,但是这并没有让这两个窗口完全_分离_。&/p&&p&窗口可以水平或者竖直分割并且现有窗口的高度和宽度都是可以被调节设置的,因此,如果你需要多种窗口布局,请考虑使用标签。&/p&&p&&b&标签页&/b& (标签)是窗口的集合。因此使用标签当你想使用多种窗口布局的时候。&/p&&p&简单的说,如果你启动 Vim 的时候没有附带任何参数,你会得到一个包含着一个呈现一个缓冲区的窗口的标签。&/p&&p&顺带提一下,缓冲区列表是全局可见的,你可以在任何标签中访问任何一个缓冲区。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%25B7%25B2%25E6%25BF%%25B4%25BB%25E5%25B7%25B2%25E8%25BD%25BD%25E5%%25E5%25B7%25B2%25E5%E5%2587%25BA%25E5%25B7%25B2%25E5%2591%25BD%25E5%E7%25BC%%%25E5%258C%25BA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&已激活,已载入,已列出,已命名,缓冲区&/h2&&p&用类似 vim file1 的命令启动 Vim 。这个文件的内容将会被加载到缓冲区中,你现在有一个&b&已载入的缓冲区&/b&。如果你在 Vim 中保存这个文件,缓冲区内容将会被同步到磁盘上(写回文件中)。&/p&&p&由于这个缓冲区也在一个窗口上显示,所以他也是一个&b&已激活的缓冲区&/b&。如果你现在通过 :e file2 命令加载另一个文件,file1 将会变成一个&b&隐藏的缓冲区&/b&,并且 file2 变成已激活缓冲区。&/p&&p&使用 :ls 我们能够列出所有可以列出的缓冲区。插件缓冲区和帮助缓冲区通常被标记为不可以列出的缓冲区,因为那并不是你经常需要在编辑器中编辑的常规文件。通过 :ls! 命令可以显示被放入缓冲区列表的和未被放入列表的缓冲区。&/p&&p&&b&未命名的缓冲区&/b&是一种没有关联特定文件的缓冲区,这种缓冲区经常被插件使用。比如 :enew 将会创建一个无名临时缓冲区。添加一些文本然后使用 :w /tmp/foo 将他写入到磁盘,这样这个缓冲区就会变成一个&b&已命名的缓冲区&/b&。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%258F%%%25E5%E8%25A1%25A8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&参数列表&/h2&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E7%25BC%%%25E5%258C%25BA%25E7%25AA%%258F%25A3%25E6%25A0%%25AD%25BE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&全局缓冲区列表&/a&是 Vim 的特性。在这之前的 vi 中,仅仅只有参数列表,参数列表在 Vim 中依旧可以使用。&/p&&p&每一个通过 shell 命令传递给 Vim 的文件名都被记录在一个参数列表中。可以有多个参数列表:默认情况下所有参数都被放在全局参数列表下,但是你可以使用 :arglocal 命令去创建一个新的本地窗口的参数列表。&/p&&p&使用 :args 命令可以列出当前参数。使用 :next,:previous,:first,:last 命令可以在切换在参数列表中的文件。通过使用 :argadd,:argdelete 或者 :args 等命令加上一个文件列表可以改变参数列表。&/p&&p&偏爱缓冲区列表还是参数列表完全是个人选择,我的印象中大多数人都是使用缓冲区列表的。&/p&&p&然而参数列表在有些情况下被大量使用:批处理&br&使用 :argdo! 一个简单的重构例子:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:args **/*.[ch]
:argdo %s/foo/bar/ge | update
&/code&&/pre&&/div&&p&这条命令将替换掉当前目录下以及当前目录的子目录中所有的 C 源文件和头文件中的“foo”,并用“bar”代替。&/p&&p&相关帮助::h argument-list&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E6%258C%%2594%25AE%25E6%%25E5%25B0%2584& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&按键映射&/h2&&p&使用 :map 命令家族你可以定义属于你自己的快捷键。该家族的每一个命令都限定在特定的模式下。从技术上来说 Vim 自带高达 12 中模式,其中 6 种可以被映射。另外一些命令作用于多种模式:&/p&&p&
&br&:map&br&:noremap&br&normal, visual, operator-pending&br&:nmap&br&:nnoremap&br&normal&br&:xmap&br&:xnoremap&br&visual&br&:cmap&br&:cnoremap&br&command-line&br&:omap&br&:onoremap&br&operator-pending&br&:imap&br&:inoremap&br&insert&br&&/p&&p&例如:这个自定义的快捷键只在普通模式下工作。&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:nmap &space& :echo &foo&&cr&
&/code&&/pre&&/div&&p&使用 :nunmap &space& 可以取消这个映射。&/p&&p&对于更少数,不常见的模式(或者他们的组合),查看 :h map-modes。&/p&&p&到现在为止还好,对新手而言有一个问题会困扰他们::nmap 是&b&递归执行&/b&的!结果是,右边执行可能的映射。&/p&&p&你自定义了一个简单的映射去输出“Foo”:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:nmap b :echo &Foo&&cr&
&/code&&/pre&&/div&&p&但是如果你想要映射 b (回退一个单词)的默认功能到一个键上呢?&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:nmap a b
&/code&&/pre&&/div&&p&如果你敲击a,我们期望着光标回退到上一个单词,但是实际情况是“Foo”被输出到命令行里!因为在右边,b 已经被映射到别的行为上了,换句话说就是 :echo &Foo&&cr&。&/p&&p&解决此问题的正确方法是使用一种_非递归_的映射代替:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:nnoremap a b
&/code&&/pre&&/div&&p&经验法则:除非递归是必须的,否则总是使用非递归映射。&/p&&p&通过不给一个右值来检查你的映射。比如:nmap 显示所以普通模式下的映射,:nmap &leader& 显示所有以 &leader& 键开头的普通模式下的映射。&/p&&p&如果你想禁止用标准映射,把他们映射到特殊字符 &nop& 上,例如::noremap &left& &nop&。&/p&&p&相关帮助:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:h key-notation
:h mapping
&/code&&/pre&&/div&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E6%%25E5%25B0%%258D%25A0%25E4%25BD%258D%25E7%25AC%25A6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&映射占位符&/h2&&p&映射占位符(Leader 键)本身就是一个按键映射,默认为 \。我们可以通过在 map 中调用 &leader& 来为把它添加到其他按键映射中。&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&nnoremap &leader&h :helpgrep&space&
&/code&&/pre&&/div&&p&这样,我们只需要先按 \ 然后连续按 \h 就可以激活这个映射 :helpgrep&space&。如果你想通过先按 空格 键来触发,只需要这样做:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&let mapleader = ' '
nnoremap &leader&h :helpgrep&space&
&/code&&/pre&&/div&&p&另外,还有一个叫 &localleader& 的,可以把它理解为局部环境中的 &leader&,默认值依然为 \。当我们需要只对某一个条件下(比如,特定文件类型的插件)的缓冲区设置特别的 &leader& 键,那么我们就可以通过修改当前环境下的 &localleader& 来实现。&/p&&p&&b&注意&/b&:如果你打算设置 Leader 键,请确保在设置按键映射之前,先设置好 Leader 键。如果你先设置了含有 Leader 键的映射,然后又修改了 Leader 键,那么之前映射内的 Leader 键是不会因此而改变的。你可以通过执行 :nmap &leader& 来查看普通模式中已绑定给 Leader 键的所有映射。&/p&&p&请参阅 :h mapleader 与 :h maploacalleader 来获取更多帮助。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%25AF%%25AD%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&寄存器&/h2&&p&寄存器就是存储文本的地方。我们常用的「复制」操作就是把文本存储到寄存器,「 粘贴」 操作就是把文本从寄存器中读出来。顺便,在 Vim 中复制的快捷键是 y,粘贴的快捷键是 p。&/p&&p&Vim 为我们提供了如下的寄存器:&/p&&p&类型&br&标识&br&读写者&br&是否为只读&br&包含的字符来源&br&Unnamed&br&&&br&vim&br&否&br&最近一次的复制或删除操作 (d, c, s, x, y)&br&Numbered&br&0至9&br&vim&br&否&br&寄存器 0: 最近一次复制。寄存器 1: 最近一次删除。寄存器 2: 倒数第二次删除,以此类推。对于寄存器 1 至 9,他们其实是只读的最多包含 9 个元素的队列。这里的队列即为数据类型 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Queue_%2528abstract_data_type%2529& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&queue&/a&&br&Small delete&br&-&br&vim&br&否&br&最近一次行内删除&br&Named&br&a至z, A至Z&br&用户&br&否&br&如果你通过复制操作存储文本至寄存器 a,那么 a 中的文本就会被完全覆盖。如果你存储至 A,那么会将文本添加给寄存器 a,不会覆盖之前已有的文本&br&Read-only&br&:与.和%&br&vim&br&是&br&:: 最近一次使用的命令,.: 最近一次添加的文本,%: 当前的文件名&br&Alternate buffer&br&#&br&vim&br&否&br&大部分情况下,这个寄存器是当前窗口中,上一次访问的缓冲区。请参阅 :h alternate-file 来获取更多帮助&br&Expression&br&=&br&用户&br&否&br&复制 VimL 代码时,这个寄存器用于存储代码片段的执行结果。比如,在插入模式下复制 &c-r&=5+5&cr&,那么这个寄存器就会存入 10&br&Selection&br&+和*&br&vim&br&否&br&* 和 + 是 &a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E5%2589%25AA%25E8%25B4%25B4%25E6%259D%25BF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&剪贴板&/a& 寄存器&br&Drop&br&~&br&vim&br&是&br&最后一次拖拽添加至 Vim 的文本(需要 &+dnd& 支持,暂时只支持 GTK GUI。请参阅 :help dnd 及 :help quote~)&br&Black hole&br&_&br&vim&br&否&br&一般称为黑洞寄存器。对于当前操作,如果你不希望在其他寄存器中保留文本,那就在命令前加上 _。比如,&_dd 命令不会将文本放到寄存器 &、1、+ 或 * 中&br&Last search pattern&br&/&br&vim&br&否&br&最近一次通过 /、? 或 :global 等命令调用的匹配条件&br&&/p&&p&只要不是只读的寄存器,用户都有权限修改它的内容,比如:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:let @/ = 'register'
&/code&&/pre&&/div&&p&这样,我们按 n 的时候就会跳转到单词&register& 出现的地方。&/p&&p&有些时候,你的操作可能已经修改了寄存器,而你没有察觉到。请参阅 :h registers 获取更多帮助。&/p&&p&上面提到过,复制的命令是 y,粘贴的命令是 p 或者 P。但请注意,Vim 会区分「字符选取」与「行选取」。请参阅 :h linewise 获取更多帮助。&/p&&p&&b&行选取&/b&:&br&命令 yy 或 Y 都是复制当前行。这时移动光标至其他位置,按下 p 就可以在光标下方粘贴复制的行,按下 P 就可以在光标上方粘贴至复制的行。&/p&&p&&b&字符选取&/b&:&br&命令 0yw 可以复制第一个单词。这时移动光标至其他位置,按下 p 就可以在当前行、光标后的位置粘贴单词,按下 P 就可以在当前行、光标前的位置粘贴单词。&/p&&p&&b&将文本存到指定的寄存器中&/b&:&br&命令 &aY 可以将当前行复制,并存储到寄存器 a 中。这时移动光标至其他位置,通过命令 &AY 就可以把这一行的内容扩展到寄存器 a 中,而之前存储的内容也不会丢失。&/p&&p&为了便于理解和记忆,建议大家现在就试一试上面提到的这些操作。操作过程中,你可以随时通过 :reg 来查看寄存器的变化。&/p&&p&&b&有趣的是&/b&:&br&在 Vim 中,y 是复制命令,源于单词 &yanking&。而在 Emacs 中,&yanking& 代表的是粘贴(或者说,重新插入刚才删掉的内容),而并不是复制。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E8%258C%%259B%25B4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wsdjeg/vim-galore-zh_cn&/a&范围&/h2&&p&范围 (Ranges) 其实很好理解,但很多 Vim 用户的理解不到位。&/p&&ul&&li&很多命令都可以加一个数字,用于指明操作范围&/li&&li&范围可以是一个行号,用于指定某一行&/li&&li&范围也可以是一对通过 , 或 ; 分割的行号&/li&&li&大部分命令,默认只作用于当前行&/li&&li&只有 :write 和 :global 是默认作用于所有行的&/li&&/ul&&p&范围的使用是十分直观的。以下为一些例子(其中,:d 为 :delete 的缩写):&/p&&p&命令&br&操作的行&br&:d&br&当前行&br&:.d&br&当前行&br&:1d&br&第一行&br&:$d&br&最后一行&br&:1,$d&br&所有行&br&:%d&br&所有行(这是 1,$ 的语法糖)&br&:.,5d&br&当前行至第 5 行&br&:,5d&br&同样是当前行至第 5 行&br&:,+3d&br&当前行及接下来的 3 行&br&:1,+3d&br&第一行至当前行再加 3 行&br&:,-3d&br&当前行及向上的 3 行(Vim 会弹出提示信息,因为这是一个保留的范围)&br&:3,'xdelete&br&第三行至&a href=&https://link.zhihu.com/?target=https%3A//github.com/wsdjeg/vim-galore-zh_cn%23%25E6%25A0%%25B3%25A8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&标注&/a& 为 x 的那一行&br&:/^foo/,$delete&br&当前行以下,以字符 &foo& 开头的那一行至结尾&br&:/^foo/+1,$delete&br&当前行以下,以字符 &foo& 开头的那一行的下一行至结尾&br&&/p&&p&需要注意的是,; 也可以用于表示范围。区别在于,a,b 的 b 是以当前行作为参考的。而b 的 b 是以 a 行作为参考的。举个例子,现在你的光标在第 5 行。这时 :1,+1d 会删除第 1 行至第 6 行,而 :1;+1d 会删除第 1 行和第 2 行。&/p&&p&如果你想设置多个寻找条件,只需要在条件前加上 /,比如:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&:/foo//bar//quux/d
&/code&&/pre&&/div&&p&这就会删除当前行之后的某一行。定位方式是,先在当前行之后寻找第一个包含 &foo& 字符的那一行,然后在找到的这一行之后寻找第一个包含 &bar& 字符的那一行,然后再在找到的这一行之后寻找第一个包含 &quux& 的那一行。删除的就是最后找到的这一行。&/p&&p&有时,Vim 会在命令前自动添加范围。举个例子,如果你先通过 V 命令进入行选取模式,选中一些行后按下 : 进入命令模式,这时候你会发现 Vim 自动添加了 '&,'& 范围。这表示,接下来的命令会使用之前选取的行号作为范围。但如果后续命令不支持范围,Vim 就会报错。为了避免这样的情况发生,有些人会设置这样的按键映射::vnoremap foo :&c-u&command,组合键 Ctrl + u 可以清除当前命令行中的内容。&/p&&p&另一个例子是在普通模式中按下 !!,命令行中会出现 :.!。如果这时你如果输入一个外部命令,那么当前行的内容就会被这个外部命令的输出替换。你也可以通过命令 :?^$?+1,/^$/-1!ls 把当前段落的内容替换成外部命令 ls 的输出,原理是向前和向后各搜索一个空白行,删除这两个空白行之间的内容,并将外部命令 ls 的输出放到这两个空白行之间。&/p&&p&请参阅以下两个命令来获取更多帮助

我要回帖

更多关于 http www.962aa.com 的文章

 

随机推荐