Unix & Linux笔记(13)

第22章 vi文本编辑器


22.1 vi重要的原因

kedit gedit Pico Nano

POSIX / Single Unix Specification


22.2 vi历史简介

ed em en ex vi


22.3 Vim:vi的备用编辑器


22.4 启动vi

^G
显示文件名称

22.5 启动Vim:vim

vim -C [ -rR ] [ file… ]

    -C compatibility mode

22.6 命令模式和输入模式

编辑缓冲区
editing buffer

Ctrl Shift Return Esc

命令模式
command mode
输入模式
input mode

22.7 了解所处模式的方式

:set showmode

22.8 以只读方式启动vi:viewvi –R

-R Read-only

22.9 系统失败后的数据恢复

vi -r test.c
   -r recover

交换文件 swap file .test.c.swp

编辑完成后删除交换文件。


22.10 停止vi

!字符有时候用来表示忽略某些类型的检查。


22.11 vi使用屏幕的方式

插入控制字符 ^V,后面跟希望输入的控制字符

制表符(8个空格) ^I


22.12 使用viex命令

vi命令
单字母或双字母,无需return键:w,dd
ex命令
以冒号开头,按<Esc>彻底取消命令,特殊键纠正命令
作用
<Backspace><Delete> 删除键入的最后一个字符
^W 删除键入的最后一个单词
^X/^U 删除整行

22.13 学习vi命令的策略

  • 移动光标的命令
  • 进行输入模式的命令
  • 进行修改的命令

22.14 创建一个练习文件


22.15 移动光标

- 将光标移动到上一行的开头

+/<Return> 将光标移动到下一行的开头

0 当前行的开头

$ 当前行的末尾

^ 当前行的第一个非空格/制表符的字符上

w 下一个单词词首

e 下一个单词词尾

b 上一个单词词首

大写忽略标点符号

) ——> 下一个句子

( <—— 上一个句子

} 下一个段落

