Showing posts with label Coding. Show all posts
Showing posts with label Coding. Show all posts

Tuesday, April 30, 2013

完全使用VIM一个月

之前的文章讲的,我是因为考虑要买一个HHKB键盘而决定使用VIM的,到现在已经使用有一个月了。虽然最终没有买HHKB键盘,不过学会了VIM这个也是一个让我觉得很得意的成就。现在自己很庆幸当时狠下心来学习了VIM,真的不愧是编辑器之神。

自己从毕业工作开始,使用过好几种编辑器,SourceInsight,Eclipse,UltraEdit,SublimeText,NotePad++这个单子还可以更长,这几个是自己感觉比较好的编辑器。期间也有试着学习Emacs,每次都放弃了。VIM自己一路来都在用,可是只是在需要远程简单编辑Linux上的一些文件时候用一下,VIM从来没有成为自己的主编辑器。这些编辑器中我使用最多的是SourceInsight和SublimeText。SourceInsight在看代码方面,特别是大型项目代码的时候,真的是有很大的优势,可是其编辑功能真的是太差了。SublimeText,我从看到它的第一眼就喜欢上了,可能是因为它的配色很和自己的胃口吧。自己特别喜欢SublimeText的Ctrl+P功能,Ctrl+D,多选功能,Column Edit,Per Project Setting。还有就是它选择丰富的插件系统,因为其插件支持Python,插件开发变得相对容易。还有就是其跨平台支持,这些有优点让SublimeText出道不到几年已经变成一个十分流行的编辑器,自己这次转换到VIM,在选择插件的时候就是参考了已经习惯的SublimeText来做选择,只有在VIM里面基本实现了日常开发需要的功能,才能够抛弃别的编辑器,100%使用VIM。

使用VIM,就是要全键盘工作,在编辑代码的时候抛弃鼠标,要想实现高效的浏览和编辑,定制自己称心容易记的组合键是必不可少的。你可以轻易的在网上找到别人的VIM配置,自己加以借鉴修改成适合自己的配置。自己的VIM基本配置一开始就使用没有修改过的The ultimate Vim configuration (vimrc) 只是插件从一开始我就选择自己要用的。在使用过程中,再慢慢修改到自己喜欢的配置。慢慢的,你的VIM配置就十分完整了。

VIM的学习曲线相对于除Emacs外的编辑器是很陡的,可是你一旦掌握,你就真心会喜欢上VIM,你就恨不得所有的日常使用程序都想要VIM的Key Binding。实际上学习VIM跟学习任何别的软件或者编程语言一样,没有什么捷径,唯一的途径就是使用,让自己天天使用,强迫自己只使用VIM,遇到问题就Google一下,找打解决办法。以我自己的经验来讲,当我强迫自己只使用VIM来做工,只用了一个礼拜,自己就很习惯使用VIM了。

对于一个代码编辑器来讲,最重要的几样功能只要实现了,就基本上是一个可以使用的编辑器了,高级功能是要在实际需要的时候再学习的。因为我是做C编程的,而且项目比较大,光C代码文件就有1万多个,所以,以下几样是我认为不可少的几样功能:

  • 代码跳转,跳到定义地方
  • 快速代码查找,在整个项目的所有文件内查找
  • 漂亮的代码显示
  • 自定义组合键
  • 丰富的扩展性 (加入特有的编译构建系统,或者特有的外部命令)
  • 项目管理,或者对不同的文件夹进行不同的设定 (Per Project/Dirctory Setting)
  • 快速打开文件
  • 基本的代码补全提示(对于大型项目真的是实用的)

SublimeText对于上述的功能都有很好的实现,而且SublimeText也还有Vim的KeyBinding。可是自己对于这种混杂的Key Binding不是很习惯。在习惯了Vim后,虽然Vim没有实现所有我喜欢的SublimeText的功能,我还是果断的选择了Vim。

对于我选择的插件和我选择的Vim Key Binding我会再另外写一个blog来讲述。希望有更多的Programmer跟我一样,最终选到一个自己十分喜欢的编辑器,不管是Emacs还是Vim,还是别的,只要你真的喜欢,并且能完成你需要的所有功能,那就用它吧。

Wednesday, April 17, 2013

HHKB和VIM


