文章目录

    • 基操
      • # 光标移动
      • # 查找
      • # 可视模式
      • # 范围处理
      • # 替换
      • # 折叠
      • # 分屏
      • # 后台运行
      • # 命令行模式
      • #
      • # 寄存器 register
      • # vim内部执行外部命令
        • ## 特例:提取文件
        • ## 特例:Vim保存只读模式下的修改
      • # VIM键盘映射
        • ## 特例:vim - CapsLock大写锁定键映射成 Esc 建
    • 配置
      • # 配置vimrc
      • # vim-plug
    • 差异对比工具:vim diff
    • 插件集成:NeoVim
    • 搭建IDE环境(linux)
        • # 使用 Vim 搭建基本开发环境(SpaceVim)


基操

vim的教程(非常基础)

vim tutor
  • Vim中文手册 http://www.4e00/vim-zh/usr_toc.html

  • 视频
    vim文本编辑器进阶(一) 复制 粘贴
    vim文本编辑器进阶(二) 快捷键
    vim文本编辑器进阶(三) 编辑 快捷键
    vim文本编辑器进阶(四) 可视行 可视块
    上古神器Vim:从恶言相向到爱不释手 - 终极Vim教程01 - 带你配置属于你自己的最强IDE

  • 命令总结
    https://www.jianshu/p/4df654095d73

# 光标移动

  • h j k l 光标移动(左下上右)

  • i 光标前插入字符

  • shift+i 在句子的开头插入字符

  • a 光标后面插入字符

  • shift+a 在句子的末尾插入字符

  • o 向下插入一行

  • shift+o 向上插入一行

  • r 替换选中

  • shift+r 连续替换 esc退出

  • s 删除选中,并输入模式

  • shift+s 删除一整行

  • x 删除光标

  • shift+x 删除光标前

  • :set nu 显示行数

  • ctrl+f 下一页

  • ctrl+b 上一页

  • { 上一个空行(查找函数) 上一段

  • } 下一个空行 下一段

  • ^ 行首
    0 行首(推荐)

  • $ 行未

  • % 闭合符号间反复横跳

  • gg 文章首行

  • shift+g 文章末尾

  • 数字+shift+g 到第几行
    :数字 到第几行(同上)

  • ctrl+g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。

  • ctrl+o 上一个查找光标位置

  • cetrl+i 下一个查找光标位置

  • zz 文本居中

# 查找

/+单词 全局找单词

  • n 下一个
  • shift+n 上一个

f+字母 行内找字母

  • ; 下一个
  • , 上一个

# 可视模式

  • v 进入可视化行(visual line)模式
  • ctrl+V 进入可视化块(visual block)模式
  • shift+i 插入模式

# 范围处理

指定 “{…}” “[…]” … 的范围处理

  • 处理+i+范围 对范围内进行处理
    d+i+} 删除光标所在 {...} 的内容
    y+i+} 复制光标所在 {...} 的内容

    比如: “aaa” ⇒ aaa

  • 处理+a+范围 对范围内+范围表示进行处理

    比如: “aaa” ⇒ “aaa”

# 替换

# 折叠

vim 折叠的用法

  • z+c 折叠
  • z+o 打开折叠
  • zf 创建折叠
  • zd 删除折叠

# 分屏

(ctrl+w)+v 左右分屏(先按ctrl+w,再按v,下面也一样)

  • :vs (命令形式)左右分屏
    :vsp
    ctrl+w+s
  • :sv (命令形式)上下分屏
    :sp
    ctrl+w 切换屏幕
  • hjkl 上下左右
  • :q 取消当前分屏
  • :Explore 打开当前目录
  • :ls 查看打开的文件
  • :b 序号 ` 打开ls中的对应序号文件
  • alt+回车 全屏

# 后台运行

这个隐藏功能很强大,非常类似于tmux的session会话功能。 但是和自己的vim-session 保存功能不太一样。这样就可以打开多个进程开发,完了直接仍后台完事。再切换到其他的项目进行开发。

  • ctrl+z 将当前vim置于后台

  • jobs 查看所有后台vim

  • fg 1 恢复编号为1的vim到前台

# 命令行模式

按下 “:” 进入命令行模式
:1 跳到第1行
:22 跳到第1行
:set nu 开启行号
:set nonu 关闭行号
:set nowrap 关闭自动换行
:set list 显示每一行的结尾
:set nolist 关闭xxxx
:help 帮助
:↑↓ 查看历史命令
q: 打开命令行历史记录(重要)

  • ctrl+c 退出这个模式
    :set mouse=a 鼠标模式
  • :set ic 忽略大小写:set noic 关闭)
  • set hls 高亮
  • set is 匹配项

命令行快捷键
ctrl+a 行首
ctrl+e 行末
!! 上一个命令

#

参考:vim 宏的使用

  • qa 在a处记录脚本
  • @a 执行a处的脚本
  • @@ 调用最近使用的宏
  • . 命令执行最后一次的修改命令

# 寄存器 register

http://www.4e00/vim-zh/change.html#registers

寄存器的基本使用
即时用 "{register}y 来拷贝到 {register} 中, 用 "{register}p 来粘贴 {register} 中的内容

寄存器的分类
Vim 提供了 10 类寄存器,可在 Vim 中通过 :help registers 查看帮助。

  1. 匿名寄存器 ""
  2. 编号寄存器 "0"9
  3. 小删除寄存器 "-
  4. 26 个命名寄存器 "a"z
  5. 3 个只读寄存器 ":, "., "%
  6. Buffer 交替文件寄存器 "#
  7. 表达式寄存器 "=
  8. 选区和拖放寄存器 "*, "+, "~
  9. 黑洞寄存器 "_
  10. 搜索模式寄存器 "/

具体每个寄存器的作用看这里:⭐️https://harttle.land/2016/07/25/vim-registers.html⭐️

# vim内部执行外部命令

## 特例:提取文件

## 特例:Vim保存只读模式下的修改

用 vim 打开没有写权限的文件而忘记用 sudo 时,文件变成 read-only
这时候用 :w!, SHIFT+ZZ,或者 qw! 都无法保存

:w !sudo tee %
  • :w : Write a file.可以将文件写入,文件仍然是只读模式,通过 :q! 退出
  • !sudo : Call shell sudo command.
  • tee : The output of the vi/vim write command is redirected using tee.
  • % : Triggers the use of the current filename.

Simply put, the ‘tee’ command is run as sudo and follows the vi/vim command on the current filename given.

# VIM键盘映射

  • VIM键盘映射 (Map)
    https://wwwblogs/yzl050819/p/7069988.html
    http://yyq123.blogspot/2010/12/vim-map.html
    http://www.pythonclub/vim/map-basic
  • vim中的特殊字符 https://wwwblogs/jinghan/p/11905732.html

## 特例:vim - CapsLock大写锁定键映射成 Esc 建

  • vim - CapsLock大写锁定键映射成 Esc 建

配置

.cpp文件、.rc文件、.h文件的区别

vimrc文件

# 配置vimrc

  • 可能是 Windows 下最漂亮的 Gvim 配置了
  • VIM配置(有注释)vimrc
  • Vim 配置入门
  • 前端 window vim 折腾记
vim /usr/share/vim/vimrc

配置1:⭐️推荐⭐️

" 配置来源: https://onlyke/html/568.html
set showcmd         " show (partial) command in status line
set showmatch       " show matching brackets
set incsearch       " incremental search
set autowrite       " automatically save before commands like :next and :make
set nocompatible    " use vim defaults instead of 100% vi compatibility
set backspace=indent,eol,start  " more powerful backspacing
set autoindent      " always set autoindenting on
set linebreak       " don't wrap words by default
set textwidth=0     " don't wrap lines by default
set ruler           " show the cursor position all the time

set backupskip+=/etc/crontabs.* " fix crontab -e

"set number       "设置行号
syntax on         "语法高亮
filetype on       "文件类型检测
set tabstop=4
set softtabstop=4
set shiftwidth=4

配置2:

let mapleader=" "  
syntax on 
set number
set norelativenumber 
set cursorline 
set cursorline 
set wrap 
set showcmd 
set wildmenu 

set hlsearch 
set incsearch 
set ignorecase 
set smartcase 

noremap <LEADER><CR> :nohlsearch<CR>
noremap k k

map s <nop>
map S :w<CR>
map Q :q<CR>
map R :source $MYVIMRC<CR>

配置3:稍微复杂一点的(没啥用)

" --------------------------------------------------------
" Name:vimrc for windows
" Author:lawsssscat
" Email:lawsssscat@163
" --------------------------------------------------------
" ========================================================
" 设置vim相关文件打开后默认折叠方式为 maker
" 约定俗成的用三个花括号注释包裹起来,这样在你打开配置文
" 件的时候 vim 就会帮你折叠起来,配置文件看起来简洁多了
" ========================================================

" z+o 打开折叠
" z+c 关闭折叠


" Startup - 编辑器启动时需要添加的一些配置 {{{
 
filetype indent plugin on       " 打开:文件类型检查、缩进、插件
augroup ft_vim                  " vim 文件折叠方式为 marker
  au!
  au FileType vim setlocal foldmethod=marker
augroup END

" }}}


" General - 通用配置{{{

set nocompatible            " 不与老的vi格式兼容,一些插件需要它
set nobackup                " 不生成 .un~ 备份文件
" set noswapfile            " 不生成异常退出临时文件
set history=2048            " history文件中需要记录的行数,恢复必须用到(很多配置是1024)
" ---------------------------------------------------
" 自动切换工作目录。这主要用在一个 Vim 会话之中打开多个文件的情况,默认的工作目录是打开的第一个文件的目录。
" 该配置可以将工作目录自动切换到,正在编辑的文件的目录。
" ---------------------------------------------------
set autochdir
" set whichwrap=b,s,<,>,[,]   " 跨行移动命令 智能上上下下 Insert模式下,也能如此.
set nobomb                  " 删除文件的 bomb marker?
" 允许退格键的使用
" set backspace=indent,eol,start whichwrap+=<,>,[,]
set clipboard+=unnamed      " vim 的默认寄存器和系统剪贴板共享
" ---------------------------------------------------
" 一般 windows 下应用程序的 alt 是用来定位菜单栏目的快捷键
" 我们需要禁用它,因为我们后面很多设置都需要使用 alt,需要使用 alt
" 来定位菜单的情况很少
" ---------------------------------------------------
set winaltkeys=no           " 设置 alt 键不映射到菜单栏

" }}}


" Lang & Encoding - 语言和编码 {{{

" ----------------------------------------------
" vim 里面设置编码的地方很多
" 上面这些配置可以保证不会出现乱码,
" 像文件菜单、vim默认语言建议设置成 en_US
" ----------------------------------------------
set fileencodings=utf-8,gbk2312,gbk,gb18030,cp936       " 查看当前文档编码 :set fenc?
set encoding=utf-8          " 设置vim内部使用的字符编码
set langmenu=zh_CN
let $LANG = 'en_US.UTF-8'   " 文件菜单、vim默认语言设置成 en_US
" language message zh_CN.UTF-8

"}}}


" GUI - 界面 {{{

" --------------------------------------------------------------------
" 编辑器配色建议使用 Tomorrow-Night,下载文件 copy 到 colors 目录即可
"
" 从下面的设置可以看出来,为了得到一个简洁漂亮的界面,我们去掉了菜单栏、
" 各种滚动条、使用 vim 内置 tab 而不是 gvim 系统的 tab 样式 
" (注意很多开发者喜欢显示不可见字符,比如: tab制表符、换行符号、尾空格等。)
"
" 字体方面个人推荐 Inconsolata 这个在我看来是 Windows 平台最漂亮的等宽字体了。
" --------------------------------------------------------------------
" color pablo
" colorscheme Tomorrow-Night
colorscheme gruvbox
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set cursorline               " 行高亮
hi CursorLine cterm=NONE ctermbg=darkred ctermfg=white
hi CursorCloumn cterm=NONE ctermbg=darkred ctermfg=white
set hlsearch                 " 查找高亮
set incsearch                 " 搜索马上生效
set ignorecase               " 搜索忽略大小写
set number                   " 显示行数
set relativenumber           " 相对行数
set lines=35 columns=140     " 窗口大小
" 分割出来的窗口位于当前窗口下边/右边
set splitbelow
set splitright
" 不显示工具/菜单栏
set guioptions-=T               " 去掉工具栏
set guioptions-=m               " 去掉顶部的菜单栏
set guioptions-=L               " 去掉左边的滚动条
set guioptions-=r               " 去掉右边的滚动条
set guioptions-=b
" 使用内置 tab 样式而不是 gui
set guioptions-=e
set nolist
" 显示不可见字符
set invlist
set listchars=tab:▶\ ,eol:¬,trail:·,extends:>,precedes:<
" gui字体
set guifont=Inconsolata:h12:cANSI

set ruler                       " show ruler at the right bottom
set hidden                      " can open other file when a file is not saved

" }}}


" Format - 基本的代码格式  {{{

" ----------------------------------------------
" 这个设置容易引起争议,反正我是不建议使用 tab 的
" 对代码格式幼强迫症的人一般都会设置 foldmethod=indent
" ----------------------------------------------
" set autoindent          " 自动缩进
set smartindent
" --------------------------------------------------------------------------------------------
" softtabstop 选项(可以简写为 sts)会影响 vim 在插入模式下按 Tab 键所实际得到的字符
" 可能是插入特定数目的空格,也可能是插入一个 tab 字符。
" 具体使用时,会受到 tabstop 选项和 expandtab 选项的影响。可以使用下面命令修改这个选项值为 4
" --------------------------------------------------------------------------------------------
set softtabstop=4
set tabstop=4           " 默认是8
set expandtab           " 在插入模式下,会把按 Tab 键所插入的 tab 字符替换为合适数目的空格。如果确实要插入 tab 字符,需要按 CTRL-V 键,再按 Tab 键。
set foldmethod=indent   " 折叠规则为"缩进"
set textwidth=0
syntax on               " 高亮
syntax enable               " 高亮

"}}}


" Keymap - 通用的快捷键 {{{

"}}}


" Keymap - 通用的快捷键 {{{

" ------------------------------------------------------------------------------------
" 可以说快捷键是每个编辑器必备的功能,科学的设置快捷键能很大程度的提高效率。
" 快捷键的设置要遵循一个规则:尽量不要修改系统默认配置的快捷键,非要设置的话选择好相应的模式
" ------------------------------------------------------------------------------------

" | Command 命令 | Normal 常规模式 | Visual 可视化模式 | Operator Pending 运算符模式 | Insert Only 插入模式 | Command Line 命令行模式 |
" | :map         |          y       |       y           |       y                     |                      |                         |
" | :nmap        |          y       |                   |                             |                      |                         |
" | :vmap        |                  |       y           |                             |                      |                         |
" | :omap        |                  |                   |       y                     |                      |                         |
" | :map!        |                  |                   |                             |         y            |      y                  |
" | :imap        |                  |                   |                             |         y            |                         |
" | :cmap        |                  |                   |                             |                      |      y                  |

let mapleader=","

" 更新配置、打开配置。改为我们配置在 ~/.vimrc
" nmap <leader>s :source $VIM/_vimrc<cr>
" nmap <leader>e :e $VIM/_vimrc<cr>
nmap <leader>s :source ~/.vimrc<cr>
nmap <leader>e :e ~/.vimrc<cr>

" --------------------------------------------------------------------------------------
" tab操
map <leader>tn :tabnew<cr>
map <leader>tc :tabclose<cr>
map <leader>th :tabp<cr>
map <leader>tl :tabn<cr>

" 移动分割窗口
nmap <C-j> <C-W>j
nmap <C-k> <C-W>k
nmap <C-h> <C-W>h
nmap <C-l> <C-W>l

" 正常模式下 alt+j,k,h,l 调整分割窗口大小
nnoremap <M-j> :resize +5<cr>
nnoremap <M-k> :resize -5<cr>
nnoremap <M-h> :vertical resize -5<cr>
nnoremap <M-l> :vertical resize +5<cr>

" 插入模式下,移动光标 alt+方向键
inoremap <M-j> <Down>
inoremap <M-k> <Up>
inoremap <M-h> <left>
inoremap <M-l> <Right>

" IDE like delete
inoremap <C-BS> <Esc>bdei

" 选中一行
nnoremap vv ^vg_
" 转换当前单词为大写
inoremap <C-u> <esc>mzgUiw`za
" 命令行模式下的行首尾
cnoremap <C-a> <home>
cnoremap <C-e> <end>

