vim学习笔记

vim配置推荐使用janus配置, 省掉自己配置和装插件的烦恼

janus-vim 常用快捷键

n: 打开NERDTree窗口
rt: 打开TagBar标签窗口

  • troubleshouting

    • 输入set list无法显示tab字符
      原因是janus-vim的插件可能修改了listchars选项, 在.vimrc.after加入如下语句:
      set listchars=eol:$,trail:~
      set nolist

    • 无法输入tab字符
      原因是janus-vim内还有SuperTab插件, 用于自动tab补全. 要输入tab字符, 必须先输入空格, 再按tab键. 如果想输入literal tab字符, 可以使用Ctrl+V TAB键输入

自动注释

准备comdg.vim和DoxgenToolkit.vim插件。
;ds 插入license和文件声明
DoxgenToolKit提供命令
:Dox 生成class和func注释
:DoxAuthor 生成作者注释

列操作

1.光标定位到要操作的地方。
2.CTRL+v 进入“可视 块”模式,选取这一列操作多少行。
3.SHIFT+i(I) 输入要插入的内容。
4.ESC 按两次,会在每行的选定的区域出现插入的内容。

全选

全部删除:按esc后,然后dG
全部复制:按esc后,然后ggyG
全选高亮显示:按esc后,然后ggvG或者ggVG

查看二进制文件

vim -b # -b选项告诉该文件为二进制文件,否则会在文件末尾加入0x0a字符;
!%xxd # 二进制查看
!%xxd -r # 回到正常模式

查看文件编码格式

:set fileencoding

启动在vim下使用鼠标复制

在.vimrc中增加set mouse=v

区分TAB字符与空格

ls -l|sed -n l: 可以查看ls命令输出的每一列是按什么字符分割的。其中sed -n后面跟的是L的小写字母。如果是TAB字符,输出\t字符,如果不是,则输出空格。
cat -T也能起到相同作用。

移动光标

w:光标以单词向前移动
nw:光标向前移动n个单词 光标到单词的第一个字母上
b:与w相反
e: 光标以单词向前移动
ne:光标向前移动n个单词 光标到单词的最后一个字母上
ge:与e相反
:n :移动到第n行的行尾
0(Num):移动光标到行首
^:移动光标到行首第一个非空字符上去
fa: 移动光标到当前行的字符a上,
nfa: 移动光标到当前行的第n个a字符上
F: 与f方向相反
%:移动到与制匹配的括号上去(),{},[],<>等。
nG或ngg:移动到第n行上
G或:到最后一行

括号、引用匹配修改

