vi学习笔记

1     VI 的学习... 1

2     插件的安装... 1

3     配置... 1

4     宏... 2

5     Vi常用命令... 3

5.1      命令模式下文件编辑操作... 3

5.1.1       行列模式... 4

5.1.2       列操作... 4

5.1.3       拷贝粘贴,摘自网络的常用操作... 4

5.1.4       取消命令... 6

5.1.5       字符查找... 6

5.1.6       字符替换... 7

5.1.7       字符大小写变化... 7

5.2      文件操作... 8

5.3      其他技巧举例... 9

6     Windows下的gvim.. 9

History

2007-8-9

Initail

Shannon

1          VI 的学习

vi --version 检查版本,最好是7.0以上,因为提供的功能更全面些(如字节补齐,标签页等)

多去www.vi.org去寻找tips

比较好的有:taglist

Vim有很多平台版本,这里主要介绍linux下的vim (不是gvim)

在linux下,键入 vi –h   可以看到一些帮助,

view filename

vi –R filename

Read only方式打开文件

vi –p filename1 filename2

vi –p *.v

以tab page的方式打开文件

以tab page的方式打开目录下所有后缀名为.v的文件

vi ….

多看看,不少有用的命令

或者在vi下,键入

:help user-manual

:helptutor

:help tips

2          VI的安装

2.1         安装VI

1) 首先解压缩

2) 然后运行 configure –h (熟悉一下配置)

比如需要重新配置需要安装的目录(当然可以不改,缺省是/usr/local/bin和/usr/local/lib)如下:

./configure --prefix=$HOME/TOOLS --exec-prefix==$HOME/TOOLS --enable-cscope

3)configure后,再运行make install即可

2.2         插件的安装

Vi的一般的高亮文件,在安装目录下的share中,可以看到verilog.vim, (/share/vim/vim71/syntax)

定制的文件放在用户目录下,新建目录 .vimplugin ,

   到vim的官方网站上search ,  ultraedit 可以看到不少像ultraedit的功能

taglist.vim,

键入:Tlist,可以部分文件结构

grep.vim

键入:Grep, 可以查找关键字在多个文件,并且打开一个小窗口存放result,点击result跳到对应的行

vi --noplugin   意思:不用plugin目录下的插件

vi -u <vimrc>  意思:use <vimrc> instead of any .vimrc

3          配置

1)在用户目录下,建立文件.vimrc, 在这个文件可以设置vim的

注:网络上有不少写好的.vimrc,使得操作方便个性化,建议多找找,尤其是高手写的

比如对于comment颜色的设置,缺省是深蓝,可以改为浅蓝(具体,键入help ctermfg)

highlight comment ctermfg=blue guifg=blue

" 设置跳格距离
set expandtab
" 设置自动缩进格数
set shiftwidth=4
" 打开自动缩进功能
set smartindent

set sw =4

缩进尺寸4 个空格

set ts=4 Tab

宽度为4 个字符

set et

将所有Tab 替换为空格

vi中设置tab键为空N ,三种方法

A1

:set tabstop=4

A2

:set ts=4

:set et

A3

在用户主目录下建文件 .exrc

内容为

set ts=4

set sw=4

set ai

2)map配置:

这样可以配置一些自己熟悉的命令,把它们映射到一些自己熟悉的键盘

映射命令模式下的键盘采用map打头,映射编辑模式下的采用map!打头

如在命令模式下,键入ctrl+s 为保存

map ctrl+s :w

如在编辑模式ctrl+s 为保存 (使用map!

map! ctrl+s (ctrl+v)ESC键:w(ctrl+v)enter键i

如映射shift+F5 类似ultraeditor,但是作用于整个词

注意:选中整个词 v+iw,然后键入 ~即可进行uppercase和lowercase的转换

注意:对于非字母的按键的映射

首先进入inster模式

键入ctrl+v, 再键入非字母的按键(如需要键入enter,则按enter键即可)

3) buffer的操作

这个可以进一步扩展应用,

每次打开文件记录关闭前的位置(主要用于vim 7.0, 前期版本有此功能)

if has("autocmd")

autocmd BufReadPost *

