文章目录
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 +
调高默认加1ctrl w N +
调低ctrl w -
同理 - 将当前窗口移动到最顶端
ctrl w K
最底端ctrl w J
- 实时调整当前屏的高度
vim在系统剪切板的复制与粘贴
vim有很多registers(寄存器)可通过:reg
查看,:help registers
查看registers
帮助。
- 寄存器的简单使用
"1y
表示把选取内容复制到数字寄存器1
"ap
表示粘贴字母a寄存器内容
从vim里拷贝内容后无法粘贴到vim之外的其他地方是由于在vim里拷贝(如通过yy命令)的内容是放在一个寄存器里,和系统剪切板是不同的地方,"+寄存器才是和系统剪切板相联系的。
执行vim --version|grep "clipboard"
如果是加号就表示支持否则不支持,即输入:reg看不到"+寄存器
如下图所示当前的vim就不支持clipboard
引用官方文档的一句话
- 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}
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 w
和ctrl u
及ctrl k
删除的文本
cd -
会将当前目录切换到上一次所在目录(注意是上一次,在进入到某个深层的目录后不小心返回到其他目录时很有用)
ctrl l
清空当前屏幕, 效果等同于clear
!(惊叹号)的秒用
![number]
可以执行历史命令
此处的number特指通过history命令输出的序号(省了人工查找的时间,特别是命令很长的时候)- 表示逻辑非
如删除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
目录下。
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
- 将下面的内容放入到
~/.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
- 执行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
查看
在.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补全)
括号自动补全插件auto-pairs
auto-pairs托管在GitHub上。
在.vimrc
文件合适的地方写上Plugin 'jiangmiao/auto-pairs'
然后执行安装即可。
会自动帮你添加或删除成对的括号。
python pep8规范插件vim-autopep8
vim-autopep8托管在GitHub上,vim-autopep8插件会自动格式化Python代码以符合PEP8格式,需要python安装pep8
- pip安装(用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本
python get-pip.py # 运行安装脚本
- 安装pep8
我们可以指定国内镜像源作为pip源,这样下载速度就会很快了。以root用户为例,创建目录mkdir /root/.pip
,然后新增配置文件/root/.pip/pip.conf
,内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
如果是windows则可以新建文件%USERPROFILE%\pip\pip.ini
,其中环境变量USERPROFILE
可以通过在cmd
命令行界面输入set
命令看到,一般是USERPROFILE=C:\Users\11035
。文件内容是一样的。
然后执行下面的安装命令即可
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模式的行文本)
效果图如下
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教程网站,写的很好!