NeoVim飞升过程
为什么选择 Neovim
安装
Windows
-
Scoop :
scoop install neovim
-
Chocolatey :
choco install neovim
macOS / OS X
-
brew :
brew install neovim
-
Macports :
sudo port selfupdate && sudo port install neovim
Linux
Linux AppImage通用包
curl -LO https://github.com/neovim/neovim/releases/download/stable/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage
常见Linux发行版
-
Arch Linux :
sudo pacman -S neovim
python模块 :
sudo pacman -S python-pynvim
,Python2 和 Ruby 模块python2-neovim
、ruby-neovim
-
CentOS / RHEL :
Neovim可通过EPEL(企业Linux的额外软件包)获得
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# python模块
yum install -y neovim python3-neovim
# 在较旧的版本上,可能需要python2-neovim
-
Debian :
sudo apt-get install neovim
python模块 :
sudo apt-get install python-neovim
、sudo apt-get install python3-neovim
-
Fedora :
sudo dnf install -y neovim python3-neovim
-
Ubuntu :
sudo apt install neovim
python模块 :
sudo apt install python-neovim
、sudo apt install python3-neovim
旧版Ubuntu使用:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt-get update
sudo apt-get install neovim
# python模块
sudo apt-get install python-dev python-pip python3-dev python3-pip
sudo apt-get install python-dev python-pip python3-dev
sudo apt-get install python3-setuptools
sudo easy_install3 pip
BSD (Unix)
-
FreeBSD :
pkg install neovim
python模块 :
pkg install py27-pynvim py36-pynvim
-
OpenBSD :
pkg_add neovim
Nvim 配置
参考 从零开始配置 Neovim(Nvim) - MartinLwx's Blog
在配置 Nvim
的时候,我们 尽可能用 Lua 语言写配置,因此有必要了解一下 Lua 的基本语法和语义。可以快速浏览一下 lua基础语法 了解大概
GitHub - rockerBOO/awesome-neovim: Neovim 插件集合
配置文件路径
Nvim
的配置目录在 ~/.config/nvim
下。在 Linux/Mac 系统上,Nvim
会默认读取 ~/.config/nvim/init.lua
文件,理论上来说可以将所有配置的东西都放在这个文件里面,但这样不是一个好的做法,因此我们划分不同的文件和目录来分管不同的配置
.config/nvim
├── init.lua
└── lua
├── config
│ ├── keymaps.lua
│ ├── lazy.lua
│ └── options.lua
└── plugins
├── nvim-cmp.lua
├── nvim-lspconfig.lua
└── tokyonight.lua
init.lua
为Nvim
配置的切入点,主要用来导入其它*.lua
文件config/
目录用于存放各种插件自身的配置,文件名为插件的名字,这样比较好找。这里的nvim-cmp.lua
就是nvim-cmp
插件的配置文件lua/
目录。当我们在 Lua 里面调用require
加载模块(文件)的时候,它会自动在lua
文件夹里面进行搜索- 将路径分隔符从
/
替换为.
,然后去掉.lua
后缀就得到了require
的参数格式 - 比如要导入上面的
nvim-cmp.lua
文件,可以用require('config.nvim-cmp')
config
目录用于存放各类配置keymaps.lua
配置按键映射lazy.lua
插件管理器options.lua
配置选项
plugins
目录用于存放各类插件nvim-cmp.lua
自动补全相关nvim-lspconfig.lua
LSP插件tokyonight.lua
配置主题
- 将路径分隔符从
选项配置
主要用到的就是 vim.g
、vim.opt
、vim.cmd
等,快速参照对比的表格
In Vim |
In Nvim |
Note |
---|---|---|
let g:foo = bar |
vim.g.foo = bar |
|
set foo = bar |
vim.opt.foo = bar |
set foo = vim.opt.foo = true |
some_vimscript |
vim.cmd(some_vimscript) |
按键配置
在 Nvim
里面进行按键绑定的语法如下,具体的解释可以看 :h vim.keymap.set
vim.keymap.set(<mode>, <key>, <action>, <opts>)
从零开始配置 Nvim
在安装完成之后,如果 ~/.config/nvim
目录不存在,创建目录并新建 init.lua
文件
mkdir ~/.config/nvim
mkdir ~/.config/nvim/lua
touch ~/.config/nvim/init.lua
配置文件编辑保存之后,重启 Nvim
就能看到效果,后面默认每次小章节配置完成后就重启
选项配置
选项配置功能一览:
- 默认采用系统剪贴板,同时支持鼠标操控
Nvim
- Tab 和空格的转换
- UI 界面
- "智能"搜索
新建 ~/.config/nvim/lua/config/options.lua
文件并加入如下内容
-- 提示:如果需要,使用 `:h <option>` 来了解含义
vim.opt.clipboard = 'unnamedplus' -- 使用系统剪贴板
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
vim.opt.mouse = 'a' -- 允许在 Nvim 中使用鼠标
-- Tab
vim.opt.tabstop = 4 -- 每个 TAB 的视为的空格数
vim.opt.softtabstop = 4 -- 编辑时制表符的空格数
vim.opt.shiftwidth = 4 -- 插入 4 个空格作为一个制表符
vim.opt.expandtab = true -- 制表符用空格表示,主要因为 Python
-- UI 配置
vim.opt.number = true -- 显示绝对行号
vim.opt.relativenumber = true -- 在左侧添加每行的相对行号
vim.opt.cursorline = true -- 高亮光标所在行
vim.opt.splitbelow = true -- 新的竖向分割在底部打开
vim.opt.splitright = true -- 新的横向分割在右侧打开
-- vim.opt.termguicolors = true -- 在 TUI 中启用 24 位 RGB 颜色
vim.opt.showmode = false -- 我们是经验丰富的用户,不需要 "-- INSERT --" 模式提示
-- 搜索
vim.opt.incsearch = true -- 输入字符时进行搜索
vim.opt.hlsearch = false -- 不高亮匹配项
vim.opt.ignorecase = true -- 默认情况下搜索时忽略大小写
vim.opt.smartcase = true -- 如果输入大写字母则变为区分大小写
然后打开 init.lua
,用 require
导入刚才写的 options.lua
文件
require('config.options')
按键配置
按键功能一览:
- 用
<C-h/j/k/l>
快速在多窗口之间移动光标 - 用
Ctrl
+ 方向键进行窗口大小的调整 - 选择模式下可以一直用
Tab
或者Shift-Tab
改变缩进
新建 ~/.config/nvim/lua/config/keymaps.lua
文件并放入如下内容
-- 定义常用选项
local opts = {
noremap = true, -- 非递归
silent = true, -- 不显示消息
}
-----------------
-- 普通模式 --
-----------------
-- 提示:查看 `:h vim.map.set()`
-- 更好的窗口导航
vim.keymap.set('n', '<C-h>', '<C-w>h', opts)
vim.keymap.set('n', '<C-j>', '<C-w>j', opts)
vim.keymap.set('n', '<C-k>', '<C-w>k', opts)
vim.keymap.set('n', '<C-l>', '<C-w>l', opts)
-- 使用箭头调整大小
-- 增量:2 行
vim.keymap.set('n', '<C-Up>', ':resize -2<CR>', opts)
vim.keymap.set('n', '<C-Down>', ':resize +2<CR>', opts)
vim.keymap.set('n', '<C-Left>', ':vertical resize -2<CR>', opts)
vim.keymap.set('n', '<C-Right>', ':vertical resize +2<CR>', opts)
-----------------
-- 可视模式 --
-----------------
-- 提示:以与先前区域相同的区域和相同模式开始可视模式
vim.keymap.set('v', '<', '<gv', opts)
vim.keymap.set('v', '>', '>gv', opts)
然后在 init.lua
文件里面再次加上一行导入这个文件
require('config.keymaps')
安装插件管理器
一个强大的 Nvim
离不开插件的支持。我们选用的是当下最为流行 lazy.nvim。它支持如下许多特性:
- 正确处理不同插件之间的依赖
- 支持定制 Lazy loading,比如基于 Event、Filetype 等
新建~/.config/nvim/lua/config/lazy.lua
文件并放入如下内容。下面的模板只完成了lazy.nvim
自身的安装,还没有指定其他第三方插件
-- 启动 lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "克隆 lazy.nvim 失败:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\n按任意键退出..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
-- 确保在加载 lazy.nvim 之前设置 `mapleader` 和 `maplocalleader`
-- 以便映射正确。这也是设置其他选项(vim.opt)的好地方
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"
-- 设置 lazy.nvim
require("lazy").setup({
spec = {
-- 导入~/.config/nvim/lua/plugins下的所有插件
{ import = "plugins" },
},
-- 在此配置任何其他设置。有关更多详细信息,请参阅文档。
-- 安装插件时将使用的颜色方案。
install = { colorscheme = { "habamax" } },
-- 自动检查插件更新
checker = { enabled = true },
})
在 lazy.nvim
指定第三方插件很简单,只需要在 require("lazy").setup({ ... })
的 ...
里面声明插件
然后在 init.lua
文件里面再次加上一行导入这个文件
require('config.lazy')
此时重启 Nvim
会自动安装 lazy.nvim
,静待片刻即可。等待 Dashboard 出现之后,输入 :Lazy
弹出了 lazy.nvim
的窗口,那就安装成功了
主题
使用 tokyonight 主题
-- ~/.config/nvim/lua/plugins/tokyonight.lua
return {
"folke/tokyonight.nvim",
config = function()
require("tokyonight").setup({
style = "night", -- 选择主题风格:moon, storm, night, 或者 day
transparent = true, -- 启用透明背景
terminal_colors = true, -- 使终端也使用主题的颜色
styles = {
comments = { italic = true },
keywords = { italic = true },
functions = {},
variables = {},
sidebars = "transparent", -- 让侧边栏透明
floats = "transparent", -- 让浮动窗口透明
},
})
-- 应用主题
vim.cmd("colorscheme tokyonight")
end,
}
使用 catppuccin 主题
-- ~/.config/nvim/lua/plugins/catppuccin.lua
return {
"catppuccin/nvim",
name = "catppuccin",
config = function()
require("catppuccin").setup({
flavour = "mocha", -- 选择主题风格:latte, frappe, macchiato, mocha
transparent_background = true, -- 启用透明背景
term_colors = true, -- 使终端也使用主题的颜色
styles = {
comments = { "italic" },
conditionals = { "italic" },
loops = {},
functions = {},
keywords = {},
strings = {},
variables = {},
numbers = {},
booleans = {},
properties = {},
types = {},
operators = {},
},
integrations = {
nvimtree = {
enabled = true,
show_root = true,
transparent_panel = true, -- 让NvimTree侧边栏透明
},
-- 在这里添加更多插件的集成配置
},
})
-- 应用主题
vim.cmd("colorscheme catppuccin")
end,
}
自动补全
-- ~/.config/nvim/lua/plugins/nvim-cmp.lua
return {
"hrsh7th/nvim-cmp",
dependencies = {
"hrsh7th/cmp-buffer",
"hrsh7th/cmp-path",
"hrsh7th/cmp-cmdline",
"hrsh7th/cmp-nvim-lsp",
"saadparwaiz1/cmp_luasnip",
"L3MON4D3/LuaSnip",
"rafamadriz/friendly-snippets",
},
config = function()
local cmp = require("cmp")
local luasnip = require("luasnip")
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup({
snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.abort(),
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" }),
}),
sources = cmp.config.sources({
{ name = "nvim_lsp" },
{ name = "luasnip" },
}, {
{ name = "buffer" },
{ name = "path" },
}),
})
-- 对 `/` 使用缓冲区源(如果你启用了 `native_menu`,这将不再有效)。
cmp.setup.cmdline("/", {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = "buffer" }
}
})
-- 对 `:` 使用命令行和路径源(如果你启用了 `native_menu`,这将不再有效)。
cmp.setup.cmdline(":", {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = "path" }
}, {
{ name = "cmdline" }
})
})
end,
}
LSP
-- ~/.config/nvim/lua/plugins/nvim-lspconfig.lua
return {
"neovim/nvim-lspconfig",
dependencies = {
"hrsh7th/nvim-cmp",
"hrsh7th/cmp-nvim-lsp",
"williamboman/mason.nvim",
"williamboman/mason-lspconfig.nvim",
},
config = function()
local lspconfig = require("lspconfig")
local cmp_nvim_lsp = require("cmp_nvim_lsp")
local capabilities = cmp_nvim_lsp.default_capabilities(vim.lsp.protocol.make_client_capabilities())
-- 确保服务器已安装
require("mason").setup()
require("mason-lspconfig").setup({
-- 通过 :help lspconfig-all 可获取支持的LSP列表
-- 详情 https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
ensure_installed = {
-- 在这里添加你需要的 LSP
"lua_ls", -- lua
"pyright", -- python
"rust_analyzer", -- rust
},
})
-- 定义 `on_attach` 函数
local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
-- Mappings.
local opts = { noremap=true, silent=true }
buf_set_keymap("n", "gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>", opts)
buf_set_keymap("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
buf_set_keymap("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts)
buf_set_keymap("n", "gi", "<Cmd>lua vim.lsp.buf.implementation()<CR>", opts)
buf_set_keymap("n", "<C-k>", "<Cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
buf_set_keymap("n", "<space>wa", "<Cmd>lua vim.lsp.buf.add_workspace_folder()<CR>", opts)
buf_set_keymap("n", "<space>wr", "<Cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>", opts)
buf_set_keymap("n", "<space>wl", "<Cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>", opts)
buf_set_keymap("n", "<space>D", "<Cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
buf_set_keymap("n", "<space>rn", "<Cmd>lua vim.lsp.buf.rename()<CR>", opts)
buf_set_keymap("n", "gr", "<Cmd>lua vim.lsp.buf.references()<CR>", opts)
buf_set_keymap("n", "<space>e", "<Cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>", opts)
buf_set_keymap("n", "[d", "<Cmd>lua vim.lsp.diagnostic.goto_prev()<CR>", opts)
buf_set_keymap("n", "]d", "<Cmd>lua vim.lsp.diagnostic.goto_next()<CR>", opts)
buf_set_keymap("n", "<space>q", "<Cmd>lua vim.lsp.diagnostic.set_loclist()<CR>", opts)
buf_set_keymap("n", "<space>f", "<Cmd>lua vim.lsp.buf.formatting()<CR>", opts)
end
-- 设置 LSP 服务器
require("mason-lspconfig").setup_handlers({
function(server_name)
lspconfig[server_name].setup({
on_attach = on_attach,
capabilities = capabilities,
})
end,
})
end,
}
状态栏
美化配置(Old)
若已经有vim的配置,可使用ln -s .vim/vimrc .config/nvim/init.vim
与vim共用配置,可能有不兼容情况,尽量新建nvim ~/.config/nvim/init.vim
状态栏美化插件,需要安装powerline-fonts字体(https://github.com/powerline/fonts) pacman -S powerline-fonts
" _ ____ _ ___ ___ ____ ____
" ___ ___ _ __ _ _ _ __ ( ) ___| | \ | \ \ / (_)_ __ ___ | _ \ / ___|
" / _ \/ _ \| '_ \| | | | '_ \|/\___ \ | \| |\ \ / /| | '_ ` _ \| |_) | |
" | __/ (_) | | | | |_| | | | | ___) | | |\ | \ V / | | | | | | | _ <| |___
" \___|\___/|_| |_|\__,_|_| |_| |____/ |_| \_| \_/ |_|_| |_| |_|_| \_\\____|
"
" =================================木He寸&eonun================================
"
" i 写入模式、i插入之前、I行首插入、a插入之后、A行尾插入、o下行插入、O上行插入、x 删除光标后一个字符
" <Operation(操作)> <Motion(动作)>
" d 剪切操作(剪切可看做删除), y 复制操作, p 粘贴操作, c 剪切后修改操作
" ← 左动作, → 右动作, 3← 3个左动作, b 选择光标开启到上一个词后的内容, i 指明光标在词中,当前词待操作, w 选择光标开始到下个词前的内容, iw 在当前词之间选择该, y3← 向右复制, f 查找动作
" ===
" >>>首次使用自动配置
" ===
" ==安装plug
if empty(glob('~/.config/nvim/autoload/plug.vim'))
silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" 保存vimrc时立即重新加载生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
" ===
" >>>基础配置
" ===START===
" 文件类型检测
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
" 开启语法高亮
if !exists("g:syntax_on")
syntax enable
endif
" txt文件按照wiki语法高亮
autocmd BufNewFile *.txt set ft=confluencewiki
autocmd BufEnter *.txt set ft=confluencewiki
" 恢复上次文件打开位置
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
" 打开是运行指令 取消上回搜索内容的高亮
exec "nohlsearch"
" ==
" >>Let
" ==START==
let mapleader=" " " 将leader键(\键,类似于Windows键)换成空格(相当于空格键)
let &t_ut='' " 矫正部分配色
" 不同模式下的光标样式
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
" python解释器
"
"let g:python_host_prog='/usr/bin/python2'
"let g:python3_host_prog='/usr/bin/python3'
" ==END==
" >>let
" ==
" ==
" >>set
" ==START==
set nocompatible " 不兼容 VI ,compatible为兼容(tab将不会变成空格)
set fileencodings=utf-8,gbk " 写入文件时采用的编码类型
set termencoding=utf-8 " 输出到终端时采用的编码类型
set encoding=utf-8 " 缓存的文本、寄存器、Vim 脚本文件等
set number " 显示行号 缩写: nu
set relativenumber " 从当前行向前向后算行数
set cursorline " 突出显示当前行 缩写: cul
"set cursorcolumn " 突出显示当前列 缩写: cuc
set showmatch " 显示括号匹配
set showcmd " 显示指令
set laststatus=2 " 显示状态栏
set ruler " 显示光标当前位置
set wrap " 自动换行
set tw=0 " 防止自动分割行
"set expandtab " 自动将制表符换成空格
set tabstop=4 " 制表符长度为4空格 缩写:ts
set shiftwidth=4 " 自动缩进长度为4空格
set autoindent " 自动缩进
set cindent " c格式自动缩进
set smartindent " 遇右花括号 } 取消缩进的自动缩进
set wildmenu " 命令补全
set autochdir " 在当前目录下执行命令
set hlsearch " 高亮显示搜索
set incsearch " 动态高亮搜索"
set ignorecase " 不区分大小写搜索
set smartcase " 智能大小写搜索
set mouse=a " 使用鼠标
set backspace=indent,eol,start " 能退格到行尾
" ==END==
" >>>set
" ==
" ==
" >>键盘映射
" ==START==
" map 递归映射
" map a b
" map b c
" a映射为c
" nmap 普通模式下的递归映射"
" noremap 不递归映射
" noremap a b
" noremap b c
" a映射为b b映射为c 两个映射互不影响
" unmap 取消 map 的映射
" mapclear 取消所有 map 的映射
"noremap a b " 将 a 映射为 b
"noremap A 5b " 将 A 映射为 5b
"noremap = nzz " 将 n 映射 =zz " 用 zz 将该行变成中心点
"noremap - Nzz " 将 N 映射 -zz
noremap <LEADER><CR> :nohlsearch<CR> " 将 <LEADER><CR> 映射为 :nohlsearch<CR> 用于快捷取消搜索高亮
noremap J 5j
noremap K 5k
" 复制到系统剪切板
"vnoremap Y :w !xclip -i -sel c<CR> " 需要安装xclip #sudo pacman -S xclip
vnoremap Y "+y " 需要安装gvim #sudo pacman -S gvim
" 打开vimrc文件
map MR :e $MYVIMRC<CR>
map s <nop>
map S :w<CR> " 将 S 的指令映射为 :w<CR> " <CR> 代表回车
map Q :q<CR> " 将 Q 的指令映射为 :q<CR>
map <silent> <C-a> ggvG " Ctrl-A 选中所有内容
"map R :source $MYVIMRC<CR> " 将 R 的指令映射成 重载vimrc配置
" 打开新文件
map <LEADER>s :e<Space>
map sk :set splitbelow<CR>:split<CR> " 下分屏":e /文件路径 打开文件
map sj :set nosplitbelow<CR>:split<CR> " 上分屏
map sl :set nosplitright<CR>:vsplit<CR> " 右分屏
map sh :set splitright<CR>:vsplit<CR> " 左分屏
map sz <C-w>t<C-w>H " 竖向分屏换左右分屏
map ss <C-w>t<C-w>K " 左右分屏换竖向分屏
map <LEADER>k <C-w>k " 光标到上屏
map <LEADER>j <C-w>j " 光标到下屏
map <LEADER>l <C-w>l " 光标到右屏
map <LEADER>h <C-w>h " 光标到左屏
map <up> :res +5<CR> " 分屏线上移
map <down> :res -5<CR> " 分屏线下移
map <left> :vertical resize+5<CR> " 分屏线左移
map <right> :vertical resize-5<CR> " 分屏线右移
map tn :tabe<CR> " ta打开新选项卡
map th :-tabnext<CR> " 到左边的选项卡
map tl :+tabnext<CR> " 到右边的选项卡
" ==END==
" >>键盘映射
" ==
" ===END===
" >>>基础配置
" ===
" ===
" >>>插件安装
" ===START===
" 安装plug:
" curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
call plug#begin('~/.config/nvim/plugged') " 启用plug安装
" 插件github项目地址为:https://github.com/ 加 '' 中的内容
" 如:https://github.com/vim-airline/vim-airline
" ===状态栏===
Plug 'vim-airline/vim-airline' " 状态栏
Plug 'vim-airline/vim-airline-themes' " 状态栏主题
" ===配色方案===
Plug 'lifepillar/vim-solarized8' " solarized8主题
Plug 'ayu-theme/ayu-vim' " ayu主题
Plug 'nathanaelkane/vim-indent-guides' " 显示缩进级别
" ===目录树===
Plug 'scrooloose/nerdtree' " 目录树,方便浏览当前目录下的文件
Plug 'Xuyuanp/nerdtree-git-plugin' " 目录树git提示
Plug 'kien/ctrlp.vim' " 适用于大规模项目文件的浏览
" ===自动化===
Plug 'neoclide/coc.nvim', {'branch': 'release'} " 代码补全 需要vim >=8 或neovim
Plug 'vim-syntastic/syntastic' " 错误语法提示
" ===历史===
Plug 'mbbill/undotree' " 历史修改撤回
" ===文本===
Plug 'godlygeek/tabular' " 文本过滤、对齐工具
Plug 'gcmt/wildfire.vim' " 视图模式下快速选中符号中的内容
Plug 'scrooloose/nerdcommenter' " 快速注释一行
" === JSON, CSS, PHP, JavaScript, HTML, etc.===
Plug 'elzr/vim-json' " JSON关键字与值的突出显示,特定于JSON(非JS)的警告,引号隐藏
Plug 'hail2u/vim-css3-syntax', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] } " CSS3语法支持
Plug 'spf13/PIV', { 'for' :['php', 'vim-plug'] } " PHP集成环境
Plug 'pangloss/vim-javascript', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] } " Javascript缩进和语法支持
Plug 'yuezk/vim-js', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] } "JavaScript和Flow.js的最准确的语法高亮
Plug 'MaxMEllon/vim-jsx-pretty', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] } " JSX 和 TSX 语法高亮
Plug 'jelera/vim-javascript-syntax', { 'for': ['vim-plug', 'php', 'html', 'javascript', 'css', 'less'] } " 增强JavaScript语法
" ===Go===
Plug 'fatih/vim-go' , { 'for': ['go', 'vim-plug'], 'tag': '*' } " Go开发插件
" ===Python===
Plug 'tmhedberg/SimpylFold', { 'for' :['python', 'vim-plug'] } " Python代码折叠
Plug 'Vimjas/vim-python-pep8-indent', { 'for' :['python', 'vim-plug'] } " Python缩进
Plug 'numirias/semshi', { 'do': ':UpdateRemotePlugins', 'for' :['python', 'vim-plug'] } " Python语法高亮
Plug 'tweekmonster/braceless.vim' "用于Python和其他缩进语言的文本对象折叠
" ===Markdon===
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']} " markdowm预览
Plug 'dhruvasagar/vim-table-mode', { 'on': 'TableModeToggle' } " 表格制作工具
Plug 'mzlogin/vim-markdown-toc', { 'for': ['gitignore', 'markdown'] } " 目录生成
Plug 'theniceboy/bullets.vim' " 自动添加项目列表符号
" ===Git===
Plug 'theniceboy/vim-gitignore', { 'for': ['gitignore', 'vim-plug'] } " 为.gitignore文件提供语法高亮显示和最新代码片段
Plug 'fszymanski/fzf-gitignore', { 'do': ':UpdateRemotePlugins' } " fzf接口,用于使用gitignore.io API创建.gitignore文件
"Plug 'mhinz/vim-signify' "使用Vim的符号列显示差异
Plug 'airblade/vim-gitgutter' " 显示git diff。 它显示了已添加,修改或删除的行
" ===编辑增强===
Plug 'jiangmiao/auto-pairs' " 符号补全
Plug 'mg979/vim-visual-multi' " 多光标支持
Plug 'tpope/vim-surround' " 符号环境,轻松对符号内的内容进行修改
Plug 'junegunn/vim-after-object' " 指定内容操作 ,da= 删除=后的内容
Plug 'junegunn/vim-easy-align' " 对齐插件 , gaip= 使段落仲的 = 对齐
" ===其他===
"Plug 'yianwillis/vimcdoc' " vim中文帮助
"Plug 'liuchengxu/vim-which-key' " 显示被绑定的可用按键
" ==依赖==
Plug 'MarcWeber/vim-addon-mw-utils'
Plug 'kana/vim-textobj-user'
Plug 'fadein/vim-FIGlet'
call plug#end() "结束plug安装
" 刷新vimrc后使用 :PlugInstall 安装插件
" ===END===
" >>>插件安装
" ===
" ===
" >>>插件配置
" ===START===
" ===状态栏===
" ==airline状态栏==
let g:airline#extensions#tabline#enabled = 1 " airline 显示选项卡和缓冲区
let g:airline_theme='jellybeans'
" 状态栏分隔美化 需要安装powerline-fonts字体(https://github.com/powerline/fonts) #sudo pacman -S powerline-fonts
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.maxlinenr = ''
let g:airline_symbols.dirty= '⚡'
" ==状态模式简洁显示==
let g:airline_mode_map = {
\ '__' : '-',
\ 'c' : 'C',
\ 'i' : 'I',
\ 'ic' : 'I',
\ 'ix' : 'I',
\ 'n' : 'N',
\ 'multi' : 'M',
\ 'ni' : 'N',
\ 'no' : 'N',
\ 'R' : 'R',
\ 'Rv' : 'R',
\ 's' : 'S',
\ 'S' : 'S',
\ '' : 'S',
\ 't' : 'T',
\ 'v' : 'V',
\ 'V' : 'V',
\ '' : 'V',
\ }
" ===配色方案===
map <LEADER>c1 :set background=dark<CR>:colorscheme solarized8<CR>:AirlineTheme jellybeans<CR> "配色1
map <LEADER>c2 :set background=light<CR>:let ayucolor='light'<CR>:colorscheme ayu<CR>:AirlineTheme ayu_light<CR> " 配色2
set termguicolors "开启真彩支持
set background=dark
let g:solarized_termtrans=1 " 透明背景
"colorscheme solarized8
"let ayucolor='light' " light mirage dark
"colorscheme ayu
" ===目录树===
" ==NERDTreeToggle==
nmap <F3> :NERDTreeToggle<CR> " 设置目录树快捷键
" ==NERDTree-git提示==
let g:NERDTreeIndicatorMapCustom = {
\ "Modified" : "✹",
\ "Staged" : "✚",
\ "Untracked" : "✭",
\ "Renamed" : "➜",
\ "Unmerged" : "═",
\ "Deleted" : "✖",
\ "Dirty" : "✗",
\ "Clean" : "✔︎",
\ "Unknown" : "?"
\ }
" ==大规模项目文件浏览==
map <C-p> :CtrlP<CR>
let g:ctrlp_prompt_mappings = {
\ 'PrtSelectMove("j")': ['<c-e>', '<down>'],
\ 'PrtSelectMove("k")': ['<c-u>', '<up>'],
\ }
" ===自动化===
" ==coc配置==
" 查看:https://github.com/neoclide/coc.nvim 中Extensions的列表
" 执行命令安装coc对相应语言的补全
" 若表中没有需要的,可参考 "Register custom language servers" 进行配置
" 参考教程:https://www.jianshu.com/p/231bfb066051
set timeoutlen=500 " 设置按键超时为
set cmdheight=2 " 设置命令行行数
inoremap <C-d> <Esc>:set cmdheight=2<CR>a
inoremap <C-t> <Esc>:set cmdheight=10<CR>a
nnoremap <C-d> :set cmdheight=2<CR>
nnoremap <C-t> :set cmdheight=10<CR>
set updatetime=1000
set shortmess+=c
set signcolumn=yes
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" 使用<cr>确认完成,`<C-g> u`表示在当前位置断开撤销链
" Coc仅在确认时执行片段和其他编辑
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
" 使用K在预览窗口中显示文档
nnoremap ? :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" 突出显示CursorHold上光标下的符号
autocmd CursorHold * silent call CocActionAsync('highlight')
" ===历史===
let g:undotree_DiffAutoOpen = 0
map <LEADER>l :UndotreeToggle<CR>
" ===文本===
" ==过滤对齐工具==
"使用 :Tabularize /| 使文本向 | 对齐,可是其他符号
" ==快速选中==
"视图模式下,使用 i' 快速选中 '' 中的内容,其他: i" i) i] i} ip
" ==快速注释==
"输入 <space>cc 对该行注释
" ===vim-go===
let g:go_def_mapping_enabled = 0
let g:go_template_autocreate = 0
let g:go_textobj_enabled = 0
let g:go_auto_type_info = 1
let g:go_def_mapping_enabled = 0
let g:go_highlight_array_whitespace_error = 1
let g:go_highlight_build_constraints = 1
let g:go_highlight_chan_whitespace_error = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_format_strings = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_function_parameters = 1
let g:go_highlight_functions = 1
let g:go_highlight_generate_tags = 1
let g:go_highlight_methods = 1
let g:go_highlight_operators = 1
let g:go_highlight_space_tab_error = 1
let g:go_highlight_string_spellcheck = 1
let g:go_highlight_structs = 1
let g:go_highlight_trailing_whitespace_error = 1
let g:go_highlight_types = 1
let g:go_highlight_variable_assignments = 0
let g:go_highlight_variable_declarations = 0
" ===vim-markdown-toc===
"let g:vmt_auto_update_on_save = 0
"let g:vmt_dont_insert_fence = 1
let g:vmt_cycle_list_item_markers = 1
let g:vmt_fence_text = 'TOC'
let g:vmt_fence_closing_text = '/TOC'
" ===Bullets.vim===
"let g:bullets_set_mappings = 0
let g:bullets_enabled_file_types = [
\ 'markdown',
\ 'text',
\ 'gitcommit',
\ 'scratch'
\]
" ===Markdon===
" ==MarkdownPreview配置==
" 设置为1,nvim将在进入降价缓冲区后打开预览窗口,默认0
let g:mkdp_auto_start = 0
" 设置为1,当从降价缓冲区转换到另一个缓冲区时,nvim将自动关闭当前预览窗口,默认1
let g:mkdp_auto_close = 1
" 设置为1时,vim将在保存缓冲区时刷新markdown或从插入模式退出,默认0为自动刷新markdown,因为您编辑或移动光标,默认0
let g:mkdp_refresh_slow = 0
" 设置为1,MarkdownPreview命令可用于所有文件,默认情况下可用于markdown文件,默认0
let g:mkdp_command_for_global = 0
" 设置为1,默认情况下预览服务器可供网络中的其他人使用,服务器侦听localhost(127.0.0.1,默认0
let g:mkdp_open_to_the_world = 0
" 当您在远程vim中工作并在本地浏览器上预览时,使用自定义IP打开预览页面非常有用。详细信息请参阅:https://github.com/iamcco/markdown-preview.nvim/pull/9,默认空
let g:mkdp_open_ip = ''
" 指定浏览器打开预览页面,默认:'',firefox浏览器快熟关闭窗口需要设置:
" about:config > dom.allow_scripts_to_close_windows 将值设置为 true
let g:mkdp_browser = ''
" 设置为1,打开预览页面时,在命令行中回显预览页面url,默认0
let g:mkdp_echo_preview_url = 0
" 自定义vim函数名称打开预览页面此函数将接收url作为param,默认空
let g:mkdp_browserfunc = ''
" markdown渲染选项
" mkit: markdown-it选项
" katex: katex选项
" uml: markdown-it-plantuml选项
" maid: mermaid选项
" disable_sync_scroll: 禁用同步滚动,默认0
" sync_scroll_type: 'middle', 'top' or 'relative', default value is 'middle'
" middle: 表示光标位置总是显示在预览页面的中间
" top: 表示预览页面顶部的vim顶部视口总是显示
" relative: 表示光标位置总是显示在预览页面的相对位置
" hide_yaml_meta: 隐藏yaml元数据,默认1
" sequence_diagrams: js-sequence-diagrams 选项
let g:mkdp_preview_options = {
\ 'mkit': {},
\ 'katex': {},
\ 'uml': {},
\ 'maid': {},
\ 'disable_sync_scroll': 0,
\ 'sync_scroll_type': 'middle',
\ 'hide_yaml_meta': 1,
\ 'sequence_diagrams': {}
\ }
" 使用自定义markdown样式必须是绝对路径
let g:mkdp_markdown_css = ''
" 使用自定义高亮样式必须绝对路径
let g:mkdp_highlight_css = ''
" 使用自定义端口启动服务器或使用随机空白
let g:mkdp_port = ''
" 预览页面标题,$ {name}将替换为文件名
let g:mkdp_page_title = '「${name}」'
nmap <F8> <Plug>MarkdownPreview
nmap <F9> <Plug>MarkdownPreviewStop
nmap <LEADER>mt <Plug>MarkdownPreviewToggle
" ==表格制作工具==
map <LEADER>tm :TableModeToggle<CR>
" ===fzf-gitignore===
noremap <LEADER>gi :FzfGitignore<CR>
" ===其他===
" ==中文帮组==
"set helplang=cn " 启用英文的为en
" ==显示按键绑定==
"nnoremap <silent> <leader> :WhichKey '<Space>'<CR>
" ===END===
" >>>插件配置
" ===