if line("'"") > 0 && line("'"") <= line("$") |

   exe "normal g`"" |

endif

endif " has("autocmd")

4          宏

宏的录制:

q+character 表示宏开始

键入q表示宏结束   

这样就可以把character映射为某个动作了

将所有偶数行的a改成another

录制宏

按gg 进入第一行

按qm进入宏录制状态,录制到寄存器m (就是q+character 表示宏开始)

按j进入第二行,按$ 跳到行末

按2b ,光标停在字母a上

按caw,输入another,按ESC ,按j进入下一行

按q 结束宏的录制                   (键入q表示宏结束)

宏的播放

单次播放

按下@m,执行m寄存器中的宏

可以发现第4 行的a也变成了another

多次播放

输入1000@m

可以发现所有偶数行的a都变成了another

到达文件底部时宏执行出错,会自动停止

最终并没有真的执行1000 次

第二个举例:列递增(或者递减)数字

首先键入1,然后退出到normal,

按下qa,(记录到a寄存器)

键入yy (复制一行)

键入p (粘贴一行)

ctrl+a(自动加一,ctrl+x是自动减一)

键入q(退出录制)

然后再normal模式下,键入31@a,这样一列递增数字产生

另外技巧:

按 . 表示重复前一个操作

5          Vi常用命令

三个模式:命令模式, 输入模式, 行编辑模式

另外摘自手册

Normal mode: 即刚进入vi,或者多按几次ESC回到的mode

Insert mode:即编辑模式

Command mode:即命令模式,在normal mode下键入冒号 : 即进入。

5.1         文件打开关闭

vi  *.v –o             采用水平打开多个文件,在打开后同sp

vi  *.v –O            采用垂直打开多个文件, 在打开后同vsp

vi  *.v –p             采用标签页打开多个文件, 在打开后同tabedit

采用cq,可以关闭所有文件,但是没有保存!

qa!   : 关闭所有文件,但是没有保存!

qa   :  可以关闭所有文件,是否需要保存会有提问 (建议使用)

wqa  : 保存所有文件,退出

ZZ,可以保存退出

命令详解

:q! 由三个命令组成,:进入命令模式, q 表示退出,  !表示强制退出,不需要确认

对于喜欢把事情弄出个究竟的人来说, 这个命令由3部分组成: 冒号(:), 用以进入冒号命令行模式; q命令, 告诉编辑器退出; 最后是强制 命令执行的修饰符(.!) 1 2. 这里强制命令执行的修饰符是必需的, 因为Vim对隐含地放弃所有修 改感到不妥.如果你只是用":q"来退出, Vim会显示下面的错误消息并且拒 绝不负责任地退出:

5.2         命令模式下文件编辑操作

键入shift+r,   可以对当前光标的一行进行覆盖

键入r,           可以对当前字母更改

I                    进入编辑模式

Esc                退出

:h 需要的命令(帮助)

比如查找 s命令的使用( 替换命令)

键入 h Substitute

在命令模式下,可以使用一些shell命令等

:cd

:pwd

如果还需要使用更多的shell命令,如下,但是不知道意义了 :{

!+shell命令 

加上!可以用来执行shell的操作

Ctrl+o,可以从编辑状态迅速切换到命令状态,然后执行后再回到编辑状态

5.2.1          行列模式

命令模式下

v表示行操作,以单词为单位

V表示行操作,以行为单位

ctrl+v ,进入列模式(在vim中称为block操作,block-wise)

在normal mode下,键入gv,可以重新选中上一次选中的块

5.2.2          列操作

1) 选择列块

Ctrl+v 进入列模式,然后用键盘选择列块

如果用鼠标选,需要鼠标选中一块,再按ctrl+v

如果在windows下, 需要鼠标选中一块,再按alt+v

2) 替换列模块

    选择列块后,键入c(进入insert模式)

然后键入一行需要替换的字符,最后按esc

3) 插入

选择列块后,键入I(进入insert模式)

然后键入一行需要替换的字符,最后按esc

3) append

选择列块后,键入A(进入insert模式)

然后键入一行需要替换的字符,最后按esc

4) Ctrl+v 进入列模式,然后用键盘选择列块然后键入shift+r ,可以删除所在列块

5) 粘贴拷贝

选择列块后,可以进行列操作的粘贴拷贝, 同一般操作,y,p即可

6)如何列选中很多行的内容

          采用ctrl+v,然后选中第一行的某几列,然后翻屏的方法,由于行很多,有时不现实。可如下操作

ctrl+v,然后选中第一行的某几列,然后键入 很大的一个数+j (比如10000000j即可)