前一段时间在网上游荡的时候被别人下毒,看中了HHKB键盘,网上编程人员对于此键盘都是推崇备至,引为终极解毒利器,于是心痒痒准备从日本Amazon购买一个Pro2。在下了决定后面几天,基本上每天都要花一些时间到网上找关于HHKB的文章看看,过了几天,没有下单去买,因为对于HHKB已经退烧了。退烧不是因为忽然觉得这个键盘不好了,而是因为考虑到如果我买一个HHKB,自己应该很快就会习惯其布局,那么以后自己不管到哪里,都要准备一个HHKB布局的键盘,否则就会严重不适应,特别是那个特别的Backspace键,一个使用率特别高的键,一旦适应HHKB的位置,那到标准键盘上面岂不是每次都会打出来一串"\"来。而自己现在又没有钱买上两个HHKB,一个放家里,一个放公司。于是,我就退烧了,因为开销太高。

在考虑HHKB期间,让我有一个意外收获,就是自己现在改用VIM了。起因是因为当时决定要用HHKB键盘,那当然是用VIM或者Emacs来作为编辑器才能够发挥其特殊布局的好处。基于自己已经对VIM有一点基础,于是决定最终选择VIM。网上参考了不少文章,终于把VIM的配置和插件搞定,这次是我认识VIM以来做的最好,最完整的一次配置。选择插件都是尽量在相似插件里面选择自己最喜欢的,而且考虑到Sublime Text有很多好功能,特别是自己天天使用的功能,比如Control+P,Project,Ctrl+D,就优先安装了那些实现这些功能的插件。现在自己对这次所做的配置是十分满意的,自己需要的功能都在VIM里面实现了。然后就是对键盘做了一些Remap,对于Ctrl和Esc应该怎么remap自己是考虑和实验了好几种方案,这个可以另外写一篇文章来单独写,自己最终只是选择了把CapLock换成Ctrl,而用Ctrl+[来作为Esc,这个是VIM内置的。在强制自己用了VIM两个礼拜了,我不得不说,我现在很喜欢VIM,简单快捷的编辑真的是让编辑代码感觉很爽。自己在VIM里面做了好多remap,尽量把常用的已经命令remap到Home Line的键上面。

我现在用的VIM配置已经放在github上面:http://github.com/yongzhy/vimconfig 自己还在慢慢的在使用过程中做一些修改,不过基本的,必须的插件都已经在了。还有一个没有解决的问题是代码自动补全,我倾向于用clang来做代码补全提示,不过由于公司的代码结构的特殊性,自己还没有找到一个好的解决办法,所以这个功能就先不这么急。

Friday, January 25, 2013

Go wrapper for Lauterbach Trace32 Remote API

公司里面用Lauterbach Trace32的simulation来解决一些问题,其过程比较繁琐,要运行很多次不同的cmm文件,还要好几种文件。于是就想把这些过程自动化,写一个小工具根据指定的参数自动生成cmm文件,然后用Remote API控制Trace32来运行这些生成的cmm。这个小工具已经做好,用Go写的,本来决定要用QT写一个GUI版本,因为那些API是C的。最后因为发现那些API比较容易封装,而且自己也正在学习Go,就多做了一些工,把API用Go封装一下,然后用Go来写这个小工具。

本着共享的精神,封装好的API放在github上,不是每一个function我都测试过,我自己需要用的那几个API是没有问题的。 :)

代码地址: https://github.com/yongzhy/t32

Tuesday, January 8, 2013

简单的 p4wrapper 实现 perforce p4的edit和revert命令

公司用Perforce管理代码,因为有很多产品,每个产品在自己的branch里面,电脑上自己参与的产品都有一个独立的workspace。自己用SourceInsight和SublimeText2来编辑代码,每次都在不同的workspace间换来换去,所以如果用p4命令来check out代码,P4_CLIENT每次都在变。为了省事,自己用Go写了一个简单的p4的wrapper,只做两件事情,check out和revert。其余的perforce的工作就用GUI的客户端。

自己写的这个wrapper有考虑到本人自己的情况,所以这个wrapper不需要用户去定义现在的workspace,wrapper会通过比较现在的工作文件的绝对路径和用户在当前开发主机上的所有workspace的路径mapping比较找出working workspace。这样就省去了每次要定义P4_CLIENT的苦恼。

代码放在github上, 点这里

我也把自己用的SublimeText 2的plugin放上去了。希望对那些工作环境跟我差不多的人有所帮助。

Wednesday, September 19, 2012

