搜档网
当前位置:搜档网 › 学习vi和vim编辑器第七版

学习vi和vim编辑器第七版

学习vi和vim编辑器第七版
学习vi和vim编辑器第七版

学习v i和v i m编辑器第

七版

The following text is amended on 12 November 2020.

前言

文本编辑是电脑系统最普通的操作任务之一,而vi编辑器是系统上最有效的标准文本编辑器之一。通过vi编辑器你可以创建新的文件或是编辑任何已有的纯文本文件。

Vi编辑器如同很多在Unix早期阶段开发的应用程序一样,有着不易使用的名声。Bram Molenaar的克隆加强版,vim(Vi Improved)已经走了很长的一段路来消除这样的印象。Vim包含了很多的便利功能,如直观的指示、帮助页面等。它可能已经成为一种最流行的vi编辑器版本,所以本书的第七版为此专门在第二部分辟出七个新单元,并命名为vim。当然,还有很多其它有价值的vi克隆版本同样存在,我们在第三部分选取了它们中的三个,并命名为other vi in clones。

本书的范围

本书包括的18个单元和4个附录被分成了四个部分。第一部分,vi的基础与进阶,是为了让你快速入手vi,并且后面的高级技巧会让你vi用的更加得心应手。

最初的两个单元,单元1,vi文本编辑器,和单元2,简单的编辑,介绍了一些你可以入门的简单vi命令。你应当不断练习直到这些命令成为你的第二天性。你可以在第2单元后停止阅读,在已经学习了一些基础的编辑工具后。

但是vi意味着干很多又不仅仅是和基本词汇有关的过程;各种各样的命令和选项能使你应对很多编辑的苦差事时更加简便。第3单元,Moving Around in a Hurry,和第4单元beyond the basis,专注于用更简单的方法去完成目标。在你第1次阅读期间,你至少会了解到vi能做什么和你可以利用什么命令来完成你特定的需求。后来,你可以回过来再看这些单元做更深一步的学习。

第5单元,介绍ex编辑器,第6单元,全局替换,和第7单元高级编辑,提供工具帮助你转移更多的编辑重担到电脑上。这几单元向你介绍基于vi的ex line编辑器,这几单元还向你展示了如何分配ex命令通过vi。

第8单元,vi克隆版本的介绍,

材料如何体现

我们的基本思想是给你们一些我们觉得对新用户有用的vi知识的概述。学习一个新的编辑器,尤其是

Vi命令的讨论

一个键盘按钮的图片。

约定

第一部分

Vi编辑器的基础与进阶

第1部分是

第一单元

Vi文本编辑器Unix有很多可以改进文本内容的编辑器

一个简洁的历史观点

在钻研vi的来龙去脉之前,它会帮助你理解你工作平台上的vi的理念。尤其,这会帮助你搞很多清楚vi各样更多的隐蔽的错误信息,同样可以体会vi的克隆版在原始vi基础上如何进步。

Vi的数据会回来当用户在终端上工作通过串行线连接到中央微型计算机。在全世界有成百上千不同类型的终端存在并被使用。每一种都做着相同的事情(清屏,移动光标等等),但是那些被用来让它们执行的命令却是不同的。另外,unix系统让你自己选择字符用作退格,产生一个中断信号,或是其它有用的命令在串行终端上,例如暂停和恢复输出。这些设备以前是(现在仍然是)管理着设备终端。

原始的通用字符缓冲器版本的vi摘录终端控制信息

打开和关闭文件

你可以用vi编辑任何文本文件。Vi复制需要编辑的文件到缓冲区中(一个在储存器中临时储存数据的地方),显示缓冲区的内容(虽然你同时只能看到一屏幕的东西),然后让你增加,删除,和更改文本。当你储存你编辑好的东西,vi复制编辑好的缓存区的内容回到外存贮器,覆盖相同名字的旧文件。要记住你一直在复制了你的文件的缓冲区上工作,你的编辑将不会影响你的原始文件直到你储存缓冲区。储存你的编辑文件也叫做“写入缓冲区”,或更普通“写入你的文件”。

打开文件

Vi是用来启动vi编辑器来打开一个已存在的文件或是一个全新的文件的unix命令。Vi命令的语法是:

$vi【文件名】

括号在如上的命令行中显示出文件名是可选择的。括号不可以被打出来。$符号是unix的提示。如果文件名被忽略,vi编辑器将打开一个没有名字的缓冲区。你可以指定名字当将缓冲区写入文件。就现在,不过,还是让我们坚持在命令行给文件起名。文件名在它的目录下必须是独一无二的。一个文件名可以包括任何8-bit的字符除了斜线号(/),这个符号是保留用来在路径名中分离文件名和目录名的,空字符,零bit的字符。你甚至可以在文件名中包括空格通过打反斜杠号在空格之前。实际上,不过,文件名通常包含各种组合的大小写字母,数字,点号(.),和下划线(_)。记住unix系统是区分大小写:小写字母和大写字母是区分的。也要记住你必须按ENTER去告诉unix你已经输入完你的命令。

当你在目录下想打开一个新文件是,在文件名前加上vi命令。例如,如果你想打开一个新文件叫practice在当前目录下,你需要输入:

$vi practice

既然这是一个新文件,缓冲区是空的,屏幕显示如下:

~

