vim–additional features

vim-额外特性

重复命令

clip_image002

l  @@:重复上一个执行宏;

l  n以相同的方向重复上一个搜索命令;

l  N:以相反的方向重复上一个搜索命令;

l  . :重复上一个编辑命令;

l  @:重复上一个命令行

撤销和重做

clip_image003

l  u:可以撤销上次的操作;

l  Nu:可以撤销前N次的操作;

l  U:撤销当前行的所有修改;

l  :red或者CTRL+R:可以撤销还原;

打开光标下的文件

clip_image004

l  gf :在光标位于一个文件名上时,如果该文件就在当前目录,就可以打开该文件,但是会覆盖原来的文件;

l  CTRL+W f:可以打开一个新的窗口;

l  CTRL+W gf:可以打开一个新的窗口,此时会以tab的方式打开;

 

当然,就算没有绝对路径,vim也可以打开一些文件,比如c头文件和perl模块。

打开多个文件

使用vim file1 file2 file3….可以打开多个文件,但是同一时刻只能显示一个文件。

在一个session中,还可以使用:e anotherFile打开另一个文件。

在多个文件中,可以使用CTRL+^来切换,或者使用:next :previous来切换。

文件加密

Hacking for password

vim中使用:X然后输入密码就可是设置每次打开文件都要输入设置的密码,同时可以使用:set key=来取消密码。

保存会话

clip_image006

如果在编辑当前文件的时候,想编辑另外一个文件,可以使用:mksession来保存当前对话,等回来的时候,重新使用vim –S Session.vim即可打开原来保存的会话,这个会话会保存buffer、窗口大小、自定义选项、文件夹、当前目录等。

vim中执行shell命令

使用方式为:!cmd即可。

比如在修改源码的时候,我比较喜欢使用:!date这样就可以快速注释修改的时间了。

Linux学习之道

Linux学习之道

http://www.linuxdiyf.com 看的。

做为中国人的特殊情况,学习linux对中国人来说要做的事情相对多了一些:

1、以linux为荣耀,以帮助他人了解和学习linux为己任

2坚持访问英文网站,尤其是一些大师的个人主页。坚持阅读英文文档,并尽量翻译你读过的文档发表到国内的社区上供他人阅读和整理

3、了解unix的历史,linux的历史和hacker历史及文化

4、尽可能联系所以可以联系到Linux的爱好者,尽可能多的了解你能接触到的最了解linux的人linux的看法。并于自己的观点相比较。

5、空闲时思索为什么自己喜欢linux,别人为什么喜欢linux。为什么你们喜欢的理由不同?

6阅读各类的开源许可协议和商业的用户许可协议。对比他们各有哪些问题和优势。

以上使你了解开源文化,是作为一个合格的linux社区成员的前提。

7安装一个linux的发行版本

8、尽你最大的能力把你的学习、娱乐或者工作的环境转移到linux上来。尽量避免寻找linux功能类似的软件,而是寻找linux下解决同样问题的通用的方法。并且对比同windows下的解决方法哪种更加优越。

9学会SHELL编程SHELL几乎可以作为一个入门语言来学习。最低的要求是能够看懂你自己的版本的linux的配置脚本。理解为什么一些帖子中里提到的配置方法回起作用,并了解你的发行版本怎样从每个配置文件中把设置用环境变量的形式读取并让他生效的。

10学会安装以各种方式发行的程序,并且让他们的安装同你系统的惯例一致。熟悉X windows的运作方式。熟悉你的发行版本的安全机制,并且学会定制他们按你的需求工作。

如果仅仅是作为用户并且部分体会unix的哲学,上面的几点就足够了。个人认为这几点足够成长为一个合格的Linux用户了。甚至只要再稍稍的扩充就可以制作自己的发行版本了!而对于不同的用户群体,比如办公用户或者科研人员等。第8条意味着不同的标准。

11、选择一门或几门语言社区常用的编程语言

