vim编辑器很强大,熟练掌握对提升效率很有帮助。

文章目录

  • ​​最基本​​
  • ​​进阶​​
  • ​​不小心搞错了怎办​​

  • ​​分类​​
  • ​​vim移动和定位​​
  • ​​vim插入​​
  • ​​复制,粘贴,剪切,删除​​
  • ​​删除​​
  • ​​其他​​
  • ​​vim缩进​​
  • ​​vim​​
  • ​​vim​​
  • ​​vim​​
  • ​​vim宏定义​​
  • ​​vim多行插入​​
  • ​​vim -c rm a2.txt a.txt​​
  • ​​报错: Swap file ".aaa.sql.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:​​
  • ​​vim寄存器 (小高端,有些难度,且用到的不多)​​
  • ​​创建寄存器:​​
  • ​​只读寄存器:​​
  • ​​vim标记:​​
  • ​​vim安装emmet插件:​​
  • ​​vim分屏​​

最基本

别的不说,会这3个基本就能操作vim了。

i 插入(慢点没关系额,我就用光标移动和退格键,照样完成功能)
:wq 保存
:q! 不保存,强制退出

进阶

场景:删除4行内容,并插入复制的内容
难道还是按 ​​​i​​​,然后退格删么?
当然不。
4dd | o | shift+insert ,完成。
解读:

4dd  光标处向下删除四行
o 光标处,向下插入空行
shift+insert 粘贴命令(shell界面中)

不小心搞错了怎办

改了半天,突然误删2行,怎办呢?
:q! 强制退出吗? 那之前改的都丢了。

莫要着急,一个 ​​u​​​ 键搞定。
u键是单步撤销。 多按几次即可多步撤销。

分类

vim移动和定位

j 下
l 右
h 左
k 上
0,$ 行首 0和g0的区别: g0是回到屏幕的行首,不算折行
^ 行尾
( 句首
) 句尾
{ 段首,向上找空行
} 段尾,向下找空行
gg 首行 2gg 第二行
G 尾行 2G 第2行
w 下个单词词首
W 下个长单词词首
b 上个单词词首
B 上个长单词词首
e 下个单词词尾
E 下个长单词词尾
ge 上个单词词尾
gE 上个个长单词词尾
| 第几列 一般是字符 N
f a 向前找某个字符 N
F a 向后找某个字符 N
t a 向前找某个字符之后的位置 N
T a 向后找某个字符之后的位置 N
; 重复之前的fFtT查找 N
, 反向重复之前的fFtT查找 N


ctrl+b 向上翻页
ctrl+f 向下翻页
ctrl+u 上翻半页
ctrl+d 下翻半页
ctrl+e 上翻一行
ctrl+y 下翻一行

vim插入

i 当前字符前插入      和y,c一起的时候表示符号内的所有内容
a 当前字符后插入 和y,c一起的时候表示整个单词
A 行首插入
I 行尾插入
o 向下插入新行
O 向上插入新行

复制,粘贴,剪切,删除

y 可视模式选中后按y  复制选中的内容
yy 复制当前行 2yy 复制2行 注:yy 没有2,4yy这样的语法
y+定位符 复制到某个位置 yw yb y0 y$ y2l(向右复制2个字符) y2j(向下复制2行,共3行) y)不能用 y}(复制到段尾)
yaw 复制光标所在单词
p 当前位置后粘贴
P 光标前粘贴

删除

x
X
del
d
dd
D
J 合并行

其他

ctrl+] 查看光标处文档
ctrl+t 跳回

ctrl+w,w 切换窗口 :sp 水平切分窗格, vsplit 垂直切分窗口 :q 关闭窗口
Normal mode command (nothing) :help x
Insert mode command i_ :help i_<Esc>
Command-line command : :help :quit
Command-line editing c_ :help c_<Del>
Vim command argument - :help -r
Option ' :help 'textwidth'
s 删除n并插入 3s 感觉c和s很像啊 区别是什么呢??
R 替换模式
:3d5 从3行开始 删除5行
c 也是insert
cc 删除行 并开启插入
vi(vim)编辑器
vi删除命令: d其实是剪切命令
dd删除当前行
d$删除到行尾
d^删除到行首
nd删除几行(从当前行开始)
dw删除光标之后的单词
db删除光标之前的单词
x向右删除一个字符 4x 删除多个
X向左删除一个字符 5X 删除多个
5x 删除5个字符
5X 删除5个字符
shell 经常卡死 ctrl+q解锁
:ls 查看vim当前打开的文件
ga 查看选中ascii码(注意,不用冒号)
* 搜索光标所在单词(不是字母) 向下搜索
# 搜索光标所在单词(不是字母) 向上搜索
g8 查看utf8码

vim缩进

> 右缩进
>> 右缩进
<< 左缩进
< 左缩进
4>> 多行缩进 (不要用visual-block模式)
=% 缩进括号内的内容
如果要首选多行缩进,也可以用visual模式

vim