~

~

"practice"[new file]

波浪线(~)递降排列在屏幕左边显示出在文件中没有内容,甚至不空行。在底部的提示行(也叫状态行)显示文件名和文件状态。

你也能编辑在目录下任何存在的文本文件只要通过指定文件名。如果有unix文件有这样的路径/home/john/letter。如果你已经在/home/john目录下,用相对路径。例如:

$vi letter

将文件letter副本复制到屏幕。

如果你在另一个目录,要给出完全路径才能开始编辑:

$vi /home/john/letter

打开文件的问题

·当你调用vi是,信息[open mode]出现。

你的终端类型可能没有被正确的识别。快速退出编辑模式通过输入:q。检查环境变量$TERM。它应当符合你的终端名。或者去告诉你的系统管理员提供准确的终端类型设置。

·你看见如下信息之一:

Visual needs addressable cursor or upline capability

Bad termcap entry

Termcap entry too long

Terminal:Unknown terminal type

Block device required

Not a typewriter

你的终端类型要么没有定义,要么terminfo和termcap进入方面可能有一些问题。输入:q退出。检查你的$TERM环境变量,或者告诉你的系统管理员为你的环境选择一个终端类型。

·[new file]信息出现当你觉得这个文件早已存在。

检查一下你在文件名是否用对了大小写(unix的文件名是区分大小写的)。如果你没有错,你可能在错误的目录下。输入:q退出。然后检查文件是否在正确的目录下(在unix提示下输入pwd)。如果你在正确的目录下,检查在这目录下的文件列表(通过ls)是否有存在文件名相近的名字。

·你调用vi,但是你却得到冒号提示(显示你在ex行编辑模式)。

你可能在输入了什么东西在vi刷屏前。进入vi通过输入vi在ex提示(:)下。·如下之一的信息出现:

[Read only]

File is read only

Permission denied

“Read only”表明你只能查看文件;你不能保存你的修改。你可能调用了vi的查看模式(按了view或是vi -R),或者你对此文件没有权限。看一下在第10页标题为“保存文件的问题”的内容。

·如下之一的信息出现:

Bad file number

Block special file

Character special file

Directory

Executable

Non-ascii file

File non-ASCII

你要打开编辑的文件不是一个正常的文本文件。输入:q!退出,然后检查你想编辑的文件,可能有文件命令。

·当你输入:q因为前面提到的任一困难出现时,出现如下信息:

No write since last change (:quit! Overrides)

你已经不小心修改了文件。通过输入:q!退出vi。你在对话期间的修改将不会保存在文件中。

做法

正如先前提到的,现在的“模式”的概念是非常重要的对于vi的工作来说。有两种模式,命令模式和插入模式,你起始于命令模式,你的任何键盘敲击都将被看做是命令。在插入模式,你输入的任何东西都将变成你文件中的文本。

有时,你可能不小心进入插入模式,或是相反的,离开插入模式一不小心。不论发生何种情况,你输入的东西将会影响你的文件时是你所不期望。

按ESC键去强制vi进入命令模式。如果你早已进入命令模式,vi编辑器会嘟嘟响提示当你按ESC键时。(因此命令模式此时有时又叫做“嘟嘟响模式”)

一旦你安全的再命令模式中,你就可以动手修复任何突发性的变化,然后继续编辑你的文本。

保存和退出一个文件

你可以退出编辑文件任何时候,保存你的编辑,然后退出到unix的提示界面。Vi编辑器的退出并保存的命令是ZZ。ZZ是大写的。

让我们假定你创建了一个文件叫practice来练习vi命令,你打了六行的内容。为了保存文件,首先检查你在命令模式通过按ESC键,然后按ZZ。

按的键结果

ZZ 结束编辑和保存命令,ZZ。你的文件被保存为正常的unix文件。

Ls

你同样可以用ex命令保存你的编辑。输入:w保存你的文件但是不会退出vi;输入:q 退出如果你没有做任何编辑;输入:wq同时保存你的文件和退出。(:wq和ZZ相等。)我们会在第5章详尽解释如何用ex命令;暂时,你只需要记住一些关于编辑和保存的命令。

退出并不保存编辑

当你第一次学习vi编辑器,尤其如果你是一个无谓的实验者,有两个其它的ex命令可以容易的解除你创造的任何混乱。

如果你想清除所有你在对话框内的编辑然后回到原始文件怎么办如下命令:

:e! ENTER

你就退回到你上一次保存的文件内容,你现在可以重新开始了。

如果,你想清除你的编辑内容并只是退出vi怎们办如下命令:

:q! ENTER

你就退出了编辑而且回到了unix的提示符。这两个命令,你将失去自从你上一次保存到现在所有你编辑在缓冲区的东西。Vi一般不会让你知道扔掉了你的编辑。感叹号加到:e和:q命令后面让vi忽略这个禁止,继续操作即使缓冲区已经被修改。

保存文件的问题

·你尝试写入文件,但是得到如下之一的信息:

File exists

File file exists -use w!

[Existing file]

File is read only

输入:w! file覆盖已存在的文件,或是输入:w newfile保存已编辑的文件到新的文件。

·你想写入文件,但是你没有写入这个文件的权限。你得到信息“Permisson denied”

