服务器上改配置文件,只有vim能用。
很多人的vim使用方式:打开文件 → 疯狂按i → 改完按Esc → 试各种方式退出 → :wq!
其实vim用好了效率很高。这篇分享一些实用技巧,都是原生功能,不用装插件。
先把基础搞对
模式
vim有几种模式:
- Normal模式:默认模式,用来移动和操作
- Insert模式:输入文字,按i进入
- Visual模式:选择文本,按v进入
- Command模式:执行命令,按:进入
核心思想:Normal模式才是常态,大部分时间在这个模式下。
移动
方向键能用,但hjkl更快(手不用离开主键盘区):
h - 左 j - 下 k - 上 l - 右更高效的移动:
w - 下一个单词开头 b - 上一个单词开头 e - 当前单词结尾 0 - 行首 ^ - 行首第一个非空字符 $ - 行尾 gg - 文件开头 G - 文件结尾 30G - 跳到第30行 Ctrl+f - 向下翻页 Ctrl+b - 向上翻页 % - 跳到匹配的括号进入Insert模式
别只会按i:
i - 在光标前插入 a - 在光标后插入 I - 在行首插入 A - 在行尾插入 o - 在下方新开一行 O - 在上方新开一行比如想在行尾加内容,按A比按$li少一个键。
保存退出
:w - 保存 :q - 退出 :wq - 保存退出 :q! - 不保存退出 :x - 保存退出(同:wq) ZZ - 保存退出(Normal模式下) ZQ - 不保存退出编辑操作
vim的编辑操作遵循一个模式:操作符 + 动作
操作符:
- d - 删除
- c - 修改(删除并进入Insert模式)
- y - 复制
- v - 选择
动作:
- w - 到下一个单词
- $ - 到行尾
- 0 - 到行首
- G - 到文件尾
- gg - 到文件头
- iw - 当前单词
- i" - 引号内
- i( - 括号内
组合起来:
dw - 删除一个单词 d$ - 删除到行尾 d0 - 删除到行首 dd - 删除整行 3dd - 删除3行 dG - 删除到文件尾 cw - 修改一个单词 c$ - 修改到行尾 cc - 修改整行 yy - 复制整行 3yy - 复制3行 yw - 复制一个单词 p - 粘贴到光标后 P - 粘贴到光标前文本对象
这是vim最强大的地方:
diw - 删除当前单词(不含空格) daw - 删除当前单词(含空格) di" - 删除引号内的内容 da" - 删除引号及其内容 di( - 删除括号内的内容 di{ - 删除大括号内的内容 dit - 删除标签内的内容(HTML) ci" - 修改引号内的内容 ci( - 修改括号内的内容比如有这样的代码:
print("Hello, World!")光标在引号内任意位置,按ci"可以直接修改引号里的内容。
撤销重做
u - 撤销 Ctrl+r - 重做 . - 重复上次操作点号是神器。比如删除了一行(dd),然后移到其他地方按.,又删除一行。
查找替换
查找
/pattern - 向下查找 ?pattern - 向上查找 n - 下一个匹配 N - 上一个匹配 * - 查找光标下的单词 # - 反向查找光标下的单词替换
:s/old/new/ - 替换当前行第一个 :s/old/new/g - 替换当前行所有 :%s/old/new/g - 替换全文所有 :%s/old/new/gc - 替换全文,每次确认 :10,20s/old/new/g - 替换10-20行实用场景
删除所有空行:
:g/^$/d删除所有包含某字符串的行:
:g/pattern/d在所有行末尾加分号:
:%s/$/;/删除行尾空格:
:%s/\s\+$//多文件操作
打开多个文件
vimfile1 file2 file3在vim里切换:
:n - 下一个文件 :N - 上一个文件 :e file - 打开另一个文件 :ls - 列出所有打开的文件 :b2 - 切换到第2个文件分屏
:sp file - 水平分屏 :vsp file - 垂直分屏 Ctrl+w w - 切换窗口 Ctrl+w h/j/k/l - 切换到指定方向的窗口 Ctrl+w = - 让所有窗口一样大 :only - 只保留当前窗口标签页
:tabnew file - 新标签页打开文件 gt - 下一个标签页 gT - 上一个标签页 :tabclose - 关闭标签页实用配置
在服务器上编辑~/.vimrc:
" 显示行号 set number " 相对行号(跳转方便) set relativenumber " 语法高亮 syntax on " 搜索高亮 set hlsearch " 搜索时即时匹配 set incsearch " 忽略大小写(搜索时) set ignorecase set smartcase " Tab设置 set tabstop=4 set shiftwidth=4 set expandtab " 显示匹配的括号 set showmatch " 自动缩进 set autoindent " 显示光标位置 set ruler " 允许backspace删除 set backspace=indent,eol,start " 显示当前模式 set showmode " 编码 set encoding=utf-8 " 不产生swap文件 set noswapfile " 搜索到文件末尾自动回到开头 set wrapscan复制到服务器上一次,以后都能用。
命令行技巧
执行shell命令
:!ls - 执行ls :r !date - 把date命令的输出插入到文件 :w !sudo tee % - 以root权限保存(忘记sudo vim时)宏
录制一系列操作,然后重复执行:
qa - 开始录制到寄存器a ... - 执行操作 q - 停止录制 @a - 执行宏a 10@a - 执行宏a 10次比如需要给20行都加上引号:
qa - 开始录制 I" - 在行首加引号 <Esc>A" - 在行尾加引号 <Esc>j - 移到下一行 q - 停止录制 19@a - 对剩下19行执行寄存器
vim有多个剪贴板(寄存器):
"ayy - 复制当前行到寄存器a "ap - 从寄存器a粘贴 "+yy - 复制到系统剪贴板 "+p - 从系统剪贴板粘贴标记
在文件里打标记,方便跳转:
ma - 在当前位置打标记a 'a - 跳到标记a '' - 跳回上次位置快速参考卡片
# 移动 h/j/k/l 方向 w/b 单词 0/$ 行首/行尾 gg/G 文件头/尾 Ctrl+f/b 翻页 # 编辑 i/a 插入 o/O 新行 x 删字符 dd 删行 yy 复制行 p 粘贴 u 撤销 . 重复 # 文本对象 diw 删词 ci" 改引号内 di( 删括号内 # 查找 /pattern 查找 n/N 下/上一个 :%s/a/b/g 全局替换 # 文件 :w 保存 :q 退出 :e file 打开 :sp/:vsp 分屏vim的学习曲线确实陡,但值得。
不用一下子全学会,先把基础移动和编辑搞熟,其他的用到再查。
用几次就记住了。