作为vim的初学者,逐步学习vim的操作与配置,在文章中记录笔记防止遗忘.
vim的学习笔记
- 一、.vimrc文件及其注释(持续更新ing)
- 二、常见问题与解决方案
- 2. 命令模式下,输入`:/字符串`搜索后,我们打开别的文件,发现也被高亮了,怎么关闭高亮?
- 3. 当写入`:syntax off`时,整个文档的字体失去颜色?
- 4. vim-如何在光标所在的行中粘贴?命令p粘贴在光标下方,P粘贴在光标上方。 粘贴到光标所在行的命令是什么?
- 5. vim、gvim在windows下中文乱码怎么办?
- 6. imap、inoremap ; nmap、nnoremap ; vmap、vnoremap一样吗?
- 7. [VIM 的状态行(statusline)设置](https://blog.csdn.net/icbm/article/details/73028623)
- 8. 怎么关闭gvim的错误铃声?怎样关闭错误闪屏?
- 9. vim中多窗口的编辑:
- 10.WSL的vim里编写的文本文件,总是报错?
- 三、功能们
- 四、vim学习的资料、网站
一、.vimrc文件及其注释(持续更新ing)
1. 现在所用的.vimrc文件,以及注释
"目前嘟嘟的vim个人配置文件
inoremap jj <Esc> " jj映射Esc
let mapleader = ";" "定义转义符---热键Leader定为‘分号'。
" 使用;w快捷键保存内容
nmap <Leader>w :w<CR>
imap <Leader>w <ESC>:w<CR>
" 使用;q快捷键退出vim
nmap <Leader>q :q<CR>
imap <Leader>q <ESC>:q<CR>
" 使用;;q强制退出vim
nmap <Leader><Leader>q <ESC>:q!<CR>
imap <Leader><Leader>q <ESC>:q!<CR>
set showcmd "输入的命令显示出来,看的清楚些"
set showmatch "开启高亮显示匹配括号"
set nu "显示行号
set cursorline " 突出显示当前行
set ruler "在状态栏显示光标的当前位置(位于哪一行哪一列)
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on "打开基于文件类型的插件和缩进
set smartindent "开启新行时使用智能自动缩进
set hlsearch "高亮搜索的关键字
set ignorecase "搜索忽略大小写
set incsearch " 随着键入即时搜索
set smartcase " 有一个或以上大写字母时仍大小写敏感
set nocompatible "去掉讨厌的有关vi兼容模式,避免以前版本的一些bug和局限
set ff=unix "使用unix换行符
"set ff=dos "使用unix换行符
"set ff=mac "使用unix换行符
"去掉输入错误的提示声音和闪屏
set noerrorbells visualbell t_vb=
if has('autocmd')
autocmd GUIEnter * set visualbell t_vb=
endif
"去掉输入错误的提示声音和闪屏
:set vb t_vb= "其中 t_vb的清空对GUI的vim无效,因为会默认重置。所以开启gvim以后可能仍然闪屏,可以手动 :set t_vb=
"(’t_vb‘选项,默认是用来让屏幕闪起来的)Starting the GUI (which occurs after vimrc is read) resets ‘t_vb’ to its default value开启GUI是在读入vimrc以后,会把 t_vb设置成闪屏的。
set wrap " 自动换行
set history=1000 " 历史记录数
set fileencodings=utf-8,gbk,big5 "中文编码支持
"禁止生成临时文件
set nobackup "禁止自动生成 备份文件
set noswapfile "禁止自动生成 swap文件
set noundofile "禁止 gvim 在自动生成 undo 文件 *.un~
set tabstop=4 " Tab键的宽度
" 统一缩进为4
set softtabstop=4 " 设定 << 和 >> 命令移动时的宽度为 4
set shiftwidth=4 " 使得按退格键时可以一次删掉 4 个空格
set noexpandtab " 不要用空格代替制表符
set smarttab " 在行和段开始处使用制表符
"colorscheme motus " 设置配色方案,gvim我喜欢motus, ubuntu的vim我喜欢default,vsvim我喜欢web13234.vssettings
set guifont=Ubuntu\ Mono:h12:cANSI "设置字体大小 和 字体类型。字体喜欢Ubuntu Mono
"自动补全括号、引号
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
"C,C++ 按F5编译运行 //F5被我换成了<Leader>e,也就是;e
map <Leader>e :call CompileRunGcc()<CR> "第一行代表运行 CompileRunGcc 函数
func! CompileRunGcc() "第二行代表自定义函数"
exec "w" "exec 表示执行命令
if &filetype == 'c'
exec "!g++ % -o %:r" "% 表示当前文件名 ,%< 表示当前文件名去掉后缀的名字。用%:r更合适
exec "! ./%:r"
elseif &filetype == 'cpp'
exec "!g++ % -o %:r"
exec "! ./%:r"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %:r"
elseif &filetype == 'sh'
:!./%
endif
endfunc
" 把;e作为调试快捷键(利用gdb,调试没有输入参数的程序)
map <Leader>d :call CompileDebug()<CR>
func! CompileDebug()
exec "w"
exec "!g++ % -g -o %:r"
exec "!gdb %:r"
endfunc
" 窗口切换
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
二、常见问题与解决方案
2. 命令模式下,输入:/字符串
搜索后,我们打开别的文件,发现也被高亮了,怎么关闭高亮?
答:命令模式下,输入
:nohlsearch
也可以:set nohlsearch
; 当然,可以简写,:noh
或者:set noh
。
3. 当写入:syntax off
时,整个文档的字体失去颜色?
答:
:syntax on
代表文档内容启用颜色(语法高亮)简写为:syn on
:syn off
4. vim-如何在光标所在的行中粘贴?命令p粘贴在光标下方,P粘贴在光标上方。 粘贴到光标所在行的命令是什么?
答:这完全取决于您要粘贴的寄存器中的数据类型。 如果数据是面向行的数据(例如,用
yy
选中),则将其粘贴为光标上方或下方的整行。
如果数据是面向字符的(例如用y2w
或者0y$
之类的方式选中),则将其粘贴在当前行中光标位置处或之前。有关寄存器类型和put命令之间的交互的更多信息,请参见
:help linewise-register
。
5. vim、gvim在windows下中文乱码怎么办?
答:_vimrc文件里添加一句 “
set fileencodings=utf-8,gbk,big5
”其他与编码相关的名令示例如下: :set encoding=utf-8 "以指定的编码显示文本,但不保存到文件中。这里的“编码”常见为gbk utf-8 big5 cp936 :set fileencoding=编码 "当前文本的存储编码转换为指定的编码
参考资料 https://blog.csdn.net/saying0101_0010_0000/article/details/114046684
6. imap、inoremap ; nmap、nnoremap ; vmap、vnoremap一样吗?
答:差不多,但是imap/nmap/vmap是不递归的映射。n和map之间的nore的意思是no recurrence (不要递归!!!)的意思。
举例说明比如先定义了
:nmap x dd
接下来定义
A:nnoremap \ x
B:nmap \ x
这样A或者B两种定义方式,最后在normal模式下执行\
会有两种不同的效果。B会将x解释为一开始定义的dd来执行删除整行,A就不会往前递归解释,仅仅执行删除一个字符。
当直接copy别人的vimrc文件万一有些地方跟自己的定义有相同的键最后引起不必要的麻烦,最好在每一处定义都用nore这样的方式。
7. VIM 的状态行(statusline)设置
参考资料:https://blog.csdn.net/icbm/article/details/73028623
" 显示状态行当前设置
set statusline
" 设置状态行显示常用信息
" %F 完整文件路径名
" %m 当前缓冲被修改标记
" %m 当前缓冲只读标记
" %h 帮助缓冲标记
" %w 预览缓冲标记
" %Y 文件类型
" %b ASCII值
" %B 十六进制值
" %l 行数
" %v 列数
" %p 当前行数占总行数的的百分比
" %L 总行数
" %{...} 评估表达式的值,并用值代替
" %{"[fenc=".(&fenc==""?&enc:&fenc).((exists("+bomb") && &bomb)?"+":"")."]"} 显示文件编码
" %{&ff} 显示文件类型
set statusline=%F%m%r%h%w%=\ [ft=%Y]\ %{\"[fenc=\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"]\"}\ [ff=%{&ff}]\ [asc=%03.3b]\ [hex=%02.2B]\ [pos=%04l,%04v][%p%%]\ [len=%L]
" 设置 laststatus = 0 ,不显式状态行
" 设置 laststatus = 1 ,仅当窗口多于一个时,显示状态行
" 设置 laststatus = 2 ,总是显式状态行
set laststatus=2
参数canshu | 功能 gongneng |
---|---|
%(…%) | 定义一个项目组。 |
%{n}* | %对其余的行使用高亮显示组Usern,直到另一个%n*。数字n必须从1到9。用% 或%0可以恢复正常的高亮显示。 |
%< | 如果状态行过长,在何处换行。缺省是在开头。 |
%= | 左对齐和右对齐项目之间的分割点。 |
% | 字符% |
%B | 光标下字符的十六进制形式 |
%F | 缓冲区的文件完整路径 |
%H | 如果为帮助缓冲区则显示为HLP |
%L | 缓冲区中的行数 |
%M | 如果缓冲区修改过则显示为+ |
%N | 打印机页号 |
%O | 以十六进制方式显示文件中的字符偏移 |
%P | 文件中光标前的% |
%R | 如果缓冲区只读则为RO |
%V | 列数。如果与%c相同则为空字符串 |
%W | 如果窗口为预览窗口则为PRV |
%Y | 缓冲区的文件类型,如vim |
%a | 如果编辑多行文本,这个字行串就是({current} of {arguments}),例如:(5 of 18)。如果在命令行中只有一行,这个字符串为空 |
%b | 光标下的字符的十进制表示形式 |
%c | 列号 |
%f | 缓冲区的文件路径 |
%h | 如果为帮助缓冲区显示为[Help] |
%l | 行号 |
%m | 如果缓冲区已修改则表示为[+] |
%n | 缓冲区号 |
%o | 在光标前的字符数(包括光标下的字符) |
%p | 文件中所在行的百分比 |
%r | 如果缓冲区为只读则表示为[RO] |
%t | 文件名(无路径) |
%v | 虚列号 |
%w | 如果为预览窗口则显示为[Preview] |
%y | 缓冲区的文件类型,如[vim] |
%{expr} | 表达式的结果 |
8. 怎么关闭gvim的错误铃声?怎样关闭错误闪屏?
答:This tip explains the settings that control these functions, and
shows how to disable beeping and flashing in both terminal Vim and GUI
Vim (gvim).
选项:
- The ‘errorbells’ (简称’eb’)is off by default
如果开启这个
:set errorbells
,那么Vim will either beep or flash its screen when an error message is displayed. (出错时,哔哔或者闪屏)
The ‘errorbells’ option has no effect on the beeps that Vim makes when an error message is not displayed .(无错时Vim不哔哔。比如按Esc,不会出现警告效果)
- The ‘visualbell’ (简称 ‘vb’) option is off by default.(默认时,‘vb’是关的)
如果开启这个
:set visualbell
, Vim will flash its screen instead
of sounding a beep.()(就只闪不哔哔)
- The ‘t_vb’ option, by default, is set to a code that will cause the screen to flash.(’t_vb‘选项,默认是用来让屏幕闪起来的)
Starting the GUI (which occurs after vimrc is read) resets ‘t_vb’ to its default value.If ‘t_vb’ is cleared, Vim will never flash the screen—however, it has to be cleared after the GUI has started.(‘t_vb’清掉以后,就再也不会闪屏了。不过只能开启GUI以后再清除,因为,每次开GUI,它都会重置’t_vb’)
If't_vb' is cleared and 'visualbell' is set, no beep and no flash will ever occur.
That is achieved by entering the command:set vb t_vb=
after the GUI has started—see method 1 or method 2 below.(如果,vb是开的,且t_vb是清空的,那么就会不哔哔也不闪屏)
总结:
:set eb? vb? t_vb?
:set noeb
时,no beep occurs when an error message is displayed. However, other “errors” such as pressing Esc when in normal mode will cause a beep.(无错不哔哔,但是,按键Esc之类的会哔哔).:set vb
的话,遇错会闪屏,但是,按键Esc之类的会闪屏.:set t_vb=
会清掉’t_vb’ (so it will do nothing)
However, pressing Esc should also do nothing (no beep and no flash). The t_vb option controls how Vim flashes the screen (on both Unix and Windows systems, for both terminal and gui Vim). If the option is empty, Vim does not flash the screen.
To disable beeping (aka “bell”) and window flashing, put the following in your vimrc. This works on Unix and Windows systems for both terminal and GUI Vim.
set noeb vb t_vb=
au GUIEnter * set vb t_vb=
The above will give an error message if run on a Vim which was not compiled with the +autocmd
feature. To avoid that possibility, use:
set noerrorbells visualbell t_vb=
if has('autocmd')
autocmd GUIEnter * set visualbell t_vb=
endif
Another method:
Put the following in vimrc:
bash set noeb vb t_vb=
Put the following in gvimrc:
bash set vb t_vb=
9. vim中多窗口的编辑:
https://www.cnblogs.com/bkylee/p/6120060.html
鼠标在各个窗口间循环移动:
ctrl+w+(小写的 hjkl), "非线性"的跳转的: ctrl_w+t(top : 左上角, +b:> bottom, 右下角), p: preview: 上一个子窗口
10.WSL的vim里编写的文本文件,总是报错?
某些情况下,Windows系统下编写的代码文件传到Linux之后常会编译不通过,究其原因乃
两操作系统默认的文件编码方式
不同。
用vim编辑器打开文件,用set:ff
命令可查看当前fileformat,若是dos
,则应改其为unix
命令为:set ff=unix
三、功能们
自动补全
单词自动补全–CTRL+N/CTRL+P:
CTRL+n
:当你输入第一个字母的时候,再CTRL+n
,自动出现下拉菜单,单词默认选中第一个,继续CTRL+n
,CTRL+p
可以上下切换,或者用方向键(太慢)
CTRL+p
:同上,只是默认的选中的是列表中最后一个单词.
行自动补全:
CTRL+x CTRL+l
(l指小写的L ):两个命令组合使用。在插入模式下输入已经存在行的第一个单词,再按这两个键,就会列出该整行出来
文件名自动补全:
CTRL+x CTRL+f
:插入模式下,按这两个组合键,可以插入当前目录下的文件名。处用在哪里呢,当然是有时候我们要指定默认执行文件的路径,这样就方便啦。
字典补全:
首先在~/.vimrc
加入如下代码,注意这是在Linux,windows下应该是:\Users\$username
(用户名)
首先在~/.vimrc
加入如下代码,注意这是在Linux,windows下应该是C:\Users$username(用户名)
set dictionary-=$VIM/dic.txt dictionary+=$VIM/dic.txt
dic.txt中的单词一每行一个单词来分割的
CTRL+x CTRL+k
就能看到dic.txt中定义的单词的,如果你还麻烦,想直接CTRL+n就显示其中的列表的话,再配置一下.vimrc文件:
set complete-=k complete+=k
四、vim学习的资料、网站
简明 VIM 练级攻略
几个vim-cheat-sheet
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
http://tnerual.eriogerg.free.fr/vim.html
http://www.lagmonster.org/docs/vi.html
http://jrmiii.com/2009/03/06/learning-vim-the-pragmatic-way.html