玩转Vim 从放弃到爱不释手(慕课网学习笔记)

Learn Vim

vim 帮助

移动命令
  • :h motion.txt

退出Vim

:quit :q
  • 如果:以普通模式键入,则光标将移至屏幕底部,您可以在其中键入一些命令。
  • 如果处于插入模式,键入:将在屏幕上逐字产生字符“:”。在这种情况下,您需要切换回普通模式。
  • 命令式模式 ==><Esc> 返回正常模式

保存文件

保存更改:

:write

保存新文件

:w new_file.txt

保存并退出

:wq

退出但不保存任何更改

:q!

插入

i insert 当前光标前插入

I insert before line 光标移动到当前行 起始位置

a append 当前光标后插入

A append after line 光标移动到当前行 末尾

o open a line below 往后另起一行

O append a line above 往前另起一行

Vim模式

普通模式

为什么进入 vim 不能插入 -normal 模式

  • 进入Vim 默认是 normal(普通)模式。使用Esc从插入回到普通模式
  • 普通模式下可以进行各种命令操作和移动
  • 大部分情况下你是在浏览而不是编辑,所以Vim默认是normal
插入模式
  • i (insert) a(append) o (open a line below) 进入插入模式
  • 使用 Esc 退出插入模式到normal 模式
命令模式

Normal模式下输入:之后执行命令,比如保存退出 :wq

  • 保存 :w , 退出 :q 保存退出 :wq 退出但不保存 :q!
  • 分屏 :vs(vertical split) :sp(split)
  • 设置行号 :set nu
  • 全局替换 :% s/java/js/g [注] java 将会被替换为 js, /g 为全局替换
可视化模式

一般用来块状选择文本

  • Normal模式下使用v 进入 visual 选择
  • 使用V选择行
  • 使用ctrl + v 进行方块选择

Vim插入模式小技巧

  • 进入Vim之后首先使用 a / i / o 之一进入插入模式
  • ctrl + h 删除上一个字符,ctrl + w 删除上一个单词,ctrl + u 删除当前行
