标签 编程 下的文章

是什么造就了一个优秀的程序员?首先问问你自己吧,这会是个有趣的问题。它让你反思自己的软件开发技术。这个问题也适合问问你的同事们。它可以带来一些关于如何协同工作的有趣讨论。下面是我认为成为一个优秀程序员必备的五个重要技能。

1. 分解问题

编程是为了解决问题,但在你开始写代码前,需要明白如何解决问题。优秀程序员的一项技能是把大的问题逐层分解成一个个更小的部分,直到每一部分都可以很容易解决。但找到解决问题的方式往往并没有那么简单。优秀程序员能找到方法去建立问题模型,这种方法使得输出结果的程序容易解释、实现和测试。

我写过的某些最复杂的程序在局部上都是难懂的,因为代码实现并不能很好地匹配这个问题,也就导致了编写的代码难以理解。当问题很好地建模的时候,我赞同伯尼·科赛尔所说的话(取自著名的程序员在工作中的访谈记录):

“……很少有本质上很难的程序。如果你盯着某一块代码,它看起来确实很难;如果你无法理解这段代码应该产生什么结果,这基本上就是暗示它很难被理解了。在这个时候,你不应该卷起袖子,尝试修复代码;你需要只是往回一步,再仔细考虑清楚。当你已经深思熟虑后,你会发现问题变得很简单”。

2. 场景分析

优秀开发者能考虑到如何使程序适合多种不同的场景。这项能力既适用于处理程序本身的逻辑,又适用于处理可能会发生的外部和内部事件。为了考虑逻辑上的不同思路,他们问自己这样的问题:如果这个参数为空会发生什么?如果所有条件都为假呢?这个方法在线程上是安全的吗?为了发现软件需要处理的各种类型的事件,他们问自己这样的问题:如果队列占满了会怎样?如果请求收不到响应会怎样?如果在这台服务器重启的同时另外一台服务器也重启了会怎样?

优秀程序员问他们自己:如何发现程序的缺陷?换句话说,他们有能力像测试人员一样思考。相反,缺少经验的程序员通常只考虑正确的路径——在一切都按照预期进行时正常的控制流(当然这也是程序在大部分时候的情况)。当然,异常不可避免要发生,所以需要程序能处理这些情况。

3. 命名

编程由大量的命名对象组成:类、方法和变量。当编码完成得很好时,程序也具备了自我描述的能力,也就是说通过阅读源代码可以清楚地明白程序中函数的含义。自描述代码的一个好处就是很自然地产生许多更短的命名方法,而不是少数更长的方法,因为你有更多空间去放置有意义的名字(还有其它原因解释为什么短小方法更好)。

想出好的名字比它听起来更困难一些。我喜欢这段引用(来自菲尔·卡尔顿):“在计算机科学领域只有两件困难的事情:缓存失效和命名对象。”命名在一定程度上很困难是因为你需要清楚地明白每一个名字究竟要代表什么。有时候命名不是一下子就清晰明了,只有随着软件开发进展才会慢慢显现。因此,重命名和命名一样重要。

命名对象也包含提出要用的概念和这些概念该如何称呼。通过深思熟虑,清楚命名所使用的惯用概念(在程序中和与程序员、非程序员讨论时使用),这使得编写程序变得更加容易。

4. 一致性

也许编程中最大的挑战是管理复杂性。保持一致性是处理复杂性的一种方法。它通过允许我们看到对象命名、使用和处理所采用的模式和推理来降低了某些复杂性。有了一致性,我们就无需用脑去记住异常和随机变量。取而代之,我们可以更关注程序本身的复杂性,而不是偶然产生的复杂性

保持一致性从整体看来是很重要的。它应用在变量名字和分组、方法命名、模块划分、目录结构、GUI、错误处理、日志输出和文档等很多方面。比如,如果某些变量是的相关,并一起出现(在声明、方法调用或数据库中的列),而且总是以相同的顺序使用它们。那么当其中一个消失或者整体被打乱时,你就会很容易发现。对于一个操作,如果在一个地方叫delete,就不要在另一个地方叫remove:务必使用相同的名字。史蒂夫·麦克奈尔在代码大全中对于使用相反命名有相同的建议。比如,begin和end是相反的,就如同start和stop一样。当使用相反对时不要混用不同对的名字(比如使用begin和stop)。

