Vim笔记

1 辅助记忆

  • 部分小写代表命令未完待续,大写代表命令完成时。
  • 另有部分小写代表当前位置之后,大写代表当前位置之前。
  • 次数在具体操作之前
  • 位置在具体操作之后

2 移动

2.1 字符移动

k 上移
h 左移
l 右移
j 下移

在命令前加上数字代表命令执行次数,如:5k,表示上移5行

2.2 单词移动

W w 移动到下一个单词开头
E e 移动到下一个单词结尾
B b 倒退到上一个单词开头
* 和 # 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

若为大写则忽略标点符号直接到下一空格,在命令前加上数字代表执行次数,如:2w,表示往下移动2个单词

2.3 行间移动

0 移动到行首
^ 移动到行首非空字符
$ 移动到行末
+ 移动到下一行开头
- 移动到上一行开头
f或F 移动到下一个字符处,f向前,F向后,例:3fa代表移动到前面第三个a处
t或T 移动到下一个字符前,t向前,T向后

2.4 滚屏

Ctrl+f 往前滚动一整屏
Ctrl+b 往后滚动一整屏
Ctrl+d 往前滚动半屏
Ctrl+u 往后滚动半屏
Ctrl+e 往后滚动一行
Ctrl+y 往前滚动一行
z<Enter> 将光标所在行移动到屏幕顶端
z. (zz) 将光标所在行移动到屏幕中间
z- 将光标所在行移动到屏幕低端

2.5 当前屏移动

H 移动到屏幕顶端的行
M 移动到屏幕中央的行
L 移动到屏幕底端的行
nH 移动到屏幕顶端往下的第n行
nL 移动到屏幕顶端往上的第n行

2.6 行间移动

nG或ngg或:n 转至第n行
G 转至文本末尾
gg 移至文本开头

2.7 文本块移动

移动到当前句子开头
移动到下一个句子开头
{ 移动到当前这一段开头
} 移动到下一段开头
[ [ 移动到当前这一节的开头
] ] 移动到下一节的开头
% 匹配括号移动

2.8 标记移动

ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。
`a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
`.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。

2.9 历史移动

Ctrl+O 返回光标之前所在位置
Ctrl+i 撤销返回

3 插入

i 在光标之前插入
a 在光标之后追加
A 在一行的结尾处追加
I 在一行的开头处插入
o 在光标所在位置的下一行打开新行插入
O 在光标所在位置的上一行打开新行插入

10I*<Esc>代表输入十个*,5o###<Esc>代表输入5行###。

4 编辑

4.1 删除

4.1.1 字符删除

x 删除光标所在处字符
X 删除光标所在前字符

4.1.2 单词删除

dw 删除到下一个单词开头
de 删除到本单词末尾
dE 删除到本单词末尾包括标点在内
db 删除到前一个单词
dB 删除到前一个单词包括标点在内

4.1.3 行删除

dd 删除一整行
D或d$ 删除光标位置到本行结尾
d0 删除光标位置到本行开头

4.2 修改

4.2.1 字符替换

r 单个字符替换
R 按esc前不断输入则连续替换
更改大小写

4.2.2 单词剪切

cw 从光标处剪切到单词结尾
cb 从光标处剪切到单词开头

4.2.3 行剪切

c$或C 从光标剪切到本行末尾
c0 从光标剪切到本行开头
cc或S 剪切整行
s 删除光标所在位置的字符,然后插入

4.3 复制

ynl 向右复制n个字符
ynh 向左复制n个字符
ynw 向前复制n个单词
ynb 向后复制n个单词
y0 复制到行首
y$ 复制到行末
yy 复制整行
yH 从当前行复制到屏幕顶端
yL 从当前行复制到屏幕低端
p或P 粘贴,p为往后粘贴,P为往前粘贴

4.4 其他技巧

>> 选中区域右缩进
<< 选中区域左缩进
= 选中区域对齐缩进
=% 对齐缩进括号内语句块
G=gg 全文缩进
/pattern ?pattern 搜索pattern /往前搜索,?往后搜索(如果有多个匹配,n到下一个,N到上一个)
.(小数点) 可以重复上一次的命令

4.4.1 大小写变换

gu 变小写命令可组合单元
gU 变大写命令可组合单元
~ (单个字符大写转小写,小写转大写)
guw (光标到词尾,大写转换成小写)
gUw (光标到词尾,小写转换成大写)
guu (光标到行尾,大写转换成小写)
gUU (光标到行尾,小写转换成大写)
guG (光标到文件未,大写转换成小写)
gUG (光标到文件未,小写转换成大写)

4.4.2 区域操作

<start position><command><end position>

start position与end position可以为:0 ^ $ /pattern

command可以为d (删除 ) v (可视化的选择) gU (变大写) gu (变小写)等等,例如:ye代表从当前位置拷贝到本单词的最后一个字符,y2/foo代表拷贝2个 “foo” 之间的字符串。

