Linux 中 VIM 的使用

Vim 官网:http://www.vim.org/

VIM 实用技巧:https://wenku.baidu.com/view/21c5f387d4d8d15abe234ecb.html
vim 的一些小技巧:https://www.douban.com/group/topic/1815089
vim 简单实用的技巧总结:http://www.tuicool.com/articles/rq6ryqi
《Vim 实用技巧》笔记:http://darksun.blog.51cto.com/3874064/1548082

VIM 使用技巧 PDF 下载:http://download.csdn.net/download/freeking101/9882394

Kali自带vim配置:https://blog.csdn.net/u012359618/article/details/52267319

史上最全 Vim 快捷键键位图(入门到进阶)https://www.linuxidc.com/Linux/2016-06/132019.htm

如果出现vim鼠标右键不能复制粘贴并且进入visual,可能是终端配置问题,把 Xterm 模式改为 linux 模式。或者设置 set mouse-=a。  set mouse=a【这个是用来开启鼠标功能的,a表示所有模式】

gg=G    (自动格式化全部代码)
mG=nG(自动格式化第m到第n行)
==         (格式化当前行)

Vim 键位图

vim键位图(如果网页图片看不清,可以 “右键->在新标签页中打开图片” 查看)

英文版(基础版)

简体中文版(基础版)

程序员定制版

https://blog.csdn.net/zhlh_xt/article/details/52458672

个性化配置

vim 是什么?

所有的Linux/UNIX都会默认安装Vi,现在主流的linux都会给默认安装vim。vim是Vi IMproved,是编辑器Vi的一个加强版。Vim/Vi是一个功能强大的全屏幕文本编辑器, 是Linux/UNIX上最常用的文本编辑器, 它的作用是建立、编辑、显示文本文件;Vi几乎支持所有的语言。Vim/Vi 没有菜单,只有命令。 如果你是一名职业的SE,那么一定在寻找一款出色的能够自由定制、满足灵活编辑功能的编辑器。那么答案,就是vim或者Emacs。本文介绍vim编辑器。至于另一款强大的编辑器Emacs,以后有时间在整理学习。。。。

配置文件在哪?

Windows系统的配置文件是vim安装目录下的vimrc文件。
Linux系统,RHEL和CentOS的配置文件是/etc/vimrc,Debian和Ubuntu的配置文件是/usr/share/vim/vimrc。
Mac OS X的配置文件是/usr/share/vim/vimrc。

vimRC 中的 RC 是什么意思?

一般在运行某个软件、环境或工具之初,要初始执行的一些命令,称为 Run Commands,即 RC。根据 Wikipedia.org 的记载,RC 缩写的用法源自 MIT 的相容分时操作系统(Compatible Time-Sharing System,CTSS)[参考1]。所以以后如果你看到了SystemRC 或者 ScreenRC,也就知其缘由了。

三种基本模式

在《大家来学vim》中提到vim有6+5种模式,除了细分程度不同外,实际上常用的只有3种模式:Normal Mode、Insert Mode和Command-line Mode。从Normal Mode进入Insert Mode,可以按i、I、a、A、o、O、r、R即可。其中i和I表示插入(Insert),r和R表示替换(replace)。从Insert Mode进入Normal Mode,只需要按ESC键即可。从Normal Mode进入Command-line Mode,可以按“:”、“/”、“?”。其中“:”表示输入vim命令,“/”表示后面输入要向下搜索的字符串,“?”表示后面输入要向上搜索字符串。从Command-line Mode进入Normal Mode,只需要按ESC键即可了。可以把Normal Mode理解为常态,进入其他任何一种模式,需要某种特殊方式,而从其他特殊模式回到Normal Mode,就按ESC键即可。

Vim/Vi工作模式

vim中那些最最常用的配置

超级强大的vim配置:http://blog.csdn.net/freeking101/article/details/62037015

(1)颜色设置

syntax on       "开启代码高亮
syntax off      "关闭代码高亮
syntax enable   "开启代码高亮

(2)搜索设置

set hlsearch    " 开启搜索高亮   
set nohlsearch  " 关闭搜索高亮 或者 命令模式下输入:nohlsearch 
                " nohlsearch 是 no highlight search 缩写, 可以简写 noh 或者set noh
set incsearch   " 输入搜索字符串的同时进行搜索
set ignorecase  " 搜索时忽略大小写

可以使用如下方式来实现快速查找:

  1. 最快的方式是让光标停留在想要查找的单词的任意一个字母上面, 然后输入Shift + * ,即可快速选中该单词,并且可以通过 n 或 N 进行上一个或下一个的匹配。
  2. 让光标停留在单词的第一个字母上, 然后输入yw拷贝该单词, 然后输入 / (Ctrl + R) 0 (即 /”0),回车, 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
    解释一下:
    Ctrl + r 是指使用寄存器 , 你会发现先输入/ , 然后输入 Ctrl + r , 会立刻变为 “ , 即寄存器的前缀, 然后 ”0 就可以理解了吧? 合起来就是 /“0, 就是查找刚才复制的那个单词, 不懂的请查看上一个帖子:
    vim的复制粘贴(系统剪切板):http://blog.csdn.net/hk2291976/article/details/42196559
    vim之寄存器的使用和配置:http://blog.csdn.net/ballack_linux/article/details/53078836
  3. 还有一种方式, 和第二种方式差不多,不过是将单词拷贝到系统剪贴板, 然后再从系统剪贴板拿出来。 即选中需要查找的单词, 然后输入 “+y, 然后输入/(Shfit + Ctrl + v), 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。

(3)用户界面

set showmode        " 开启模式显示
set ruler           " 开启光标位置提示
set number          " 显示行号
set nonu            " 不显示行号
set cursorline      " 强调光标所在行
set cmdheight=1     " 命令部分高度为 1

(4)编辑辅助配置

set autoindent      " 自动缩进
set noautoindent    " 不自动缩进
set smartindent     " 智能缩进
set autoread        " 当文件在外部被改变时,vim自动更新载入
set showmatch       " 显示匹配的括号

(5)set 命令 和 set 的一些选项

set命令
    :set ic  搜寻时忽略大小写 (ic:ignore case)
    :set noic  搜寻时不忽略大小写
    :set number   显示行号
    :set nonumber   不显示行号 

set 的一些选项
    all:列出所有选项设置情况
    term:设置终端类型
    ignorance:在搜索中忽略大小写
    list:显示制表位(Ctrl+I)和行尾标志($)
    number:显示行号
    report:显示由面向行的命令修改过的数目
    terse:显示简短的警告信息
    warn:在转到别的文件时若没保存当前文件则显示NO write信息
    nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
    nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
    mesg:允许vi显示其他用户用write写到自己终端上的信息