当修改一段程序时可能会引入非一致性。粗心大意的程序员不会注意到他们添加的代码是否和已有的代码保持一致。优秀程序员会严苛地确保在这些看似很小的细节上都要做到精益求精。他们知道保持一致性对于在软件开发的整个过程中处理复杂性是多么的重要。

5. 学习能力

作为一名软件开发者,你需要持续学习。在为软件添加一项新功能前,你必须明白为什么要这么做。在给一个已有程序添加代码前,你通常必须知道已有代码在做什么,以便合适地嵌入新功能。你还需要学习相关系统,以便正确地与它们交互。因此,快速学习的能力使你成为一名更加高效的开发者。

而且,因为软件工程领域的开发速度是如此的快速,所以新的编程语言、工具、技术和框架需要学习层出不穷。这是好还是坏,就看你怎么看。佛瑞德·布鲁克斯把学习能力列为技能的快乐之一,对此我深表赞同。学习新事物本身就是令人心满意足的,它也意味着开发者的生活从不无聊。

总结

上面所有的技能都是通用的——它们中没有一项是针对某种语言、某个框架或某种技术。如果你拥有它们,你就能快速学习一门新的语言或工具,在新的环境下写出优秀的软件。而且,因为它们在本质上是通用的,所以不会在若干年以后过时。

是什么造就了一个优秀的程序员?以上便是我的观点。你认为造就一个优秀程序员的因素有哪些?在评论里告诉我吧。


via: http://henrikwarne.com/2014/06/30/what-makes-a-good-programmer/

作者:Henrik Warne 译者:KayGuoWhu 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

作为开发人员的你们,还记得你学会的第一种编程语言吗?跟大家聊聊你最爱的编程语言,或者分享一下你在敲代码过程中遇到过的趣事儿。小编为大家准备了9本编程语言图书,转发微博参与互动(微博地址见活动详情),11月21-11月29每天从参与活动的用户中抽取一位中奖用户,赠送图书一本(图书按照图片顺序)

活动详情:

活动时间:2014年11月21日-2014年11月29日

活动内容:在新浪微博转发微博参与互动,活动期间每天从参与活动的用户中抽取一位中奖用户,赠送图书一本(图书按照图片顺序)。

微博地址:http://weibo.com/1772191555/Bxh8CkGac

特此注意:

微博用户参与活动,注意查看@LINUX中国 官方微博公布的中奖名单或留意您的微博私信。我们会通过微博私信的方式获取您的邮寄信息。

1、《Go并发编程实战》

试读地址:http://www.ituring.com.cn/book/1525

2、《Python基础教程(第2版•修订版)》

试读地址:http://www.ituring.com.cn/book/1396

3、《Ruby基础教程(第4版)》

试读地址:http://www.ituring.com.cn/book/1237

4、《Groovy程序设计》

试读地址:http://www.ituring.com.cn/book/1294

5、《Swift开发指南(修订版)》

试读地址:http://www.ituring.com.cn/book/1517

6、《嗨翻C语言》

试读地址:http://www.ituring.com.cn/book/1004

7、《精通C#》

试读地址:http://www.ituring.com.cn/book/1046

8、《学习R》

试读地址:http://www.ituring.com.cn/book/1187

9、《C++程序设计:现代方法》

试读地址:http://www.ituring.com.cn/book/1263

更多图灵图书:请点击:http://jmall.jd.com/p151429.html

深入了解一下Cloud9,Koding和Nitrous.IO。

已经准备好开始你的第一个编程项目了吗?很好!只要配置一下终端或命令行,学习如何使用它,然后安装所有要用到的编程语言,插件库和API函数库。当最终准备好一切以后,再安装好Visual Studio就可以开始了,然后才可以预览自己的工作。

至少这是大家过去已经熟悉的方式。