用:w newfile将缓冲区的内容写出到新的文件,如果你在这个目录下有写入的权限,你可以用mv取代原来版本通过复制这个文件。如果你没有这个目录下写入的权限,输入:w pathname/file 将缓冲区的内容保存到你有权限写入的目录下去(例如你的主目录或是/tmp).

·你尝试写入你的文件,但是你得到信息告诉你文件系统已满。输入:!rm junkfile 去删除(很大)没用的文件释放一些空间。(通过一个感叹号开始ex命令让你使用unix。)

或是输入:!df看一下在其它的文件系统里是否有空间。如果有,在文件系统上选择一个目录,写入你的文件到那目录下:w pathname。(df是unix命令检查一个磁盘上的空闲空间。)

·系统让你处在打开状态然后告诉你文件系统已满。

Vi在磁盘上的临时文件已被存满。输入:!ls /tmp看一下是否有其它文件你可以移走已得到一些磁盘空间。#如果有,建立一个临时的unix shell以移除文件或建立其它的unix命令。你可以建立一个Shell通过输入:sh;输入CTRL-D或exit终止shell 回到vi。(在现在的unix系统上,当使用一个作业控制shell,你可以简单的输入CTRL-Z暂停vi回到unix提示符;输入fg回到vi。)一旦你已经释放一些空间,写入你的文件用:w!。

·你尝试写入你的文件,但是你得到一个信息说你的磁盘配额已经达标。

尝试强行系统保存你缓冲区的内容通过ex命令:pre(:preserve的缩写)。如果没用,找一些文件移除。用:sh(或CTRL-Z如果你正在用作业控制系统)搬离vi和移除文件。用CTRL-D(或fg)回到vi当你已经做完。然后写入你的文件用:w!。

练习

学习vi的唯一方法就是练习。你现在知道了足够的知识去创建新的文件和回到unix 提示符。创建一个文件叫practice,插入一些文本,然后保存并退出文件。

打开一个叫practice的文件在当前目录下: vi practice

插入文本: i am text you like

回到命令模式: ESC

退出vi,保存编辑: ZZ

#你的vi可能保持它的临时文件在/usr/tmp,/var/tmp或你现在的目录;你可能要到处闲逛明确找到是哪里空间用完了。Vim一般保持它的临时文件在你编辑文件的目录下。

第二单元

简单编辑

这一章将介绍用vi编辑,本章是用来当自学教程的。本章我们将学习如何移动光标和如何做一些简单的编辑。如果你从没有用vi工作过,你应该阅读全章。

稍后本章将向你展示如何长进你的技术以更快更好的编辑。对于精于vi的用户来说一个最大的好处就是有很多的选项可供选择。(对于新手来说一个最大的坏处就是vi有太多的复杂编辑命令。)

你不可能学习vi通过学习没一个vi命令。起步通过学习本章介绍的基础命令。记录下常见的命令使用时的图像。

当你学习vi,注意让更多的任务你是可以交给编辑器的,然后找到命令完成它。在接下来的一章你会学到更多vi高级的特征,但是在你掌握高级的之前,你必须先掌握简单的。

这一章包括:

·移动光标

·加入和改变文本

·删除,移动,和复制文本

·更多的方法进入插入模式

Vi命令

Vi有两个模式:命令模式和插入模式。你一进入文件,你就进入命令模式,编辑器就一直等你输入命令。命令能让你移动到文件的任何地方,去编辑,或是进入插入模式和加入新的文本。命令同样可以被用来退出文件(保存或忽视你的编辑)以回到unix 的提示符。

你可以理解为不同的模式代表了两种不同的键盘。在插入模式,你的键盘功能相当于一个打字机。在命令模式,每一个键有一个新的意义或初始一些指令。

有好几种方法告诉vi你想进入插入模式。最常用的方法之一就是按i。i不会出现在屏幕上,但是之后你按的无论你按什么都将会出现在屏幕上也将会存入缓冲区。光标标记现在插入点。*想告诉vi你想停止插入文本,按ESC。按ESC就移动光标回到一个地方(所以那是你最后输入的字符)回到vi的命令模式。

例如,假如你已经打开一个新文件想插入单词“introduction。”如果你输入了iintroduction,在屏幕上显示的是

introduction

当你打开一个新的文件,vi开始于命令模式只要第一个按(i)就打断进入插入模式。之后所有的键盘输入都将被认为是文本输入直到你按ESC。如果你需要修正一个错误然而你却在插入模式,退格并修正错误。基于你在使用的终端类型,退格可能会清除你先前已经输入的或可能只是回退了。在其它的事情中,所有你回退的都将被删除。记住你不能用退格键回退到你进入插入模式的点的前面。(如果你已经禁用了vi 的兼容性,vim允许你用退格回退到你进入到插入模式的点的之前。)

Vi有一个选择让你定义一个正确的页边白和提供自动回车当你到达它的时候。就目前,当你正在插入文本,按ENTER换行。

有时你自己不知道是在插入模式还是在命令模式。无论什么时候vi不会回应如你所期望的,按ESC一两次以检查你在什么模式下。当你听到蜂鸣声,你就在命令模式。

移动光标

你可能用只用一小会的时间在编辑会话加入新的文本在插入模式;很多时候你会很多时间编辑以退出文本。

