Vim重复命令

.命令

.命令用于”重复上次的修改”,可以通过:h .来查看其更多用法,实际上.命令是一个微型的宏:从进入插入模式的那一刻起(例如输入i),直到返回普通模式为止(输入),Vim会记录每一个按键的操作.做出这样的一个修改后再通.命令的话,它将会执行所有这些按键的操作.

可重复的操作

目的 操作 重复 回退
做出一个修改 {edit} . u
在行内查找下一个指定字符 f{char}/t{char} ; .
在行内查找上一个指定字符 F{char}/T{char} ; .
在文档中查找下一处匹配项 /pattern<CR> n N
在文档中查找上一处匹配项 ?pattern<CR> n N
执行替换 :s/target/replacement & u
执行一系列修改 qx{changes}q @x u

dd: 删除一行;

u:撤销上次操作;

>G:增加从当前行到文档末尾处的缩进层级;

a: 在当前光标之后添加内容;

A: 在当前行的结尾添加内容;

s:先删除光标下的字符,然后进入插入模式.比如我们要将+argument修改为+ argument,那么就可以执行s + <Esc>.

f:查找下一处指定字符出现的位置,比如f+会查找加号出现的位置;而;会重复上次f命令所查找的字符;’,’命令会反方向炒作`f``所查找的字符.

*:查找当前光标下的单词:光标会跳到下一个匹配项,所有出现这个词的地方都会被高亮(如果没有高亮,执行:set hls)

cw: 删除从光标位置到单词结尾见的字符,并进入插入模式.

普通模式

反向删除

正向删除

db命令会删除从光标起始位置到单词开头的内容,但会留下起始的字符,比如nigh单词中,如果光标处于h位置,name通过db操作后,最后会留下h.

命令模式

在按下:键时,Vim会切换到命令行模式.在此模式下执行的命令成为ex命令,可以用ex命令读写文件(:edit和:write),创建新的标签页(:tabnew),分割窗口(:split)等,更多使用查阅:h ex-cmd-index.

大多数ex命令可以指定操作范围.,常见的ex命令如下所示:

命令 用途
:[range]delete [x] 删除指定范围内的行[到寄存器x中]
:[range]yank [x] 复制指定范围内的行[到寄存器x中]
:[line]put [x] 在照顾度不够刚归一粘贴寄存器x中的内容
:[range]copy {address} 把指定范围内的行拷贝到 {address} 指定的行之下
:[range]move {address} 把指定范围内的行移动到 {address} 指定的行之下
:[rage]join 连接指定范围的行
:[range] normal {commands} 对指定范围内的每一行执行普通模式命令 {commands}
:[range]substitute/{pattern}/{string}/[flags] 把指定范围内出现{pattern}的地方替换为{string}
[range]global/{pattern}/[cmd] 对指定范围内匹配{pattern}的所有行执行ex命令{cmd}

选中行/范围

跳转到指定行

如果输入一条只包含数字的ex命令,那么vim会把它解析城一个地址,跳转到该数字指定的行上.

# 跳转到低三行,并显示该行内容
:3p

上述命令实际是哪个是吧:3:p两条命令合起来.

使用地址指定范围

:{start},{end}: {start}和{end}分别表示起始地址.需要注意,除了使用行号作为地址外,也能使用查找模式或是位置标记作为地址.

符合.表示当前行地址,比如.,$p表示从当前位置到文件末尾的所有行.符号%在命令模式下又特殊含义,表示当前文件的所有行.:%p:1,$p是等价的,都是显式所有行.

用高亮选区指定范围

当使用选择模式选中范围后,再按:,命令行上会预先填充一个范围:'<,'>,在这里'<表示高亮选区首行的位置标记,'>则表示高亮选区的最后一行.

用模式指定范围

在该模式下也接受以模式作为一条ex命令的地址,比如:/<html>/,/<\html>/p.

使用偏移地址

:{address}+n,n被省略表示偏移量为1.{address}可以是行号,位置标记或者查找模式.比如想对当前行开始的特定几行执行ex命令:

:2
:.,.+2p

最终相当于执行了:2,5p.

常用符号

符号 地址
1 文件的第一行
$ 文件的最后一行
0 虚拟化,位于文件第一行上方
. 光标所在行
‘m 包含位置比较m的行
‘< 高亮选区的起始行
‘> 高亮选区的结束行
% 整个文件(:,$的简写形式)

复制/移动指定行

复制

:copy命令可以让我们吧一行或者多行从文档的一部分复制到另一部分,格式为:[range]copy {address}.可以简写为:co,该命令也等价于:t(理解为复制到,即copy To更好记).

:6copy. 							# 复制第6行到当前行下
:6t.
:t6										# 把当前行复制到第6行下方
:t.										# 类似yyp,为当前行创建副本
:t$										# 把当前行复制文本结尾
:'<,'>t0							# 把高亮选中的行复制到文件开头

移动

:move命令可以让我们把一行或多行移动到文档的另一位置,格式为:[range]move {address},可以简写为:m.

在指定范围内执行普通模式命令

:normal命令可以在一些列连续行上执行一套普通模式命令.比如批量在句子后添加分好或者注释多行:

: %normal A;				# 在文件的每行结尾添加分好

: %normal i//				# 在文件的每行开头添加//以注释

重复上次的ex命令

.命令用于重复上次的修改,但是不会重复由Vim命令行中做出的修改.作为替代,可以用@:来重复上次的ex命令,具体可见:h @:

自动补全ex命令

在命令行业可以使用Tab键进行补全.此外C-d命令会上Vim显示可用的补全列表:

:colorscheme
blue        default     desert      evening     industry    koehler     morning     pablo       peaksea     ron         slate       torte
darkblue    delek       elflord     gruvbox     ir_black    mayansmoke  murphy      peachpuff   pyte        shine       solarized   zellner
:colorscheme

可以通过wildmode来自定义自动补全行为,具体参考:h 'wildmode'.通常我们会是哟好难过zsh提供的自动补全模式:

set wildmenu
set wildmode=full

把当前单词插入命令行

在Vim命令行下,<C-r><C-w>会复制光标下的单词并把它插入命令行中.如果想插入光标下的自传,可以使用<C-r><C-a>,具体可查阅:h c_CTRL-R_CTRL-W.

有个非常好用的,在vimrc中可以通过该功能快速查看不认识的设置项:将光标移到其中的一项设置上,然后输入:h <C-r><C-w>,就可以查阅该设置的文档了.

回溯ex历史

Vim会记录命令行模式下的历史命令.在输入:的前提下,使用方向上下键可回溯.默认Vim会记录20条,但是可以将下属配置添加到vimrc中:

set history=500

在回溯历史中最常用的是命令行窗口,它是一个常规的Vim缓冲区,它的每行内容都对应着命令历史中的一个条目,可以使用k,j上下移动,可以使用查找功能.在按下<CR>键时,会把当前命令行中的内容当初ex命令执行.

此外在该模式下,允许使用Vim完整的,区分模式的编辑能力来修改历史命令,比如合并等.普通模式下按q:调出命令行窗口.

命令 动作
q/ 打开查找命令历史的窗口
q: 打开ex命令历史的命令行窗口
<Ctrl-f> 从命令行模式切换到命令行窗口

image-20200504153757969

运行shell命令

在Vim的命令行模式下,给命令加!前缀就可以调用外部程序,具体可见:h !.

:!ls
[No write since last change]
Vim使用技巧.assets
Vim使用技巧.md
shell编程笔记_convert.md
技术-Android
技术-Flutter
技术-前端

需要注意:ls:!ls不同:前者是vim的内置命令,后者调用的是shell的ls命令.

在Vim的命令行中,符号%代表当前文件名.在有些情况下,我们可能正在开发一个shell脚本,并且在开发阶段可能会想要去执行它,此时不需要先退出vim,再在shell中执行,而是可以在Vim命令行中直接运行它:

# %在这里就表示当前正在开发的shell脚本
:!bash %

Vim退出到后台

在有些情况下,我们可能正在bash shell中运行Vim,然后需要一些shell命令,此时可以先按照Ctrl-z挂起Vim所属的进程,在需要的时候在通过fg命令唤起.另外可以使用jobs查看后台作业:


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

深入Flutter技术内幕:Platform Channel设计与实现(一) 下一篇