也难怪初学程序员们逐渐喜欢上在线的集成开发环境(IDE)了。IDE是一个代码编辑器,不过已经准备好编程语言以及所有需要的依赖,可以让你避免把它们一一安装到电脑上的麻烦。

我想搞清楚到底是哪些因素能组成一个典型的IDE,所以我试用了一下免费级别的时下最受欢迎的三款集成开发环境:Cloud9KodingNitrous.IO。在这个过程中,我了解了许多程序员应该或不应该使用IDE的各种情形。

为什么要用IDE?

假如有一个像Microsoft Word那样的文字编辑器,想想类似Google Drive那样的IDE吧。你可以拥有类似的功能,但是它还能支持从任意电脑上访问,还能随时共享。因为因特网在项目工作流中的影响已经越来越重要,IDE也让生活更轻松。

在我最近的一篇ReadWrite教程中我使用了Nitrous.IO,这是在文章“创建一个你自己的像Yo那样的极端简单的聊天应用”里的一个Python应用。当使用IDE的时候,你只要选择你要用的编程语言,然后通过IDE特别为运行这种语言程序而设计的虚拟机(VM),你就可以测试和预览你的应用了。

如果你读过那篇教程,就会知道我的那个应用只用到了两个API库-信息服务Twilio和Python微框架Flask。在我的电脑上就算是使用文字编辑器和终端来做也是很简单的,不过我选择使用IDE还有一个方便的地方:如果大家都使用同样的开发环境,跟着教程一步步走下去就更简单了。

IDE不能做的事情

到目前为止,IDE还不是一个长期托管方案。

当你使用IDE工作的时候,你可以在云上构建,测试和预览你的应用。你甚至还可以直接通过链接共享你的最终作品。

但是不能用IDE来永久存储你的整个项目。把帖子保存在Google Drive文件中不会让你的博客丢失。类似Google Drive,IDE可以让你创建链接用于共享内容,但是任何一个都还不足以替代真正的托管服务器。

还有,IDE并不是设计成方便广泛共享。尽管各种IDE都在不断改善大多数文字编辑器的预览功能,还只能用来给你的朋友或同事展示一下应用的预览,而不是像Hacker News一样的主页。那样的话,占用太多带宽的IDE也许会让你崩溃。

这样说吧:IDE只是构建和测试你的应用的地方,托管服务器才是它们生存的地方。所以一旦完成了你的应用,你会希望把它布置到能长期托管的云服务器上,最好是能免费托管的那种,例如Heroku

选择一个IDE

随着IDE变得越来越流行,选择也越来越多。在我眼里,没有一个是完美的。不过,还是有些IDE在完成某些工作方面相对来说有些优势。

我尝试了一下免费级别的三个最受欢迎的集成开发环境:Cloud9,Koding和Nitrous.IO。每一个都有自己的优点,当然跟你用来做的事情有关系。下面就是我的发现。

Cloud9:乐于协作

当我完成了Cloud9的注册后,它提示的第一件事情就是添加我的GitHub和BitBucket账号。马上,所有我的GitHub项目,个人的和协作的,都可以直接克隆到本地并使用Cloud9的开发工具开始工作。其他的IDE在和GitHub集成的方面都没有达到这种水准。

在我测试的这三款IDE中,Cloud9看起来更加侧重于一个可以让协同工作的人们无缝衔接工作的环境。在这里,它并不是角落里放个聊天窗口。实际上,按照其CEO Ruben Daniels说的,试用Cloud9的协作者可以互相看到其他人实时的编码情况,就像Google Drive上的合作者那样。

“大多数IDE服务的协同功能只能操作单一文件”,Daniels说,“而我们的产品可以支持整个项目中的不同文件。协同功能被完美集成到了我们的IDE中。”

Koding:在你需要的时候能提供帮助

IDE可以提供你所需的工具来构建和测试所有开源编程语言的应用。对于初学者来说,看起来有点吓人。举个例子,如果我要做一个项目同时用到Python和Ruby组件,那我要用哪个VM来测试?

