背景:最近在重新学习vi/vim,发现这个编辑器的用法真是太灵活了,所能掌控的也太多了,这次学习了一些之前没有学习过的内容,之前都是移动鼠标、编辑、复制、粘贴、保存等等(点我查看),本次将介绍 标签、区域、跳转、选项页、收缩/展开代码、文件浏览等。
标签用于记录你当前光标的位置,这样有利于你快速返回到某个位置,但这种标签不会在屏幕上显示。文件内部的区域可以使用a-z,多个文件的区域可以使用A-Z,还有一些特殊的标签,例如:反向跳或向回跳,使用两个单引号即可 ''
比如:我们直接在某个文件的某一行mA,然后:q 然后输入vim后,然后按 'A即可打开原来的文件。
我们可以使用a-z在某个文件中做标签marks,
Command | Description |
---|---|
ma | 在当前光标所在地方进行标记,在m是marks的缩写,而这个标记是a |
'a | 跳到a标记这行的首字母的位置,这是和反引号`a?的主要区别 |
`a | 跳到a标记这行的那一列的位置,例如:之前标记了第二行第三列,此时会回到第二行第三列 |
d'a | 删除从当前行和a标记的那个行的整个区域,包括当前行和a所指向的那行,即当前行->a标记的行的区域,或从a标记的行 到 当前行的区域 |
d`a | 删除从当前行当前列 到 a标记的那个行那个列的整个区域,或从a标记的那个行那个列到 当前行当前列?? |
c'a | 改变从当前行到a标记的那一行的内容,亦或是从a标记的那一行到当前行的内容,然后输入变更的文字即可 |
c`a | 改变从当前行当前列 到a标记的那一行那一列的内容,然后输入变更的文字即可 |
y'a | 复制当前行到a标记的那一行的内容,或a标记的那一行到 当前行 |
y`a | 复制从当前行当前列 到a标记的那一行那一列的内容,或从 a标记的那一行那一列到当前行当前列 |
:marks | 查看所有标记 |
]' | 下一个标记的那一行的行首 |
[' | 上一个标记 |
]`? | 下一个标记的那一行那一列 |
[`? | 上一个标记的那一行那一列 |
上面是以a标记进行举例,同理a-z都适用
特殊标记
`. | 跳转至当前文件的最后被修改的那一行 |
`" | 跳转至当前文件上一次退出的那一行 |
`0 | 跳转至上一次已退出的文件的 被修改的那一行 |
'' | 跳转至上一个位置的那一行 |
`` | 跳转至上一个位置的那一行那一列 |
`[ ?or?`] | 跳转到被修改或被复制的区域的开头或末尾 |
`< ?or?`> | 跳转至可视化选项的开头或末尾 |
删除标记
?:delmarks或:delm命令,其实并不需要删除,只需要重新定义即可即ma或等等
Command | Description |
---|---|
:delm a | 删除标记?a |
:delm a-d | 删除标记?a,?b,?c,?d |
:delm abxy | 删除标记?a,?b,?x,?y |
:delm aA | 删除标记?a,?A |
:delm! | 删除当前buffers中的所有a-z的标记 |
'<? ?可视化选择模式下,选择区域的开始的地方
'>? ?可视化选择模式下,选择区域的结束的地方
例如:
v进入可视化按字符的选择模式,然后j或l进行选择,此时输入 :? 会在底部看到'<,'> 代表当前选择的一个区域
:'<,'>d? ? ? ? ? ? ? ? //对所选区域进行删除
:'<,'>w abc.txt? ? //对所选区域如没有文件则新建文件并写入,如存在文件则进行强行写入到abc.txt文件中,或追加到abc.txt
:'<,'>w! abc.txt 强制写入到abc.txt
:'<,'>w>> abc.txt 追加到abc.txt
:'<,'>s/old/new/g? ? //对所选区域进行替换,由old替换为new
:1,10s/old/new/g? ? //对第一行到第十行进行替换,由old替换为new
:s/old/new/g? ? ? ? ? ?//对当前行进行替换,由old替换为new
:%s/old/new/g? ? ? ? //对所有的行进行替换,由old替换为new
:w my.txt? ? ? ? ? ? ? ? //默认是将所有行写入到my.txt中
:'a,'bs/old/new/g? ? ?//对标签a到标签b的区域进行替换,由old替换为new
:'a,'bd? ? ? ? ? ? ? ? ? ? ?//对标签a到标签b的区域进行删除
:'a,'bw abc.txt? ? ? ? ?//对标签a到标签b的区域进行写入到abc.txt
:'a,'bw >> abc.txt????//对标签a到标签b的区域进行追加到abc.txt????
Range | Description | Example |
---|---|---|
21 | 第21行 | :21s/old/new/g |
1 | 第一行 | :1s/old/new/g |
$ | 最后一行 | :$s/old/new/g |
. | 当前行 | :.w single.txt |
% | 所有行 | :%s/old/new/g |
21,25 | 从第21行到第25行 | :21,25s/old/new/g |
21,$ | 从第21行到最后一行 | :21,$s/old/new/g |
.,$ | 从当前行到最后一行 | :.,$s/old/new/g |
.+1,$ | 从当前行的下一行到最后一行 | :.+1,$s/old/new/g |
.,.+5 | 从当前行到当前行后的5行 | :.,.+5s/old/new/g |
.,.5 | 同上,从当前行到当前行后的5行 | :.,.5s/old/new/g |
:1,.-1d | 删除第一行到当前行的前一行的内容 | |
:.+1,$d | 删除当前行下一行到最后一行的内容 | |
:21,25co 30 | 复制第21行到第25行到第30行 | |
:21,25m 30 | 移动第21行至第25行到第30行 | |
:g/old/ | 列出匹配old的所有行 |
在单个文件中进行跳转,这些跳转信息保存到jumplist中,是一个栈,有点类似浏览器的前进和后退,可以通过:jumps查看栈中的跳转信息。
ctrl-o? 将光标向上跳
ctrl-i? ?将光标向下跳,或使用tab键
:jumps? ?????????????????查看跳转列表
:clearjumps? ? ? ? ? ?清除跳转列表
注意: 普通的hjkl不会被记录到jumplist中,同时 底部输入命令: 42回车像这种也不会被记录到jumplist中
还有哪些能修改jumplist呢?
第一种是: 搜索或查找? ?/pattern 从当前行向下面查找?或? ??pattern从当前行向上面查找
第二种是: *或#,用于查找当前这个词汇,*向下进行查找,#向上进行查找
第三种是: %? ? ?可以在大括号、中括号之间进行跳转
第四种是:Any inter-file navigation like?gf
我们通过执行 :jumps 来查看当前的跳转列表,如图所示:
我们当前处于 第33行第0列,此时我们想跳到第12跳,向上是<C-o>,向下是<C-i>
此时我们直接输入? 12<C-o>即可跳到了 第1行第0列? BSD
12代表跳转的号码,同理 向下跳也是一样的。 1<C-i> 即可跳到 第2行第19列,Version 3,29 June 2007
vim -p abc.txt xyz.txt? 同时在不同的标签中打开多个文件
:tabnew? ? ? ? ? ?? ? ? ? ? ? ? ?// 创建一个新的空白的未命名的标签
:tabnew filename? ? ? ? ? ?//? 在标签中打开一个filename文件
:tabe[dit]? ?filename??? ? ?//? 在一个新的选项卡打开filename文件
:tabf[ind]? ?filename??? ? ?//? 在一个新的选项卡找filename然后打开filename
:tabnext? ? ? ? ? ? ? ? ? ? ? ? ?//? 切换到下一个选项卡,或快捷键gt
:tabprev? ? ? ? ? ? ? ? ? ? ? ? ?//? 切换到上一个选项卡,或快捷键gT
:tabfirst? ? ? ? ? ? ? ? ? ? ? ? ? //? ?切换到第一个选项卡
:tablast? ? ? ? ? ? ? ? ? ? ? ? ? //? ? 切换到最后一个选项卡
:tabclose? ? ? ? ? ? ? ? ? ? ? ? //? 关闭当前选项卡
:tabc[lose]? ?n? ? ? ? ? ? ? ? ?//? 关闭选项卡n,从1开始,tabc是缩写
:ntabc? ? ? ? ? ? ? ? ? ? ? ? ? ? //? ?或是先输入 n 然后关闭选项卡
:tabo[nly]? ? ? ? ? ? ? ? ? ? ? ? //? 只保留当前选项卡,关闭其他选项卡? ? ? ? ?
ngt? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//? ?切换到第n个选项卡,无需输入:,从1开始
:tabs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //? ?查看所有的选项卡
:tabm[ove]? n? ? ? ? ? ? ? ? ?//? ?将当前选项卡移动到第n个位置
:help tab-page-intro
:tabdo %s/foo/bar/g
收缩或展开代码的首字母都是z,从一侧看起来像折叠的报纸,这是为什么z开头。
折叠fold是一个记号,用于标记从哪一行开始到哪一行结束的区域为折叠fold,使用zf命令进行定义。
一共分为 6 种不同的折叠方式,一般默认是 手动manual 进行折叠的这种方式。
我们可以输入命令:
: 1,10fold? ? ? ? ? ? ? ? //? 选择从第一行到第十行进行折叠
: 1,10foldo[pen]? ? ?//? ?从第一行到第十行将折叠进行打开,可以看到代码
: 1,10foldc[lose]? ? ?//? ?从第一行到第十行将折叠进行关闭,将代码进行折叠
或 通过 可视化方式 v或V或<C-v>进行选择,然后 zf 即可。
或? zfj? ? ? ? ? ? ? ? ? ? ? ?//? 将当前行和下一行手动设置为 折叠
或 zf10j? ? ? ? ? ? ? ? ? ? //? 将当前行和以下10行手动设置为 折叠
或 zf'a? ? ? ? ? ? ? ? ? ? ? //? ?将当前行到'a标记的行 手动设置为 折叠
安装NerdTree,我是在vim8版本及以上进行安装:
git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/vendor/start/nerdtree
vim -u NONE -c "helptags ~/.vim/pack/vendor/start/nerdtree/doc" -c q
然后再.vimrc 中设置快捷键
nnoremap <C-t> :NERDTreeToggle<CR>
这样<C-t>就能快速呼出NerdTree,而不用手动再输入:NERDTreeToggle了。
<C-w>h? ? ? ? 光标向左移动
<C-w>l? ?? ? ? 光标向右移动
<C-w>w? ? ? ?光标左右移动
?? ? ? ? ? ? ? ? 显示帮助信息
分为 文件节点、目录节点、标签、目录树导航、文件系统、树过滤、其他快捷键
参考文献: