Vim一些实用技巧

Vim中的几种模式

  • 正常模式normal
    正常模式下输入esc可返回到正常模式
  • 命令模式command
    正常模式下输入:或者/进入命令模式
  • 插入模式insert
    正常模式下按下i键进入插入模式
  • 可视模式visual
    可视模式是选中一块区域进行操作(删除/替换/复制/粘贴/改变大小写等)。
    在正常模式下按v(小写)进入字符文本, 按V(大写)进入行文本,按ctrl+v进入块文本
    在visual模式下d进行删除, y进行复制, p进行粘贴, r进行文本替换, gu转换为小写, gU转化为大写, g~大小写互换。
    块模式下在行首插入(如多行注释): 进入块模式后可通过o/O ( 这里是字母o的大小写 ) 来切换角)输入shift+i进入编辑模式,然后输入#按下两次ESC键即可神奇的看见所选择的所有行行首都有#
    块模式下在行尾插入: 只需将上面的i改为a即可。

Vim光标移动

正常模式下
h 左移, j 下移, k 上移, l 右移, 0 行首, $ 行尾
当然方向键也是可以的。

Vim中的Split Layouts(分割布局)

  • 输入 :help split 查看帮助(以冒号开头的都是命令模式下执行的,后面不再赘述)
    :sp filename 水平分割
    :vs filename 垂直分割
    ctrl w 方向键(方向键也可用hjkl代替)可切换窗口

  • 调整垂直分屏的宽度
    :vertical res[ize] N:vertical resize 80

    • 实时调整当前窗口宽度
      ctrl w > 向右加宽(宽度默认加1)
      ctrl w N > 向右加宽N
      ctrl w <同理
    • 将当前窗口移动到最左边 ctrl w H 最右边 ctrl w L.
  • 调整水平分屏的高度
    :res[ize] N:res 40

    • 实时调整当前屏的高度 ctrl w + 调高默认加1 ctrl w N + 调低ctrl w -同理
    • 将当前窗口移动到最顶端 ctrl w K 最底端 ctrl w J

vim在系统剪切板的复制与粘贴

vim有很多registers(寄存器)可通过:reg查看,:help registers查看registers帮助。
输入:reg查看vim里的寄存器

  • 寄存器的简单使用
    "1y 表示把选取内容复制到数字寄存器1
    "ap 表示粘贴字母a寄存器内容

从vim里拷贝内容后无法粘贴到vim之外的其他地方是由于在vim里拷贝(如通过yy命令)的内容是放在一个寄存器里,和系统剪切板是不同的地方,"+寄存器才是和系统剪切板相联系的。
执行vim --version|grep "clipboard" 如果是加号就表示支持否则不支持,即输入:reg看不到"+寄存器
如下图所示当前的vim就不支持clipboard
查看当前vim是否支持clipboard
引用官方文档的一句话

  1. Selection and drop registers "*, "+ and "~
    Use these registers for storing and retrieving the selected text for the GUI.
    See quotestar and quoteplus. When the clipboard is not available or not
    working, the unnamed register is used instead. For Unix systems the clipboard
    is only available when the +xterm_clipboard feature is present. {not in Vi}

讲述vim的复制粘贴(包括系统剪切板)

Linux命令行下实用的命令

ctrl a 将光标快速移动到行首
ctrl e 将光标快速移动到行尾
ctrl r 在历史命令中查找,连续执行可以一直向上查找带关键字的命令
ctrl w 快速删除光标附近前面的一个词(以空格隔开)(用backspace一个个删除太慢了)
ctrl u 删除命令行上光标到行首所有已经输入的字符
ctrl k 删除命令行上光标到行尾所有已经输入的字符
Esc b 跳到上一个单词,Esc f 跳到下一个单词。d表示backward,f表示forward
ctrl y 粘贴ctrl wctrl uctrl k 删除的文本
cd - 会将当前目录切换到上一次所在目录(注意是上一次,在进入到某个深层的目录后不小心返回到其他目录时很有用)
ctrl l 清空当前屏幕, 效果等同于clear