答案是两个都要,尽管使用免费账号的话,只能够同时打开一个VM用于测试。我就在Koding的控制面板里找到了答案,一个折叠起来的地方,用户可以提供或获得他们Koding项目的各种经验。在这三者中间,它是最容易使用的,拥有一个你可以寻求帮助并很快有人回答的地方。

“我们在这款产品里加入了一个积极的社区功能”,Koding的首席商务官Nitin Gupta说,“我们希望搭建一个环境,真正吸引那些希望得到帮助和愿意提供帮助的人们。”

Nitrous.IO: An IDE Wherever You Want

相对于自己的桌面环境,使用IDE的最大优势是它是自足的。你不需要安装任何其他的东西就可以使用。而另一方面,使用自己的桌面环境的最大优势就是你可以在本地工作,甚至在没有互联网的情况下。

Nitrous.IO结合了这两个优势。“你可以在网站上在线使用这个IDE,你也可以把它下载到自己的电脑上”,其共同创始人AJ Solimine这样说。优点是你可以结合Nitrous的集成性和你最喜欢的文字编辑器的熟悉。

他说:“你可以使用任意现代浏览器访问Nitrous.IO的在线IDE网站,但我们仍然提供了方便的Windows和Mac桌面应用,可以让你使用你最喜欢的编辑器来写代码。”

底线

这一个星期使用三个不同IDE的最让我意外的收获是什么?它们是如此相似。当用来做最基本的代码编辑的时候,它们都一样的好用。

Cloud9,Koding,和Nitrous.IO都支持所有主流的开源编程语言,从Ruby到Python到PHP到HTML5。你可以选择任何一种VM。

Cloud9和Nitrous.IO都实现了GitHub的一键集成。Koding需要多几个步骤,不过也是可以实现的。

每一个都轻松地集成了我需要的API。每一个也都可以让我自己安装喜欢的包(Koding需要超级用户权限)。它们都带有内置的终端,可以用来轻松地测试和布置项目。三个都支持轻松地预览项目。当然,它们也都把我的项目托管在云服务器中,所以我在任意地方都可以在上边工作。

不好的一面,它们都有相同的缺陷,不过考虑到它们都是免费的也还合理。你每次只能同时运行一个VM来测试特定编程语言写出的程序。而当你一段时间没有使用VM之后,IDE会把VM切换成休眠模式以节省带宽,而下次要用的时候就得等它重新加载(Cloud9在这一点上更加费力)。它们中也没有任何一个为已完成的项目提供像样的永久托管服务。

所以,对咨询我是否有一个完美的免费IDE的人来说,答案是可能没有。但是这也要看你侧重的地方,对你的某个项目来说也许有一个完美的IDE。

图片由Shutterstock友情提供


via: http://readwrite.com/2014/08/14/cloud9-koding-nitrousio-integrated-development-environment-ide-coding

作者:Lauren Orsini 译者:zpl1025 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

在每种编程语言中,变量都扮演了一个重要的角色。在Linux shell脚本编程中,我们使用两种类型的变量:系统定义的变量用户定义的变量

shell脚本中的变量是用来调用一个数值或者字符值的手段。与正规的编程语言不同的是,shell脚本不要求你去为变量声明一个类型

在本文中,我们将讨论shell脚本编程中的变量及其类型,以及如何设置和使用这些变量。

系统定义的变量:

这些变量由操作系统(Linux)自身创建并维护,通常它们以大写字母定义,我们可以通过命令“$ set”来查看这些变量。下面列出了部分系统定义的变量:

系统定义的变量意义
BASH=/bin/bashBash Shell 名称
BASH\_VERSION=4.1.2(1)Bash 版本
COLUMNS=80你的屏幕宽度(列数)
HOME=/home/linuxtechi用户家目录
LINES=25你的屏幕高度(行数)
LOGNAME=LinuxTechi当前登录用户的名字
OSTYPE=Linux操作系统类型
PATH=/usr/bin:/sbin:/bin:/usr/sbin可执行文件搜索路径
PS1=[\u@\h \W]$命令行提示符
PWD=/home/linuxtechi当前工作目录
SHELL=/bin/bashShell 名称
USERNAME=linuxtechi当前登录的用户名