计算两个日期间隔,用X年X月X日表示

自己用golang写了一个短代码用来计算两个日期间隔,间隔用X年X月X日表示出来,比如2010-07-19到2012-09-18的间隔就是2年1月30天。写这个程序是用来具体算小孩的年龄,闰年也有考虑在内,比如 2010-07-19到2012-03-18是1年7个月28天,因为2012年2月有29天。

package main

import (
    "flag"
    "fmt"
    "os"
    "strconv"
    "strings"
    "time"
)

type DateDiff struct {
    years, months, days int
}

var DAYS = map[time.Month]int{
    time.January:   31,
    time.February:  28,
    time.March:     31,
    time.April:     30,
    time.May:       31,
    time.June:      30,
    time.July:      31,
    time.August:    31,
    time.September: 30,
    time.October:   31,
    time.November:  30,
    time.December:  31,
}

func LeapYear(year int) bool {
    ret := false
    if year%4 == 0 {
        if year%100 != 0 {
            ret = true
        } else if year%400 == 0 {
            ret = true
        }
    }
    return ret
}

// passed in strings hould be in either of the following two format:
//    yyyy-mm-dd
//    yyyy/mm/dd
func ParseDate(s string) time.Time {
    var it []string
    if strings.Index(s, "-") > 0 {
        it = strings.Split(s, "-")
    } else if strings.Index(s, "/") > 0 {
        it = strings.Split(s, "/")
    } else {
        fmt.Printf("Error: wrong date format\n")
        flag.Usage()
        os.Exit(-1)
    }
    y, err := strconv.ParseInt(it[0], 10, 64)
    if err != nil {
        panic(err)
    }
    m, err := strconv.ParseInt(it[1], 10, 64)
    if err != nil {
        panic(err)
    }
    d, err := strconv.ParseInt(it[2], 10, 64)
    if err != nil {
        panic(err)
    }
    return time.Date(int(y), time.Month(int(m)), int(d), 0, 0, 0, 0, time.UTC)
}

func main() {
    var ds, de string
    flag.StringVar(&ds, "start", "", "[*]Start Date in format of yyyy/mm/dd or yyyy-mm-dd")
    flag.StringVar(&de, "end", "today", "End Date in format of yyyy/mm/dd or yyyy-mm-dd")
    flag.Parse()
    if ds == "" {
        fmt.Printf("Error: No start date is specified\n")
        flag.Usage()
        os.Exit(-1)
    }

    var start, end time.Time
    start = ParseDate(ds)
    if de == "today" {
        end = time.Now()
    } else {
        end = ParseDate(de)
    }

    var diff DateDiff
    var borrowed bool = false
    var daysBorrowed int = 0
    // Days difference
    if end.Day() >= start.Day() {
        diff.days = end.Day() - start.Day()
    } else {
        daysBorrowed = DAYS[end.Month()-1]
        if LeapYear(end.Year()) && end.Month() == time.March {
            daysBorrowed++ // February in leap year is 29 days
        }
        diff.days = end.Day() + daysBorrowed - start.Day()
        borrowed = true
    }

    // Month Difference
    endMonth := end.Month()
    if borrowed == true {
        if endMonth == time.January {
            endMonth = time.December
        } else {
            endMonth--
        }
        borrowed = false
    }
    if endMonth >= start.Month() {
        diff.months = int(endMonth) - int(start.Month())
    } else {
        diff.months = int(endMonth) + 12 - int(start.Month())
        borrowed = true
    }

    // Year difference
    if borrowed {
        diff.years = end.Year() - 1 - start.Year()
    } else {
        diff.years = end.Year() - start.Year()
    }

    // Output
    if diff.years < 0 || diff.months < 0 || diff.days < 0 {
        fmt.Printf("Error: end date should after start date\n")
    } else {
        fmt.Printf("Difference of %d Years %d Months %d Days\n", diff.years, diff.months, diff.days)
    }
}

Friday, August 24, 2012

用golang生成key不是大写的json数据

前一段时间用go写了一个查看perforce的history的小程序,go没有什么成熟的ui包,所以我选用web界面,程序本身做两件事情,一个后台更新perforce的history到本地的sqlite数据库,另外一个后台当作web服务器,处理client的request,生成json数据。