在插入模式你可以定位光标到文件的任何地方。既然你开始所有基础编辑(改变,删除和复制文本)通过定位光标到你想改变的地方,你想能移动光标到目的地越快越好。

*一些版本在状态行显示你在(input mode)插入模式

有以下vi命令来移动光标:

·上,下,做和右——每一次移动一个字母

·向前或向后一个文本块如一个单词,一个句子,一个段落。

·向前或向后翻过一个文件,一屏幕一次。

在图2-1,一个下划线表示出现在光标的位置。圈圈显示了光标从它现在的位置移动到通过不同的vi命令到的位置。

图2-1,简单的移动命令。

简单的移动

键h,j,k和l,权利在你指尖,将移动光标。

h

左,一个空格

j

下,一行

k

上,一行

l

右,一个空格

你同样可以用光标箭头键(←,↓,↑,→),用+和-上升和下降,或用ENTER和BACKSPACE,但它们不常用。一开始,似乎用字母键替代箭头键移动光标有点麻烦。过了一段时间,然而,你就会发现这将是你最喜欢vi的一点之——你可以移动光标甚至不用将你的手指离开中心键盘区域。

在你移动光标之前,按ESC以确认你已经在命令模式下。用h,j,k和l在文件中从光标现在的位置前后的移动。当你在一个位置已经移动到极限时,你会听一记嘟声然后光标停止了。例如,一旦你在一行的开始或者结尾处,你就不能用h或l回到前一行或下一行;你必须用j或k。+简单说来,就是你不能移动光标超过代表空行的波浪线(~),你也不能移动光标到第一行文本之上。

数值参数

你可以先于移动命令前加入数字。图2-2显示出4l命令如何光标向左移动四个字符,就好像你已经输入l四遍了(llll)。

图2-2,和数字的复合命令

能输入复合命令给你更多的选择和每一个你学的命令更强的功能。把这个记住就如你被介绍了额外的命令。

当你保存文件practice时,vi显示一个信息告诉你有在那个文件里有多少行。行不一定如出现在屏幕上的轮廓线一样有相同长度(一般限制在80个字符)。一行就是任何文本被插入在新行之间(新的一行将被插入进文件当你在插入模式中按ENTER 键。)如果你在按ENTER键之前输入了200个字符,vi认为这200个字符就是一行(即使这些200个字符在屏幕上明显的被分成了好几行)。

正如我们在第一章中提到的,vi有一个选项允许你设置到右边白的距离然后vi会自动换行。这个选项是wrapmargin(它的缩写是wm)。你可以设置一个wrapmargin 10个字符:

:set wm=10

这个命令不会影响你已经输入的行。我们会谈论更多的设置选项在第7章。(这个真的不能等!)

如果你不用vi的自动wrapmargin选项,你应该换行用回车键以保持可控制的行的长度。

+vim,有nocompatible(兼容模式)设置,允许你“跳过空白”行的尾部到下一个用l或空格。

两个在一行中移动的有用的命令:

0(数字零)

移动到行首。

$

移动到行尾。

在如下的例子中,行号被显示出来。(行号可以在vi中被显示出来通过用数字选项,通过在命令模式下输入:set nu开启这个功能。这个操作将在第七章介绍。)

逻辑上的第(3)行并不符合你在屏幕上所看见的第(5)行。如果光标现在在单词word的d上,然后你按$,光标会移动到这一周期最后的单词word。如果你输入0,光标会移回到单词move中的m,第2行的开头。

文本块的移动

你同样可以在文本块间移动光标:单词,句子,段落,等等。w命令光标每一次向前移动一个单词,计数符号和标点符号相当于单词。如下的一行显示出用w命令的光标的移动:

Cursor,delete,lines,insert characters,

你同样可以移动光标通过一个单词,而不包括计数符号和标点符号,用W命令。(你可以把它看做一个“大的”或“大写”的Word。)

光标的移动用W就是这样:

Cursor,delete,lines,insert characters,

一个单词的向后移动,就用b命令。大写的B允许你回移一个单词,不包括计数符号。

正如先前所提到的,移动命令采取数值参数;所以,用无论是w 或 b命令以可以用数字增加移动。2w向前移动两个单词;5B向后移动5个单词,不包括计数符号。

为了移动到专门的一行,你可以用G命令。单个G移动到文件末尾,1G到文件的开头,还有42G则到第42行。这个将会有更多的细节描述在接下来的第43页的一章“G (GO TO)命令”。

图2-3校对编辑

我们将讨论句子和段落的移动在第3章。现在呢,练习使用你所知道的光标移动命令,将它们结合数字乘数。

简单的编辑

当你进入你文件的文本时,它很少是完美的。你找到打字错误或是想改进短语;有时你的程序有一个错误。一旦你进入文本,你就能去改变它,删除它,移动它,或复制它。图2-3显示出你对于这个文件想编辑成的样子。编辑被校对符号标示出来。

在vi编辑器中你可以实现这些编辑通过一些简单的基础的按键:i是插入(你早已经看到过了);a是附加;c是改变;和d是删除。要移动或复制文件你用了很多组命令。你移动文本用d为了“删除”,然后用p为了“放置”;你复制文本用y为了“移出”,然后p为了“放置”。每一种编辑在本节中都会被描述。图2-4显示出你所用的vi命令编辑在图2-3中所做的标记。

插入新的文本