要打印以上变量的值,可以使用echo command命令,如下:

# echo $HOME
# echo $USERNAME

我们可以通过在环境变量名前前置一个美元符号来从你的脚本里输入环境变量。请看下面脚本演示:

$ cat myscript

#!/bin/bash
# display user information from the system.
echo “User info for userid: $USER”
echo UID: $UID
echo HOME: $HOME 

注意:echo命令中的环境变量在脚本运行时会被它们的值替代。同时注意,我们可以再第一个字符串的双引号中放置$USER系统变量,而shell脚本仍然可以明白我们的意思。然而,该方法有一个缺点。看下面这个例子:

$ echo “The cost of the item is $15”
The cost of the item is 5

很明显,那不是我们说希望的。无论何时,当脚本遇见引号中的美元符号时,它都会认为你是在调用一个变量。在本例中,该脚本试着显示变量$1(而这个变量并没有定义),然后显示数字5。要显示实际上的美元符号,你必须前置一个反斜线字符

$ echo “The cost of the item is \$15”
The cost of the item is $15

那样好多了。反斜线允许shell脚本将美元符号解释成为实际的美元符号,而不是变量。

用户定义的变量:

这些变量由用户定义。shell脚本允许我们在脚本中设置并使用我们自己的变量。设置变量允许你临时存储数据并在脚本中使用,让shell脚本看起来像一个真正的计算机程序。

用户变量可以是任何不超过20个的字母、数字或者下划线字符的文本字符串(LCTT 译注:变量只能以字母或下划线开头)。用户变量是大小写敏感的,因此,变量Var1和变量var1是不同的变量。这个小规则常常让新手编写脚本时麻烦重重。

我们可以通过等于号为变量赋值。变量,等于号和值(对于新手又是个麻烦的地方)之间不能有空格。下面是几个给用户变量赋值的例子:

var1=10
var2=-57
var3=testing
var4=“still more testing”

shell脚本为变量值自动确定数据类型。shell脚本内定义的变量会在脚本运行时保留它们的值,当脚本完成后则删除这些值。

就像系统变量一样,用户变量也可以使用美元符号来调用:

$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$

运行脚本会产生以下输出:

$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$

每次变量被调用,它都会变成了当前分配给它的值。有一点很重要,当调用一个变量值时,你使用美元符号,但是当为一个变量分配一个值时,你不能用美元符号。下面用例子来说明:

$ cat test4
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
$

当你使用赋值语句中value1变量的时,你仍然必须使用美元符号。这段代码产生了如下输出:

$ chmod u+x test4
$ ./test4
The resulting value is 10
$

如果你忘了美元符号,而又让value2赋值行看起来像这样:

value2=value1

你会获得下面的输出:

$ ./test4    
The resulting value is value1
$

没有美元符号,shell解释变量名为普通文本字符串,这极有可能不是你想要的。

在shell变量中使用反引号(`):

反引号允许你将shell命令的输出赋值给变量。虽然这似乎没什么大不了,但它是脚本编程中主要的构建基块。你必须使用反引号将整个命令行包含起来:

**testing=`date`**

shell会在反引号中运行命令,然后将输出结果赋值给变量testing。下面的例子给出了如何使用一个常规shell命令的输出结果来创建一个变量:

$ cat test5
#!/bin/bash
# using the backtick character
testing=`date`
echo "The date and time are: " $testing
$

变量testing接收来自date命令的输出结果,而它又在echo语句中被调用。运行脚本会产生如下输出:

$ chmod u+x test5
$ ./test5
The date and time are: Mon Jan 31 20:23:25 EDT 2011

:在bash中,你也可以选用$(...)语法来替换反引号(`),它有个优点就是可以重用(re-entrant)。

例:

$ echo " Today’s date & time is :" $(date)
Today’s date & time is : Sun Jul 27 16:26:56 IST 2014 