在写这个程序的时候,发现要生成json数据的结构里field名字首字母要大写。因为是一个自己用的小程序,也没有去深究到底可不可以生成首字母是小写的json数据。今天逛stackoverflow的时候看到有人问这个问题,看了看,原来go的json包有解决办法,只是自己看文档的时候没有怎么注意罢了。要加tag来做这件事情。

下面这段示例代码就的output:

{"field_a":1234,"field_b":"hello"}

package main

import "fmt"
import "encoding/json"

func main() {
    type Test struct {
        A int `json:"field_a"`
        B string `json:"field_b"`
    }
    A := Test{1234, "hello"}

    b, _ := json.Marshal(A)
    fmt.Println(string(b))
}

Thursday, August 23, 2012

个人第一个github项目

今天终于在github上有了一个真正的自己的项目,虽然是一个很简单,很小的项目,不过还是值得纪念一下。

项目地址: https://github.com/yongzhy/goploticus

这个是libploticus的Go语言封装。

ploticus的主页

A free, GPL, non-interactive software package for producing plots, charts, and graphics from data. It was developed in a Unix/C environment and runs onvarious Unix, Linux, and win32 systems. ploticus is good for automated or just-in-time graph generation, handles date and time data nicely, and has basic statistical capabilities. It allows significant user control over colors, styles, options and details. Ploticus is a mature package, available since 1999, and version 2.40 has more than 12,000 downloads to date. Ploticus was discussed in this 2008 review on Linux.com.

因为是第一次封装C的API,折腾了一阵子才发现要让cgo编译代码,import “C” 必须是单独一行.

可以编辑的代码:

  1. //#cgo LDFLAGS: -lploticus

  2. //#include <libploticus.h>

  3. //#include <stdlib.h>

  4. import "C"

不可以被编辑的代码:

  1. //#cgo LDFLAGS: -lploticus

  2. //#include <libploticus.h>

  3. //#include <stdlib.h>

  4. import (

  5. "C"

  6. )

什么东西,都要试了才真正知道。

Friday, August 10, 2012

TextMate开源了

Mac下面无比NB的文件编辑器TextMate开源了,代码已经放在github上了。
因为TextMate只支持Mac,曾经让我这个只有Linux和Windows的用户无比羡慕。在羡慕加嫉妒TextMate用户的时候,我发现了Sublime Text 2,这个也是一个强大的编辑器,很容易上手,也很容易定制。因为TextMate作者长时间没有更新,Sublime Text 2已经慢慢的蚕食了很多TextMate的市场。
现在TextMate开源了,希望有高手可以赶快移植到Linux,Windows上,我们选择编辑器的时候就又多了一个选择。

Thursday, June 14, 2012

开始用 GitHub


现在免费的代码托管最出名的非Github莫属,但是我一直没有用Github,原因是因为Github没有免费的Private Repo。我之前一直是使用bitbucket的服务,可以有无限的私有Repo。最近因为学习目的,要fork一个Repo来看看,就开始使用Github。

Github有很详细的说明,我这里只是记录下来不让自己忘。
在做下面步骤之前,一定是要先安装git的。

$ git config --global user.name "myname"
$ git config --global user.email "myname@T420_Win"

make the git cache username and password for 1 hour (default is 15 mins), so you
don't need to type username and password everytime talk to remote server.

$ git config --global credential.helper 'cache --timeout=3600'

fork a repo

clone the forked repo
$ git clone git@github.com:username/Spoon-Knife.git

$ cd Spoon-Knife

Assigns the original repo to a remote called "upstream"
$ git remote add upstream git://github.com/octocat/Spoon-Knife.git

Pull the changes not present in your local repository, without modify your files
$ git fetch upstream

Pushes commits to your remote repo stored on GitHub
$ git push origin master

Fetches any new changes from the original repo and Merges any changes fetched into your working files
$ git fetch upstream

$ git merge upstream/master

Wednesday, June 13, 2012

在VirtualBox里面安装Plan 9

因为在学习Go,看到Go历史追溯到Plan9,就心血来潮要试着安装一个玩一玩。
下载plan9.iso。在VirtualBox里面创建一个新的VM,2G的IDE硬盘就够了,我给分配了512M的内存。把iso当中第二个IDE,然后从CD启动。

安装步骤蛮简单的,按照提示一步一步的安装,基本上就是一路点【Enter】键。在选择安装到哪个硬盘的时候,要手动输入。

安装完,把ISO从VM里面去掉,然后重启。

提示重那里启动 root is from ... : (按回车键)