" nnoremap <F2> :setlocal number!<cr>
" 关闭换行快捷键
nnoremap <leader>w :set wrap!<cr>

" ----------------------------------------
" 复制/粘贴 
" ----------------------------------------
imap <C-v> <esc>"+gPi
" map <S+Insert> "+gP
vmap <C-c> "+y
" vnoremap <BS> d
" vnoremap <C-C> "+y
" vnoremap <C-Insert> "+y
cnoremap <C-V> <C-R>+
" cnoremap <S-Insert> <C-R>+

" 没查到干嘛的
exe 'inoremap <script> <C-V>' paste#paste_cmd['i']
exe 'vnoremap <script> <C-V>' paste#paste_cmd['v']

" 打开当前目录 windows
map <leader>ex :!start explorer %:p:h<CR>

" 打开当前目录cmd
map <leader>cmd :!start<cr>
" 打印当前时间
map <F3> a<C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR><Esc>

" 复制当前文件/路径到剪贴板
nmap <leader>fn :let @*=substitute(expand("%"), "/", "\\", "g")<CR>
nmap <leader>fp :let @*=substitute(expand("%:p"), "/", "\\", "g")<CR>

" 设置切换Buffer快捷键
nnoremap <C-left> :bn<CR>
nnoremap <C-right> :bp<CR>

