我记不住的那些vim操作2

发布时间:2023年12月18日

背景:最近在重新学习vi/vim,发现这个编辑器的用法真是太灵活了,所能掌控的也太多了,这次学习了一些之前没有学习过的内容,之前都是移动鼠标、编辑、复制、粘贴、保存等等(点我查看),本次将介绍 标签、区域、跳转、选项页、收缩/展开代码、文件浏览等。

1.标签marks

标签用于记录你当前光标的位置,这样有利于你快速返回到某个位置,但这种标签不会在屏幕上显示。文件内部的区域可以使用a-z,多个文件的区域可以使用A-Z,还有一些特殊的标签,例如:反向跳或向回跳,使用两个单引号即可 ''

比如:我们直接在某个文件的某一行mA,然后:q 然后输入vim后,然后按 'A即可打开原来的文件。

我们可以使用a-z在某个文件中做标签marks,

CommandDescription
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或等等

CommandDescription
:delm a删除标记?a
:delm a-d删除标记?a,?b,?c,?d
:delm abxy删除标记?a,?b,?x,?y
:delm aA删除标记?a,?A
:delm!删除当前buffers中的所有a-z的标记

2. 区域

'<? ?可视化选择模式下,选择区域的开始的地方

'>? ?可视化选择模式下,选择区域的结束的地方

例如:

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????

RangeDescriptionExample
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的所有行

3.跳转

在单个文件中进行跳转,这些跳转信息保存到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

4.选项页

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

5. 收缩/展开代码

收缩或展开代码的首字母都是z,从一侧看起来像折叠的报纸,这是为什么z开头。

折叠fold是一个记号,用于标记从哪一行开始到哪一行结束的区域为折叠fold,使用zf命令进行定义。

一共分为 6 种不同的折叠方式,一般默认是 手动manual 进行折叠的这种方式。

  • zd? 移除当前光标的折叠
  • zD? 递归的删除当前光标的折叠
  • zE? 移除所有的折叠
  • zo? 打开当前光标的折叠,可以看到当前的代码
  • zc? 关闭当前光标的折叠,代码将会被折叠,无法看到
  • zR 打开所有的折叠,可以看到全貌的代码
  • zM?关闭所有的折叠,可以看到最简化的文件
  • za? 对当前光标的进行打开fold和关闭fold的toggle开关
  • zO 递归的打开当前光标的折叠
  • zC?递归的关闭当前光标的折叠

我们可以输入命令:

: 1,10fold? ? ? ? ? ? ? ? //? 选择从第一行到第十行进行折叠

: 1,10foldo[pen]? ? ?//? ?从第一行到第十行将折叠进行打开,可以看到代码

: 1,10foldc[lose]? ? ?//? ?从第一行到第十行将折叠进行关闭,将代码进行折叠

或 通过 可视化方式 v或V或<C-v>进行选择,然后 zf 即可。

或? zfj? ? ? ? ? ? ? ? ? ? ? ?//? 将当前行和下一行手动设置为 折叠

zf10j? ? ? ? ? ? ? ? ? ? //? 将当前行和以下10行手动设置为 折叠

zf'a? ? ? ? ? ? ? ? ? ? ? //? ?将当前行到'a标记的行 手动设置为 折叠

6.NerdTree

安装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? ? ? ?光标左右移动

?? ? ? ? ? ? ? ? 显示帮助信息

分为 文件节点、目录节点、标签、目录树导航、文件系统、树过滤、其他快捷键

参考文献:

1. Vim documentation: fold

文章来源:https://blog.csdn.net/u010566813/article/details/134606772
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。