!(惊叹号)的秒用
  1. ![number] 可以执行历史命令
    此处的number特指通过history命令输出的序号(省了人工查找的时间,特别是命令很长的时候)
  2. 表示逻辑非
    如删除jar以外的文件可执行rm -rf !(*.jar)。但是必须要在Bash下开启extglob。
    Bash下extglob的开启关闭 shopt -s/-u extglob-s表示打开 -u表示关闭 可执行shopt |grep "extglob"查看是否打开。

匹配模式如下

?(pattern-list) - 所给模式匹配0次或1次; 
*(pattern-list) - 所给模式匹配0次以上包括0次;
+(pattern-list) - 所给模式匹配1次以上包括1次; 
@(pattern-list) - 所给模式仅仅匹配1次;
!(pattern-list) - 不匹配括号内的所给模式。

!还有其他的用处,但是经过考查暂不适用我,故不在此处继续讨论。

Linux中的&& || ()

cmd1 && cmd2 当cmd1执行成功(返回0表示成功)时才执行cmd2
cmd1 || cmd2 当cmd1执行失败(返回1表示失败)时才执行cmd2
(cmd1; cmd2; cmd3; ...) 命令组合
下面命令就是 如果dir_name文件夹存在就不创建构否则就创建

dir_name=/root/def
[ -d $dir_name ] && echo "$dir_name aleady exists." || (echo "$dir_name does not exist."; mkdir -p $dir_name)

vim中常用实用的技巧

  • vimdiff 比较两个文件的不同
    vimdiff file1 file2
    ]c 跳到下一个不同点
    [c 跳到上一个不同点
    do 将另一个窗口的内容obtain到当前窗口
    dp 将当前窗口的内容paste到另一个窗口
  • dip 可以删除所有临近的空白行
  • :g/^\s*$/d 可以删除当前文档中的所有空白行
  • :nohl 清除vim搜索后的高亮
  • zz 重绘屏幕并把当前行显示在窗口正中间使用(结合set cursorline很好用)
  • zt 将当前光标所在行移到窗口的顶端
  • zb 将当前光标所在行移到窗口的底部
  • ctrl r % 在插入模式下可将当前文件名输入到文件中
  • :r filename 读取某个文件并将文件内容插入到当前光标后
  • nl 移动光标到当前行的第n列
  • d$ 删除当前光标到本行行尾的所有内容 $移动光标到行尾
  • d0 删除当前光标到本行行首的所有内容 0移动光标到行首
  • xp 调换Vim当前光标之后的两个字符的顺序
  • ra 修改当前光标所在字符为a
  • :saveas filename 另存为文件
  • x(小写)删除光标后的字符,X(大写)删除光标前的字符
  • A 在当前行后添加 I 在当前行首添加 ----对应的小写i和a
  • 输入 o/O 将在光标的下方/上方打开新的一行并进入插入模式
  • 许多改变文本的命令都由一个操作符和一个动作构成 operator [number] motion其中number是可选的,motion代表操作符的操作对象,有如下三个
    • w - 从当前光标当前位置直到下一个单词起始处,不包括它的第一个字符。
    • e - 从当前光标当前位置直到单词末尾,包括最后一个字符。
    • $ - 从当前光标当前位置直到当前行末。
      例如d2w就表示从当前光标删除2个单词
      如果不加operator就表示移动光标2w表示光标向前移动2个单词
  • 互换两行*(多行同理),使用dd+p的组合命令的方式,
a)this line is a.
b)this line is b.

先对a)进行dd操作,删除的行会保存在vim的一个寄存器里,然后在b)进行p操作就会将两行对调

  • ce 改变文本直到一个单词的末尾,不仅仅是删除了一个单词,它也进入插入模式了,c命令也符合operator [number] motion,如c$就是删除当前光标到行尾的所有字符并进入插入模式
  • ctrl g 显示当前文件状态信息
    gg 跳至文件第一行
    :num 跳至文件第num行
    num然后输入G 也是跳至文件第num行
    G 跳至文件最后一行
  • 搜索相关
    • / 字符 会向后搜索字符 n表示下一个 N表示反向的上一个
    • ? 字符 会向前搜索字符
      要回到您之前的位置按 ctrl o。重复按可以回退更多步。ctrl i 会跳转到较新的位置
  • 配对括号的查找,输入 % 可以查找配对的括号 )、]、}
  • 替换命令
    • :s/thee/the 该命令只改变当前光标所在行的第一个匹配串
    • :s/thee/the/g 该命令则是替换当前光标所在行的所有匹配串
    • :#,#s/old/new/g 其中 #,# 代表的是替换操作的若干行中首尾两行的行号。
    • :%s/old/new/g 则是替换整个文件中的每个匹配串。
    • :%s/old/new/gc 会找到整个文件中的每个匹配串,并且对每个匹配串提示是否进行替换。
      c会在替换前进行提示
  • vim内执行外部命令的方式
    输入 :! 然后紧接着输入一个外部命令可以执行该外部命令。如 :!pwd :!python -V
    所有的外部命令都可以以这种方式执行,包括带命令行参数的那些。所有的 : 命令都必须以敲 <回车> 键结束。
  • :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文件中,当前文件还是处于修改的状态。如果是用 :saveas FILENAME 那么会另存为 FILENAME并且还原当前文件的原始状态。
  • 保存文件的部分内容
    按V进入visual模式的行文本,选择完后输入:会在屏幕底部出现:'<,'>
    然后输入w filename 即完整命令是:'<,'>w filename
  • :r FILENAME向当前文件中插入另外的文件的内容,还可以读取外部命令的输出 如 :r !pwd
  • 输入大写的 R 可连续替换多个字符(进入到替换模式,按ESC退出)
  • s 删除光标所在字符并进入插入模式,前面可以接数字如5s删除连续的5个字符并进入插入模式
  • S 删除光标所在行并进入插入模式,前面可以接数字如5S删除连续的5行并进入插入模式
  • vim也有自己的教学教程,在linux命令行下输入vimtutor即可观看30分钟左右的教程,默认是英文版的,如果vim支持中文会自动变成中文版教程

vim插件管理器vundle

vundle托管在GitHub上,是vim的插件管理器,还有另一个插件管理器vim_plug,但个人就选择了vundle作为vim的插件管理器了。
安装步骤如下,默认所有的配置插件就放在~/.vim/bundle目录下。

  1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  2. 将下面的内容放入到~/.vimrc文件(没有则新建)里。".vimrc文件里是注释的意思。如下内容也可从github上找到
set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
  1. 执行vim命令然后执行:PluginInstall
    或者在linux命令行下执行vim +PluginInstall +qall

至此就安装好了vundle,接下来就开始安装你所需要的vim插件吧

vimrc文件里的配置及说明

  • 所有的Plugin配置如Plugin 'tmhedberg/SimpylFold'都需要放在call vundle#end()前面,每个插件具体的相关配置如修改映射键位可放在后面(下文有示例)
  • vim里可设置键位映射map,具体规则如下
    在map命令前加上前缀可以组合成几种不同的命令,表示在不同的Vim模式下生效。
    n 在普通模式 (normal) 下生效。
    i 在插入模式 (insert) 下生效。
    v 在可视化模式 (visual) 下生效。
    c 在命令模式 (command-line) 下生效。
    o 在命令等待时 (operator pending) 生效,比如输入d之后会等待输入下一个字符,可能是d或者数字
    un 删除键的映射。
    nore 非递归 (non-recursive),意思是将a 映射为b,b映射为c,输入a的时候不会被映射为c,而只会映射为b。
    以上前缀可以组合使用,比如 nnoremap,nunmap,vnoremap 等。不带前缀的map命令默认对 normal 模式和 visual 模式生效。
    Vim :map 默认是递归映射模式。
    例如nnoremap U <C-r>就将U映射为ctrl r的操作,即U等效于vim里的撤销操作
  • 常用配置
" 在编辑模式下按F12来切换粘贴模式避免粘贴文本时格式错误(是由于自动缩进导致的)
set pastetoggle=<F12>

" 显示相关
" F2来切换是否显示行号
nnoremap <F2> :set nu! nu?<CR>
set nowrap "超过窗口宽度的行不自动回绕显示
set ruler " 显示当前行号和列号
syntax on " 打开语法高亮显示
set encoding=utf-8

" 启用鼠标(此处注释掉了)
" set mouse=a
" set selection=exclusive
" set selectmode=mouse,key

" 显示空格和Tab键
set listchars=tab:>-,trail:-
" set list/nolist 来查看制表符和空格

