Vim用法

介绍

Vim是...

配置

  • 设置Tab键为4格,在配置文件/etc/vimrc中加入一行:
set ts=4
  • 设置语法高亮的颜色方案
# 颜色方案目录:/usr/share/vim/vim74/colors
 
# 个人喜欢的方案:desert, koehler,但都不能突出函数名,以及自定义变量类型
:colo <scheme>
  • 关闭自动注释
::set fo-=r

基础

  • 替换命令
语法为 :[addr]s/源字符串/目的字符串/[option]
全局替换命令为::%s/源字符串/目的字符串/g
[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”;
“. ,$” :从当前行到文件尾;
s : 表示替换操作
[option] : 表示操作类型
如:g 表示全局替换; 
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义

常见用法

# go to file, jump to C/C++ header file
gf
 
# 合并行
J
 
# 加密 (encryption)
vim -x filename

进阶

  • 括号匹配:
%
  • vim中获取root权限:
:w !sudo tee %
  • 执行外部命令(shell):
:! [command]

参考: https://www.linux.com/learn/tutorials/442419-vim-tips-working-with-external-commands

  • 按十六进制显示:
# 转换十六进制
:%!xxd
 
# 恢复
:%!xxd -r
  • 标签页功能
## 1. 配置 
 
set tabpagemax=18  #VIM默认只能打开10个标签页,在配置文件可以修改这个限制: 
 
set showtabline=0  #不显示标签栏 
set showtabline=1  #这是默认设置,意思是,在创建标签页后才显示标签栏。 
set showtabline=2  #总是显示标签栏 
 
## 2. 命令行命令: 
 
:tabe filename   #用标签页打开文件 
:tabnew filename #用标签页打开文件 
:tab split       #用标签页打开当前编辑的文件 
:tabf filename*  #用标签页打开与通配符匹配的一个文件 
:tabs #显示所有标签页,> 指示当前页,+ 显示修改未保存 
 
:tabc #关闭当前标签页,功能等同于:q 
:tabo #关闭所有标签页 
 
:tabn #跳转后一个标签页 
:tabp #跳转前一个标签页 
:tabfirst #跳转第一个标签页 
:tabr #跳转第一个标签页 
:tablast #跳转最后一个标签页 
 
:tabm 0/1/2 #将当前标签页移动到第1/2/3个页面位置 
 
:tabdo #对多个标签页同时执行命令,如 
:tabdo %s/aaa/bbb/g 
 
## 3. 跳转操作命令: 
 
gt #跳转后一个标签页 
gT #跳转前一个标签页
ngt #跳转到第个标签页
  • vimdiff操作(文件比对)
## 使用vim的比较模式打开两个文件:
vim -d file1 file2
#或
vimdiff file1 file2
 
## 如果已经打开了文件file1,再打开另一个文件file2进行比较:
:vert diffsplit file2  #如果没有用vert命令,diffsplit则会分上下两个窗口。
 
## 如果已经用split方式打开了两个文件file1,file2,又想比较两文件的不同。分别在两个窗口里面输入命令:
:diffthis
 
##  如果更改了某个窗口的内容,vim又没有自动更新diff检查,可以使用如下命令更新:
:diffupdate
 
## 定位到不同点:
[c     #跳到前一个不同点
]c     #跳到后一个不同点
 
## 在窗口间跳转:
ctrl-w w    # 跳到下一个窗口
ctrl-w h    # 跳到左侧窗口
ctrl-w l    # 跳到右侧窗口
ctrl-w j    # 跳到下方的窗口
ctrl-w k    # 跳到上方的窗口
 
## 合并文档:
dp          # 将差异点的当前文档内容应用到另一文档(diff put)
do          # 将差异点的另一文档的内容拷贝到当前文档(diff get)
 
## 上下文的展开和查看
## 比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以这样设置:
:set diffopt=context:3
 
zo          # 临时展开被折叠的相同的文本行 (folding open, z这个字母看上去比较像折叠的纸) 
zc          # 折叠相同的文本行 (folding close)

高级

recording模式

  • 第一步:在正常模式下(非insert模式、非visual模式)按下q键盘
  • 第二步:选择a-z或0-9中任意一个作为缓冲器的名字,准备开始录制宏
  • 第三步:正常的操作,此次所有的操作都会被记录在上一步中定义的缓冲器中
  • 第四步:在非insert模式下输入q停止宏的录制
  • 第五步:使用@ + 第二步中定义的缓冲器的名字即可,前面输入数字为执行的次数。

参考: http://vim.wikia.com/wiki/Recording_keys_for_repeated_jobs

ctags用法

# Run Ctags recursively over the entire kernel to generate the tags file
ctags . -R / ctags -R *
 
# List support languages
ctags --list-languages
# Specify language
ctags --languages=C++ -R .
 
 
# To search for a specific tag and open Vim to its definition
vim -t <tag>
 
# Jump to the tag underneath the cursor
ctrl + ]
 
# Jump to the n-th match tag 
n + ctrl + ]
 
# Jump back up in the tag stack
ctrl + t
 
# Get a picklist first
g + ]
 
# Jump to the tag 
:tag <tag>
 
# Search for a particular tag
:ts <tag> <RET>
 
# List all of the definitions of the last tag
:ts
 
# Go to the next definition for the last tag
:tn
 
# Go to the previous definition for the last tag
:tp
 
# Open the definition in a horizontal split
Ctrl + w and Ctrl + ]
  • 新增映射
# Add these lines in vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>
 
# Open the definition in a new tab
Ctrl + \
 
# Open the definition in a vertical split
Alt + ]

