# my-vimrc **Repository Path**: xu_wanghao/my-vimrc ## Basic Information - **Project Name**: my-vimrc - **Description**: 📜我的Vim和Neovim配置 | My Vim & Neovim config - **Primary Language**: VimL - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2022-12-14 - **Last Updated**: 2024-12-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # my-vimrc 我的Vim和Neovim配置 My Vim & Neovim config --- * [环境需求](#环境需求) * [主要功能](#主要功能) * [配置我的Vim](#配置我的vim) * [使用完全版配置.vimrc](#使用完全版配置vimrc) * [使用精简版配置.vimrc.fast](#使用精简版配置vimrcfast) * [配置我的Neovim](#配置我的neovim) * [安装Neovim](#安装neovim) * [配置Neovim](#配置neovim) * [主要快捷键](#主要快捷键) * [辅助快捷键](#辅助快捷键) * [【Neovim】代码补全、内容跳转等](#neovim代码补全内容跳转等) * [附:关于Vim的标签跳转](#附关于vim的标签跳转) * [【Neovim】代码/程序调试](#neovim代码程序调试) --- ## 环境需求 ### 操作系统 目前测试了`Windows >= 10`与`Ubuntu >= 18.04`系统, 我手头上没有Mac电脑,所以暂时没有适配`macOS`。 ### 应用程序版本 如果你习惯使用Vim,请保证版本号 `Vim >= 7.3.1058` 如果你习惯使用Neovim,请保证版本号 `Neovim >= 0.8` 版本号低于要求时,可能会有部分功能无法正常使用。 ## 主要功能 - 目录文件树、命令行、文件历史版本管理、底部状态栏、粘贴板历史、代码标签树、文件和内容的模糊检索、代码格式化、代码补全与跳转(Neovim)、代码调试(Neovim)等。 - 本套配置中,Vim的定位是**增强版的文本编辑器,而非IDE**;Neovim可以**承担IDE的一部分功能,但也不能完全取代IDE**。 - 如果需要在嵌入式设备上配置Vim,或者发现```.vimrc```配置导致Vim打开文件缓慢、浏览文件时卡顿,可以使用精简版的```.vimrc.fast```配置文件。精简版的配置保留了大部分主要功能,并使用了更加轻量的插件。 ## 配置我的Vim [![Vim Logo](https://github.com/vim/vim/raw/master/runtime/vimlogo.gif)](https://www.vim.org) ### 使用完全版配置`.vimrc` 切换路径至本仓库目录下,复制本仓库的```.vimrc```作为用户的Vim默认配置文件。 ``` cp ./.vimrc ~/.vimrc ``` 配置中使用了vim-plug作为Vim的插件管理器。首次运行配置过的Vim时,Vim会自动下载并安装插件管理器,并自动安装一系列插件。 主要功能插件的快捷键是``` ~ ```,``` ~ ```。安装完毕后重新进入Vim,即可按动快捷键查看插件是否工作正常。 ⚠️注意: 1. 如果插件下载安装进度过慢或显示某些插件安装失败,请退出Vim,然后尝试重新打开Vim输入命令```:PlugInstall```来下载安装这些插件。 2. 配置文件默认使用加速网站来加快对github的访问,如需更换回原始的github网址,请更改配置文件中的```GITHUB_RAW```与```GITHUB_SITE```变量值,将被注释掉的变量值还原。在改变网址后所有已安装插件都需要更新,输入命令```:PlugClean```和```:PlugInstall```来重新下载安装插件。 ### 使用精简版配置`.vimrc.fast` **精简版的配置目标是——首先保证Vim的启动速度和使用流畅性,其次添加方便用户的功能**。精简版配置删去了一些不必要的插件,并且使用了更加轻量的插件。使用精简版配置后,Vim会拥有飞快的启动速度,用户将获得流畅的编辑体验。 切换路径至本仓库目录下,复制本仓库的```.vimrc.fast```作为用户的Vim默认配置文件。 ``` cp ./.vimrc.fast ~/.vimrc ``` 安装插件等操作与完全版配置相同。精简版配置中默认没有占用``功能键,其它功能键的分布与完全版一致。 ## 配置我的Neovim ![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png) **Neovim编辑器是对传统Vim编辑器的重构**。Neovim拥有着强大的: - **可扩展性**——几乎所有主流语言都可以轻松访问Neovim的API,因此大家能够很容易地编写它的插件。Neovim对lua语言的内建支持使得插件可以飞速运行,这让**流畅的**代码补全和语法高亮等功能成为可能。 - **可用性**——Neovim修缮了Vim过时的默认配置(Neovim定制了一套自己的新默认配置),并添加了现代编辑器的新功能,如现代GUI、异步加载和终端模拟器等。 ### 安装Neovim 本仓库的Neovim配置文件需要比较新的Neovim版本,大多数的包管理器软件源尚未更新该版本,因此需要遵循[官方文档](https://github.com/neovim/neovim/wiki/Installing-Neovim)手动安装。 对于x86_64架构的Linux系统,执行如下操作来下载Neovim的可执行文件,下载后应当可以直接运行Neovim。
🟨展开安装步骤,适用于x86_64架构的Linux系统 ``` curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage chmod u+x nvim.appimage ./nvim.appimage ``` 此时Neovim应当开始运行。 ```nvim.appimage```是Neovim的启动程序,可以将其改名为```nvim```放置在```/usr/bin/```目录下(需要sudo权限。```/usr/bin/```目录应当存在于```$PATH```中,操作后所有用户均可使用nvim命令)。 ``` chmod +x nvim.appimage sudo mv ./nvim.appimage /usr/bin/nvim ``` 或改名为```nvim```放置在```~/.local/bin/```目录下(无需sudo权限。```~/.local/bin/```应当存在于```$PATH```中,操作后仅当前用户可使用nvim命令)。 ``` mv ./nvim.appimage ~/.local/bin/nvim ``` 💡如果```nvim.appimage```执行失败(在确认文件已经**完整下载**后,仍然执行失败),可以手动从安装包里解压Neovim相关文件到本地。 ``` ./nvim.appimage --appimage-extract ./squashfs-root/AppRun --version ``` 如果要全局安装(需sudo权限),先对相关文件进行移动,再将可执行文件软连接到系统二进制文件目录下,命名为nvim。操作完成后,使用nvim命令便可以启动Neovim。 ``` sudo mv squashfs-root / sudo ln -s /squashfs-root/AppRun /usr/bin/nvim nvim ``` 💡如果没有sudo权限,可以仅对当前用户安装Neovim。对Ubuntu系统而言,可以将程序数据移动至当前用户```$HOME```下的```.local/```目录(这是Ubuntu默认用于存放当前用户应用数据的位置);然后将可执行文件软连接至```~/.local/bin/nvim```(```~/.local/bin/```目录是Ubuntu系统默认用于存放当前用户可执行文件的位置,并应当默认存在于当前用户的```$PATH```中)。 ``` mv squashfs-root ~/.local/ ln -s ~/.local/squashfs-root/AppRun ~/.local/bin/nvim nvim ```
### 配置Neovim 切换路径至本仓库目录下,复制本仓库的```init.vim```作为用户的Neovim默认配置文件。 在Linux系统上,应当将Neovim配置文件`init.vim`放置于```~/.config/nvim/```目录 ``` mkdir -p ~/.config/nvim/ cp ./init.vim ~/.config/nvim/init.vim ``` 对于Windows系统,用户需要将Neovim配置文件`init.vim`放置于```~\AppData\Local\nvim\```目录 ``` # 使用PowerShell mkdir "~\AppData\Local\nvim\" cp .\init.vim "~\AppData\Local\nvim\init.vim" ``` 在终端输入```nvim```进入Neovim,此时将自动开始下载插件管理器```plug.vim```。下载完毕后Neovim会报告一系列插件未找到的错误,这是正常现象。按下```大写的G```跳转到信息末尾,即可自动安装所有插件。 主要功能插件的快捷键是``` ~ ```。安装完毕后重新进入Neovim,即可按动快捷键查看插件是否工作正常。 ⚠️注意: 1. 如果插件下载安装进度过慢或显示某些插件安装失败,请退出Neovim,然后尝试重新打开Neovim输入命令```:PlugInstall```来下载安装这些插件。 2. 配置文件默认使用加速网站来加快对github的访问,如需更换回原始的github网址,请更改配置文件中的```GITHUB_RAW```与```GITHUB_SITE```变量值,将被注释掉的变量值还原。在改变网址后所有已安装插件都需要更新,输入命令```:PlugClean```和```:PlugInstall```来重新下载安装插件。 ## 主要快捷键 ### ✅按键的描述方式 - ``````表示短促地按一下```F2```功能键。 有些电脑的功能键需要先按住```fn```键才能启用,建议设置成不需要按```fn```键就能直接用。 - ``和``都表示先按住```Ctrl```不松手,再直接按下键盘上的```p```键。 --- ### `````` 文件浏览器 以文件树的方式查看当前目录。可以在其中打开/删除/新建文件等。再按一次快捷键可关闭窗口。 --- ### `````` 系统终端 在编辑器内部打开一个系统终端。再次按下该快捷键可隐藏或关闭此终端窗口。
🟨展开详细说明 #### Vim完全版配置 - 若当前Vim原生支持终端功能(`:echo has('terminal')`打印返回值为`1`),则使用`voldikss/vim-floaterm`插件。 - 直接按下``后,一个系统终端会出现在界面下方。终端内部的操作方式和系统原生终端一致,支持```Tab```命令补全,上下翻阅历史记录等操作。 - 先按下某个`数字键`再按下``,会开启一个新的终端,不同编号的终端彼此独立。 - 同一时间只能显示一个终端,其余的自动被隐藏。被隐藏的终端里运行的程序不会被打断。 - 无论当前位于哪一个编号的终端,再次按下``都可隐藏当前终端窗口。被隐藏的终端里运行的程序不会被打断。 - 若当前Vim不支持终端功能,则使用`Shougo/vimshell.vim`插件。该插件可以在Vim中模拟一个终端窗口。 - 🟨本插件在安装时需要调用`make`和`g++`等命令来生成所需要的库,请事先安装相关的编译工具。 - 支持```Tab```命令补全,``上翻历史记录,``下翻。 - 再次按下``可隐藏当前终端窗口,终端内运行的程序不会被打断。 #### Vim精简版配置 - 若当前Vim原生支持终端功能(`:echo has('terminal')`打印返回值为`1`),则按下``后界面下方会出现一个新的终端窗口。再次按下``可关闭此终端窗口。 - 🟨终端被关闭时,里面运行的程序会被终止。 - 若当前Vim不支持终端功能,按下``后会自动执行Vim的`:shell`命令,屏幕下方会出现一行提示。 - 此时按任意键即可离开Vim,进入终端。 - 使用完毕后,在终端内按下``或执行`exit`命令,即可结束终端,回到Vim。 - 🟨终端被关闭时,里面运行的程序会被终止。 #### Neovim 使用`akinsho/toggleterm.nvim`插件。 - 直接按下``后,一个系统终端会出现在界面下方。终端内部的操作方式和系统原生终端一致,支持```Tab```命令补全,上下翻阅历史记录等操作。 - 再次按下``可隐藏当前终端窗口,终端内运行的程序不会被打断。 - 先按下某个`数字键`再按下``会开启一个新的终端,不同编号的终端彼此独立。不同终端可以同时分屏显示。 - 按下``,然后按`数字键`再按下``,可隐藏指定编号的终端窗口。被隐藏的终端里运行的程序不会被打断。
--- ### `````` 文件历史版本 展示当前文件撤销和重做的历史记录。历史记录可以分叉,并且可以随时将文件内容回退或前进到选定历史版本。再按一次快捷键可关闭窗口。 --- ### `````` 底部状态栏 开启或关闭底部状态栏(默认开启)。状态栏可以显示当前的Vim模式与当前文件的详细信息,如行列号/文件路径/编码/当前按键等。再按一次快捷键可切换状态栏的开关状态。 --- ### `````` 【Neovim】代码调试器 **仅适用于Neovim**。打开代码调试器,对当前脚本或指定程序进行调试。再按一次快捷键可关闭窗口。 - 🟨本插件会调用系统中相应的代码调试工具,如```gdb(需要安装GCC)```,``` pdb(需要安装Python)```等,满足依赖后该插件即可调试对应的代码。 --- ### `````` 粘贴板历史 列举最近在**编辑器内部**复制的所有内容。输入数字或双击对应行,即可粘贴相应内容。再按一次快捷键可关闭窗口。 --- ### `````` 代码标签树 分析并展示当前代码文件的所有标签(指函数/变量/包含文件/宏等),依赖于外部```ctags```程序。鼠标双击/键盘回车某个标签,即可跳转至标签定义位置。再按一次快捷键可关闭窗口。 - 🟨本插件需要提供```ctags```程序方可工作,```ctags```可通过包管理器安装。```ctags```命令一般由```universal-ctags```包和```exuberant-ctags```包提供,该插件同时兼容两者,但建议安装仍在更新的```universal-ctags```。 --- ### `````` 模糊检索器 快速对文件名/文件内容/标签等信息进行**模糊检索**。无须记住整个文件路径,只需输入文件路径和文件名的**几个字母**,即可交互式地进行查找。再按一次快捷键可关闭窗口。
🟨展开详细说明 #### Vim完全版配置 基于```ctrlpvim/ctrlp```插件。默认状态下为文件名查找模式,输入大致的文件路径和名称即可进行模糊查找。```方向键```选择查询结果,```回车键```打开选择的文件。``````和``````切换查找的类别(files文件/tags标签等)。 若要查询tags标签,需要在当前目录下提供```ctags```生成的标签文件。在项目根目录下执行```ctags -R .```即可生成整个项目的tags文件。 - 🟦默认在当前工作目录下进行查找。如需查询其他目录下的内容,可手动输入命令```:CtrlP 目录名```。 - 🟦额外安装文件内容检索工具[rg](https://github.com/BurntSushi/ripgrep)或[ag](https://github.com/ggreer/the_silver_searcher),可提高本插件的检索效率。两者之中`rg`的效率略高于`ag`。 #### Vim精简版配置 基于```mileszs/ack.vim```插件。按下``后,在Vim界面下方的命令行中输入要查找的文件名称(名称的一部分也可)或“grep正则表达式”。输入完毕后按下`回车键`,即可在当前工作目录下搜索指定文件。 - 🟨需要额外安装文件内容检索工具[ag](https://github.com/ggreer/the_silver_searcher),才能正常使用此功能。 `rg`的文件搜索接口和本插件不兼容,所以这里用效率稍逊一些的`ag`。 - 🟦默认在当前工作目录下进行查找。如需查询其他目录下的内容,可在目标文件后写明搜索目录,如```:AckFile! 搜索目标 搜索目录```。 #### Neovim 基于```nvim-telescope/telescope.nvim```插件。``````进入后只需输入文件路径和文件名的几个字母,即可交互式查找文件位置。 - 🟦默认在当前工作目录下进行查找。如需查询其他目录下的内容,可手动输入命令```:Telescope find_files search_dirs=目录名```。 - 🟦额外安装文件内容检索工具[rg](https://github.com/BurntSushi/ripgrep)和文件位置搜索工具[fd](https://github.com/sharkdp/fd),可提高本插件的检索效率。
## 辅助快捷键 ### ✅按键的描述方式 - ```t```表示先短促地按一下```反斜杠\```(即Leader键),紧接着再短促地按一下小写的```t```。 两次按键间隔要短,不然编辑器会认为这是两次不相关的输入。 - ```ve```表示依次快速按一下```反斜杠\```、小写的```v```和小写的```e```。按键间隔要短。 - ```F```(大写```F```)表示先按住```Shift```不松手,再按下小写的```f```,此时输出大写的```F```。 - ```F```表示先短促地按一下```反斜杠\```,紧接着再短促地按一下大写的```F```(按```Shift```不松手并按```f```)。 - ```cY```表示先短促地按一下```c```,紧接着再短促地按一下大写的```Y```。 --- ### ```ve``` 编辑配置文件 快速打开并编辑Vim/Neovim配置文件。打开的配置文件位于一个新的标签页中。 ### ```vs``` 保存并更新配置 保存当前已打开的所有可写文件,并使Vim/Neovim配置马上生效。 ### ```vi``` 安装插件 先保存并更新配置(若配置文件有错误,忽略报错),然后安装配置文件中**新列举**的插件。 如果你需要引入某个新插件,可以先在配置文件的插件列表里添加你的插件信息,然后使用此快捷键下载安装对应的新插件到电脑。 ### ```vc``` 删除插件 先保存并更新配置(若配置文件有错误,忽略报错),然后删除配置文件中**未列举**的插件。 如果你不再需要某个旧插件,可以先在配置文件中删除插件列表里的对应那一行,然后使用此快捷键删除电脑上的旧插件本体。 ### ```vu``` 更新插件 先保存并更新配置(若配置文件有错误,忽略报错),然后更新配置文件中**已列举**的插件。 --- ### ```cY``` 复制行到系统剪贴板 > 这里往下的四个快捷键都与**系统剪贴板**相关,其中`cY`和`cy`快捷键用起来非常方便,**强烈推荐**! `cY`的用法和效果类似于Vim中的`yy`,用来复制Vim当前行的内容到系统剪贴板。在Vim里复制成功后,我们可以将文字内容粘贴到操作系统的其它程序中(如浏览器等)。
🟨展开详细说明 - 🟨在使用系统剪贴板相关的功能前,需要安装哪些依赖呢? 1. 如果你正在使用**Windows版本的gVim或Neovim**——没问题!请拿好你的`cY`和`cy`快捷键~ 如果你的电脑上拥有`PowerShell 5.1`或更高,那么你可以使用`cY`、`cy`、`cP`和`cp`全部四个快捷键,好好享受属于你的Vim时光吧! 2. 如果你正在某个**终端模拟器**中使用Vim(无论使用的是本地的Vim还是SSH远程服务器的Vim),不妨看一看[这张表](https://github.com/ojroques/vim-oscyank#vim-oscyank)~ 如果你使用的终端模拟器**支持OSC52**功能——恭喜你!你可以尽情使用`cY`和`cy`快捷键,不需要安装任何其它依赖! (Windows Terminal和iTerm2都支持,但Linux上的GNOME Terminal尚未支持) 3. 如果你正在通过**SSH连接Linux机器**——请确保Linux端SSH服务器配置`/etc/ssh/sshd_config`打开了**X11转发**功能`X11Forwarding yes`。 如果X11转发功能已经打开,我们可以在Linux上安装[XSel](https://vergenet.net/~conrad/software/xsel/),XSel能通过X11转发来远程控制Linux的系统剪贴板。 安装完毕后,在本地使用`ssh -X ...`命令连接Linux机器(`-X`表示本次连接允许X11转发),在Linux终端里打开Vim即可使用`cY`、`cy`、`cP`和`cp`全部四个快捷键~ 4. 如果你正在**Linux系统的图形界面终端**里直接使用Vim——以Ubuntu的GNOME Terminal为例,只需要安装[wl-clipboard](https://github.com/bugaevc/wl-clipboard)包即可使用`cY`、`cy`、`cP`和`cp`全部四个快捷键~
### ```cy``` 复制指定内容到系统剪贴板 复制Vim的指定内容到系统剪贴板,用法类似于Vim的“复制”快捷键`y`: - 如果需要复制当前行和下两行的内容,只需要依次按下`cy2j`即可。 - 如果需要复制选定区域的内容,请先使用光标或者“Visual操作”划定要复制的范围,然后依次按下`cy`即可。 ### ```cP``` 粘贴系统剪贴板内容到下一行 获取系统剪贴板的内容,然后将其粘贴到Vim当前行的下一行。用法类似于`p`。 - 🟨在Windows上粘贴非ASCII字符时,可能会粘贴为乱码。Windows系统同时使用多套不同的字符编码,所以在粘贴时可能会引起乱码。 - 🟦**不建议使用此快捷键**,建议通过**终端模拟器自身提供的方式**来粘贴内容,如``(适用于Windows Terminal、Linux GNOME Terminal等)或``(适用于Git Bash、Cygwin、MSYS2等)。 ### ```cp``` 用系统剪贴板内容替换指定内容 获取系统剪贴板的内容,然后用其替换Vim文中的指定内容,用法类似于Vim的“删除”快捷键`d`。 - 可以理解为“先删除文中的指定内容,再粘贴系统剪贴板的内容到该位置”。 - 额外的注意要点和`cP`相同。**不建议使用此快捷键**。 --- ### ```l``` 空白字符开关 展示/隐藏空白字符,按多次可在展示/隐藏间来回切换。 --- ### ```p``` 粘贴模式开关 进入/退出```粘贴模式```。在```粘贴模式```下,自动缩进和一些插件功能会自动关闭。对于Vim来说,需要从**外部**(如博客等)粘贴内容进入编辑器时,如果内容包含复杂的换行和缩进,建议先切换成```粘贴模式```再粘贴,以避免错误激活自动缩进和插件功能。按多次可在进入/退出```粘贴模式```间来回切换。 --- ### ```t``` 制表符/空格切换 将``````的输入在空格和```制表符\t```之间切换,本配置文件默认配置``````的输入为四个空格。 --- ### ```f``` 代码局部格式化 美化代码的指定行/块。需要外部的软件支持。 ### ```F``` 代码全局格式化 美化整个代码文件。需要外部的软件支持。 ### ```s``` 删除多余空格 删除所有多余的空格。在行尾多余的空格会被红色高亮显示,该操作可以快速删除这些多余空格。 - 🟨在某些语言(如Markdown)的语法中,行尾空格是有实际语法意义的,这种情况下请不要轻易使用本快捷键。 --- ### ```a``` 检索光标处单词 检索当前光标处单词(应该会用下划线标出)在其它文件中出现的位置。
🟨展开详细说明 #### Vim完全版配置 基于```mileszs/ack.vim```插件。 - 🟨需要额外安装文件内容检索工具[rg](https://github.com/BurntSushi/ripgrep)或[ag](https://github.com/ggreer/the_silver_searcher),才能正常使用此功能。两者之中`rg`的效率略高于`ag`。 - 🟦如果使用`rg`作为检索工具,可以进一步提高`a`与`A`的检索速度。但`rg`的**文件搜索接口**和`mileszs/ack.vim`插件不兼容,我们将无法使用该插件提供的“文件检索”功能。 在Vim完全版配置中,我们使用`ctrlpvim/ctrlp`插件来完成“文件检索”,因此无需在意使用`rg`带来的副作用。 #### Vim精简版配置 基于```mileszs/ack.vim```插件。 - 🟨需要额外安装文件内容检索工具[ag](https://github.com/ggreer/the_silver_searcher),才能正常使用此功能。 `rg`的文件搜索接口和该插件不兼容(见Vim精简版配置的``功能),所以这里我们用效率稍逊一些的`ag`。 #### Neovim 基于```nvim-telescope/telescope.nvim```插件。 - 🟦额外安装文件内容检索工具[rg](https://github.com/BurntSushi/ripgrep),可提高本插件的检索效率。
### ```A``` 检索给定单词 检索给定单词在其它文件中出现的位置。按下此快捷键后,输入要查找的内容,会返回该内容在其它文件中出现的位置。相关该功能的依赖需求同上。 --- ### ```d``` LSP代码诊断开关 【Neovim】展示/隐藏LSP的代码诊断信息。 --- 更多关于快捷键的信息,请见配置文件最后的```hotkeys```部分。 ## 【Neovim】代码补全、内容跳转等 ### 🔍LSP 语言服务器协议 **语言服务器协议(Language Server Protocol,简称LSP)是由微软等机构,为了统一不同编辑器上各种语言的代码补全、内容跳转等功能,而提出的协议**。 在过去,每个不同的编辑器(或IDE)都需要编写一套自己的业务逻辑来支持各种编程语言的代码补全、内容跳转等功能——**假如市面上有```m```个编辑器(或IDE),每个都要支持```n```种编程语言,那就一共需要编写```m*n```套业务逻辑**,来实现不同编辑器上各种语言的代码补全等功能,非常麻烦。 ![No LSP vs LSP](https://code.visualstudio.com/assets/api/language-extensions/language-server-extension-guide/lsp-languages-editors.png) **LSP**简化了这个过程,协议约定—— 先有一套LSP通信协议规范,我们只需要为这```n```种编程语言设计各自的**语言服务器**(服务器运行着针对自己语言的代码补全等算法),再为市面上的```m```个编辑器(或IDE)设计它们的**客户端**(客户端向服务器发送代码补全的请求,然后把收到的结果展示给用户),最后让服务器和客户端按照LSP规定通信。 **同样的问题,LSP的解决方案只需要编写```m+n```套逻辑,统一而简洁。** ### 🆅 安装本地LSP服务器并配置Neovim LSP客户端 Neovim提供了内置的LSP客户端,配合系统里下载好的LSP语言服务器,我们便可以在Neovim中体验到流畅的代码补全、内容跳转等功能。下面以配置Python3语言的代码自动补全等功能为例。 1. 下载并安装Python3的LSP语言服务器。 通过查询[LSP语言服务器列表](https://github.com/williamboman/nvim-lsp-installer#available-lsps),我们采用[```pylsp```](https://github.com/python-lsp/python-lsp-server)程序包作为Python3的语言服务器。按照该项目的```README.md```说明,使用pip进行全套工具安装。安装完毕后,终端中```pylsp -V```命令应当可用。 ``` pip install "python-lsp-server[all]" ``` 2. 在Neovim的```init.vim```配置文件中,注册```pylsp```语言服务器。 在配置文件中找到```Language Server Protocol (LSP) server configs```一栏,在其中的```MY_LSP_SERVER_LIST```列表里向后添加一行新的语言服务器。保存后退出。 ``` -- register your installed LSP server here MY_LSP_SERVER_LIST = { 其它语言服务器, "pylsp", } ``` 3. 使用Neovim打开一个Python3代码文件,在Neovim中输入命令```:LspInfo```,此时应当显示Neovim的LSP客户端已经找到了本地的```pylsp```服务器。尝试输入代码,自动补全和函数签名等功能应当自动开始工作。 ### ⌨️相关快捷键 |按键|功能| |-|-| |```gD```|跳转到当前光标处词条(会用下划线标出)的**声明**位置。按``````跳转回去。| |```gd```|跳转到当前光标处词条的**定义**位置。按``````跳转回去。| |```K```|展示当前光标处词条的**详细信息**(如变量的类别信息/函数的签名/库的介绍等)。| |```gr```|展示当前光标处词条的所有**引用**。| |```gs```|展示当前光标处**函数实参**对应的**函数形参与函数签名**。| |```gi```|展示当前光标处词条的所有**实现**。| |```gt```|跳转到当前光标处**类别**的**定义**位置。按``````跳转回去。| ### 附:关于Vim的标签跳转 Vim虽然没有对LSP的内建支持,但仍原生支持代码的标签跳转功能。具体操作如下: 1. 先在项目代码的根目录下执行```ctags -R .```,递归生成整个项目的tags标签文件。 2. 接着**在项目根目录下**打开项目中任何一个代码文件,在要查询定义的词条处按下``````。 3. 如果tags文件中包含了该词条的信息,此时Vim将跳转到该词条的定义处(可以跨代码文件跳转)。 4. 按``````,可回到上一次跳转前的位置。如果之前进行了多次跳转,按多次``````可以一级一级地回去。 ## 【Neovim】代码/程序调试 ### 使用说明 按下快捷键呼出代码调试器后,调试器会根据当前打开文件的类型,自动选择合适的调试器。若无法自动选择,请按下数字键手动选择你想要的调试器。 若进入了gdb调试器,请先执行以下命令: 1. ```file <待调试的二进制文件路径>```,打开你要调试的二进制文件。 2. ```b <函数名或断点行号>```,给代码分配断点。 3. ```r```,开始调试程序,程序将在断点处停止。 执行上述命令后,界面将会自动分割为上下两个窗口,分别显示代码和gdb调试命令行。 ### ✅按键的描述方式 - ``````表示先按住```Alt```不松手,再按下小写的```p```。 ### ⌨️相关快捷键 在开启调试器后,处于```Normal```模式时,可以使用如下快捷键帮助调试。 |按键|功能| |-|-| |``````|开始运行或重新运行程序。| |``````|单步跳过。| |``````|单步进入。| |``````|执行到当前栈帧结束。| |``````|继续执行程序。| |``````|**光标位于代码窗口时**,执行程序到当前光标所在行前停止。| |``````|**光标位于代码窗口时**,给当前光标所在行打上/取消断点。| |``````|退出调试器。| |``````|**光标位于代码窗口时**,打印当前光标所在位置变量的值。|