{ 上一个段落

句子
的定义是一个字符串,以句号、逗号、问号或者感叹号结尾,后面至少跟两个空格或者一个新行字符。
段落
的定义为一个空白行开头并以一个空白行结束的一块文本区域。在行首放一个制表符来标志一个新段落是不够的。

22.16 在编辑缓冲区中移动

^F forward

^B backward

^D down 向下移动半屏

^U up 向上移动半屏

n ^D/D 设置跳转行数


22.17 跳转到前一位置

连续键入两个反引号 返回前一位置
连续键入两个单引号返回前一位置的行首

以不可见的名称标记任意行

键入m,后面跟一个字母,该字母就是这一行的名称。跳转到这一行可以键入一个反引号或一个单引号,后面跟这一行的名称。


22.18 搜索模式

:/ :? n N

使用正则表达式

元字符 含义
. 匹配除新行字符之外的任意单个字符(相当于
^ 锚:匹配行的开头
$ 锚:匹配行的末尾
\< 锚:匹配单词的开头
\> 锚:匹配单词的末尾
[list] 字符类:匹配list中的任何字符
[^list] 字符类:匹配不在list中的任何字符
\ 引用:从字面上解析元字符
/M . .
/M[a-z][a-z]
/H[a-z]*y

22.19 使用行号

nG 跳转到第nvi

1G 跳转到第1vi

gg 跳转到第1vi

G 跳转到最后一行 vi

:n 跳转到第nex

:1 跳转到第1ex

:$跳转到最后一行 ex


22.20 插入文本

都改变到输入模式:

i = insert a = append

i 光标位置之前

a 光标位置之后

I 当前行开头

A 当前行末尾

o 当前行下面

O 当前行上面

特殊键依然可以使用,不必离开输入模式。

^V^H 控制字符只算一个字符。


22.21 修改文本

r 精确修改一个字符(不进入输入模式)

R 改写,键入的每一个字符都覆盖当前行上的一个字符 R替换文本时,vi不会离开当前行,字符超过行尾,只是在这一行的末尾追加额外的字符

s 使用多个字符替换一个字符(**substitute)

C 替换从当前光标到行末的所有字符(change

cc 替换一整行

S 替换一整行

cmove 以插入方式从当前光标替换到move所给出的位置


22.22 替换文本(ex

命令 作用
:s/pattern/replace/ 都是ex命令,substitute
:s/UNIX/Linux 替换当前行上该模式的第一个匹配项
:s/UNIX/Linux/gc g=global, c=confirm
:sUNIX//g 删除模式
:57s/UNIX/Linux/ 替换特定行
:57,63s/UNIX/Linux/ 替换指定范围的行
:.,$s/UNIX/Linux .代表当前行,$代表最后一行
:%s/UNIX/Linux/cg %代表所有行

22.23 删除文本

vi命令:

`x`         删除光标处的字符
`X`         删除光标左边的字符
`D`         删除光标到行末的字符
`dmove`     删除光标到`move`所给位置处的字符
`dd`        删除当前行

dc类似

ex命令:

:lined 删除指定行

:line,lined 删除指定范围的行


22.24 撤销或重复改变

u 撤销上一命令对编辑缓冲区的修改

U 恢复当前行

. 重复上一命令对编辑缓冲区的修改


22.25 恢复删除

编号缓冲区
number buffer(只存储删除的行)

vi中一共有9个这样的缓冲区,分别编号为19。将一个编号缓冲区中的内容插入到编辑缓冲区中,键入一个”(双引号),后面跟着一个pPput,与o类似)命令。

"1p "2p "1pu.u.u.u.u

在撤消了第一次插入之后,如果使用.(点号)命令重复插入,那么vi将自动地将缓冲区编号加1


22.26 移动文本

无名缓冲区
unnamed buffer

p 无名缓冲区的内容插入到光标的右边

P 无名缓冲区的内容插入到光标的左边

xp 调换两个字符

deep 调换两个单词(光标开始处于第一个单词的左边)

ddp 调换两行


22.27 复制文本

  1. 使用yyyY命令将文本由编辑缓冲区复制到无名缓冲区;
  2. 将光标移动到希望插入文本的位置;
  3. 使用pP执行插入。

在不删除文本的情况下将文本复制到无名缓冲区时,称之为接出(yank)了文本。

符号 作用
yw 接出了1个单词
y10w 接出了10个单词
y10W 接出了10个单词(忽略标点符号)
yb 接出了1个单词
y2( 接出了2个句子
y5} 接出了5个段落
yy 接出1
10yy 接出10
y0 接出了从当前字符到这一行开头之间的文本
y$ 接出了从当前字符到这一行末尾之间的文本

Y = yy yd类似,yydd类似,YD完全不同。


22.28 改变字母的大小写

~命令改变字母的大小写,然后光标向右移动一个位置。(大范围内连续使用~时安全的)

对于有些vi来说,~命令不会越过一行的末尾。我的vim –C就是如此。


22.29 设置选项

第一种类型的选项是开关(switch:set showmode noshowmode

第二种类型的选项是变量(variable:set tabstop=4

开关 缩写 默认值 含义
autoindent ai off 和shift width有关,缩进以匹配上一行/下一行
autowrite aw off 如果文本已经修改,则在切换文件前保存
errorbells eb off 当现实错误消息时发出嘀嘀声
exec ex off 在当前目录中查找初始化文件
ignorecase ic off 在搜索过程中忽略大小写
list — off 将制表符显示为 ^I,将行的结束显示为$
number nu off 显示行号
readonly ro off 不允许修改编辑缓冲区的内容
showmatch sm off 输入模式:显示匹配的(){}[]
shownmode smd off 当进入输入模式时显示一个提醒
wrapscan ws off 在搜索过程中,环绕到文本的开头/ 末尾继续搜索
writeany wa off 允许不需要重载!就可以写入任何文件
变量 缩写 默认值 含义
lines - 24 文本的行数
shiftwidth sw 8 autoindent使用的空格数
tabstop ts `8 制表符间距
wrapmargin wm 0 设置自动换行时的页边距

22.30 显示选项

:set [ option [?]… | all ]

显示所有选项的值 :set all

显示一个选项的值 :set number?

显示改变了默认值的选项 :set (读取初始化文件改变)


22.31 在键入过程中自动换行

:set wrapmargin=?
:set wm=?

22.32 分隔与连接行

将光标移到单词后的空格处,然后键入r<Return>r命令使用新行字符取代空格,从而将行分隔。

将光标移动到第一行,并键入J(大写字母J)将把当前行与下一行合并成一个长行,可以在J命令之前放置一个重复次数。


22.33 复制与移动行(ex

在所有的ex命令中,.(点号)代表当前行,$代表编辑缓冲区中的最后一行,0代表编辑缓冲区的开头。

:x [ , y ] co z
:x [ , y ] m z

在命令名称前面指定一个单独的行号或一个行号范围,这就是要移动的或复制的行。在命令名称之后,可以指定目标行号,新行将插入到目标行的下面。

:5co10 复制第5行到第10行下面
:4,8m20 移动第4至第8行插入到第20行的下面

交换缓冲区的上下两部分

:1 , . m $ : . , $ m 0

22.34 输入shell命令

`:!command`         暂停`vi`,执行`shell`命令
`:!!`               暂停`vi`,执行最近一条命令
`:sh`               暂停`vi`,启动默认`shell`
`:!bash`            暂停`vi`,启动`bash`
`:!tcsh`            暂停`vi`,启动`tcsh`

22.35 将文件中的数据插入到编辑缓冲区中

:[ line ] r file
: r 命令读取文件的内容,并将该内容插入到编辑缓冲区中指定行之后。
:10 r info
:0 r info
:$ r info

如果省略了行号,vi将把数据插入到当前行之后。


22.36 将shell命令的输出插入到编辑缓冲区

:r有一种特别有用的变体。如果在:r命令之后不是键入文件的名称,而是键入一份!(感叹号),后面跟一个程序的名称,那么vi将执行该程序,并将程序的输出输入插入到编辑缓冲区中。

:r !ls
:0r !date
:line r file        在指定行后面插入文件file的内容
:r file             在当前行后插入文件file的内容
:line r !program    在指定行后插入程序program的输出
:r !program         在当前行后插入程序program的输出

22.37 使用程序处理数据:fmt

使用!!!命令将把编辑缓冲区中的行发送给另一个程序,该程序的输出将替换原始行。

n!!program 在n个行上执行程序program
!move program 从当前行至move行执行程序program

将光标移到到希望处理的开始位置,键入希望处理的行数,后面跟!!(两个感叹号)以及程序的名称,再后跟<Return>键。

5!!sort 10!!fmt

!(单感叹号)命令的工作方式与此相似,只是在!命令在指定输入行的范围时更具有灵活性。

!}fmt

格式化整个编辑缓冲区

gg
!Gfmt

22.38 将数据写入文件

ex命令w,允许在不退出vi的情况下,不时地备份数据。

`:w`            将数据写入原始文
`:w file`       将数据写入到一个新文件中
`:w! file`      覆盖一个已有的文件
`:w>>file`      将数据追加到指定的文件中

只保存编辑缓冲区中的特定行,则可以采用通常的方法指定行号。例如,为了将第10行写入到文件save中(替换save的内容),可以输入:

:10w! save

为了将第10行至第20行追加到save中,可以使用:

:10,20w>>save
:wq == <Shift>+ZZ` 

22.39 切换到一个新文件

当开始编辑一个新文件时,编辑缓冲区中的原有内容将会丢失,所以要确保首先使用:w命令将数据保存。

`:e file`           编辑指定的文件
`:e!`               重新编辑当前文件,忽略自动检查
`:e! file`          编辑指定的文件,忽略自动检查

22.40 使用缩写

为经常使用的单词或表达式创建缩写,使用:ababbreviate,缩写)命令。

:ab [ sort long ]
:ab eg exception gifted

只有eg是一个单词的时候才会进行替换,vi不会替换其他单词中的eg,例如egotistical

删除缩写:unaun-abbreviate,反缩写)

:un short

通过输入:ab命令本身查看所有的缩写列表。


22.41 宏(macro

允许创建自己的单字符命令,这些命令称之为宏(macro)。(宏就是微型程序。)

:map [ x commands ]

x是一个字符,commandsviex命令序列。

:map命令可以创建宏,即viex命令序列的缩写。宏名称必须是单个字符。如果选择早已拥有含义的字符作为命令,那么原有含义将会丢失。

例如:map K deep :map X dd

存在命令覆盖问题。

vi:比较适合作为宏名称的字符

| 字母 | g K q v V Z|

|标点符号 | @ # * \|

|Ctrl字符 | ^A ^K ^O ^W ^X|

Vim:比较适合作为宏名称的字符

|字母 | K q v V|

|标点符号 | @ \|

|Ctrl字符| ^@ ^A ^K ^O ^T ^X|

例:

:map * I/*^V<Esc>A*/^V<Esc>

I在行头进入输入模式。然后键入/*,后面跟一个空格。此时,按<Esc>退出输入模式。为了在宏中插入一个<Esc>码,我们键入^V<Esc>^V[Ctrl

+

V]告诉vi接下来的键要从字面上解释)。Aappend,追加)命令在行的末尾进入输入模式。然后键入一个空格,后面跟着*/。退出输入模式,再次使用<Esc>

将宏赋给<F1><F10>的功能键。

:map #1 :set all

显示所有的宏列表:

:map

移除宏:

:unmap x x是宏的名称

22.42 初始化文件:.exrc.vimrc

vi .exrc dot-E-X-R-C

vim .vimrc dot-vim-R-C

rc run commands

vi/Vim初始化文件样本

"==================================================
"  Simple vi/Vim initialization file
"==================================================
"
"1.Option
set autoindent
set compatible
set showmatch
set showmode
set wrapmargin=6
"
"2.Abbreviations
ab eg exceptionally gifted
ab h   Harley
"3.Maxros
map  K  deep
map  X  dd
map  g  1G
map  #5 {!}fmt^M
"4.shell commands
!date;sleep 2

22.43 使用两个初始化文件

一旦启动,vi即在/home中查找初始化文件,执行初始化文件中的命令后,vi将查看exec选项。如果选项是打开的,vi即在当前目录中查找第二个初始化文件。


22.44 学习使用Vim

vimtutor

时间: 2024-11-05 10:09:17

Unix & Linux笔记(13)的相关文章

linux笔记13

主从DNS同步 当单一DNS无法满足客户需求是开启一个同步的次级DNS,他们dns的内容一致. 主机: vim /etc/named.rfc1912.zones zone "asd.com" IN { type master; file "asd.com.zone"; allow-update { none; }; allow-transfer { 172.25.254.225; };        从机地址 }; systemctl restart named 从

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1.Unix shell的功能 shell是一个管理进程和运行程序的程序.所有常用的shell都有3个主要功能: (1)运行程序: (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言. 2.Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行.在Unix术语中,一个可执行程序是一些机器指令机器数据的序列.一个进程是程序运行时的内存空间和设

系统调用操作文件——《Unix/Linux编程实践教程》读书笔记

1.who命令通过读系统日志的内容显示当前已经登录的用户. 2.Unix系统把数据存放在文件中,可以通过以下系统调用操作文件: open(filename, how) creat(filename, mode) read(fd, buffer, amt) write(fd, buffer, amt) lseek(fd, distance, base) close(fd) 3.进程对文件的读/写都要通过文件描述符,文件描述符表示文件和进程之间的连接. 4.每次系统调用都会导致用户模式和内核模式的切

终端控制和和信号——《Unix/Linux编程实践教程》读书笔记(第6章)

1.有些程序处理从特定设备来的数据.这些与特定设备相关的程序必须控制与设备的连接.Unix系统中最常见的设备是终端. 2.终端驱动程序有很多设置.各个设置的特定值决定了终端驱动程序的模式.为用户编写的程序通常需要设置终端驱动程序为特定的模式. 3.键盘输入分为3类,终端驱动程序对这些输入做不同的处理.大多数建代表常规数据,它们从驱动程序传输到程序.有些键调用驱动程序中的编辑函数.如果按下删除键,驱动程序将前一个字符从它的行缓冲中删除,并将命令发送到终端屏幕,使之从显示器中删除字符.最后,有些键调

目录与文件属性——《Unix/Linux编程实践教程》读书笔记

1.ls产生一个文件名的列表,它大致是这样工作的: open directory +-> read entry - end of dir? -+ |__ display file info | close directory <--------------+ 2.目录是一种特殊的文件,它的内容是文件和目录的名字.与普通文件不同的是,目录文件永远不会空,每个目录至少包含2个特殊的项,即 "."和"..",其中 "."不是当前目录,&qu

c/c++unix/linux基础学习笔记-常用命令和vi的使用

linux 基本命令的使用-命令在ubuntu下面执行,有些命令通用其他linux,有些不通用. 多条命令间用;号隔开,回车后可以一起执行. clear-前屏,pwd显示当前目录,cd跳转目录. sudo [命令]  -ubuntu 下以管理员身份运行命令. 一般情况下,运行当前目录下的程序,要用 ./文件名 执行. 查看当前shell名称:ps 进入另外一个shell,直接输入shell名称:ksh/tcsh/sh/bash,退出一个shell用:exit. 切换shell命令,如:exec

事件驱动编程——《Unix/Linux编程实践教程》读书笔记(第7章)

1.curses库 /* 基本curses函数 */ initscr(); // 初始化curses库和tty endwin(); // 关闭curses并重置tty refresh(); // 使屏幕按照你的意图显示 move(r, c); // 移动光标到屏幕的(r, c)位置 addstr(s); // 在当前位置画字符串s addch(c); // 在当前位置画字符c clear(); // 清屏 standout(); // 启动standout模式(一般使屏幕反色) standend

I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)

1.I/O重定向的概念与原因 及 标准输入.输出的标准错误的定义 所以的Unix I/O重定向都基于标准数据流的原理.三个数据了分别如下: 1)标准输入--需要处理的数据流 2)标准输出--结果数据流 3)标准错误输出--错误消息流 概念:所以的Unix工具都使用文件描述符0.1和2.标准输入文件的描述符是0,标准输出的文件描述符是1,而标准错误输出的文件描述符则是2.Unix假设文件描述符0.1.2已经被打开,可以分别进行读写操作. 通常通过shell命令行运行Unix系统工具时,stdin.

【笔记整理】unix/linux的进程管理(一)

Unix/Linux 下的进程管理 1. 进程与程序 ~~~~~~~~~~~~~ 1) 进程就是运行中的程序.一个运行着的程序, 可能有多个进程.进程在操作系统中执行特定的任务. 2) 程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体. 进程或者任务是处于活动状态的计算机程序. 2. 进程的分类 ~~~~~~~~~~~~~ 1) 进程一般分为交互进程.批处理进程和守护进程三类. 2) 守护进程总是活跃的,一般是后台运行. 守护进程一般是由系统在开机时通过脚本自动激活启动, 或者由超级用户