4.4.3 区域选择

<action>a<object> 或 <action>i<object>

  • action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
  • object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:"、 '、 )、 }、 ]。

假设你有一个字符串 (map (+) ("foo")).而光标键在第一个 o 的位置。

vi" → 会选择 foo.
va" → 会选择 "foo".
vi) → 会选择 "foo".
va) → 会选择("foo").
v2i) → 会选择 map (+) ("foo")
v2a) → 会选择 (map (+) ("foo"))

4.5 宏录制

  • qa 把你的操作记录在寄存器 a。
  • @a 会replay被录制的宏。
  • @@ 用来replay最新录制的宏。

示例: 在一个只有一行且这一行只有“1”的文本中,键入如下命令: qaYp<C-a>q→

qa 开始录制
Yp 复制行.

<C-a> 增加1.(SublimeText中为C-up)

q 停止录制.
@a → 在1下面写下 2
@@ → 在2 正面写下3
现在做 100@@ 会创建新的100行,并把数据增加到 103.

4.6 :ex命令模式

ex命令由行地址(行号)和命令组成,它们都以回车键结束。

4.6.1 常用编辑命令

  1. p 另起一页打印选中行

    例:

    :2 , 10 p #打印2~10行
    
  2. d(delete) 删除行

    例:

    :3, 18 d #删除3~18行
    
  3. m(move) 移动行

    例:

    :11, 15 m 23 把11~15行移动到23行下面。
    
  4. co或t(copy) 复制行

    例:

    :23, 29 t 100 复制23~29行并把它们粘贴到100行下面
    

4.6.2 定义行的范围

例如: :11, 15 m 23(把11~15行移动到23行下面)

  1. 行地址符
    .(点) 代表当前行
    $ 代表文件的最后一行
    % 代表文件的每一行,等同于1, $的组合

    例如:

    : . , $ d 删除从当前行到文件末尾
    :20, . m $ 把20~当前行的文本移动到文件末尾
    :% d 删除文件中的所有行
    :% t $ 复制所有行并把它们粘贴到文件的尾部(成为连续的副本)
    1. +-定位

      例如:

      :. , . + 20 d 删除从当前行到当前行以下20行
      :226 , $ m .-2 把226行到文件末尾的文本移动到当前行的上面两行的后面。
      :. , +20 # 显示从当前行下面20行的行号

      开始位置默认为当前行,如果在+或-后面没有数字,那么就等价于+1和-1

  2. 正则搜索定位
    :/pattern/ d 删除下一个包行模式pattern的行
    :/pattern/+ d 删除下一个包行模式pattern的行的下一行(也i可使用+1来代替)
    :/pattern1/,/pattern2/ d 删除第一个包行pattern1的行与第一个包行pattern2的行之间的所有行
    :. , pattern m 23 从当前行到第一个包行pattern的行之间的文本移动到23行后面。
  3. 重定义当前行

    将逗号“,”改为“;”即: :100, +5 p (100, 6p) -> :100 ; +5 p (100, 105p)

4.6.3 组合命令

竖直线(|)是命令的分割符,它允许用户把多个命令组合在同一个ex提示符下。 同时使用|时,要注意制定的行地址。如果一个命令影响到文件中行的顺序,那么下一个命令将使用新的行位置进行工作。例如:

:1,3 d | s/thier/their/ 
把第1行到第3行删除,然后在当前行(该行是调用ex提示符以前的第4行)进行替换
:1,5 m 10 | g/pattern/nu
把第1行到第5行移动到第10行后面,然后显示所有包含模式pattern的行。

4.6.4 g全局操作模式

:g/{pattern}/[cmd] 其中g后面一个字符会被自动当作分隔符

表示对指定范围内的满足{pattern}的行进行[cmd]操作 例如:

#删除所有空行和空白行
:g/^ *$/d

4.6.5 s替换

:[addr]s/源字符串/目的字符串/[option]

+ [addr] : 表示检索范围,省略时表示当前行。
 - 5 :表示第5行
 - 1,20 :表示从第1行到20行;
 - % :表示整个文件,同1,$;
 - . ,$ :从当前行到文件尾;
 - 'a :标记a所在的行(之前要使用ma做过标记);
 - .+1 :当前光标所在行的下面一行。
 - ?chapter? :从当前位置向上搜索,找到的第一个chapter所在的行。(其中chapter可以是任何字符串或者正则表达式。
 - /chapter/ :从当前位置向下搜索,找到的第一个chapter所在的行。(其中chapter可以是任何字符串或者正则表达式。
+ [option] : 表示操作类型,省略时表示仅对每行第一个匹配进行替换
 - g :表示全局替换;
 - c :表示进行确认;
 - p :表示替代结果逐行显示(Ctrl + L恢复屏幕);

例如:

#将多个空格换成一个空格
:%s/  */ /g

4.6.6 norm命令

在:后指出后面是normal模式的指令。 例:

:%norm jdd #删除偶数行

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注