Vim 手册

Tip

  • 使用 CTRL-[ 代替 ,左手小指 CTRL,右手小指 [ 熟练后很方便
  • SecureCRT 中使用 Vim 8 内嵌终端如看到奇怪字符,使用 :set t_RS= t_SH= 解决
  • SecureCRT 中使用 NeoVim 如看到奇怪字符,使用 :set guicursor= 解决
  • * 和 # (以及 g*/g#)是十分重要的查找命令
  • 多使用 ciw, ci[, ci", ci( 以及 diw, di[, di", di( 命令来快速改写/删除文本
  • 使用 @: 重复执行上一次 Ex 命令,比如 :nohl, @:, @:, @:
  • SHIFT 相当于移动加速键, w b e 移动光标很慢,但是 W B E 走的很快
  • 移动到行首非空字符时用 0w 命令比 ^ 命令更容易输入
  • 在空白行使用 dip 命令可以删除所有临近的空白行
  • 在空白区使用 viw 可以选择所有空白字符
  • 缩进时使用 >8j >} <ap =i} == 会方便很多
  • 越重复的工作,越需要努力的将其自动化
  • 编程时可以使用 [{ 和 ]} 快速在函数间移动
  • 插入模式下,当你发现一个单词写错了,应该多用 CTRL-W 这比
  • 插入模式下,CTRL-X CTRL-F 可以方便的补全当前目录的文件名
  • 插入模式下,可用 CTRL-V u 输入 unicode,如 u1234 输入16进制 unicoode
  • 插入模式下,CTRL-R = 可以用来简单计算,比如 =12*3.5/10 会插入 4.2
  • 如果在插入模式下移动光标,那么就不能使用 . 来重复之前的插入了
  • y d c 命令可以很好结合 f t 和 /X 比如 dt) 和 y/end
  • c d x 命令会自动填充寄存器 "1 到 "9 , y 命令会自动填充 "0 寄存器
  • 用 v 命令选择文本时,可以用 o 掉头选择,有时很有用
  • ca) 和 yi} 很容易记忆,但是他们等同于 cab yiB 后者很容易输入
  • 写文章时,可以写一段代码块,然后选中后执行 :!python 代码块就会被替换成结果
  • 搜索后经常使用 :nohl 来消除高亮,使用很频繁,可以 map 到
  • 搜索时可以用 CTRL-R CTRL-W 插入光标下的单词
  • Vim 有一千零一种移动光标的方法,有时候就连 H M L 也是很有用的
  • 不需要记忆上一次选择区域,'< 和 '> 可以跳到上次选择的开始和结束
  • 如需编辑同一个文件的不同地方,可以用 :vs 或者 :split 将文件分为两个窗口
  • 有六种方法来改变一个布尔设置: :set list nolist list! invlist list? list&
  • 映射按键时,应该默认使用 noremap ,只有特别需要的时候使用 map
  • 当你觉得做某事很低效时,你应该停下来,u u u u 然后思考正确的高效方式来完成
  • 用 y复制文本后,命令模式中 CTRL-R 然后按双引号 " 可以插入之前复制内容
  • 如果你想全屏阅读帮助的话,使用 :tab help 命令
  • 粘贴文本时应该思考下前后是否包含空格
  • :x 和 ZZ 命令和 :wq 类似,但是不会写入没有改变的文件,并且更快
  • 多阅读 :h index 学习新的快捷键,让你更加高效
  • Vim 帮助系统里有一个使用技巧集合,使用 :h tips 阅读
  • Windows 下的 GVim 可以用 CTRL-INSERT 和 SHIFT-INSERT 操作系统剪贴板
  • 思考题:知道下面控制代码 ^I ^M ^J ^[ ^H ^@ 分别代表什么意思么?

快捷键

  • C-o: Insert -> Insert Normal Mode

  • C-[ Normal Mode;

Visual Mode

  • gv Reselect the last visual selection

  • o Go to other end of highlighted text

窗口管理

窗口

窗口划分C-w: s v屏幕分割;

窗口移动C-w: w在窗口间进行移动;h/j/k/l焦点移动HJKL位置移动

窗口关闭C-w: c :clo 关闭激活的窗口;o :on 只保留当前窗口

窗口大小: C-w = 使窗口等大

标签页

建立

:tabe {file}在新标签页中打开文件;:tabc关闭标签页;:tabo只保留当前标签页;C-w T将当前窗口移动到新标签页中。

切换

:tabn g t 切换到下一个标签页;:tabp g T切换到上一个标签页;

重新排列

:tabmove [N] 将当前标签页移动到第 N 个;如果省略 N, 则移动到最后

Buffer

Buffer 列表

:ls列出当前激活的 buffer, 其符号含义如下

  • % 表示该 buffer 在当前窗口中;# 表示该 buffer 可用通过C-^ :e #切换。
  • a 已加载并可看见的 buffer; h 已加载但不可见的 hidden buffer
  • + 已修改的 buffer

Buffer 切换

  • <C-^在当前文件和备选文件间切换;

  • :bn :bp :bf :bl next/prev/first/last

  • :b N/name 跳转到指定的 buffer

  • :sb add s to split

  • :bdelete N1 N2 N3 删除 buffer N1 N2 N3; :N,M bdelete 删除第 N 个到第 M 个之间的 buffer.

模式

正常模式 (Normal mode)

移动

  • 词间移动:单词开头w b; 单词结尾e ge; 使用大写字符跳过标点。
  • 行间移动:0 ^ $; 使用g前缀作用于 visual line。
  • 文章移动:^b ^f 翻页;{ }段落跳转
  • 行跳转:gg G 10G
  • f t F T 搜索移动 ; , 重复

操作

  • C c$: 删除当前位置到行尾的内容 => Insert Mode
  • s S: 替换当前字符或当前行 => Insert Mode
  • R r gR gr : 替换模式;使用 g 可将 TAB 当成空格。
  • g~ gu gU: 切换大小写

在以上操作中,c d y 是“及物动词”, 也就是需要加上操作对象。

cc dd yy 作用与整行

命令

  • !: Filter {motion} lines through an external program
  • *: Search for each occurrence

帮助

  • :help w
  • :help c_CTRL-D
  • :help insert-index
  • :help user-manual

跳转

  • / ? 搜索;n N 跳转

  • C-o C-I 回到之前的位置(后退); 回到之后的位置(前进)

  • % 在匹配的括号间跳转

替换

  • :[range]s/old/new 只替换每行出现的第一个
  • :[range]s/old/new/g 全局替换
  • :[range]s/old/new/gc 替换前确认

快捷键

  • C-o 回到之前光标在的位置;
  • C-g Echoes the name and status of the current file

Insert Mode

  • C-h C-w C-u:删除操作

Visual Mode

  • C-g Switch between VISUAL and SELECT mode

自定义快捷键

  • map noremap 适用于 normal, visial, operator-pending

  • nmap nnoremap适用与 normal;

  • xmap xnoremap 适用于 visual;

  • cmap cnoremap适用于 command-line;

  • omap onoremap适用于 operator-pending

  • imap inoremap适用于 insert

    1
    2
    
    :nmap <space> :echo "foo"<cr> "为空格键定义映射
    :nunmap <space> "取消空格键的映射
    

Command mode

补全:Ctrl-D

执行 Shell 命令

  • :!command 执行 shell 命令
  • :!rm FILENAME 移除文件
  • v motion :w FILENAME 将选中的内容写入到文件中
  • :w FILENAME 将所有内容写入到文件中
  • :r FILENAME 将文件内容写入当前 buffer 中
  • :r !ls 将 shell 命令的返回结果写入文件中
  • 复制粘贴:写入剪切板:w !pbcopy :%w !pbcopy 读取剪切板 :r !pbpaste

地址和范围

使用:star, end的方式指定:[range]. 其地址的声明如下:

  • 0 1 $ .: 第 0 行、第 1 行、最后一行、当前行。

  • 'm: Line containing mark m

  • :%: 指代整个文件,:1,$的缩写

复制移动:

复制命令为copy,可缩写为co t;移动命令为move, 可缩写为m

1
2
3
4
5
:6t.# 将第 6 行内容复制到当前位置
:t6 # 将当前行复制到第六行下方
:t. # 复制当前行
:t$ # 将当前行复制到文章末尾
:'<,'>m0 # 将当前选择区域内容移动到文章开始

Register:

  • :[range]delete [x]删除;:[range]yank [x]复制;:[line]put [x]粘贴;:[range]join 合并
  • :[range]normal {commands}:Execute Normal mode {commands}
  • :[range]global/{pattern}/[cmd]:Execute the Ex command [cmd] on all specified lines where the {pattern} matches
  • 注册区域
    • ⌃r0 paste the text that just yanked.
    • ⌃r= Use expression register do simple arithmetic

替换

替换命令为:[range]s[ubstitute]/{pattern}/{string}/[flags], 它将符合{pattern}的内容替换为{string}. 该操作逐行展开。

1
:%s/content/copy/g  # 将 content 换为 copy

Untidied

Shortcut

  • <C-d>: Reveal a list of possible completions

  • <Tab>: Autocomplete commands

  • <C-r><C-w> : Copy the word under the cursor and inserts it at the command-line prompt

  • q: : Open the command-line window with history of Ex commands

  • q/ : Open the command-line window with history of searches

  • ctrl-f : Switch from Command-Line mode to the command-line window

Excute shell command

  • :!{cmd} : Execute {cmd} with the shell
  • :!bash % : Execute current bash file. % symbol is shorthand for the current file name.
  • :read !{cmd} : Execute {cmd} in the shell and insert its standard output below the cursor
  • :[range]write !{cmd} : Execute {cmd} in the shell with [range] lines as standard input
  • :[range]!{filter} : Filter the specified [range] through external program {filter}. !{motion} operator command drop us into Command-Line mode and prepopulates the [range] with the lines covered by the specified {motion}

Files

  • Buffer :
  • :args :
  • :next/prev : traverse the files in the argument list
  • :argdo : execute the same command on each buffer in the set. The [] characters indicate which of the files in the argument list is activate
  • :bufdo : Execute an Ex command in all of the buffers listed by :ls

工作目录

  • :set path+={p} 将{p}添加到工作路径;:set path+={p}/** 将所有子目录也添加到路径中;:set path-={p} 将{p}从工作路径移除;
  • :e {path}: 打开该路径的 explorer; e . :E打开当前路径的 explorer; 打开当前文件所在路径的 explorer. Sexplore Vexplore 在水平竖直方向切分,打开 explorer.
  • :edit %打开当前文件;:edit %:h 打开当前文件的路径;h修饰符去掉文件名。
Find file
:find {filename} Look up {filename} in path File explorer
Command in Explorer
- Open the parent directory.
% Open a new file (:h netrw-%)
d Make a new directory (:h netrw-d)
R Rename the file/directory under cursor
D Delete/Remove files and directories under cursor

Save file : To save a file with nonexistent directories, calling the external mkdir program by !mkdir -p %:h

Config

1
2
set backspace=indent,eol,start
set history=200

Vim Practical

  • Tips 60

  • Tips 61

  • Tips 62

  • Tips 63

  1. Register:
    • + 剪贴板 寄存器
    • " Unnamed 最近一次的复制或删除操作 (d, c, s, x, y)
    • 0 最近一次复制;
  2. m{char}添加标记; ``{char}` 跳转到标记
  3. :source $MYVIMRC reload config
1
2
3
4
5
set ignorecase "turn feature on
set noignorecase "turn feature off
set ignorecase! "toggle the setting
set ignorecase? "query current state
set ignorecase& "reset to default
updatedupdated2023-06-052023-06-05
Update https-ca.md