12、搜集社区或者hackers推荐的图书或资料、网站、新闻组等。

13、选择一个较小的用你当前学习的语言开发的开源项目。阅读他的代码,并且对比他的代码和你形象的编写方式是否相同?哪种更加优越?

14、尝试按照TODO中的要求为这个软件编写代码,并且同他的作者联系。学习autoconfautomake等工具的用法。

15、你也可以不参与项目的开发,但仍然能从代码阅读中获益。如果项目是一种你没有接触到的技术或者标准的实现,那么搜集资料读懂它!

16学会使用linux下的调试工具,如果软件还不太稳定,可以帮助找出BUG并且改正。并且学会制作patch发给作者。

17、如果曾是windows的程序员,尝试把开发环境转移到linux下来。或者开始在windows的开发工作中使用开源的开发工具和SDK

18、如果是系统管理员,还要学会在linux部署更强的各类的安全方案。但这已经不属于学习linux的范畴了。

上面介绍了几条学习的要求,主要强调的是学习的态度。至于具体什么样的技术和自己应该在技术层次上的要求,按照上面介绍的方法应该会慢慢的体会到。

脚本控制

脚本控制

13.1 处理信号

13.1.1 Linux信号回顾

       可以使用kill –l查看Linux的信号集。

clip_image002

13.1.2 生成信号

       平时我们使用的CTRL+C就为发送了SIGINT信号;而CTRL+Z为生成了SIGTSTP信号,停止进程而不终止进程,停止进城后程序仍然爱留在内存中,能够从停止的地方继续运行。

13.1.3 捕获信号

       可以使用trap commands signals来捕获信号并拦截,如果脚本收到在trap命令中列出的信号,它将保护该信号不被shell处理。

       例如

       trap “echo haha” SIGINT SIGTERM,在该shell遇到两个信号时只是打印出haha而不会终止程序。

13.1.4 捕获脚本退出

       与上述相同,比如trap “echo haha” EXIT就会捕获退出信号,就算是CTRL+C也会捕获该信号。

13.1.5 移除捕获

       可以使用trap – signal来溢出捕获,但是如果在移除捕获之前收到了信号,脚本仍将根据trap命令处理该信号。

13.2 以后台模式运行脚本

13.2.1 以后台模式运行

       命令后添加&即可后台运行。

13.2.3 退出终端

       需要注意的是,运行后台进程的终端如果关闭的话,所有的后台进程也将退出。

13.3 在不使用控制台的情况下运行脚本

$nohup ./testshell &

nohup命令运行另一个命令阻塞发送到进程的任何SIGHUP信号,这可以防止在退出终端会话时退出进程。

13.4 作业控制

       重启、停止、终止和恢复作业的操作称为作业控制job control

13.4.1 查看作业

       命令jobs输出的信息中带有加号+的作业被视为默认作业,带有减号的作业是在处理完当前默认作业之后将称为默认作业的作业。在某一个时间点,无论shell中运行了多少作业,只能有一个带有加号+的作业,也只能有一个带有减号的作业。

13.4.2 重新启动停止的作业

       以后台模式启动bg n,以前台模式启动fg n,其中n为作业的编号。

13.5 变得更好

       默认情况下,从shell启动的所有进程在Linux系统上的调度优先级scheduling priority都相同,为0。调度优先级的范围为从-20(最高优先级)到20(最低优先级)。

13.5.1 nice命令

       nice命令可以在启动命令时设置它的调度优先级。不过只能让命令在更低的优先级下运行,而不能调高优先级。这是一个安全特性,防止用户以高优先级启动所有命令。

       格式为 : nice –n N command

13.5.2 renice命令

       格式为renice N –p PID ,其中N为想调至的优先级参数。

       命令renice可以指定运行进程的PID以更改优先级。与nice命令一样,renice命令也有几个限制:

 

l  只能对拥有的进程使用renice命令;