" --------------------------------------------------------------------------------------
"
" 首先,我们设置了 leaderkey 为逗号 [,]
"
" [,e][,s] 分别为编辑配置文件,刷新配置文件,后面的路径要按你自己的情况去写
" (默认 vim 配置文件在安装目录里的 _vimrc)
"
" 分屏编辑操作的时候经常要在不同的屏之间跳来跳去 [Ctrl + vim方向] 设置跳转方便顺滑的切换
" 顺便说下,我个人习惯是在当前 tab 下编辑一个项目的文件,如果要临时维护其他项目,就新开 tab, 每个 tab 单独编辑一个项目文件
"
" 后面还设置了一些和 Windows 默认编辑操作兼容的快捷键,比如:复制,粘贴
"
" 注意有个细节,因为 vim 里面很多行操作快捷键是 Ctrl+v 和 windows
" 粘贴冲突了,一个机智的做法是仅仅在 vim 插入模式设置 Ctrl 为粘贴, 正常模式
" Ctrl+v 进入多选模块,两全其美
"
" 插入模式下要移动光标 还得 ESC 后进入插入模式, 这样太麻烦了,使用
" [alt+vim方向] 就加单多了
"
" --------------------------------------------------------------------------------------

" }}}


" Plugin - 插件相关(包括和当前插件相关的配置和快捷键等) {{{