参考:

[1]Run Commands,http://en.wikipedia.org/wiki/Run_commands
[2]The Ultimate vim Configuration(vimRC),http://amix.dk/blog/post/19486

Vim 使用

Vim同时打开并切换多个文件

  • 1、用 vim 打开一个文件,例如:original.trace
  • 2、在普通模式下,输入:":sp"(不含引号)横向切分一个窗口,或者":vsp"纵向切分一个窗口,敲入命令后,你将看到两个窗口打开的是同一个文件
  • 3、在普通模式下,输入:":e new.trace",在其中一个窗口里打开另一个文件
  • 4、在 普通模式下 ctrl+w,再按一下 w,可以在两个窗口之间切换

Vim跨文件复制

现在把 a.txt 的三行复制到 b.txt
1、用 vim 打开 a.txt
        # vim a.txt
        Esc 进入指令模式(默认刚打开就是这个模式)
        输入"a3yy
        解释:引号要结合shift输入,a 代表剪贴板 a(26个英文字母都可以),3yy当然代表从当前行复制3行了
        退出a.txt
        :q
2、打开 b.txt
        光标移动到你想要复制的位置
        进入指令模式,输入"ap
        解释:引号要结合shift输入,a 代表使用剪贴板 a,p 当然代表粘贴了


Vim 复制到系统剪贴板

  • 1.首先查看 vim --version | grep clipboard 中 clipboard 选项是否开启
  • 2.ubuntu 中通过下载 vim-gnome 可以开启系统剪贴板 sudo apt-get install vim-gnome
  • 3.复制粘贴通过 "+y  和 "+p 实现 (在一般模式下按 v 进入visual 模式 G 全选后复制)

怎样在 vim 的命令行中拷贝,粘贴?

在 vim 的普通模式下,输入':'进入命令行模式,我们可以在屏幕下方输入我们想让vim执行的命令。有时候,我们需要在命令行中执行拷贝粘贴,

例如:我们想要查找替换正文中的特殊字符,但我们又不知道怎么在命令行中输入这个特殊字符。查找还好说,不一定非要在命令行中输入这个特殊字符,只要把光标放在这个特殊字符上,按'*'向下查找,按'#'向上查找。但是如果我们要替换这个特殊字符,就必须在命令行中输入它了,但是又不知道怎么输入这个特殊字符,怎么办?
答案是拷贝粘贴,先在正文中复制这个字符,然后粘贴在命令行中。

可是怎么在命令行中实现粘贴呢?别急,介绍一个好东西:命令行窗口。在正常模式下,输入'q:',就打开了命令行窗口。命令行窗口中都是我们输入过的命令,在这个窗口中我们可以像编辑正文一样编辑新的命令,或修改旧的命令。因为像编辑普通缓冲区一样,自然可以拷贝粘贴了。编辑完之后,在想要执行的命令上按回车,就ok了。命令执行后,命令行窗口也自动关闭了。

常用快捷键

进入vi的命令
    vi filename :          打开或新建文件,并将光标置于第一行首
    vi +n filename :      打开文件,并将光标置于第n行首
    vi + filename :       打开文件,并将光标置于最后一行首
    vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
    vi -r filename :      在上次正用vi编辑时发生系统崩溃,恢复filename
    vi filename....filename :打开多个文件,依次进行编辑


可视模式(选择文本):------------  vim 中选中指定字符,进行复制/剪切/粘贴
    进入vim中visual模式,visual模式进入,可以有三种方式:   
    (1)在普通模式(normal)下,直接按键 v  就可以进入默认visual模式
         可以使用 v+j/k/h/l 进行文本选择  

    v(小写字母v): 按字符移动,选中文本
    V(大写字母V): 选择一行,按行移动,选中文本可视模式,
                 可以配合 d, y, >>, << 实现对文本块的删除,复制,左右移动
    ctrl+v      : 按下^v后即可进行矩形的选择了(ctrl + 小写字母v) 
        在块模式下,可以进行多列的同时修改,修改方法是:
        首先进入块模式 Ctrl+ v,使用按键j/k/h/l进行选中多列。
        按键Shift + i 进行 块模式下的插入,输入字符之后,按键ESC,完成多行的插入。

    对于选中的文本进行如下按键:
    d:剪切操作
    y:复制操作
    p:粘贴操作
    ^:选中当前行,光标位置到行首(或者使用键盘的HOME键)
    $:选中当前行,光标位置到行尾(或者使用键盘的END键)

    :join    合并多行
    J        合并两行


Vim 的分屏操作(:split 文件名   同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口。 
               多窗口是split,像用 e 打开多个文件是将文件放在缓冲区中)
    sp:  上下分屏,后可跟文件名。    :sp 001.txt
    vsp: 左右分屏,后可跟文件名      :vsp 001.txt
    Ctr+w+w:在多个窗口切换
    wqall:保存退出关闭所有。   
    qall:退出所有
 
    启动分屏:
            1.使用 大写O 参数进行垂直分屏  vim -On file1 file2 ...
            2.使用 小写o 参数进行水平分屏  vim -on file1 file2 ...
            注: n 是数字,表示分屏的数量,n 要大于等于文件个数
    关闭分屏
            1.关闭当前窗口 ctrl+w c (同时按下ctrl和w,松开按下c)      
              关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
            2.关闭当前窗口,如果只剩最后一个,则退出vim。ctrl+w q
    编辑中分屏
            1.上下分割当前打开的文件              ctrl+w s
            2.上下分割,并打开一个新的文件        :sp filename
            3.左右分割当前打开的文件              ctrl+w v
            4.左右分割,并打开一个新的文件        :vsp filename
    分屏编辑中光标的移动
            vi 中的光标键是 h,j,k,l,要在各个屏之间切换,只需要先按一下ctrl+w
            1.把光标移动到上边的屏         ctrl+w k
            2.把光标移动到下边的屏         ctrl+w j
            3.把光标移动到右边的屏         ctrl+w l
            4.把光标移动到左边的屏         ctrl+w h
            5.把光标移动到下一个的屏       ctrl+w w
    移动分屏
            1. 当前分屏向上移动         ctrl+w K
            2. 当前分屏向下移动         ctrl+w J
            3. 当前分屏向右移动         ctrl+w L
            4. 当前分屏向左移动         ctrl+w H
    屏幕尺寸
            1.增加高度                 ctrl+w +
            2.减少高度                 ctrl+w -
            3.让所有屏的高度一致       ctrl+w =
            4.左加宽度                 ctrl+w >
            5.右加宽度                 ctrl+w <
            6.右增加n宽 (如:n=30)     ctrl+w n <