你已经看到在插入模式下向文件中输入新的文本。你同样可以在插入模式下当编辑存在的文本增加遗失的字母,单词和句子。在文件practice,如果你有以下句子:

You can scroll

The page, move the cursor,delete

Line,and insert characters.

图2-4用vi命令编辑

正如光标标示出来的位置。要插入With a screen editor在句子的开头,输入如下:按键结果

2k 用k命令移动光标向上两个,移动到你想要插入的地方

iwith a 按i进入插入模式开始编辑文本

屏幕编辑器

ESC 完成编辑文本,按ESC结束插入模式回到命令模式

附加文本

你可以附加文本在你文件的任何地方只要用附加命令,a。这个工作几乎和i是一个样的,除了文本被插入在光标后而不是光标前。你可能已经意识到当你按i进入插入模式,光标不会移动直到你输入了一些文本之后。相反,当你按a进入插入模式,光标向右移动一个空格。当你输入文本,它出现原始光标位置的后面。

改变文本

你可以替换你文件中的任何文本用修改命令,c。要告诉c多少文本要修改,你可以符合c和移动命令。这种方式,一个移动命令充当成文本对象让c命令去影响。例如,c 可以被用来从光标改变文本:

cw

到单词的末尾

c2b

回到前两个单词

c$

到行的末尾

cO

到行的开头

发表一个修改命令之后,你可以用选中的文本替换任何多的新文本,一个字母没有,一个字母,或成百上千行也行。C,就像i和a一样,让你进入插入模式直到你按ESC 键。

当修改只在本行起效时,vi在文本的末尾用$标记要被修改的东东,所以你可以看到行的什么部分被影响。(再看cw的例子。)

单词

去修改一个单词,结合c命令(修改)与w对付单词。你可以用一个长一点的或短一点的单词(或任何文本)替换一个单词(cw)。cw可以被认为是“标示删除单词和插入新的文本直到ESC被按。”

假如你有如下一行文本在你的文件practice中:

With an editor you can scroll the page,

你想修改an成a screen。你只需要修改一个单词:

按键结果

w 用w移动到你想开始编辑的地方

cw 敲修改单词的命令。文本的末尾将会被标示一个$(英镑符号)

A screen 输入替换的文本,然后按ESC回到命令模式。

cw同样可以用在一个单词的部分上,例如,要修改spelling到 spelled,你可以定位光标到i,输入cw,然后输入ed,用ESC完成操作。

一般vi命令的组成

在修改命令我们也提到到这一点,你可能已经注意到如下形式:

(命令)(文本对象)

命令就是修改命令c,文本对象就是移动命令(你不需要输入括号)。但是c不是唯一一个需要文本对象的命令。d命令(删除)和y命令(拷贝)如同这样的形式一样。

记住移动命令同样可以采取数值参数,所以数字可以被加到文本对象的c,d和y命令。例如,d2w和2dw是删除两个单词的命令。按照这种思路,你可以看到很多vi命令有如下一般形式:

(命令)(数字)(文本对象)

或者等价的形式:

(数字)(命令)(文本对象)

这就是如何工作的。数字和命令是可选择的。没有它们,你只简单的有移动命令。如果你加入一个数字,你有一个复合移动。在另一个方面,复合一个命令(c,d或y)与一个文本对象组成一个编辑命令。

当你意识到有多少复合体以这样一种方式出现,vi就确实变成了一个强大的编辑器!行

要替换当前整个一行,用到特殊修改命令,cc。Cc修改整个一行,用输入无论多少的文本替换这一行直到输入ESC。它不关注光标在这一行的哪里;cc替换整个一行的文本。

一个命令像cw工作与cc这样的命令是不同的。在使用cw,原来的文本保持直到你输入替换它,任何原来的遗留下来的文本(到$)消失当你按ESC。在使用cc,然而,原来文本先被删除,让你在空行插入文本。

“覆盖”发生时的任何修改命令只会影响少于一整行,但是“空行”发生时的任何修改命令会影响到一或更多行。

C替换字母从当前光标的位置到行末。它有相同的功能如复合c与特殊行末标志

$(c$)。

命令cc和C对于其他命令来说是真的很简洁,所以它们和其它vi命令的一般形式是不一样的。你会看到其它快捷键当我们讨论删除和拷贝命令的时候。

字符

一个其它的替换编辑就是r命令。r以一个字符替换另一个字符。你不用按ESC键退回到命令模式当编辑完之后。如下这行中有一个拼写错误:

Pith a screen editor you can scroll the page,

只有一个字母需要改正。你不希望用cw在这个例子中因为那样的话你就需要重打整个单词。用r替换光标所在的一个字母:

按键结果

rW 输入替换命令r,接着输入要替换的字母W。

替换文本

假如你想修改只是一些字母,不是整个单词。替换命令(s),它本身,替换一个字母。与前面的计数,你可以替换许多字符。正如修改命令(c),文本的最后一个字符将会被标记上一个$所以你可以看到多少文本将被修改。

S命令,通常情况下是大写的,让你修改整个一行。相对比C命令,修改从当前光标开始行剩余的部分,S命令删除整个一行,无论光标在哪。Vi让你在行首进插入模式。前面的计数替换许多行。

S和s命令都让你进入插入模式;当你结束输入新的文本,按ESC。

