最好的方法就是在使用中学习,即 :help
。
vim 升级到 9 版本
-
yum list installed | grep -i vim
查看当前已安装的 vim 版本
-
sudo yum remove vim-enhanced vim-common vim-filesystem
移除老的安装 yum install gcc make ncurses ncurses-devel
- github 下载、编译、安装
https://github.com/vim/vim/archive/refs/tags/v9.0.1940.tar.gz
make distclean # if you build Vim before
make
sudo make install
vim --version 即可看到版本为 9 了。
参考
Vim Cheat Sheet:基础经典;
vimdoc.sourceforge:非常完整;
Book - Practical Vim: Edit Text at the Speed of Thought 2nd Edition
www.vim.org(请翻墙)
Vim Tips Wiki @ vim.wikia.com
vim --help
-
vim -o2
- 上下两个窗口 -
vim -O2
- 左右两个窗口 - vim 已经打开文件,切分窗口使用
press <Ctrl>+<w> then press <v>
则会在右侧开窗。 - 左右切换(在 vim 中
h
左移,l
右移)
切到左边:pressing <Ctrl>+<w> and then pressing <h>
切到右边:pressing <Ctrl>+<w> and then pressing <l>
-
diff -E -Z -b -y --suppress-common-lines old new
左右窗口对比两个文件。如何安装 diff 见 这里。
基本
- 按 "i"或"I" 进入编辑模式,编辑后按 "esc" 退出编辑模式,然后按 ":" 进入命令行模式,":wq" 保存退出 vim.
- R - 进入替换模式,和 i 模式相对应;
Enter overtype (replace) mode, where you destructively retype everything until you press ESC; - r - 替换当前字符;
- 使用 vim 打开文件,编辑了半天,要保存时发现 readonly 打开的,如何办?
Using vim to force edit a file when you opened without permissions
有 sudo 权限时:Issue:
:w !sudo tee %
. This will write the buffer to tee, a command that receives pipe information and can write to files. And as tee is run with sudo powers, tee can modify the file.`
定位
-
<num>G [enter]
- Go To that line -
: <num>[enter]
- Go To that line -
:set nu
或者: set number
设置显示行号。 -
gg
- go to the top,相当于 1 G [enter] -
G
- go the bottom,相当于 0 G [enter] -
0
- 行头 -
$
- 行尾 -
%
- {} 花括号对的查找切换,找对应的花括号(匹配花括号); -
<num>h, <num>l
:左右移动光标 num 字符; -
<num>j, <num>k
:下上移动光标 num 行;
Undo and Redo
- u:undo
- Ctrl + r:redo
Copy, cut and paste
y
- yankyy
- yank (copy) a line。<num>yy
则 yank <num> lines,如 4yy。y0
,y$
,yG
- yank to the begin of line, to the end of line,to the end of file.进入
v
模式后,选择,然后y
;
对于不太好确定边界的复制,v模式非常方便。p
- put (paste) the clipboard after cursor;
P 则插在当前光标位置(P 即 shift+p);x
- delete (cut) current character;
<num>x
:删除光标右侧的 num 字符;
<num>X
:删除光标左侧的 num 字符;d
- 删除dd
- delete (cut) a line,5dd - 删除5行。d0
,d$
,dgg
,dG
- 删除到行头、行尾、文件头、文件尾。
*i_0_CTRL-D*:0 CTRL-D Delete all indent in the current line. {Vi: CTRL-D works only when used after autoindent}
<num>dw, <num>db
:光标右侧、左侧删 num 个 word(/-#=空白分隔,何为 word 不太好讲,不常用;包括 yw, yb 在内都不常用);
df
(d f space),这是一个 自定义分隔符的简单做法;v - visual selection
visual selection, cut-and-paste or copy-and-paste
v, d
v进入visual,然后选择,然后 d 即可删除。
v, y
v, p
Working with multiple files
:e filename - Edit a file
:tabe - make a new tab (tabedit)
:r <file> 把文件 file 的内容追加到当前光标行之后;
gt - go to the next tab
gT - go to the previous tab
ctrl+wv - Split windows verticall(:vsp - vertically split windows)
ctrl+ww - switch between windows
分窗口后,使用 :e 切换文件。
:split 横向分割为上下窗口,:close,:10split 则新窗口10行。
:vsplit 纵向分割为左右窗口
Search
search forwards
/<pattern>
,Then press n to search forwards for the next occurrence, or N to search backwards, or # to search backwards./\c<pattern>
:search, case insensitive matching(不区分大小写)。/\C<pattern>
区分大小写搜索;Search backwards
?<pattern>,Pressing n searches in the same direction (backwards), while N searches in the opposite direction (forwards).Searching for the current word
Press*
to search forwards for the next occurrence of that word, or press#
to search backwards.n
next forwards,N
backwards.搜索 only whole words
the pattern begins with\<
and ends with\>
, so only whole words are found.*
和#
就是典型的 word 搜索。
Search and replace 搜索和替换
g
flag
The g flag means global,即:Replace all matches,而不是 replace the first occurrence.c
flag
The c flag means asking for confirmation.%
:in all the lines (on each line), 即搜索每一行,而不是仅仅当前行。:%s/foo/bar/gc
Change each 'foo' to 'bar', but ask for confirmation first.
/
分隔符可以改为@
或者#
等字符,但不能是|
字符,这在替换含有/
字符的字符串时很好。
:%s/\<foo\>/bar/gc
Change only whole words exactly matching 'foo' to 'bar'; ask for confirmation.`
-
:3,8 s/foo/bar/g
搜索替换第3到第8行的所有foo并替换为bar。
v 进入 -- VISUAL -- 模式
:'<,'>s/foo/bar/g
v 进入 visual 模式,选中区域后,: 进入命令行,输入s/foo/bar/g
即可。
When compiled with +visual, change each 'foo' to 'bar' for all lines within a visual selection. Vim automatically appends the visual selection range ('<,'>) for any ex command when you select an area and enter :.:'<,'>s/ /#/
visual 选中若干行,以 # 注释若干行,仅将最前面的一个空格替换为#(replace the first occurrence)。直接在行头插入 # 则 :'<,'>s/^/#/ 即可。
缩进 indent
- In command mode
you can use >> to indent a single line. 4>> will indent the current and next three lines. 可结合 . 重复操作。 - visual mode
先选中若干行,然后 >,可结合 . 重复操作。 - 使用 < 则相反方向。
- Shifting blocks visually
tab 字符转 空格 space
- set expandtab
-
set noexpandtab
:则关闭转换。 -
对文件中已经存在的 tab 字符如何转为空格 Converting tabs to spaces?
将当前文件里已有的 tab 字符全部转为 spaces::retab
;
只转当前行::.retab
;
~/.vimrc 配置文件
vim 个性设置,里面是各个 vim 命令。The vimrc file contains optional runtime configuration settings to initialize Vim when it starts.
使用 " 标识注释(comments),可以使用中文;
set number " display line number
set laststatus=2 " status line: display filename
set ignorecase " Do case insensitive matching
set tabstop=4 " ts
set shiftwidth=4 " sw
set expandtab " tab to spaces,当你键入tab时,自动转为空格。
set cursorline " highlight the cursor line
set hlsearch " highlight search: hlsearch/hls/nohlsearch/nohls
set nowrap
- Syntax highlighting in vim,通常默认支持;
:syntax enable
or
:sy enable
or
:syn enable
- c2a0 问题;
在页面上出现的代码,由于 页面字符处理转换 的缘故,经常会出现一些奇奇怪怪的东西,比如 c2a0,看起来也是一个空格,但实际上不是(空格 Space 的十六进制20),网页上使用;
奇怪字符可以使用 xxd 或者 hexdump 观察;错误提示和语法着色也能看出问题所在; - 查看当下设置
:verbose set
:verbose set ts
:verbose set shiftwidth
:verbose set all
- 查看 highlight 设置
:hi
:hi search
vim 下查看ASCII 码
:%!xxd 十六进制
:%!xxd -b 二进制/etc/vimrc
System wide Vim initializations.-
vim
vim --version