Normal Mode -> Insert Mode
    (i=insert、a=append、r=replace、o=open)。
    i    小写字母i,在  光标前  插入
    a    小写字母a,在  光标后  附加文本
    I    大写字母I,在  本行行首  插入文本。在光标所在行的第一个非空格处插入
    A    大写字母A,在  本行行尾  附加文本
    o    小写字母o,在光标所在行的  下一行  处插入新行
    O    大写字母O,在光标所在行的  上一行  处插入新行
    r    小写字母r,替换光标所在处的字符一次
    R    大写字母R,持续替换光标所在处的字符,直到按下ESC

Normal Mode -> Command-line Mode
    :w                     保存文件
    :w <filename>          另存为名为filename文件
    :w! filename           强制保存到指定文件,文件存在则覆盖
    :wq! filename          强制保存到指定文件,文件存在则覆盖,并退出
    :n1,n2 w <filename>    将n1行到n2行的数据另存为名为filename文件
    :w!                    强制保存文件(前提是用户有修改文件访问权限的权限)
    :q                     退出缓冲区,即退出vi,如果文件修改但没有保存,会提示无法退出
    :q!                    不保存文件,直接退出 。
    :wq!                   保存并强制退出
    :wq                    保存退出。
    :x                     如果文件有更改,则保存后退出,否则直接退出。
    ZZ                     (Normal 模式下 ZZ)同 :wq
    :wq!                   强制保存文件并退出缓冲区(前提是用户有修改文件访问权限的权限)

    :e filename         打开文件filename进行编辑
    :x                  保存当前文件并退出
    :!command           执行shell命令command(也就是在VIM里面执行shell命令)
    :n1,n2 w!command    将文件中 n1 行至 n2 行的内容作为command 的输入并执行之,
                        若不指定n1,n2,则表示将整个文件内容作为command的输入
    :r!command          将命令command的输出结果放到当前行
    :r 文件名            在光标所在处插入一个文件的内容。(read)
    :r /etc/passwd       在打开的文件中,在光标所在处读入/etc/passwd内容
    :3r /etc/passwd      在打开文件的第3行开始读入 /etc/passwd的所有内容。
    :35 r 文件名         将文件插入至 35 行之后。

    打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,
    需要将所做修改存入临时文件。
    vi file
    :w /tmp/1 

    把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
    vi file
    :20,59w /tmp/1

Insert Mode -> Normal Mode 和 Command-line -> Normal Mode
    按下ESC键