" 自动缩进
set autoindent
set cindent

" vim查找配置
set hlsearch    " highlight searches "
set incsearch   " do incremental searching, search as you type "
set ignorecase  " ignore case when searching "
set smartcase   " no ignorecase if Uppercase char present "

" vim Tab制表符设置
set expandtab   " expand tabs to spaces "
set smarttab    " 表示插入 Tab 时使用 shiftwidth
set shiftround  " 表示缩进列数对齐到 shiftwidth 值的整数倍
set tabstop=4   " Tab键的宽度
set softtabstop=4 " 统一缩进为4
set shiftwidth=4

" vim缩进配置
set autoindent smartindent
set cindent

" vim显示当前光标位置  0可跳转到行首 $可跳转到行尾 输入:linenumer可跳转到指定行
" set cursorcolumn
set cursorline

" vim文件类型设置 新建py/sh文件时会自动创建文件头
autocmd BufNewFile *.sh,*.py exec ":call AutoSetFileHead()"
function! AutoSetFileHead()
    call append(0, '#**********************************************')
    call append(1, '#')
    call append(2, '#      Filename: '.expand("%"))
    call append(3, '#')
    call append(4, '#        Author: WangTian')
    call append(5, '#   Description: ---')
    call append(6, '#        Create: '.strftime("%Y-%m-%d %H:%M:%S"))
    call append(7, '# Last Modified: '.strftime("%Y-%m-%d %H:%M:%S"))
    call append(8, '#')
    call append(9, '#**********************************************')
    call append(10, '')

    " .sh "
    if &filetype == 'sh'
    ¦   call append(11, "\#!/bin/bash")
    endif
    ¦   ¦
    " python "
    if &filetype == 'python'
    ¦   call append(11, "\# !/usr/bin/env python")
    ¦   call append(12, "\# encoding: utf-8")
    endif

    normal G
    normal o
    normal o
endfunc

" H移动到行首 L移动到行尾
nnoremap H ^
nnoremap L $
" u撤销上次操作 ctrl+r取消撤销 将ctrl+r改为U
nnoremap U <C-r>

" vim内一键执行Python代码"
map <F5> :call PRUN()<CR>
func! PRUN()
    exec "w"
    if &filetype == 'python'
    ¦   exec "!python %"
    endif
endfunc

vim中的实用插件

代码折叠插件SimpylFold

SimpylFold托管在Github上,项目名就是SimpylFold(不是拼写错误)
.vimrc文件合适的地方写上Plugin 'tmhedberg/SimpylFold'然后执行安装即可(与vundle安装步骤3一致,下同,不再赘述)
.vimrc文件增加如下配置

" Enable folding
set foldmethod=indent
set foldlevel=99
" 用空格折叠或打开代码"
nnoremap <space> za
" let g:SimpylFold_docstring_preview=1

zo 打开折叠 zO 递归地打开折叠
zc 折叠代码 zC 递归地折叠代码
za 折叠/打开代码 zA 递归地折叠/打开代码
故此处我就只映射了za为空格键,这样就能按空格键折叠或打开代码了,很方便。
更详细的使用说明请去GitHub中查看。
SimpylFold强烈建议使用FastFold由于Vim的折叠默认是很慢的。个人喜好,SimpylFold于我暂时够用了。

Also strongly recommend using FastFold due to Vim's folding being extremely slow by default

图示如下
折叠前
折叠后

模糊搜索插件CtrlP

Ctrlp托管在GitHub上,注意该搜索插件是在整个系统内搜索不是在当前编辑的文件里搜索关键字。
.vimrc文件合适的地方写上Plugin 'ctrlpvim/ctrlp.vim'然后执行安装即可。
然后在vim编辑文件时在normal模式下输入:Ctrlp或者敲命令ctrl p就可开启,如下图所示。
在这里插入图片描述
如果想更改快捷键,可在.vimrc文件添加如下配置

let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'

更详细的使用说明请去GitHub中查看。

python代码自动补全插件jedi-vim