5.2.3          拷贝粘贴,摘自网络的常用操作

yaw: yield a word    拷贝一个词

yas : yield a sentence 拷贝一句话

删除、复制及修改指令介绍 (摘自网络,此单元较少使用)
=========================
d(delete)、c(change)和y(yank)这一类的指令在 vi 中的指令格式为:
Operator + Scope = command
(运算子) (范围)
运算子:
d 删除指令。删除资料,但会将删除资料复制到记忆体缓冲区。
y 将资料(字组、行列、句子或段落)复制到缓冲区。
p 放置(put)指令,与 d 和 y 配和使用。可将最后delete或yank的资
料放置於游标所在位置之行列下。
c 修改(change)指令,类似delete与insert的组和。删除一个字组、句
子等之资料,并插入新键资料。

范围:
e 由游标所在位置至该字串的最后一个字元。
w 由游标所在位置至下一个字串的第一个字元。
b 由游标所在位置至前一个字串的第一个字元。
$ 由游标所在位置至该行的最后一个字元。
0 由游标所在位置至该行的第一个字元。
) 由游标所在位置至下一个句子的第一个字元。
( 由游标所在位置至该句子的第一个字元。
{ 由游标所在位置至该段落的最后一个字元。
} 由游标所在位置至该段落的第一个字元。

整行动作
dd 删除整行。

19,66d 删除19到66行
D 以行为单位,删除游标后之所有字元。

J 将光标所在的下一行连接到当前行的末尾

d0: 删除光标前半行

d$: 删除光标后半行

cc 修改整行的内容。
yy yank整行,使游标所在该行复制到记忆体缓冲区。

删除与修改
==========
x 删除游标所在该字元。
X 删除游标所在之前一字元。
dd 删除游标所在该行。
r 用接於此指令之后的字元取代(replace)游标所在字元。
如: ra 将游标所在字元以 a 取代之。
R 进入取代状态,直到《ESC》为止。
s 删除游标所在之字元,并进入输入模式直到《ESC》。
S 删除游标所在之该行资料,并进入输入模式直到《ESC》。

搬移与复制
==========
利用 delete 及 put 指令可完成资料搬移之目的。
利用 yank 及 put 指令可完成资料复制之目的。
yank 和 delete 可将指定的资料复制到记忆体缓冲区,而藉由 put 指令
可将缓冲区内的资料复制到萤幕上。
例:
搬移一行 .在该行执行 dd
.游标移至目的地
.执行 p
复制一行 .在该行执行 yy
.游标移至目的地
.执行 p


ctrl+f :后翻页
ctrl+b:
前翻页

ctrl+u:后翻半页

ctrl+d:前翻半页

G : 文件尾

数字G: 数字所指定行

查找

/string 查找字符串  /<string> (全词匹配)

另外

:g/string/ 将所有找到string罗列出来,缺点是此时不能编辑,需要再开个shell 或者退出后用n或N找

n 继续查找

N 反向继续查找

% 查找对应括号

u 取消上次操作

ex命令状态

:set number 显示行号

:set smd 显示显示状态

:0 文件首

5.2.4          取消命令

在命令方式下面使用u或者U来取消上一步操作。不同的是:

u是一步一步取消上次操作,而U则是把状态恢复到上次使用U的时候的样子。

同时u实现undo完以后不能用u再来实现redo,但是由于U有把状态恢复到上次使用U的时候的样子的特点,所以U可以实现redo。

而u实现了undo后要redo的话,必须使用ctrl+r来实现。

5.2.5          字符查找

如果不区分大小写,键入

:set ic

如果区分大小写,键入

:set noic

然后再查找和替换

/string 查找字符串

 /<string> (全词匹配)

另外

:g/string/ 将所有找到string罗列出来,缺点是此时不能编辑,需要再开个shell 或者退出后用n或N找

Tips

    将光标放在单词上,全词匹配查找

在命令模式下键入 *(朝下),或者#(朝上),这个大大简化了操作

作用类似 /<string>

 

 

模糊查找

如果需要查找同时含有abc_2, abcooo_2 的词

注意,vi用.做为  ,同时用.可以代表一个单词

键入  /abc.*2  即可找到

 

在命令模式下键入 g*(朝下),或者g#(朝上)

作用类似 /string

去掉高亮   :noh

To get more help on these, use

:help *

:help #

:help g*

:help g#

:help <S-LeftMouse>

:help <S-RightMouse>

遗憾: 一直没有找到能够把所有找到的结果罗列出来,然后鼠标点击结果可以跳到相应行的功能(类似ultraedit),除非使用插件Grep,但是并不是打开窗口,而是替换了原来的窗口

5.2.6          字符替换

( 具体其他帮助键入 :h Substitute 可以看到整个说明)

: %s/ATMEL/MOSYS/c

就是全局文件中,将ATMEL字符改为MOSYS, 需要每次确认

: %s/ATMEL/MOSYS/g

就是全局文件中,将ATMEL字符改为MOSYS, 不需要每次确认

: %s/ <ATMEL>/MOSYS/g

因为表示转义符,表示”<”符号是有意义?, 这句话表示全词匹配ATMEL, 才进行替换

:.,$ s/str1/str2/g

用字串str2替换正文当前行到末尾所有出现的字符串str1

:.%s/str1

表示全局文件中删除str1

Substitute中range的帮助

Line numbers may be specified with:             *:range* *E14* *{address}*

        {number}        an absolute line number

        .               the current line                          *:.*

        $               the last line in the file                 *:$*

        %               equal to 1,$ (the entire file)            *:%*

(注,如果从当前行1560到最后,将atmel转为mosys,需确认,  键入:1560,$s/atmel/mosys/c)

        't              position of mark t (lowercase)            *:'*

        /{pattern}[/]   the next line where {pattern} matches     *:/*

        ?{pattern}[?]   the previous line where {pattern} matches *:?*

        /              the next line where the previously used search

                        pattern matches

        ?              the previous line where the previously used search

                        pattern matches

        &              the next line where the previously used substitute

                        pattern matches

vi 中如何使用 :s 命令实现字串的替换.

:s/str1/str2/ 用字串 str2 替换行中首次出现的字串 str1

:s/str1/str2/g 用字串 str2 替换行中所有出现的字串 str1

:.,$ s/str1/str2/g 用字串str2替换正文当前行到末尾所有出现的字符串str1

:1,$ s/str1/str2/g 用字串str2替换正文中所有出现的字串str1

:%/str1/s//str2/g 功能同上.

5.2.7          字符大小写变化

在命令模式下,用鼠标选中一块或一个单词

按U表示把选中内容变大写

按u 表示把选中内容变小写

按~表示翻转原有大小写

guu 将一行变成小写

gUU将一行变成大写

guu                             : lowercase line

gUU                             : uppercase line

gf                              : open file name under cursor (SUPER)

ga                              : display hex,ascii value of character under cursor

ggVGg?                          : rot13 whole file

CTRL-A,CTRL-X                   : increment,decerement number under cursor

                                  win32 users must remap CNTRL-A

CTRL-R=5*5                      : insert 25 into text

5.3         文件比较操作

5.3.1          打开文件

1)直接打开两个文件

# Vi  –d  FILE_LEFT  FILE_RIGHT

或者

# vimdiff  FILE_LEFT  FILE_RIGHT

2)如果已经打开一个文件,再开另一个文件

# vim FILE_LEFT

然后在vim的ex模式(也就是"冒号"模式)下输入:

:vertical diffsplit FILE_RIGHT

如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:

1. Ctrl-w K(把当前窗口移到最上边)

2. Ctrl-w H(把当前窗口移到最左边)

3. Ctrl-w J(把当前窗口移到最下边)

4. Ctrl-w L(把当前窗口移到最右边)

其中1和3两个操作会把窗口改成水平分割方式。

如果希望在两个文件之间来回跳转,可以用下列命令序列:

Ctrl-w, w

5.3.2          上下文的展开和查看

比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:

:set diffopt=context:3

可以用简单的折叠命令来临时展开被折叠的相同的文本行:

zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)

然后可以用下列命令来重新折叠:

zc (folding close)

5.3.3          光标移动

接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:

:set noscrollbind

可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:

]c

反向跳转是:

[c

如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点

5.3.4          文件比较以及合并

文件比较的最终目的之一就是合并,以消除差异。

1)如果希望把鼠标所在某一个差异点中当前文件的内容复制到另一个文件里,可以使用命令

dp          意思是(diff "put")

如果希望把另一个文件的内容复制到当前行中,可以使用命令

do          意思是(diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)

2)在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况或者需要手工编辑文件,这个时候需要手工来刷新比较结果:

:diffupdate

3)如果希望撤销修改,可以和平常用vim编辑一样,直接

<ESC>, u

但是要注意一定要将光标移动到需要撤销修改的文件窗口中。

5.4         文件操作

vi –help可以看到帮助

vi –R  文件: 只读方式打开

vi –d 文件1 文件2    diff模式,进行比较 (对于不同的部分会打印出来,但是相同的部分折叠)

vi –r 修复文件

Ctrl+g    :显示文件的名称和行数

同时打开两个文件( 横着打开)

vi  file1 file2 –o

同时打开两个文件( 竖着打开)

vi  file1 file2 –O

同事关闭多个文件, 即在以前的操作中加a

:qa

:qa!

:wqa

:wa

如果打开一个文件了,想再同时打开另外一个窗口,

键入sp+filename

如单独键入 sp,则把本文件窗口split

vsp 则竖显示多窗口

46vsp则竖显示多窗口,同时调整窗口

多个文件窗口的切换, 按两下ctrl+w

小节:ctrl+w 后可以进入window操作模式,然后才能进行如下操作

窗口操作

都要先键入ctrl+w

键入s 表示行分割  = sp

键入v 表示列分割  = vsp

键入n 表示new 新窗口

键入q 表示退出窗口

键入ctrl+r 将两个窗口位置对换

另外在窗口中

zL  左滚屏幕

zH  右滚屏幕

在vi7.0后引入了tab功能,类似ultraedit打开多个窗口,这样可以相互之间可以复制

在linux下:           vi –p filename

在命令模式下:     :tabedit即可

                                   :tabnew 新开一个tab 建立一个新文件

如果在过多个文件之间切换,使用gt

:help gt可以看到更灵活的用法

如gT                  (往前跳)

  <count>gt      跳到第几个page页

遗憾:如果文件在不同目录,且目录较深,打开比较麻烦

5.5         其他技巧举例

跳到某一行, 直接输入 :行号  即可

添加书签,  m+a

跳转到书签 ‘+a  (‘是enter键旁边的键)

:marks 显示当前书签

gg           跳到文件头

shif+g,跳到文件末尾

. 表示重复前一个操作,即行尾添加!

用VI编辑一个文件,但需要删除大段大段的内容 

*vi file 

Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G. 

      或者如下

:23,1045d 假定两次行号为23和1045,则把这几间的内容全删除 

 

也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除. 

*)单词补齐

在insert模式下,键入ctrl+p即可!这个功能不局限于语言,而是在整个vi打开的文件中查找,所以比较适合其他语言,如verilog

*)目录操作

可以vi 打开目录名,但是后面要带/

如对于目录 pcie_pkg

Vi pcie_pkg/ 即可,

这样可以对于目录中的文件进行操作

*)粘贴,拷贝

运行 di,或者reg可以看到当前缓冲区的值, 这是可以有选择地调用自己的值,方法是键入第一列显示的符号。 “是enter键左边的一个键

有时希望粘贴,上两次拷贝的内容, 可以键入,因为 0对应的是上两次的

“0p

键入5p,表示拷贝5次

*)shell 结果送到文本中, :r命令, 如下

:r!date

   就是把shell的date命令结果显示到当前文本中

*) 如何对于后缀为.vshell的文件高亮显示verilog的语法

如果是暂时的,键入: set syntax=verilog即可(verilog来源于vim71/syntax目录下的文件名)

如果希望每次打开此类文件均检测,如下

建立 ~/.vim/ftdetect/vshell.vim (也可以取其他文件名,如other.vim)

在文件中输入:

:au BufNewFile,BufRead *.vshell  set syntax=verilog

小节:

g命令很有用,表示goto的意思

如gg,gUU,gt

6          Windows下的gvim

1)首先注意列操作(vim称为块模式下)

由于windows 下ctrl+v 被用作粘贴了,和ctrl+x (剪切)等用windows用户熟悉的动作。此时如果要进入列操作,首先用鼠标选中起始和结束的位置,然后键入ctrl+Q

2)如何可以让gvim同时采用tab打开多个文件

在Sentto目录中,创建gvim快捷方式,然后右键选择属性,在”目标”一栏中输入

"G:Program FilesVimvim71gvim.exe" -p --remote-tab-silent "%*"

原文地址:https://www.cnblogs.com/e-shannon/p/10381365.html