Browse Source

👌 IMPROVE: remove docs

pull/174/head
nshen 3 years ago
parent
commit
895cf47e25
  1. 19
      docs/.vimspector.json
  2. 210
      docs/basic-config.md
  3. 108
      docs/colorscheme.md
  4. BIN
      docs/imgs/1.png
  5. BIN
      docs/imgs/2.png
  6. BIN
      docs/imgs/3.png
  7. BIN
      docs/imgs/bufferline.gif
  8. BIN
      docs/imgs/bufferline.png
  9. BIN
      docs/imgs/bufferline2.gif
  10. BIN
      docs/imgs/colorscheme1.png
  11. BIN
      docs/imgs/colorscheme2.png
  12. BIN
      docs/imgs/colorscheme3.png
  13. BIN
      docs/imgs/colorscheme4.png
  14. BIN
      docs/imgs/comment1.gif
  15. BIN
      docs/imgs/comment2.gif
  16. BIN
      docs/imgs/gif1.gif
  17. BIN
      docs/imgs/lsp.gif
  18. BIN
      docs/imgs/lsp.png
  19. BIN
      docs/imgs/lsp1.gif
  20. BIN
      docs/imgs/lsp2-1.png
  21. BIN
      docs/imgs/lsp2-2.gif
  22. BIN
      docs/imgs/lsp2.gif
  23. BIN
      docs/imgs/lsp3.gif
  24. BIN
      docs/imgs/lsp4.gif
  25. BIN
      docs/imgs/nvim-tree1.png
  26. BIN
      docs/imgs/nvim-tree2.png
  27. BIN
      docs/imgs/nvim-tree3.gif
  28. BIN
      docs/imgs/nvim-tree4.gif
  29. BIN
      docs/imgs/packer1.png
  30. BIN
      docs/imgs/sankey-glyphs-combined-diagram.png
  31. BIN
      docs/imgs/split-windows.gif
  32. BIN
      docs/imgs/terminal.jpg
  33. BIN
      docs/imgs/treesitter.gif
  34. BIN
      docs/imgs/treesitter1.gif
  35. BIN
      docs/imgs/treesitter2.png
  36. BIN
      docs/imgs/treesitter3.png
  37. BIN
      docs/imgs/treesitter4.gif
  38. BIN
      docs/imgs/treesitter5.gif
  39. BIN
      docs/imgs/treesitter6.gif
  40. BIN
      docs/imgs/up-down.gif
  41. 182
      docs/keybindings.md
  42. 230
      docs/lsp.md
  43. 177
      docs/lsp2.md
  44. 161
      docs/new.md
  45. 84
      docs/packer-usage.md
  46. 84
      docs/plugins.md
  47. 121
      docs/plugins/bufferline.md
  48. 90
      docs/plugins/comment.md
  49. 110
      docs/plugins/nvim-tree.md
  50. 198
      docs/plugins/nvim-treesitter.md
  51. 88
      docs/windows-terminal-wsl2.md

19
docs/.vimspector.json

@ -1,19 +0,0 @@
{
"$schema": "https://puremourning.github.io/vimspector/schema/vimspector.schema.json",
"configurations": {
"Run - CodeLLDB": {
"adapter": "CodeLLDB",
"breakpoints": {
"exception": {
"all": "N",
"uncaught": "N"
}
},
"configuration": {
"request": "launch",
"program": "${workspaceRoot}/target/debug/hello"
}
}
}
}

210
docs/basic-config.md

@ -1,210 +0,0 @@
## Neovim 基础配置
本章介绍 `Neovim` 的基本配置
## 配置文件
Neovim 配置文件不是 `.vimrc`
而是保存在 `~/.config/nvim/init.vim`
也可以直接是 `init.lua` ,为了保证和老版本兼容,或者有一些不知怎么在 `lua` 下配置的,我这里还是使用了 `init.vim`
但是 `init.vim` 只作为入口,真正的配置,是加载的其他的 `lua` 配置文件
## .vim 中调用 lua
`init.vim` 里可以直接写 `lua`代码,这样
```
lua print('单行 lua')
```
多行调用
```
lua <<EOF
print('多行 lua')
print('多行 lua')
EOF
```
## .vim 中加载其他 lua 文件
`Neovim` 中加载 `lua` 文件,可以这样
```
" 加载 lua/basic.lua 文件,此行为注释
lua require('basic')
```
目前我的配置文件结构大概是这个样子。 后边章节会逐个介绍
```
├── init.vim 入口文件,这里负责加载所有lua文件夹里的文件
└── lua 所有 lua 配置文件
   ├── basic.lua Neovim 的基础配置
   ├── keybindings.lua 快捷键配置
   ├── lsp 内置 LSP (Language Server Protocol) 配置
   │   ├── diagnostic_signs.lua
   │   ├── language_servers.lua
   │   └── nvim-cmp-config.lua
   ├── plugin-config 各个插件配置在这个文件夹
   │   ├── bufferline.lua
   │   ├── comment.lua
   │   ├── nvim-autopairs.lua
   │   ├── nvim-colorizer.lua
   │   ├── nvim-tree.lua
   │   ├── nvim-treesitter.lua
   │   ├── rust-tools.lua
   │   ├── surround.lua
   │   ├── telescope.lua
   │   └── which-key.lua
   └── plugins.lua 插件安装管理
```
## init.vim 配置入口
`init.vim` 是入口文件,主要负责加载各个 lua 文件,对应上边的结构。
如果暂时没有找到办法用 `lua` 设置的,就在这里用 `vim` 脚本设置。
先预览一下这个文件最终的样子,本章只需关注 **前两行** ,后边的会在之后的章节介绍
```
" 基础设置
lua require('basic')
" Packer插件管理
lua require('plugins')
" 快捷键映射
lua require('keybindings')
" 皮肤设置
" https://github.com/ellisonleao/gruvbox.nvim
set background=dark " or light if you want light mode
colorscheme gruvbox
" 插件配置
lua require('plugin-config/which-key')
lua require('plugin-config/nvim-treesitter')
lua require('plugin-config/telescope')
lua require('plugin-config/nvim-autopairs')
lua require('plugin-config/nvim-tree')
lua require('plugin-config/bufferline')
lua require('plugin-config/surround')
lua require('plugin-config/comment')
lua require('plugin-config/nvim-colorizer')
lua require('plugin-config/rust-tools')
" lsp
lua require('lsp/nvim-cmp-config')
lua require('lsp/diagnostic_signs')
lua require('lsp/language_servers')
```
## 基础配置 basic.lua
`init.vim` 中第一行
```
" 基础设置
lua require('basic')
```
此行会加载对应的 `lua/basic.lua`
这里的配置看着有点多,比 `VSCode` 复杂多了,主要是历史遗留的默认配置不太合理。
其实不用纠结太多,我也是参考了很多大神的配置都差不多,基本可以闭眼直接 copy。
可以根据需要微调,大部分都有注释
```lua
-- utf8
vim.g.encoding = "UTF-8"
vim.o.fileencoding = 'utf-8'
-- jk移动时光标下上方保留8行
vim.o.scrolloff = 8
vim.o.sidescrolloff = 8
-- 使用相对行号
vim.wo.number = true
vim.wo.relativenumber = true
-- 高亮所在行
vim.wo.cursorline = true
-- 显示左侧图标指示列
vim.wo.signcolumn = "yes"
-- 右侧参考线,超过表示代码太长了,考虑换行
vim.wo.colorcolumn = "80"
-- 缩进2个空格等于一个Tab
vim.o.tabstop = 2
vim.bo.tabstop = 2
vim.o.softtabstop = 2
vim.o.shiftround = true
-- >> << 时移动长度
vim.o.shiftwidth = 2
vim.bo.shiftwidth = 2
-- 新行对齐当前行,空格替代tab
vim.o.expandtab = true
vim.bo.expandtab = true
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true
-- 搜索大小写不敏感,除非包含大写
vim.o.ignorecase = true
vim.o.smartcase = true
-- 搜索不要高亮
vim.o.hlsearch = false
-- 边输入边搜索
vim.o.incsearch = true
-- 使用增强状态栏后不再需要 vim 的模式提示
vim.o.showmode = false
-- 命令行高为2,提供足够的显示空间
vim.o.cmdheight = 2
-- 当文件被外部程序修改时,自动加载
vim.o.autoread = true
vim.bo.autoread = true
-- 禁止折行
vim.o.wrap = false
vim.wo.wrap = false
-- 行结尾可以跳到下一行
vim.o.whichwrap = 'b,s,<,>,[,],h,l'
-- 允许隐藏被修改过的buffer
vim.o.hidden = true
-- 鼠标支持
vim.o.mouse = "a"
-- 禁止创建备份文件
vim.o.backup = false
vim.o.writebackup = false
vim.o.swapfile = false
-- smaller updatetime
vim.o.updatetime = 300
-- 设置 timeoutlen 为等待键盘快捷键连击时间200毫秒,可根据需要设置
-- 遇到问题详见:https://github.com/nshen/learn-neovim-lua/issues/1
vim.o.timeoutlen = 200
-- split window 从下边和右边出现
vim.o.splitbelow = true
vim.o.splitright = true
-- 自动补全不自动选中
vim.g.completeopt = "menu,menuone,noselect,noinsert"
-- 样式
vim.o.background = "dark"
vim.o.termguicolors = true
vim.opt.termguicolors = true
-- 不可见字符的显示,这里只把空格显示为一个点
vim.o.list = true
vim.o.listchars = "space:·"
-- 补全增强
vim.o.wildmenu = true
-- Dont' pass messages to |ins-completin menu|
vim.o.shortmess = vim.o.shortmess .. 'c'
vim.o.pumheight = 10
-- always show tabline
vim.o.showtabline = 2
```
- [init.vim 完整文件](../init.vim)
- [basic.lua 完整文件](../lua/basic.lua)
重启后的 `Neovim` 应该顺眼多了,下一篇介绍我的 Neovim 快捷键配置。
- 下一章: [Neovim 快捷键配置](./keybindings.md)
- [回首页](../README.md)

