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


    Vim编辑器的不仅可以使得我们编辑各种各样的文件,而且还有一些附加的功能来完成我们的作.例如说Vim可以实现在对文本文件进行加密,而且我们还可以通过一命令行参数来控制我们对文件的处理.我们还可以通过交换文本来实现对文件的修复.
    我们在用Vim时常用一些有用的命令行参数,在这些命令行参数中最有用的一个要算是--help,这个命令行参数可以简单的列出一个帮助屏幕,在这个屏幕上列出所有的命令行参数.这个命令的执行结果如下:
    这个命令的格式如下:
    $ vim --help
    如果要查出我们所使用的Vim的版本,我们可以使用下面的命令:
    $ vim --version
    我们可以用-R参数来在只读状态下打开一个文件,命令格式如下:
    $ vim -R filename

    在大多数的系统中,这个命令与下面的命令是相同的:

    $ view filename
    -x参数可以告诉Vim编辑器对某一个文本文件进行加密处理.例如我们想要建立一个文件来保存一些我们自己的小秘密时就可以使用下面的命令:
    $ vim -x filename
    这时Vim编辑器就会要你来输入加密和解密时所需要的密码.这样以后我们就可以在正常的状态下来编辑我们的文本文件了,当我们完成编辑工作要退出时,Vim就会将文本进行加密处理后退出.当我们想用cat或是type命令来打印出已进行过加密处理的文件时会得到一些无意义的信息.
    我们当然是可以在加密和非加密两种状态下进行选择和切换.选项key包含了加密时的密码.如果我们将这一项设为空,那么也就意味着我们关闭了加密选项.这个命令为:
    :set key=
    如果我们设定了一个密码,那么我们就打开了加密选项.例如下面的命令:
    :set key=
    保存退出.此时的文件就没有密码,我们可以通cat和type命令来打印文件中的内容.
    而我们也可以通过样的命令来重置我们的加密密码.例如下面的命令:
    :set key=secret
    但是这样的设置并不是一个好主意,因为在输入这个命令时你所输入的密码是可以明文显示的,别人在旁边晃动一下肩膀也许就可以看到了,因而这是一个不安全的加密方法.为了避免这样的问题,我们可以使用:X命令,这个命令可以将我们所输入的密码用*打印出来,因而不易被人看到,所以安全得多.
    但是我们要清楚的认识到,Vim所采用的这种加密算法是很弱的.也许他可以防住偶尔路过的小偷,但是不可能防住一个很有时间的密码学专家.同时我们还要认识到我们在编辑文件时所使用的交换文件(swap file)并没有经过加密,因而当我们在进行文件编辑时,一个有着超级权限的人可以通过交换文件得知我们所编辑的内容.一个解决的办法就是我们在编辑文件时不使用交换文件.如果我们在命令行参数中指定-n参数,我们就可以在编辑文件时不使用交换文件,这时我们所输入的内容是存在内存中的.例如我们可以使用下面的命令来编辑一个加密的文件同时不使用交换文件:
    $ vim -x -n filename
    但是我们应该知道在不使用交换文件的情况下,防止了别人偷看我们编辑器的内容,而我们也不可能通过这个交换文件来恢复我们的文件了.
    因为不使用交换文件时我们所输入的内容存在于内存中,因而就百以文本方式存在的.任何人都可以通过查看编辑器的内存来发现我们文件中的内容.如果你真的是想保密你的文件,那只能在使用一个不用联网的电脑,使用好的加密工具,当电脑不用的时候我们要安全的锁起来了.要不我们可要怎么办呢?!:-)
    想一下,如果我们要处理许多的文件,而要将这些文件中的字符串-person-换成Jones.我们应怎么样来做呢?一个办法就是我们要输入许多次来手工的更改(想一想这样的事情有多的恐怖),另一个解决办法就是我们可以写一个Shell脚本或是批处理文件来做这样的工作.Vim作为一个原始的屏幕编辑器在正常模式下启动可以极好的完成这样的工作.然而要批处理,Vim并不会产生一个空的有注释的文件,因而我们要使用ex的命令模式.这种方式给了我们一个极好的命令行的接口可以很容易的放入批文件中.
    在我们这个例子中我们所需要的命令如下:
    :%s/-person-/Jones/g
    :write
    :quit
    我们将这些命令放入一个名为change.vim的文件中,然后在批模式下运行Vim,这时我们可以使用这样的命令:
    $ vim -es file.txt<change.vim
    这个是告诉Vim是ex命令模式下运行处理文件file.txt并从change.vim中读入文件.-s标记告诉Vim不要给出任何的输出提示一类的内容.
    还有另外的一些命令行参数使得我们可以更好的来控制Vim编辑器:
    -R    打开一个文件只读
    -m    允许修改.这个选项允许我们可以设置write选项和修改文件
    -Z
    受限模式.这个命令参数可阻止我们使用:shell命令或是其他的一些命令来使用外部的Shell.但是这个选项并不会阻止我们使用:vi命令来编辑文件.
    另外还有一些命令行参数可以允许我们决定读取哪一个初始化文件:
    -u file
    使用file为初始化文件,而不是使用.vimrc作为初始化文件.如果没有这个文件,那么就不会用任何的初始化文件.
    -U file
    使用file而不使用.gvimrc作为初始化文件.如果没有这个文件,同样不使用任何的初始化文件.
    -i file        使用file而不使用.viminfo作为初始化文件.
    在UNIX系统中,Vim编辑器实际上是一个有着不同的名字或链接的文件.Vim编辑器在哪种模式下启动,取决于我们用什么样的命令或是名字来启动他.一些常用的命令如下:
    vim    在终端模式下启动(在当前窗口内启动编辑)
    gvim    在图形模式下启动(编辑器启动他自己的窗口来进行编辑)
    ex    在ex模式下启动
    view    在正常模式下启动,只读
    gview    在图形模式下启动,只读
    rvim    在终端模式下启动,受限
    rview    在终端模式下启动,只读,受限
    rgvim    在图形模式下启动,受限
    rgview    在图形模式下启动,只读,受限
    vi    Linux下的启动命令,同vim
    我们也可以通过命令行参数来设置初始化模式:
    -g    在图形模式下启动vim(与命令gvim相同)
    -v    在可视化模式下启动(与命令vim相同)
    -e    在ex模式下启动(与大多数系统上使用ex命令相同)
    我们还可以使用一些命令行参数来调试我们的Vim编辑器,常用的命令行参数有下面的一些:
    -Vnumber
    显示额外的信息以使我们知道在编辑器的内部都做了一些什么.数字越大,我们得到的输出信息也就越多.这个参数常用来调试我们的Vim编辑器脚本.
    -f
    前景.我们不要在背景模式下启动图形界面.这个启动对于那些只有一个程序执行完毕才开始执行另一个程序的情况显得尤为有用.当然了这个选项对调试也是相当有用的.
    -w script
    将用户输入的所有字符存入脚本文件.如果这个文件已经存在,那么就追加在文件后面.
    -W script    -W相类似,只是这个选项会覆盖掉已经存在的数据
    -s script    用-w选项来恢复脚本记录
    -T terminal
    设置终端类型.在UNIX系统中,这会改写$TERM的环境变量(当然了,如果$TERM环境变量错误,其他的许多程序都将会崩溃)
    我们还有一些兼容的命令行参数.这些参数可以使得我们的Vim运行起来更像是Vi;
    -N
    这个参数可以使得Vim以自己的方式来运行,而不是不是像Vi的方式运行.这个参数是被.vimrc文件默认定义的.
    -C
    兼容模式.这个参数关掉了许多Vim的自己的特征,而是尽量的像Vi的方式一样的运行.
    -l
    Lisp模式.这种模式完全是由老版本的vi延续下来的.他设置了lisp和showmatch选项.这时的Vim的与文件类型相关的命令都可以很好的处理Lisp程序,并且这是可以自动完成的.
    最后还有一些不知道该将他们归为哪一类的命令行参数:
    -d device    打开编辑给定的设备文件
    -b        二进制模式.设置了noexpandtab,textwidth=0,nomodeline,binary
    在一般的情况下,vim是不产生备份文件的.如果我们希望他产生备份文件,我们可以使用下面的命令:
    :set backup
    产生的备份文件的名称是在原始文件名的最后加上了~.例如我们有一个名为data.txt的文件,那么由Vim所产生的备份文件名即为:data.txt~.
    如果我们不喜欢这个备份文件的扩展名,我们可以定义我们自己的备份文件扩展名.这时我们要到下面的命令:
    :set backupext=string
    例如如果我们设置了backupext的值为.bak,那么新的备份文件名即为data.txt.bak    
    如果我们设置了patchmode选项,那么Vim编辑器就会以当前文件名加上patchmode的值为文件名备份正在编辑的文件.但是我们要注意的是只有以这个文件名为文件名的备份文件不存在时才会产生这样的备份文件.例如我们执行下面的命令:
    :set patchmode=.org
    如果我们是第一次编辑一个已经存在的文件:data.txt.当我们执行了这样的命令保存退出想要看一下事实是否是这样的.因为以前这个备份文件并不存在,所以会产生一个备份文件,名为:data.txt.org.但是当我们再一次编辑这个文件保存退出后,因为这个备份文件已经存在,所在现在的备份文件名:data.txt~.
    通常情况下Vim编辑器会将备份文件放在与文件相同的目录下,我们可以通过设置backupdir选项来选择我们的备份文件存放的地方,例如我们想将备份文件放在~/tmp目录下,我们可以通过执行下面的命令来做到:
    :set backupdir=~/tmp/
    但是这样的设置有时也会产生问题的,如果我们在不同的目录下编辑具有相同文件名的文件,当我们保存退出时,Vim会将备份文件放在~/tmp/目录下,名字的冲突会使得老的备份文件丢失.同时我们还要知道的就是这个选项可以同时设置几个值,中间用逗来分隔.Vim会将备份文件放在第一个目录下.
    一般情况下,当Vim保存文件时,会执行下面的步骤:
    1
    Vim要检查Vim外面的文件是否被做了改动.例如也许有的人已将这个文件重新命名了,如果发生这样的情况,Vim就会给出警告并询问是否继续.
    2
    如果设置了writebackup或是backup选项,Vim就会将旧的备份文件移除,同时产生一个当前文件的副本做为新的备份文件
    3 将缓冲区的内容写入文件.
    4
    如果设置了patchmode选项而不存patch文件,那么Vim就会将备份文件重命名成为patch文件
    5 如果没有设置backup选项,而是设置了writebackup选项,就会移除备份文件
    Vim覆盖已经存在的文件的原因是因为要保护UNIX系统上的硬链接.在非UNIX系统上,备份文件只是通过重命名当前文件来产生
    注意:如果我们设置了nobackup和nowritebackup选项,Vim会覆盖已经存在的文件.这在磁盘已满而更新文件时会造成数据的丢失.
    在默认的情况下,Vim设置了writebackup选项.这就意味着Vim很难会丢失数据.通过采用这样的方法,在磁盘已满的情况下,我们就没有机会丢失文件.也许我们会不能写入新文件,但是我们不会丢失我们的旧文件.
    我们在用Vim来编写时,Vim会在我们编写的过程中产生一个临时的交换文件,这个交换文件中包含着我们所做过的所有修改,当我们完成编写工作,保存退出后,这个临时文件会被删掉.但是如果Vim遇到了意外情况而退出时,这个临时文件会因为来不及删除而存在于硬盘上.当Vim启动时他会检查在当前目录中是否存着交换文件,如果存在,则意味着有一个Vim正在编辑此文件,或者是我们在Vim编辑器的过程中遇到意外而退出,从而留下交换文件.这时Vim就会给出警告信息,并会给我们机会要我们自己来决定我们下一步要怎么做.这时我们可以有以下四个选项:
    Open Read-Only(以只读方式打开)
    这个选项会告诉Vim以只读方式打开.如果我们想要看到文件中的内容或是有另一个编辑过程正在运行,我们可以选择这个选项
    Edit anyway
    如果我们选择这个选项我们可以对这个文件进行编辑.我们最好不要选择这个选项,除非我们对我们正在做的事情有着绝对的把握.这时我们应该知道,如果同时有两个或是多个编辑过程同时编辑一个文件,只有最后一个保存的编辑过程有效
    Recover
    如果我们正在编辑我们的文件,而由于系统故障或是其他的原因而导致vim意外退出时我们可以选择这个选项.此时Vim会检查交换文件,并试着从我们意外退出的地方重新开始
    Quit    取消对此文件的修改
    在我们选择了其中的一项后我们就可以正常的开始我们的编辑工作了.如果我们选择了Recover我们要十分小心,因为我们以前所做过的修改并不一定被保存下来.
    如果我们记得Vim意外退出时我们正在编辑的文件,我们可以用-r命令参数在修复模式下启动Vim.例如我们在编辑文件commands.c时Vim意外退出,我们就可以用下面的命令在修复模式下启动vim:
    $ vim -r commands.c
    如果我们想得到一个可以修复的编辑器程序列表,我们可以用下面的命令:
    $ vim -r
    这样Vim就会在当前目录和标准的临时的目录下查找交换文件,命令的执行结果就像下面的样子:
    $ vim -r
    找到以下的交换文件:
       在目前目录:
    1.    .vi14.txt.swp
                所有者: mayuelong    日期: Wed Jul 27 19:19:39 2005
                  文件名: ~mayuelong/Documents/vi14.txt
                修改过: 是
                用户名: mayuelong      主机名: localhost.localdomain
               进程 ID: 3070 (正在执行)
       在目录 ~/tmp:
          -- 无 --
       在目录 /var/tmp:
          -- 无 --
       在目录 /tmp:
          -- 无 --

    Vim在意外退出的情况下并不会覆盖旧的交换文件.例如第一次编辑时产生的交换文件名为.file.txt.swp.如果我们再编辑又遇到意外退出时所产生的交换文件名为.file.txt.swo,到第三次时所交生的交换文件为.file.txt.swn,如此类推.
    我们在启动Vim时可以指明用哪一个交换文件来修复文件,命令如下:
    $ vim -r .file.txt.swo
    如果想知道我们当前正在使用的交换文件的名称可以使用下面的命令:
    :swapname
    这样就会显示交换文件的名称.
    通常情况下,交换文件会每4秒或是每隔200个字符保存一次.这个数值是由updatecount和updatetime选项来控制的.我们可以用下面的命令来设置交换文件每23秒保存一次:
    :set updatetime=23000
    (注:这个数值是以微秒计的)
    或者是我们可用下面的命令来设置vim每400个字符保存一次:
    :set updatecount=400
    如果我们将updatecount的值为0,那么交换文件就不会被保存了.
    事实上我们可以来控制是不是要在编辑的过程中产生交换文件,例如下面的命令是在产生交换文件,而这也正是Vim所默认的:
    :set swapfile
    我们也可以用下面的命令来使Vim不产生交换文件:
    :set noswapfile
    我们可以对每一个编辑的文件将这个选项设置或是重置.如果我们正在编辑一个大文件而我们又不想可以修复,我们可设置noswapfile.如果我们同时正在另一个窗口编辑一个文件,那么这个窗口中的文件仍是使用交换文件的.
    在UNIX或是Linux系统中,当我们要保存文件时,通常数据被装入内存缓冲区,并肯是在系统认为是一个合适的时才会被写入文件.这通常只是几秒钟的事情.如果我们想要确认数据到达了磁盘,我们可以使用下面的命令:
    :set swapsync
    这个命令是告诉Vim编辑器在每一次将文件写入交换文件的同时写入磁盘.swapsync选项可以是fsync或是sync,这个取决于我们要保存文件时的系统调用.
    通常情况下,Vim是在和当前文件相同的目录下产生交换文件,我们可以通过directory选项来更改交换文件产生的目录.例如下面的命令可以将产生的交换文件放在/tmp目录下:
    :set directory=/tmp
    这并不是一个好主意,因为如果我们是在不同的目录下编辑具有相同文件名的文件时会产生名字冲突.
    我们也可以将这个选项设成一个目录列表,中间用逗号来分隔.最好的方法就是将当前目录(.)设为目录列表的第一个选择.在存放交换文件时首先放在列表的第一项指的目录处,这样交换文件首先会被存放在当前目录下.
    如果我们已经做许多的改动,我们想保存我们当前所做工作,我们可以使用下面的命令:
    :write
    但是这个命令是用我们当前所做的改动来重写已经存的文件,与其相关的一个命令是
    :preserve
    这个命令是将我们所做工作存入交换文件,而原始的保持不变,直到我们用:write或是ZZ命令退出时才会被重写.在这样的情况下,如果Vim遇到意外,我们可以用交换文件来修复我们所做的工作,哪怕是原始文件已经丢失.如果没有用这个命令,我们就不得不同时修复原始文件和交换文件.
    我们不仅可以在启动vim时修复文件,还可以用下面的命令来修复文件:
    :recover file.txt
    这个命令与下面的有着同样的作用:
    $ vim -r file.txt
    如果我们用:recover命令试图修复我们正编辑的文件则会返回错误.如果没有指定文件名,则默认的当前缓冲区中的文件.如果我们想要放弃我们所做的修改并试图修复时,我们可以使用下面的命令:
    :recover! file.txt

  • 相关阅读:
    HDU 5360——Hiking——————【贪心+优先队列】
    HDU 5351——MZL's Border——————【高精度+找规律】
    高精度运算——java
    java题目练手
    java学习
    Arduino 模拟引脚
    Batch批处理 间断向EXE发送参数
    Example Code for a TMP102 I2c Thermometer————Arduino
    c++中vector的用法详解
    C/C++ 中 exit() 函数
  • 原文地址:https://www.cnblogs.com/dyllove98/p/2462160.html
Copyright © 2020-2023  润新知