" 关闭 vi 兼容模式
set nocompatible

" 设置文件编码和内部编码
set fileencoding=utf8 encoding=utf8

" 禁止产生备份文件
set nobackup

" 当文件在外部发生更改时，自动读取更改后的内容
set autoread

" 保存文件时，禁止在文件底部添加新行
set nofixendofline

" 当读取/写入文件时使用的 <EOL>，Windows 默认使用 dos，Unix 和 Mac 默认使用 unix
set fileformat=dos

" 当创建新文件或读取文件时会尝试使用的换行规则
set fileformats=unix,dos,mac

" 允许在哪些地方退格（自动缩进、行尾、插入模式光标处）
set backspace=indent,eol,start

" 缩进空格数、Tab 代表的空格数、插入 Tab 时插入的空格数、Tab 展开（使用空格替代 Tab）
set shiftwidth=2 tabstop=2 softtabstop=2 expandtab

" 自动缩进，创建新行时沿用上一行的缩进
set autoindent

" 增量搜索，每次键入字符时进行实时匹配
set incsearch

" 对于多按键操作，在屏幕底部显示键入的命令
set showcmd

" 开启行号
set number

" 显示光标所在的行和列
set ruler

" 保存 50 个命令行内容
set history=50

" 禁止响铃及闪屏
au GUIEnter * set vb t_vb=

" 使用逗号作为映射前导符
let mapleader = ","

" 使用垂直窗口打开帮助内容
autocmd FileType help wincmd L

filetype plugin indent on

" 如果操作系统是 Windows 32位或64位
if has("win32")
  let g:gvim_fullscreen_lib = $VIMRUNTIME . '/../vimfiles/dll/gvimfullscreen.dll'
  " 如果操作系统是 Windows 64位
  if has("win64")
    let g:gvim_fullscreen_lib = $VIMRUNTIME . '/../vimfiles/dll/gvimfullscreen_x64.dll'
  endif
  nnoremap <F11> :call libcallnr(g:gvim_fullscreen_lib, "ToggleFullScreen", 0)<CR>
  inoremap <F11> <ESC>:call libcallnr(g:gvim_fullscreen_lib, "ToggleFullScreen", 0)<CR>a
endif

" 在图形化环境中运行
if has("gui_running")
  " 去除所有图形界面元素
  set guioptions=

  " 设置窗口大小
  set lines=36 columns=128

  " 设置启动时窗口左上角的显示位置
  winpos 800 400

  " 在图形化环境使用 solarized 配色
  colorscheme solarized
else
  " 在其他环境中使用 monokai 配色
  color monokai
endif

" 当支持彩色（色彩数量大于 2）且运行在图形化环境时，打开语法高亮和搜索高亮
if &t_Co > 2 || has("gui_running")
  syntax on
  set hlsearch
endif

if has("autocmd")
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif
endif

" 设置字体
set guifont=Consolas:h14:cANSI:qDRAFT

" 设置宽字符字体
set guifontwide=Microsoft_Yahei_Mono:h14:cANSI:qDRAFT

" 切换 Tab 代表的空格数
function ToggleTabWidth()
    if &shiftwidth == 4
        let width = 2
    else
        let width = 4
    endif
    exe "set shiftwidth=" . width . " tabstop=" . width . " softtabstop=" . width . " expandtab"
endfunction

" 切换字体
function ToggleFont()
    if &guifont == 'fixedsys'
        exec "set guifont=Consolas:h14:cANSI:qDRAFT"
    else
        exec "set guifont=fixedsys"
    endif
endfunction

" 打开/关闭行与列的高亮
function ToggleCrossHighlight()
    if &cursorline == 0
        exec "set cursorline"
        exec "set cursorcolumn"
    else
        exec "set nocursorline"
        exec "set nocursorcolumn"
    endif
endfunction

" ================================================
" 全局快捷键
" ================================================
" 保存文件
noremap <F1> :write<CR>
inoremap <F1> <ESC>:write<CR>

" 打开/关闭目录
" nerdtree.vim
noremap <silent> <F2> :NERDTreeToggle<CR>

" 打开/关闭日历
" calendar.vim
nnoremap <silent> <F3> :call ToggleCalendar()<CR>

" 打开/关闭代码结构
" tagbar.vim
nnoremap <silent> <F12> :TagbarToggle<CR>