快速切换 insertnormal模式
  • 使用 Ctrl + c 代替 Esc (但是可能会中断某些插件) 或者 Ctrl + [
  • gi 快速跳转到你最后一次编辑得地方并进入插入模式

Vim移动

上下左右移动

h 左

j 下

k 上

l 右

在单词之间【切换】
  • w / W 移到下一个word / WORD开始, e / E移动到下一个word / WORD末尾
  • b / B 回到上一个word / WORD开头 ,也可以理解为backword
  • word指的是以非空白符分割得单词,WORD以空白符分割得单词

行间搜索移动

同一行快速移动得方式其实是搜索一个在字符并且移动到该字符
  • 使用 f{char} 可以移动到char 字符上,t 移动到cahr的前一个字符
  • 如果第一次没搜到,可以i用分号 (;) or(,)` 继续搜索该行下一个 / 上一个
  • 大写的F 表示反过来搜前面的字符
如何快速移动到一行的行首或者行尾呢?
  • 0 移动到行首第一个字符, ^ 移动到第一个非空白字符
  • $ 移动到行尾, g_ 移动到行尾非空白字符
  • 记住 常用 的 0 和 $ 就可以满足日常需求了
Vim 垂直移动
我们还可以在句子(sentence)和段落(paragraph)间移动(不常用)
  • 使用括号()在句子间移动,你可以用:help ( 来查看帮助
  • 使用 { } 在段落之间移动
  • easy-motion 插件移动,这些命令就都不用记忆了
Vim页面移动
  • gg / G 移动到文件开头和结尾,你可以使用 ctrl + o 快速返回
  • H / M / L 跳转到屏幕的开头(Head),中间(Middle) 和 结尾 (Lower)
  • ctrl + u ctrl + f 上下翻页 (upword / forwardzz 把屏幕置为中间

Vim 快速增删改查

Vim 增加字符
  • 进入插入模式编辑文本
  • 使用a / i / o 进入插入模式
Vim快速删除
  • Vimnormal模式下使用x 快速删除一个字符
  • 使用d (delete)配合文本对象快速删除一个单词 daw (d around word)
  • dx 都可以搭配数字来执行多次
Vim快速修改
  • 常用的有三个 r(replace) , c (change) , s (substitute)
  • normal 模式下使用r 可以替换一个字符。s 替换并进入插入模式
  • 使用c配合文本对象,我们可以快速进行修改
Vim查询
  • 使用 / 或者 ? 进行前向或者反向搜索
  • 使用n / N 跳转到下一个 或者上一个匹配
  • 使用 * 或者 # 进行当前单词的前向和后向匹配

Vim 如何搜索替换

substitute命令允许我们查找并且替换掉文本,并且支持正则式
  • :[range] s[ubstitute] / {pattern} / {string} / [flags]
  • range 表示范围 比如 10 , 20 表示 10 - 20 行 , %表示全部
  • pattern 是要替换的模式,string 是替换后文本
flags有几个常用的标志
  • g(global)表示全局范围内执行
  • c(confirm)表示确认,可以确认或者拒绝修改
  • n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

Vim多文件操作

  • Buffer 是指打开得一个文件得内存缓冲区
  • 窗口是Buffer可视化得分割区域
  • Tab可以组织
Bufer - 什么是缓冲区?
  • Vim 打开一个文件后会加载文件内容到缓冲区
  • 之后得秀嘎都是针对内存中得缓冲区,并不会直接保存到文件
  • 直到我们执行:w 得时候才会把修改内容写入到文件里
切换窗口
  • ctrl + w v :vs垂直分割 【w 指的是 window
  • ctrl + w s :sp 水平分割

Vim text object文本对象

  • Vim里文本也有对象得概念,比如一个单词,一段句子,一个段落
  • 很多其他编辑器经常只能操作单个字符来修改文本,比较低效
  • 通过操作文本对象来修改要比只操作单个字符高效
文本对象操作方式
  • [number] <command> [text object]
  • number表示次数,command 是命令, d(delete) c(change) y(yank) v 选择
  • text object 是要操作得文本对象,比如单词w 句子 s 段落 p

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

normal
  • 复制 y(yank) 粘贴 p(put) 剪切d
  • v(visual)命令选中所要复制的地方,然后使用p粘贴
  • 配合文本对象:比如使用yiw复制一个单词,yy复制一行
Insert
  • vimrc中设置了autoindent ,粘贴Python代码缩进错乱
  • 这个时候需要使用:set paste:set nopaste解决
Vim寄存器
  • Vim里操作的是寄存器而不是系统剪切板,这和其他编辑器不同
  • 默认我们使用d删除或者y复制的内容都放到了"无名寄存器"
  • x删除一个字符放到无名寄存器,然后p粘贴,可以调换俩字符
  • 系统剪切板 "+ 在进行复制就可以放到系统剪切板 以便复制到其他地方
    • :set clipboard=unnamed可以让你直接复制粘贴系统剪贴板内容
    • echo has('clipboard')

强大的Vim宏(macro)

  • 宏可以看成是一系列的集合
  • 我们可以使用宏【录制】一系列操作,然后用于【回放】‘
  • 宏可以非常方便的把一系列命令用在多行文本上
宏的使用 分为录制和回放
  • Vim使用q来录制,同事也是q结束录制
  • 使用q{register}选择要保存的寄存器,把录制的命令保存其中
  • 使用@{register}回放寄存器中保存的一系列命令

场景:给多行文本加上双引号

  • 先给一行加上双引号,然后在回放到其他所有行
  • 我们先使用q开始录制,给一行加上双引号,之后使用q退出
  • 在剩下的所有行中回放录制的宏
    • qa 保存到寄存器
    • I 在行首插入" 回到 normal模式 A回到行末 进入插入模式"
    • 在回到normal模式,q退出录制
    • 移动到下一行, V 全选 , G从当前行跳至最后一行
    • : normal @a
  • 不使用宏
    • V ==> G
    • :normal I"
    • `ctrl + p 上一个命令
    • :normal A"

Vim映射

  • :map - x 然后按 - 就会删除字符
  • :map <space> vim 告诉Vim按下空格得时候选中整个单词
  • :map <c-d> dd 使用ctrl + d 执行 dd删除一行
Vim常用模式 normal / visual / insert都可以定义映射
  • nmap / vmap / imap定义映射只在 normal / visual / insert分别有效【递归映射】
  • :vmap \ U把在 visual模式下选中得文本大小(u / U转换大小写)
  • 使用 *map 对应的 nnoremap / vnoremap / inoremap

笨方法学Vimscript

Vim插件

插件管理工具 :Vim-plug

Vim开屏工具【启动界面】:vim-startify

状态栏美化:vim-airline

增加代码缩进线条:indentline

配色:vim-hybrid 或者 vim-colors-solarized 或者 gruvbox

vim插件网站:vimAwesome.com

Vim文件目录和搜索插件

  • 文件目录管理 nerdtree
  • 快速查找并且打开一个文件可以用ctrlp插件

Vim快速定位插件

vim-easymotion

Vim模糊搜索和替换插件

  • Ag.vim 或者 fzf.vim
  • 批量搜索替换far.vim

vim-surround,成对修改

浏览代码

  • Vim tagbar
  • 高亮单词:vim-interstingwords

Vim代码补全插件

  • deoplete.nvim
  • coc.vim

Vim代码格式化与静态检查

  • 格式化:vim-autoformat 或者 Neoformat
  • 静态检查:neomake 或者 ale

Vim快速注释代码

  • Vim-commentary
  • 记住常用的命令gc注释和取消注释

Vim 与 git

  • Fugitive
  • vim-gitgutter 显示文件改动
  • gv.vim 查看提交记录

学习资源

  • Practical vim
  • 笨方法学 Vimscript

语法规则

verb(动词) + noun(名词) 也就是 动词名词 的规则

词汇表

名词(动作Motion)

我们这里将动作作为名词,动作用来在Vim中到处移动,他们也是Vim中的名词。下面列出了一些常见的动作的例子:

h 左

j 下

k 上

l 右

w 向前移动到下一个单词的开头

e 下一个 字符的首位字母

} 跳转到下一个段落

