IDEA怎么打开显卡控制面板mawvn面板

ieeeidea喜欢的音乐 - 歌单 - 网易云音乐
ieeeidea喜欢的音乐
播放:156次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:最近也在学ZeroMQ,先列一些前辈们的学习心得吧:
&a href=&http://www.zhihu.com/question/& class=&internal&&RabbitMQ, ZeroMQ, Kafka 是一个层级的东西吗, 相互之间有哪些优缺点? - 消息队列&/a& &a href=&//link.zhihu.com/?target=http%3A//blog.ez2learn.com//transport-lib-of-new-era-zeromq/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&新世紀通訊函式庫&i class=&icon-external&&&/i&&/a&
(这篇是繁体的,我用firefox的一个插件“同文堂”转换一下看。)&/p&&p&然后这里说一下自己的一些体会:
1. 首先弄明白0MQ中的“socket”和传统意义上socket的一些差异。
我认为ZeroMQ不能算作单纯的socket库,它应该算是一个messaging library,一个“轻量级”的消息队列库(这里所说的“轻量级”是与过去一些企业级的消息队列对比而言的)。正如我前面列出的两个大神所说的:socket只是表现形式,而通信模式才是其本质。
也就是说,在学0MQ的时候,不要把0MQ中的socket和系统本身的socket弄混。我们可以看看zmq_socket的文档:
&a href=&//link.zhihu.com/?target=http%3A//api.zeromq.org/3-2%3Azmq-socket& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zmq_socket(3)&i class=&icon-external&&&/i&&/a& (zguide告诉我们,这份文档要时不时的拿出来要多读几遍)
注意,每一种不同类型的“socket”,都有自己的消息模式。这其中包括该类型套接字可以和哪些套接字连接到一起工作啊(Compatible peer sockets)、消息传递的方向啊(Direction)、消息收发模式啊(Send/receive pattern)、还有Outgoing routing和Incoming routing用到的一些调度算法啊(比如:Round-robin、Fair-queued,这些调度算法在操作系统课程中应该会有涉及)。当我们创建一个0MQ套接字后,我们实际上得到的是一个加了各种特效的“socket”。
上面一段话,我意在说明,0MQ中的“socket”没那么简单。借用@Dirk Chang答案中“模式”一词,0MQ实际上是把一些在实践中总结出来的消息通信模型封装成不同类型的套接字,以供我们使用。&/p&&p&我认为,这个帖子中很好地阐明了0MQ中“socket”的含义:
&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/questions//does-pyzmq-handle-creating-threads-for-each-new-client-connection& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zeromq - Does PyZMQ handle creating threads for each new client connection?&i class=&icon-external&&&/i&&/a&&/p&&br&&p&2.
我刚学0MQ的时候总是纠结于“客户端”、“服务端”的概念。比如REQ-REP模式中,究竟哪一端该作为客户端,那一端作为服务端呢?
实际上,这也算是个小误区吧!因为我们不是在用传统TCP中的Server-client。
在传统TCP中的Server-client中,server要先启动,然后bind到一个端口,等待client调用connect连接它。
而0MQ中调用zmq_bind和调用zmq_connect的双方没有那么严格的先后顺序。这也是0MQ有趣的特性之一。直接引用zguide的中的文字吧:&/p&&p&To create a connection between two nodes, you use zmq_bind()
in one node and zmq_connect()
in the other. As a general rule of thumb, the node that does zmq_bind()
is a &server&, sitting on a well-known network address, and the node which does zmq_connect()
is a &client&, with unknown or arbitrary network addresses. Thus we say that we &bind a socket to an endpoint& and &connect a socket to an endpoint&, the endpoint being that well-known network address.&/p&&p&Many architectures follow some kind of client/server model, where the server is the component that is most static, and the clients are the components that are most dynamic, i.e., they come and go the most. There are sometimes issues of addressing: servers will be visible to clients, but not necessarily vice versa. So mostly it's obvious which node should be doing zmq_bind()
(the server) and which should be doing zmq_connect()
(the client). It also depends on the kind of sockets you're using, with some exceptions for unusual network architectures.&/p&&p&简而言之,这段话实际上在讲,在0MQ中,我们会用它提供的套接字构建一个messaging topology,我们通常认为server端应该是这个topology中比较稳定的组件,由这些比较稳定的组件来调用zmq_bind,而client则是比较动态的部分,它们来来去去,所以我们通常会调用zmq_connect将它们连接到这个topology中比较稳定的部分。比如,在0MQ中,我们会接触到messaging broker的概念,通常messaging broker会调用zmq_bind,作为服务端存在。&/p&&p&3. 0MQ的一些特点
(1) 速度快
ZeroMQ的第一个特点就是速度快,这篇帖子中大致给了我们一个这样的概念:
&a href=&//link.zhihu.com/?target=http%3A//www.oschina.net/news/17973/message-queue-shootout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&4 款消息队列软件产品大比拼&i class=&icon-external&&&/i&&/a&
首先,再推荐一位大婶的博客:
&a href=&//link.zhihu.com/?target=http%3A//oldratlee.com/post//synchronous-rpc-vs-asynchronous-message& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合_Pragmatistic Guy&i class=&icon-external&&&/i&&/a&&/p&&p&0MQ提供的都是一些基本组件,它允许我们自己搭建自己的messaging topology。所以说,0MQ是很灵活的。
本答案的第二个链接中提到,传统的消息队列中有一个“中央集权式”的messaging broker,该messaging broker通常会负责消息在各个节点之间的传输。而0MQ呢,用zguide中的话讲,就是:decentralized。你看,0MQ并不要求你的messaging topology中央必须是一个message broker(这个message broker可能作为消息的存储、转发中心)。在一些简单的通信模型中,省去message broker确实为我们省去了很多工作。而且我们也无需为message broker专门搭建一个服务器。
我们也许会问,如果缺少了message broker,那么未及发送/接受的消息会不会丢失呢?不同担心。因为通常情况下,0MQ中一些套接字本身自带一个buffer,会把这些消息先存下来。&/p&&p&但是ZeroMQ的去中心化不代表完完全全的去中心化。我认为,ZMQ把建立message broker的自由交给了我们。这样,我们可以在有需要的时候建立一个proxy,来简化网络的复杂性和维护城北。zguide中讲到的The Dynamic Discovery Problem、Shared Queue其实都是在教我们在不同场景下应该怎样建立一个broker来降低网络的复杂性而提升其灵活性。
而且,对于一个复杂的消息拓扑,“各自为政”(见:&a href=&//link.zhihu.com/?target=http%3A//blog.ez2learn.com//transport-lib-of-new-era-zeromq/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&新世紀通訊函式庫&i class=&icon-external&&&/i&&/a&)会可能需要在加入新的节点时重新配置消息拓扑(这会在什么情况下发生,具体可以参考zguide中在介绍The Dynamic Discovery Problem、Shared Queue时引入的例子)。&/p&&p&zguide中描述The Dynamic Discovery Problem这个问题时,拿PUB-SUB模式来举例,说明了使用中间件可以降低两两互联网络的维护成本。中间件的引入使网络更加灵活,因而增加新的节点更加简单。如果不采用中间件,则每次增加新的节点时(比如增加一个新的PUB节点),要重新配置该新节点和现有其他节点之间的关系(比如,把刚才新增的PUB节点和所有现有的SUB节点相连)。&/p&&p&再引用一段zguide中的文字:
You might wonder, if all networks eventually get large enough to need intermediaries, why don't we simply have a message broker in place for all applications? For beginners, it's a fair compromise. Just always use a star topology, forget about performance, and things will usually work. However, message broke in their role as central intermediaries, they become too complex, too stateful, and eventually a problem.&/p&&p&我们通过往网络中加入中间件的方法来降低网络的复杂性,这是一个比较普遍的需求。然而ZMQ并没有因该需求的普遍性而在库中内置形如message borker这样的中间件。该段话阐述了ZMQ这样做的原因:中间件本身是违背ZMQ“去中心化”的设计思想的,而且中间件会变得很复杂。所以,ZMQ把构建中间件的自由给了我们。而且,用ZMQ实现形如message broker这样的消息中间件并不复杂。&/p&&p&通过上面这些讨论,可以看出ZeroMQ极其灵活性(而我们要很好地掌握这种灵活性,需要花些功夫:了解最基本的消息模式、了解彼此之间如何组合起来构建更复杂的消息传递网络拓扑。)
上面提到,0MQ中socket被加了各种特效,所以,我们要实现一些功能的时候,比如:并发、load-balancing,我们需要做的是使用正确的套接字及构建正确的messaging topology。&/p&&p&4. 我认为使用0MQ能带来的好处(实际上,这段主要得益于公司的一位前辈的指导)
(1) 跨语言变得简单。
假设,我们有一个模块是用C++实现的,需要提供给另外一个C#/Java/Python/……应用来调用,过去我们可能会使用“C#嵌入C++”/“Java内嵌C++”形如这样的黑科技来实现。但是呢,现在,我们可以用0MQ来实现这种通信。因为0MQ为各种主流语言都提供了bindings。
(2) 模块间的解耦
这里提一下阿里做的RocketMQ。而且,看一下这个issue:
&a href=&//link.zhihu.com/?target=https%3A//github.com/alibaba/RocketMQ/issues/1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从开发团队获取最新文档,查看哪些用户在使用RocketMQ · Issue #1 · alibaba/RocketMQ · GitHub&i class=&icon-external&&&/i&&/a&
我们可以看到,很多人拿RocketMQ来做模块间的解耦。&/p&&p&PS:阿里还提供了和阿里云结合的RocketMQ。
(3) 插件化
假设我们在实现一个数据采集、处理系统。数据的处理可能会有多步(比如:A、B、C步),通过0MQ我们可以把每一步处理工作都写成一个模块,类似于插件。这样,传给一个平台的数据可能只需要经过A、C两步,传给另一个平台的可能需要A、B、C三步。各个步骤之间通过0MQ传输数据。这样,当我们想增加新的处理步骤的时候,只需要再写个模块,并加入处理流程就行了。
(4) 并行、负载均衡
0MQ的并行、负载均衡都已经存在于其基因中了。
zguide中有这么一段文字:
Multithreading with ZeroMQ
To make utterly perfect MT programs (and I mean that literally), we don't need mutexes, locks, or any other form of inter-thread communication except messages sent across ZeroMQ sockets.&/p&&p&If you've spent years learning tricks to make your MT code work at all, let alone rapidly, with locks and semaphores and critical sections, you will be disgusted when you realize it was all for nothing. If there's one lesson we've learned from 30+ years of concurrent programming, it is: just don't share state. It's like two drunkards trying to share a beer. It doesn't matter if they're good buddies. Sooner or later, they're going to get into a fight. And the more drunkards you add to the table, the more they fight each other over the beer. The tragic majority of MT applications look like drunken bar fights.
我认为,值得深思。&/p&&p&你看,学了0MQ,我们的程序设计思路(思考模式)在发生着变化。&/p&&p&5. 一些八卦
github上libzmq的第一贡献者:
&a href=&//link.zhihu.com/?target=https%3A//github.com/zeromq/libzmq/graphs/contributors& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Contributors to zeromq/libzmq · GitHub&i class=&icon-external&&&/i&&/a&
是这位大婶:
&a href=&//link.zhihu.com/?target=https%3A//github.com/sustrik& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&sustrik · GitHub&i class=&icon-external&&&/i&&/a&
而zguide的作者,以及libzmq目前主要维护者,是这位大婶(iMatix CEO):
&a href=&//link.zhihu.com/?target=https%3A//github.com/hintjens& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hintjens (Pieter Hintjens) · GitHub&i class=&icon-external&&&/i&&/a&&/p&&p&据不负责任传言,他们本是一家,后来意见发生分歧,前者就出走,另立项目:Crossroads I/O:
&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/questions//zeromq-vs-crossroads-i-o& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZeroMQ vs Crossroads I/O&i class=&icon-external&&&/i&&/a&
后来,Crossroads I/O挂掉之后,前者重写一个项目:&a href=&//link.zhihu.com/?target=https%3A//github.com/nanomsg/nanomsg& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&nanomsg/nanomsg · GitHub&i class=&icon-external&&&/i&&/a&。&/p&&p&这个PPT透露出了个中八卦,以及zeromq和nanomsg之间的一些差别(其中提到0MQ中“0”的奥义):
&a href=&//link.zhihu.com/?target=https%3A//hguemar.fedorapeople.org/slides/nanomsg/presentation.html%23slide1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Nanomsg: ZeroMQ done right&i class=&icon-external&&&/i&&/a&
里边插入了奇怪的照片。&/p&&p&还有一个有趣的问题是,sustrik曾说当年选用C++实现libzmq是一个“美丽的”错误(“美丽的”是我加的)
&a href=&//link.zhihu.com/?target=http%3A//blog.jobbole.com/19647/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&为什么我希望用C而不是C++来实现ZeroMQ&i class=&icon-external&&&/i&&/a& &a href=&//link.zhihu.com/?target=http%3A//250bpm.com/blog%3A4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Why should I have written ZeroMQ in C, not C++ (part I)&i class=&icon-external&&&/i&&/a&
所以你看,nanomsg就是用C实现的了。&/p&&p&另,nanocat貌似不错。&/p&&p&不过不知道nanomsg示例是否丰富、文档是否全。相信学了ZeroMQ,nanomsg也很容易上手。&/p&&p&6. 一些资源
(1) zguide
官网上的&a href=&//link.zhihu.com/?target=http%3A//zguide.zeromq.org/page%3Aall& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&zguide.zeromq.org/page:&/span&&span class=&invisible&&all&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&只是文档
&a href=&//link.zhihu.com/?target=https%3A//github.com/imatix/zguide& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&imatix/zguide · GitHub&i class=&icon-external&&&/i&&/a&
里面有各种语言的示例。
(2) zguide-cn
这是国内的大婶翻译的,不过好久没更新了。如果一些术语实在不知道啥意思,不妨翻阅一下,和英文版的zguide对比阅读。
&a href=&//link.zhihu.com/?target=https%3A//github.com/anjuke/zguide-cn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&anjuke/zguide-cn · GitHub&i class=&icon-external&&&/i&&/a&
&a href=&//link.zhihu.com/?target=http%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZeroMQ (豆瓣)&i class=&icon-external&&&/i&&/a&
这本书的第一部分就是zguide中的内容,第二部分更偏向实践应用。
&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/kaka11/article/category/619873& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络编程 - kaka11的专栏&i class=&icon-external&&&/i&&/a&
ZeroMQ源码分析。orz。&/p&&p&T17:17+08:00
nanomsg 1.0 版已发布。&/p&&p&T13:28+08:00&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&知乎专栏&/a&&/p&&p&Pieter Hintjens 最终选择了安乐死。R.I.P.&/p&&p&T13:22:29+08:00&/p&&p&《代码的未来》最后一节讲了 ZeroMQ。&/p&&p&----&/p&
最近也在学ZeroMQ,先列一些前辈们的学习心得吧:
(这篇是繁体的,我用firefox的一个插件“同文堂”转换一下看。)然后这里说一下自己的一…
&p&复制一下原文吧。&/p&&p&做T要求:多次分单操作,每笔单买入卖出一般五分钟内完成,内日实在无波动时持单时间可能会偏长,每笔单风险控制在2%,每日换手率达到100%,每天收盘后的股数一致不变动。&/p&&p&做T技巧:&/p&&p&1、板块联动股。板块联动股是做T中胜率最高,收益率最大的方式。当前热点板块中,会有一个龙头股,以及同板块的其他股票。当龙头股打板时或者急速拉起时,其他相应的股票或多或少会跟随上涨,手快有,手慢无,买入卖出时间仅仅相差几十秒至一分钟,这笔小单可能收益率会达到几个点不等的收益,视拉升幅度而定。本类操作胜率可达99%,收益率也最高,持单时间也最短,最需注意的是操作的两只股实实在在是同一期炒作的股票,会联动跟随。例如以往炒作核电板块时中核科技与沃尔核材的联动,央企改革时中粮三兄弟的联动,农机板块中吉峰农机和一拖股份的联动,VR炒作时爱施德与水晶光电的联动,量子通信炒作时三力士与福晶科技的联动等等。。。&/p&&p&2、指数期指的跟随。一般情况下(去除炒作拉升阶段以及价值回归阶段),个股的走势与指数的走势相差无几,具有一定的跟随性。期指的走势又略先于大盘走势,可以通过对期指的跟随做T。期指有IF、IH、IC之分,分别对应沪深、上证、小盘股。期指在某些时候,例如日内深跌时可能会快速反弹或者在某些市场标杆股的带领下急速拉升或者大盘破位下跌时,这时幅度能在0.5%左右,个股具有滞后性,手快有,手慢无,在期指快速变动时,对个股进行相应的买入卖出操作。此类胜率操作胜率高达80%,收益率约0.5%,时间在3分钟之内。&/p&&p&3、该跌不跌看涨,该涨不涨看跌。个股会跟随指数波动,可是往往有时候个股停滞了对指数的跟随,这个时候往往具有自己的方向性。例如,大盘日内一路阴跌,个股却横盘未跌,这时候可能有主力在护盘吸筹,待大盘内日止跌反弹时,个股可能会拉升,及时买入可获得小段收益。大盘一路下跌,个股跟随阴跌,大盘反弹,个股横盘,此股极弱,短期内可能还会有一段下杀空间。此类胜率与盘感相关很大,收益率视拉升幅度而定,时间未知与盘感有关。&/p&&p&4、均线的利用。强票不下均线,落票不上均线。在均线附近位置相应的操作,此类胜率60%,收益率及时间不确定。&/p&&p&5、几个重要的时间点。9点半至10点,是一般股票波动最大,成交最活跃的时候,做T在这段时间参与会比较多,讲究短平快,方向错误立即平仓。我一般以做多为主,会去选择当日的相对低点,这个时间点一般在10点30左右,1点半,2点10分,2点半左右等,此为个人经验。中间有些时间加上走势有很微妙的联系,由于语言表述较难,这里不展开,这个盘感很重要。&/p&&p&6、尾盘的黄金时间。尾盘2点半左右成交量一般都在日内相对较大,是做T的好机会。且尾盘2点半之后还在回落,今天很难有效反弹,个股可以顺势放空;若尾盘2点40分之后还上攻,个股很难回落,顺势做多。尾盘2点半也往往是转折点,下跌之后的反弹,上涨之后的回落都经常在2点半发生,甚至某些游资在2点半偷尾盘,这个时间段是交易的黄金时间。&/p&&p&。。。。。。&/p&&p&&b&更多A股日内交易技术资料请关注我的微信号,见主页。&/b& &/p&&p&最近建立了一个A股日内交流群,希望各个高手们,要分券的,独立交易员入驻,请私信我&/p&&p&&a href=&https://www.zhihu.com/pin/989248& class=&internal&&大拇指股票日内交易群,无广告,不灌水,… - 知乎&/a&&/p&
复制一下原文吧。做T要求:多次分单操作,每笔单买入卖出一般五分钟内完成,内日实在无波动时持单时间可能会偏长,每笔单风险控制在2%,每日换手率达到100%,每天收盘后的股数一致不变动。做T技巧:1、板块联动股。板块联动股是做T中胜率最高,收益率最大的…
&figure&&img src=&https://pic3.zhimg.com/v2-17fa123af066c303b45d7c79afdf99e0_b.jpg& data-rawwidth=&1440& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&https://pic3.zhimg.com/v2-17fa123af066c303b45d7c79afdf99e0_r.jpg&&&/figure&&p&今天,小魔王给大家推荐一篇很久之前看过的写Python的文章,因为特别有趣,很喜欢,所以之前就收藏起来,在这里来和大家分享一下。&/p&&p&还是那句话,Python是很好的语言,也是AI、Data领域的一门常用语言。学好和掌握之后对于自己的计算机技术的长远非常有帮助。当然如果各位谁是转专业开始来学习计算机的话,Python也是我个人推荐首选学习的编程语言。&/p&&p&所以大家enjoy下面这篇诙谐的Python文章。(作者: 石雨浓、引自:完全用Python工作 )&/p&&p&---------------&/p&&p&第一天, 太初有道, 神谕, import light, 于是便有光。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d99773c39dab11c4aca2a1af8f9d426c_b.jpg& data-rawwidth=&519& data-rawheight=&322& class=&origin_image zh-lightbox-thumb& width=&519& data-original=&https://pic2.zhimg.com/v2-d99773c39dab11c4aca2a1af8f9d426c_r.jpg&&&/figure&&p&(Quick fact: 在python解释器里输入import antigravity有彩蛋)&/p&&p&作为一个业余物理工作者以及入门计算机使用者, 选择一门称手的编程语言是非常重要的事。从计算能带, 处理数据, 编写脚本到画图, 写个http服务器分享文件 (看上去很专业,实际在Python里只有一行), 做个网页, 几乎全部需要计算机完成。但是为了这其中每个不同的目的单独去学一门语言成本简直过于高, 于是需要一个一般用途(general-purpose)的语言,处理所有的事是非常自然的事情。&/p&&p&编程语言的两极是Assembly和Haskell, 一个接近硬件的本质, 一个接近计算的本质。一个是地狱, 处理着最繁琐最耗神的事情:内存分配, 系统调度, 硬件架构, 各种寄存器A1, B2。 一个是天堂, 优美的写着递归, 高阶函数, lambda表达式, 优美的并行计算(完全不用考虑race condition)。&/p&&p&然而我们生活在人间, 所以大规模应用的语言不可能如此纯粹。 两端中间游离着很多general-purpose的语言, C, C++, Java, Ruby, 几乎都能达到我们所有日常的要求。 只不过,这些语言能做的Python都能做,而且Python做得更好。&/p&&p&接下来我说明为什么。但是要说明,本文的读者不包括写嵌入式,写javascript以及写大型项目对性能要求极高的人(即使是大型项目也可以80%用python,20%用C),当然还有就是java和C++的重度患者。(完全使用XX工作意思不是&所有人都完全使用XX工作”!显然只是部分人。&/p&&p&更多的是,非专业编程但是想提高效率的人。比如之前有篇&完全使用*nix工作&,C#,iOS开发的人显然就一下也不能用。对于我,linux再好我也只能装在老电脑上交交CS225的作业。当我把mint, opensuse, archlinux装遍了,下一步就是gentoo了的时候,否决它只有一条理由,我笔记本电池不经用,而桌面linux的电源管理...... 感谢我的cpu风扇~!)&/p&&p&&b&首先,我想说的是,为什么不用下面这些大部分人很熟悉的语言:&/b&&/p&&p&1. C: 你难道指针扎得不疼么? 每天收垃圾很舒服? 键盘上P右边两个键是不是已经按坏了?
&br&2. C++: 学C++三年以内请不要说你会C++;
学了三年以上的人, 恭喜你们, 你过去几年浪费的时间我可以拿着香飘飘环绕地球一圈了。&br&3. Java: 不好意思, Java的面向对象对我来说是原子弹打原子。 而且Java7才引进Lambda表达式实在是太晚了, 即使java以后会跟python越来越像, 至于支持真正的函数式编程? 我希望下个末日之前可以实现. 而且有时候我确实需要单行执行的解释器而Java并没有。&br&4. Ruby: Ruby很好,但是你为什么不直接说你只是为了用RoR?&br&5. Lisp: 如果你用lisp, 你平时肯定会用python或者perl写脚本。 而且你会Lisp不去拯救世界还来看这篇文章干什么?! 抽象语法树什么的最讨厌了....&br&6. Perl: 我第一次看Perl的代码就感觉像用脚写的. &为什么满屏的正则表达式?&!&br&7. C#, php, javascript:呵呵。&br&8. Shell: 这算语言么?&br&9. Matlab: &br&第一,我穷酸学生没钱每年买你的正版, 看到激活码就想吐。 &br&第二,我不想心血来潮画两个心形函数的时候用1mb的窄带花两天下个5.03Gb的文件在我128Gb的固态硬盘里装,然后用完两个小时就删,如此循环。 &br&第三,我会python了不想再花时间学你的sb语法,熟悉你的.m文件。&br&第四,所有对windows的垄断的血泪控诉都直接对mathwork转过来吧~什么对开源,对自由,对的打击信仰~绝对适用~ &br&第五,python大部分时候如果不比你好用至少跟你一样好用,而这只是它不到10%的功能,几个程序员业余时间写出来的库。真心请matlab你这个没事发邮件“培训一个星期2000刀打折700刀”的大公司滚粗。&br&10. Haskell: 每次想静下心来学haskell 都会情不自禁从范畴论看起....&/p&&p&&b&对于单纯程序语言的使用者来说,用途(内在逻辑)大于一切不必要的语言细节。&/b&比如我就想建个数组放东西,为什么我要懂内存回收?!&/p&&p&所以在易用性方面,Python相对于他们作了很大改进的部分。&/p&&p&好吧,你会说Python没有缺点么。确实有,而且很严重,那就是运行慢。而且是慢出风格,慢出自信。(Python 3比Python 2 慢 15%以上, 这是一种什么风格!)相同的程序Python比C慢几百倍很正常。这让Python的发展受到很多限制。但是对于个人使用来说这个缺点完全不属于缺点。&/p&&p&第一,这个年代谁没有奔腾酷睿2什么的。你手机的运行能力都可以几毫秒内把你在厕所拍的几千张自拍液化,磨皮,磨骨好几遍了。而且你觉得0.01秒和0.5秒的区别真的那么大么?12秒也不是很久啊。&br&第二,很大程度上程序的慢更关乎于算法,比起O(n)和O(n^2)的区别, 语言间的差异就显得很小了。&br&第三,请注意,如果你使用过Python而且真实的觉得Python慢,那么情看下这个列表:&/p&&p&1. Google创立前的第一个网络爬虫;&br&2. Quora,美国最大在线知识问答平台,开复哥总是在上面拽文的;&br&3. Dropbox;&br&4. Youtube;&br&5. BT;&br&6. 知乎,中国的Quora;&br&7. 豆瓣,开创社交工具绿色系代表yp的先河。&/p&&p&你知道我要说什么了。.....恩~他们有一个共同点~ ------------ 都是Python写的!如果tmd的Dropbox没有觉得Python慢,请你也有足够的信心不要觉得Python慢。另外八卦一下,现在Python之父前两天从google去Dropbox了,这是很值得自豪的事, 值得Dropbox为之自豪。&/p&&p&Python是荷兰人van Rossum1991年开发完成的脚本解释语言。起这个脑缺的名字是因为他是一个叫做Monty Python的脑缺喜剧团体的脑残粉(BTW,Monty Python出演的巨蟒与圣杯是英国电影史上跟大话西游同样地位的喜剧,其中亚瑟王被黑成了炭,里面圆桌骑士们拿着块石头敲来敲去各处蹦达着,看影评我才知道这是表示他们在骑马%&……×().
于是人们知道以这么脑残的名字取的语言不是像brainfuck语言一样是brainfucker,那么就会像莫里盖尔曼以乔伊斯“芬尼根的守夜人”中虚构名词来命名的夸克一样,成为一个一个不朽的新创造。Python显然属于后者。 &/p&&p&接下来,说正题,为什么Python如此先进(对于初学者)。&/p&&ul&&li&&strong&代码简洁性和可读性&/strong&&br&&/li&&/ul&&br&&p&写过hello world,hello android, hello **的人都知道,&b&学语言最好的途径就是写和读&/b&(即使是学书面的自然语言)。所以代码的可读性是选择学一门语言的关键因素,因为你代以后会花很多时间读别人的代码。可读性带来的影响是非常深远的。有种说法, 说在遥远的古代阿拉伯数字传入之前欧洲之前, 其数学发展几乎为0, 而造成这种缓慢的原因就是因为复杂的罗马数字的广泛使用。&/p&&p&这表明很多时候即使我们不愿意承认, 往往是形式决定的内容。 比如罗马数字没有0, 自然很多数学概念就难以发展。 没有流形也不可能发展广义相对论一样。 所以............如果想以后从此过上幸福的生活, 请不要选用perl。
如果不幸选择了perl, 那么就君就 一入侯门深似海,从此萧郎是路人 了。当以后你两行清泪的看着自己十天前写的不过10几行的楔形文字时, 你就会明白。&/p&&p&而Python的可读性是我见过最好的:&/p&&p&1. Python的代码格式使用缩进而不是括号。 首先节省了很多行数, 变得而为紧凑, 而美观。相传的俄罗斯人偷美国NASA的C代码那个段子满屏括号的情况是不可能出现Python版本的。&br&2.逻辑相当清晰. 循环的结束与开始一目了然。&br&3. 屏幕右方得到充分利用. 比如使用24寸屏幕的人是不是感觉自己总是望着左边编程.....和17寸等高的屏幕区别不大, 很费右边的电。&/p&&p&比如, 这是某个C用来图像采样的算法的代码:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-931fef94be5bda27a10a82ce14c8a739_b.jpg& data-rawwidth=&584& data-rawheight=&540& class=&origin_image zh-lightbox-thumb& width=&584& data-original=&https://pic1.zhimg.com/v2-931fef94be5bda27a10a82ce14c8a739_r.jpg&&&/figure&&p&好吧, 很带萌感, 画风也很不错。&/p&&p&但是Python也不是写不出混乱的代码, 或者说只要有一定自由性的语言就可以写出。 比如没事写个(Pseudo Code): boolean AlwaysTrue = F 或者int MagicNumber =42; 什么的。&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//rrurl.cn/6NRCe7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个&/a&是Python版, 完全不符合Python哲学。&/p&&ul&&li&&strong&Python的思想&/strong&&br&&/li&&/ul&&br&&p&上面一点是语言形式的, C也可以改成缩进, 所以此项不是核心优势. 而使用一门语言是使用它的思想. 于是要谈到Python的哲学, The Zen of Python。在python命令行里输入import this可以看到:&/p&&p&Beautiful is better than ugly.美优于丑&br&Explicit is better than implicit.晰胜于浑&br&Simple is better than complex. 简胜于繁&br&Complex is better than complicated. 繁胜于杂&br&Flat is better than nested. 平胜于嵌&br&Sparse is better than dense. 稀胜于稠&br&Readability counts. 可读至上&br&Special cases aren't special enough to break the rules. 殊例不足违训&br&Although practicality beats purity. 虽实用大于纯粹&br&Errors should never pass silently. 谬不可疏&br&Unless explicitly silenced. 除明示&br&In the face of ambiguity, refuse the temptation to guess. 晦不存疑&br&There should be one-- and preferably only one --obvious way to do it. 一法万用&br&Although that way may not be obvious at first unless you're Dutch. 若非尼德兰红毛,法难定 (......科学没有国籍)&br&Now is better than never. 今胜于无&br&Although never is often better than *right* now. 无胜于促&br&If the implementation is hard to explain, it's a bad idea. 难述其施,谬法也&br&If the implementation is easy to explain, it may be a good idea. 其施可述,或可行Namespaces are one honking great idea -- let's do more of those!命名空间,多多益善&/p&&p&如果觉得俺翻译得太烂可以看英文。 但是你看到一个物品/工具/器件/用品的设计理念是如上时, 除开认为设计者装逼之外, 必定会觉得这个工具是十分可靠, 清爽的。 首先看到这个蹩脚的诗我就想到的是Unix伟大的亲嘴原则(Keep It Simple and Stupid), 而Python的确如此。(部分)解读如下:&/p&&p&美优于丑。我只想举一个例子,你们感受一下(哈哈哈哈)。学C语言写辗转相除的novice们先include你的stdio去吧:&/p&&p&
-----&/p&&p&
def gcd(x, y):&/p&&p&
while y:&/p&&p&
x, y = y, x%y&/p&&p&
return x&/p&&p&
----&/p&&p&明晰胜于浑晦:&/p&&p&
Python逻辑与或用and 和 or 而不是
&& 和 ||&/p&&p&简胜于繁,繁胜于杂,平胜于嵌,稀胜于稠 可读至上:&/p&&p&
分别用C和Python写个hello world就能明白。&/p&&p&特例不足违反规则:&/p&&p&
这句话最好的例子是Python没有char类型。因为大伙儿认为char只是一位的字符串。&/p&&p&实用大于纯粹:&/p&&p&
于是Python里有chr()。&/p&&p&谬不可疏 除明示:&/p&&p&
有时候exception还是重要的。&/p&&p&晦不存疑,一法万用:&/p&&p&
1. 与其用iterator, for循环, 指针移动,数组下标移动, 不如一个for...in...直接解决问题。&/p&&p&
2. list,dict和tuple的数据结构也是希望能适用于绝大部分场合。这三位可以在必要的时候变成:列表,栈,队列,哈希表,七七八八各种东西....&/p&&p&
3. 函数的参数也勉强可以算进来。利用*和**, python的函数参数灵活性无以复加。&/p&&p&若非尼德兰红毛,法难定:&/p&&p&
第一次看到荷兰人写的xx= if yy&0 then 0 else 1 是不是想哭...&/p&&p&中间几句太哲学了.....:&/p&&p&
略过....&/p&&p&命名空间,多多益善:&/p&&p&
面向对象...&/p&&p&这些特性简直可以形容为黑曼巴...灵活,准确,快速,强力。&/p&&p&Python语法的优美之处数不胜数,难以名状,深入人心,犬牙交错,人神共愤,不随意肌。语法是思想的延伸,有人说你学一门新语言而不学习新的思想则。还是新评装旧酒。由于我不是写tutorial,就不一一讲述所有的细节了。 只列举下最好和简单的特性, 而像decorator(面向切面),generator,多线程,itertools,一次肯定也讲不完。&/p&&p&1. Python中的整数相当于C中的长整型(long), 32位的机器上整型取值范围为 -至, 64位机器上为-75807。Python的长整型是无限制的,只要内存允许。很相似的是Python里的无限list。一个很著名的例子是使用生成器(generator),就可以生成一个无限长的Fibonacci数列;&/p&&p&------&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&fib&/span&&span class=&p&&():&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&
&span class=&k&&while&/span& &span class=&bp&&True&/span&&span class=&p&&:&/span&
&span class=&k&&yield&/span& &span class=&n&&a&/span& &span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&o&&=&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&a&/span&&span class=&o&&+&/span&&span class=&n&&b&/span&
&/code&&/pre&&/div&&p&这个数列号称无限长,其实是需要运算哪一位时才计算。这就是著名的&a href=&http://link.zhihu.com/?target=http%3A//rrurl.cn/ijhaa2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&惰性求值&/a&。Python中的长整型和无限list的概念均来自于Haskell。&/p&&p&对于C和C++要处理大数据要使用高精度算法, 用一个struct表示一个大数, 使用一个array储存它, 然后自定义运算函数(加减乘除)。&/p&&p&2. List comprehension,切片等操作&/p&&p&使用list comprehension可以杜绝掉50%以上的for循环,后者的效率极其低下(可以看看C源码的实现),而且不够紧凑。我之前上面举的第一个粒子就是list comprehension的很好的运用。随便举个python官方文档的粒子:
&&& [(x, y) for x in [1,2,3] for y in [3,1,4] if x !=y]&/p&&p&
运行结果得到,&/p&&p&
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]&/p&&p&反转一个数列的例子,是个one-liner :&/p&&p&
lis[::-1]&/p&&p& 3. 正则表达式&/p&&p&Python正则表达是内置的。一个粒子是我在实验室测试Josephson Junctions时碰到的情况,简化的说就是:我有几百个文件夹,每个文件夹有几百个文件,每个文件有几万条数据,每几个数据我要处理完然后存在另外一个文件夹的另外一个文件里。我要做的工作有:&/p&&p&
-用正则表达式找到我要的文件夹和文件,剔除不需要的;&/p&&p&
-逐行读出txt文件里面的数据;&/p&&p&
-每几个数据设个参数平均,最小二乘处理,剔除几个极端情况,画出图;&/p&&p&
-保存 这里Python就起到了一个脚本语言应尽的责任了。&/p&&p&整个从打开文件到保存 不超过150行,还加上我罗哩叭嗦的注释。如果用C写... 呵呵呵呵呵呵。当然这个用Shell也不会太差,不过实验室用的是windows,用windows脚本我还不如去死。自从我写完这个脚本后,从此我们实验室的testing就过上了幸福的生活。(可能么?)&/p&&p&4.reduce, lambda, filter 和map&/p&&p& 这些全来自于函数式编程。比如找到prime之内的质数:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&nb&&filter&/span&&span class=&p&&(&/span&&span class=&k&&lambda&/span& &span class=&n&&prime&/span&&span class=&p&&:&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&prime&/span&&span class=&o&&%&/span&&span class=&n&&num&/span& &span class=&k&&for&/span& &span class=&n&&num&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&prime&/span&&span class=&p&&)),&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&prime&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&如果作为中文读出来则是(prime是之前给定的一个数):在2到prime之间,过滤出那些所有不被2到自己整除的数。难道还能更简单么!如果用的C, 呵呵。 这里出现了Zen of Python没有提到但是是Python里非常重要的一点,对“数”的操纵。毕达哥拉斯信奉一切皆数,程序语言更应算更是如此,只有对“数”和“类型”的完全掌控,才能如鱼得水。&/p&5. 语言的动态性 Python是动态语言,这是非常重要的一点,一直忘了说。这一点可以直接完爆C++自己一向自豪的泛型编程,模板编程。且看一个strangeness为0的粒子:&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&build&/span&&span class=&p&&(&/span&&span class=&nb&&type&/span&&span class=&p&&,&/span& &span class=&n&&value&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&nb&&type&/span&&span class=&p&&(&/span&&span class=&n&&value&/span&&span class=&p&&)&/span&
&span class=&n&&build&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&所以稀饭们请看过来, 你们家C可以三行写出这种东西么?!!没完,接着:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&def impose(func, value):
return func(value)
def anyfunc(value):
return value*value
print impose(anyfunc, value) #此处是python2.7的语法
&/code&&/pre&&/div&&p&一看就知道是函数式编程。请问C可以么?!&/p&&p&当然还有之前说的函数参数的灵活性:&/p&&p&如果定义一个函数&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&def print_whatevercrapsthefuckinguserinputs(**params):
print params
&/code&&/pre&&/div&&p&你就可以想输入多少参数就输入多少了,比如:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&print_whatevercrapsthefuckinguserinputs&/span&&span class=&p&&(&/span&&span class=&err&&“&/span&&span class=&n&&I&/span&&span class=&s2&&&,”dont&&/span&&span class=&p&&,&/span& &span class=&s2&&&give&&/span&&span class=&p&&,&/span& &span class=&s2&&&a&&/span&&span class=&p&&,&/span& &span class=&s2&&&fuck“),&/span&
&/code&&/pre&&/div&&p&只要有print函数的接口(这又涉及了鸭子类型和类似haskell的typeclass的性质, 呱....)。其实际作用是 比如你想在数据库里输入大批量用户信息,mi amigo,对于这样一个蛋疼的函数名字,调用一次就够了。&/p&&p&在Python里类型,函数,全部都是可操作的对象。这可以改变一切。第一个例子显示了对数据类型的操作,第二个是对函数的操作,第三个是对参数的控制。我不想想象用C写这个例子了,因为C根本写不出来。 以上所有这些Python的特性,你可能说我用C实现一个一样的就好了。诚然,你可以在C里一个个写出来自己喜欢的特性,但是你写到后面你会发现你只是再次发明了Python,然后拿C重新写了一个解释器, 而且实现得更烂而已。Please! Don't re-invent the wheel。&/p&&br&&ul&&li&&strong&Python的类库齐全&/strong&&br&&/li&&/ul&&br&&p&对于我们普通人来说一个语言最重要的还是库函数的齐全程度,Java在此方面已经登峰造极了。而现在的Python不输于他。一个语言的火热程度可以从类库看出, 下面是github上语言的排名: &/p&&figure&&img src=&https://pic2.zhimg.com/v2-5d5f97ece19e05d8c394_b.jpg& data-rawwidth=&720& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic2.zhimg.com/v2-5d5f97ece19e05d8c394_r.jpg&&&/figure&&p&由于Javscript的特殊性和Ruby的RoR我们就不去管它了,Python占8%,C占6%. 貌似差得不远, 恩。但是如果你仔细看C的project,随便翻十页可能发现会有三页的项目其实是在写python的类库。真是母亲为孩子显出一切。&/p&&p&另外一个说明Python类库齐全的例子是我这个学期被某教授压着要算一个固体模型的Berry's Phase。正值final之前, 如何有心思写这厮。一筹莫展之际竟然发现python有个固体算能带和巴里态的库!!nm这也能有!? 仔细观摩了下源代码, 1000来行,干净整洁, 速度用之,皆大欢喜。这种小众库都有我已经不能想象你有什么变态要求Python不能满足了。以下是一些常用的类库。&/p&&p&1.如果你想写网络应用,轻量级:web.py (web.py的作者最近自杀去世,RIP)中量级:Django,Pylon 重量级:twist。其实很多人诟病Python的网络框架过于多,不能集中起来,我倒觉得无所谓。我用过Django, 写个小小的博客程序,1000多行,这是用java不可想象的。Youtube上有个半个小时的用Django写博客的演示:&a href=&http://link.zhihu.com/?target=http%3A//rrurl.cn/7kYG1A& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.youtube.com/watch?v=srHZoj3ASmk&/a& 。 半个小时!!一边写一边讲!一个博客程序!!还带后台功能!What the F*! 是编程么!?我脱稿写个平衡树都不只半个小时啊!&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ae3b1b4be_b.jpg& data-rawwidth=&720& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/v2-ae3b1b4be_r.jpg&&&/figure&&p&2.如果你想做科学计算,NumPy&SciPy可以取代90%matlab的常用功能,然后让我想一想,他们好像只有几十mb!!加上Pythonxy也才700mb多!但是你没有更多的新学语法的成本,也不用付给mathwork血汗钱。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-734eeacb2568_b.jpg& data-rawwidth=&197& data-rawheight=&188& class=&content_image& width=&197&&&/figure&&p&3.网络爬虫。Python的超强项,beautifulsoup的网页解析,scrapy等等,不一而足。Twitter, 微博等好像也有python的API。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-08a713b639f5a6b3fbe09_b.jpg& data-rawwidth=&692& data-rawheight=&206& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic1.zhimg.com/v2-08a713b639f5a6b3fbe09_r.jpg&&&/figure&&p&4.Machine Learning,数据分析和Natural Language Processing。 请去Kaggle上看看多少参赛者是用的Python。 著名的库有Pandas。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c682b4a0a90e_b.jpg& data-rawwidth=&615& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&615& data-original=&https://pic1.zhimg.com/v2-c682b4a0a90e_r.jpg&&&/figure&&p&5.桌面应用。 pyqt。Dropbox貌似就是使用的pyqt写的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ab11ac0dc750e2c0302e5_b.jpg& data-rawwidth=&982& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&https://pic1.zhimg.com/v2-ab11ac0dc750e2c0302e5_r.jpg&&&/figure&&p&最后我想讲下Python Challenge。Python作为一个强劲的编程语言有着极为活跃的社区,文档丰富,教程齐全。当然就有很好的网上解谜过关类的教程。Python Challenge是在各个类型的解谜过关性的我看到过的最好的一个。难度适中,而且可以从中学到很多。解法不局限于python,可以用perl, shell,C甚至Erlang!官方解答往往有10多种解法,精妙至极。但是你会一步步从中发现Python的优势。一共33关,在充满乐趣的智力挑战和极大的满足感后,你可以学到PIL库的使用,pickle的使用,正则表达式,完成后你会发现思维方式的改变。&/p&&p&Last words&/p&&p&神爱众人,于是带来Python。&/p&&p&
---------------PIRATICUS 13:7&/p&
今天,小魔王给大家推荐一篇很久之前看过的写Python的文章,因为特别有趣,很喜欢,所以之前就收藏起来,在这里来和大家分享一下。还是那句话,Python是很好的语言,也是AI、Data领域的一门常用语言。学好和掌握之后对于自己的计算机技术的长远非常有帮助。…
用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是工作上用他们写过代码的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。&br&&br&Atom 唯一的槽点就是“卡”,不过那是去年的情况了,1.0后性能数次大提升,比起sublime/vsc之类虽不算流畅,但同时编辑20个数千行的文件没有压力。如今让人感觉慢的地方主要是启动loading(也大大短于eclipse, idea),使用时并没察觉它比其他编辑器慢再哪。而文本编辑器的快慢,更重要的是“&b&让你工作更快更有效率&/b&”。下面说说为何 Atom比其他更有效率:&br&&br&&b&兼容VIM模式&/b&&br&&br&这无疑团结了一大班 Vim过来的用户,Sublime虽然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上其作者经常神秘消失,最稳定的2.x版本已三年没有更新,这些问题一直得不到修正。&br&&br&由于Atom的定制程度直追 Vim/Emacs,它的vim模式能够使用插件来实现,而不像sublime必须builtin,Atom的VIM模式除了官方实现外还有很多用户实现,各有所长,你不喜欢可以换,Sublime就傻逼了,觉得builtin的不行,你就没办法了,而且作者不更新你也没办法。&br&&br&Atom里的Vim模式并不是强制的,你可以用也可以不用,这样入门用户也不会觉得困难,但是如果你用惯Vim的话,使用Vim模式可以取得更好的效率,我觉得Vim/Atom-VimMode能够提升效率的地方有以下三方面:&br&&br&1. 手指不离开主键盘区:&br&所有功能皆能在主键盘区完成,不用去按方向键,不用把手挪去按Home/End,更不用动鼠标。就像咏春中强调中线理论,认为一切动作围绕中轴线开展,守护自己中轴线的同时攻击别人的中轴线。Vim/Atom-VimMode中,双手不但从不离开主键盘,并且八根手指随时守护再HOME位(ASDF, JKL;)有动作就移动,然后马上归位。&br&&br&2. 细粒度微操作:&br&星际/dota玩的好,微操基本功,微操又快又精确,Vim/Atom-VimMode一样,比如:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&xxxx&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&很多人编码时习惯“成对编码”,写了申请资源的代码,先把释放资源写了,写了左括号,先把右括号给补充完,当你写完第二行代码时,需要用到“再1-2行中间插入一行”,此时你的光标停留在第二行,传统编辑器你需要:按上箭头移动光标到第一行 -& 按END键去到第一行末尾 -& 按回车插入一行,mac下的END键还需要用CMD+右来组合出来,而Vim/Atom-VimMode中,你只需要shift+o即可,手指完全不离开主键盘区,不用像传统编辑器那样,右手先移动到箭头区又移动到HOME的小键盘区,再移动回主键盘区这么麻烦,类似还有:&br&使用o直接再下一行插入,避免 END/回车&br&使用I再行首插入,避免移动半天光标。&br&向前/后移动一个单词到单词头、尾。&br&快速更改当前单词,用/来快速搜索移动光标。&br&dd+p来快速移动代码块,取代shift+方向键半天。&br&shift-j 来两行合并成一行,代替 HOME, back 若干次。&br&。。。&br&你再编辑代码的时候,90%的情况可以直接一步完成,这就叫细粒度微操,而且整个过程手都不需要离开主键盘,不像传统编辑器那样,若干笨重的操作组合再一起,操作不够细步骤多的同时手还要再:主键盘区,方向键区,扩展键区 来回移动,效率奇低。而Vim/Atom-VimMode下,手指随时守护在home区(ASDF JKL;),所有微操都是围绕HOME区进行,不会移动到任何主键盘以外的区域,更别说用鼠标、触摸板。&br&&br&3. 批量操作:&br&比如要给下面代码每行后面加一个分号:&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&x&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&
&span class=&kd&&var&/span& &span class=&nx&&y&/span& &span class=&o&&=&/span& &span class=&mi&&2&/span&
&span class=&kd&&var&/span& &span class=&nx&&z&/span& &span class=&o&&=&/span& &span class=&mi&&3&/span&
&span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span&&span class=&s1&&'result is '&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&nx&&x&/span& &span class=&o&&+&/span& &span class=&nx&&y&/span& &span class=&o&&+&/span& &span class=&nx&&z&/span&&span class=&p&&).&/span&&span class=&nx&&toString&/span&&span class=&p&&())&/span&
&/code&&/pre&&/div&一般做法是:移动光标到行末-&END-&分号-&移动光标到下一行,Vim里面不需要移动光标到行末,只需循环敲入:“A;&ESC&j” 即可,本来操作就少很多。这还不是最少操作,更少操作是利用Vim里面的句号“.”功能重复上一次操作,即第一行“A;”补充了一个分号后,第二行只需要按一下&.&即可重复,于是最后操作变为:&br&第一行:A;&ESC&&br&后面所有行:J.&br&&br&超级爽快的操作,这样的操作还很多,你还可以单条命令对一万行代码重复上述步骤,或者把c代码拷贝到go里面先一句话把所有分号给删除了。Vim下面的名言:绝不重复。&br&&br&总之如果你熟悉 VIM模式,用 Atom能感到完全自由的方式,随心所欲的书写代码,而不是被书写这件事情费脑筋,解放大脑完全用于思考而不用于打字。但是同时对不习惯VIM的人照样友好,或者对想使用VIM的便利却又痛恨VIM这个软件的简陋的人带来了福音。&br&&br&&b&脊椎记忆&/b&&br&&br&&blockquote&“同样动作重复300次,肌肉就会有记忆,而一个动作重复600次,脊椎就会有记忆” &br&-- 李小龙&/blockquote&&br&编辑器就是关于脊柱记忆的东西,所以多投入一些时间去了解你使用的编辑器,掌握他们的各种快捷操作和高级功能是一个能让你事半功倍的好主意。&br&&br&格斗游戏玩的好的人有很多,下等高手靠熟练,中等高手靠反应,上等高手靠意识。更熟练的掌握你的编辑器,让更多日常工作固化成记忆记录再你的脊椎上,使用的时候,脊椎这枚协处理器就能完成代码编写,一个操作,刚一想到,脊椎就自动执行出来了,小脑腾出空间来组织判断,大脑腾出空间来思考更重要的东西,就像你走路,你不用思考迈腿那么自然,别人一拳过来,你潜意识一动,一连串动作就出去了,一只飞蛾飞过来,你潜意识的闭上眼睛保护眼部,这就是脊椎记忆,如果还要经过大脑绕一圈,反应慢不说,大脑这颗cpu都用在这些琐事上了,思考的时间自然少了不少。&br&&br&所以从内到外的了解你的编辑器,并且熟练掌握他们,是对你提高工作效率的最佳投资,Atom的全平台支持,开放源代码,深度可定制等三个特点,比起其他闭源的,平台支持不全的,扩展少的编辑器来说能让你有不同层面的了解机会,同时为你提供足够的空间。&br&&br&&b&深度可定制系统&/b&&br&&br&Vim/Emacs的精髓在于:“可以调教”,本来不顺手的东西,只要容易调教,假以时日,都会慢慢变得越来越顺手,越来越“懂你”,越来越“贴心”,以至于后面大家都离不开它了。而 Atom 也同样是一款容易被你调教的编辑器。先前给vim写过插件,给sublime写过插件,如今给Atom写过插件,横向对比下来,几个结论:&br&&br&插件能做事情多少:Atom & Vim && sublime&br&插件开发学习门槛:Vim & Atom & sublime&br&插件开发文档丰富:Atom & sublime && Vim&br&&br&Atom 的定制化程度远远高过sublime之类(不用实际看法,看看双方开发文档即可),直追 Vim / Emacs,sublime的大部分定制无外乎改改json,插件能做的事情相当有限。&br&&br&Atom 的定制化系统主要有三方面:&br&&br&1. 细致:&br&设计之初就考虑的事情,方方面面都能定制,见官方文档,以及插件:&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/vim-mode& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim-mode&i class=&icon-external&&&/i&&/a&,&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/minimap& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&minimap&i class=&icon-external&&&/i&&/a& (稍微了解下这两个类似的功能再 Atom 和 sublime的实现就能知道 sublime被甩了多少条街了)。可以细粒度的控制编辑器内所有行为,小到移动一下光标,删除当前一个字符,大到打开一个面板,比如 “core:more-up” 可以向上移动一行光标,“window:focus-pane-on-left” 可以把焦点设置到左边的面板,atom内核和大量第一方第三方packages 都是以命令的方式把基础功能提供出来,你可以随意互相调用或者设置热键。&br&除去命令外的API层面,几乎每个部件每个像素点都可控,比如这样的插件你永远无法再 Vim / Emacs / Sublime 下面见得到:&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/activate-power-mode& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&activate-power-mode&i class=&icon-external&&&/i&&/a&。&br&&br&2. 直观:&br&由于使用 javascript/coffee进行开发,但 javascript/coffee是属于即便你没写过他们,读都能读得懂,VimScript就不一样了,虽然也能做相同的事情,但实话实说,晦涩难写,比如我要取得当前文件的路径和文件名,在 VimScript里面需要这么写:&br&&div class=&highlight&&&pre&&code class=&language-vim&&&span class=&k&&let&/span& &span class=&k&&l&/span&:&span class=&nb&&path&/span& &span class=&p&&=&/span& expand&span class=&p&&(&/span&&span class=&s1&&'%:p:h'&/span&&span class=&p&&)&/span&
&span class=&k&&let&/span& &span class=&k&&l&/span&:name &span class=&p&&=&/span& expand&span class=&p&&(&/span&&span class=&s1&&'%:t:r'&/span&&span class=&p&&)&/span&
&span class=&k&&let&/span& &span class=&k&&l&/span&:name &span class=&p&&=&/span& expand&span class=&p&&(&/span&&span class=&s1&&'%&'&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&而在 Atom 里我们用atom自己的功能直接取出路径来,然后进行切割:&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&fullpath&/span& &span class=&o&&=&/span&&span class=&nx&&atom&/span&&span class=&p&&.&/span&&span class=&nx&&workspace&/span&&span class=&p&&.&/span&&span class=&nx&&getActiveTextEditor&/span&&span class=&p&&().&/span&&span class=&nx&&getPath&/span&&span class=&p&&();&/span&
&span class=&kd&&var&/span& &span class=&nx&&filename&/span& &span class=&o&&=&/span& &span class=&nx&&path&/span&&span class=&p&&.&/span&&span class=&nx&&basename&/span&&span class=&p&&(&/span&&span class=&nx&&fullpath&/span&&span class=&p&&);&/span&
&span class=&kd&&var&/span& &span class=&nx&&filepath&/span& &span class=&o&&=&/span& &span class=&nx&&path&/span&&span class=&p&&.&/span&&span class=&nx&&dirname&/span&&span class=&p&&(&/span&&span class=&nx&&fullpath&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&就问大家一下?哪段代码更友好直观?你一眼就知道在做什么?你更愿意用按照哪段代码进行插件开发?是上面的VimScript?还是下面的 javascript ?&br&&br&结论是很清晰的,Atom的 javascript开发插件更简单直观,即便没文档,看别人怎么写的自己也会了,同时灵活性大大高于VmScript,各种事件处理回调,javascript天生擅长做这些事情,还有第二行,第三行,我们用到了 node.js 的 path模块,进行文件路径切割。这样的写法,再VimScript 里面基本是无法想象的。&br&&br&Vim是强大,但是毕竟是30年前的东西了,即便最熟练的 Vimer 也都承认 VimScript 的晦涩难懂,阻碍了很多人为其开发插件。而给Atom开发插件,只需要掌握javascript,掌握 javascript的人很多,学习了javascript你也可以用在很多地方。不像VimScript那样只能用在Vim里面,而正因为其晦涩,Vim新版本开始支持内嵌 python的写法:&br&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&n&&python&/span& &span class=&o&&&&&/span& &span class=&n&&EOF&/span&
&span class=&kn&&import&/span& &span class=&nn&&random&/span&
&span class=&nb&&print&/span& &span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randint&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&EOF&/span&
&/code&&/pre&&/div&&br&VimScript中 Python等动态的支持正是说明其开发维护者也承认 VimScript本身的古老,对比现代编程语言已经有些格格不入了,缺乏强大的描述能力,难以构建复杂的功能模块,才会去支持Python内嵌这样的写法。可大量的工作还是需要再Python之外完成,同时,并非所有平台自带的Vim都支持python,除了mac外,所有debian / ubuntu 发行版自带的Vim都不支持 Python。导致你想写一个通用的扩展还得判断下是否 has('python') 没有的话老老实实用 VimScript 去实现它,这不是折磨人么?&br&&br&Sublime里面可以用原生 Python 写扩展,比 VimScript爽,但是 sublime 的插件能做的事情还不及VimScript的一半,所以怎么能指望他们能写出高端的功能来呢?&br&&br&3. 强大:&br&Atom的内核 Electron (原来的 Atom-shell)可以理解成:Chromium + Node.JS,而整个Atom的界面,你可以理解成就是一颗 HTML 的 DOM 树结构,这意味着你可以这样:&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&div&/span& &span class=&o&&=&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&createElement&/span&&span class=&p&&(&/span&&span class=&s2&&&div&&/span&&span class=&p&&);&/span&
&span class=&nx&&div&/span&&span class=&p&&.&/span&&span class=&nx&&innerText&/span& &span class=&o&&=&/span& &span class=&s2&&&abc&&/span&&span class=&p&&;&/span&
&span class=&nx&&atom&/span&&span class=&p&&.&/span&&span class=&nx&&workspace&/span&&span class=&p&&.&/span&&span class=&nx&&addBottomPanel&/span&&span class=&p&&(&/span&&span class=&nx&&div&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&就可以简单的在 atom 里面增加一个显示对象,这意味着再给div加个 html的 onclick就可以实现GUI交互,界面上的对象随便写点html代码就可以控制效果,意味着你可以使用 jQuery 来为atom增加新面板,意味着你只需要写一个简单的 .css 文件就可以把 Atom 整个编辑器的外观给修改了。这在 Vim/Emacs 中是几乎不可想象的事情,sublime基本就别提了。&br&&br&大量的前端开发技术和 Node.JS 基础模块供你任意使用,正是由于近年 Chromium / node.js 系列技术的成熟,和 Atom / Visual Studio Code 这类基于前端技术的客户端软件的成功,让我看到了客户端(桌面+移动)软件开发的新方向。&br&&br&&b&做VIM/Emacs不能做的事情&/b&&br&&br&Vim/Emacs过去给人的映像是:几乎能做任何事情,确实如此,但毕竟是二三十年前的东西了,而他们一直坚挺到现在一方面是操作便利,更重要的是这么长时间还没有出现一款又开源又具备同样操作便利性和可扩展性的编辑器,所以Vimer, Emacser 们最乐意展示给别人看的就是他们又安装了什么插件,急于展示可以把 Vim / Emacs 装扮成了一个多像 IDE 的东西,而今天这个“可以做任何事情”的高度可定制特性已经被Atom所吸收并完全超越,就像 Atom 的开发blog:“ &a href=&//link.zhihu.com/?target=http%3A//blog.atom.io//introducing-atom.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introducing Atom&i class=&icon-external&&&/i&&/a&” 上说的一样,对易用性和可展性 “决不妥协” :&br&&blockquote&We think we can do better. Our goal is a &b&zero-compromise&/b& combination of &b&hackability&/b& and &b&usability&/b&: an editor that will be welcoming to an elementary school student on their first day learning to code, but also a tool they won't outgrow as they develop into seasoned hackers.&/blockquote&&br&&p&抛开易用性的这个 Atom 的明显优势不说,前面其实已说了不少 Atom 比 Vim/Emacs 更灵活强大的地方,可能有些人还有疑惑,不是说 Emacs “没有不能做的事情” 么?你看 Atom的面板里面可以嵌入一个 Terminal,Vim/Emacs一样可以嵌入啊,为何还说 Atom 比它强啊?&/p&&br&&p&没错,Vim用久了会产生心理舒适区,多模式编辑使人神清气爽,命令化文本处理让你赏心悦目,但是受限于本身机制用久了会容易痛苦挣扎:虽然vim的各种扩展似乎什么事情都能做,但每个扩展却只能做到70分,总有那么30%的地方做不到位。所以用的时间长了,上半身爽的要死,下半身痛不欲生。。。。&br&&/p&&br&Vim/Emacs即便大部分扩展功能也都可以称为“能用”,可几十年的历史包袱太沉,很多事情对他们来讲就是禁区,比如诡异的标签功能,容易误操作的buffer/窗口切换,缺乏异步机制,编译时间长只有傻等着,无法跟Atom一样边读代码,边运行程序看结果,对照输出结果和源代码找问题,连实现个内嵌终端都用了若干年,还实现的那么别扭。。。。。。。。。&br&&br&&p&这类硬伤有许多,再举个最简单的例子,minimap,就是 sublime那种大家喜欢的文档缩略图,这个现代编辑器必备的功能,谁能用 Vim/Emacs 实现一下看看?Atom 可以衍生出 Visual Studio Code 这样漂亮的编辑器,Vim/Emacs能衍生么?Atom可以随便用各种先进的前端技术,不当可以嵌 Terminal我甚至可以再 Atom 嵌入一个 js版本的 DOSBOX 玩老游戏《命令与征服》:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//archive.org/details/softwarelibrary_msdos_games& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&archive.org/details/sof&/span&&span class=&invisible&&twarelibrary_msdos_games&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//playdosgamesonline.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Play DOS games online&i class=&icon-external&&&/i&&/a&&br&&/p&&br&&p&当然这样并没有任何卯用,但是如果在 Atom里面内嵌一个浏览器,方便的实时预览html/css的效果呢?或者 Atom 里面内嵌一个 Markdown Previewer ,实时查看 Markdown 的效果呢?请问 Vim/Emacs 里怎么实现法?&/p&&br&&p&Atom插件演示:markdown实时预览,左边写右边即时更新,100%兼容github的markdown语法&/p&&figure&&img src=&https://pic2.zhimg.com/f675f9a730d82e8ac3a94bd_b.png& data-rawwidth=&1077& data-rawheight=&692& class=&origin_image zh-lightbox-thumb& width=&1077& data-original=&https://pic2.zhimg.com/f675f9a730d82e8ac3a94bd_r.png&&&/figure&&br&&p&Atom插件演示:正则表达式图形化,鼠标移动上去自动显示&/p&&figure&&img src=&https://pic3.zhimg.com/accb1cebcfdb6_b.jpg& data-rawwidth=&600& data-rawheight=&540& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/accb1cebcfdb6_r.jpg&&&/figure&十分期待未来各种免费开源数学计算库同atom稍微集成下,就可以让你左边写一个等式,右边图表就能出来,是多麽爽的一种体验啊?&br&&br&Atom插件演示:color picker,快捷键打开取色面板,取完后直接生成代码插入光标之后&br&&figure&&img src=&https://pic2.zhimg.com/fefe04a15ebed_b.png& data-rawwidth=&446& data-rawheight=&530& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic2.zhimg.com/fefe04a15ebed_r.png&&&/figure&&br&Atom插件演示:代码中表示颜色的语句直接用该颜色上色,可以根据文件扩展名,对特定文件打开&br&&figure&&img src=&https://pic4.zhimg.com/8856d4dafe1ef_b.png& data-rawwidth=&438& data-rawheight=&375& class=&origin_image zh-lightbox-thumb& width=&438& data-original=&https://pic4.zhimg.com/8856d4dafe1ef_r.png&&&/figure&&br&短短两年的时间,这么多优秀的插件,只想说,如今 Atom 作为 Vim/Emacs 的继承者和超越者出现了,所以社区对 Atom 的反应也是热烈的,看看下面一组数据,截止今天(日),Atom共有扩展插件 3500+ 个,发布不到两年的时间,这是什么概念呢?&ul&&li&Sublime的插件(&a href=&//link.zhihu.com/?target=https%3A//packagecontrol.io/stats& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stats - Package Control&i class=&icon-external&&&/i&&/a&)大概 3500+个,但是sublime发布了5年的时间。&br&&/li&&li&Emacs 的插件大概有2900个,可Emacs发布到今天已经过去 25+年的时间。&br&&/li&&li&Vim 的各种插件虽然有9000个,但是Vi/Vim系列的历史长达 30+年,是atom的15倍。&/li&&/ul&&br&这就叫社区的活跃度的区别,为什么短短两年那么多开发者先后给atom贡献了各种高质量的扩展,为什么大家对atom的热情那么高?为何好多人接触了atom一段时间后都深深的爱上了它?这是有原因的。&br&&br&&b&再谈性能优化&/b&&br&&br&很多人错误的觉得 Atom慢是因为使用了 JavaScript/Coffee 等 Web 技术,所以先天慢,其实这是个误区,即便使用 Web 技术它也还能快很多,同时再慢可以往C++层的 Electron 挪啊,这也是这几个版本优化的一些方向,基于 Atom 开发的 Visual Studio Code 可以那么流畅, Atom 性能优化空间还很大,了不起多参考下自己的儿子,同样开源的 vscode怎么做的。&br&&br&同时 Atom编辑器1.0版本以来性能得到了很大的提升,主要是两个方面,一方面是js层的各种渲染优化,控件优化,延迟绘制,延迟加载,只绘制当前需要的东西等,另外一方面是将一些核心数据结构移动到 Electron 的 C++层,如今1.54版本性能较去年版本已经有了本质区别,运行时加载是慢些(但也比eclipse快很多),实际使用并没觉得不如别的编辑器,况且,js层的优化和C层的优化未来还有很大的空间可以进步。&br&&br&不过我不太喜欢 vscode 使用 Typed Script 进行开发,用点标准技术不行么,Atom使用 JavaScript/Coffee 写的多爽,如今 Atom 正在准备慢慢的切换到 JavaScript 的新标准 ES6 上。其次 vscode 快是快在“做的事情少”,主要是可扩展性方面的努力远不及 Atom,插件机制相对弱智,所以 vscode 的社区如今还不是特别活跃,扩展也少,发布一年多只有差不多300+个扩展,远不如 Atom 的情况,如果 vscode 还是按照现有结构开发下去,可能永远不会拥有 Atom的灵活度,这样再未来就无法拥有各种丰富多彩的插件。&br&&br&&b&再说开源免费&/b&&br&&br&UltraEdit 单用户版本价格: 79 美刀&br&UltraEdit 服务器版价格: 229 美刀(多人登录同一台服务器的桌面使用),企业版更贵&br&EditPlus 单用户版价格: 35 美刀,而且还只有windows版本,&br&Sublime 单用户版价格:70 美刀&br&TextMate 单用户版价格:48 欧元,而且还只有mac版本。&br&&br&这些都是钱啊,可能你会说可以免费试用或者破解啊,是的个人可以,但正常来说sublime这些试用指不能拿来搞生产不能拿来工作的,个人你用用可以,但国外人家守规矩,不会乱用,这意味着失去一大批为其开发扩展的国外开发者,同时站在公司考虑IT方案的角度,免费试用和破解将来都是潜在的麻烦,现在上百人的公司微软都会来收windows的钱了,版权问题越来越严肃,你得把这笔潜在费用考虑进去,同时这些闭源的或者单平台的东西,并不值得再上面花费过多精力和投资。&br&&br&抛开扩展性问题和价格问题,我们再来看各个热门的免费编辑器的试用情况:&br&&br&&a href=&//link.zhihu.com/?target=https%3A//notepad-plus-plus.org& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Notepad++&i class=&icon-external&&&/i&&/a&:免费,开源,只能运行于windows&br&&a href=&//link.zhihu.com/?target=http%3A//www.pspad.com/en/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PSPad&i class=&icon-external&&&/i&&/a&:免费,不开源,只能运行再 Windows&br&&a href=&//link.zhihu.com/?target=https%3A//wiki.gnome.org/Apps/Gedit& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gedit&i class=&icon-external&&&/i&&/a&:免费,开源,只能跑再 GNome下,Ubuntu用用,Windows/mac版本简直是残缺的。&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/simonsteele/pn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Programmer's Notepad&i class=&icon-external&&&/i&&/a& : 免费开源,只能跑 Windows&br&&a href=&//link.zhihu.com/?target=http%3A//www.flos-freeware.ch/notepad2.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Notepad2&i class=&icon-external&&&/i&&/a&:免费bu不开源,只能跑 Windows&br&&br&更关键的是:闭源的东西个人作者可能失去兴趣不再更新,商业公司的话,你需要一个功能,就只能无限期的等待他们发慈悲加入进去。而免费开源的很多其他编辑器除去平台兼容性问题外,更重要的时扩展性差。&br&&br&而同时满足:免费+开放+强扩展性的编辑器如今就只出现过三个:Vim / Emacs / Atom。他们是真正属于使用者的编辑器,他们能变成使用者希望变成的样子。这些曾经出现过得收费的或者免费的编辑器,凭借着一两个自身独有的 “卖点”,再某些时间段内都曾经流行过,可就像流星一样一闪而过,如今他们都统统完成了自己的历史使命,新的一页可以翻开了。终端环境的话确实 Vim / Emacs 继续下去,但桌面环境的话,Atom将会继续向前,走出新的一步。&br&&br&&b&Atom使用答疑&/b&&br&&br&怎么取消末尾空白行自动剔除?&br&-- 禁用自带 whitespace 插件即可。&br&&br&怎么将TAB从空格改为真TAB?&br&-- 设置-&Tab Mode 从 Soft 改为 Hard,同时将长度设置为4&br&&br&我喜欢查看 空格和 TAB,还有换行符,让他们显示出来?&br&-- Settings-&Editor-&Show Invisibles&br&&br&如何取消括号补全?&br&-- 设置-&Packages-&禁用 Bracket 插件即可。&br&&br&我从 sublime 过来,如何增加文档缩略图 minimap?&br&-- 设置-&Install-&安装 MiniMap 即可&br&&br&如何启用Vim模式?&br&-- 设置-&Install-&VimMode&br&&br&如何禁止按回车实现自动补全(有时想换行但是变成使用补全了)?&br&-- 设置-&Packages-&Autocomplete Plus-&将Tab+Enter改为Tab only&br&&br&我是 C/C++ 开发者,如何一键编译一键执行代码?&br&-- 安利下我自己写的插件:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&Atom有什么优秀插件? - 韦易笑的回答&/a&&br&&br&我是前端开发者,用惯了 Sublime的 Emmet,Atom下怎么办?&br&-- 也有 Emmet。&br&&br&国内有时无法自动下载安装 package怎么办?&br&-- 等三五分钟重试,有些cdn的ip (amazon) 被gfw掉了,或者全局代理翻墙,或者直接从github上clone到 ~/.atom/packages下手动安装即可。&br&&br&ATOM的编码如何自动识别GBK的文件呢?&br&-- Atom开发组调研了若干编译器和firefox等浏览器自动识别编码的代码后,发现这是一个完全不严谨基本靠猜的工作,为保证安全性,atom默认打开文件时是指定文件编码为utf-8(可改),你可以改为GBK,但这样对utf-8的文件不友好了。atom有自动识别功能,要在打开文件后,ctrl-shift-u来打开编码选择面板,然后选择 auto detect。如果你无法接受这种默认方式的话,有一个叫做 &a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/auto-encoding& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&auto-encoding&i class=&icon-external&&&/i&&/a& 的插件安装后可以帮你再打开文件的时候自动识别编码。&br&&br&有时候.h文件被自动识别成C文件而不是cpp文件,导致语法高亮无法识别class等关键字怎么办?&br&-- 只需要在你的 config.cson 中的 core项目下加入这样几行即可:&br&&div class=&highlight&&&pre&&code class=&language-json&&&span class=&err&&core:&/span&
&span class=&err&&customFileTypes:&/span&
&span class=&s2&&&source.cpp&&/span&&span class=&err&&:&/span& &span class=&p&&[&/span&
&span class=&s2&&&h&&/span&
&span class=&p&&]&/span&
&/code&&/pre&&/div&&br&&br&。。。。。。&br&&br&&b&VIM移植攻略&/b&&br&&br&我在 Vim插入模式下习惯 inoremap C-HJKL来上下左右移动,十分方便,可到了Atom里该怎么办?&br&-- File -& Open Your Keymap,按照注释设置你的新的键位,如:'alt-j': 'core:move-down'。&br&&br&我再 Vim下面喜欢设置各种indent,各种smart tab,tab expand再Atom里面怎么设置?&br&-- Settings 第一个面板就有。&br&&br&我再 Vim 下面喜欢把大写的 HJKL 设置成 5h, 5j, 5k, 5l,这样按住shift实现快速移动,请问Atom怎么设置?&br&-- 你可能需要自己写点js代码了,不过这在vim里面也是不对的用法,你把J这个粘合两行的命令给覆盖了,行间移动我喜欢用vim的CTRL_U, CTRL_D来滚动半页,行内快速移动,我喜欢5w,或者直接fx。&br&&br&我再 Vim中喜欢使用 Taglist/Tagbar 来进行索引,来到 Atom 有没有类似的插件?&br&-- 请使用:&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/symbols-tree-view& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&symbols-tree-view&i class=&icon-external&&&/i&&/a& 代替之,而且不依赖ctags,实时分析当前文件内容,超级漂亮,使用ctrl-alt-o切换是否显示。其实内置功能 CMD-R (osx的键位,win下查一下,内置插件symbol-view)可以查看当前代码的函数列表,点击也可以跳转过去,同样也不依赖ctags,轻量级使用的话,内置这个足够了。&br&&br&我从 Vim过来,如何实现Vim的 YouCompleteMe超级补全插件?&br&-- 安装 autocomplete-clang 或者 YouCompleteMe 插件即可。不过 Atom 本身内置的补全就已经很强大了,你可以先试试,况且Atom用这些东西还不像vim用 YCM那样还需要编译个带python的版本,还要编译clang一半天那么麻烦。&br&&br&我在 Vim中喜欢用 vim-multiply-cursors 做批量操作,Atom怎么弄?&br&-- &a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/multi-cursor-plus& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&multi-cursor-plus&i class=&icon-external&&&/i&&/a&&br&&br&我再 Vim中写python,过来 Atom 下找不到顺手的工具了怎么办?&br&-- 你可以查看:&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/autocomplete-python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&autocomplete-python&i class=&icon-external&&&/i&&/a&&br&。。。。。&br&&br&如何快速打开文件,类似 e命令?&br&-- 十分强大的 &a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/advanced-open-file& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&advanced-open-file&i class=&icon-external&&&/i&&/a& 插件&br&&br&我想快速移动光标,怎么破?&br&-- 本身 Atom 就提供一系列快捷键用于快速移动,不够的话 &a href=&//link.zhihu.com/?target=http%3A//atom.io/packages& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&atom.io/packages&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& 下面有很多插件可以搜索,可以找找类似 move, jump 的很多包是否适合,比如 &a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/move-by-paragraph& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&move-by-paragraph&i class=&icon-external&&&/i&&/a&,了不起改两行js,不过 vim mode下面很多 { } 等命令快速移动光标已经能满足很多要求了。&br&&br&我习惯用noremap定义很多自己习惯的组合操作,一个快捷键完成一堆命令,这该怎么移植?&br&-- keymap时使用组合命令需要自己写两行 ~/.atom/init.coffee,见官方文档:&a href=&//link.zhihu.com/?target=https%3A//atom.io/docs/latest/behind-atom-keymaps-in-depth& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&atom.io/docs/latest/beh&/span&&span class=&invisible&&ind-atom-keymaps-in-depth&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,这对喜欢折腾的 Vimer 应该不是难事,同时有人写了个扩展插件专门做这件事情的,可以看看能不能用:&a href=&//link.zhihu.com/?target=https%3A//atom.io/packages/sequential-command& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&atom.io/packages/sequen&/span&&span class=&invisible&&tial-command&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&。&br&&br&。。。。。。&br&&br&这段会不断更新补充,关于各种编辑器过来的人的习惯,}

我要回帖

更多关于 vn面板 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信