• vi编辑器的学习使用(十八)


    我们在Vim编辑器的学习使用(二)曾学过一些基本的编辑命令,有了这样的一些基本的编辑命令,我们可以完成绝大多数的编辑任务.在这一次的学习中我们将会接触到更多的更深一些的东西.
    Vim编辑器有着各种不同的命令可以使得我们任意的移到一个单词的开头或是结尾.但是有我们却可以通过Vim的一些选项的内容来自定义一个单词的定义.w命令可以使得光标向前移到一个单词.而命令e也是向前移到一个单词,但是这个命令是将光标定位在一个单词的结尾处.
    而命令ge则是向后移到一个单词到达前一个单词的结尾处.
    那么怎么样来定义一个单词呢?我们也许都知道单词只是一系列的字母的组合.然而在C程序中size56却会被认为是一个单词,因为在C程序中我们是通过字母,数字和下划线来定义一个单词的.但是在LISP程序中我们可以在变量名中使用-,这时他们会认为total-size是一个单词,而在C程序中这却会被认为是两个单词.我们如何来解决这样的冲突呢?Vim的解决办法是产生一个选项来定义哪些是一个单词中的,而哪些不是.例如下面的命令定义了属于一个单词中的字母:
    :set iskeyword=specification
    查看当前选项的值我们可以使用下面的命令:
    :set iskeyword?
    下面的是一般的值:
    iskeyword=@,48-57,_,192_255
    在这些值中间中用逗号来分隔的.
    如果我们想要单词中的字母是专一的元音,我们可以使用下面的命令:
    :set iskeyword=a,e,i,o,u
    我们还可以使用横线来指定字母的范围.如果要指定所有的小写字母,我们可以用下面的命令:
    :set iskeyword=a-z
    对于那些不能直接指定的字符我们可以使用十进制的数字来表示.如果我们要指定小写字母和下划线为一个单词,我们可以使用下面的命令:
    :set iskeyword=a-z,45
    (短横线的十进制数字表示为45)
    字母@指代C函数isalpha()返回值为真是的所有的字符.这个要取决于我们所使用的C编译器和我们编译Vim所使用的操作系统)
    排除某一个字符我们可以在这个字符前加上一个前缀^.例如我们可以使用下面的命令来定义一个单词,这个单词可以由除了q以外的小写字符组成,也就是说在由空格分格的字符串组成,q为一个单词,而其他的字符串的组合为一个单词:
    :set iskeyword=@,^q
    而字符@则是由@-@所指代.
    iskeyword选项一些特殊字符如下:
    a    字符a
    a-z    所有由a到z的字符
    45    十进制数字45(短横线-)
    @    由函数isalpha()所定义的所有字符
    @-@    字符@
    ^x    除了x以外的字符
    ^a-c    除了a以处的到c的字符,即b和c
    命令iskeyword可以简记为isk
    iskeyword选项可以控制哪些字符可以是一个单词而哪些不是.下列的一些相似的命令可以控制其他类型的字符:
    isfname        文件名
    isident        定义
    isprint        打印字符
    选项isfname在使用命令gf时会用到,这个命令将会编辑以光标下的单词为文件名的文件.
    选项isident在使用命令[d时会用到,这个命令将会查找以光标下的单词为名称的宏定义.
    选项isprint定义了哪些字符可以显示在屏幕上.但是对这个我们要小心,如果我们弄错了,屏幕就会被弄得一团糟.这个选项还可以用特定的查找命令/p,这代表可打印的字符.
    也许到了现在我们已经明白了什么是单词(words).而Vim编辑还有一些命令影响到WORDS.虽然这只是大小的不同,但是他们却代到了两种不同的事物.word是指由iskeyword选项定义的字符串,而WORD则是指没有空白符的字符.在这样的观点上,that-all是两个单词(word),但是却是一个WORD.
    W命令是向前移动WORDS,而B命令是向后移动WORDS.
    与WORD相关的一些命令如下:
    [count]B    向后移动count个WORDS
    [count]E    向前移动count个WORDS,并且将光标置于WORD的末尾.
    [count]gE    向后移动count个WORDS,并且将光标置于WORD的末尾.
    [count]W    向前移动count个OWRDS.
    我们可以使用命令将光标移动到一个句子中第一个没有空白符的字符处.如果我们要到达一行的开始处,我们可以命令用0命令.
    我们可以使用命令fx在当前行光标的后面查找字符x.如果我们要重复这个查找操作可以使用命令;.就像大多数的Vim命令一样这个命令可以用数字来指明查找的次数.;命令是按照前一次f或是F的查找方向继续查找.如果我们要向相反的方向查找我们可以使用命令,.
    命令-可以向上移动到第一个没有空白符的前一行处.我们可以指定参数来移到几行.
    命令+可以向下移到到第一个没有空白符的后一行处,我们可以指定参数来移到几行.
    命令_可以移动到当前行第一个没有空白符的字符处.
    还有一些命令可以使得我们在屏幕的不同地方进行移动.H命令可以将光标移到屏幕的顶端.如果指定的数字参数则可以移动到从屏幕顶端算起的由数字所指定的行处.与H命令相类似是L命令,所不同的只是这个命令移动到屏幕的底端.M命令可以将光标移到屏幕的中间位置.
    Vim编辑器还可以记录你曾经到过的地方,并且可以使得我们回到前一次到过的地方.例如我们在编辑一个文件的时候执行了下面的命令从而到过不同的行处:
    1G    到第一行
    10G    到第十行
    20G    第第二十行
    现在我们执行下面的命令:
    :jumps
    这样我们就会看到一个我们曾到过的行数的列表.在这个列表中>指的是这个列表中的当前项.这样在我们处在命令模式下我们就可以使用命令CTRL-O跳回一行.这样>所指的就会上移一项.而命令CTRL-I或是<TAB>可以使得我们在这个列表中向下跳转.应用这样的命令我们就可以实现在文件中进行快速的浏览和跳转.
    在通常的情况下,当光标位于一行的开头是结尾的时候Vim是不可以移动光标的.但是我们可以通过设置whichwrap选项来控制光标是否可以越过一行的结尾并且Vim处于哪种模式.whichwrap选项一些可能的值如下表所示:
    Character    Command        Mode(s)
    b        <BS>        正常模式或是可视模式
    s        <Space>        正常模式或是可视模式
    h        h        正常模式或是可视模式
    l        l        正常模式或是可视模式
    <        左移        正常模式或是可视模式
    >        右移        正常模式或是可视模式
    ~        ~        正常模式
    我们可以通过命令CTRL-G来使用Vim在屏幕的下端显示出我们所在的位置的一些信息.然而只要我们来发问我们就可以得到一些更详细的信息.为了得到更详细的信息,我们可以在CTRL-G命令加上一个数字参数.这个数字越大我们得到的信息就越详细.例如命令1CTRL-G会告诉我们文件的全路径.而命令2CTRL-G会同时显示缓冲区的数字标号.而命令gCTRL-G则可以显示当前光标所在的行号,列号以及文章的字符数等一些详细的信息.
    我们在前面曾讨论过,CTRL-U命令可以使得vim编辑器向上翻滚半屏,但是我们可通过设置scroll选项来控制这个命令翻滚的行数.例如下面的命令可以使得Vim一次翻滚10行:
    :set scroll=10
    我们也可以通过防变CTRL-U命令的参数来改变翻滚的行数.例如命令2CTRL-U可以使得Vim编辑器一次向上翻滚两行,直到有命令来翻滚的大小为止.
    如果我们要一次翻滚一行我们可以使用CTRL-Y命令.当然这个命令也可以在前面设置参数来控制翻滚的行数.而CTRL-B命令则是一次翻滚一屏.
    与向上翻滚的命令相对是向下翻滚的命令,这样的命令有如下的一些:
    CTRL-D    向下翻滚.这个数值我们可以通过scroll的值来控制.
    CTRL-E    一次向下翻滚一行.
    CTRL-F    一次向下翻滚一屏.
    当光标到达窗口的上端或是下端的时候窗口要发生滚动.我们可以通过设置scrolljump选项来控制这个翻滚数值的大小.默认情况下为1,当然了我们也可以将其改我们希望的样子.如下面的命令将翻滚量设为5:
    :set scrolljump=5
    与其相类似的就是sidescroll选项,所不同是后者来控制水平的翻滚.
    通常情况下,窗口的翻滚是当光标到达窗口的顶部或是底部时才发生的,我们也可以通过scrolloff选项来控制光标与顶部或是底部有多少距离时发生:
    :set scrolloff=3
    这个命令将其为3,当光标与顶部距离为三行时发生翻滚,且翻滚后光标与底部相距三行.
    也许我们在编辑文件的过程中有时希望将指定的一行放在屏幕顶端.当然了这样的问题我们可以使用CTRL-E或是CTRL-Y命令来一行一行的移动直支满期足要求为止.我们还可以将光标放在指定的行上,然后输入z<Enter>.我们这一行就会出现在屏幕的顶端了.
    这个命令在没有任何参数的情况是将当前行置于屏幕的顶端,我们还可以指定参数,这样就可以将指定的行置于屏幕顶端了.例如命令8z<Enter>就是将第八行置于屏幕顶端.这个命令不仅可以将指定的行置于顶端,还可以将光标移动到本行第一个没有空白符(non-blank)的字符处.如果我们要将光标保持在一行的某一位置不变我们可以使用命令zt,这样在这一行的位置发生变化,光标的位置也会保持不变.
    如果我们要将指定的一行放在屏幕的底部,我们可以使用命令z-或是zb.所不同的只是前者是将光标放在这一行中第一个没有空白符的字符,而后者是保持光标的位置不变.
    命令zz或是z.可以将指定的行放在屏幕的中部.这两个命令的不同就是前者保持光标的位置不变,而后者是将光标置于第一个没有空白符的字符处.
    D命令可以将光标所在处到这一行的结尾的文字全部删掉.我们也可以在这个命令前面加上数字做为前缀,这样在执行这个命令以后,Vim不仅会将光标到光标所在行结尾处的字符全部删除,而且会再删除这一行以下的count(数字前缀)-1行文本.
    与D命令相类似的是C命令.所不同的仅是C命令在删除文本以后会进入插入模式使得我们可以接着进行文本的编辑.
    s命令可以删除单个的字符并进入插入状态.如果我们在前面加上数字做为前缀,那么Vim就会删除数字所指定的那么多的字符,然后进入插入状态.
    而S命令是删除当前行然后进入插入状态.我们可以指定数字count做为前缀,这样Vim就会删除count个行,然后进入插入状态.这个命令与C命令的不同之处只是S命令作用整个行,而C命令仅是光标所处的位置到行末.
    x命令是删除当前光标下的字符,如果指定count作为参数,则是向右查找count个字符并删除,而X命令是删除当前光标前的一个字行,如果指定count作为参数,则是向左查找count个字符并删除.
    在进入插入模式时我们可以使用i或是I命令.i是在当前光标处开始插入字符,而I则是一行的开头部开始插入字符.(所谓的开头是指第一个没有空白符的字符处).如果我们要在一行中的第一个字符处开始插入我们可以使用gI命令(不论有没有空白符).a命令是在当前光标的后开始插入,而A命令与a命令相类似,只是他是在一行的后面开始插入状态.
    Vim还可以对于文本进行简单的算术运算.命令CTRL-A可以将当前光标下的数字加1,我们还可以在前面指定参数,这样就可以指定的数字加在光标下的数字上了.如果这个数字是以0开头,那么Vim就会认为这是一个八进制的数.例如0177在我们执行这个命令后就会变为0200.如果一个是以0x或是0X开头的Vim就会这是一个十六进制的数,例如0x1E在我们执行这个命令后就会成为0x1F.与CTRL-A命令相类似的是CTRL-X命令.所不同的只是这个命令会使得当前光标下面的数字减1.Vim是一个精巧的编辑器,他可以很好的来处理十进制,八进制,十六进制的数字计算问题.
    在默认的情况下,Vim可以识别出八进制和十六进制的数字.我们可以通过nrformats来控制Vim所识别的数字形式.如果要使得Vim识别出十进制和八进制的数字,我们可以使用下面的命令:
    :set nrformats=""
    如果我们要使Vim只识别出八进制数,我们可使用下面的命令:
    :set nrformats=octal
    默认的情况下我们Vim可以识别出十进制,八进制,十六进制数字:
    :set nrformats=octal,hex
    我们可以使用J命令将当前行和下一行合并为一行.在合并后Vim会加入一空格来分隔这两行.如果我们不希望用空格来分隔,我们可以使用gJ命令.这个命令与J命令类似,只是他不会加入空格来分隔这两行.
    R命令可以使得Vim进入替换模式.在这种模式下,我们输入的每一个字符都会替换光标下面的字符,直到我们按<ESC>退出为止.我们还可以指定数字作为参数来指明这条命令所要执行的次数.(注:这里我做的结果是r命令可以指定参数来指明执行次数,而R命令则不成)
    当我们在替换的文本中有<Tab>键时,替换命令就会出现问题.因为他也会将<Tab>替换为相应的字符,这样就影响了我们文本的缩进.在这样的情况下我们可以使用gr命令来进行替换.如果光标下的字符是Tab的一部分,那么就会跳过而替换别的字符,这样就不会影响我们文本的缩进了.我们还可以使用gR命令进入虚替换模式(virtual replace mode),这时我们输入的字符就会替换屏幕空白处的一个字符.
    我们可以通过执行命令CTRL-K character1 character2来插入一个特殊字符.我们也可以用下面的命令为定义们的自己的特殊字符:
    :digraphs character1 character2 number
    这就是告诉Vim编辑器当我们输入CTRL-K character1 character2命令以后要插入数字表示为number的字符.
    如果我们的工作要我们插入很多的特殊字符,我们可以用下面的命令打开digraph选项:
    :set digraph
    关闭这个选项的命令为:
    :set nodigraph
    (注:这部分内容部是看不明白,也做不出结果)
    命令~可以改变字母的大小写.~命令的执行结果是由选项tildeop的值来控制的.如果我们没有设置这个选项,那个这个命令就像正常一样的动作:
    :set notildeop
    但是如果我们设置了tildeop选项,那么这个命令的语法就变成了~motion的形式:
    :set tildeop
    例如下面的句子:
    this is a test
    如果我们没设置这个选项,那么在我们执行命令时就会实单个字符的大小转换.但是在我们设置了这个选项以后,我们将光标放在第一t上并执行~ft的结果则为
    THIS IS A Test
    这个命令会使得当前光标以后第一t和光标间的字符全部转换为大写.如果在这个句子中还有小写的字符,那么这个命令还可以执行第二次.直到句子中的字符全部为大写为止.
    这时的命令还可以指定字符转换的个数和方向.例如命令3~l是从当前字符开始向右3个字符进行大小写的转换.与这个命令方式相类似的是g~motion格式的命令,所不同的仅是后者不依赖于tildeop选项的设置.命令g~g~或是g~~是进行整个一行的转换.
    其他的一些大小写转换的命令还有:
    gUmotion命令是使得当前光标处到motino所指处的字符全部变为大写.而gUU或是gUgU则是作用在整个行上.如果指定了参数count则所指定的行都会发生变化.而gumotion,guu,gugu则是和上面所说的命令相类似,所不同的只是他们是将字符变为小写.
    我们在用Vim进行编辑的时候可以进行多次的撤销命令,这个次数是由选项undolevels来指定的.如果我们要将这个值设为5000,那么我们可以用下面命令来做到:
    :set undolevels=5000
    命令ZQ是命令:q!的另一种说法.这个会放弃我们所做更改然后退出.
    命令:write则是保存文件.命令:quit是退出Vim.我们可以使用一个缩写来达到保存退出的目的::wq
    这个命令可以用参数来指定保存退出时使用的文件名,如:
    :wq filename
    如果这个文件存在且是一个只读文件时我们会得到一些错误信息,当然了我们可以强制执行这个命令:
    :wq! filename
    我们还可以将指定的行进行保存:
    :1,10 wq filename
    与命令:wq相类似的命令是:xit

  • 相关阅读:
    BZOJ 1630/2023 Ant Counting 数蚂蚁
    BZOJ 3997 组合数学
    BZOJ 2200 道路与航线
    BZOJ 3181 BROJ
    BZOJ 4011 落忆枫音
    BZOJ 4027 兔子与樱花
    vijos 1741 观光公交
    vijos 1776 关押罪犯
    vijos 1780 开车旅行
    5、异步通知机制
  • 原文地址:https://www.cnblogs.com/dyllove98/p/2462156.html
Copyright © 2020-2023  润新知