vim 基本简记

基础操作

switch mode

  • insert mode --> normal mode: ESC ^c ^[

Insert mode

  • i : insert
  • a : append
  • o : open a line below
  • I : insert before line
  • A : append after line
  • O : append a line above

Command mode

  • :w
  • :q
  • :e! (undo all changes)
  • :vs (vertical split)
  • :sp (split)
  • :% s/foo/bar/g (foo --> bar global)

  • ^h : Delete last character (insert mode / shell)
  • ^w : Delete last word (insert mode / shell)
  • ^u : Delete current line (insert mode / shell)
  • ^a : move to line head (shell)
  • ^e : move to line end (shell)
  • ^b : Back shift (shell)
  • ^f : Forward (shell)

Visual mode

  • v : select character
  • V : select line
  • ^v : select block

移动

Fast-moving(行间移动)

  • w/W 移到下一个word/WORD开头
  • e/E下一个word/WORD
  • b/B回到上一个word/WORD开头, 可以理解为backword

(word指的是以非空白符分割e的单词, WORD以空白符分割的单词)

行间搜索移动

  • f{char}可以移动到char字符上,t{char}移动到char前一字符
  • 如果第一次没搜到, 可以用分号;/逗号,继续搜该行下一个/上一个
  • F搜索当前行当前光标前

行间水平移动

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

垂直移动

  • 使用()在句子间移动
  • 使用{}在段落间移动

页面移动

  • gg/G移动到文件开头和结尾,可以使用^o快速返回上个光标位
  • H/M/L跳转屏幕Head, Middle, Lower
  • ^u/^f 上下翻页(upword/forword), zz把屏幕置为中间

增删改查

删除

  • normal模式下, x快速删除一个字符
  • d(delete)配合文本对象快速删除一个单词
  • daw/dw:(d around word) 删除单词及周围空格
  • diw:删除单词不包括周围空格
  • dt{char}:删除直到{char}的内容
  • 均可搭配数字来执行多次

修改

  • r(replace): 替换, normal模式下,r{char}: 光标处字符-->{char}
  • s(substitute): 删除当前字符并进入插入模式;S:删除当前整行并进入插入模式
  • c(change):caw/cw(change a word)删除文本对象并进入插入模式
  • ct{char}:删除直到{char}的内容并进入插入模式

查询

  • / / ? 前向或者反向搜索
  • n / N 跳转到下一个或者上一个匹配
  • * / # 进行当前单词的前向或后向匹配

搜索替换

  • substitute命令, :[range] s[ubstitute]/{pattern}/{string}/[flags]
  • range表示范围 比如:10,20: 10-20行, %表示全部, pattern是要替换的模式, string是替换后的文本
  • Flags是替换标志位,几种常用: g(global)表示全局范围内执行;c(confirm)表示确认,可以确认或拒绝修改;n(number)报告匹配到的次数而不替换,可以用来查询匹配次数
  • 例如:self --> this :% s/self/this/g 一到六行:1,6 s/self/this/g

多文件操作

概念:
Buffer: 内存缓冲区
Window: Buffer的可视化分割区域
Tab: 组织Window为一个工作区
<TAB> 补全命令
:ls 列举当前缓冲区

2-7 pass

复制粘贴/寄存器

  • normal模式下 y(yank)复制/p(put)粘贴,剪贴d/p
  • vim里操作的是寄存器而不是系统剪贴板
    默认我们使用d删除或y复制的内容都放到了“无名寄存器”中

技巧:使用x和p命令可以实现字符的调换

  • :reg命令查看所有的寄存器
  • 使用"{register}指定寄存器
  • "ay将文本复制到a寄存器中
  • ""代表默认寄存器
  • "+代表系统剪切板
  • "+p将系统剪贴的代码复制到vim中

注:服务器模式下若无系统剪贴板,则使用inset模式下使用^v进行粘贴。若格式错乱,则使用:set paste命令先设置粘贴模式然后再进行粘贴。在命令行模式下使用:set paste命令设置粘贴模式,然后进入insert模式进行粘贴,此时autoindent功能失效,我们使用:set nopaste命令恢复autoindent功能。

:echo has('clipboard'):查看是否支持复制到系统剪切板, 若支持, :set clipboard=unnamed 可以直接复制的系统剪切板; :e!重新加载文件,且不保存。

使用宏完成批量操作

  • qa:开始宏录制到寄存器 a
  • I" Esc:在行首添加双引号
  • A" Esc:在行尾添加双引号
  • q:退出宏录制
  • @a: 使用录制的宏
  • 命令行使用normal模式下命令,使用v全选后按:进入命令行模式输入normal <命令>

Vim补全

  • C-n / C-p 关键字补全
  • C-x C-f 文件名补全
  • C-x C-o 代码补全,需开启文件类型检查,安装插件

Vim配置

配置文件

~/.vimrc

  • ~/.vim/

键位映射

举个栗子

" 设置行号
set number
" 自动语法高亮 
syntax on

" 高亮搜索
set hlsearch

" 映射, 设置leader键
let mapleader=','
let g:mapleader=','

" 使用jj进入normal模式
inoremap jj <Esc>`^

" 使用 leader+w 直接保存
inoremap <leader>w <Esc>:w<cr>
noremap <leader>w :w<cr>

" use ctrl+h/j/k/l switch window
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l

" json 格式化
com! FormatJSON %!python3 -m json.tool

Vim插件

vim-plug

" Specify a directory for plugins
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')

Plug 'mhinz/vim-startify'  " 启动界插件

" Initialize plugin system
call plug#end()

寻找插件

修改外观

举栗子

" 修改启动界面 
Plug 'mhinz/vim-startify'

" 状态栏美化 
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" 代码缩进线 
Plug 'Yggdroot/indentLine'

几种配色

vim目录与搜索

nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>
let NERDTreeShowHidden=1
let NERDTreeIgnore = [
        \ '\.git$', '\.hg$', '\.svn$', '\.stversions$', '\.pyc$',
        \ '\.pyo$', '\.swp$', '\.DS_Store$', '\.sass-cache$', 
        \ '\.egg-info$', '\.ropeprojects$', '\/_/_pycache/_/_$',
        \ ]
let g:ctrlp_map = '<c-p>'

vim目录与搜索

nmap ss <Plug>(easymotion-s2)

成对编辑

ys (you add a surrounding)

name --> "name" : ys iw "

cs (change a surrounding)

(name) --> [name] : cs ([

ds (delete a surrounding)
"name" --> name : ds "

python-mode

" python-mode
let g:pymode_python = 'python3'
" 保存文件时自动删除无用空格
let g:pymode_trim_whitespaces = 1
let g:pymode_doc=1
let g:pymode_doc_bind = 'K'
" 跳转定义
let g:pymode_rope_goto_definition_bind = "<C-]>"
" 静态检查
let g:pymode_lint = 1
let g:pymode_lint_checkers = ['pyflakes', 'pep8', 'mccabe', 'pylint']
let g:pymode_options_max_line_length = 120
"开启python所有的语法高亮
let g:pymode_syntax = 1
let g:pymode_syntax_all = 1

浏览代码

Highlight with <Leader>k
Navigate highlighted words with n and N
Clear every word highlight with <Leader>K throughout the buffer

快速注释

`gcc` 注释;`gcgc` 取消注释

To be continued...

添加新评论