^ 跳转到当前行的首位

$ 跳转到当前行的末尾s

动词(操作符 operator

y yank (复制)

d delete (删除)

c change (删除文本,将删除的文本存到寄存器中,进入插入模式)

p paste (粘贴)

const learn = "vim"
  • 复制当前位置带行尾的所有内容 y$
  • 删除当前位置到下一个单词的开头 dw
  • 删除当前位置到这个段落的位置 c}

动作也接受数字作为参数,如果你需要向上移动3行,你可以用 3k代替按3此K

  • 想做拷贝俩个字符 y2h
  • 删除后俩个单词 d2w
  • 修改后俩行 c2j

更多名词(文本对象)

想象一下你现在正在某个被括号包围的文本中例如(hello Vim),你现在想要删掉括号中的所有内容,你会怎样快速的完成它?是否有一种方法能够把括号中内容作为整体删除呢?

答案是有的。文本通常是结构化的,特别是代码经常被放置在小括号、中括号、大括号、引号等当中。Vim提供了一种处理这种结构的文本对象的方法。

文本对象可以被操作符使用,这里有两类文本对象:

i + object 内部文本对象

a + object 外部文本对象

内部文本对象选中的部分不包含包围文本对象的空白或括号等外部文本对象包括了包围内容的空白或括号等对象外部对象总是比内部对象选中的内容更多,因此如果你的光标位于一对括号内部,例如(hello Vim)中:

  • 删除括号内部的内容但保留括号: di(
  • 删除括号以及内部的内容 : da(
const hello = function() {
    console.log("Hello Vim");
    return true;
}
  • 删除 括号内内容: di(
  • 删除 hello: dw
  • 删除 整个函数(被{}包含):di{

文本对象很强大因为你可以在一个位置指向不同的对象,能够删除一对括号、函数体或整个单词的文本对象中的内容。此外,当你看到di(di{diw时,你也可以很好的意识到他们表示的是什么。

让我们来看最后一个例子。假设你有这样一些html的标签的文本:

<div>
  <h1>Header1</h1>
  <p>Paragraph1</p>
  <p>Paragraph2</p>
</div>

如果你的光标位于"Header1"文本上:

  • 删除 Header1 : dit
  • 删除

    Header1

    : \ dat

如果你的光标在"div"文本上:

  • 删除h1和所有的p标签的行 :dit
  • 删除所有文本 : dat
  • 删除div: di<

下面列举的一些通常见到的文本对象:

w     一个单词
p     一个段落
s     一个句子
(或)  一对()
{或}  一对{}
[或]  一对[]
<或>  一对<>
t     XML标签
"     一对""
'     一对''
`     一对``

换句话说,假设你只知道四个动作w, $, }, G和删除操作符(d),你可以做8件事:按四种方式移动(w, $, }, G)和删除4种文本对象(dw, d$, d}, dG)。如果有一天你学习了小写变大写的操作符(gU),你的Vim工具箱中多的不是1种工具,而是4种:gUw, gU$, gU}, gUG。现在你的Vim工具箱中就有12种工具了。如果你知道10个动作和5个操作符,那么你就有60种工具(50个操作+10个移动)。另外,行号动作(nG)给你了n动作,其中n是你文件中的行数(例如前往第5行,5G)。搜索动作(/)实际上给你带来无限数量的动作因为你可以搜索任何内容。你知道多少终端命令,外部命令操作符(!)就给你了多少种过滤工具。使用Vim这种能够组合的工具,所有你知道的东西都可以被串起来完成更复杂的操作。你知道的越多,你就越强大。

结合性和语法

结合性和语法

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值