前言

在此之前。我对vim的认知使用情况也就是停留在使用 vim filename 打开文件,然后按 i 进入插入模式,使用 ESC 又可以回到 normal 模式,之后 :wq 保存退出。

因为大部分时间都是 win 使用的居多,要打开也就是 vs code 啥的,这种上古神器一般也就服务器上改动点啥玩意时进去用一下。一次看一个分享了一些 vim 小技巧的视频后改变了对 vim 的认知又激起了我的兴趣了(卧槽,还能这么玩)后了解到在慕课网还出了个系列教程视频就去围观学习了一遍,所以就有了本文章来记录一下一些命令,以备自己有所需时可以快速查看一下。

常用命令虽然就那些,但一些技巧快捷键使用起来也挺舒服的,各种加起来就多了。要学会使用vim就非一日之功了,得靠肌肉记忆,因为它那众多的快捷命令只有使用多了才能形成肌肉记忆。

注:相比教程,这只是一个笔记,无 vim 基础的可以退出去了或者可以去找相关的教程社区或者视频进行学习。

本教程基础慕课网视频教程 玩转 Vim 从放弃到爱不释手 进行记录,感兴趣可以自行去学习。

vim的几种模式

Vim 最常用的有四个模式,分别是:normal(普通)模式,insert(插入)模式,Command(命令)模式,Visual(可视)模式

normal(普通)模式:

进入 vim 后默认的是 normal(普通)模式。
使用 <ESC> 从插入模式回到普通模式,普通模式下可以进行各种命令操作和移动

insert(插入)模式

在插入模式中,可以按 ESC 键回到普通模式。
插入命令如下:
使用小写 a(append)当前字符后面插入
使用小写 i (insert)当前字符前面插入
使用小写 o(open a line below)当前行的下面一行插入
使用大写 A(append after line)当前行的最后面插入
使用大写 I (insert before line)当前行的最前面的插入
使用大写 O(append a line above)当前行的上面一行插入

Command(命令)模式

Command 模式下输入 : 之后执行命令,比如保存退出 :wq 一气呵成
顾名思义,执行 Vim 命令,比如保存 :w,退出 :q
比如分屏 :vs (vertical split), :sp(split)
比如使用 :% s/foo/bar/g 全局替换

Visual(可视)模式

Visual 模式一般用来块状选择文本
Normal 模式下使用小 v 进入 visual 选择
使用大 V 选择行
使用 ctrl+v 进行方块选择

vim插入小技巧

快速纠错
Ctrl + h删除上一个字符
Ctrl + w删除上一个单词
Ctrl + u删除当前行
以上几个快捷键可以用在很多地方,比如终端

快速切换insert和normal模式
使用Ctrl + c代替Esc(但可能中断某些插件)或者Ctrl + [

gi 快速跳转到你最后一次编辑的地方并且进入插入模式

vim 1.txt 2.txt -o 一次性在两个窗口里打开这两个文件

快速移动大法

vim normal 模式下使用反人类的 h j k i 来移动光标。

在单词间[飞舞]

单词之间移动是游览操作中最常使用的命令

w / W 移到下一个 word/WORD 开头。

e / E 下一个word/WORD尾

b / B 回到上一个word/WORD 开头,可以理解为backword

注:word指的是以非空白符分割的单词 WORD以空白符分割的单词

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符

使用f{char}可以移动到 char 字符上,t移动到char 的前一个字符

如果第一次没搜到,可以用分号(;) / 逗号(,)继续搜该行下一个/上一个

大写的F 表示反过来搜前面的字符

Vim 水平移动

如何快速移动到一行的行首或者行尾呢?

0 移动到行首第一个字符,^移动到第一个非空白字符

$移动到行尾,g_移动到行尾非空白字符

记住常用的0就可以满足日常需求了

vim垂直移动

我们还可以在句子和段落之间移动(了解知道有就行,不常用,而且中文和英文下区分句子和段落不一样)

使用括号 ( ) 在句子间移动
使用花括号 { } 在段落之间移动

具体使用也可以用 :help( 来查看帮助
插件章节会讲如何用easy-motion插件移动,这些命令就都不用记忆啦

Vim 页面移动

翻页命令太多,2/8定律,记住常见的就能满足需求

gg / G 移动到文件开头和结尾,你可以使用 ctrl+o快速返回

H / M / L儿跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)

Ctrl+u. ctrl+f. 上下翻页.(upword/forward)。zz 把屏幕置为中间

注:以上命令都是在 normal 模式下使用

vim快速增删改查

Vim增加字符

增加字符就是进入插入模式

进入插入模式编辑文本,使用 a / i / o 进入插入模式

插入命令如下:
使用小写a(append)当前字符后面插入
使用小写i(insert)当前字符前面插入
使用小写o(open a line below)当前行的下面一行插入
使用大写A(append after line)当前行的最后面插入
使用大写I(insert before line)当前行的最前面的插入
使用大写O(append a line above)当前行的上面一行插入

vim快速删除

如何快速删除一个字符或者单词呢?

vim在normal模式下使用 x 快速删除一个字符
使用d(delete)配合文本对象快速删除一个单词daw(d around word)

dx 都可以搭配数字来执行多次,比如:

v/V选中光标里的内容,按小v后进入单字符选择模式,按hl即可左右选择配合x来删除,大V后进入单行选模式,按kj即可上下选择配合d来进行整块删除。

dw(删除一个单词及周围字符)

daw(删除一个单词及周围字符)

diw(删除一个单词保留后边字符)

dd(删除一行)

数字 + 命令表示多次执行命令

2dd(删除两行)

4x(删除四个字符)

d0 (一行里快速删除光标前面的内容)

d$(一行里快速删除光标后面的内容)

dt{character}(当光标在座括号里时,使用该命令删除到又括号里的内容)比如要删除(一个括号里的内容)就dt)

