@ -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" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
@ -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) |
@ -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) |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 613 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 696 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 215 KiB |
Before Width: | Height: | Size: 244 KiB |
Before Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 517 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 466 KiB |
Before Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 502 KiB |
Before Width: | Height: | Size: 299 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 168 KiB |
Before Width: | Height: | Size: 627 KiB |
Before Width: | Height: | Size: 564 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 900 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 198 KiB |
Before Width: | Height: | Size: 386 KiB |
Before Width: | Height: | Size: 504 KiB |
Before Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 786 KiB |
@ -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) |
@ -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) |
@ -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) |
@ -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 |
@ -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) |
@ -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` |
@ -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) |
@ -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) |
|||
|
@ -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) |
@ -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) |
@ -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) |