编码

# encodings: utf-8(utf8), cp936(GBK)
 
# edit with <encoding>. if opens Windows file, mostly the encoding is cp936(GBK)
:e ++enc=<encoding>
 
# set file encodings, show current setting if without any <encoding>
:set fileencodings[=<encoding>]
 
# set encoding (unkown the effect yet)
:set encoding[=<encoding>]

显示tab序号

" show tab number
set tabline=%!MyTabLine()  " custom tab pages line
function MyTabLine()
    let s = '' " complete tabline goes here
    " loop through each tab page
    for t in range(tabpagenr('$'))
        " set highlight
        if t + 1 == tabpagenr()
            let s .= '%#TabLineSel#'
        else
            let s .= '%#TabLine#'
        endif
        " set the tab page number (for mouse clicks)
        let s .= '%' . (t + 1) . 'T'
        let s .= ' '
        " set page number string
        let s .= t + 1 . ' '
        " get buffer names and statuses
        let n = ''      "temp string for buffer names while we loop and check buftype
        let m = 0       " &modified counter
        let bc = len(tabpagebuflist(t + 1))     "counter to avoid last ' '
        " loop through each buffer in a tab
        for b in tabpagebuflist(t + 1)
            " buffer types: quickfix gets a [Q], help gets [H]{base fname}
            " others get 1dir/2dir/3dir/fname shortened to 1/2/3/fname
            if getbufvar( b, "&buftype" ) == 'help'
                let n .= '[H]' . fnamemodify( bufname(b), ':t:s/.txt$//' )
            elseif getbufvar( b, "&buftype" ) == 'quickfix'
                let n .= '[Q]'
            else
                let n .= pathshorten(bufname(b))
            endif
            " check and ++ tab's &modified count
            if getbufvar( b, "&modified" )
                let m += 1
            endif
            " no final ' ' added...formatting looks better done later
            if bc > 1
                let n .= ' '
            endif
            let bc -= 1
        endfor
        " add modified label [n+] where n pages in tab are modified
        if m > 0
            let s .= '[' . m . '+]'
        endif
        " select the highlighting for the buffer names
        " my default highlighting only underlines the active tab
        " buffer names.
        if t + 1 == tabpagenr()
            let s .= '%#TabLineSel#'
        else
            let s .= '%#TabLine#'
        endif
        " add buffer names
        if n == ''
            let s.= '[New]'
        else
            let s .= n
        endif
        " switch to no underlining and add final space to buffer list
        let s .= ' '
    endfor
    " after the last tab fill with TabLineFill and reset tab page nr
    let s .= '%#TabLineFill#%T'
    " right-align the label to close the current tab page
    if tabpagenr('$') > 1
        "let s .= '%=%#TabLineFill#999Xclose'
        let s .= '%=%#TabLineFill#X'
    endif
    return s
endfunction

插件

Github: https://github.com/DonghuaLau/Vim-Studio

CTags

见上文

vundle

还没体验,听说很好用。

Tagbar

# 打开
:TagbarToggle

ctrlp.vim

Ctrl + p

ag.vim

依赖:https://github.com/ggreer/the_silver_searcher
# CentOS下安装the_silver_searcher
rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm  (CentOS 7)
rpm -Uvh http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm  (CentOS 6)
yum install the_silver_searcher
  • 用法
:Ag [options] {pattern} [{directory}]
 
# 搜索光标所在位置的单词
:Ag
  • 常见问题
1.在CentOS 6.4或更低版本编译the_silver_searcher时,遇到如下错误
./configure: line 3953: syntax error near unexpected token `PCRE,'
./configure: line 3953: `PKG_CHECK_MODULES(PCRE, libpcre)'
 
【解决方法】
原因应该是autoconf, pkgconfig之类的版本过低导致。
有个简单粗暴的解决方法。
1.安装依赖库:yum -y install pcre-devel xz-devel
2.把configure中的有PKG_CHECK_MODULES的行注释掉
3.执行./configure,这样生成的Makefile里没有添加上面的两个依赖库
4.然后修改Makefile中的LIBS,追加-lpcre -llzma
5.make,就会生成ag,直接拿来用就行

project

http://blog.csdn.net/ithomer/article/details/7090318

# 打开
vim +Project
# or
:Project
 
# 输入\C(斜杠+大写的C),会出现下面这些信息。\C(递归读取子目录) \c(读取当前文件)。
\ + C
\ + c
Enter the Name of the Entry: ProjectName (项目名称)
Enter the Absolute Directory to Load:  ProjectPath (项目路径目录)
Enter the CD parameter: . (“.”为当前目录)
Enter the File Filter:  (符合条件的源文件,一般为空)
 
# 更新目录
\ + R
 
# 不能更新新创建的目录,只能删除项目重建,或下面的代码,然后更新目录。如果目录层级比较多,还是建议重建
Name=Path {
}

YouCompleteMe

还未使用

Plugin Development

GVIM

Windows版

# 配置文件: _vimrc
 
set tabstop=4
 
# set lines and columns
set lines=40 columns=160
 
# set default work directory
cd D:\ 
 
set guifont=Courier\ new
 
# 不换行
set nowrap
 
# 设置背景颜色和字体颜色
highlight Normal guibg=Black guifg=White
 
# Disable automatic comment insertion
set formatoptions-=tcq
# Check your format options
set formatoptions?

UTF-8乱码问题

" 解决乱码
"set guifont=Consolas:h10:cANSI
set encoding=utf-8
set fileencodings=utf-8,chinese
set termencoding=utf-8
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8
source: http://liudonghua.net/wiki/Vim