拓展:

u(恢复到之前的状态)

ctrl+R(回到上一次修改的状态)

vim快速修改

相比删除,更常用修改,一般是删除之后改成我们期望的文本

常用的三个 r (replace),c(change),s(substitute)

normal 模式下使用「可以替换一个字符。s 替换并进入插入模式

使用 c 配合文本对象,我们可以快谏讲行修改

normal 模式下使用r可以替换一个字,(比如 xiaomo,光标停留在最后的 o 上面按ri就会变成 xiaomi)

R的作用就是不间断的替换光标之后的内容

s就是删除当前字符并且进入插入模式,也可以配合数字进行使用比如4s

S的作用就是删除一整行并且进入插入模式

使用c配合文本对象,我们可以快速进行修改
ac(修改光标下的字符为c)
caw(删除当前单词并且进入插入模式)
cw当光标在一个单词里时按下可以快速删除并且进如插入模式

cc的作用也是删除一整行并且进入插入模式

C大写 C 删除掉整行然后进入插入模式

ct{character}此命令和上面的删除命令用法一样ct((当光标在座括号里时,使用该命令删除到右括号前面的内容),然后进入插入模式

vim查询

查询单词也是一个常用操作

使用 / 或者进行前向或者反向搜索 (用法; /字符)

使用 n/N 跳转到下一个或者上一个匹配

使用 *或者#进行当前单词的前向或者后向匹配

Vim 如何搜索替换

substitute命令允许我们查找并且替换掉文本,并且支持正则式

vim替换命令 :[range]s[ubstitiute]/{pattern}/{string}/[flags]

range表示范围 比如;10,20 表示10-20行,%表示全部

pattern是要替换的文本,string是替换后文本

flags表示替换标志性,flags有几个常用的标志:g c n

替换标志位,Flags几个常用的标志的意思

g(global) 表示全局范围内执行
c(confirm)表示确认,可以确认或者拒绝修改
n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

例如:

把文件里所有的 is 单词替换成 this

:% s/is/this/g

把文件里第1 行到第 6 行里的 is 单词替换成 this

:1,6 s/is/this/g

统计当前文本里某个单词出现的次数

# 替换后字符可以留空,只是查询,不是真替换,留空没影响
:1,6 s/is//n

6 matches on 6 lines # 表示有 6 行 6 个匹配

:% s/is//n

只精准替换 is单词,而不是包含带有 is 的单词,可以使用正则

:% s/\<is\>/this/g

Vim多文件操作

Vim多文件操作

在vim里它有几个概念Buffer Window Tab
Buffer是指打开的一个文件的内存缓存冲区
Window窗口是Buffer可视化的分割区域
Tab可以组织窗口为一个工作区

Buffer - 什么是缓冲区?

vim打开一个文件后会加载内容到缓冲区

之后的修改都是针对内存中的缓冲区,并不会直接保存到文件

直到我们执行:w的时候才会把修改内容写入到文件里

Buffer之间的切换:
使用:ls会列举当前缓冲区,当打开多个文件时,然后用:b n 跳转到第n个缓存区

:bpre :bnext :bfirst `:blast

或者使用:b buffer_name` 加上tab补全来跳转

Windows 窗口

一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区

s水平分割 v垂直分割或者:sp:vs

每个窗口可以据徐被无限分割(就看你屏幕是否够大了)

如何切换窗口:

切换窗口的命令都是使用Ctrl+w作为前缀

<C-w>w在窗口间循环切换

<C-w>h切换到左边的窗口

<C-w>j切换到下边的窗口

<C-w>k切换到上边的窗口

<C-w>l切换到右边的窗口

L当光标在左边时,把左边的窗口的内容移动到右边的窗口

H把右边的窗口的内容移动到左边的窗口

:e 小技巧:
窗口下使用:e buffer_name可以打开不同的Buffer(也适用于 vim模式下打开新文件,例如::e 1.txt,打开1.txt)

:e! 重新加载当前文件且不保存当前的文件(适用修改一段文本后,又不需要它但不想删除,就可以使用 :e! 重新加载下放弃本次修改)

Tab(标签页)将窗口分组(使用不多,简单了解)

vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
比如一个Tab全用来写PHP文件,另一个Tab全是HTML文件
相比窗口,Tab一般用的很少,Tab太多管理起来也比较麻烦

Tab(标签页)操作:

:tabe[dit] {filename}在新标签页中打开 {filename]

<C-W>T 把当前窗口移到一个新标签页

:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页

Tab(标签页)切换操作
如何切换不同的标签页,一般建立两个就好,太多不好操作

什么是 Vim 的 text object

Text Object(文本对象)

如果你学过主流的编程语言,一定知道面向对象编程
Vim里文本也有对象的概念,比如一个单词,一段句子,一个段落
很多其他编辑器经常只能操作单个字符来修改文本,比较低效
通过操作文本对象来修改要比只操作单个字符高效

文本对象操作方式

之前我们己经使用过文本对象了,回忆下 dw(删除一个单词)

[number][text object]

number 表示次数,command 是命令,d(elete), c(hange), y(yank)

text object 是要操作的文本对象,比如单词w,句子S,段落p

Vim复制粘贴与寄存器的使用

Vim Normal模式复制粘贴

复制粘贴分别使用 y (yank)和 p (put),剪贴命令 dp

我们可以使用 v(visual)命令选中所需要复制的地方,然后使用 p 粘贴

配合文本对象:比如使用 yiw 复制一个单词,yy 复制一行

Insert模式下的复制粘贴

这个和其他的文本编辑器差不多,但是粘贴代码有个坑
在 vimrc 中设置了:set autoindent 后,
粘贴 python 代码缩进错乱
这个时候需要使用 :set paste:set nopaste 解决

什么是vim的寄存器

你有没有好奇?vim在normal模式下复制/剪贴的内容去了哪?
vim里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同
默认我们使用d删除或者应负责的内容都放了“无名寄存器”
用x删除一个字符放到无名结存器,然后p粘贴,可以换调两个字符

深入寄存器(register)

Vim不使用单一剪贴板进行剪贴,复制与粘贴,而是多组寄存器

通过"{register}前缀可以指定寄存器,不指定就默认无名寄存器

比如使用"ayiw复制一个单词带无名寄存器a中,"bdd删除当前行到寄存器b

Vim中""表示无名寄存器,缺省使用。"" p其实就等同于p

食用方法::reg {register}查看当前寄存器里的内容,

比如 :reg a查看a寄存器里的内容,使用"{register} p来粘贴当前寄存器里的内容,比如“a p

其他常见寄存器

除了有无名寄存器以及a-z,Vim中还有一些其他常见寄存器

复制专用寄存器,"0使用y复制文本同时会被拷到复制寄存器0

系统剪贴板"+可以在复制前加上"+复制到系统剪贴板

其他一些寄存器比如"%当前文件名,".上次插入的文本(不常用,了解知道即可)

系统剪贴板食用方法:

比如有需求从vim李复制内容到其他地方,这时候就要用到系统剪贴板。但首先要确保vim里的编译选项里有clipboard

查看方法:echo has('clipboard'),如果输出是1的话,就说明支持这个特性。

具体使用方法和上面深入寄存器里一样的大同小异的用法,
比如可以使用"+y复制当前行到系统剪贴板,然后其他地方使用粘贴命令即可,同样其他地方复制的,
vim里也可以使用"+p来调用系统剪贴板里的内容。

当然如果你嫌每次前面都要带个"+很麻烦的话,可以使用命令:set clipboard=unnamed来让你直接复制粘贴系统结贴板的内容

比如ydp。同样insert模式里也可以使用Ctrl+R+来直接粘贴系统剪贴板的内容

Vim 如何用宏完成强大的批量操作

Vim如何用宏完成强大的批量操作

强大的Vim宏(macro)
从一个需求说起,给多行url链接加上双引号,你会怎么做?

[https://moshanghua.net](https://moshanghua.net)
https://moshanghua.net
https://moshanghua.net
https://moshanghua.net

什么是Vim宏(macro)

宏可以看成是一系列命令的合集、
我们可以使用宏[录制]一系列操作,然后用于[回放]
宏可以非常方便地把一系列命令用在多行文本上

如何使用宏

宏的使用分为录制和回放
Vim使用q来录制,同时也使用q结束录制
使用q{register} 选择要保存的寄存器,把录制的命令保存在其中
适用 @{register} 回放寄存器中保存的一系列命令

用宏解决刚才的问题

先给一行加上双引号,然后再回放到其他所有行

我们先使用q来开始录制,给一行加上双引号,之后使用q退出

在剩下的所有行中回放录制的宏

食用方式:

首先使用q来录制,但q后面需要跟一个寄存器名称,表示我们把它放到寄存器里,比如这里使用a,就按qa

然后使用大 I 跑到当前行的开头并且进入插入模式,然后按下 " 添加在开头后,按 Esc 返回 normal 模式

再按一下大 A 跑到当前行的结尾,再按一下 " 添加在结尾,然后又按 Esc 返回 normal 模式

最后在按一下q结束录制

接下来我们就可以使用宏利

j移动到下一行后,用带上刚才保存录制的寄存器a来回放宏,@a就可以轻松的给当前行加上。

但加入链接成百上千时,显然这样也是不行的。这下这里就要使用vim的一个特性了,在命令行下面去执行normal模式下的命令

首先我们可以使用大V行选,然后使用j下移(大G可以直接移到到行尾),就可以实现部分选择或者全选操作

接下来就使用命令行模式:,在所有行执行normal命令,空格加上回放寄存器a里面的内容(:normal @a)然后按回车就可以了

Vim 补全大法

什么是补全?

只要手速块,补全什么的都是浮云
补全是根据当前环境上下文由编辑器[猜]你想输入的东西
比如补全一个单词,文件名,或者代码中的函数名,变量名等
vim提供了多种补全功能,还可以由插件拓展功能实现代码补全

Vim常见的补全方式

vim中有很多种补全的方式

<C-n>普通关键字补全

<C-x> <C-n>当前缓冲区关键字

<C-x> <C-i>包含文件关键字

<C-x> <C-]>标签文件关键字

<C-x> <C-k>字典查找

<C-x> <C-l>整行补全

<C-x> <C-f>文件名补全

<C-x> <C-o>全能(omni)补全

常见的三种补全类型

使用 ctrl+nctrl+p 补全单词

使用 ctrl+xctrl+f 补全文件名

使用 ctrl+xctrl+0 补全代码,需要开启文件类型检查(:filetype on)查询(:set filetype),安装插

小技巧:

:r! echo % 输入当前文件名到文件里

:r! echo %:p 输入当前文件路径到文件里

Vim更换配色

使用:colorscheme显示当前的主题配色,默认是default

用:colorscheme 可以显示所有的配色

有中意的配色后,用:colorscheme 配色名 就可以修改配色

默认的没有喜欢的也可以从网上下载自己喜欢的配色来进行安装使用

食用方法:

首先先git clone克隆下来自己喜欢主题的github地址,

比如:https://github.com/w0ng/vim-hybrid.git

然后我们要做的就是把克隆下来的文件夹colors里的主题文件复制或者移动到vim的colors主题文件夹里去,

这里我们可能要先创建个.vim的文件夹,自己可以使用命令查询下,如果有了就直接创建个 .vim下的colors文件夹,mkdir .vim/colors

接下来我们就可以使用复制cp命令把它克隆进去 cp vim-hybrid/colors/hybrid.vim ~/.vim/colors/hybrid.vim

然后去vim里用:colorscheme hybrid 就可以修改启用配色了

注:想要持久化配色需要把配置写到。vimrc里去

未完待续...

第二篇链接:VIM 插件篇

这两天,在学习使用Github的过程中遇到的问题:remote: error: GH007: Your push would publish a private email address.

使用命令:git push -u origin master ,把本地库的内容推送到远程库的过程中,出现了如下问题,如图所示:
git push -u origin master 报错
然后把报错往百度上一贴,照着教程摸索了下才解决了,
关于此报错,也不是其他什么原因造成的,只是你在修改了GitHub设置里关于邮箱的一个选项。

解决办法:

在GitHub的你账号网页上右上角,个人的登录退出的位置,找到setting:

setting->emails->Keep my email address private,把这一项去掉勾选即可。
git push -u origin master 解决

Linux ssh 远程登录到其他机器上时,有时会出现登不进去,并弹出如下类似提示的情况:

百度了之后总结,ssh会把每个你访问过计算机的公钥(public key)都记录在本地~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。

原因:一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告。

解决办法:
rm -rf ~/.ssh/known_hosts

如歌 (《烈火如歌》电视剧主题曲)
词:段思思
曲:谭旋
编曲:陈思同
笛子演奏:水玥儿

谢时间拈了眉头的霜花
谢沧桑 喂饱思念的马
谢绵长情话 投射了天涯
带我去小小红尘醉一下
谢那句再见让你害怕
谢狭路 让相逢不能罢
谢月的缺乏 常诉在卧榻
谢风沙 吹成年华
若遗憾是遗憾 若故事没说完
回头看 梨花已落千山
我至少听过 你说的喜欢
像涓涓温柔途经过百川
若遗憾遗憾 若心酸心酸
又不是非要圆满
来年秋风乱 笑看红叶转
深情 只好 浅谈
谢那句再见让你害怕
谢狭路 让相逢不能罢
谢月的缺乏 常诉在卧榻
谢风沙 吹成年华
若遗憾是遗憾 若故事没说完
回头看 梨花已落千山
我至少听过 你说的喜欢
像涓涓温柔途经过百川
若遗憾遗憾 若心酸心酸
又不是非要圆满
来年秋风乱 笑看红叶转
深情 只好 浅谈
若遗憾是遗憾 若故事没说完
回头看 梨花已落千山
我至少听过 你说的喜欢
像涓涓温柔途经过百川
若遗憾遗憾 若心酸心酸
又不是非要圆满
来年秋风乱 笑看红叶转
深情 只好 浅谈

命令行上输入一个长命令,并希望有一种方法可以保存它以供日后使用?这就是 Bash 别名派上用场的地方。它们允许你将长而神秘的命令压缩为易于记忆和使用的东西。

要使用你创建的 Bash 别名,你需要将其添加到 .bash_profile 中,该文件位于你的家目录中。请注意,此文件是隐藏的,并只能从命令行访问。编辑此文件的最简单方法是使用 Vi 或 Nano 之类的东西。

10 个方便的 Bash 别名

1、 你有几次遇到需要解压 .tar 文件但无法记住所需的确切参数?别名可以帮助你!只需将以下内容添加到 .bash_profile 中,然后使用 untar FileName 解压缩任何 .tar 文件。

alias untar='tar -zxvf '

2、 想要下载的东西,但如果出现问题可以恢复吗?

alias wget='wget -c '

3、 是否需要为新的网络帐户生成随机的 20 个字符的密码?没问题。

alias getpass="openssl rand -base64 20"

4、 下载文件并需要测试校验和?我们也可做到。

alias sha='shasum -a 256 '

5、 普通的 ping 将永远持续下去。我们不希望这样。相反,让我们将其限制在五个 ping。

alias ping='ping -c 5'

6、 在任何你想要的文件夹中启动 Web 服务器。

alias www='python -m SimpleHTTPServer 8000'

7、 想知道你的网络有多快?只需下载 Speedtest-cli 并使用此别名即可。你可以使用 speedtest-cli --list 命令选择离你所在位置更近的服务器。

alias speed='speedtest-cli --server 2406 --simple'

8、 你有多少次需要知道你的外部 IP 地址,但是不知道如何获取?我也是。

alias ipe='curl ipinfo.io/ip'

9、 需要知道你的本地 IP 地址?

alias ipi='ipconfig getifaddr en0'

10、 最后,让我们清空屏幕。

alias c='clear'

如你所见,Bash 别名是一种在命令行上简化生活的超级简便方法。

英文 | Patrick H. Mullins
翻译 | Linux中国/geekpi