常用光标移动按键( 在 vi 中, 移动光标 和 编辑 是 两件事, 
                 正因为区分开来, 所以可以很方便的进行光标定位和编辑.)

    Ctrl+o     回到光标的上一位置

    光标字符操作
        h、j、k、l:左、下、上、右 的移动光标命令。虽然您可以在Linux中使用键盘右边的4个光标键,
                   但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。
        $          光标移动到行尾(End),注意要按Shift键
        0          (注意是数字零)光标移至当前行首(Home)
        ^          光标移动到行首第一个非空白字符(Home),注意要按Shift键
        space      光标右移一个字符
        Backspace  光标左移一个字符
        Enter      光标下移一行

        ''     此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
               找到某个单词后, 再输入此命令则回到上次停留的位置.
        '.     此命令相当好使, 它移动光标到上一次的修改行.
        `.     此命令相当强大, 它移动光标到上一次的修改点.
    
    
    光标词操作
        w或W       光标右移一个字至字首
        b或B       光标左移一个字至字首
        e或E       光标右移一个字至字尾


    光标句操作、段操作、行操作
        )          光标移动到后一句的句首
        (          光标移动到前一句的句首
        }          光标移动到下一段的段首
        {          光标移动到上一段的段首
        nG         定位到 第 n 行首  (G 是goto 的意思)
        :n         定位到 第 n 行
        gg         移动到文件第一行行首
        G          移动到文件最后一行。
        Ctrl+G     光标所在位置的行数和列数报告
        数字n      光标 向下 移动 n 行。例如:正常模式下,按下数字5,然后回车,代表向下移动5行。

        n+         光标下移n行,例如10+。  
        n-         光标上移n行,例如5-。 
        n$         光标移至第n行尾
    
    
    光标页操作。屏幕翻滚类命令
        Ctrl+f     向下翻页(Pagedown)
        Ctrl+b     向上翻页(Pageup)
        Ctrl+d     向下翻半页
        Ctrl+u     向上翻半页
        nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
        H          光标移至屏幕顶行(Head)
        M          光标移至屏幕中间行(Middle)
        L          光标移至屏幕最后行(Last)



常用编辑快捷键
    :n1,n2 co n3      将n1行到n2行之间的内容“拷贝”到第n3行下
    :.,5 copy 10      把从当前行开始直至后序第5行的内容“复制”到第10行之后
    :6,$ co 2         把从第6行开始至文件尾的内容“复制”到第2行之后
    :n1,n2 m n3       将n1行到n2行之间的内容“移至”到第n3行下
    :1,5 move 12      把第1行到第5行的内同“移动”到第12行之后
    :n1,n2 d          将n1行到n2行之间的内容删除
    :1,5 delete       删除第1行到第5行内容
    
    
    [n]s        从当前光标位置处开始,以输入的文本替代指定数目的字符。加上n代表替换n个
    S           删除光标所在行。即清空光标所在行。按esc 键结束
    C           替换光标位置开始直至行尾的所有数据内容。清空光标所在位置到行尾内容。
    ncw或nCW    修改指定数目的字
    nCC         修改指定数目的行
    [n]cc       删除整行,但是删除的行不会消失,而是变为空,然后可以修改整行的内容。
    cw:删除一个单词并进入插入模式,      cc:删除一行并进入插入模式。
    
    
    Ctrl+u      删除输入方式下所输入的文本
    J           把下一行合并到当前行尾 
    v(view)->选中内容->d:先在命令模式下按v,再使用方向键选择内容,然后按d删除选中的内容
    
    "?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
    "?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
    "?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
    "?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
    ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存

    同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。
    vi file1 file2
    yy 在 文件1 的光标处拷贝所在行
    :n 切换到下一个文件 (n=next)
    p 在 文件2 的光标所在处粘贴所拷贝的行
    :N 切换回上一个文件


删除操作(delete)
    dd     删除光标所在行。 ( 剪切dd --- 粘贴p ),yw 复制单词,yy 复制行
    ndd    删除从光标所在行开始,向下的n行
    d1G    删除从光标所在行开始,到第一行的所有行
    dG     删除光标所在开始到文件尾的所有字符
    d$     删除从光标所在位置,到行尾的所有字符
    d0     删除从光标所在位置,到行首的所有字符d0 删除到某一行的开始位置 
    d^     删除到某一行的第一个字符位置(不包括空格或TAB字符) 
    D      以行为单位,删除包括光标在内及其后面的所有字符。即 删除 至 行尾   
    dw     删除到某个单词的结尾位置 
    d3w    删除到第三个单词的结尾位置     或者  ndw 或 ndW  删除光标处开始及其后的 n-1 个字
    db     删除该行光标前字符(delete begin)。     
    de     删除自光标开始后面的字符(delete end)
        
    cw、dw    改变(置换)/删除光标所在处的单词(或者字) (c=change、d=delete)。
    nx        向后删除n个字符。nX 是向前删除n个字符。3x:删除光标开始3个字符
    x 或 X    删除一个字符。x(相当于delete)删除光标后的,而X(相当于backspace)删除光标前的
    
    dW    删除到某个以空格作为分隔符的单词的结尾位置 
    dB    删除到某个以空格作为分隔符的单词的开始位置 
    d7B   删除到前面7个以空格作为分隔符的单词的开始位置 
    d)   删除到某个语句的结尾位置 
    d4)  删除到第四个语句的结尾位置 
    d(   删除到某个语句的开始位置 
    d)   删除到某个段落的结尾位置 
    d{    删除到某个段落的开始位置 
    d7{   删除到当前段落起始位置之前的第7个段落位置 
    dd     删除当前行 
    d/text 删除从文本中出现“text”中所指定字样的位置, 
           一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容 
    dfc    删除从文本中出现字符“c”的位置,
           一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容 
    dtc    删除当前行直到下一个字符“c”所出现位置之间的内容 

    dL   删除直到屏幕上最后一行的内容 
    dH   删除直到屏幕上第一行的内容 
    dG   删除直到工作缓存区结尾的内容 
    d1G  删除直到工作缓存区开始的内容 


    将光标移到需要删除的行处按 Ctrl+G 显示行号,再到结尾处 Ctrl+G 显示结尾的行号。
    假设2次得到的行号为20和100,则把这期间的内容全删除
    :20,100d  删除从20行到100行的内容
    
    也可以在要删除的开始行和结束行中用ma、mb命令标记,然后用下面命令删除。
    :a,bd


复制操作(yank) 
    yy 或者 Y      复制光标所在行。拷贝一行到剪贴板中
    nyy 或者 nY    复制从光标所在行开始向下的n行。拷贝n行到剪切板中
    y1G    复制从光标所在行开始,到第一行的所有行
    yG     复制从光标所在行开始,到最后一行的所有行
    y$     复制从光标所在位置,到行尾的所有字符
    y0     复制从光标所在位置,到行首的所有字符  
    yw     拷贝一个单词。如果要复制整行的最简单办法就是V,y,p 就行了  
    yfa              表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
    dfa              表示删除从当前光标到光标后面的第一个a字符之间的内容.
    5fx              表示查找光标后第 5 个 x 字符.
    5w(e)            移动光标到下五个单词.
    5yy              表示拷贝光标以下 5 行.
    5dd              表示删除光标以下 5 行.
    y2fa             表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
    :12,24y          表示拷贝第12行到第24行之间的内容.
    :12,y            表示拷贝第12行到光标所在行之间的内容.
    :,24y            表示拷贝光标所在行到第24行之间的内容. 删除类似.
    
粘贴操作(paste)
    p(小写):取出剪贴板中内容的命令,并在光标所在位置向下新开辟一行,粘贴
    P(大写):向当前行的上面一行粘贴    
    
撤销与重做操作(undo,redo)
    u      (Undo)撤销上一个操作(也就是一步一步撤销)
    U:     撤销当前文本的全部编辑
    Ctrl+r (Redo)重做上一个操作
	

重复操作
    .(英文的句号)       重复上一操作,就是重复上一次操作命令


替换操作(replace)
    r     替换光标所在处字符
    R     进入替换模式,直至按ESC退出
    cc    替换光标所在行
    cw    替换光标所在的英文单词
    ~     转换大小写


排版操作
    :le<ft>     光标所在行左对齐(left)
    :ri<ght>    光标所在行右对齐(right)
    :ce<nter>   光标所在行居中(cneter)
    gg=G        可用于代码的自动缩进排版
    [n]>>       从光标所在行开始向下[n]行文本行右移一个tab操作(编程时格式对齐有用)
    [n]<<       从光标所在行开始向下[n]行文本行左移一个tab操作(编程时格式对齐有用)

    缩进代码
        >    行左移。可视模式(按v键后)。选中文本左移。该命令用于调整源码缩进格式简便快速。
        <    行右移。可视模式(按v键后)。选中文本右移。该命令用于调整源码缩进格式简便快速。
        v    选定后按 = 就是自动格式化代码,自动缩进,内部的递归的缩进都做到了

    函数间跳转
        ctrl+]和ctrl+T    分别是查找函数的定义和返回, 需要ctag的支持
        i                 跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个 i,
                          最好是找自己项目下的文件,否则找库函数的话还不如man.
        大写 K            看光标所指标识符的 man 帮助页


TAB
    TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
    >                    输入此命令则光标所在行向右移动一个 tab.
    5>>                  输入此命令则光标后 5 行向右移动一个 tab.
    :12,24>              此命令将12行到14行的数据都向右移动一个 tab.
    :12,24>>             此命令将12行到14行的数据都向右移动两个 tab.
    
    那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个。
    有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
    帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
    
    :set shiftwidth=4    设置自动缩进 4 个空格, 当然要设自动缩进先.
    :set sts=4           即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
    :set tabstop=4       实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
    :set expandtab       在输入 tab 后, vim 用恰当的空格来填充这个 tab.



折叠代码
    zf      进行折叠, 用 zo 打开折叠,也可以方向键向右打开折叠,
    zc      折叠 (只要在被折叠的块中的任一个语句就行)
    zi      展开所有折叠
    zC      对所在范围内所有嵌套的折叠点进行折叠
    zo      展开折叠
    zO      对所在范围内所有嵌套的折叠点展开



常用多缓冲区操作按键

    vim下每一个打开的文件对应一个缓冲区(buffer)。
    多文件编辑会有两种情形: 
        一种是在进入 vim 前所用的参数就是多个文件(这种情形称为 argument list)。
        另一种情形是进入 vim 后另外再开其它的文件(称为 buffer list)。不过都可以统称为buffer。

    注意:  :e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件了

    :n     编辑下一个文件。
    :2n    编辑下二个文件。
    :N     编辑前一个文件。注意,这种用法只能用于 argument list 的情形。
    :rew   回到首文件
    :args  查看当前编辑缓冲文件状态
    :e# 或 Ctrl-^   编辑前一个档案,用于两文件互相编辑时相当好用。
    :ls    显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,
           有%a的代表是当前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。
    :b     文件名或编号   移至该文件。
    :ls    列出打开各个文件的编号,没有离开vim前编号是不会变的。这个指令 elvis 也是可以使用。
           当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。
    :files 或 :buffers 或 :ls   会列出目前 buffer 中的所有文件。
    
    在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。
    加号 + 表示这个 buffer 已经修改过了。

    :b 序号(代号)     此命令将指定序号(代号)的文件在本窗口打开, 
                     其中的序号(代号)就是用 :ls 命令看到的.
    :set diff        此命令用于比较两个文件, 可以用 :vsp filename命令打开另一个文件, 
                     然后在每个文件窗口中输入此命令,就能看到效果了.
 

    1、多文件编辑模式
        (1)argument list模式,就是在打开vim编辑器时,携带多个文件路径参数。
        (2)buffer list模式,就是在进入vim编辑器后,打开多个缓冲区进行编辑。
        
    2、单一缓冲区打开多个文件
        :files 显示目前打开了哪些文件
        :n 切换到下一个缓冲区内容
        :N 切换到上一个缓冲区内容
        :2n 切换到下下个缓冲区内容
        :bn 下一个缓冲区内容(buffer next)
        :bp 上一个缓冲区内容(buffer previous)
    
    3、多个缓冲区打开多个文件
        :sp [filename] 打开一个新的缓冲区,如果有filename则内容为该文件,否则为当前文件
        Ctrl+w n 新建一个缓冲区
        Ctrl+w q 退出光标所在的缓冲区
        Ctrl+w j 光标移动到下一缓冲区
        Ctrl+w k 光标移动到上一缓冲区
        Ctrl+w l 光标移动到右一缓冲区
        Ctrl+w h 光标移动到左一缓冲区
        Ctrl+w v 左右切割窗口新建缓冲区
        Ctrl+w s 上下切割窗口新建缓冲区
        Ctrl+w o 使光标所在缓冲区最大化,其他缓冲区隐藏


    4.重新编辑
        放弃一修改过的文件,重新编辑。
        (1)使用命令 :q!强行退出后再vi flname重新进入。
        (2)使用命令 :e!强行重编辑更便捷。这样也是会打开文件,但会放弃目前编辑文件的改变,
                    否则如果文件已有变动,vim 预设是不让您随便离开的。
                    :e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中文件。


常用搜索与书签操作快捷键
    1. 搜索字符串                             :%s/word//gn   统计 word 个数
        /string       向下 搜索字符串“string”
        ?string       向上 搜索字符串“string”
        /^字符串      查找以“字符串开始”的行
        /字符串$      查找以“字符串结尾”的行
        /a.b          查找字符串a任意字符串b
    2. 重复上次搜索
        n    根据上次搜索条件找到下一个匹配的字符串(即搜索完向下查找)。即 寻找下一个。
        N    根据上次搜索条件找到上一个匹配的字符串(即搜索完向上查找)。即 回到前一个。 
    3. 搜索单词
        *     向下 搜索光标所在处的单词(完全匹配)
        #     向上 搜索光标所在处的单词(完全匹配)
        g*    向下 搜索光标所在处的单词(部分匹配)。即 匹配包含该单词的所有字符串.
        g#    向上 搜索光标所在处的单词(部分匹配)。即 匹配包含该单词的所有字符串.
        gd    查找与光标所在单词相匹配的单词, 并将光标停留在文档的非。
              注释段中第一次出现这个单词的地方.   
        %     本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
        f(F)x     在光标所在行进行查找, 查找光标右(左)方第一个x字符。
                  找到后:输入 ; 表示继续往下找输入 , 表示反方向查找
    4. 标记书签(mark)
        ma a为小写字母,为光标所在处设定文档书签a
        mA A为大写字母,为光标所在处设定全局书签A
    5. 使用书签(mark)
        `a  到文档书签a处,Tab键上方
        'a  到文档书签a所在行行首处,Enter键左边
        `A  到全局书签A处,Tab键上方
        'A  到全局书签A所在行行首处,Enter键左边
        `n  如果n=0,缓冲区将打开上一次的文档,且光标在上次编辑最后的位置,1-9 以此类推
        'n  如果n=0,缓冲区将打开上一次的文档,
            且光标在上次编辑最后的位置所在行的行首,1-9 以此类推
    6. 查看书签列表
        :marks 查看当前所有书签