l  只能使用renice命令将进程调制更低的优先级;

l  跟用户可以使用renice命令敬爱那个任何进程调至任何优先级。

13.6 准确无误地运行

13.6.1 使用at命令调度作业

       at命令运行指定Linux系统运行脚本的时间。at命令将作业提交到一个队列,并指示shell在何时运行该作业。另一个命令atd以后台模式运行,并检查作业队列以运行作业。

       atd命令检查系统上的特殊目录,通常是/var/spool/at,以便运行使用at命令提交的作业。

       at命令的格式很简单:

       at [-f filename] time :其中filename为希望执行的脚本文件,time为希望运行的时间。其中time的方式可以发挥你的创造性了。

       使用at命令时,作业将提交到作业队列job queue中,有26中不同的作业队列可用于不同的优先级水平。使用小写字母az引用作业队列。

       默认情况下,所有的at作业都提交到作业队列a,即最高的优先级队列。如果希望以较低的优先级运行作业,可以使用-q参数指定字母。

       默认情况下,at作业完成后,不会再显示器显示任何内容,但是系统将生成一个电子邮件信息。

       使用atq命令可以查看系统中排队的作业。

       可以使用atrm N命令移除排队的作业,其中N为作业编号。

13.6.2 使用batch命令

       命令batchat稍有不同,batch命令的作用不是安排脚本在预设的时间运行,而是安排脚本在系统使用率低时运行

       如果Linux系统正处于高负载水平,batch命令将延迟提交作业的运行,直到系统负载减低为止。这对于服务器是个良好的特性,因为服务器在白天和夜晚的负载水平可能大不相同。batch会检查Linux系统当前的平均负载水平,如果平均负载低于0.8,它将运行在作业队列中的作业。

       batch命令的格式与at类似:

       batch [-f filename] [time]

13.6.3 调度定期脚本

       Linux系统中的cron程序可以调度需要定期运行的饿作业,cron程序在后台运行,它从特殊表格(cron表格)中查找需要调度运行的作业。

       cron表格的格式如下:

min hour dayofmonth month dayofweek command

       可以使用crontab –l查看现有的cron表格。

       对于cron存在的问题是,如果系统处于关闭状态,作业将无法执行。而anacron程序使用时间戳确定调度的作业是够在正确的时间间隔运行,如果确实错过了该作业的调度运行时间,它将尽快自动运行改作业。这意味着,如果Linux系统关闭了好几天,当它再次开启时,任何计划在系统关闭器件运行的作业都将自动运行。

       anacron表格的格式稍微不同于cron表格的格式:

period delay identifier command

13.7 从头开始

13.7.1 在启动时启动脚本

       可以写入rc脚本中,随系统一起启动。

13.7.2 随新shell一起启动

       写入.bashrc或者.bash_profile中,随着打开shell时启动。

 

创建函数

创建函数

14.1 基本脚本函数

       函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。

14.1.1 创建函数                    

       格式为:

function name

{

       commands

}

或者为:

name()

{

       commands

}

14.2 返回值

       bash shell将函数看作小型脚本,并以退出状态结束。

14.2.1 默认退出状态

       默认情况下,函数的退出状态时函数的最后一条命令返回的退出状态。这是一种比较危险的做法,因为大部分情况下,我们不会再脚本的最后编写函数。而其他语句如果正常执行的话,就不会有提示信息了。

14.2.2 使用return命令

       return命令可以使用单个整数值来定义函数的退出状态,不过要注意两个错误:

l  记住在函数完成后尽快提取返回值;

l  记住退出状态的取值范围为0~255

14.2.3 使用函数输出

       例如一个函数为test,那么可以使用result=`test`来获取任意类型的返回值。

14.3 在函数中使用变量

       默认情况下,脚本中定义的变量都是全局变量,在函数外部定义的变量,在函数内部仍能正常访问。

       在变量前面加上local就能确保变量为局部变量。

