免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1308 | 回复: 0
打印 上一主题 下一主题

VIM学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-09 11:32 |只看该作者 |倒序浏览

整理:ipx
ipx@263.net
Abstract
VI编辑器是类UNIX系统中最常用到的编辑器,VIM是VI编辑器的改良版本。本笔记是我在使用vim时记录下来的备忘录,内容不是很全面,详细介绍可参考
http://vimdoc.sourceforge.net/
网站。
 
1. 普通模式
在shell中直接打vim filename就会进入普通模式。在这个状态,我们可以通过不同的按键对文件进行操作和切换到其它模式。按“:”可切换到命令模式,按i,o,a可进入编辑模。
1.1. 编辑
i
进入编辑模式。
I
在光标所在行的开头输入正文。
o
在当前位置下一行插入一空行,进入编辑模式,光标位于空行的最开头。
O
在当前位置上一行插入一空行,进入编辑模式,光标位于空行的最开头。
a
光标后移一个字符,进入编辑模式。
A
在光标所在行的末尾输入正文。
v
这入可视模式,可用高亮的色块选择内容,小写v表示字符选中命令。
V
这入可视模式,可用高亮的色块选择内容,大写V表示行选中命令。
x or DEL键
删除当前字符,删除内容保存在缓冲区。
xp
左右字符互换。
dd
删除当前行,删除内容保存在缓冲区。
ddp
上下两行的内容互换。
d$
删除当前光标至行尾的所有内容。
dG
删除从当前行至文件未尾的所有行。
y$
从当前位置复制到行尾;如果要粘贴到其他地方 p 就可以了
u
undo。
v
进地visual模式,移动光标可选择文本。
y
把当前行复制到缓冲区中。
nyy
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。
p
小写字母 p,将缓冲区的内容粘贴到光标的后面。
P
大写字母 P,将缓冲区的内容粘贴到光标的前面。
     (如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前光标所在行的上一行或下一行。)
