上古神器 VIM

A Byte Of VIM
按键功能总览
其他参考教程
参考博客一

不可错过的VIM视频教程:

约定:

命令 Y (大写 Y) 即输入:Shift + y

命令 c-v 即输入:Ctrl + v

VIM的各种模式

  • 普通模式/命令模式(Normal Mode
  • 插入模式(Insert Mode
  • 覆盖模式(Replace Mode
  • 可视模式(Visual Mode
  • 可视行模式(Visual-Line Mode
  • 可视块模式(Visual-Block Mode

各种模式之间的切换

  • 其他任何模式下都可以使用Esc 切换到 普通模式(Normal Mode)

  • 普通模式下:输入R 切换到 覆盖模式(Replace Mode)r 替换单个字符,例如:ra,将当前光标处的字符替换为a)

  • 普通模式下:输入v, Vc-v 切换到 可视模式(Visual Mode)

    • v字符为单位选择, 选中光标所在的字符, (结合上下左右可以选取更多)
    • V为单位选择, 选中光标所在行, (结合 上下 可以选取多行)
    • c-v ,结合上下左右,可以选中一个矩阵块。
  • 普通模式下,切换到 插入模式(Insert Mode) 的方法:

    • a 在当前光标之后插入内容
    • A 在当前行尾插入内容
    • i 在当前光标之前插入内容
    • I 在当前行首插入内容
    • o 向下插入新的一行,并进入插入模式
    • O 向上插入新的一行,并进入插入模式
    • cc (双击c)删除当前行,并进入插入模式
    • C 删除当前光标处行尾的所有字符,并进入插入模式
    • s 删除当前光标处的字符,并进入插入模式
    • S 删除当前行,并进入插入模式 (感觉和cc没有区别)
+-----------+  i,I,a,A,o,O,cc,C,s,S +-----------+
| Normal    +---------->------------+ Insert    |
| mode      |                       | mode      |
|           +----------<------------+           |
+-+---+-----+        <Esc>          +-----------+
    |  |    \  \   
    |  |     \  \
    |  |      \  \
    |  |       \  \
v,  |  |        \  v  R, r
V   V  ^ <Esc>   \  \
c-v |  |    <Esc> ^  \
    |  |           \  \
    |  |            \  \
    |  |             \  \
+---+---+----+      +---+---+----+
| Visual     |      | Replace    |
| mode       |      | mode       |
+------------+      +------------+

普通模式下,我们输入的字符被当做命令去执行。在插入模式覆盖模式下,我们输入的字符就是我们编辑的内容。在可视模式下,我们可以选中内容,选中后,可以继续输入命令,对选中的内容进行操作。

VIM 按键功能总览图

vi-vim-cheat-sheet

注:注意区分各个按键的颜色。Operator和Motion的颜色不一样。

{Count}Operator{Count}Motion

首先,看看我们有哪些Operators

下面列出一些常用的,更多内容参考自这里

OperatorFunction
ddelete
cchange
yyank
=indent

其次,看看我们有哪些Motions

下面列出一些常用的,上(k)下(j)左(h)右(l),下一个单词(w/W),上一个单词(b/B)。还有很多各式各样的Motion,参考这里

                     gg   文件首行
                     ?    向前搜索
                    C-b   向前翻页
                     H    屏幕顶部
                     {    上一个段落
                     k 
^  F  T  (  ge b  h     l  w  e  )  t  f  $ 
                     j 
                     }    下一个段落
                     L    屏幕底部
                    C-f   向后翻页
                     /    向后搜索
                     G    文件末行
MotionFunction
$end of line
0first character of line
^first non-blank character of the line
f{char}当前行,向右查找字符,光标跳到该字符。(inclusive)
F{char}当前行,向左查找字符,光标跳到该字符。(exclusive)
t{char}当前行,向右查找字符,光标跳到该字符之前。(inclusive)
T{char}当前行,向左查找字符,光标跳到该字符之后。(exclusive)
{number}gg光标跳到第number行,如果不输入number,就是跳到首行
G光标跳到文件尾行
H跳转到当前屏幕的顶行
L跳转到当前屏幕的底行
w下一个单词的开始
e下一个单词的结尾
b上一个单词的开始
ge上一个单词的结尾

注:

  1. 光标在字符间移动,有两种模式:inclusive 和 exclusive 两种,区别是:是否包含最后一个字符。详见这里

Operator 和 Motion 的组合:{Count}Operator{Count}Motion

The motion commands can be used after an operator command, to have the command operate on the text that was moved over. That is the text between the cursor position before and after the motion. Operators are generally used to delete or change text. If the motion includes a count and the operator also had a count before it, the two counts are multiplied. For example: “2d3w” deletes six words.

一个操作后面跟上一个动作,达到的效果是:在动作前后覆盖的内容上执行那个操作

这是一个非常强大的功能,可以自己尝试各种组合,打开属于自己的世界。
举一些例子:

  1. d2j 类似的命令我就经常使用到 ,2j 光标会从当前行向下移动两行(光标扫过三行),d 表示删除。所以该命令会删除三行内容(包括当前行)。
  2. y2w 2w 光标会向后跳两个单词,y 表示复制。所以这个命令会复制从当前光标开始出的两个单词。
  3. yfa fa 会找到字符a,并将光标跳到该字符处。所以这个命令会从当前光标处一直复制到字符a。注意:实际我发现:f 只会在当前行查找。
  4. gUw gU 是一个operator,表示将字符换成大写,w 移动一个单词。所以这个命令会将当前单词换成大写(当然也是从当前光标处开始)。
  5. cw 删除当前单词(当然也是从当前光标处开始),并进入插入模式。
  6. ci) 这个我就经常使用到, 删除 () 里的内容并进入插入模式,类似的命令还有ci" :删除 双引号之间的内容并进入插入模式。需要说明的是:删除不是从光标处开始的,而是将()内,或者 “” 内的内容都删除。更强大的是,括号里的内容跨行也可以。
  7. ct\ 这个我也经常使用到,删除从当前光标处开始直到字符 \ 之前的内容,不能跨行。

查找 和 替换

查找:

InputFunc
/向下查找字符串
?向上查找字符串
*查找当前光标所在单词
n跳到下一个匹配处
N跳到上一个匹配处

替换:

  • :m,n s/oldstring/newstring/g 替换字符串 (m,n 指定替换从m行到n行)
  • :.,$ s/oldstring/newstring/g
  • :% s/oldstring/newstring/g

.表示当前行

% 表示所有行

$ 表示文件最后

g 表示全局替换,若无g则只替换每行找到的第一个字符串

如果替换字符串中有/,可以使用+ #作为分隔符

自定义快捷键实现小功能

LEADER 键

LEADER键简单的说就是一个前缀键,默认是 \,在上上面的图中,可以看到:\ 是 not used。我们可以将 LEADER键+其他的键,组合成自己想要的快捷键。我们也可以将LEADER键重新map成其他更好按的键位,比如空格。方法是:let mapleader=" "

自定义分屏快捷键

" split the screens to up (horizontal), 
"                    down (horizontal), 
"                    left (vertical), 
"                    right (vertical).
map sj :set nosplitbelow<CR>:split<CR>:set splitbelow<CR>
map sk :set splitbelow<CR>:split<CR>
map sh :set nosplitright<CR>:vsplit<CR>:set splitright<CR>
map sl :set splitright<CR>:vsplit<CR>

分屏后,可用通过 :edit filename 来打开新的文件。

我们还可以自己定义调整分屏大小的快捷键,如下:

" Resize splits with arrow keys
map <up> :res +2<CR>
map <down> :res -2<CR>
map <left> :vertical resize-2<CR>
map <right> :vertical resize+2<CR>

split-screen

自定义占位符

" Press space twice to jump to the next '<++>' and edit it
noremap <LEADER><LEADER> <Esc>/<++><CR>:nohlsearch<CR>c4i

这样设置之后,我在普通模式下,输入按下两次空格键后,会自动查找下一个’<++>’,删除它,并进入写入模式。

place-holder

插件的使用

我使用的vim插件管理器是vim-plug。安装和使用参考这里

Little Tips

  • 可视行模式下,选中行后,可以输入:normal commands 可以对每一行执行普通模式下的 commands 命令。

visual-block-norm

其它:

  1. 显示行号

:set nu (不显示行号: set nonu)

需要总是显示行号时:将命令追加到~/.vim/vimrc文件中

  1. 并列代开其它文件

:vsp

  1. 并列打开的文件之间切换

Ctrl + w

InputFunc
{number}gg光标跳到第number行,如果不输入number,就是跳到首行
G光标跳到文件尾行
{n}dd删除当前行
{n}yy复制当前行
ZZ保存并退出
ZQ不保存并退出
zz将当前行显示在屏幕中间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值