Vim 常规教程

vim 入门到进阶

vim 有四种使用模式

  • 编辑模式, 按ESC切换
  • 写入模式, 在编辑模式 按 a i 切换
  • 可选模式, 在编辑模式 按v V 切换
  • 命令模式, 在编辑模式 按: 切换

编辑模式

vim newtext.txt # bash命令下,如果当前没有文件则会新建一个空文件.
:e /home/alice/newtext.txt # vim 命令模式下打开文件.
:w ... # 写入文件
:q ... # 退出文件
:q! ... # 强制退出文件,修改文件但未保存会有提示,强制退出则不提示.
:wq ... # 保存并退出文件,加!可强制保存退出.
/ xxx # xxx是字符串, 寻找字符串,n 或 N 上下查询.
. # 重复上一次的操作

编辑文件

[插入] 在编辑模式下输入
A 光标输入
a 光标输入
i 输入
I 输入
o 上一行输入
O 下一行输入
[修改] 在编辑模式下输入
R 修改整行内容
r 修改单个字符
g~ 反转大小写
gu 转换为小写
gU 转换为大写
[缩进] 在编辑模式下输入
> 增加缩进
< 减小缩进
= 自动缩进
[删除] 在编辑模式下输入
x 删除光标字符,向后删除
X 删除光标字符,向前删除
dd 删除整行
`d [删除] 在编辑模式下输入
--------------------------- -----------------------------------
x 删除光标字符,向后删除
X 删除光标字符,向前删除
dd 删除整行
删除光标的字符
d0 删除光标的字符
dG 删除光标至文件尾的字符
dgg 删除光标至文件首的字符
n dd n代表数字,代表向光标下删除多少行
[复制] 在编辑模式下输入
yy 复制整行
y$ 复制光标的字符
y0 复制光标的字符
yG 复制光标至文件尾的字符
ygg 复制光标至文件首的字符
n yy n代表数字,代表向光标下复制多少行
]y 指令快速将选定的文本复制到系统剪贴板
[粘贴] 在编辑模式下输入
p 粘贴
P 粘贴
ddp 剪切整行
注: 被删除的字符会在缓存内,可以粘贴删除的字符,相当于剪切
+p 将系统剪切板粘贴, 在写入模式下快捷键: Ctrl+r +
*p 将X11主剪切板粘贴
[恢复] 在编辑模式下输入
u 恢复上一次操作
Ctrl+r 重做
# 通过在.vimrc中进行如下设置来启用持久性撤销。
:set undofile
# 不过,这会在系统中为每个被编辑过的文件保留一个撤销历史记录文件,显得有些混乱。也可以将这些文件保存在同一个目录中,配置如下所示。
# 为所有文件设置持久性撤销
set undofile
if !isdirectory("$HOME/.vim/undodir")
  call mkdir("$HOME/.vim/undodir", "p")
endif
set undodir="$HOME/.vim/undodir"

查询文件

[查找] 在编辑模式下输入
/ 字符串 n向下搜索,N向上搜索
. 重复上一次操作
* 查询相关单词,n 下一个,N上一个
*nn 会遍历完所有的匹配项,从而跳回到本次查找的起点

可选模式

  Vim的可视模式(visual mode)支持文本的任意选择(通常用于执行某些操作)。如果需要选择的文本不属于已定义的文本对象(单词、句子和段落等),则这个模式非常有用。进入可视模式有以下几种方式。

  一旦进入可视模式,读者可以通过常用的移动命令来移动光标,从而扩展选择范围。

[选择文本]
v 进入字符可视模式(状态栏标文本--VISUAL--
V 进入行可视模式(状态栏标识文本--VISUAL LINE--
Ctrl+v 组合键进入块可视模式(状态栏标识文本--VISUAL BLOCK--
gv 重选上次高亮选区

注释

  根据语法注释,这里主要是批量注释。Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // #,输入完毕之后,按两下 ESC,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。

  取消注释:Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。

输入模式

[移动] 在输入模式操作
h 左移一列
l 右移一列
j 下移一列
k 上移一列

命令模式

[行号] 命令模式下输入 全称
set nu set number 打开行号
set nonu set nonumber 关闭行号

颜色

  可以尝试其中一种配色主题,方法是输入:colorscheme,然后按Enter键;也可以在所有可用的配色主题之间循环切换,方法是输入:colorscheme,然后输入一个空格,并多次按Tab键。第7章中有更多关于Vim的配置和配色的介绍,届时读者可以拥有完全属于自己的Vim。

  Vim 8自带如下主题配色。

[颜色] 命令模式下输入
blue darkblue default delek desert elflord
evening industry koehler morning murhpy pablo
peachpuff ron shine slate torte zellner

折叠

  需要在.vimrc文件中将foldmethod设置为indent,设置代码如下。

set foldmethod=indent

  不要忘记重新加载~/.vimrc,方法是重启Vim或在Vim中执行:source $MYVIMRC命令。将foldmethod设置为自动类型(如indent)会默认将所有文件折叠。

  输入za可切换折叠状态(打开关闭的折叠或关闭打开的折叠)。输入zRzM分别用于同时打开和关闭所有折叠。

  设置折叠方式的方法为在.vimrc文件中加入set foldmethod=<折叠方法>

  • manual:手动折叠,这种方法对于长文本而言并不适用。
  • indent:基于缩进的折叠,这对于依赖缩进的编程语言非常合适(不管哪种语言,标准的编码风格中总是会采用某种一致性的缩进。因此,当读者想要快速隐藏不关心的代码时,indent折叠方式不失为一种高效率的选择)。
  • expr:基于正则表达式的折叠。如果读者想要用复杂的规则来定义折叠,那么可以选择这种方式。
  • marker:使用文本中特殊的标记来定义折叠,比如{{{和}}}。这种方法对于管理很长的.vimrc文件非常有效,但是在Vim之外不常用,因为这种方式需要修改文件内容。
  • syntax提供了可识别语法的折叠,但它并非对所有语言都开箱即用(不支持Python)。
  • diff:当Vim处于diff模式时会自动采用这种折叠方式,diff模式下需要展示两个文件的不同之处,而相同之处往往需要隐藏起来

替换

  : 1,$s/word1/word2/gc: %s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!,如果将命令后的c不写,则不需要用户确认。

打开

  编辑一个目录时(如用:e .命令打开当前目录),实际上打开的是Netrw

  通过Netrw,读者可以在工作区中看到所有的文件。虽然Netrw已经在顶部的状态栏中列出了几个常用的快捷键,但是下面的几个主要功能键还是需要了解一下。

命令 说明
Enter 用于打开文件和目录
- 进入上一层目录
D 删除一个文件或目录
R 重命名一个文件或目录
: edit . 打开文件管理,并显示当前目录,可缩写: e .
: Explore 打开文件管理,并显示活动缓冲区所在的目录

  Netrw的窗口也可以在分割窗口或标签页中打开。

命令 说明
: Vex 以左右分割方式打开Netrw
: Sex 以上下分割方式打开Netrw
: Lex 以左右分割方式打开Netrw,当前Netrw窗口位于最左边,且高度占满整个屏幕
% 表示该缓冲区位于当前窗口中
a 表示该缓冲区处于活动状态,即它已被加载并可见
line 30 表示当前光标位置
: b 1 返还指定缓存文件。命令中的空格可以省略,得到简化版的命令:b1
1 为缓冲区编号,在整个Vim会话中,它的值保持不变
2 保存
3 退出
4 缓存区文件
5 多文件
6 组合文件
7 比较文件
8 资源管理器
"xxxxx" "xxxx"为文件名

分屏

  使用如下命令将窗口分割成两个,其中一个显示新的文件。

命令 说明
: split file 上下分割, split命令可以简化为: sp. 或者快捷键: Crtl+w,s
: vsplit file 左右分割,:vs是:vsplit的简化版. 或者快捷键:Crtl+w,v

切换

  为了使光标能在不同窗口间移动,先按Ctrl+w组合键,然后输入一个方向键:hjkl中的一个或键盘方向键。

移动

  窗口命令的快捷键都要先按Ctrl+w组合键,后面跟一个大写的方向键(HJKL中的一个),当前窗口会被移动到相应的位置。

命令 说明
Ctrl+w,w组合键 在窗口之间循环切换
Ctrl+w,H组合键 将当前窗口移动到屏幕的最左边
Ctrl+w,J组合键 将当前窗口移动到屏幕的底部
Ctrl+w,K组合键 将当前窗口移动到屏幕的顶部
Ctrl+w,L组合键 将当前窗口移动到屏幕的最右边
Ctrl+w,=组合键 使所有窗口等宽,等高
Ctrl+w,_组合键 最大化活动窗口的高度
Ctrl+w,` `组合键
N Ctrl+w,_组合键 把活动窗口的高度设为N
N Ctrl+w,` `组合键

  使用Ctrl+w,r组合键将当前行或当前列(行优先于列)中的每个窗口的内容向右或向下移动。使用Ctrl+w,R组合键则以相反的方向执行类似的操作。

  · 使用Ctrl+w,x组合键将当前窗口与下一个窗口的内容交换(如果当前窗口是最后一个,则与前一个交换)。

关闭

  • 使用Ctrl+w,q组合键关闭当前窗口。
  • 使用: q命令关闭窗口并卸载缓冲区;不过,当只有一个窗口打开的时候,这会导致退出Vim。
  • 使用Ctrl+w,c组合键关闭活动窗口
  • 使用: bd 命令删除当前缓冲区,并关闭当前窗口。
  • 使用Ctrl +w,o合键(或: only,或: on命令)关闭除当前窗口之外的所有窗口。
  • 当打开了多个窗口时,可通过: qa命令关闭所有窗口并退出。也可以结合: w命令,即: wqa,它会先保存所有打开的文件,再退出Vim。

终端

  进入终端模式的命令如下。

进入终端模式的命令如下
: terminal : terminal命令可简化为: term
在Shell中执行程序
:! ls ls 是shell自带的程序,再按Enter键返回
:shell 进入shell,exit返回, 或者 Ctrl+d
批量修改
:%s/AAA/BBB/g  # 批量将AAA转换为 BBB

管理员写入

  是不是经常会忘了使用sudo命令而重新配置文件, 而这个方法就是专门处理这个问题的.

:w !sudo tee % > /dev/null

  tee程序将以sudo权限运行,也就是说它拥有写/etc/hosts 文件的权限,在 Vim 命令行中,% 符号具有特殊含义。它会展开成当前文件的完整路径.

  :tee/你的文件 > /dev/null这条命令会把缓冲区的内容当作标准输入,并用它来覆盖你的文件的内容。

批量插入

  Image 16

  1. Ctrl+v,jj$
  2. A ;
  3. Esc

常用命令

packloadall 加载所有插件
silent! helptags ALL 为所有插件加载帮助文档
syntax on 支持语法高亮显示
filetype plugin indent on 启用根据文件类型自动缩进
set autoindent 开始新行时处理缩进
set expandtab 将制表符Tab展开为空格,这对于Python尤其有用
set tabstop=4 要计算的空格数
set shiftwidth=4 用于自动缩进的空格数
set backspace=2 在多数终端上修正退格键Backspace的行为
colorscheme murphy 修改配色
set nocompatible 与Vi不兼容
syntax on 语法高亮
set autoindent 沿用上一行缩进
set autoread 从磁盘自动重载文件
set backspace=indent,eol,start 现代编辑器的退格键行为
set belloff=all 禁用错误报警声
set cscopeverbose 详细输出cscope结果
set complete-=i 补全时,不要对当前被包含的文件进行扫描
set display=lastline,msgsep 显示更多消息文本
set encoding=utf-8 设置默认编码
set fillchars=vert:|,fold: 分隔字符
set formatoptions=tcqj 更直观的自动格式化
set fsync 调用fsync()实现更健壮的文件保存
set history=10000 最大的历史记录数
set hlsearch 搜索结果高亮显示
set incsearch 搜索时边输入边搜索、并移动光标
set langnoremap 避免出现映射崩溃的情况
set laststatus=2 总是显示状态栏
set listchars=tab:>\ ,trail:-,nbsp:+ :list时一些特殊字符的显示
set nrformats=bin,hex 的支持
set ruler 在状态栏角落里显示当前行位置信息
set sessionoptions-=options 不同会话不共享选项
set shortmess=F 文件信息少显示一些
set showcmd 在状态栏中显示最后一条命令
set viminfo+=! 为多个会话保存全局变量
set sessionoptions-=options 不同会话不共享选项
set tabpagemax=50 -p选项能够打开的最大数目的标签页
set tags=./tags;,tags 用于搜索标签的那些文件名
set ttimeoutlen=50 按键序列中等待下一个的时间,单位为毫秒
set ttyfast 要求实现快速的终端连接
set wildmenu 增强命令行补全功能

按键

  命令的重映射。

  Vim支持将某些键映射为其他键,:map和:noremap提供了这样的功能。

  • :map 用于递归映射。
  • :noremap 用于非递归映射。
  • :nmap和:nnoremap用于编辑模式。
  • :vmap和:vnoremap用于可视和选择模式。
  • :xmap和:xnoremap用于可视模式。
  • :smap和:snoremap用于选择模式。
  • :omap和:onoremap用于操作待决模式。
  • :map!和:noremap!用于写入和命令行模式。
  • :imap和:inoremap用于写入模式。
  • :cmap和:cnoremap用于命令行模式。

  这意味着经:map重映射的命令可以识别自定义映射,而:noremap则针对系统默认映射。

  决定创建一个新映射时,最好先确认一下此键或按键序列是否已经被映射为其他用途了。内置的按键绑定列表可通过:help index命令查看。而:map命令则可以查看插件和读者自定义的映射。比如,:map g将显示所有以g键开头的映射。

  比如,在.vimrc文件中将按如下方式自定义映射。

  如果想显式移除自定义或插件定义的映射,可使用:unmap命令。还有一个重要选项是:mapclear,它会将读者定义的映射和默认映射都清除掉。

  你还可以在映射中使用特殊字符和命令,比如下列代码。

  "noremap <C-u> :w " 使用<Ctrl-u>来保存文件(u表示更新)

  上述例子中,表示Ctrl+u组合键。Vim中的Ctrl修饰符表示为,其中为某个字符。其他修饰符键也用类似的方式表示。

  · 表示Alt键加上某个键,比如表示Alt+b组合键。

  · <s-_>表示Shift键加某个键,比如表示Shift+f组合键。

  注意,命令后面接表示回车(Enter键)。如果没有按Enter键,则命令虽然输入了,却不会被执行,读者会停留在命令行模式下(除非读者希望如此)。

  另外,这里还列出一些可能用得上的特殊字符。

  • 表示空格。
  • 表示Esc键。
  • 表示Enter键。
  • 表示制表符Tab键。
  • bs表示退格键。
  • 表示箭头键。
  • 表示上下翻页键。
  • 表示12个功能键。
  • 分别表示Home、Insert、Delete和End键。

  你还可以将一个键映射为(无操作no operation的缩写),表示这个键不起任何作用。有时候,读者希望习惯使用hjkl风格的光标移动方式,而禁止自己使用箭头键,这个映射此时会派上用场。读者可以在.vimrc中加入如下配置。

  禁止箭头键功能,使自己习惯hjkl风格

  • map
  • map
  • map
  • map

插图

  






相关连接

官网手册

Nvim 文档:帮助 (neovim.io)

VIM: [help] (sourceforge.net)

主页 | SpaceVim

Vimhelp_txt.pdf 提取码:GnTt

posted @ 2022-05-31 08:15  edolf  阅读(280)  评论(0编辑  收藏  举报