"ay
把当前行复制到a缓冲区。可用26个字母命名多个缓冲区。
"ap
把a缓冲区中的文本插入当前位置。
J
上下两行合并成一行。
.
英文句点的作用是重复执行上次执行的命令,如你按了"ap插入a缓冲区的内容,那你就可按"."来重复这个操作。
 
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。(在HP-UX,Solaris,AIX上通过)
也可以使用:
:e#
进行切换
标记文本:
  mchar   用字母char标记当前光标的位置
  `char   移至char所标记处
  'char   移至char标记所在行的开头处
  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号
  ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
 
1.2. 光标移动
h,j,k,l
在vim中,除了可使用光标键在移动光标外,还有一种更方便的光标移动方式。就是使用h,j,k,l这四个键来移动光标。h控制光标左移,j控制光标下移,k控制光标上移,l控制光标右移。通过使用这四个字母键就可使我们的手不用移动即可控制光标的移动。刚开始使用可能会有些不习惯,但熟练使用后你会发觉你的输入速度提高不少,强烈建议喜欢vim的朋友使用。
$
光标移动到行尾。
gg
光标移致力到文档的开头。
G
光标移动到文档末尾。
Ctrl+b
在文件中向上移动一页(相当于 PageUp 键)。
Ctrl+f
在文件中向下移动一页(相当于 PageDown 键)。
H,L,M
H控制光标移动到当前屏幕头,L控制光标移动到当前屏幕尾,M控制光标移动到当前屏幕中间一行。
nH
将光标移到屏幕的第 n 行。
2H
将光标移到屏幕的第 2 行。
nL
将光标移到屏幕的倒数第 n 行。
3L
将光标移到屏幕的倒数第 3 行
w
在指定行内右移光标,到下一个字的开头。
e
在指定行内右移光标,到一个字的末尾。
b
在指定行内左移光标,到前一个字的开头。
0
数字0,左移光标,到本行的开头。
  • $
    右移光标,到本行的末尾。
    ^
    移动光标,到本行的第一个非空字符。
    {,}
    {控制光标上移一个段落,}控制光标下移一个段落
    fx
    往右移动到 x 字符上(注意:其中x是键入的字符)
    Fx
    往左移动到 x 字符上(注意:其中x是键入的字符)
    tx
    往右移动到 x 字符上(注意:其中x是键入的字符)
    Tx
    往左移动到 x 字符上(注意:其中x是键入的字符)
    tx
    往右移动到 x 字符上(注意:其中x是键入的字符)
    ;
    分号,配合 f 和 t 使用,重复一次  
    ,
    逗号,配合 f 和 t 使用,反方向重复一次
     
    1.3.  删除命令
    删除命令操作
    d l     删除当前字符(与x命令功能相同)
    d 0     删除到某一行的开始位置
    d ^     删除到某一行的第一个字符位置(不包括空格或TA B字符)
    d w     删除到某个单词的结尾位置
    d 3 w   删除到第三个单词的结尾位置
    d b     删除到某个单词的开始位置
    d W     删除到某个以空格作为分隔符的单词的结尾位置
    d B     删除到某个以空格作为分隔符的单词的开始位置
    d 7 B   删除到前面7个以空格作为分隔符的单词的开始位置
    d)     删除到某个语句的结尾位置
    d 4)   删除到第四个语句的结尾位置
    d(     删除到某个语句的开始位置
    d }     删除到某个段落的结尾位置
    d {     删除到某个段落的开始位置
    d 7 {   删除到当前段落起始位置之前的第7个段落位置
    d d     删除当前行
    d /text 删除从文本中出现“text”中所指定字样的位置,一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
    d fc    删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
    d tc    删除当前行直到下一个字符“ c”所出现位置之间的内容
    D       删除到某一行的结尾
    d $     删除到某一行的结尾
    5 d d   删除从当前行所开始的5行内容
    d L     删除直到屏幕上最后一行的内容
    d H     删除直到屏幕上第一行的内容
    d G     删除直到工作缓存区结尾的内容
    d 1 G   删除直到工作缓存区开始的内容
    x      删除光标所指向的当前字符
    nx     删除光标所指向的前 n 个字符
    3x     删除光标所指向的前 3 个字符
    dw     删除光标右侧的字
    ndw    删除光标右侧的 n 个字
    3dw    删除光标右侧的 3 个字
    db     删除光标左侧的字
    ndb    删除光标左侧的 n 个字
    5db    删除光标左侧的 5 个字
    dd     删除光标所在行,并去除空隙
    ndd    删除 n 行内容,并去除空隙
    3dd    删除 3 行内容,并去除空隙
     
    1.4.修改命令操作
    c l     更改当前字符
    c w     修改到某个单词的结尾位置
    c 3 w   修改到第三个单词的结尾位置
    c b     修改到某个单词的开始位置
    c W     修改到某个以空格作为分隔符的单词的结尾位置
    c B     修改到某个以空格作为分隔符的单词的开始位置
    c 7 B   修改到前面7个以空格作为分隔符的单词的开始位置
    c 0     修改到某行的结尾位置
    c)     修改到某个语句的结尾位置
    c 4)   修改到第四个语句的结尾位置
    c(     修改到某个语句的开始位置
    c }     修改到某个段落的结尾位置
    c {     修改到某个段落的开始位置
    c 7 {   修改到当前段落起始位置之前的第7个段落位置
    c tc    修改当前行直到下一个字符c所出现位置之间的内容
    C       修改到某一行的结尾
    c c     修改当前行
    5 c c   修改从当前行所开始的5行内容
     
    在命令模式下,同样可以删除正文中的内容。例如:
    :d                 删除光标所在行
    :3d                删除 3 行
    :.,$d              删除当前行至正文的末尾
    :/str1/,/str2/d    删除从字符串 str1 到 str2 的所有行
    2. 编辑模式
    ESC 或 Ctrl+[
    退出编辑状态。
    3. 命令模式
    由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态,在左下屏幕我们输入一些操作指令。
    :ab string strings
        例如 :ab usa United States of America ,
        当你在文见里插入 usa 时 United States of America 就蹦出来了
    :map keys new_seq
        定义你当前 键盘命令
     
    :q!
    不保存退出vim。
    :w
    保存文档,但不退出vim。
    :x
    保存退出vim。
    :! command
    运行shell命令。
    :e filename
    编辑/打开一个文件
    :s/emacs/vim
    在当前行中把第一个emacs替换成vim。
    :s/emacs/vim/g
    把当前行中所有的emacs替换成vim。
    :%s/emacs/vim/g
    在全局范围内把emacs替换成vim。
    :reg
    列出缓冲区内容。
    :set all
    列出所有参数的配置情况。
    :tabe
    新建一个标签页。
    :tabn or :tabp
    切换到下一个\上一个标签页。
    :close
    关闭当前标签页。
    :qa
    关闭所有标签页退出。
    :TOhtml
    把当前文档直接生成html格式文档。
    行号与文件
        编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:
    : n            将光标移到第 n 行
                   命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符
                   符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如:
    :345           将光标移到第 345 行
    :345w file     将第 345 行写入 file 文件
    :3,5w file     将第 3 行至第 5 行写入 file 文件
    :1,.w file     将第 1 行至当前行写入 file 文件
    :.,$w file     将当前行至最后一行写入 file 文件
    :.,.+5w file   从当前行开始将 6 行内容写入 file 文件
    :1,$w file     将所有内容写入 file 文件,相当于 :w file 命令
                   在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:
    :w             将编辑的内容写入原始文件,用来保存编辑的中间结果
    :wq            将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)
    :w file        将编辑的内容写入 file 文件,保持原有文件的内容不变
    :a,bw file     将第 a 行至第 b 行的内容写入 file 文件
    :r file        读取 file 文件的内容,插入当前光标所在行的后面
    :e file        编辑新文件 file 代替原有内容
    :f file        将当前文件重命名为 file
    :f             打印当前文件名称和状态,如文件的行数、光标所在的行号等
    恢复文件
    vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi 在
    正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:
    :recover 恢复文件
    也可以在启动 vi 时利用 -r 选项。
    选项设置
    为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:
    :set option     设置选项 option
    常见的功能选项包括:
    autoindent     设置该选项,则正文自动缩进
    ignorecase     设置该选项,则忽略规则表达式中大小写字母的区别
    number         设置该选项,则显示正文行号
    ruler          设置该选项,则在屏幕底部显示光标所在行、列的位置
    tabstop        设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8
    mk             将选项保存在当前目录的 .exrc 文件中
    shell 切换
    在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分方便。语法格式为:
    :! command 执行完 shell 命令 command 后回到 vi
    另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。
    vim 和 gvim 的高级特色
    Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等功能。
    gvim 是 vi 的 X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。
    4. 搜索
    要自当前光标位置向上搜索,请使用以下命令:
    /pattern Enter
    其中,pattern 表示要搜索的特定字符序列。
    要自当前光标位置向下搜索,请使用以下命令:
    ?pattern Enter
    按下 Enter 键后,vi 将搜索指定的 pattern,并将光标定位在 pattern 的第一个字符处。例如,要向上搜索 place 一词,请键入:
    /place Enter
    如果 vi 找到了 place,它将把光标定位在 p 处。要搜索 place 的其他匹配,请按 n 或 N:
    n,继续朝同一方向搜索 place。
    N,反方向进行搜索。
    如果 vi 未找到指定的 pattern,光标位置将不变,屏幕底部显示以下消息:
    Pattern: 未找到
    搜索特殊匹配
    在上面的示例中,vi 查找到包含 place 的任何序列,其中包括 displace、placement 和 replaced。
    要查找单个的 place,请键入该单词,并在其前后各加一个空格:
    / place Enter
    要查找仅出现在行首的 place,请在该单词前加一个插字符号 (^):
    /^place Enter
    要查找仅出现在行尾的 place,请在该单词后加一个货币符号 ($):
    /place$ Enter
    使用 ^
    要逐字搜索这种带有插字符号 (^) 或货币符号 ($) 的字符,请在字符前加一个反斜线 (\)。反斜线命令 vi 搜索特殊字符。
    使用 $
    特殊字符是指在 vi 中具有特殊功能的字符(例如 ^、$、*、/ 和 .)。例如,$ 通常表示“转至行尾”,但是,如果 $ 前紧跟一个 \,则 $ 只是一个普通的字符。
    使用 \
    例如,/(No \$ money) 向上搜索字符序列 (No $ money)。紧跟在 $ 之前的转义字符 (\) 命令 vi 逐字搜索货币符号。
     
    命令模式下给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:
    :/str/                 正向搜索,将光标移到下一个包含字符串 str 的行
    :?str?                 反向搜索,将光标移到上一个包含字符串 str 的行
    :/str/w file           正向搜索,并将第一个包含字符串 str 的行写入 file 文件
    :/str1/,/str2/w file   正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写入 file 文件
    5.替换
    单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
    :%s/old_word/new_word/g
    这个指令是于在整个文件中替换特定字符串  
    替换命令操作
    s     将当前字符替换为一个或多个字符
    S     将当前行替换为一个或多个字符
    5 s   将从当前字符开始的5个字符替换为一个或多个字符
    s    用输入的正文替换光标所指向的字符
    ns   用输入的正文替换光标右侧 n 个字符
    cw   用输入的正文替换光标右侧的字
    ncw  用输入的正文替换光标右侧的 n 个字
    cb   用输入的正文替换光标左侧的字
    ncb  用输入的正文替换光标左侧的 n 个字
    cd   用输入的正文替换光标的所在行
    ncd  用输入的正文替换光标下面的 n 行
    c$   用输入的正文替换从光标开始到本行末尾的所有字符
    c0   用输入的正文替换从本行开头到光标的所有字符
    vi替换使用规则:
    :g/s1/s/s2/s3/g
    第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
    s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
     
    将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多
    个字符。例如:
    rc     用 c 替换光标所指向的当前字符
    nrc    用 c 替换光标所指向的前 n 个字符
    5rc    用 c 替换光标所指向的前 5 个字符
     
    命令模式下利用 :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
    :g/str1/s//str2/g      功能同上
    从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
    6.vimrc配置
    在命令模式下用set命令设置的东西是不能保存的,下次打开vim时又要重新设置。所以vim提供了一个配置文件叫vimrc,可以保存你的配置信息。该文件在Debian系统中位于/etc/vim/目录下。在该文件中,以双引号开头的是注释。vim7.0在debian系统中把配置文件分成两部份,一部份是系统级的$VIMRUNTIME/debian.vim,一部份是用户级的/etc/vim/vimrc。debian.vim的内容一般不要去修改,我们只要修改/etc/vim/vimrc文件即可。
  • :set [all]
    vi or ex  的编辑状态
    如 显示每行 :set nu
     
  • syntax on
    语法加亮功能,这是VIM最有用的功能之一。语法加亮规则文件位于$VIMRUNTIME/syntax目录下。
  • set autoindent
    自动缩排,如当前行是从第3个字符的位置开始编辑的,按回车后光标会自动定位在下一行第三3个字符的位置。
  • set ruler
    总是显示光标的位置。
  • set paste
    置粘贴模式,这样粘贴过来的程序代码就不会错位了。
  • 打开文件时自动回到上次编辑位置。if has("autocmd")
       autocmd BufRead *.txt set tw=78
       autocmd BufReadPost *
          \ if line("'\"") > 0 && line ("'\"")
  • 退出vim后屏幕保持刚编辑文档的内容。set t_ti= t_te=

    7.技巧7.1. 如何去掉文本中的 ^M 硬回车?
    不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。
    cat filename |tr -d '\015' >;newfile
    不同的unix系统还存在一些其他不同的命令,如:doscp
    sed 也可以实现这个功能.
    dos2unix filename filename2
    反之
    unix2dos filename filename2
    在vi 中用:$s/^M//g
    ^是crtl-V crtl-M  
    7.2. shell中设置vi环境
    For C-Shell:
    setenv EXINIT set nu;
    For Bourne or Korn Shell:
    EXINIT=set nu;export EXINIT
    For Korn Shell Only (alternate method):
    typeset -x EXINIT=set nu
    在 .profile 里设置 vi 的环境选项 , 以上均测试过
    7.3.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉
    sed 's/string1/string2/gp' file1 >; file2
     
    7.4 将/etc/hosts下所有的地址都ping 2次
        1  #/usr/bin/sh
        2  #grad /etc/hosts and ping each address
        3  cat /etc/hosts|grep -v '^#' | while read LINE
        4  do
        5   ADDR=`awk '{print $1}'`
        6  for MACHINE in $ADDR
        7   do
        8     ping  $MACHINE -n 2
        9   done
       10  done
     
    8.网上资源
  • vimdoc:
    http://vimdoc.sourceforge.net/

  • vimfaq:
    http://vimdoc.sourceforge.net/vimfaq.html


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/64821/showart_523326.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP