1. 变量自动提示,快速选择(不使用上下键)
Insert Model both bring out the pop-up menu, With the difference being
Ctrl + n // 向下 goes to next word from top to bottom in that word suggestions list, where as Ctrl-P goes in opposite manner.
Ctrl + p // 向上 goes to top
Normal Model
Ctrl + o // Jumping to previously visited locations
Ctrl + i // `Tab` 功能相同 Jumping to last visited locations, same to Tab, reverse of Ctrl + o, 多个文件跳转
2. 显示不可见字符
cat -A file
可以把文件中的所有可见的和不可见的字符都显示出来。
`^I` 表示一个tab符
`$` 表示一个回车符
在 Vim 中,可以 :%!cat -A
在Vim中调用cat转换显示,这样的做法不便于编辑。
Vim本身可设置显示不可见字符 :set invlist
即可以将不可见的字符显示
:set invlist // 将不可见的字符显示出来,例如,会以^I表示一个tab符,$表示一个回车符
:set nolist // 回到正常的模式
3. 分屏
:vsplit // 命令太长,没人用
:vsp // 常用
:sp filename
分屏的相关动作都是 ctrl+w
开始,再跟一个其他字母
ctrl+w = :让左右上下各个分屏宽度,高度均等
ctrl+w _(shift + -) :当前屏幕高度扩展到最大
ctrl+w |(shift + \) :当前屏幕宽度扩展到最大
ctrl+w c:关闭当前屏幕
4. 常见的 .vimrc 配置
将tab键替换为 4 个空格, python 开发尤为重要
set tabstop=4 " Tab键替换的空格长度,默认8
set softtabstop=4 " 退格键退回缩进空格的长度
set shiftwidth=4 " 表示每一级缩进的长度
set expandtab " 设置缩进用空格来表示
set autoindent " 设置自动缩进
set noswapfile " 不生成临时文件
5. 自动补全
行自动补全
Ctrl + x
Ctrl + l
(l指小写的L ):两个命令组合使用。在插入模式下输入已经存在行的第一个单词,再按这两个键,就会列出该整行出来
文件名自动补全:
Ctrl + x
Ctrl + f
:插入模式下,按这两个组合键,可以插入当前目录下的文件名。
函数自动补全
安装 phpcomplete 插件, 如果是 vim7.0 以上,不需要下载 phpcomplete.vim 插件,因为 vim 安装时自带了。
/usr/share/vim/vim74/autoload/phpcomplete.vim
配置
在 ~/.vimrc 中添加
filetype plugin on
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
python 自动补全
filetype plugin on
autocmd FileType python set omnifunc=pythoncomplete#Complete
注意 python3 需要重新编译 vim
https://zhongwei-leg.iteye.com/blog/941474
使用
vim 打开 php 文件, 插入一段代码如:str
- 在编辑模式下,
Ctrl+x
进入^X
模式 -
Ctrl+o
出现对应的 function 列表提示框,页面顶部显示函数定义,如图:
-
Ctrl+n
,Ctrl+p
上下选择,ESC
取消提示
6. Format JSON
:%!python -m json.tool
6.1 define custom function and use it
-
define function in .vimrc
function! FormatJSON()
:%!python -m json.tool
endfunction -
use it in visual mode
:call FormatJSON()
6.2 map shortcut Ctrl + j
define command in .vimrc
nnoremap :call Compile()
use it with Ctrl + j
in normal mode
6.3 map shortcut =j
nmap =j :%!python -m json.tool
use it with =j
in normal mode
7. 冷知识
`Ctrl + [` 与 `Esc` 键的功能相同,都可以进入 `命令模式`
`Ctrl + o` 命令模式下执行一条命令,就返回 Insert 模式
Ctrl + o + a // 补全分号
`v + i + (`,选中所有括号里面的内容
8. 代码自动补全 继续输入
继续输入补全的分号,括号。 比如当 cursor 在 ) 位置时,继续输入 ) ,会跳过 ) ,而不会多加一个 )
Esc + $ + a
再输入 分号 结束Esc + A
再输入 分号 结束Esc + f + ) + a
,就可以在括号后面插入-
自定义快捷键
inoremap
以后就可以按f )a Ctrl + l
直接在 INSERT 模式下跳到下一个 ) 后面继续输入
扩展阅读
- 智能补全:http://www.voidcn.com/article/p-wmjmglkp-tp.html
- vim 命令模式转换: https://www.zhihu.com/question/20013329
9. visual 模式
v VISUAL
Shift VISUAL LINE
Ctrl + v VISUAL BLOCK
10. xshell 右键不能复制选中文本
按住 shift 键,再用鼠标选择。
11. help
查看帮助文档
:help ctrl-o
12. 粘贴后自动补全致格式错乱
背景:在终端Vim中粘贴代码时,发现插入的代码会有多余的缩进,而且会逐行累加。原因是终端把粘贴的文本存入键盘缓存(Keyboard Buffer)中,Vim则把这些内容作为用户的键盘输入来处理。导致在遇到换行符的时候,如果Vim开启了自动缩进,就会默认的把上一行缩进插入到下一行的开头,最终使代码变乱。
解决
取消自动缩进
在命令模式下,使用:set nosmartindent
和:set noautoindent
取消自动缩进,然后再粘贴即可。完成后再开启自动缩进:set smartindent
和:set autoindent
,以上命令都可使用简写,比如:set si
,可通过Vim的帮助:help smartindent
查看相应说明。
Paste模式
Vim的编辑模式中,还有一个Paste模式,在该模式下,可将文本原本的粘贴到Vim中,以避免一些格式错误。通过:set paste
和:set nopaste
进入和退出该模式。更简便的方式是,在Vim中设置一个进入和退出Paste模式的快捷键,往~/.vimrc
中添加一行配置set pastetoggle=
,这样即可通过 F12 在 Paste 模式中切换,当然快捷键在不冲突的前提下可以任意指定
设置
set pastetoggle=
set paste
保证不自动换行和补全。
原因:终端的vim中没有相应的程序来处理这个从其他应用复制粘贴的过程,所以Vim通过插入键盘输入的buffer来模拟这个粘贴的过程,这个时候Vim会以为这是用户输入的。
问题出在:当上一行结束,光标进入下一行时Vim会自动以上一行的的缩进为初始位置。这样就会破坏原始文件的缩进。
高级设置 F2 切换快捷键
if $TMUX == ''
set clipboard+=unnamed
endif
nnoremap :set invpaste paste?
imap :set invpaste paste?
set pastetoggle=
13. windows ssh mac vim乱码
方法1:在 ~/.bash_profile
文件中添加
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
方法2:在 ~/.vimrc
中添加
set encoding=utf8
14. vundle 插件管理
默认安装在/.vim/bundle/vundle下
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim