vim编辑器

基本操作

命令行模式

:q 退出（关闭窗口）

:w 保存（写）

:wq 保存然后退出

:e {文件名} 打开要编辑的文件

:ls 显示打开的缓存

:help {标题} 打开帮助文档

:help :w 打开 :w 命令的帮助文档

:help w 打开 w 移动的帮助文档

移动 - 多数情况在正常模式

基本移动: hjkl （左，下，上，右）

词： w （下一个词）， b （词初）， e （词尾）

行： 0 （行初）， ^ （第一个非空格字符）， $ （行尾）

屏幕： H （屏幕首行）， M （屏幕中间）， L （屏幕底部）

翻页： Ctrl-u （上翻）， Ctrl-d （下翻）

文件： gg （文件头）， G （文件尾）

行数： :{行数}<CR> 或者 {行数}G ({行数} 为行数)

杂项： % （找到配对，比如括号或者 /* */ 之类的注释对）

查找： f{字符}， t{字符}， F{字符}， T{字符}

查找 / 到向前 / 向后在本行的 {字符}

, / ; 用于导航匹配

搜索: /{正则表达式}, n / N 用于导航匹配

选择 - 可视化模式

可视化：v

可视化行： V

可视化块：Ctrl+v

编辑

i 进入插入模式

但是对于操纵 / 编辑文本，不单想用退格键完成

O / o 在之上 / 之下插入行

d{移动命令} 删除 {移动命令}

例如，dw 删除词， d$ 删除到行尾， d0 删除到行头。

c{移动命令} 改变 {移动命令}

例如，cw 改变词

比如 d{移动命令} 再 i

x 删除字符（等同于 dl）

s 替换字符（等同于 xi）

可视化模式 + 操作

选中文字， d 删除或者 c 改变

u 撤销， <C-r> 重做

y 复制 / “yank” （其他一些命令比如 d 也会复制）

p 粘贴

更多值得学习的：比如 ~ 改变字符的大小写

计数

3w 向前移动三个词

5j 向下移动 5 行

7dw 删除 7 个词

修饰语

你可以用修饰语改变 “名词” 的意义。修饰语有 i，表示 “内部” 或者 “在内 “，和 a，表示” 周围 “。

ci( 改变当前括号内的内容

ci[ 改变当前方括号内的内容

da' 删除一个单引号字符串，包括周围的单引号

演示

Copy
# fizzbuzz.py
import sys

def fizz_buzz(limit):
for i in range(1,limit+1):
if i % 3 == 0:
print('fizz', end="")
if i % 5 == 0:
print('buzz', end="")
if i % 3 and i % 5:
print(i)
else:
print()

def main():
fizz_buzz(int(sys.argv[1]))

if __name__ == '__main__':
main()

. 重复上一次修改

sys.argv[1] 传入的第一个参数

自定义 Vim

missing-semester

Anish

Jon (uses neovim)

Jose

Copy
vim ~/.vimrc
vim /etc/vim/vimrc # debian

扩展 Vim

常用推荐插件：

ctrlp.vim: 模糊文件查找

ack.vim: 代码搜索

nerdtree: 文件浏览器

vim-easymotion: 魔术操作

讲师们的开源配置文件：

Anish

Jon

Jose

Vim Awesome

其他程序的 Vim 模式

Shell

Bash set -o vi

Zsh bindkey -v

Fish fish_vi_key_bindings

通用 export EDITOR=vim

Readline

Copy
vim ~/.inputrc
vim /etc/inputrc # debian

set editing-mode vi # 开启vi编辑模式，python REPL 支持Vim快捷键

Vim 进阶

搜索和替换

:s （替换）命令（文档）。

%s/foo/bar/g

在整个文件中将 foo 全局替换成 bar

%s/\[.*\](\(.*\))/\1/g

将有命名的 Markdown 链接替换成简单 URLs

多窗口

用 :sp / :vsp 来分割窗口

同一个缓存可以在多个窗口中显示。

宏

q{字符} 来开始在寄存器{字符}中录制宏

q停止录制

@{字符} 重放宏

宏的执行遇错误会停止

{计数}@{字符}执行一个宏 {计数} 次

宏可以递归

首先用q{字符}q清除宏

录制该宏，用 @{字符} 来递归调用该宏 （在录制完成之前不会有任何操作）

例子：将 xml 转成 json (file)

一个有 “name” / “email” 键对象的数组

用一个 Python 程序？

用 sed / 正则表达式

g/people/d

%s/<person>/{/g

%s/<name>\(.*\)<\/name>/"name": "\1",/g

…

Vim 命令 / 宏

Gdd, ggdd 删除第一行和最后一行

格式化最后一个元素的宏 （寄存器 e）

跳转到有 <name> 的行

qe^r"f>s": "<ESC>f<C"<ESC>q

格式化一个的宏

跳转到有 <person> 的行

qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q

格式化一个标签然后转到另外一个的宏

跳转到有 <person> 的行

qq@pjq

执行宏到文件尾

999@q

手动移除最后的 , 然后加上 [ 和 ] 分隔符

扩展资料

vimtutor 是一个 Vim 安装时自带的教程

Vim Adventures 是一个学习使用 Vim 的游戏

Vim Tips Wiki

Vim Advent Calendar 有很多 Vim 小技巧

Vim Golf 是用 Vim 的用户界面作为程序语言的 code golf

Vi/Vim Stack Exchange

Vim Screencasts

Practical Vim（书籍）

课后练习

完成 vimtutor。备注：它在一个 80x24（80 列，24 行） 终端窗口看起来效果最好。

下载我们提供的 vimrc，然后把它保存到 ~/.vimrc。 通读这个注释详细的文件 （用 Vim!）， 然后观察 Vim 在这个新的设置下看起来和使用起来有哪些细微的区别。

安装和配置一个插件： ctrlp.vim.

用 mkdir -p ~/.vim/pack/vendor/start 创建插件文件夹

下载这个插件： cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
Copy
# 下载后需在 vimrc 中添加如下配置
set runtimepath^=~/.vim/pack/vendor/start/ctrlp.vim

Copy
3. 阅读这个插件的 [文档](https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md)。尝试用 CtrlP 来在一个工程文件夹里定位一个文件，打开 Vim, 然后用 Vim 命令控制行开始 `:CtrlP`.
4. 自定义 CtrlP：添加 [configuration](https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md#basic-options) 到你的 `~/.vimrc` 来用按 Ctrl-P 打开 CtrlP

练习使用 Vim, 在你自己的机器上重做 演示。

下个月用 Vim 完成_所有的_文件编辑。每当不够高效的时候，或者你感觉 “一定有一个更好的方式” 时， 尝试求助搜索引擎，很有可能有一个更好的方式。如果你遇到难题，可以来我们的答疑时间或者给我们发邮件。

在其他工具中设置 Vim 快捷键 （见上面的操作指南）。

进一步自定义你的 ~/.vimrc 和安装更多插件。
使用 vim-plug 安装插件：

安装 vim-plug

Copy
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

修改～/.vimrc

Copy
call plug#begin()
Plug 'preservim/NERDTree' #需要安装的插件 NERDTree
Plug 'wikitopian/hardmode' #安装 hardmode
..... # 更多插件
call plug#end()

在 vim 命令行中执行 :PlugInstall

（高阶）用 Vim 宏将 XML 转换到 JSON (例子文件)。尝试着先完全自己做，但是在你卡住的时候可以查看上面宏 章节。