替换命令
   	s/str1/str2/gi   解释:/ : 临近s命令的第一个字符为边界字符:/,@,#
	                      g : 一行内全部替换
	                      i : 忽略大小写

    注意: 其中s为substitute(替代、代替),%表示所有行,g表示global(总体的)。

    :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)    在行首插入行号
    :runtime! syntax/2html.vim            转换 txt 成 html, 会按照你的颜色配置来转 
    
    :s/p1/p2/g        将当前行中 所有p1 均用p2替代
    :s/p1/p2/         不加g表示只把“当前行的第一个”替换
    :%s/abc/123/g     将所有行的abc替换成123
    :12,23s/aa/bb/g   将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
    :12,23s/^/#/      将从12行到23行的行首加入 # 字符
    :%s/:.*//g        删除 文件中 从冒号开始直到行尾的所有部分。例如 文件 /etc/passwd 
    :n1,n2s/p1/p2/g   将第n1至n2行中所有p1均用p2替代
    :20,30s/word1/word2/g   将从20到30行的所有word1全部替换成word2
    :1,$s/start/end/g       从第一行开始到文件最后,将字符串start替换为end
    :1,$s/word1/word2/g     或 :1,$s/word1/word2/gc (需要使用者确认)
    :g/p1/s//p2/g           将文件中所有p1均用p2替换
    :r 文件名               在当前光标位置载入另一个文件
    
    :3,$s/^/some string/     在文件的第3行到最后一行所有的行首插入“some string”。
    :%s/$/some string/g      在整个文件每一行的行尾添加“some string”。
    :%s/string1/string2/g    在整个文件中替换“string1”成“string2”。
    :3,7s/string1/string2/   仅替换文件中的第3行到第7行中的“string1”成“string2”。
    
    :%s#/usr/bin#/bin#g    把文件中所有路径/usr/bin换成/bin。
    也可以使用命令 “:%s//usr/bin//bin/g” 实现,其中“#”是转义字符,
    表明其后的“/”字符是具有实际意义的字符,不是分隔符。
    
    使用以下方法删掉文件中所有的空行及以#开始的注释行。
    cat squid.conf.default | grep -v ^$ | grep -v ^#

    :%s/r//g           删除DOS方式的回车^M 
    :%s= *$==          删除行尾空白 
    :%s/^(.*)n1/1$/    删除重复行 
    :%s/^.pdf/new.pdf/ 只是删除第一个pdf 
    :%s///             又是删除多行注释(咦?为什么要说「又」呢?) 
    :g/^\s*$/d         删除所有空行
    :g!/^dd/d          删除不含字符串'dd'的行 
    :v/^dd/d           同上 (译释:v == g!,就是不匹配!) 
    :g/str1/,/str2/d   删除所有第一个含str1到第一个含str2之间的行
    :v/./.,/./-1join   压缩空行 
    :g/^$/,/./-j       压缩空行 
    ndw 或 ndW         删除光标处开始及其后的 n-1 个字符。 