" 插件管理
set rtp+=~/vimfiles/bundle/vundle/
call vundle#begin()

" 可以在此次安装插件
Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline'                        " 美观底部状态栏
Plugin 'vim-airline/vim-airline-themes'                 " 美观底部状态栏
Bundle 'scrooloose/nerdtree'                            " 边栏文件管理,不用多介绍,直接在配置_vimrc,使用:BundleInstall即可

call vundle#end()

" }}}


" Function - vimrc 里面用到的常用方法 {{{



" }}}

ubuntu 18.04


# vim-plug

https://github/junegunn/vim-plug

call plug#begin('~/.vim/plugged')

Plug 'vim-airline/vim-airline'
Plug 'connorholyday/vim-snazzy'

call plug#end()

color snazzy
let g:SnazzyTransparent=1

差异对比工具:vim diff

https://wwwblogs/motoyang/p/6091281.html

# vimdiff  FILE_LEFT  FILE_RIGHT
或者
# vim -d  FILE_LEFT  FILE_RIGHT

vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:

:set noscrollbind

可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:

]c
反向跳转是:
[c

至于光标在两个窗口之前的切换,可以使用如下按键:

Ctrl-w, l:光标切换到右侧的窗口
Ctrl-w, h:光标切换到左侧的窗口
Ctrl-w, w:光标在两个窗口间彼此切换

内容合并

d, p (即 diff put)命令,将当前差异点中的内容覆盖到另一文件中的对应位置。
d, o (即 diff obtain)命令可以将另一窗口中差异点处的内容拉取到当前位置并进行替换操作

在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:

:diffupdate

同时操作两个文件

:qa:退出所有文件
:wa:保存所有文件
:wqa:保存并退出所有文件
qa!:强制退出(不保存)所有文件
z o:查看被折叠的内容
z c:重新折叠

插件集成:NeoVim

https://www.jianshu/p/a339474fd439

搭建IDE环境(linux)

sudo apt-get install vim-gnome

ubuntu下vim中内容复制到浏览器 -> 要安装一个东西 -> sudo apt-get install vim-gnome -> 这样才可以用 “+y 来复制。

安装了vim-gnome包后,vim就可以支持clipboard了

那么在$HOME/.vimrc中添加:

set clipboard=unnamedplus
然后就可以使用y和p来随意复制粘帖(到)其它地方的内容了(再不用“+y按三个键这么麻烦了!!!)

# 使用 Vim 搭建基本开发环境(SpaceVim)

参考:使用 Vim 搭建基本开发环境 https://spacevim/cn/use-vim-as-ide/

安装

curl -sLf https://spacevim/install.sh | bash

卸载

curl -sLf https://spacevim/install.sh | bash -s -- --uninstall

更多推荐

【整理】vim - 操作、配置、对比、插件、集成开发