R命令,就像他的小写的副本,替换文本。不同的是R简单的进入重击模式。你输入的字母替换了屏幕上显示的,字母替换字母,直到你输入ESC。你可以一行最多一个;当你输入ENTER,vi将开新的一行,高效的让你进入插入模式。

修改大小写

修改字母的大小写是一项特殊的替换工作。波浪(~)命令会修改一个小写字母成一个大写字母或一个大写字母成小写。定位你的光标到你想改变大小的字母下,然后输入一个~。这个字母的大小写将会修改。光标将会移动到下一个字母。

在老的vi版本中,你不能指定一个数字前缀或文本对象用~去起作用。现在的版本允许数字前缀。

如果你想同时修改多于一行的大小写,你必须筛选文本通过unix命令如tr,将在第7单元描述。

删除文本

你同样可以删除你文件中任何文本用删除命令,d。想修改命令,删除命令要求一个文本对象(一部分要修改的文本)。你可以删除单词(dw),行(dd或D),或用其它移动命令我们以后会学到。

所有这些删除,你要移动到你想开始编辑的地方,给出用删除命令(d)和文本对象,如w代表单词。

单词

假如你有如下的文本段:

Screen editors are are very popular,

Since they allowed you to make

Change as you read though file.

光标正如显示的。你想删除在第一行的一个are:

按键结果

2w 移动光标到你想开始编辑的地方(are)

dw 给出删除单词命令(dw)去删除单词are

dw删除光标标记开头的这个单词。注意单词后面的空格也被删除了。

dw同样可以被用来删除单词的一部分。在这个例子中:

Since they allowed you to make

你想删除allowed结尾的ed。

按键结果

dw 给出删除命令(dw)去删除单词,开始于光标所在的位置。dw一直删除在这一行中下一个单词前的空格,但是我们不想这么干在这个例子中。要保留单词间的空格,用de,只删除一个单词的末尾。输入dE删除单词的末尾,包括标点符号。

你同样可以删除反向(db)或到一行的开头或结尾(d$或d0)

dd命令删除光标所在的整个行。dd不会删除行的一部分。像它的补充,cc,dd是一个特殊的命令。使用在前面的例子中相同的文本,正如所示的光标所在的第一行的位置:

Screen editors are are very popular,

Since they allowed you to make

Change as you read though file.

你可以删除前两行:

按键结果

2dd 给出命令删除前两行(2dd)。注意即使光标没有定位在行的开头,

整个一行还是被删除

D命令删除从光标开始到行末。(D是d$的缩写。)例如,与光标定位所示:Screen editors are are very popular,

Since they allowed you to make

Change as you read though file.

你可以删除行的一部分即从光标往右的部分。

按键结果

D 给出命令删除行的一部分即光标的右边(D)。

字符

通常你只想删除一个或两个字符。正如r是一个特殊的修改命令去替换一个字符,x 是一个特殊的删除命令去删除一个字符。x只删除光标所在的字符。如行所示:zYour can move text by deleting text and them

你可以删除字母z通过按x。一个大写的X删除光标之前的字符。前缀在前面任一命令加上一个数字就是删除字符的个数。例如:5x会删除光标下和右边的五个字符。删除出现的问题

·你已经删除错文本你想恢复到原来。

有好几种方法恢复已删除的文本。如果你刚刚删除什么东西然后你意识到你想恢复,只要简单的输入u取消上一次操作即可(例如,一个dd)。这个只对你还没有给出其它进一步操作时有效,因为u只能取消最近一次操作。或者,一个U会还原行道它原始的状态,这个方法不管前面做过任何次修改都可以使用。

你可以还是回复最近一次删除,然而,用命令p,由于vi保存最近九次删除到九个删除缓存区。如果你知道,例如,第三次删除时你想恢复的,输入:

“3p”

去把缓存区的数字为3的内容放到行光标下。

这只对一个已经删除的行有效。单词,或行的一部分,不被保存进缓存区。如果你想恢复一个已经删除的单词或行的碎片,u就没用了,用p命令自身。这恢复任何你已经删除的。在后来的分段中将讨论更多关于命令u和p。

注意vim支持“无限”取消,使得生活方式更加简便。看一下在296页的“撤销取消”一章以获得更多信息。

x的记忆一般认为像“x光透射”打字机的错误。当然,谁还在用打字机呢

移动文本

在vi,你移动文本通过删除它然后把它移动已删除的文本到文件中的任何地方,像一个“剪切和粘贴”每一次你删除一个文本块,删除的东西一般暂时保存在特殊的缓存区。移动到你的文件中的其它地方用放置命令(p)把文本放到新的地方。你可以移动任何文本块,尽管移动行比移动单词要有用。

放置命令(p)把缓存区的文本放在光标后的地方。大写版本的命令,P,把文本放在文本之前。如果你删除一个或更多的行,p把删除的文本放到新的一行光标之下。如果你删除少于一整行,p把已经删除的文本插入当前行,在光标之后。

假如在你的文件practice中有以下文本:

You can move text by deleting it and then

Like a "cut and paste"

Placing the deleted text elsewhere in the file.

Each time you delete a text block

你想移动第二行,like a"cut and paste",到第三行下。使用删除,你可以做以下编辑:

按键结果