ci’, di’, yi’:修改、剪切或复制’之间的内容。
ca’, da’, ya’:修改、剪切或复制’之间的内容,包含’。
ci”, di”, yi”:修改、剪切或复制”之间的内容。
ca”, da”, ya”:修改、剪切或复制”之间的内容,包含”。
ci(, di(, yi(:修改、剪切或复制()之间的内容。
ca(, da(, ya(:修改、剪切或复制()之间的内容,包含()。
ci[, di[, yi[:修改、剪切或复制[]之间的内容。
ca[, da[, ya[:修改、剪切或复制[]之间的内容,包含[]。
ci{, di{, yi{:修改、剪切或复制{}之间的内容。
ca{, da{, ya{:修改、剪切或复制{}之间的内容,包含{}。
ci<, di<, yi<:修改、剪切或复制<>之间的内容。
ca<, da<, ya<:修改、剪切或复制<>之间的内容,包含<>。

正则匹配

通用匹配:
. – 匹配任何除换行符外的单个字符
\s – 匹配一个空白符(space或tab)
\S – 一个非空白符
^ – 仅匹配行首,也即必须以模式开头
$ – 仅匹配行尾,也即必须以模式结尾
\< – 匹配词首,单词定义为一连串的字母,标点空白和数字均视为分隔符
\> – 匹配词尾。
\<…\> – 匹配整个单词。当然\<和\>不必一起使用,可以分开使用
限量符:
* – 前一个字符出现0次或多次,如a*,可以匹配”, ‘a’, ‘aa’或’aaa’等
+ – 前一个字符出现1次或多次
\= – 前一个字符出现0次或1次
{n,m} – 前一个字符出现n到m,如a{3,5},则可以匹配’aaa’, ‘aaaa’或’aaaaa’
{n} – 前一个字符出现n次
{n,} – 前一个字符出现n次到最多次数(32000)
{} – 0次或多次,与*一致
操作符:
\| – 或,如ab\|ba,则匹配’ab’或’ba’

复制

复制多行

任务:将第9行至第15行的数据,复制到第16行
方法1:(强烈推荐)
:9,15 copy 16 或 :9,15 co 16
由此可有:
:9,15 move 16 或 :9,15 m 16 将第9行到第15行的文本内容到第16行的后面
分屏

复制当前行

用 . 表示当前行。
:co . 12
把当前行 copy 到行 12 的地方。

寄存器

a-z:都可以用作寄存器名。”ayy把当前行的内容放入a寄存器。
A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如”Ayy把当前行的内容追加到a寄存器中。
:reg 显示所有寄存器的内容。
“”:不加寄存器索引时,默认使用的寄存器。
“*:当前选择缓冲区,”*yy把当前行的内容放入当前选择缓冲区。
“+:系统剪贴板。”+yy把当前行的内容放入系统剪贴板。
*如果无法剪贴内容到系统剪贴板, 检查vim版本vim –version看有没有带+X11编译选项, 如果没有, ubuntu用户可以安装vim-gnome.
并且, 可以考虑在vimrc中加入vmap “+y简化操作, 使用Ctrl+C进行复制*

分屏

:new -> 分屏并且在新屏中建立一个空白文件 (split windows with a new blank file)
CTRL-w+j/k/h/l -> 利用CTRL加w加上j/k/h/l在不同的屏内切换 (switch, move between split screens)
Ctrl+W p 回到上一次窗口
CTRL-w+ -/+ -> 增减分屏的大小 (change split size)
CTRL-w+t -> 移动到最顶端的那个屏 (move to the top windows)
CTRL-w+b -> 移动到最下面的屏 (move to bottom window)
:close -> 关闭一个分出来的屏 (close splited screen)
:only -> 只显示光标当前屏 ,其他将会关闭(only display current active screen, close all others )
:qall -> 退出所有屏 (quite all windows)
:wall -> 保存所有屏 (write to all windows)
:wqall -> 保存并退出所有屏 (write and quite all windows)
:qall! -> 退出所有屏,不保存任何变动 (quite all windows without save)
开启文件的时候,利用 -o选项,就可以直接开启多个文件在分屏中 (with -o option from command line, it will open files and display in split mode)
vim -o a.txt b.txt

移动分屏

这个功能还是使用了Vim的光标键,只不过都是大写。
1. 向右移动。
Ctrl+W L
2. 向左移动
Ctrl+W H
3. 向上移动
Ctrl+W K
4. 向下移动
Ctrl+W J

交换窗口

function! MarkWindowSwap()
let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
“Mark destination
let curNum = winnr()
let curBuf = bufnr( “%” )
exe g:markedWinNum . “wincmd w”
“Switch to source and shuffle dest->source
let markedBuf = bufnr( “%” )
“Hide and open so that we aren’t prompted and keep history
exe ‘hide buf’ curBuf
“Switch to dest and shuffle source->dest
exe curNum . “wincmd w”
“Hide and open so that we aren’t prompted and keep history
exe ‘hide buf’ markedBuf
endfunction

nmap mw :call MarkWindowSwap()
nmap pw :call DoWindowSwap()

滚屏

向前翻页:CTRL+F
向下移动半屏:CTRL+d
向上移动半屏:CTRL+u
向后翻页:CTRL+B

折叠

zf – 创建折叠的命令,可以在一个可视区域上使用该命令;
zd – 删除当前行的折叠;
zD – 删除当前行的折叠;
zfap – 折叠光标所在的段;
zo – 打开折叠的文本;
zc – 收起折叠;
za – 打开/关闭当前折叠;
zr – 打开嵌套的折行;
zm – 收起嵌套的折行;
zR (zO) – 打开所有折行;
zM (zC) – 收起所有折行;
zj – 跳到下一个折叠处;
zk – 跳到上一个折叠处;
zi – enable/disable fold;

多行缩进技巧

按v进入visual状态,选择多行,用>或<缩进或缩出
通常根据语言特征使用自动缩进排版:在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format。使用gg=G可对整篇代码进行排版。

显示TAB键

:set list 显示TAB键
现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里。 这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端,或者使用 GUI 模式,Vim 可以用高亮显示空格和TAB。
使用 ‘listchars’ 选项,可以改变TAB键显示方式。
:set listchars=tab:>-,trail:-
现在,TAB会被显示成 “>—” 而行尾多余的空白字符显示成 “-“。看起来好多了,是吧?
:set nolist 取消显示TAB键

显示行尾空格

在/etc/vimrc文件添加如下两行
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s+$/

查看换行符格式

:set fileformat

TAB键与空格互换

将vim tab设置为4个空格
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab

对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!

空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!

加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。

map指令对应的模式

vim学习笔记_第1张图片

跳转

gd: 跳转到局部变量的定义处;
gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
g;: 上一个修改过的地方;
g,: 下一个修改过的地方;
[[: 跳转到上一个函数块开始,需要有单独一行的{。
]]: 跳转到下一个函数块开始,需要有单独一行的{。
[]: 跳转到上一个函数块结束,需要有单独一行的}。
][: 跳转到下一个函数块结束,需要有单独一行的}。
[{: 跳转到当前块开始处;
]}: 跳转到当前块结束处;
[/: 跳转到当前注释块开始处;
]/: 跳转到当前注释块结束处;
%: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。
ctrl+i, ctrl+o 跳转到原浏览位置

忽略错误信息

:silent! command

设置大小写不敏感

:set ignorecase 使 vim 在搜索或替换时对大小写不敏感;
:set noignorecase 使 vim 在搜索或替换时对大小写敏感;
:set ignorecase smartcase 只有在搜索模式中至少包含一个大写字母时, 才对大小写敏感。
在搜索模式前(中)加 /c 将使本次搜索对大小写不敏感,而加 /C 则将使本次搜索对大小写敏感。/c 和 /C 优先于 ignorecase 和 noignorecase 的设置,但它们只影响本次搜索。

为某种文件类型指定语法高亮

:set filetype=cpp

高亮超过列宽限制的字符

将以下内容加入到.vimrc中
if exists(‘+colorcolumn’)
set colorcolumn=80
else
au BufWinEnter * let w:m2=matchadd(‘ErrorMsg’, ‘\%>80v.+’, -1)
endif

quickfix模式下常用指令

:cc 显示详细错误信息 ( :help :cc )
:cp 跳到上一个错误 ( :help :cp )
:cn 跳到下一个错误 ( :help :cn )
:cl 列出所有错误 ( :help :cl )
:cw 如果有错误列表,则打开quickfix窗口 ( :help :cw )
:col 到前一个旧的错误列表 ( :help :col )
:cnew 到后一个较新的错误列表 ( :help :cnew )

无格式粘贴

:set paste
解释:vim运行在terminal时,无法区别键入的文件或粘贴的文本。使用该选项,会进入paste模式。

cscope使用

find /home/users/zhangjinjie02/databus/ -name ‘.c’ -o -name ‘.h’ -o -name ‘.cpp’ -o -name ‘.hpp’ > cscope.files
cscope -b
CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB

补全菜单命令

Ctrl-p 向前切换成员;
Ctrl-n 向后切换成员;
Ctrl-e 退出下拉菜单,并退回到原来录入的文字;
Ctrl-y 退出下拉菜单,并接受当前选项。

大小写转换

gu 转换为小写
gU 转换为大写

书签

书签是vim中非常强大的一个功能,书签分为文件书签跟全局书签。文件书签是你标记文件中的不同位置,然后可以在文件内快速跳转到你想要的位置。 而全局书签是标记不同文件中的位置。也就是说你可以在不同的文件中快速跳转
m{a-zA-Z} -> 保存书签,小写的是文件书签,可以用(a-z)中的任何字母标记。大写的是全局 书签,用大写的(A-Z)中任意字母标记。(mark position as bookmark. when lower, only stay in file. when upper, stay in global)
‘{a-zA-Z} -> 跳转到某个书签。如果是全局书签,则会开启被书签标记的文件跳转至标记的行 (go to mark. in file {a-z} or global {A-Z}. in global, it will open the file)
’0 -> 跳转入现在编辑的文件中上次退出的位置 (go to last exit in file)
g’{mark} -> 跳转到书签 (jump to {mark})
:delm{marks} -> 删除一个书签 (delete a mark) 例如:delma那么就删除了书签a
:delm! -> 删除全部书签 (delete all marks)
:marks -> 显示系统全部书签 (show all bookmarks)

其它

在vim中默认是’\’字符,可通过let mapleader = “,”设置为逗号
:.,30 s/^/#/g
可以看到 vim 命令针对当前行,在前面加个范围就可以针对多行。
wm : 同时开启文件夹浏览和标签

vim脚本学习

变量类型

没有前缀的变量,如果在函数中,则local to function,否则为全局变量
s:name local to vim script
b:name local to current buffer
w:name local to current window
l:name local to a function
g:name 全局变量
v:name vim预定义的全局变量
a:name 函数参数,仅在函数中使用

vimdiff用法

:set noscrollbind 取消同步移动
]c 跳到下一个不同的地方
[c 跳到上一个不同的地方
2]c 跳转到下下个不同的地方
dp (diff put)将当前窗口光标位置处的内容复制到另一窗口
do (diff obtain)将另一窗口光标位置处的内容复制到当前窗口
diffupdate 重新比较两个文件,如果手动修改文件的话有时不会自动同步

你可能感兴趣的:(linux工具集)