108
docs/colorscheme.md

@ -1,108 +0,0 @@
## Neovim 主题配置
本章介绍如何给 `Neovim` 安装主题和配置主题。
主题与一般插件一样,都是用 [上一章](./packer-usage.md) 讲的 `Packer.nvim` 来安装的。
由于后边需要安装 `nvim-treesitter` 语法高亮,所选的主题必须在 [支持 nvim-treesitter 的主题列表](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Colorschemes) 里边找。
目前我在使用的主题是 `gruvbox.nvim` 推荐使用。
## 主题配色安装
打开 [gruvbox.nvim](https://github.com/ellisonleao/gruvbox.nvim) 主页会看到安装方式,其他皮肤也类似
打开 `lua/plugins.lua` ,增加 `gruvbox theme` 相关的代码
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- gruvbox theme
use {
"ellisonleao/gruvbox.nvim",
requires = {"rktjmp/lush.nvim"}
}
end)
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
如果网络畅通的话,会显示 `Everything already up to date!` 表示安装成功。
打开 `init.vim`,增加
```vim
set background=dark
colorscheme gruvbox
```
保存前:
<img src="./imgs/colorscheme1.png" width="850">
保存退出,重新打开后:
<img src="./imgs/colorscheme2.png" width="850">
## nord.nvim 配色
再尝试一个 [nord.nvim](https://github.com/shaunsingh/nord.nvim)
修改 `lua/plugins.lua`
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- gruvbox theme
use {
"ellisonleao/gruvbox.nvim",
requires = {"rktjmp/lush.nvim"}
}
-- nord theme
use 'shaunsingh/nord.nvim'
end)
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
安装成功后,修改 `init.vim`
```vim
set background=dark
colorscheme nord
```
重开后的效果
<img src="./imgs/colorscheme3.png" width="850">
## zephyr-nvim 配色
再增加一个 [zephyr-nvim](https://github.com/glepnir/zephyr-nvim) 配色
修改 `lua/plugins.lua` 增加
```lua
use 'glepnir/zephyr-nvim'`
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
安装成功后,修改 `init.vim`
```vim
set background=dark
colorscheme zephyr
```
<img src="./imgs/colorscheme4.png" width="850">
本章结束,如果你有更漂亮的皮肤推荐,欢迎留言告诉我。
下一章开始会介绍一些常用的插件。
- 下一章: [Neovim 插件 nvim-tree 的安装与配置](./plugins/nvim-tree.md)
- [回首页](../README.md)

BIN
docs/imgs/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

BIN
docs/imgs/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

BIN
docs/imgs/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/imgs/bufferline.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 KiB

BIN
docs/imgs/bufferline.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

BIN
docs/imgs/bufferline2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

BIN
docs/imgs/colorscheme1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

BIN
docs/imgs/colorscheme2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

BIN
docs/imgs/colorscheme3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/imgs/colorscheme4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

BIN
docs/imgs/comment1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

BIN
docs/imgs/comment2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

BIN
docs/imgs/gif1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

BIN
docs/imgs/lsp.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 KiB

BIN
docs/imgs/lsp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

BIN
docs/imgs/lsp1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

BIN
docs/imgs/lsp2-1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

BIN
docs/imgs/lsp2-2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 466 KiB

BIN
docs/imgs/lsp2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

BIN
docs/imgs/lsp3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 KiB

BIN
docs/imgs/lsp4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 KiB

BIN
docs/imgs/nvim-tree1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

BIN
docs/imgs/nvim-tree2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

BIN
docs/imgs/nvim-tree3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 627 KiB

BIN
docs/imgs/nvim-tree4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 KiB

BIN
docs/imgs/packer1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

BIN
docs/imgs/sankey-glyphs-combined-diagram.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

BIN
docs/imgs/split-windows.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 900 KiB

BIN
docs/imgs/terminal.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

BIN
docs/imgs/treesitter.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

BIN
docs/imgs/treesitter1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

BIN
docs/imgs/treesitter2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

BIN
docs/imgs/treesitter3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

BIN
docs/imgs/treesitter4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 KiB

BIN
docs/imgs/treesitter5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 KiB

BIN
docs/imgs/treesitter6.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/imgs/up-down.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 786 KiB

182
docs/keybindings.md

@ -1,182 +0,0 @@
## Neovim 快捷键配置
本章介绍如何在 `Neovim` 中配置快捷键
`init.vim` 中添加以下代码
```lua
" 快捷键映射
lua require('keybindings')
```
这里表示加载 `lua/keybindings.lua` 文件,我们统一在这个文件里设置快捷键。
## Leader Key
`leader key` 是你常用的前缀,我通常设置为 `空格`
```lua
vim.g.mapleader = " "
vim.g.maplocalleader = " "
```
后边定义快捷键看到 `<leader>` 就表示 `空格`
## 如何设置快捷键
```lua
vim.api.nvim_set_keymap()
```
`Neovim` 使用上边的指令设置快捷键,[详细信息见这里](https://github.com/nanotee/nvim-lua-guide#defining-mappings)。
```lua
-- 保存本地变量
local map = vim.api.nvim_set_keymap
local opt = {noremap = true, silent = true }
-- 之后就可以这样映射按键了
-- map('模式','按键','映射为XX',opt)
```
## 常用快捷键
`normal` 模式本身就是快捷键模式,而在这里定义的相当于是 **快捷键的快捷键** , 所以一定是非常常用的按键组合, 或者是通过某个键调用某些命令。
因人而异,我用的快捷键不多,介绍一下,抛砖引玉,你有什么常用的快捷键欢迎留言告诉我。
### 浏览代码
浏览代码的时候,我最常用 `ctrl + u` / `ctrl + d` 移动光标滚动代码,
`u``p` 表示 `up翻页``down翻页`
`j` / `k` 移动太慢, `ctrl + u` / `ctrl + d` 默认移动半屏,翻太快,一不留神就不知道翻到哪了
我喜欢把 `ctrl + u` / `ctrl + d` 设置成移动 9 行,演示:
<img src="./imgs/up-down.gif" width="850">
```lua
map("n", "<C-u>", "9k", opt)
map("n", "<C-d>", "9j", opt)
```
为什么是 9 行呢,因为刚好适合我,尤其是命令行全屏的时候,多了我经常找不到跳到哪了,少了移动太慢。
### visual 模式下可以连续 `>` 缩进代码
第一个参数 `v` 表示 visual 模式
```lua
map('v', '<', '<gv', opt)
map('v', '>', '>gv', opt)
```
### 分屏相关
我习惯把所有分屏相关的操作都放在 `s + 某个按键` ,`s` 表示 `split`
`alt + hjkl` 在窗口之间跳转。 演示:
<img src="./imgs/split-windows.gif" width="850">
- `sv` 水平分屏
- `sh` 垂直分屏
- `sc` 关闭当前分屏 (c = close)
- `so` 关闭其他分屏 (o = other)
- `s>` `s<` `s=` `sj` `sk` 分屏比例控制
```lua
map("n", "sv", ":vsp<CR>", opt)
map("n", "sh", ":sp<CR>", opt)
map("n", "sc", "<C-w>c", opt)
map("n", "so", "<C-w>o", opt) -- close others
-- 比例控制(不常用,因为支持鼠标拖拽)
map("n", "s.", ":vertical resize +20<CR>", opt)
map("n", "s,", ":vertical resize -20<CR>", opt)
map("n", "s=", "<C-w>=", opt)
map("n", "sj", ":resize +10<CR>",opt)
map("n", "sk", ":resize -10<CR>",opt)
```
我使用 `alt + hjkl` 在窗口之间跳转
```lua
map("n", "<A-h>", "<C-w>h", opt)
map("n", "<A-j>", "<C-w>j", opt)
map("n", "<A-k>", "<C-w>k", opt)
map("n", "<A-l>", "<C-w>l", opt)
```
水平分屏很常用,比如 `svgd` 命令相当于 打开右侧窗口进入方法的定义,看完可以随手 `sc` 关闭掉。
**本文到此结束了**,下边还有给插件的快捷键,可以大概看一下,装插件的时候再细说。
```lua
--插件快捷键
-- Telescope
map("n", "<C-p>", ":Telescope find_files<CR>", opt)
map("n", "<leader>f", ":Telescope find_files<CR>", opt)
map("n", "<leader>g", ":Telescope live_grep<CR>", opt)
-- nvimTree
map('n', '<C-n>', ':NvimTreeToggle<CR>', opt)
-- bufferline 左右切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)
pluginKeys = {}
-- 代码注释插件
-- see ./lua/plugin-config/comment.lua
pluginKeys.comment = {
-- normal 模式
toggler = {
line = '<leader>c',
block = '<leader>bc',
},
-- visual 模式
opleader = {
-- ctrl + /
line = '<C-_>',
block = 'bc',
},
}
-- lsp 快捷键设置
-- ./lua/lsp/language_servers.lua
pluginKeys.lsp_on_attach = function(client, buffer)
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
--- 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', 'gh', '<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', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
buf_set_keymap('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
buf_set_keymap('n', 'ge' , '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
buf_set_keymap('n', 'gpe', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
buf_set_keymap('n', '<leader>f', '<cmd>lua vim.lsp.buf.formatting()<CR>', opts)
buf_set_keymap('n', '<leader>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
end
return pluginKeys
```
也可以先看一下完整文件。
- [keybindings.lua 完整文件](../lua/keybindings.lua)
下一章会介绍插件安装,和使用。
- 下一章: [Neovim 插件管理与配置](./packer-usage.md)
- [回首页](../README.md)

230
docs/lsp.md

@ -1,230 +0,0 @@
## Neovim 内置 LSP 配置 (一):基础配置
目前为止最复杂的配置,但最终效果非常酷,值得一配。
<img src="./imgs/lsp.gif" width="850">
什么是 Language Server Protocol ?
[Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) 是微软为开发工具提出的一个协议, 它将编程工具解耦成了`Language Server` 与 `Language Client` 两部分。
<img src="./imgs/lsp.png" width="850">
Client 专注于页面样式实现, Server 负责提供语言支持,包括常见的自动补全,跳转到定义,查找引用,悬停文档提示等功能。
而我们所说的 `Neovim` 内置 LSP 就是 client 端的实现,这样我们就可以链接到和 `VSCode` 相同的 language servers ,实现高质量的语法补全。
## 安装步骤
`:h lsp` 查看文档 QUICKSTART 里写了 4 步
1. 安装 `nvim-lspconfig`
2. 安装对应 [language server](https://microsoft.github.io/language-server-protocol/implementors/servers/)
3. 配置对应语言 `require('lspconfig').xx.setup{…}`
4. `:lua print(vim.inspect(vim.lsp.buf_get_clients()))` 查看 LSP 连接状态
## 安装 nvim-lspconfig
`Neovim` 是客户端,默认不包含 [language server](https://microsoft.github.io/language-server-protocol/implementors/servers/),需要自己安装。
比如 typescript server 就需要用 npm 进行安装 `npm install -g typescript-language-server`
庆幸的是现在有了 [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer#available-lsps) 项目,可以帮助我们自动安装 Language server。
一并装起来,打开 `lua/plugins.lua` 添加 `nvim-lspconfig``nvim-lsp-installer`
```lua
-- lspconfig
use {'neovim/nvim-lspconfig', 'williamboman/nvim-lsp-installer'}
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
## 安装 Language Server
创建 `lua/lsp/setup.lua` ,保存以下内容,安装 language servers,并配置,下边讲解
```lua
local lsp_installer = require "nvim-lsp-installer"
-- 安装列表
-- https://github.com/williamboman/nvim-lsp-installer#available-lsps
-- { key: 语言 value: 配置文件 }
local servers = {
sumneko_lua = require "lsp.lua", -- /lua/lsp/lua.lua
}
-- 自动安装 LanguageServers
for name, _ in pairs(servers) do
local server_is_found, server = lsp_installer.get_server(name)
if server_is_found then
if not server:is_installed() then
print("Installing " .. name)
server:install()
end
end
end
```
`init.vim` 中加载此文件
```vimL
lua require('lsp/setup')
```
还要先创建一个 `lua/lsp/lua.lua` 的空lua server配置文件,后边再填。
`:wq` 保存重启,下方显示 `Installing sumneko_lua` 表示自动安装。
稍等片刻运行 `:LspInstallInfo` 安装成功如图
<img src="./imgs/lsp1.gif" width="850">
## 配置 Lua
上边 `lua/lsp/setup.lua` 配置文件中定义了 `servers` 变量
```lua
local servers = {
sumneko_lua = require "lsp.lua", -- /lua/lsp/lua.lua
}
```
`Lua` 代码和 `JS` 差不多,上述代码定义了一个 table (也叫 object,map,或 dictionary),
key 为 `sumneko_lua`,value 为 `lua/lsp/lua.lua` 文件内容
Lua server 的 key 必须 `sumneko_lua` 才能正确安装。
因为 `sumneko_lua` 这个名字是在[这里查询](https://github.com/williamboman/nvim-lsp-installer#available-lsps) 的。
我打算把每个语言单独配置,本章先配置 Lua, 毕竟我们的配置文件就是 Lua 的。 `require "lsp.lua"` 表示加载 `lua/lsp/lua.lua`
创建对应的配置文件 `lua/lsp/lua.lua`
```lua
local runtime_path = vim.split(package.path, ';')
table.insert(runtime_path, "lua/?.lua")
table.insert(runtime_path, "lua/?/init.lua")
return {
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT',
-- Setup your lua path
path = runtime_path,
},
diagnostics = {
-- Get the language server to recognize the `vim` global
globals = {'vim'},
},
workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api.nvim_get_runtime_file("", true),
},
-- Do not send telemetry data containing a randomized but unique identifier
telemetry = {
enable = false
},
},
},
}
```
每个 Server 都有不同的参数可配置,Lua 的配置说明在 [这里](https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#sumneko_lua)
## 快捷键绑定
回去修改 `lua/lsp/setup.lua`,增加下边部分,当 server 准备好的时候,把配置传进去,并绑定快捷键
```lua
lsp_installer.on_server_ready(function(server)
local opts = servers[server.name]
if opts then
opts.on_attach = function(_, 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
-- 绑定快捷键
require('keybindings').mapLSP(buf_set_keymap)
end
opts.flags = {
debounce_text_changes = 150,
}
server:setup(opts)
end
end)
```
由于我要把快捷键配置都放在一个文件里,所以上边配置文件中调用了 `lua/keybindings.lua` 的 mapLSP 方法,用于配置 LSP 相关的快捷键
```lua
-- 绑定快捷键
require('keybindings').mapLSP(buf_set_keymap)
```
打开 `lua/keybindings.lua` 添加 `mapLSP` 方法
根据你的习惯修改,这是我目前的配置,可能未来会有修改
大部分都是 `g` 开头,表示 go XX
```lua
local pluginKeys = {}
-- lsp 回调函数快捷键设置
pluginKeys.mapLSP = function(mapbuf)
-- rename
mapbuf('n', '<leader>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opt)
-- code action
mapbuf('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opt)
-- go xx
mapbuf('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opt)
mapbuf('n', 'gh', '<cmd>lua vim.lsp.buf.hover()<CR>', opt)
mapbuf('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opt)
mapbuf('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opt)
mapbuf('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opt)
-- diagnostic
mapbuf('n', 'go', '<cmd>lua vim.diagnostic.open_float()<CR>', opt)
mapbuf('n', 'gp', '<cmd>lua vim.diagnostic.goto_prev()<CR>', opt)
mapbuf('n', 'gn', '<cmd>lua vim.diagnostic.goto_next()<CR>', opt)
-- mapbuf('n', '<leader>q', '<cmd>lua vim.diagnostic.setloclist()<CR>', opt)
-- leader + =
mapbuf('n', '<leader>=', '<cmd>lua vim.lsp.buf.formatting()<CR>', opt)
-- mapbuf('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opt)
-- mapbuf('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opt)
-- mapbuf('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opt)
-- mapbuf('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opt)
-- mapbuf('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opt)
end
return pluginKeys
```
注意,这里是通用的设置,并不是所有的 Language Server 都实现了上述所有功能。
比如我发现 Lua Server 就不支持变量改名`vim.lsp.buf.rename()`等。
但最常用的 `gd` 跳转到定义, 然后 `gh` 显示提示等,确定是可用的,见演示。
## 功能演示
`:wq` 重启后,LSP 就应该可以正常使用了。 随便敲代码提示错误
<img src="./imgs/lsp2.gif" width="850">
`gd` 跳转到定义
`opt``map` 上点击 `gd` 会跳转到定义该变量的地方
<img src="./imgs/lsp3.gif" width="850">
`gh` 显示提示 (go hover)
<img src="./imgs/lsp4.gif" width="850">
但是还没有本章开头动图里的 **自动补全代码提示** ,下一章再来配置。 如果配置中有问题欢迎留言指出,谢谢关注。
- [Neovim 内置 LSP 配置 (二):自动代码补全](./lsp2.md)
- [回首页](../README.md)

177
docs/lsp2.md

@ -1,177 +0,0 @@
## Neovim 内置 LSP 配置 (二):自动代码补全
Neovim 本身不支持代码补全,需要通过插件实现,我这里使用最流行的 [nvim-cmp](https://github.com/hrsh7th/nvim-cmp)
## 补全插件安装
打开 `lua/plugins.lua` 添加 `cmp` 相关插件
```lua
-- nvim-cmp
use 'hrsh7th/cmp-nvim-lsp' -- { name = nvim_lsp }
use 'hrsh7th/cmp-buffer' -- { name = 'buffer' },
use 'hrsh7th/cmp-path' -- { name = 'path' }
use 'hrsh7th/cmp-cmdline' -- { name = 'cmdline' }
use 'hrsh7th/nvim-cmp'
-- vsnip
use 'hrsh7th/cmp-vsnip' -- { name = 'vsnip' }
use 'hrsh7th/vim-vsnip'
use 'rafamadriz/friendly-snippets'
-- lspkind
use 'onsails/lspkind-nvim'
```
看着好像装了好多插件,只有 `hrsh7th/nvim-cmp` 是插件本身,其他`cmp-xxx` 基本都是插件补全来源,也就是说当你输入一个变量的时候,可以从多个来源显示补全的内容。
`hrsh7th/cmp-nvim-lsp` 就是 Neovim 内置 LSP 提供的补全内容,
`hrsh7th/cmp-path` 则是用来补全路径,如果配置了这个,当输入一个路径的时候会补全路径,如图
<img src="./imgs/lsp2-2.gif" width="850">
`hrsh7th/vim-vsnip` 被称作一个 snippet 引擎,就是自定义代码段,文档中提到 4 种,都是支持的
snippet engine
- vsnip
- luasnip
- ultisnips
- snippy
我这里选择了 vsnip ,是默认的,貌似很强大,支持 `VSCode` 相同代码格式。
`rafamadriz/friendly-snippets` 非常强大包含了大部分常用语言的代码段,可以到他的 github 主页查看详细内容。
`onsails/lspkind-nvim` 是在代码提示中,显示分类的小图标支持。
不多说 `:wq` 重启,`:PackerSync` 安装
## 代码补全配置
打开 `init.vim` 输入
```vimL
lua require('lsp/nvim-cmp')
```
创建对应的 `lua/lsp/nvim-cmp.lua` 文件
```lua
local lspkind = require('lspkind')
local cmp = require'cmp'
cmp.setup {
-- 指定 snippet 引擎
snippet = {
expand = function(args)
-- For `vsnip` users.
vim.fn["vsnip#anonymous"](args.body)
-- For `luasnip` users.
-- require('luasnip').lsp_expand(args.body)
-- For `ultisnips` users.
-- vim.fn["UltiSnips#Anon"](args.body)
-- For `snippy` users.
-- require'snippy'.expand_snippet(args.body)
end,
},
-- 来源
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
-- For vsnip users.
{ name = 'vsnip' },
-- For luasnip users.
-- { name = 'luasnip' },
--For ultisnips users.
-- { name = 'ultisnips' },
-- -- For snippy users.
-- { name = 'snippy' },
}, { { name = 'buffer' },
{ name = 'path' }
}),
-- 快捷键
mapping = require'keybindings'.cmp(cmp),
-- 使用lspkind-nvim显示类型图标
formatting = {
format = lspkind.cmp_format({
with_text = true, -- do not show text alongside icons
maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters)
before = function (entry, vim_item)
-- Source 显示提示来源
vim_item.menu = "["..string.upper(entry.source.name).."]"
return vim_item
end
})
},
}
-- Use buffer source for `/`.
cmp.setup.cmdline('/', {
sources = {
{ name = 'buffer' }
}
})
-- Use cmdline & path source for ':'.
cmp.setup.cmdline(':', {
sources = cmp.config.sources({
{ name = 'path' }
}, {
{ name = 'cmdline' }
})
})
```
上述配置主要包含 3 个部分
- 指定引擎 `vsnip`
- 配置之前安装的补全来源
- 调用 `keybindings.lua` 的`cmp()`方法配置补全弹窗的快捷键
## 快捷键配置
打开 `lua/keybindings.lua` 配置快捷键,增加:
```lua
-- nvim-cmp 自动补全
pluginKeys.cmp = function(cmp)
return {
-- 上一个
['<C-k>'] = cmp.mapping.select_prev_item(),
-- 下一个
['<C-j>'] = cmp.mapping.select_next_item(),
-- 出现补全
['<A-.>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
-- 取消
['<A-,>'] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
-- 确认
-- Accept currently selected item. If none selected, `select` first item.
-- Set `select` to `false` to only confirm explicitly selected items.
['<CR>'] = cmp.mapping.confirm({
select = true ,
behavior = cmp.ConfirmBehavior.Replace
}),
-- ['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
['<C-u>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
['<C-d>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
}
end
```
根据你的需要修改。 如果没有问题的话,应该全部完成可以使用了。
<img src="./imgs/lsp.gif" width="850">
下一章介绍一些 LSP 的 UI 美化
有任何问题,欢迎留言指出,非常感谢。
- 下一章: 编写中。
- [回首页](../README.md)

161
docs/new.md

@ -1,161 +0,0 @@
vim.fn.stdpath('data')
对应目录
~/.local/share/nvim:
## 组件被安装的目录
~/.local/share/nvim/site/pack/packer/start
~/.local/share/nvim/site/pack/packer/opt
use 'user/repo'
:`PackerClean`
:PackerStatus 查看安装了多少个插件
:PackerUpdate: 更新插件
:PackerSync: 更新并且编译
## 前端
yarn global add eslint_d
## null-ls
`:lua vim.lsp.buf.formatting_sync()`
--[[
language server config
https://github.com/typescript-language-server/typescript-language-server
https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md
打开
`:LspInstallInfo` 查看安装信息
## language server
`:h lsp`
- https://github.com/typescript-language-server/typescript-language-server
- https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md
`yarn global add vscode-langservers-extracte`
## emmet
https://www.npmjs.com/package/ls_emmet
## Vsnip
:VsnipOpen
## rust
先安装 language server, 手动安装
https://rust-analyzer.github.io/
```bash
git clone https://github.com/rust-analyzer/rust-analyzer.git
cd rust-analyzer
cargo xtask install --server
```
如果提示错误,先升级 `cargo`
```
rustup update stable
```
安装成功
```bash
rust-analyzer --version
```
有输出证明安装成功
local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
capabilities.textDocument.completion.completionItem.snippetSupport = true
require'lspconfig/configs'.ls_emmet = {
default_config = {
cmd = { 'ls_emmet', '--stdio' };
filetypes = { 'html', 'css', 'scss', 'javascript', 'javascriptreact', 'typescript', 'typescriptreact', 'haml',
'xml', 'xsl', 'pug', 'slim', 'sass', 'stylus', 'less', 'sss'};
root_dir = function(fname)
return vim.loop.cwd()
end;
settings = {};
};
}
-- Use a lop to conveniently call 'setup' on multiple servers and
-- map buffer local keybindings when the language server attaches
local servers = {'html', 'rust_analyzer', 'tsserver','ls_emmet' }
local nvim_lsp = require('lspconfig')
for _, server in ipairs(servers) do
nvim_lsp[server].setup {
capabilities = capabilities,
on_attach = require('keybindings').lsp_on_attach,
flags = {
debounce_text_changes = 150,
}
}
end
-- local capabilities = vim.lsp.protocol.make_client_capabilities()
-- capabilities.textDocument.completion.completionItem.snippetSupport = true
--]]
## telescope
`:checkhealth telescope` 检查安装情况,提示 `ripgrep` 不存在
```bash
sudo add-apt-repository ppa:x4121/ripgrep
sudo apt-get update
sudo apt install ripgre
```
fd 不存在
`npm install -g fd-find`
设置keybinding
## dev
-- local timer = vim.loop.new_timer()
-- timer:start(
-- 1000,
-- 1000,
-- vim.schedule_wrap(function()
-- vim.api.nvim_command('echomsg "test"')
-- end)
-- )
vim.cmd([[
au TextYankPost * silent! lua vim.highlight.on_yank {higroup="IncSearch", timeout=200}
]])
vim.ui.input("sjfldsjf", function(inp)
print("ans:" .. vim.inspect(inp))
end)
sudo apt install python3
sudo apt install python3-pip
VimspectorInstall CodeLLDB

84
docs/packer-usage.md

@ -1,84 +0,0 @@
## Neovim 插件管理与配置
本章介绍如何使用 `Packer.nvim` 安装与更新 `Neovim` 插件
## Packer 介绍
之前 `vim` 最常见的插件管理应该是 [vim-plug](https://github.com/junegunn/vim-plug) 我也用过,但 `Neovim` 0.5 以后一般都会推荐使用 `lua` 原生的 [packer.nvim](https://github.com/wbthomason/packer.nvim) 做插件管理 。
一个好插件管理器,最重要是常用插件都支持。 现在 `Neovim` 常用插件的主页上都有如何用 `Packer.nvim` 安装的说明了,所以不用担心。
切换也并不复杂,使用方法上也都差不多,开始安装吧
## 安装 Packer.nvim 插件管理器
按照官网的说明
```bash
git clone --depth 1 https://github.com/wbthomason/packer.nvim\
~/.local/share/nvim/site/pack/packer/start/packer.nvim
```
然后创建插件配置文件 `lua/plugins.lua` ,Packer 可以管理和升级他自己
修改 `lua/plugins.lua` 为如下代码
```bash
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
end)
```
`:wq` 保存退出
修改 `init.vim` ,加载这个文件
```vimL
" Packer插件管理
lua require('plugins')
```
`:wq` 保存退出
## 插件安装与更新
Packer.nvim 安装后会增加以下命令,
```lua
-- Regenerate compiled loader file
:PackerCompile
-- Remove any disabled or unused plugins
:PackerClean
-- Clean, then install missing plugins
:PackerInstall
-- Clean, then update and install plugins
:PackerUpdate
-- Perform `PackerUpdate` and then `PackerCompile`
:PackerSync
-- Loads opt plugin immediately
:PackerLoad completion-nvim ale
```
但通常无论 **安装** 还是 **更新** 插件,我只需要下边这一条命令就够了。
`:PackerSync`
每次修改完 `lua/plugins.lua` 这个文件后,保存退出,重新打开
调用 `:PackerSync` 就可以了,但要确定你的网络可以连接到 `github`
安装完成, 按 `q` 退出
<img src="./imgs/packer1.png" width="850">
实在有点丑,下一章我们先把主题装上试试。
- 下一章:[Neovim 主题配置](./colorscheme.md)
- [回首页](../README.md)

84
docs/plugins.md

@ -1,84 +0,0 @@
## 未完成----------------
## treesitter
语法高亮 Treesitter
- https://github.com/nvim-treesitter/nvim-treesitter/wiki/Installation
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- If you are using Packer
use 'shaunsingh/nord.nvim'
use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
end)
```
`:PackerSync`
`~/.config/nvim/lua/plugnis/init.lua`
```bash
require('plugins')
-- ~/.config/nvim/lua/treesitter-config/init.lua
require('treesitter-config')
vim.cmd('colorscheme nord')
```
报错, 安装 `sudo apt-get install build-essential`
## telescope
`:checkhealth telescope` 检查安装情况,提示 `ripgrep` 不存在
```bash
sudo add-apt-repository ppa:x4121/ripgrep
sudo apt-get update
sudo apt install ripgre
```
fd 不存在
`npm install -g fd-find`
设置keybinding
## bufferline.nvim && lualine.nvim
## nvim-tree.lua
## treesitter
- https://github.com/nvim-treesitter/nvim-treesitter/wiki/Installation
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- If you are using Packer
use 'shaunsingh/nord.nvim'
use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
end)
```
`:PackerSync`
`~/.config/nvim/lua/plugnis/init.lua`
```bash
require('plugins')
-- ~/.config/nvim/lua/treesitter-config/init.lua
require('treesitter-config')
vim.cmd('colorscheme nord')
```
报错, 安装 `sudo apt-get install build-essential`

121
docs/plugins/bufferline.md

@ -1,121 +0,0 @@
## Neovim 插件 bufferline 的安装与配置
本章介绍如何给 nvim 安装和配置 [bufferline](https://github.com/akinsho/bufferline.nvim) 插件。
`bufferline` 就是把 buffer 显示成类似 `VSCode` 中 Tab 页的形式,如下动图所示:
常用 `VSCode` 的一定非常熟悉这个,我的目标也是尽量接近 `VSCode` 的样子。
<img src="../imgs/bufferline.gif" width="800">
## 安装 bufferline.nvim
打开 `plugins.lua` ,增加 `nvim-tree` 相关的代码
```lua
-- bufferline
use {'akinsho/bufferline.nvim', requires = 'kyazdani42/nvim-web-devicons'}
```
完整 `plugins.lua` 文件如下:
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- gruvbox theme
use {
"ellisonleao/gruvbox.nvim",
requires = {"rktjmp/lush.nvim"}
}
-- nvim-tree
use {
'kyazdani42/nvim-tree.lua',
requires = 'kyazdani42/nvim-web-devicons'
}
-- bufferline (新增)
use {'akinsho/bufferline.nvim', requires = 'kyazdani42/nvim-web-devicons'}
end)
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
`Packer.nvim` 使用方式参看 [之前章节](../packer-usage.md)
成功后如图所示,按 q 退出
<img src="../imgs/bufferline.png" width="800">
如果报错网络错误,重新运行 `:PackerSync`
## 配置 bufferline
创建 `lua/plugin-config/bufferline.lua` 文件
添加配置
```lua
vim.opt.termguicolors = true
require("bufferline").setup {
options = {
-- 使用 nvim 内置lsp
diagnostics = "nvim_lsp",
-- 左侧让出 nvim-tree 的位置
offsets = {{
filetype = "NvimTree",
text = "File Explorer",
highlight = "Directory",
text_align = "left"
}}
}
}
```
`bufferline.nvim` 有很多配置项,我没有过多设置,主要是把左侧 `nvim-tree` 的位置让出来了,为了保持与 `VSCode` 一致,
如果不设置 `offsets` 他默认会从左上角开始出现 Tab。
[bufferline.nvim](https://github.com/akinsho/bufferline.nvim) 主页有更多详细设置介绍,你有哪些不错的选项,欢迎留言告诉我。
打开 `init.vim`,加载 `lua/plugin-config/bufferline.lua` 配置文件,增加
```vimL
lua require('plugin-config/bufferline')
```
`:wq` 保存退出。
## 配置快捷键
打开 `/lua/keybindings.lua` 根据个人习惯,增加
```lua
-- bufferline 左右Tab切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)
```
因为我已经把 `Alt + h``Alt + l` 分配给了光标在左右分屏之间跳转
保持我在 `VSCode` 中的习惯,使用 `Ctrl + h``Ctrl + l` 左右切换 tab。
## 我的常用操作
- `Alt + m` 打开 `nvim-tree`
- `j/k` 移动光标
- `o` 打开文件
- `Alt + h` 跳回`nvim-tree`分屏
- `o` 继续打开文件
- `Alt + m` 关闭 `nvim-tree`
- `Ctrl + h``Ctrl + l` 左右切换 tab
<img src="../imgs/bufferline2.gif" width="850">
还有其他配置,暂不常用,未来再补充,详见 [bufferline.nvim](https://github.com/akinsho/bufferline.nvim) 主页
下一章介绍 Neovim 代码高亮插件,感谢关注。
- 下一章: [Neovim 代码高亮插件 nvim-treesitter 的安装与配置](./nvim-treesitter.md)
- [回首页](../../README.md)

90
docs/plugins/comment.md

@ -1,90 +0,0 @@
## Neovim 代码注释插件 Comment.nvim 的安装与配置
本章介绍如何给 Neovim 增加代码注释快捷。
## 安装 [Comment.nvim](https://github.com/numToStr/Comment.nvim) 插件
打开 `plugins.lua` ,增加 `Comment.nvim` 相关的代码。
```lua
-- Comment
use 'numToStr/Comment.nvim'
```
`:wq` 保存退出,重新打开后运行 `:PackerSync` 安装插件。
`Packer.nvim` 使用方式参看 [之前章节](../packer-usage.md)
成功后如图所示,按 q 退出。
如果报错网络错误,重新运行 `:PackerSync`
## 配置 Comment.nvim
创建 `lua/plugin-config/comment.lua` 文件,增加:
```lua
require('Comment').setup(require('keybindings').comment)
```
由于注释只需要配置快捷键触发就可以,所以直接调用 `keybindings.lua` 里设置的快捷键
打开 `lua/keybindings.lua`,添加
```lua
-- 代码注释插件
pluginKeys.comment = {
toggler = {
line = 'gcc',
block = 'gbc',
},
opleader = {
line = 'gc',
bock = 'gb'
}
}
-- ctrl + /
map("n", "<C-_>", "gcc", {noremap = false})
map("v", "<C-_>", "gcc", {noremap = false})
```
这个插件也是很强大的,可去主页研究,我目前只用到基本的功能。
在 Normal 模式下
- `gcc` - 行注释切换
- `gbc` - 块注释切换
- `gc[count]{motion}` - 例如 `gc3j` 注释下边三行
- `gb[count]{motion}` - 例如 `gbi{``{}` 中的内容注释
`gc` `gb` 很强大,`gc` 可以记为`go comment`, `gb` 可以记为 `go block comment`
和其他动词一样,可以接[count]{motion},比如 `gci(``gbi(``()` 中的内容注释,这个非常方便呀
<img src="../imgs/comment1.gif" width="800">
`gci{``gbi{`
<img src="../imgs/comment2.gif" width="800">
VISUAL 模式下
- `gc` - 切换行注释
- `gb` - 切换块注释
当然为了保留我在 `VSCode` 下的习惯,设置了 `Ctrl + /` 为切换注释,
注意 Vim 下 `Ctrl + /` 要写成 `<C-_>`,应该也是历史遗留问题吧
```lua
-- ctrl + /
map("n", "<C-_>", "gcc", {noremap = false})
map("v", "<C-_>", "gcc", {noremap = false})
```
完整文件 [keybindings.lua](https://github.com/nshen/learn-neovim-lua/blob/main/lua/keybindings.lua) 文件
- 下一章编写中
- [回首页](../../README.md)

110
docs/plugins/nvim-tree.md

@ -1,110 +0,0 @@
## Neovim 插件 nvim-tree 的安装与配置
本章介绍如何给 nvim 安装和配置 [nvim-tree.lua](https://github.com/kyazdani42/nvim-tree.lua) 插件。
## 安装 nvim-tree
打开 `plugins.lua` ,增加 `nvim-tree` 相关的代码
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- gruvbox theme
use {
"ellisonleao/gruvbox.nvim",
requires = {"rktjmp/lush.nvim"}
}
-- nvim-tree (新增)
use {
'kyazdani42/nvim-tree.lua',
requires = 'kyazdani42/nvim-web-devicons'
}
end)
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
`Packer.nvim` 使用方式参看 [之前章节](../packer-usage.md)
成功后如图所示,按 q 退出
<img src="../imgs/nvim-tree1.png" width="800">
如果报错网络错误,重新运行 `:PackerSync`
## 配置 nvim-tree
创建 `lua/plugin-config/nvim-tree.lua` 文件
添加配置
```lua
require'nvim-tree'.setup {
-- 关闭文件时自动关闭
auto_close = true,
-- 不显示 git 状态图标
git = {
enable = false
}
}
```
`nvim-tree` 有很多配置项,但我觉得默认已经很完美了。
这里使用了 `nvim-tree.lua` 的默认配置,我只把 git 状态图标关闭了,打开自动关闭
[nvim-tree.nvim](https://github.com/kyazdani42/nvim-tree.lua) 主页有更多详细设置选项介绍
打开 `init.vim`,增加
```vimL
" 插件配置
lua require('plugin-config/nvim-tree')
```
`:wq` 保存退出,重新打开,运行 `:NvimTreeToggle`
如图:
<img src="../imgs/nvim-tree2.png" width="850">
再次运行 `:NvimTreeToggle` 即可关闭
## 配置快捷键
打开 `/lua/keybindings.lua` 增加
```lua
-- nvimTree
map('n', '<A-m>', ':NvimTreeToggle<CR>', opt)
```
我习惯 `Alt + m` 打开、关闭菜单, `Alt + hjkl` 窗口间切换窗口
<img src="../imgs/nvim-tree3.gif" width="850">
## 文件操作
`nvim-tree` 可以执行常见的 创建 、删除、拷贝、剪切 文件等操作
- `o` 打开关闭文件夹
- `a` 创建文件
- `r` 重命名
- `x` 剪切
- `c` 拷贝
- `p` 粘贴
- `d` 删除
下边 `gif` 演示常见操作
`alt+m` 打开菜单 -> `a` 创建文件 -> `o` 打开文件夹 -> `r` 重命名为 -> `c` 拷贝 -> `p` 粘贴 -> `d` 删除文件
<img src="../imgs/nvim-tree4.gif" width="850">
还有其他功能,我不常用,详见 [nvim-tree.nvim](https://github.com/kyazdani42/nvim-tree.lua) 主页
下一章介绍 `bufferline.nvim` 插件,感谢关注。
- 下一章: [Neovim 插件 bufferline 的安装与配置](./bufferline.md)
- [回首页](../../README.md)

198
docs/plugins/nvim-treesitter.md

@ -1,198 +0,0 @@
## Neovim 代码高亮插件 nvim-treesitter 的安装与配置
本章介绍如何给 nvim 安装和配置 [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) 插件。
`nvim-treesitter` 插件提供基于 `tree-sitter` 的多个基础功能,它可以让你在 nvim 中高效的实现 **代码高亮**,**增量选择** 等功能。
先看一下之前的 `basic.lua` 安装前和安装后代码高亮效果对比:
<img src="../imgs/treesitter.gif" width="800">
之所以效果这么好,是因为 `Treesitter` 可以针对不同的语言,安装不同的 `language parser`, 根据需要下载。
不同语言的效果截图详见官网 [Gallery](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Gallery)。
`nvim-treesitter` 支持的编程语言非常多,常见都支持,列表见 [Supported languages](https://github.com/nvim-treesitter/nvim-treesitter#supported-languages)。
## 安装 nvim-treesitter
打开 `plugins.lua` ,增加 `nvim-treesitter` 相关的代码
```lua
-- treesitter
use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
```
完整 `plugins.lua` 文件如下:
```lua
return require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
----------- colorscheme -----------
-- gruvbox
use {"ellisonleao/gruvbox.nvim", requires = {"rktjmp/lush.nvim"}}
-- zephyr
use 'glepnir/zephyr-nvim'
-- nord
use 'shaunsingh/nord.nvim'
----------------------------------
-- nvim-tree
use {
'kyazdani42/nvim-tree.lua',
requires = 'kyazdani42/nvim-web-devicons'
}
-- bufferline
use {'akinsho/bufferline.nvim', requires = 'kyazdani42/nvim-web-devicons'}
-- treesitter (新增)
use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
end)
```
`:wq` 保存退出,重新打开后运行 `:PackerSync`
`Packer.nvim` 使用方式参看 [之前章节](../packer-usage.md)
注意下边状态栏,安装后会默认下载一个 `c``parser` ,如下动图,等待完成, 按 q 退出。
<img src="../imgs/treesitter1.gif" width="800">
如果报网络错误,重新运行 `:PackerSync`
## 查看已安装的 Language parser
`:TSInstallInfo`
<img src="../imgs/treesitter2.png" width="800">
## 手动安装 Language parser
手动安装 language parser
```
:TSInstall <language_to_install>
```
比如
```
:TSInstall javascript
```
安装后调用 `:TSBufToggle highlight` 可显示高亮
其实 **不必手动安装** ,我们可以在配置文件中指定,自动安装
## 配置 nvim-treesitter
`nvim-treesitter` 目前提供以下模块,默认都是关闭的,需要在配置文件中设置 `enable = true` 手动开启
- 代码高亮模块
- 增量选择模块
- `=` 代码格式化模块
- Folding 模块
我配置文件中开启了全部 4 个模块,下边会逐个解释
创建 `lua/plugin-config/treesitter.lua` 文件
添加配置
```lua
require'nvim-treesitter.configs'.setup {
-- 安装 language parser
-- :TSInstallInfo 命令查看支持的语言
ensure_installed = {"html", "css", "vim", "lua", "javascript", "typescript", "tsx"},
-- 启用代码高亮功能
highlight = {
enable = true,
additional_vim_regex_highlighting = false
},
-- 启用增量选择
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
node_decremental = '<BS>',
scope_incremental = '<TAB>',
}
},
-- 启用基于Treesitter的代码格式化(=) . NOTE: This is an experimental feature.
indent = {
enable = true
}
}
-- 开启 Folding
vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
-- 默认不要折叠
-- https://stackoverflow.com/questions/8316139/how-to-set-the-default-to-unfolded-when-you-open-a-file
vim.wo.foldlevel = 99
```
上边我设置了确保安装这些语言,你可以根据你的情况修改
`ensure_installed = {"html", "css", "vim", "lua", "javascript", "typescript", "tsx"}`
查看安装情况,和支持语言运行:
`:TSInstallInfo`
加载配置文件:
打开 `init.vim`,加载 `lua/plugin-config/nvim-treesitter.lua` 配置文件,增加
```vimL
lua require('plugin-config/nvim-treesitter')
```
`:wq` 保存退出,重开后应该会自动安装语言,安装后运行 `:TSModuleInfo` 查看是否成功
<img src="../imgs/treesitter3.png" width="800">
都打对号就成功了。
## 代码高亮模块
代码高亮如文章开头介绍,成功开启后,效果如下
<img src="../imgs/treesitter.gif" width="800">
## 增量选择模块
什么是增量选择 (incremental selection),见图:
<img src="../imgs/treesitter4.gif" width="800">
回去看我上边的配置,我把 **回车****退格** 设置成了快捷键
不断的按 `Enter` 选择区域会从里层不断外扩, `Backspace` 则相反不断内收。
## `=` 代码格式化(indent) 模块
`=` 格式化代码, 如图
<img src="../imgs/treesitter5.gif" width="800">
`gg=G` 命令格式化整个文件, 相当于 `ggvG=` 选中整个文件然后 `=` 格式化
可以考虑添加一个快捷键,编辑 `lua/keybindings.lua`
```lua
-- nvim-treesitter 代码格式化
map("n", "<leader>i", "gg=G", opt)
```
## Folding 模块
`zc``zo` 会 折叠 `{}` 里的内容,如图
<img src="../imgs/treesitter6.gif" width="800">
下一章继续介绍其他插件,感谢关注。
- 下一章: (正在写)
- [回首页](../../README.md)

88
docs/windows-terminal-wsl2.md

@ -1,88 +0,0 @@
## 在 Windows Terminal 与 WSL 2 下安装 Neovim
本章介绍如何在 `Windows` 命令行环境下安装 `Neovim`
## WSL 2
首先确定你的 `Windows` 系统是否为 `WSL 2`,如果不是请先 *找教程* 升级到 `WSL 2`
查看方法为在 `cmd` 中运行 `wls -l -v`
![wsl version](./imgs/1.png)
可以看到我安装的子系统为 `Ubuntu-18.04`,也是我推荐的系统。
后边的 `VERSION` 2 表示是在 `WSL2` 环境,成功后继续下一步。
## Windows Terminal
在 [微软应用商店](https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab#) 直接点击 GET 安装
![windows terminal](./imgs/terminal.jpg)
安装后可以在 `设置` 里进行一系列美化设置,之后最重要的是安装 `Nerd fonts`
## Nerd fonts
简单讲,Nerd fonts 就是打包了各种常见的 ‘iconic fonts’,到你常用的字体里。
这样就可以方便的在命令行下显示这些 icons 了。 很多 `Neovim` 插件都会用到这些图标
![nerd fonts](./imgs/sankey-glyphs-combined-diagram.png)
到这里 https://www.nerdfonts.com/font-downloads 找到你喜欢的字体。
比如我在 `VSCode` 里最常用的是 `Fira Code` 字体,那么我就安装这个打了 Patch 的`FiraCode` 字体
https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/FiraCode/Regular/complete/
注意要下载兼容 `Windows` 的版本 `XXXX Windows Compatible.ttf`,下载后双击即可安装完成。
`Terminal` 中点击 `设置` `外观`,在字体选项里,选中刚才安装的字体,保存。
![nerd fonts](./imgs/2.png)
安装过后,命令行里就支持显示这些小图标了,为了测试是否成功,可以到这个网址可以复制小图标
https://www.nerdfonts.com/cheat-sheet
粘贴到命令行里。
![nerd fonts](./imgs/3.png)
看到我的 `github``twitter` 小图标了吗,这样就是成功了。
## 安装 Neovim
由于我的环境的 `Ubuntu-18.04` ,所以要用 `apt` 安装 `Neovim`,具体方法如下:
```bash
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt-get update
sudo apt-get install neovim
```
如果报错找不到 `add-apt-repository` 命令,需要先安装下边的包
```bash
sudo apt-get install software-properties-common
```
安装成功后,运行 `nvim` 即可打开,注意确认 `nvim` 版本必须为 **0.5** 以上,如果版本过低,说明没有成功添加 `ppa:neovim-ppa/stable`
需要重新安装,当然你也可以选择安装 `unstable` 版本
`sudo add-apt-repository ppa:neovim-ppa/unstable`
安装后可选步骤,替换默认的vim `nvim ~/.bashrc`
```bash
alias vim='nvim'
alias vi='nvim'
alias v='nvim'
```
目前安装完成,但 `vim` 的默认配置不尽人意,下一篇介绍基础配置。
- 下一章: [Neovim 基础配置](./basic-config.md)
- [回首页](../README.md)
Loading…
Cancel
Save