dd 光标在第二行,删除这一行。文本被放进了缓存区(保留记忆)

p 给出粘贴命令,p,恢复已经删除的行到光标下。结束这个句子

的记录,你可能同样需要修改开头的大小写和标点符号(用r)

以适应新的结构。

一旦你删除文本,你必须恢复它在下一次修改命令和删除命令之前。如果你做了其它的编辑影响了缓存区,你已删除的文本将彻底消失。你可以重复粘贴一遍又一遍,只要你不做新的编辑。在第四单元,你会学到如何保存删除的文本进编号的缓存区所以你可以恢复以后。

交换两个字母

你可以用xp(删除字符和粘贴在光标之后)交换两个字母。例如:在单词mvoe中,字母vo被颠倒了。为了更正颠倒,把光标放在v上然后按x,再按p。碰巧,单词transpose帮你记住xp的顺序;x代表trans,p代表pose。

没有命令交换两个单词。在单元“更多的映射键例子”107页中我们将讨论一个简短的命令序列可以交换两个单词。

复制文本

一般你可以保存编辑时间(和按键)通过复制你的文件的一部分用到其他地方。用两个命令y(拷贝)和p(粘贴),你可以复制任何大小的文本然后粘贴被拷贝的文本到文件的其它地方,一个拷贝命令拷贝被选中的文本到一个特殊的缓存区,它将一直被保存到下一个拷贝(或删除)发生。你可以然后放置这些复制的东西在文件中的任何地方用粘贴命令。

正如用修改和删除,拷贝命令可以被用来与任何移动命令联合(yw,y$,4yy)。拷贝命令最频繁的用于一行(或更多)的文本,因为拷贝和粘贴一个单词通常比简单的输入一个单词要花更长的时间。

快捷键yy作用于一整行,就像dd和cc干的那样。但是快捷键Y,由于某种原因操作的方式和D还有C不一样。不是从当前位置复制到行末,而是Y拷贝一整行;这是Y 和yy干着相同的事情。

假如你的practice文件中有如下的文本:

With a screen editor you can

Scroll the page

Move the cursor

Delete lines

你想操作三个完整的句子,开始于With a screen editor you can。不移动文件,作出此编辑一遍又一遍,你可以用一个拷贝命令和粘贴命令去复制要被增加的文本。

按键结果

yy 拷贝你想拷贝进缓存区的行文本。光标可以放到你想拷贝的行

的任何地方(或一系列行的第一行)

2j 移动光标到你想粘贴被拷贝的文本的地方

p 粘贴被拷贝的文本到光标下的一行用命令P。

jp 先移动光标到下一行然后粘贴文本到光标下用命令p

拷贝与删除用相同的缓存区。每一个新的删除和粘贴覆盖前一个拷贝的缓存区的内容。正如我们将在第一单元看见,前九个粘贴或删除可以被再调用粘贴命令。你同样可以拷贝和删除直接进入26个命名的缓存区,允许你第一时间修改各样的文件块。重复和撤消你的最后一个命令

每一个你给出的编辑命令都被存放在一个临时的缓存区直到你给出下一个命令。例如,如果在一个单词后你输入the在你的文件中,命令被用来插入文本,随着你进入的文本,被暂时的保存起来。

重复

每一次你做相同编辑一遍又一遍,你可以保存次数通过复制它用重复命令,点(.)。定位你的光标到你想重复编辑命令的地方,输入点号。

假如你的文件有如下几行:

With a screen editor you can

Scroll the page

With a screen editor you can

Move the cursor

你可以删除一行,然后,删除另外一行,简单的输入一个点号。

按键结果

dd 删除一行用命令dd。

重复删除。

老一点的vi版本在重复命令有问题。例如,如此的版本可能有困难重复一个长的插入当右边距被设定好时。如果你有如此的一个版本,这个漏洞将会迟早伤你。事后对于这个没有什么你是可以做的,但是它会帮助你事先通知。(现在的版本似乎没有这个问题。)有两种方法你可以用来防止潜在的问题当重复长的插入文本。你可以写入你的文件(:w)在重复长的插入文本之前。(回到这个的拷贝如果插入文本工作不正确)。你可以取消右边距的设置像这样:

:set wm=0

在后面的单元“更多的映射键例子”在第107页,我们将展示你一个简单的方法使用右边距。在一些vi版本中,命令CTRL-@重复最近的插入文本。CTRL-@被输入进在插入模式然后回到命令模式。

取消

正如早些提到的,你可以取消最近的命令如果你做错了。简单的按u。光标需要放到原来编辑发生的行。

要继续先前的例子,展示删除行在文件practice中:

按键结果

u u取消了最近一次命令恢复了被删除的行

U,u的大写,取消在但单一行上的所有编辑,只要光标保持在那一行。一旦你离开那一行,你就不能用U。

注意你可以用u取消你的最近一次取消,切换两种文字版本。u同样可以取消U,U会取消一行中任何修改,包括那些用u的工作。

一个技巧:事实上u可以取消它自己使得一个极好的方法去在文件中随意走动。如果你曾想回到你上一次编辑的地方去简单的取消它。你会弹回上一次的一行。当你取消取消时,你就会待在那一行。

Vim让你用CTRL-R去“重干”一个取消操作。配合无限的取消,你可以向后移和向前移通过修改你的文件的历史。看一下单元“取消取消”在第296页以获得更多信息。更多的方法插入文本