提示用户名,输入glenda
user[none]: glenda
等待一阵子,就会看到rio图形界面了。

Plan9默认的图形分辨率太低,可以自己更改配置调高。


在图形界面上按住右键,选“new”
按住右键拉一个窗口
在窗口里面输入:

9fat:
sam /n/9fat/plan9.ini

在窗口里面按住右键,选“plan9.ini"
修改下面两行
monitor=xga
vgasize=640x480x8

替换内容
monitor=vesa
vgasize=1024x768x24

按住右键,选”write“
右键点击刚刚编辑的地方
按住右键,选”close“,再点右键
输入”q回车“退出

然后重启VM,就可以看到比较大的显示了。


下面的文档是plan9的一个入门文档,介绍了plan9下面一些常用软件和操作。
http://www.quanstro.net/newbie-guide.pdf

Tuesday, June 12, 2012

Golang conditional compilation

In C language, we use #if, #else, #endif for conditional compilation.

For Go, the conditional compilation can be achieved by include different files in certain build configuration.

At begin of source file, put // +build XXX then followed by a blank line.

main1.go
// +build main1

package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 1")
}
main2.go
// +build main2

package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 2")
}
when running "go build", I still got compile error
$ go build -tags 'main1'

Saturday, June 2, 2012

Setup emacs + gocode for golang editing with auto completion


from Go Source repository http://code.google.com/p/go/source/browse/misc/emacs/
download go-mode-load.el and go-mode.el, put both file into ~/.emacs.d

