您的位置:首页 > 其它

vim学习笔记

2015-07-24 13:38 846 查看
vim配置推荐使用janus配置, 省掉自己配置和装插件的烦恼

janus-vim 常用快捷键

<leader>n
: 打开NERDTree窗口

<leader>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! -> 退出所有屏
d0c3
,不保存任何变动 (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指令对应的模式



跳转

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 重新比较两个文件,如果手动修改文件的话有时不会自动同步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vim