" 定义快捷键的前缀,即<Leader>
let mapleader=";"
" 启用:Man命令查看各类man信息
source $VIMRUNTIME/ftplugin/man.vim
" 定义:Man命令查看各类man信息的快捷键
nmap <Leader>man :Man 3 <cword><CR>
" 映射之后就可以少按一下 Shift 键。
cmap man Man
" 开启文件类型侦测
filetype on
" 根据侦测到的不同类型加载对应的插件
filetype plugin on
" 开启实时搜索功能
set incsearch
" 搜索时大小写不敏感
set ignorecase
" 关闭兼容模式
set nocompatible
set backspace=indent,eol,start
" vim 自身命令行模式智能补全
set wildmenu
syntax on " 语法高亮
"set ignorecase " 搜索模式里忽略大小写
set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
set smartindent " 智能对齐方式
"au FileType c, cpp setlocal smartindent
filetype plugin indent on
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度
set shiftwidth=4 " (自动) 缩进使用的4个空格
"au FileType c, cpp setlocal cindent
set cindent " 使用 C/C++ 语言的自动缩进方式
"au FileType c, cpp setlocal cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式,显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set mouse=v " 使用鼠标粘贴
set number " Enable line number "显示行号
"set previewwindow " 标识预览窗口
set history=50 " set command history to 50 "历史记录50条
"--状态行设置--
set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
" 获取当前路径,将$HOME转化为~
function! CurDir()
let curdir = substitute(getcwd(), $HOME, "~", "g")
return curdir
endfunction
"在状态栏上显示当前打开文件的绝对路径
set statusline=%{CurDir()}\/%f%m%r%h
set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
"--命令行设置--
set showcmd " 命令行显示输入的命令
set showmode " 命令行显示vim当前模式
set incsearch " 输入字符串就显示匹配点
set hlsearch " 高亮显示搜索结果
set splitright " 竖直分屏时,在右侧新建缓冲区, 同理也可以设置 splitbelow
" 高亮显示当前行/列
"set cursorline
"set cursorcolumn
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T
" 禁止生成 .swp 文件
set noswapfile
set maxmempattern=100000
set textwidth=100 " 在文本行超过一定长度时自动换行
" 窗体改变时,分屏保持等宽
autocmd VimResized * exec "normal!\<c-w>="
nmap <c-l> $
nmap <c-h> ^
nmap <c-j> 3j
nmap <c-k> 3k
imap <c-l> <ESC>$
imap <c-h> <ESC>^
vmap <c-l> $
vmap <c-h> ^
nmap <C-c> :w<CR>
imap <C-c> <ESC>:w<CR>
nmap <leader>q :q<CR>
"vmap d d:w<CR>
"nmap dd dd:w<CR>
"和系统剪贴板之间的拷贝粘贴
"vmap <Leader>y "+y
"vmap <Leader>d "+d
"nmap <Leader>p "+p
"nmap <Leader>P "+P
"vmap <Leader>p "+p
"vmap <Leader>P "+P
inoremap { {}<left>
inoremap {<CR> {<CR>}<ESC>O
inoremap [ []<left>
inoremap ( ()<left>
inoremap " ""<left>
inoremap ' ''<left>
inoremap ` ``<left>
set pastetoggle=<F11>
" 针对 golang 代码,在 {} 中按回车,换行 2 次,光标停在第二行中间
function! s:InsertNLBetweenCurlyBraces()
if strpart(getline('.'), col('.') - 2, 2) == '{}'
return "\<CR>\<CR>\<Up>\<Tab>"
endif
return "\<CR>"
endfun
autocmd FileType go inoremap <CR> <C-R>=<SID>InsertNLBetweenCurlyBraces()<CR>
"在 GVIM 中 shift + insert 生效
if has("gui_running")
map <silent> <S-Insert> "+p
imap <silent> <S-Insert> <Esc>"+pa
endif
" 分屏窗口移动
map <leader>jj <C-W>j //这个快捷键已经被占用
map <leader>kk <C-W>k
map <leader>hh <C-W>h
map <leader>ll <C-W>l
" tmux 设置
if exists('$TMUX')
set term=screen-256color
endif
" ====================================================== vim 标签页 设置
" 来自 https://zhuanlan.zhihu.com/p/20902166
noremap <silent><tab>n :tabn<cr>
noremap <silent><tab>p :tabp<cr>
noremap <silent><s-tab> :tabnext<CR>
" make tabline in terminal mode
function! Vim_NeatTabLine()
let s = ''
for i in range(tabpagenr('$'))
" select the highlighting
if i + 1 == tabpagenr()
let s .= '%#TabLineSel#'
else
let s .= '%#TabLine#'
endif
" set the tab page number (for mouse clicks)
let s .= '%' . (i + 1) . 'T'
" the label is made by MyTabLabel()
let s .= ' %{Vim_NeatTabLabel(' . (i + 1) . ')} '
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 .= '%=%#TabLine#%999XX'
endif
return s
endfunc
" get a single tab name
function! Vim_NeatBuffer(bufnr, fullname)
let l:name = bufname(a:bufnr)
if getbufvar(a:bufnr, '&modifiable')
if l:name == ''
return '[No Name]'
else
if a:fullname
return fnamemodify(l:name, ':p')
else
return fnamemodify(l:name, ':t')
endif
endif
else
let l:buftype = getbufvar(a:bufnr, '&buftype')
if l:buftype == 'quickfix'
return '[Quickfix]'
elseif l:name != ''
if a:fullname
return '-'.fnamemodify(l:name, ':p')
else
return '-'.fnamemodify(l:name, ':t')
endif
else
endif
return '[No Name]'
endif
endfunc
" get a single tab label
function! Vim_NeatTabLabel(n)
let l:buflist = tabpagebuflist(a:n)
let l:winnr = tabpagewinnr(a:n)
let l:bufnr = l:buflist[l:winnr - 1]
return Vim_NeatBuffer(l:bufnr, 0)
endfunc
" get a single tab label in gui
function! Vim_NeatGuiTabLabel()
let l:num = v:lnum
let l:buflist = tabpagebuflist(l:num)
let l:winnr = tabpagewinnr(l:num)
let l:bufnr = l:buflist[l:winnr - 1]
return Vim_NeatBuffer(l:bufnr, 0)
endfunc
" setup new tabline, just like %M%t in macvim
set tabline=%!Vim_NeatTabLine()
set guitablabel=%{Vim_NeatGuiTabLabel()}