via: http://www.linuxtechi.com/variables-in-shell-scripting/

作者:Pradeep Kumar 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出


当软件出现问题的时候,它应该以一种很容易引起注意的方式马上终止。这种“快速终止”的方式值得借鉴,我们会在这期专栏里谈谈这个重要的概念。

一开始,“快速终止”看上去是一种会影响可靠性的不好的实践——为什么一个系统在还可以继续运行的时候要崩溃(或者说终止)?对于这个,我们需要理解,快速终止是和Heisenbugs(对于不易复现bug的一种称呼)紧密联系在一起的。

考虑一下Bohrbugs(对于能够重现的bug的一种称呼),它们在一个给定输入的条件下总是会出现,比如,访问空指针。这类问题很容易测试、复现并修复。而如今,所有有经验的程序员应该都面对过这样的情形:导致崩溃的bug在重启软件后就不再出现了。不管花多少时间或努力去重现问题,那个bug就是跟我们捉迷藏。这种bug被称为Heisenbugs。

花在寻找、修复和测试Heisenbugs上的努力比起Bohrbugs来说,要高出一个数量级。一种避免Heisenbugs的策略是将它们转化为Bohrbugs。怎么做呢?预测可能导致Heisenbugs的因素,然后尝试将它们变成Bohrbugs。是的,这并不简单,而且也并不是一定可行,但是让我们来看一个能产生效果的特殊例子。

并发编程是Heisenbugs经常出现的一个典范。我们的例子就是一个Java里和并发相关的问题。在遍历一个Java集合的时候,一般要求只能通过Iterator的方法对集合进行操作,比如remove()方法。而在遍历期间,如果有另一个线程尝试修改底层集合(因为编程时留下的错误),那么底层集合就可能会被破坏(例如,导致不正确的状态)。

类似这种不正确的状态会导致不确定的错误——假如我们幸运的话(实际上,这很不幸!),程序可以继续执行而不会崩溃,但是却给出错误的结果。这种bug很难重现和修复,因为这一类的程序错误都是不确定的。换句话说,这是个Heisenbug。

幸运的是,Java Iterators会尝试侦测这种并发修改,并且当发现时,会抛出异常ConcurrentModificationException,而不是等到最后再出错——那样也是没有任何迹象的。换句话说,Java Iterators也遵从了“快速终止”的方法。

如果一个ConcurrentModificationException异常在正式版软件中发生了呢?根据在Javadoc里对这个异常的说明,它“只应该被用于侦测bug”。换句话说,ConcurrentModificationException只应该在开发阶段监听和修复,而不应该泄漏到正式代码中。

好吧,如果正式软件确实发生了这个异常,那它当然是软件中的bug,应当报告给开发者并修复。至少,我们能够知道曾经发生过一次针对底层数据结构的并发修改尝试,而这是软件出错的原因(而不是让软件产生错误的结果,或是以其他现象延后出错,这样就很难跟踪到根本原因)。

“防止崩溃”的途径就意味着开发健壮的代码。一个很好的编写容错代码的例子就是使用断言。很可惜的是,关于断言的使用有大量不必要的公开争论。其中主要的批评点是:它在开发版本中使用,而在发布版中却被关掉的。

不管怎么样,这个批评是错误的:从来没有说要用断言来替代应该放到发布版软件中的防御式检查代码。例如,断言不应该用来检查传递给函数的参数是否为空。相应的,应该用一个if语句来检查这个参数是否正确,否则的话抛出一个异常,或是提前返回,来适合上下文。然而,断言一般可以用于额外检查代码中所作出的假设,这些假设应该一直为真才正常。例如,用一个语句来检查在进行了入栈操作后,栈应该不是空的(例如,对“不变量”的检查)。

所以,快速终止,随时中断,那么你就走在开发更加健壮代码的道路上了。

我的 .vimrc文件

"********************************************************
"                   一般性配置                          *
"********************************************************

"关闭vim一致性原则
set nocompatible

"显示行号
set number

"设置在编辑过程中右下角显示光标的行列信息
set ruler