jedi-vim托管在GitHub上,是一款非常好用的python代码自动补全插件,YouCompleteMe也是很好用的python代码自动补全插件,只不过YouCompleteMe需要vim版本必须至少是7.4.1578,否则就只能源码重新编译vim了,所以我这里就直接用jedi-vim插件了,后面再尝试YouCompleteMe
jedi-vim需要vim支持python,可通过vim --version|grep python查看
vim支持python
.vimrc文件合适的地方写上Plugin 'davidhalter/jedi-vim'然后执行安装即可。
.vimrc文件增加如下配置,修改触发自动补全的配置,默认是ctrl space,会与输入法快捷键冲突

" 设置ctrl n快捷键触发jedi-vim自动补全(默认是ctrl space)
let g:jedi#completions_command = "<C-N>"

jedi-vim快捷键命令
<leader>d 或<leader>g 跳转到函数定义
<leader>s 找到所有的function/class
<leader>K 展示document
<leader>r 重命名变量(包括函数名)
<leader>n 展示变量用到的地方
:Pyimport os 打开os模块
默认情况<leader>对应的键是\,可通过let mapleader=","修改为,

多色彩括号匹配插件rainbow_parentheses

rainbow_parentheses托管在GitHub上。很实用,区分度很高。
.vimrc文件合适的地方写上Plugin 'kien/rainbow_parentheses.vim'然后执行安装即可。
.vimrc文件增加如下配置

" 多括号彩色插件配置"
let g:rbpt_colorpairs = [
    \ ['brown',       'RoyalBlue3'],
    \ ['Darkblue',    'SeaGreen3'],
    \ ['darkgray',    'DarkOrchid3'],
    \ ['darkgreen',   'firebrick3'],
    \ ['darkcyan',    'RoyalBlue3'],
    \ ['darkred',     'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['brown',       'firebrick3'],
    \ ['gray',        'RoyalBlue3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['Darkblue',    'firebrick3'],
    \ ['darkgreen',   'RoyalBlue3'],
    \ ['darkcyan',    'SeaGreen3'],
    \ ['darkred',     'DarkOrchid3'],
    \ ['red',         'firebrick3'],
    \ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces

效果图如下
在这里插入图片描述

缩进指示插件indentLine

indentLine托管在GitHub上,需要vim的版本至少是7.3,对于代码的缩进格式有很直观的帮助,便于发现问题。
.vimrc文件合适的地方写上Plugin 'Yggdroot/indentLine'然后执行安装即可。
:IndentLinesToggle命令打开/关闭显示缩进指示线(可tab补全)
Indentline缩进效果图

括号自动补全插件auto-pairs

auto-pairs托管在GitHub上。
.vimrc文件合适的地方写上Plugin 'jiangmiao/auto-pairs'然后执行安装即可。
会自动帮你添加或删除成对的括号。

python pep8规范插件vim-autopep8

vim-autopep8托管在GitHub上,vim-autopep8插件会自动格式化Python代码以符合PEP8格式,需要python安装pep8

  1. pip安装(用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下载安装脚本
python get-pip.py    # 运行安装脚本
  1. 安装pep8
pip install autopep8

.vimrc文件合适的地方写上Plugin 'tell-k/vim-autopep8'然后执行安装即可。
.vimrc文件增加如下配置
设置快捷键

" 设置F1为开启Autopep8的快捷键
autocmd FileType python noremap <buffer> <F1> :call Autopep8()<CR>

使用方法
:Autopep8可以格式化当前代码
:Autopep8 --range 1 5 或者 :call Autopep8(" --range 1 5") 格式化第一到第五行代码
:'<,'>Autopep8格式化选中代码(如进入到visual模式的行文本)
效果图如下
autopep8效果图

python flake8语法检测插件

flak8托管在GitHub上,flak8支持静态语法检查和PEP8风格检查。
.vimrc文件合适的地方写上Plugin 'nvie/vim-flake8'然后执行安装即可。
.vimrc文件增加如下配置

" 每次保存py文件都执行flake检测
autocmd BufWritePost *.py call flake8#Flake8()

默认情况下按F7就会执行flake8语法检测,如果要修改快捷键,增加如下配置修改为F3

autocmd FileType python map <buffer> <F3> :call flake8#Flake8()<CR>

最后

强烈推荐一个女程序员自己维护的vim教程网站,写的很好!

发布了19 篇原创文章 · 获赞 0 · 访问量 702

猜你喜欢

转载自blog.csdn.net/qq_23120963/article/details/104268472