末行模式
        set:设置
        	set nu  number
        	set nonu nonumber
        	set readonly
        	
        /:查找
        	/after(查找指定字符串)
        	n,N(向下跳,向上跳)
        	?向上查找
        	!:执行命令
        	:!ls -l /
        	
        s查找并替换
        	s/str1/str2/gi
        	/:临近s命令的第一个字符为边界字符:/,@,#
        	g:一行内全部替换
        	i:忽略大小写
        	
        范围
        	n:行号
        	.:当前光标行
        	+n:偏移n行
        	$:末尾行,$-3
        	%:全文

高效移动

光标移动效率是vim程序员达到甚至超过鼠标流程序员的关键技能。vim中的移动光标的方式有很多,我来举几个我实际使用过程中应用比较频繁的技巧:

set relativenumber(显示相对行号)。我无意间发现的一个十分实用的技巧,比set number显示行号更好用。通过这个设置,行号的显示会根据当前的光标的相对位置显示成偏移数,并动态变化。这个好处是,可以利用数字+j 数字+k来进行多行跳转,因为是编译行数,所以数字不会太大。否则就算要向下移动10行,我们可能也需要用138gg

  • web:按照单词进行前后光标跳转,也可以组合数字进行跳转,不过以我的经验,与其去算要跳多少个单词,不如多按几次吧。

  • IA:移动到行首或行末的第一个字符处,并进入插入模式。

  • HML:光标分别跳转到可视区域的最上面、中间、最下面。

  • Ctrl+DCtrl+U:有时,需要看的文本不在可视区域,通过这些组合进行上下翻页。

  • ^$0:光标移动到行首和行尾(0是绝对行首)。不过因为^$都需要同时按住shift,而且数字键我们往往难以盲打,所以我一般直接使用I+EscA+Esc

  • %:移动到与当前括号匹配的括号处。

  • gjgk:有时可视区域不够宽,而一行的字符有很多,导致了wrap。那么通过jk是无法直观的定位到同一物理行,却不在同一个可视行里的位置,此时需要gjgk

  • fF:通过上面的例子,我们知道,f是find的意思,可以在一行内查找某个字符出现的位置,并直接跳转过去。比如f<可以从当前光标开始向右,找到第一个<,并移动过去。F是向左查找。

  • ;:重复上一次的f查找操作

  • .:重复上一次的修改操作,跟;可以说是好基友,经常用来实现一些简单的重复操作,比录制宏要简单很多。经常有意识的使用这种简单重复,是vimer编辑思路进阶的分水岭。

高效修改