你已经在光标前输入以下文字序列:

itext to be inserted ESC

你同样已经在光标后插入文本用a命令。这里有一些其它的插入命令可以插入文本在光标周围不同的位置:

A

附加文本到当前行的末尾

I

插入文本在行的开头

o(小写的字母o)

打开光标下的空行以输入文本

O(大写的字母O)

打开光标上的空行以输入文本

S

删除光标当前字母然后用新的文本替代

S

删除一行以新的文本代替

R

重击存在的字符以新的字符替换

所有这些命令都将让你进入插入模式。插入文本之后,记住要按ESC回到命令模式。A(附加)和I(插入)挽救你免于在调用插入模式之前不得不移动你的光标到行的末尾或行的开头。(A命令让你免于按$a两个键。尽管一个按键看起来没有节省多少,但越熟练越不耐烦一个编辑器你变成,你就想节省更多的按键)。

o和O(开)使你节省不用不得不插入一个回车。你可以输入这些命令在一行中的任何地方。

s和S(替代)允许你删除一个字符或一整行然后替换删除的东西以任何新的文本。s 相当于两个键的命令c SPACE,S相当于命令cc。s最佳的用法之一就是用很多字符修改一个字符。

R(“大”替换)是很有用的当你想开始修改文本,但是你不知道究竟多少。例如,不用再猜测到底是3cw还是4cw,只要输入R然后输入你想替换的文本。

插入模式的数字参数

除了o和O,插入命令只列出了(加上i和a)加上数字前缀。和数字前缀,你可能要用i,I,a和A去插入一排下划线或交替字符。例如,输入50i*ESC插入50个星号,输入25a*-ESC附加50个字符(25对星号和连字符)。这是比较好的一种重复一串单一字符的办法。§

和一个数字前缀,r替换字符数目和一个单个字符重复实例。例如,在c和c++代码中,要修改||成&&,你要移动光标到第一个管符号(|)然后输入2r&。

你可以用一个数字前缀和S去替代好几行。这更快和更加灵活,然而,去用c和一个移动命令。

一个用s和数字前缀好的实例就是当你想修改一些字符在单词中间时。输入r是不正确的,输入cw会修改太多的文本。使用s和数字前缀通常和输入R一样。

有一些其它的命令组合一般工作在一起。例如,ea是有用的对于附加新文本到一个单词后。它帮助你训练自己认识到这些有用的组合所以他们会变得自动的。

连接两行用J

有时当编辑一个文件你非正常结束留下一系列短行非常难看。当你想合并两行成一行,把光标移动到第一行的任何地方,然后按J合并两行。

假如你的文件practice如下:

With a

Screen editor

You can

Scroll the page,move the cursor

按键结果

J J连接光标所在的行和下一行

. 重复最后一个命令(J)用.去连接下一行和当前行。

§非常老的vi版本很难重复超过一行的有价值的文本。

用一个J和一个数字参数连接想要连接的行数。在这里的例子,你可以连接三行用命令3J。

问题清单

·当你输入命令,文字跳跃到屏幕上而且没有发生任何你想让它发生的。

搞清楚你没有输入J命令当你想j时。

你可能不小心干扰到CAPS LOCK键而你没注意到它。Vi是大小写敏感的;那个,大写命令(I,A,J等等)和小写命令(i,a,j)是不同的。如果你干扰到这个键,所有你的命令将被不会解释成小写而是大写命令。再次按CAPS LOCK键回到小写,按ESC 确认你在命令模式下,然后输入U还原最后一行的修改或u取消最后一个命令。你将可能同样不得不做一些附加的编辑以完全恢复你的文件混乱的部分。

基础vi命令的复习

表格2-1列出了一些你可以使用通过组合命令c,d和y与文本对象。最后两排展示对于编辑的附加命令。表格2-2和2-3列出了一些其它的基本命令。表格2-4总结了余下的再本章介绍的命令。

表格2-1 编辑命令

文本对象修改删除复制

一个单词 cw dw yw

两个单词,不包括标点 2cW或c2W 2dW或d2W 2yW 或y2W

前三个单词 3cb或c3b 3db或d3b 3yb 或y3b

一行 cc dd yy 或Y

到行末 c$或C d$或D y$

到行头 c0 d0 y0

单个字符 r x或X yl 或yh

五个字符 5s 5x 5yl

表格2-2 移动

移动命令

←↓↑→ h,j,k,l

当下一行的第一个字符 +

但前一行的第一个字符 -

到单词的末尾 e或E

向前一个单词 w或W

向后一个单词 b或B

到行末 $

到行首 0

表格2-3 其它操作

操作命令

从缓存区粘贴文本 P或p

打开vi,打开文本如果精确 vi 文件名

保存编辑,退出文件 ZZ

不保存编辑,退出文件 :q!

表格2-4 文本创建和操控命令

编辑行为命令

在当前位置插入文本 i

在行首插入文本 I

附加文本在当前位置 a

在行首附加文本 A

在光标下开新的一行 o

在光标上开新的一行 O

删除行并替代文本 S

重击存在的字符代以新字符 R

连接当前和下一行 J

切换大小写 ~

重复上一次操作 .

取消上一次修改 u

相关主题