14.5 函数递归

       自给(self-containment)是局部函数变量的一个特性。自给函数除了脚本通过命令行传递的变量,不适用函数之外的任何资源。

       这种特性使函数能够以递归方式调用。

14.6 创建库

       在当前文件夹创建一个库,testlib,那么我们在脚本中只需要source ./testlib或者用点好. ./testlib即可导入该库。

14.7 在命令行中使用函数

14.7.1 在命令行创建函数

       如果是一行命令,注意每条命令的结尾必须包含分号,这样shell才知道命令在那里分开;如果是多行命令,则不需要在每条命令的结尾添加分号,只需要按下ENTER键即可。

       注意,如果命令行中创建的函数与内置命令或其他命令同名,那么自定义函数将覆盖原有命令。

 

可选的Linux shell

可选的Linux shell

20 ash shell

Ash shell是一种低预算的shell,体型较小,提供基本特性。尤其适合低内存应用,例如嵌入式Linux系统。

       Dash shellDebian Linux发型的ash shell,及Debian ash shell的缩写。

       对于Ubuntu这里需要注意,Ubuntu Linux使用bash shell作为默认的交互式shell,但是使用dash shell作为默认的/bin/sh shell。这个特性很容易让shell编程人员感到混乱,甚至是有时脚本无法运行。

       我们一般编写脚本的时候通常使用#!/bin/sh,但是由上面可以知道ubuntu会把这个指向dash,所以还是谢忱#!/bin/bash吧,这样比较保险。

21 tcsh shell

Linux世界中另一种流行的shellC shellC shell是将C编程语言中的特性合并到shell脚本中,最流行的开源C shelltcsh shell

       C shell的目的是提供一个适合C编程人员的命令行和脚本编写环境。

       20世纪70年代后期Ken GreerC shell进行扩展,添加了TENEX操作系统的命令行编程特性,这就是tcsh的由来

       tcsh shell环境变量可能有点混淆、Bourne shell及其派生的bashashdash都只是使用一种环境变量来存储系统信息。而tcsh shell包含两种环境变量:

l  shell变量;

l  系统环境变量;

系统环境变量由大写字母组成,提供标准系统信息。Tcsh shell变量是小写变量,对shell具有特殊含义。

       对于shell变量,可以使用set命令设置shell变量值。或者@也可以。

22 Korn shell

Korn shellUnix世界中很流行,但是在Linux世界中并不同样流行。Korn shell提供了Bourne shellc shell世界的混合特性。

       原始Korn shellDavid Korn20世纪80年代在AT&T贝尔实验室工作期间开发的。

       Korn shell分两种不同的路线:

l  Ksh88

l  Ksh93

大多数实现使用的是ksh93 shell

Ksh93 shell的一个很棒的特性是可以轻松的使用数学运算。

执行数学运算的方法有两种;

l  let命令;

l  双圆括号;

对于许多编程人员来说,ksh93 shell的卖点就是它对浮点数的完全支持

23 zsh shell

       Zsh shell提供一些神奇的特性,并将shell未来发展的门槛提高到相当高的高度。

       ZshPaul Falstad开发的开源Unix Shell。它是集合了Bournebashashtcshshell的特性,这句话很NB呀,并加入了许多特有的特性,以编程人员使用为目的而创建的一种成熟的高级shell

       其中一些特性使得zsh独具特色:

l  改良的shell选项控制;

l  Shell兼容性的模式;

l  可载入模块

在这些特色中,可载入模块在shell设计中思想最先进。

zsh shell提供一个核心内置命令集,还提供添加附加命令模块(command modules)的功能。

       Zsh是目前自定义功能最强的shell

       可以使用zmodload命令添加ash的模块,如果不加任何参数,可以显示zsh中的模块。

       要删除一个模块可以使用-u参数,例如zmodload –u zsh/net/tcp就可以删除tcp模块了。