" 调整当前窗口尺寸
nnoremap <silent> <S-F11> :vertical resize -2<CR>
nnoremap <silent> <S-F12> :vertical resize +2<CR>
nnoremap <silent> <M-S-F11> :resize -2<CR>
nnoremap <silent> <M-S-F12> :resize +2<CR>

inoremap <silent> <S-F11> <ESC>:vertical resize -2<CR>a
inoremap <silent> <S-F12> <ESC>:vertical resize +2<CR>a
inoremap <silent> <M-S-F11> <ESC>:resize -2<CR>a
inoremap <silent> <M-S-F12> <ESC>:resize +2<CR>a

" 打开/关闭表格模式
" vim-table-mode.vim
nnoremap <leader>ttm :TableModeToggle<CR>

" 打开/关闭 GitGutter
" vim-gitgutter.vim
nnoremap <leader>tgg :GitGutterToggle<CR>

" 打开 Colorizer
" colorizer.vim
nnoremap <leader>tch :ColorHighlight<CR>

" 关闭 Colorizer
" colorizer.vim
nnoremap <leader>tcc :ColorClear<CR>

" 编辑配置文件
nnoremap <leader>ev :vsplit $VIM/vimfiles/config/core.vim<CR>

" 使配置文件生效
nnoremap <silent> <leader>sv :source $VIM/vimfiles/config/core.vim<CR>

" 新建标签页
nnoremap <C-T> :tabnew<CR>
inoremap <C-T> <ESC>:tabnew<CR>

" 切换标签页
nnoremap <C-PageUp> :tabprevious<CR>
inoremap <C-PageUp> <ESC>:tabprevious<CR>
nnoremap <C-PageDown> :tabnext<CR>
inoremap <C-PageDown> <ESC>:tabnext<CR>

" 打开/关闭搜索高亮
nnoremap <silent> <leader>th :set nohlsearch!<CR>

" 上下移动时，将长行当作断行对待
nnoremap j gj
nnoremap k gk

" 打开/关闭拼写检查
nnoremap <silent> <leader>ts :setlocal spell!<CR>

" 跳到下一处错误
nnoremap <leader>sn ]s

" 跳到上一处错误
nnoremap <leader>sp [s

" 将当前词加入词典
nnoremap <leader>sa zg

" 为当前错误提供可能的正确选项
nnoremap <leader>ss z=

" 关闭当前文件/标签页
nnoremap <silent> <leader>q :q<CR>

" 插入模式模仿 Emacs 快捷键
inoremap <C-F> <RIGHT>
inoremap <C-B> <LEFT>
inoremap <C-N> <DOWN>
inoremap <C-P> <UP>
inoremap <C-E> <END>
inoremap <C-A> <HOME>

" 快速跳转到其他窗口
noremap <C-J> <C-W>j
noremap <C-K> <C-W>k
noremap <C-L> <C-W>l
noremap <C-H> <C-W>h

" 时间与日期展开
iab xtime <C-R>=strftime("%Y-%m-%d %H:%M:%S")<CR>
iab xdate <C-R>=strftime("%Y-%m-%d")<CR>

" ================================================
" Windows 相关
" ================================================
if has("clipboard")
  " 剪切
  vnoremap <C-X> "+x
  vnoremap <S-Del> "+x

  " 复制
  vnoremap <C-C> "+y
  vnoremap <C-Insert> "+y

  " 粘贴
  map <C-V>		"+gP
  map <S-Insert>		"+gP

  cmap <C-V>		<C-R>+
  cmap <S-Insert>		<C-R>+
endif

" 全选
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

" ================================================
" 插件
" ================================================
" 启用 pathogen 插件
execute pathogen#infect()

source $VIMRUNTIME/../vimfiles/config/calendar.vim
source $VIMRUNTIME/../vimfiles/config/lightline.vim
source $VIMRUNTIME/../vimfiles/config/nerdtree.vim
source $VIMRUNTIME/../vimfiles/config/tagbar.vim
source $VIMRUNTIME/../vimfiles/config/colorizer.vim
source $VIMRUNTIME/../vimfiles/config/nerdcommenter.vim
source $VIMRUNTIME/../vimfiles/config/vim-gitgutter.vim
source $VIMRUNTIME/../vimfiles/config/vim-markdown.vim
source $VIMRUNTIME/../vimfiles/config/vim-table-mode.vim
source $VIMRUNTIME/../vimfiles/config/vim-fugitive.vim
source $VIMRUNTIME/../vimfiles/config/coc.nvim.vim