"在状态栏显示正在输入的命令
set showcmd

"设置历史记录条数
set history=1000

"设置取消备份 禁止临时文件的生成
set nobackup
set noswapfile

"设置匹配模式
set showmatch

"设置C/C++方式自动对齐
set autoindent
set cindent

"开启语法高亮功能
syntax enable
syntax on

"指定配色方案为256色
set t_Co=256

"设置搜索时忽略大小写
set ignorecase

"配置backspace的工作方式
set backspace=indent,eol,start

"设置在vim中可以使用鼠标
set mouse=a

"设置tab宽度
set tabstop=4

"设置自动对齐空格数
set shiftwidth=4

"设置退格键时可以删除4个空格
set smarttab
set softtabstop=4

"将tab键自动转换为空格
set expandtab

"设置编码方式
set encoding=utf-8

"自动判断编码时 依次尝试以下编码
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

"检测文件类型
filetype on

"针对不同的文件采取不同的缩进方式
filetype indent on

"允许插件
filetype plugin on

"启动智能补全
filetype plugin indent on


"*********************************************************
"                  vundle 配置                           *
"*********************************************************

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
 
" let Vundle manage Vundle
Bundle 'gmarik/vundle'
  
" My Bundles here:

Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
Bundle 'tpope/vim-rails.git'
Bundle 'taglist.vim'
Bundle 'The-NERD-tree'
Bundle 'Syntastic'
Bundle 'L9'
Bundle 'FuzzyFinder'
Bundle 'Lokaltog/vim-powerline'
Bundle 'Valloric/YouCompleteMe' 
   

"*****************************************************
"                   taglist配置                      *
"*****************************************************

"不显示"press F1 to display help"
let Tlist_Compact_Format=1

"窗口在左侧显示
let Tlist_Use_Right_Window=1

"只显示当前文件的tags
let Tlist_Show_One_File=1  

"高亮显示
let Tlist_Auto_Highlight_tag=1

"随文件自动更新
let Tlist_Auto_Update=1

"设置宽度
let Tlist_WinWidth=30       

"taglist窗口是最后一个窗口,则退出vim
let Tlist_Exit_OnlyWindow=1 

"单击跳转
let Tlist_Use_SingClick=1

"打开关闭快捷键
nnoremap <silent> <F8> :TlistToggle<CR>




"********************************************************
"                      NERD_Tree 配置                   *
"********************************************************

"显示增强
let NERDChristmasTree=1

"自动调整焦点
let NERDTreeAutoCenter=1

"鼠标模式:目录单击,文件双击
let NERDTreeMouseMode=2

"打开文件后自动关闭
let NERDTreeQuitOnOpen=1

"显示文件
let NERDTreeShowFiles=1

"显示隐藏文件
let NERDTreeShowHidden=1

"高亮显示当前文件或目录
let NERDTreeHightCursorline=1

"显示行号
let NERDTreeShowLineNumbers=1

"窗口位置
let NERDTreeWinPos='left'

"窗口宽度
let NERDTreeWinSize=31

"不显示'Bookmarks' label 'Press ? for help'
let NERDTreeMinimalUI=1

"快捷键
nnoremap <silent> <F4> :NERDTreeToggle<CR>



"*****************************************************
"           YouCompleteMe配置                        *
"*****************************************************

"leader映射为逗号“,”
let mapleader = ","  

"配置默认的ycm_extra_conf.py
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py' 
 
"按,jd 会跳转到定义
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>   

"打开vim时不再询问是否加载ycm_extra_conf.py配置
let g:ycm_confirm_extra_conf=0   

"使用ctags生成的tags文件
let g:ycm_collect_identifiers_from_tag_files = 1 


"*****************************************************
"           Syntastic配置                            *
"*****************************************************


let g:Syntastic_check_on_open=1

效果图

用到的主要插件:

  • vundle(用于插件管理)
  • taglist(显示代码结构)
  • NERD\_Tree(树形目录)
  • YouCompleteMe(智能补全)
  • Syntastic( 语法检查)

学习时间不长,如有问题请指出!感谢!