Vim必知必会

VI/VIM作为Nix环境的常用编辑器,有一些常用命令/用法.

由于平时用VSCode/SublimeText比较多,以至于切换到vi经常需要查阅,特记录与此.

命令行用法

# 以只读方式打开
vi -R filename

# 从某行打开
vi +linenumber file.py

#修改当前路径
gvim -c "cd ~/workspace"

导航

  • 切换Tab: Ngt (N是页码)
  • 跳转到某行 :NG或Ngg或:N (N代表行数)

常用快捷键

快捷键 说明
zz 移动当前行到屏幕中间
zt 移动当前行到屏幕顶部
zb 移动当前行到屏幕底部
z. 把鼠标当前行放到屏幕中央
Ctrl-y 上移屏幕一行, 只
Ctrl-e 下移屏幕一行
Ctrl-u 向上移动光标屏幕1/2页面
Ctrl-d 向上移动光标屏幕1/2页面
Ctrl-b 向前翻页,光标移到最后一行
Ctrl-f 向后翻页,光标移到第一行
Ctrl+C 或 Ctrl+[ Esc

‘zt’, ‘zz’ 和 ‘zb’ 会保持当前光标位置, 但移动视野使其在屏幕的’t’op, ‘z’ center, 或 ‘b’ottom 位置.

‘H’ighest, ‘M’iddle, ‘L’ower 屏幕行

设置命令

# 执行命令
!! 等同于 :.! 或Ctrl-z + fg

#显示行号/自动缩进/忽略大小写/显示结束行和tab标识/显示换行符
:set number/ai/ic/list/wm

# 关闭显示
set nu!
:set nonumber

#高亮搜索,关闭:noh;实时显示匹配
:set hlsearch incsearch 简写 set hls is

# 忽略大小写
:set ignorecase smartcase

# 用sudo保存只读文件(经常用到的一个命令)
:w !sudo tee %

# 设置终端为vi 模式
:set -o vi

#切换工作路径
:cd ~/workspace

# 将当前编辑文件第 # 行至第 # 行的內容保存到文件FILENAME
:#,#w FILENAME

# 读取 FILENAME文件 并将其插入到当前文件的光标位置后面
:r FILENAME

# 重复上一次变更
. (period)

编辑内容

# 复制和粘贴
"ayy (内容存放在寄存器 ") / "ap

查找

搜索光标处单词

  • *(向前) 或#(向后)
  • q/ 或/Ctrl-f (== find)
  • /之后用上下方向键

替换

:[address]s/search-string/replacement-string[/g]

  • address 为一个行号或者是用逗号隔开的两个行号。句点 (.) 代表当前行。可以使用标记或者搜索字符串表示行号。
  • %代表当前文件
  • search-string 可以是正则表达式或简单的字符串
  • g 表示进行全局替换 ( 针对一行可能执行多次替换 )
# 几个例子
# 替换当前文件所有并确认,global
:%s/old/new/gc
# 列出所有行
:g/old/p
:g/old/s//new/gp

# 匹配整个单词
:s/\<bar\>/baz

批量替换 :

:args *.[ch]  # 替换所有*.c和*.h文件
:argdo %s/<my_foo>/My_Foo/ge | update
 # e 忽略没有找到的错误
 # update 写入修改

定制

设置字体

  • Linux: set guifont=DejaVu Sans Mono 10
  • Windows :set guifont=DejaVu Sans Mono:h10

Troubleshooting

Q: 终端显示颜色失败 A: export TERM=xterm-256color

Q: Ubuntu下中文菜单不能显示 A: $sudo cp /usr/share/vim/vim72/lang/{menu_zh_cn.utf-8.vim,menu_zh_cn.utf8.vim}

Q:使用Taglist(Ctag)报错 A: apt-get install exuberant-ctags 或在WIndows把ctags.exe放到vim根目录

扩展学习

工具扩展

学习资源