:r c.txt       r和r!的区别是:   r后面接文件名   r!后面加命令
:r!date 执行命令并将结果插入到文件中 r是read
:r!ls 插入 目录文件列表到文件
:read !ls #和r !ls一样
G=gg 跳转到某行
gg # 首行 2gg 表示跳转到第二行
G # 尾行 2G 表示跳转到第二行
:%y 复制所有,只是在vim中复制,按p粘贴
:1,3y 多行复制
:r!date 插入日期
a,i,o: a 当前字符后插入文本 ,i当前字符前插入文本,o 下一行添加文本,O 上一行添加文本
A,I,O I 单词前插入 A 单词后插入 O 行前插入
ZZ 保存并退出,相当于wq 注意大写
less:
:read a3.txt 读取a3.txt内容并插入到当前文件
R 替换模式
guu 行小写
gUU 行大写
~ 转换大小写
ga 查看字符ascii码
gu 查看字符utf8码
gf 查看引用的文件 例如在.sh文件中 source ./date.sh
- 上一行开头
+ 下一行开头
v 进入vi编辑器
h 显示帮助
:%s/\s+//g 替换空格为空 %s会匹配所有行
:%s/cccc//gn vim 显示匹配的个数
u 是撤销
ctrl+r 撤销
g; 最近一次编辑的位置
set nu 或者set number 显示行号
set textwidth=10 #一行10个字符 多个单词才会换行
set nonu 或者 set nonumber 不显示行号
set ignorecase
set noignorecase
set list 显示不可见字符SDDDDDD 要隐藏的话使用 set nolist

vim

搜索: / 输入字符,enter   n向前 N 向后
? 输入字符,enter n向后,N向前

开头输入内容: :s/^/sadfsafsa s表示替换 %表示当前行
结尾输入内容: :s/$/adfadfasdf
全局查找替换: :%s/aaa/ccc/g # 百分号是全局查找替换
当前行查找替换: :s/aaa/ccc/g
linux 总是在光标前插入 总是在光标前插入 linux 总是在光标前插入
shift +insert 开头插入
. 点号 重复上次操作
& 重复上次替换操作
@a 重复宏 @@ 重复上次宏
:h . 查看.号的用法

vim

25s/ddd/ccc    25行  替换内容     语法为ns/ddd/ddd  n是第几行
1,10s/ddd/ccc/g 1-10行 替换内容 并不是从当前行开始 是绝对行数
%s/datetime/ccc/g 所有行替换内容
撤销 u 撤销的尽头是already at oldest change 是最老的版本
重做 ctrl+r 恢复的尽头是already at newest change 是最新的版本
:! 外部命令 执行结束之后, 再次按enter即可回到 vim
m,nw !cmd 如 1,2w ! echo
yum -y install vim-enhanced vim扩展
:x 和 :wq :x 在内容没有改变的情况下不会修改时间
vim使用鼠标: :set mouse=a a表示所有模式
永久使用鼠标: 用户目录下新建.vimrc 文件,输入 ::set mouse=a 保存
vim自定义tag长度: 编辑/etc/.vimrc 输入 set tabstop=4 并且 set shiftwidth=4

vim全选 ggVG VG是大写 这个是全选 但是如何复制出来啊 ??
visual,visual-line,visual-block v可以用光标选,V可以选行,ctrl+v可以选行和列
X(删除光标前,同backspace,backspace不能在普通模式下使用) x(删除光标所在位置,同delete) 删除单个字符
d和x和退格? d是通用删除命令,最慢 x同delete 退格必须编辑模式才可以用
:e a2.txt vim中进入其他文件
:wq! a3.txt 另存为其他文件
:saveas new.txt #另存为其他文件
p和P p是光标后粘贴 P 光标前粘贴

vim宏定义

宏定义的例子:
qa 出现recording,表示开始录制宏,
按dd,再按dd 执行2次删除行的操作
q 退出宏,recording消失 表示录制完毕
然后 @a 可以发现删除了2行

vim多行插入

ctrl+v    # 块模式
10j #向下选择10行
I # 行前插入
-- # 插入2个--
esc  #多行插入

vim -c rm a2.txt a.txt

报错: Swap file “.aaa.sql.swp” already exists! [O]pen Read-Only, (E)dit anyway, ®ecover, (Q)uit, (A)bort:

删除swp即可: rm -rf .*.swp 或者rm -rf .*.*.swp 点号不能用*代替

vim寄存器 (小高端,有些难度,且用到的不多)

:reg 0     最近一次复制的内容
:reg 1 最近一次删除的内容
:reg 2 最近一次删除的内容
:reg * 查看所有寄存器 其实直接reg就行 \*(这里其实是*,但是md需要转义)好像不对
'"'2p 双引号+寄存器名+命令 是调用寄存器 调用寄存器 直接"2p
直接按p 调用最近删除的数据
pa 表示开始寄存器,再按p表示结束寄存器
@a 调用a寄存器(这是宏)
@@ 调用上次寄存器(其实是宏)
ctrl+p 或者ctrl+n 自动提示(自动提示的时候是在输入的时候用到的)
自定义寄存器: "字母+ 然后输入命令即可 如2dd ,yy等

创建寄存器:

"gdd  可以创建寄存器  后面一定要跟可以存到剪切板的命令   例如dd  yy是不可以的
调用自定义寄存器: 语法 "+字母+编
"ny 复制当前内容 n是字母
"nyy 复制当前行 n是字母
"np 复制名称为n的寄存器 n是字母
10yy 从当前行复制10行,然后按p在光标处粘贴
"a 和@a的区别 "a是获取寄存器的string内容,@a是执行寄存器的命令

只读寄存器:

":p   最近缓存的命令      是命令不是数据
".p 最后insert的文本
".% 文件的名字
".# 在会话中使用的名字

vim标记:

ma   标记当前位置为a(创建标记)  语法m+a
`a 或者 'a 都可以 调用标记 语法为 `+a
:marks 打印所有active marks,不知道这个active是什么意思

vim安装emmet插件:

cp plugin/emmet.vim ~/.vim/plugin/

vim分屏

上下分屏: split
左右分屏: vplit