edit ~/.emacs to add
(add-to-list 'load-path "~/.emacs.d" t)
(require 'go-mode-load)

Go to ~/.emacs.d to compile go-mode.el
$emacs -batch -f batch-byte-compile go-mode.el

Install Autocomplete for emacs from http://cx4a.org/software/auto-complete/
Follow the user manual for instllation.

Copy emacs/go-autocomplete.el file from the gocode source distribution to ~/.emacs.d

edit ~/.emacs to add
(require 'go-autocomplete)
(require 'auto-complete-config)

Install gocode
$go get github.com/nsf/gocode
$go install github.com/nsf/gocode

All instllation is done. To test of gocode auto completion
$gocode -s 

then run emacs with a go file, test and enjoy it.

Setup Sublime Text 2 + gocode for GoLang coding on Ubuntu 12.04


Step to setup on Ubuntu 12.04


Install Golang
$sudo apt-get install golang


Install gocode and dependency packages
$ sudo go get github.com/nsf/gocode
$ sudo go install github.com/nsf/gocode
$ sudo go get github.com/DisposaBoy/MarGo
$ sudo go install github.com/DisposaBoy/MarGo

add /usr/lib/go/bin to your $PATH by edit ~/.bashrc
export PATH=$PATH:/usr/lib/go/bin

Install Sublime Text 2 from http://http://www.sublimetext.com/2
$ tar vxjf Sublime Text 2 Build 2181 x64.tar.bz2
$ sudo mv Sublime\ Text\ 2 /opt/sublime2
$ sudo sudo ln -s /opt/sublime2/sublime_text /usr/bin/subl

Installation for Sublime Text 2 OK. Can run using symbol link "subl"
$ subl  &

Install Package Control for Sublime Text 2.
press Ctrl + ` to view the python consol, paste following line

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

Reset Sublime Text 2

Ctrl + Shift + P, then select "Package Control: Install Package", type "gosublime" and install

Reset Sublime Text 2, now you have a very nice go editor. Enjoy it.

Friday, June 1, 2012

读书 Learning Go

Learning Go - a free E-Book for learning the Go language, 这个是一本不错的Go语言入门的书,免费的,书本身是用Latex写的,放在github上( https://github.com/miekg/gobook ), 也可以直接下载PDF版本(http://miek.nl/files/go/),中文翻译版本(http://www.mikespook.com/learning-go/

昨晚10点多开始读,刚刚读完,没有做里面的练习题,算是对Go有了一个初步也比较全面的了解,感觉Go设计的的确很不错,毕竟是大牛们经过了好多年思考的结果。语法简介,清晰,功能强大。以后工作中如果要写一些小工具,可以考虑用Go来代替Python。

Thursday, May 31, 2012

Lubuntu 12.04 安装 Go

在网上看到一篇介绍Go的文章,颇为心动,对于我这种现在主要用C和Python的人好像蛮值得一学。于是开始着手在我新安装的Lubuntu 12.04里面安装Go。

$ apt-cache search go | grep ^go
发现源里面竟然已经有了golang,于是直接apt-get install golang来安装, 这个命令会安装go的源代码和程序。

安装完,按照网上的文档,在.bashrc里面设置环境变量, 然后用8g,8l测试了一个hello world。不过后来发现根本不用设置这些变量,因为新版的go在/usr/bin/里面有一个go的命令,这个命令本身就可以做各种各样的事情。

要运行程序 go run test.go
要编译程序 go build test.go

Go现在终于到了1.0版,以后应该慢慢变流行吧,毕竟是Google请的几个超级大牛写的。以后有空就学习Go吧!!!

Wednesday, September 7, 2011

(ZZ)简明 Vim 练级攻略

点击查看原文

vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。下面的文章翻译自《Learn Vim Progressively》,我觉得这是给新手最好的VIM的升级教程了,没有列举所有的命令,只是列举了那些最有用的命令。非常不错。

——————————正文开始——————————

你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法。

Vim the Six Billion Dollar editor

Better, Stronger, Faster.

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

我建议下面这四个步骤:

  1. 存活
  2. 感觉良好
  3. 觉得更好,更强,更快
  4. 使用VIM的超能力

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

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

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

第一级 – 存活

  1. 安装 vim
  2. 启动 vim
  3. 什么也别干!请先阅读

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

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

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

  • i → Insert 模式,按 ESC 回到 Normal 模式.
  • x → 删当前光标所在的一个字符。
  • :wq → 存盘 + 退出 (:w 存盘, :q 退出)   (陈皓注::w 后可以跟文件名)
  • dd → 删除当前行,并把删除的行存到剪贴板里
  • p → 粘贴剪贴板

推荐:

  • hjkl (强例推荐使用其移动光标,但不必需) →你也可以使用光标键 (←↓↑→). 注: j 就像下箭头。
  • :help <command> → 显示相关命令的帮助。你也可以就输入 :help 而不跟命令。(陈皓注:退出帮助需要输入:q)

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

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

标记:

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

第二级 – 感觉良好

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

  1. 各种插入模式
    • a → 在光标后插入
    • o → 在当前行后插入一个新行
    • O → 在当前行前插入一个新行
    • cw → 替换光标所在位置的一个单词
  2. 简单的移动光标
    • 0 → 数字零,到行头
    • ^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
    • $ → 到本行行尾
    • g_ → 到本行最后一个不是blank字符的位置。
    • /pattern → 搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)
  3. 拷贝/粘贴 (陈皓注:下面的P应该不分大小写)
    • P → 粘贴
    • yy → 拷贝当前行当行于 ddP
  4. Undo/Redo
    • u → undo
    • <C-r> → redo
  5. 打开/保存/退出/改变文件(Buffer)
    • :e <path/to/file> → 打开一个文件
    • :w → 存盘
    • :saveas <path/to/file> → 另存为 <path/to/file>
    • :x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
    • :q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
    • :bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)

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

第三级 – 更好,更强,更快

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

更好

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

  1. . → (小数点) 可以重复上一次的命令
  2. N<command> → 重复某个命令N次

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

  • 2dd → 删除2行
  • 3p → 粘贴文本3次
  • 100idesu [ESC] → 会写下 “desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu “
  • . → 重复上一个命令—— 100 “desu “.
  • 3. → 重复 3 次 “desu” (注意:不是 300,你看,VIM多聪明啊).
更强

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

  1. NG → 到第 N 行 (陈皓注:注意命令中的G是大写的,另我一般使用 : N 到第N行,如 :137 到第137行)
  2. gg → 到第一行。(陈皓注:相当于1G,或 :1)
  3. G → 到最后一行。
  4. 按单词移动:
    1. w → 到下一个单词的开头。
    2. e → 到下一个单词的结尾。

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

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

    Word moves example

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

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

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

更快

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

<start position><command><end position>

例如 0y$ 命令意味着:

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

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

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

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

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

第四级 – Vim 超能力

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

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

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

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

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

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

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

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

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

Text objects selection

块操作: <C-v>

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

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

Rectangular blocks

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

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

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

Completion

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

示例

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

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

Macros

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

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

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

Autoindent

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

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

Append to many lines

分屏: :split 和 vsplit.

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

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

Split

结束语

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

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

——————————正文结束——————————

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

(全文完)

Friday, September 2, 2011

(ZZ)Sublime Text 2 入门及技巧

 用了sublime text 2有一段时间了,很喜欢这个小软件,从Pre Alpha用到现在Beta版本,一直处于试用版本状态,作者也很用心的一直在改进这个软件。现在缺失的我比较想要的功能是function list,ctags支持。8月31号的时候这个软件又有了更新,加入了基本的vim模式(超赞),看到下面这个文章,写的不错,就转过来。
=====================================================================
看了 Nettuts+ 对 Sublime Text 2 的介绍,立刻就兴奋了,诚如作者 Jeffrey Way 所说:“《永远的毁灭公爵》都发布了,TextMate 2 还没发”,你还能指望它么?TextMate 开发者的消极态度已经无法让人忍受了。而作为一款跨 OS X、Linux 和 Windows 三大系统平台的文字编辑器,Sublime Text 2 功能日进,大有取 TextMate 而代之的势头,
以下就将 Nettuts+ 的这篇文章做一粗略翻译,固然不是面面俱到,用做入门却是足够了。以下均是以 Mac 版本为主,但对 Windows 和 Linux 版来说也是相通的。

内容列表
换个耐看点些的图标
尝试开发版本
快捷的命令面板
即时的文件切换
多重选择(Multi-Selection)
缩进指示(Indent Guide)
安装包控制(Package Control)
对齐
Vim 模式
无干扰模式(Distraction Free Mode)
TextMate Bundle
主题
总结

换个耐看点些的图标

Sublime Text 2 目前还处于测试阶段,默认的黑方块图标看起来实在不够养眼,Nate Beaty 制作了一个不错的替代品
Sublime Text 2
Mac 下的替换方法:
  • 在 应用程序 目录中找到 Sublime Text 2,按住 Ctrl 并点击之,在弹出的菜单中选择“显示包内容”。
  • 进入 Contents/Resources/ 目录,用新下载的图标替换 Sublime Text 2.icns

尝试开发版本

Sublime Text 2 目前更新十分活跃,如果想要尝试最新的功能,建议下载并安装 dev 版本。
下载 Sublime Text 2 Dev 版

快捷的命令面板

Command Pallete
和 TextMate 类似,Sublime Text 2 也提供了很方便的命令调用方式:Command Palette(命令面板)。调用方法:直接在 Tool 菜单中选择Command Palette,或是用快捷键:Shift + Command + P,输入命令名称(中的字母)就可以实时搜索到相应的命令、选项、snippet 和 syntex, 按下回车就可以直接执行,减少了查找的麻烦。

即时的文件切换

File Switch
按下 Command + P(Mac) 或是 Ctrl + P(Windows),输入想要切换到的文件的文件名,都不用按下回车键,目标文件就已经展现在眼前了,虽然 Vim 配合 PeepOpen 也可以实现同样的功能,但速度却远没有这么迅速。

多重选择(Multi-Selection)

多重选择功能允许在页面中同时存在多个光标,让很多本来需要正则表达式、高级搜索和替换才能完成的任务也变得游刃有余了。看看 Nettut+ 提供的实例可能更为直观一些:
激活多重选择的方法有两种:
  • 按住 Command 或 Alt,然后在页面中希望中现光标的位置点击。
  • 选择数行文本,然后按下 Shift + Command + L

缩进指示(Indent Guide)

缩进指示这个小功能可以让代码的层级关系更加清晰,在 Sublime Text 2 中,可以通过一个插件来实现这个功能。
Intent Guide
安装方法:
  • 下载 IndentGuides 插件。
  • 解压后,将文件夹重命名为 Indent Guides,并放入 Packages 目录中。找到 Packages 目录的简单方法是在 Sublime Text 2 的 Preferences 菜单中选择 Browse Packages
  • 重启 Sublime Text 2

安装包控制(Package Control)

上一条中的安装插件的方法是不是很麻烦呢?其实和 TextMate 可安装 Bundle、Plugin 一样,Sublime Text 2 也拥有良好的扩展功能,这就是安装包(Package);同样,就像 TextMate 有用来安装、升级、卸载 Bundle 的 GetBundles 一样,Sublime Text 2 也有其用来进行 Package 控制的插件:Sublime Package Control。通过 Sublime Package Control,安装、升级和卸载 Package 也变得轻松写意了。
安装 Package Control 的方法:
  • 打开 Sublime Text 2,按下 Control + ` 调出 Console
  • 将以下代码粘贴进命令行中并回车:
    import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
    
    
    Console
  • 重启 Sublime Text 2,如果在 Preferences -> Package Settings中见到Package Control这一项,就说明安装成功了。
使用 Package Control 安装 Package 的方法将在后面用到的地方详述。

对齐

对于某些喜欢整齐的码农来说,看到下面这种情况可能是让其无法忍受的:
var joe = 'joe';
var johnny = 'johnny';
var quaid = 'quaid';

一定要改成这样才会安心:
var joe    = 'joe';
var johnny = 'johnny';
var quaid  = 'quaid';

TextMate 里也有这样的功能(Option + Command + ])可以自动实现以上的对齐过程,而在 Sublime Text 2 之中,一个 Sublime Alignment 插件也可以轻松实现。
以下就通过 Package Control 来安装这个插件:
  1. 按下 Shift + Command + P 调出命令面板。
  2. 输入 install 调出 Package Control: Install Package 选项,按下回车。
    Install
  3. 在列表中找到 Alignment,按下回车进行安装。
    alignment
  4. 重启 Sublime Text 2 使之生效。现在通过选中文本并按下 Shift + Command + A 就可以进行对齐操作了。
通过这个方法就可以简便的安装更多的插件,虽然目前的安装源中插件并不是很多,但相信以后会更加丰富的。

Vim 模式

是的,Sublime Text 2 dev 版已经支持 Vim 的编辑模式了,如果更喜欢 Vim 的编辑模式,可以通过以下方法来激活 Vintage mode:
  1. 按下 Shift + Command + P 调出命令面板。
  2. 输入 user global setting 调出 Preferences:User Global Settings,并按下回车。
  3. 这时会打开一个 Global.sublime-settings 的文件,如果是第一次修改,它应该是个空文件,把以下文本粘贴进去:
    {
    "ignored_packages": []
    }
    
    
  4. 保存这个文件,这时按下 ESC 键,再按下一些你熟悉的 Vim 命令,是不是很有亲切感?

无干扰模式(Distraction Free Mode)

现在的编辑器如果没有一个无干扰模式似乎都说不过去了,在 Sublime Text 2 中,只要按下 Control + Shift + Command + F 或是在菜单 View 中选择Enter Distraction Free Mode 就可以进入这个 UI 最小化模式了。如果是在用 Mac OS X Lion 的话,Sublime Text 2 还同时支持 Lion 的原生全屏模式。

TextMate Bundle

Sublime Text 2 很给力的一点就是它同时支持一些 TextMate 的 Bundle。
Sublime Text 2 对于 TextMate Bundle 中的 Snippet 有着良好的原生支持,把 Bundle 放到 Packages 目录里就能用。但对 Bundle 中的 command 并不支持,此外,TextMate 的色彩主题 1 也是可以放到 Packages 目录里直接用的。估计随着 Sublime Text 2 越来越火,会有更多 TextMate 的 Bundle 被移植过来。

主题

这里所讲的主题不同于针对代码的 Color Scheme,是指针对 Sublime 程序本身的主题,目前可以安装的是 Ian Hill 的 Soda
因为源中已经添加,所以这款主题的安装同样可以通过 Package Control,非常方便。目前 Soda 主题提供了明暗两种风格。
激活方法,同样要修改 User Global Settings:
  1. 按下 Shift + Command + P 调出命令面板。
  2. 输入 user global setting 调出 Preferences:User Global Settings,并按下回车。
    theme
  3. 添加以下代码激活 Soda Light 主题:
    {
    "theme": "Soda Light.sublime-theme"
    }
    
    
    添加以下代码激活 Soda Dark 主题:
    {
    "theme": "Soda Dark.sublime-theme"
    }
    
    
  4. 保存生效。

总结

在试用 Sublime Text 2 的过程中,“”和“”是给 Lucifr 最强烈的感受,就如同 Chrome 浏览器一样,Sublime 的各种操作都给人以很流畅的感受。良好的中文支持也是 TextMate 所不具备的,虽然以目前的插件数量和质量还不能完全替代 TextMate,但还是让人十分期待的。唯一让人纠结的是价格,$59 的注册价确实不便宜(明显是照着 TextMate 的 $58 加一块定的嘛),好在目前测试阶段还可以无限试用。