vim的另一个优势是高效修改。在vim下修改就要改掉传统鼠标流的思维方式,切忌提到修改就按i。有很多高效的修改办法,而且这些办法往往是可重复的。下面举一些我常用的例子:

  • r:替换模式,替换当前光标所在位置的一个字符。虽然你同样可以i进入插入模式,然后删掉那个字符,再输入需要的字符,但这种操作是鼠标流思维方式。替换是一个可重复操作,多用没坏处。

  • cwchange word可以删除从当前位置到一个单词的结尾,并进入插入模式。这种操作常用于修改一个变量。比如对于:int count=0;希望把count改成cnt,那么当光标位于c字符处的时候,按cw可直接删除count,并进入插入模式。然后直接继续输入cnt即可。

  • cawchange a word可以删除当前光标所在位置的单词。对于int count=0;的例子,如果此时光标在count中间某处,比如u处,直接键入caw可以达到同样的效果。所以caw更强大一些。

  • c$c^:举一反三,可以猜到c$是从当前位置删除到行尾,并进入插入模式。

  • ci"change inside "可以用于修改当前位置附近,在相同配对的"中的内容。比如对于const char *str="hello world";。当在双引号中间的任意位置键入ci"可以直接清空字符串,并继续输入新的希望的字符串。

  • ci(ci[:举一反三change inside ( change inside [

  • cit:这个比较特殊,可以直接编辑匹配的xml标签中的内容!经常编写html的童鞋可以熟悉一下。

  • yi"yank inside " 猜猜是啥意思?类似ci"只是把编辑操作编程复制操作,因为y是复制!是不是很强大。

  • ya"yank around " 复制整个字符串,包括双引号。

  • ywyawdawd$...:好了,这些可以"发明"出来了。

  • oO:向下向上增加空行

  • uCtrl+r:undo和redo

上面的例子体现了vim组合的思想,很多命令可以通过组合得到不同的效果。

Linux 编辑 windos 文件特殊字符问题

在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件。

会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致。

^M字符的来历和作用:
        在DOS/Windows里,文本文件的换行符为\r\n,而在*nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了*nix里,每一行都多了个^M。
        所以^M只是一个换行符号,没有实际的用处,我们可以将它保留,也可以将它删除。

对于回车符的定义: 

windows:0D0A      // 对应 \r\n
unix\linux: 0A     // 对应  \n
MAC: 0D            // 对应  \r


删除换行

可以用以下命令删除换行符:
:%s/\n//g

可以用以下命令删除DOS文件中的回车符“^M”:
:%s/\r//g

可以用以下命令转换DOS回车符“^M”为真正的换行符:
:%s/\r/\r/g

可以用以下命令删除行尾的空格以及DOS回车符。它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。命令还使用了“\?”正则表达式,用来匹配它前面出现的字符0次或1次。
:%s#\s*\r\?$##

可以用以下命令删除三行空行:
:%s/^\n\{3}//

可以用以下命令将连续的两个空行替换成一个空行:
:%s/\n\n/\r/g


替换命令的基本语法
 
在全局替换中,ex编辑器使用指定的字符模式对文件中的每行进行检查。在所有行中发现模式的位置,ex使用新字符串来替换模式。
 
全局替换真正使用的是两个ex命令是 :g(global全局)和:s(switch替换)。
 
替换命令的语法如下:
:s / old / new /  
这将把当前中模式old的第一次出现修改为new。  /(斜杆)是命令不同部分之间的分隔符(当斜杆为该行的最后一个字符时,可不写)
 
下面这种形式的替换命令:
:s / old / new / g
把当前行old的每次出现改为new,而不只是该行的第一个old。:s命令允许替换串后面带有选项,上面语法中的g代表全局(g选项影响一行中的每个模式,不要把它与影响文件中所有行的:g命令混淆)
 
通过在:s命令前加上地址前缀,可以把它的范围扩展到多行。例如下面命令把50行到100行的old的每次出现都改为new:
:50, 100 s / old / new / g
 
下面的命令把整个文件中的old的每次出现都改为new:
:1, $s / old / new / g
我们知道%等价于1,$,所以上行命令也可以这样写:
:% s / old / new / g
 
 
 
确认替换
 
使用搜索替换命令有时候会出错,而得到不想要的结果。所以小心并确认文件中需要修改的内容是一个明智的做法
 
在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:
:1, 30 s /old/new/ gc
将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)?  
y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,^E和^Y是提示你用Ctrl+e或Ctrl+y来滚动屏幕的。
 
 
上下文相关替换
 
除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,我们把这种替换叫做上下文相关替换。
 
语法格式如下:
:g /pattern/s/old/new/g    将会把包含pattern的行中,把所有old替换为new
第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。在那些包含模式pattern的行上,ex将把old替换(s)为new。最后的g表示在该行上进行全部替换。
 
如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它:
:g/string/s//new/g  等价于  :g/string/s/string/new/g
还要注意:
:g/string/s//new/g  也等价于 :% s/string/new/g
可以用第二种方式少输一些字符
 
回车在vim的输入方法是ctrl+V,会得到^,此时再按回车.会得到^M这个就是回车了
因此把全文件所有str换成str回车的语句是:
: 1,$ s/str/str^M/g
^M用上面的方法输入

1,$表示从1到最后一行,s是switch,g是global

比较快捷的去除这些符号的方法有这么几种: 

(1)使用VI的命令: 
    使用vi打开文本文件 
    vi dos.txt 
    命令模式下输入 
    :set fileformat=unix 
    :w 
(2)VI下使用正则表达式替换 
   g/\r/s///g
    或者 
   %s/\r//g 
(3)使用sed 工具 
    sed ’s/\r//’ filename > tmp_filename 
(4)既然window下的回车符多了‘\r’,那么当然通过删除‘\r’ ,也可以实现: 
    tr -d '\r' 
(5)最后一个方法是本人最常用的方法,个人觉得最方便 
    在终端下敲命令: 
    $ dos2unix filename 
    直接转换成unix格式,就OK了!~

用vim时,想高亮显示一个单词并查找的方发,将光标移动到所找单词.

1: shift + "*"  向下查找并高亮显示

2: shift + "#"  向上查找并高亮显示

3: "g" + "d"    高亮显示光标所属单词,"n" 查找!

一般指令模式

移动游标

按键说明
h 或向左方向键游标向左移动一个字元
j 或向下方向键游标向下移动一个字元
k 或向上方向键游标向上移动一个字元
l 或向右方向键游标向右移动一个字元
[ctrl]+[f]屏幕向下移动一页,相当于[Page Down](常用)
[ctrl]+[b]屏幕向上移动一页,相当于[Page Up](常用)
[ctrl]+[d]屏幕向下移动半页
[ctrl]+[u]屏幕向上移动半页
n+[Space]n 表示数字,按下数字后再按空格键,游标会向右移动到这一行的第 n 个字元。
功能键[Home]或 0游标移动到这一行的第一个字元处
功能键[End]或 $游标移动到这一行的最后一个字元处 (常用)
H游标移动到这个屏幕最上方那一行的第一个字元
M游标移动到这个屏幕中央那一行的第一个字元
L游标移动到这个屏幕最下方那一行的第一个字元
G游标移动到这个档案的最后一行 (常用)
nGn 为数字。游标移动到这个档案的第 n 行
gg游标移动到这个档案的第一行 (常用)
n+[Enter]n 为数字。游标向下移动 n 行 (常用)

搜索与取代

按键说明
/word在当前游标所在位置往下寻找关键字为 word 的字符串 (常用)
?word在当前游标所在位置往上寻找关键字为 word 的字符串
n这里的 n 是按键 n。代表重复前一个搜索动作
N这里的 N 是按键 N。功能与 n 相反,代表反向执行前一个搜索动作
:n1,n2s/word1/word2/gn1 与 n2 都为数字,表示行数。可在第 n1 行与第 n2 行之间寻找 word1 字符串,并替换为 word2 (常用)
:1,$s/word1/word2/g表示从第一行到最后一行,将 word1 字符串替换为 word2 (常用)
:1,$s/word1/word2/gc表示从第一行到最后一行,也是将 word1 字符串替换为 word2,不同之处是在替换前显示提示字元,由用户确认是否最终替换 (常用)

注意: 使用 /word 的同时,配合使用 n 或者 N,搜索可以变得很方便的啦 :)

删除、复制以及粘贴

按键说明
[Del] 或 x向后删除一个字元 (常用)
X向前删除一个字元 (常用)
nxn 为数字,表示连续向后删除 n 个字元
dd删除游标所在的那一行 (常用)
nddn 为数字,删除游标所在的那一行往下数 的 n 个行 (常用)
d1G删除游标所在的那行到第一行的所有数据
dG删除游标所在的那行到最后一行的所有数据
d$删除游标所在处到该行的最后一个字元
d0是数字 0,删除游标所在处到该行的第一个字元
yy复制游标所在的那一行 (常用)
nyyn 为数字, 复制游标所在的那一行往下数 n 行 (常用)
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制游标所在的字元到该行行首的所有数据
y$复制游标所在的字元到该行行尾的所有数据
p将已复制的数据粘贴在游标所在的那一行的下一行 (常用)
P将已复制的数据粘贴在游标所在的那一行的上一行,原来游标所在的那一行会被推后一行 (常用)
J将游标所在的行与下一行的数据合并为一行
u撤销前一个操作 (常用)
[ctrl]+r重做上一个被撤销的操作 (常用)
.这是小数点,表示重复前一个操作 (常用)

注意: 最后三个按键乃是神器,熟悉后记得经常使用它们,会让你觉得使用 vim 是一件很快乐的事情哦 :)

一般指令模式切换到编辑模式

按键说明
:w将编辑的文件写入硬盘 (常用)
:w!如果文件为只读状态,可以强制写入硬盘,是否写入成功,与你所拥有的文件权限有关
:q离开 vi (常用)
:q!即使文件未保存,仍强行离开 vi
:wq文件写入硬盘后(即保存)离开 vi (常用)
:wq!文件强制写入硬盘后(即保存)离开 vi
ZZ大写字母 Z,如果文件没有修改,则直接离开;如果文件被修改,则保存后离开
:w [filename]将当前文件另存为另一个文件,这个新文件的保存路径为当前路径
:r [filename]在当前文件中读入另一个文件的数据,插入到当前游标所在列的后面
:n1,n2 w [filename]将第 n1 行到第 n2 行的数据储存为新的文件
:! command暂时离开 vi 到指令列模式下执行 command 的显示结果

注意: ! 表示强制执行

vim 特有功能

区域选择

按键说明
v字符选择,移动游标,游标经过的地方会反白选择
V行选择,移动游标,游标经过的行会反白选择
Ctrl + v区块选择,移动游标以长方形方块的方式反白选择
y复制反白选择的地方
d删除反白选择的地方
p将之前复制的区块,粘贴在游标所在处

vim块选择
        V: 字符选择,会把光标经过的位置反白选择
        v: 行选择,会把光标经过的行反白选择
        Ctrl + v: 块选择,可以使用长方形的方式反白选择内容
        y: 将反白的地方复制
        d: 将反白的地方删除
其中 V 或者 v 来选择内容都可以使用 鼠标 来完成,至于块选择就比就特殊了。
如图,使用 Ctrl+v 来选择图中矩形反白的部分,可以按y进行复制,或者按d删除。

多文件编辑

按键说明
:n编辑下一个文件
:N编辑上一个文件
:files列出 vim 所打开的所有文件

注意:使用 vim a.txt b.txt … 指令,就能一次打开多个文件

多视窗

按键说明
:sp [filename]开启一个新视窗。如果有加 filename,表示是在新视窗开启一个新文件;否则,表示两个视窗为同一个文件的内容(即同步显示)
[ctrl]+w+向下方向键先按下[ctrl]不放,然后再按下 w 后放开所有按键,最后再按下向下方向键,游标就会移动到下方的视窗
[ctrl]+w+向上方向键按键方法同上,游标会移动到上方的视窗
[ctrl]+w+q关闭当前游标所在的视窗

补齐

按键说明
[ctrl]+x -> [ctrl]+n依据目前正在编辑的文件内容作为关键字,予以补齐(语法依据副档名)
[ctrl]+x -> [ctrl]+f依据当前目录下的文件名,予以补齐
[ctrl]+x -> [ctrl]+o以副档名作为语法关键字,予以补齐

环境设定参数

按键说明
:set nu设定行号
:set nonu取消行号
:set hlsearch搜索到的关键字反白显示 (默认)
:set nohlsearch搜索到的关键字取消反白显示
:set autoindent自动缩排 (默认)
:set noautoindent不自动缩排
:set backup自动存储备份档(备份档名为 filename~)
:set ruler显示右下角状态说明
:set showmode显示左下角状态说明(比如 INSERT)
:set backspace=(012)倒退键设置;2:可以删除任意值;0 或者 1,仅可删除刚刚输入的字符,无法删除原来就存在的字符
:set all显示所有环境参数设定值
:set显示与系统默认值不同的设定值
:syntax on开启语法着色
:syntax off关闭语法着色
:set bg=dark开启语法着色深色方案
:set bg=light开启语法着色浅色方案 (默认)

一些配置

set modelines=0 
 
color asmanian2       " 设置背景主题 
set linespace=2       " 字符间插入的像素行数目
set background=dark   " 设置背景
 
set mouse=a         "允许鼠标
set autowrite       " 自动保存
set wildmenu        " 增强模式中的命令行自动完成操作
set showmode        " 开启模式显示。显示左下角状态说明(比如 INSERT)
set ruler           " 开启光标位置提示。显示右下角状态说明,打开状态栏标尺。
set number          " 显示行号
set history=1000    " 历史记录数
 
set cursorline      " 突出显示当前行
set cmdheight=2     " 命令行(在状态行下)的高度,默认为1,这里是2 
set laststatus=2    " 总是显示状态行
set magic           " 设置魔术
 
 
set confirm         " 在处理未保存或只读文件的时候,弹出确认
set autoindent      " 自动缩进
set cindent           
set smartindent     " 智能缩进
set autoread        " 当文件在外部被改变时,vim自动更新载入
set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行的距离
set showmatch       " 显示匹配的括号
set matchtime=5     " 对应括号高亮时间(单位是十分之一秒)
 
set ignorecase smartcase    " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感 
set nowrapscan              " 禁止在搜索到文件两端时重新搜索  
set hlsearch	    " 搜索到的关键字反白显示 (默认)
set incsearch       " 搜素高亮,搜索逐渐高亮
"set nohlsearch	    " 搜索到的关键字取消反白显示

syntax on	        " 语法高亮
autocmd InsertLeave * se nocul   " 用浅色高亮当前行  
autocmd InsertEnter * se cul     " 用浅色高亮当前行 
 
set showcmd            " 输入的命令显示出来,看的清楚些  
set backspace=2	       " 倒退键设置;2:可以删除任意值;0 或者 1,仅可删除刚刚输入的字符,无法删除原来就存在的字符
set bg=dark	           " 开启语法着色深色方案
set bg=light	       " 开启语法着色浅色方案 (默认)
set completeopt=preview,menu 
 
 
"开启normal 或visual模式下的backspace键空格键,左右方向键,insert或replace模式下的左方向键,右方向键的跳行功能 
set whichwrap=b,s,<,>,[,]
 
set foldenable              " 允许折叠
set foldmethod=syntax       " 设置语法折叠
set foldcolumn=0            " 设置折叠区域的宽度
set foldlevel=3             " 设置折叠层数为
setlocal foldlevel=1        " 设置折叠层数为
set nocompatible            " 不要使用vi的键盘模式,而是vim自己的
 
set tabstop=4         " Tab键的宽度
set softtabstop=4     " 统一缩进为4
set shiftwidth=4      " 统一缩进为4
set noexpandtab       " 不要用空格代替制表符
set smarttab          " 在行和段开始处使用制表符
 
" 状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [%{&encoding}]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%Y\ -\ %H:%M\")}
" set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\   
filetype on          " 侦测文件类型
filetype plugin on   " 载入文件类型插件
filetype indent on   " 为特定文件类型载入相关缩进文件
filetype plugin indent on   " 开启插件
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值