基本操作#
命令行模式#
: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'
删除一个单引号字符串,包括周围的单引号
演示#
# 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
vim ~/.vimrc
vim /etc/vim/vimrc # debian
扩展 Vim#
常用推荐插件:
- ctrlp.vim: 模糊文件查找
- ack.vim: 代码搜索
- nerdtree: 文件浏览器
- vim-easymotion: 魔术操作
讲师们的开源配置文件:
其他程序的 Vim 模式#
Shell#
Bash set -o vi
Zsh bindkey -v
Fish fish_vi_key_bindings
通用 export EDITOR=vim
Readline#
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
# 下载后需在 vimrc 中添加如下配置 set runtimepath^=~/.vim/pack/vendor/start/ctrlp.vim
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
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 修改~/.vimrc
call plug#begin() Plug 'preservim/NERDTree' #需要安装的插件 NERDTree Plug 'wikitopian/hardmode' #安装 hardmode ..... # 更多插件 call plug#end()
- 在 vim 命令行中执行
:PlugInstall
- (高阶)用 Vim 宏将 XML 转换到 JSON (例子文件)。尝试着先完全自己做,但是在你卡住的时候可以查看上面宏 章节。