Neovim Lua 配置从0到1

1. Windows 10 下 C/C++ 环境配置

1.1 MSYS2 简介

  • Cygwin
    MSYS2来源于CygunsCygwin,最初Cyguns的一位程师Steve Chamberlain发现Windows系统使用COFF作为目标文件 (即可执行文件),而GNU的工具链已经支持x86COFF的目标文件,并提供C语言库newlib,那么理论上只要将GCC重定向(根据对应目标平台重新编译), 作为一个cross compiler(交叉编译器),那么这个GCC编译器就可以生成Windows平台下的可执行文件。基于这一思路Steve Chamberlain设计出最初的Cygwin,作为Windows平台的GCC编译工具以替代其自身的MSVC来生成Windows平台的应用程序。为了使GCC的使用更加顺畅,Steve Chamberlain通过提供一套抽象层dll将部分Posix 调用转换成WindowsAPI调用,实现Bourne shell命令解释器(比如 bash)的集成。由于Cygwin能够提供Windows系统上的嵌入式工具链(以往的方案是使用DJGPP)并且还可以实现three-way cross-compile(第三方交叉编译),即可以在远程工作站上使用Cygwin来编译其他平台的代码,从而吸引大批工程师参与开发。后来,随着Linux系统的发展壮大,目前的Cygwin已经不但可以提供POSIX兼容,还实现了更多模拟层的依赖关系,使很多人希望将Linux应用移植到Windows平台的任务交给Cygwin
  • MinGW
    由于Cygwin的编译和调用需要依赖POSIXWindows API的中间层,这也导致Cygwin的体积日益庞大,开发者对不需要中间层的GNU工具链的需求也越来越强烈。为达到这一目的,Colin Peters在1998年创建了一个开源项目将其命名为mingw32(Minimalist GNU for W32),后来“32”被移除项目名称变为MinGW,他为MSVCRT.DLLMicrosoft Visual C Runtime)库提供了一组头文件和一个导入库, 以尽可能减少GNU工具链对Cygwin的依赖和使用。随着更加激进的Jan-Jaap van der Heijden的加入并着手开发了binutilsGCCmakeMinGW也彻底摆脱了对Cygwin的依赖,而Mumit Khan的主要贡献则是向程序包添加了更多Windows特定的功能。该项目在2000年迁移至SourceForge,以寻求社区的更多帮助并集中开发,后因项目组与SourceForge间存在分歧,该项目于2018年迁移至OSDN
  • MSYS
    MSYSMinimal SYStem)是为弥补MinGW缺少shell脚本运行环境的缺陷而诞生的,其中间层msys.dll 只提供基本的POSIX API,当使用MSYS来构建应用程序时,如果不使用一些特殊的POSIX API主要工作 都是由集成的MinGW通过直接调用Windows API来完成,因此MSYS在整个工作过程中只是作为一个辅助工具箱的形式存在。
  • MinGW-w64
    由于不明原因MinGW更新过于缓慢,其对64位程序的支持更是遥遥无期,加之新API的出现,导致后期急需MinGW对64位程序的支持。为应对这一新的挑战,OneVision Software就创建了一个MinGW 分支并把它命名为MinGW-w64,以支持生成Windows 64位程序。不过,在后续在向MinGW项目组提交代码时,项目组以OneVision使用非公开或专有信息为由将其拒绝,之后OneVision以保持MinGW-w64开源为条件而将代码捐赠给作为主要开发人员之一的Kai Tietz,随后Kai Tietz及其他主要开发者决定中断与MinGW的合作并不再提供官方的二进制构建。
  • MSYS2
    MinGW-w64情况类似,由于MSYS更新过于缓慢且太过老旧,MSYS2Minimal SYStem 2)基于更现代的CygwinMinGW-w64MSYS进行了独立重写。不同于Cygwin尝试为Windows带来一个与POSXI兼容的环境,MSYS2试图为构建本机Windows软件提供环境,不过由于其使用了GUN构建工具而与Unix深度耦合,又因为它实际上基于Cygwin所以也提供了与POSIX兼容的环境。另外,MSYS2提供基于互联网的运行AutoTools和其他构建系统所需的最小外壳,使移植Unix程序在Windows上本地运行成为可能,并且MSYS2不会在非必要时重复Cygwin的工作,也使得其提供的POSIX的仿真软件数量极少。

1.2 MSYS2 安装

  • MSYS2的下载地址为https://www.msys2.org
    在这里插入图片描述
  • 安装MSYS2
    在这里插入图片描述
  • 本文将MSYS2装在D盘,默认会装在C
    在这里插入图片描述
  • 安装完成后,MSYS2会自动打开MSYS2 UCR64环境
    在这里插入图片描述
  • MSYS2会安装多个环境,常用的主要有以下几个
    在这里插入图片描述

1.3 将 MSYS2 的主要环境集成到 Windows Terminal

  • 这一步不是必须的,只是自带的Terminal并不美观且不方便管理
  • 修改Windows Terminal的配置文件
    在这里插入图片描述
  • MSYS2 UCRT64 MSYS2 MSYS MSYS2 MINGW64 MSYS2 MINGW32 MSYS2 CLANG64 MSYS2 CLANG32的相应配置忝加到Windows Terminal的配置文件当中
            {
                "commandline": "D:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
                "icon": "D:/msys64/ucrt64.ico",
                "name": "UCRT64 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:/msys64/msys2_shell.cmd -defterm -here -no-start -msys -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{71160544-14d8-4194-af25-d05feeac7233}",
                "icon": "D:/msys64/msys2.ico",
                "name": "MSYS / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:\\msys64\\msys2_shell.cmd -defterm -here -no-start -mingw64 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{4e0ab8a5-5f6b-49db-aab8-96814453d0e7}",
                "icon": "D:/msys64/mingw64.ico",
                "name": "MINGW64 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:\\msys64\\msys2_shell.cmd -defterm -here -no-start -mingw32 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{32bbe7b5-eae3-4092-b208-14cc3848f8cb}",
                "icon": "D:/msys64/mingw32.ico",
                "name": "MINGW32 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:\\msys64\\msys2_shell.cmd -defterm -here -no-start -clangarm64 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{e0c72876-abfe-494f-8fec-bba6a95087eb}",
                "icon": "D:/msys64/clangarm64.ico",
                "name": "CLANGARM64 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:\\msys64\\msys2_shell.cmd -defterm -here -no-start -clang64 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{53c79562-9bac-46e3-b847-0abeae40908d}",
                "icon": "D:/msys64/clang64.ico",
                "name": "CLANG64 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            },
            {
                "commandline": "D:\\msys64\\msys2_shell.cmd -defterm -here -no-start -clang64 -shell zsh",
                "font": 
                {
                    "face": "JetBrainsMonoMedium Nerd Font Mono",
                    "size": 11.0
                },
                "guid": "{d1d362aa-ea7c-4cc9-90ac-14ae810089e2}",
                "hidden": false,
                "icon": "D:\\msys64\\clang32.ico",
                "name": "CLANG32 / MSYS2",
                "startingDirectory": "D:/msys64/home/%USERNAME%"
            }

在这里插入图片描述

  • 效果
    在这里插入图片描述
  • 关于msys2_shell.cmd参数的设定

通过对msys2_shell.cmd参数的设定可以控制MSYS2启不同类型的shell环境及相关的默认设置

-deftermMSYS2启动后使用系统默认终端
-hereMSYS2环境打开后进入当前命令执行的环境, 如果不指定该参数, 则默认会进入HOME目录
-where: 可以指定MSYS2打开后要进入的文件夹
-use-full-path(-full-path):将整个WindowsPATH添加到MSYS2环境
-no-start: 直接在当前终端进入MSYS2 环境,不再启动MSYS2自带的终端程序
-shell:指定MSYS2环境的默认shell解释器类型

  • 关于HOME目录的设定

有时需要指定MSYS2 home目录的位置, 但是msys2_shell.cmd 并没有这一选项
要设定HOME目录,目前有两方案一是修改msys2_shell.cmd文件,二是msys2_shell.cmd-here参数与Windows TerminalstartingDirectory参数两者配合使

  • 方法一
D:\\msys64\\msys2_shell.cmd -no-start -use-full-path -here -ucrt64 set "HOME=%USERPROFILE%"
  • 方法二
"commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64 -shell zsh"
"startingDirectory": "D:/msys64/home/%USERNAME%"
  • 集成Oh My Zsh

本文仅仅将Oh My Zsh进行安装,并未进行优化

pacman -Su zsh git
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

1.4 MSYS2 运行环境与 pacman 包管理

  • MSYS2运行环境

MSYS2实际上是由7个独立的子环境组成,每个子环境会有一个单独的文件夹,和一个专门的命令行界面入口,不同环境的差别主要是其基于的基础库存在差异。一般来说,直接使用UCRT64就足矣,推荐打开UCRT64 窗口,选择ucrt64前缀的软件进行安装
MSYS2不同环境的差别主要体现在以下几个方面:

  • 路径前缀:因为msys2是多环境混合的,所以就可能同时存在多个gcc这样的程序,因此使用路径前缀区分
  • Toolchain:就是一套默认的编译链,像arch上的base-develubuntubuild-essential
  • 架构:64和32位
  • C库:C语言的标准库,环境决定
  • C++库:C++标准库,编译器决定

不同环境间的具体差异如下:

  • msys2:这是msys2的基础环境,包含各种linux命令行工具(例如pacman等),其它子环境都继承于它。但在这个子环境里编译的程序依赖于MSYS2的动态库,编译出的工具是供应msys本身或者开发者本身使用,比如vim编辑器往往是自己编译自己用,只提供 msys版就足够,不建议用它干任何除了pacman包管理以外的任何事。
  • mingw64 & mingw32:在全32位的时代,mingw32基于msvcrtMicrosoft Visual C++ Runtime)比cygwin(需要一堆支持库)更好用,可以直接在Windows下运行。后来64位成为了主流,基于mingw32做的mingw64,包更新太慢,而且w32w64的更新器也非常难用,于是msys2出来带着pacman来管理各个包。
  • ucrt64:Visual Studio的新宠,全名是Universal C Runtime,用来替代前面mingw64&w32里的msvcrtucrt不支持加载msvcrt的产物,因此老版本Windows(<10)不能直接兼容基于msvcrt的软件。这并不是无理由的激进,要知道msvcrt在当前开发环境(原生)不支持C99UTF8
  • clang64 & clang64:使用LLVM工具链而非GCC工具链,所有配套环境都是基于LLVM的,其实mingw64/w32里也有它的toolchain不过不是默认,这里它被拆出来作为默认且基于ucrt了。
  • clangarm64:用于Android程序编译
Name Prefix Toolchain Architecture C Library C++ Library
MSYS /usr gcc x86_64 cygwin libstdc++
UCRT64 /ucrt64 gcc x86_64 ucrt libstdc++
CLANG64 /clang64 llvm x86_64 ucrt libc++
CLANGARM64 /clangarm64 llvm aarch64 ucrt libc++
CLANG32 /clang32 llvm i686 ucrt libc++
MINGW64 /mingw64 gcc x86_64 msvcrt libstdc++
MINGW32 /mingw32 gcc i686 msvcrt libstdc++

MSYS2使用ArchLinuxpacman包管理工具来进行软件包的管理,pacman管理的软件包的来源则因MSYS2环境不同而有所差异,MSYS2提供了7个环境,相应的便有软件包也有7个不同的来源
管理不同的软件源的配置文件的位置为:/etc/pacman.d/

在这里插入图片描述

  • pacman软件包与MSYS2环境间的关系

由于pacman同时理管多个不同环境的软件源,所以在安装、卸载软件时需要提供完整的软件包名,以将软件安装到对应的环境或者从对应的环境中删除软件;如果软件包名不完整,则软件将默认安装到MSYS环境
gcc为例,主要环境下的软件名为
MSYS: gcc
mingw64: mingw-w64-x86_64-gcc
mingw32: mingw-w64-i686-gcc
ucrt64: mingw-w64-ucrt-x86_64-gcc

在这里插入图片描述

  • pacman常用命令

pacman -Sy: 从服务器下载新的软件包数据库(实际上就是下载远程仓库最新软件列表到本地)
pacman -Syu: 升级系统及所有已经安装的软件。
pacman -S <package> : 安装软件。也可以同时安装多个包,只需以空格分隔包名即可。
pacman -Rs <package> : 删除软件,同时删除本机上只有该软件依赖的软件。
pacman -Ru <package> : 删除软件,同时删除不再被任何软件所需要的依赖。
pacman -Ssq <key words> : 在仓库中搜索含关键字的软件包,并用简洁方式显示。
pacman -Qs <key words> : 搜索已安装的软件包。
pacman -Qi <package> : 查看某个软件包信息,显示软件简介,构架,依赖,大小等详细信息。
pacman -Sg: 列出软件仓库上所有的软件包组。
pacman -Sg 软件包组: 查看某软件包组所包含的所有软件包。
pacman -Sc:清理未安装的包文件,包文件位于/var/cache/pacman/pkg/目录。
pacman -Scc:清理所有的缓存文件

1.5 搭建C/C++ 环境的经典方式

所谓经典方式主要指两点

  • 以该方式安装的C/C++环境所使用的库是Windows上经典的msvcrt
  • 这种安装方式比较繁索和机械
  • 打开MSYS2 UTRC64
    在这里插入图片描述
  • 更新包数据库和基础包
pacman -Syu

在这里插入图片描述

  • 中途间会中断,重新打开MSYS2 UCRT64后继续之前的更新
pacman -Su
pacman -Sy
  • 安装GCCG++

32位系统安装mingw-w64-i686-gcc
64位系统安装mingw-w64-x86_64-gcc

pacman -S mingw-w64-i686-gcc
pacman -S mingw-w64-x86_64-gcc
  • 安装Debugger

32位系统安装mingw-w64-i686-gdb
64位系统安装mingw-w64-x86_64-gdb

pacman -S mingw-w64-i686-gdb
pacman -S mingw-w64-x86_64-gdb
  • 将编译器加入到系统的环境变量

注意区分64/32位的文件路径

在这里插入图片描述

找到对应的bin文件夹

在这里插入图片描述

复制文件夹路径

  • 32位:D:\msys64\mingw32\bin
  • 64位:D:\msys64\mingw64\bin

在这里插入图片描述

添加环境变量

在这里插入图片描述
在这里插入图片描述

  • 测试GCC是否安装成功
gcc --version

在这里插入图片描述

1.6 利用ToolChain搭建C/C++ 环境

本文中此方法主要用在UCRT64环境的C/C++环境搭建中,其它环境以此类推
该命令会打包安装gccgdbmake等编译工具,并将其安装在D:\msys64\ucrt64\bin目录下
此为pacman的虚拟包安装方式,主要用于安装软件集合,其它操作如删除等需要做用真实的软件包名
MINGW64环境下软件包名为:mingw-w64-x86_64-toolchain

pacman -Syu
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

在这里插入图片描述

  • UCRT64bin文件夹添加到环境变量

UCRT64bin文件夹路径为:D:\msys64\ucrt64\bin

在这里插入图片描述

  • 测试GCC环境
gcc --version
g++ --version
gdb --version

在这里插入图片描述

2. Neovim 的安装与配置

2.1 Neovim 安装

  • 使用winget安装Neovim
winget search neovim
winget install Neovim.Neovim

在这里插入图片描述

  • 安装Packer用于插件管理
git clone https://github.com/wbthomason/packer.nvim "$env:LOCALAPPDATA\nvim-data\site\pack\packer\start\packer.nvim"

在这里插入图片描述

2.2 配置 Neovim

  • 目录结构

pluginpacker_compiled.luaPacker初始化后自动生成的

nvim
├── init.lua
├── lua
│   ├── configs
│   │   ├── autopairs.lua
│   │   ├── cmp.lua
│   │   ├── gitsigns.lua
│   │   ├── kanagawa.lua
│   │   ├── lsp.lua
│   │   ├── lualine.lua
│   │   ├── mason-lsp.lua
│   │   ├── null-ls.lua
│   │   ├── toggleterm.lua
│   │   ├── transparent.lua
│   │   └── treesitter.lua
│   ├── maps.lua
│   ├── plugins.lua
│   └── settings.lua
└── plugin
    └── packer_compiled.lua

  • 环境要求
  • NerdFonts
  • Neovim > 0.8.0
  • NodeJS with npm
  • C/C++环境
  • Git
  • 创建init.lua文件
mkdir nvim
cd nvim
vim init.lua
  • init.lua
require("settings")
require("plugins")
require("maps")

local themeStatus, kanagawa = pcall(require, "kanagawa")

if themeStatus then
  vim.cmd("colorscheme kanagawa")
else
  return
end

  • 添加编辑器设定
mkdir lua
cd lua
vim settings.lua
  • settings.lua
local global = vim.g
local o = vim.o

vim.scriptencoding = "utf-8"

-- Map <leader> = the space key

global.mapleader = " "
global.maplocalleader = " "

-- Editor option

o.number = true
o.relativenumber = true
o.clipboard = "unnamedplus"
o.syntax = "on"
o.autoindent = true
o.cursorline = true
o.expandtab = true
o.shiftwidth = 2
o.tabstop = 2
o.encoding = "utf-8"
o.ruler = true
o.mouse = "a"
o.title = true
o.hidden = true
o.ttimeoutlen = 0
o.wildmenu = true
o.showcmd = true
o.showmatch = true
o.inccommand = "split"
o.splitbelow = true
o.splitright = true
o.termguicolors = true
  • 添加插件设定
cd lua
vim plugins.lua
  • plugins.lua
-- Automatically run: PackerComplie
vim.api.nvim_create_autocmd("BufWritePost", {
	group = vim.api.nvim_create_augroup("PACKER", { clear = true }),
	pattern = "plugins.lua",
	command = "source <afile> | PackerCompile",
})

return require("packer").startup(function(use)
	-- Packer
	use("wbthomason/packer.nvim")

	-- Common utilities
	use("nvim-lua/plenary.nvim")

	-- Icons
	use("nvim-tree/nvim-web-devicons")

	-- Colorschema
	use("rebelot/kanagawa.nvim")

	-- Statusline
	use({
		"nvim-lualine/lualine.nvim",
		event = "BufEnter",
		config = function()
			require("configs.lualine")
		end,
		requires = { "nvim-web-devicons" },
	})

	-- Treesitter
	use({
		"nvim-treesitter/nvim-treesitter",
		run = function()
			require("configs.treesitter")
		end,
	})

	use({ "windwp/nvim-ts-autotag", after = "nvim-treesitter" })

	-- Telescope
	use({
		"nvim-telescope/telescope.nvim",
		tag = "0.1.1",
		requires = { { "nvim-lua/plenary.nvim" } },
	})

	--LSP
	use({
		"neovim/nvim-lspconfig",
		config = function()
			require("configs.lsp")
		end,
	})

	use("onsails/lspkind-nvim")
	use({
		"L3MON4D3/LuaSnip",
		tag = "v<CurrentMajor>.*",
	})

	-- cmp: Autocomplete
	use({
		"hrsh7th/nvim-cmp",
		event = "InsertEnter",
		config = function()
			require("configs.cmp")
		end,
	})

	use("hrsh7th/cmp-nvim-lsp")

	use({ "hrsh7th/cmp-path", after = "nvim-cmp" })

	use({ "hrsh7th/cmp-buffer", after = "nvim-cmp" })

	-- LSP diagnosticsm, code actions, and more via lua
	use({
		"jose-elias-alvarez/null-ls.nvim",
		config = function()
			require("configs.null-ls")
		end,
		requires = { "nvim-lua/plenary.nvim" },
	})

	-- Mason: Portable package manager
	use({
		"williamboman/mason.nvim",
		config = function()
			require("mason").setup()
		end,
	})

	use({
		"williamboman/mason-lspconfig.nvim",
		config = function()
			require("configs.mason-lsp")
		end,
		after = "mason.nvim",
	})

	-- File manager
	use({
		"nvim-neo-tree/neo-tree.nvim",
		branch = "v2.x",
		requires = {
			"nvim-lua/plenary.nvim",
			"nvim-tree/nvim-web-devicons",
			"MunifTanjim/nui.nvim",
		},
	})

	-- Show colors
	use({
		"norcalli/nvim-colorizer.lua",
		config = function()
			require("colorizer").setup({ "*" })
		end,
	})

	-- Terminal
	use({
		"akinsho/toggleterm.nvim",
		tag = "*",
		config = function()
			require("configs.toggleterm")
		end,
	})

	-- Git
	use({
		"lewis6991/gitsigns.nvim",
		config = function()
			require("configs.gitsigns")
		end,
	})

	-- Markdown Preview
	use({
		"iamcco/markdown-preview.nvim",
		run = function()
			vim.fn["mkdp#utl#install"]()
		end,
	})

	-- autopairs
	use({
		"windwp/nvim-autopairs",
		config = function()
			require("configs.autopairs")
		end,
	})

	-- Backgroud Transparent
	use({
		"xiyaowong/nvim-transparent",
		config = function()
			require("configs.transparent")
		end,
	})
end)

  • 添加插件的参数设定
mkdir configs
cd configs
vim autopairs.lua
vim cmp.lua
vim gitsigns.lua
vim kanagawa.lua
vim lsp.lua
vim lualine.lua
vim mason-lsp.lua
vim null-ls.lua
vim toggleterm.lua
vim treesitter.lua
  • autopairs.lua
local status, autopairs = pcall(require, "nvim-autopairs")
if not status then
  return
end

autopairs.setup({
  diable_filetype = { "TelescopePrompt", "vim" },
})

  • cmp.lua
local status, cmp = pcall(require, "cmp")
if not status then
	return
end

local lspkind = require("lspkind")

cmp.setup({
	snippet = {
		expand = function(args)
			require("luasnip").lsp_expand(args.body)
		end,
	},
	mapping = cmp.mapping.preset.insert({
		["<C-d>"] = cmp.mapping.scroll_docs(-4),
		["<C-f>"] = cmp.mapping.scroll_docs(4),
		["<C-Space>"] = cmp.mapping.complete(),
		["<C-e>"] = cmp.mapping.close(),
		["<CR>"] = cmp.mapping.confirm({
			behavior = cmp.ConfirmBehavior.Replace,
			select = true,
		}),
	}),
	sources = cmp.config.sources({
		{ name = "nvim_lsp" },
		{ name = "buffer" },
	}),
})

vim.cmd([[
  set completeopt=menuone,noinsert,noselect
  highlight! default link CmpItemKind CmpItemMenuDefault
]])

  • gitsigns.lua
local status, gitsigns = pcall(require, "gitsigns")

if not status then
	return
end

gitsigns.setup({
	signs = {
		add = { text = "│" },
		change = { text = "│" },
		delete = { text = "_" },
		topdelete = { text = "‾" },
		changedelete = { text = "~" },
		untracked = { text = "┆" },
	},
	signcolumn = true, -- Toggle with `:Gitsigns toggle_signs`
	numhl = false, -- Toggle with `:Gitsigns toggle_numhl`
	linehl = false, -- Toggle with `:Gitsigns toggle_linehl`
	word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff`
	watch_gitdir = {
		interval = 1000,
		follow_files = true,
	},
	attach_to_untracked = true,
	current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame`
	current_line_blame_opts = {
		virt_text = true,
		virt_text_pos = "eol", -- 'eol' | 'overlay' | 'right_align'
		delay = 1000,
		ignore_whitespace = false,
	},
	current_line_blame_formatter = "<author>, <author_time:%Y-%m-%d> - <summary>",
	sign_priority = 6,
	update_debounce = 100,
	status_formatter = nil, -- Use default
	max_file_length = 40000, -- Disable if file is longer than this (in lines)
	preview_config = {
		-- Options passed to nvim_open_win
		border = "single",
		style = "minimal",
		relative = "cursor",
		row = 0,
		col = 1,
	},
	yadm = {
		enable = false,
	},
})
  • kanagawa.lua
local status, kanagawa = pcall(require, "kanagawa")

if not status then
	return
end

kanagawa.setup({
	undercurl = true, -- enable undercurls
	commentStyle = { italic = true },
	functionStyle = {},
	keywordStyle = { italic = true },
	statementStyle = { bold = true },
	typeStyle = {},
	variablebuiltinStyle = { italic = true },
	specialReturn = true, -- special highlight for the return keyword
	specialException = true, -- special highlight for exception handling keywords
	transparent = false, -- do not set background color
	dimInactive = false, -- dim inactive window `:h hl-NormalNC`
	globalStatus = false, -- adjust window separators highlight for laststatus=3
	terminalColors = true, -- define vim.g.terminal_color_{0,17}
	colors = {},
	overrides = {},
	theme = "default", -- Load "default" theme or the experimental "light" theme
})

  • lsp.lua
local status, nvim_lsp = pcall(require, "lspconfig")
if not status then
	return
end

local protocol = require("vim.lsp.protocol")

local on_attach = function(client, bufnr)
	-- format on save
	if client.server_capabilities.documentFormattingProvider then
		vim.api.nvim_create_autocmd("BufWritePre", {
			group = vim.api.nvim_create_augroup("Format", { clear = true }),
			buffer = bufnr,
			callback = function()
				vim.lsp.buf.formatting_seq_sync()
			end,
		})
	end
end

local capabilities = require("cmp_nvim_lsp").default_capabilities()

-- TypeScript
nvim_lsp.tsserver.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- CSS
nvim_lsp.cssls.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- Tailwind
nvim_lsp.tailwindcss.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- HTML
nvim_lsp.html.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- JSON
nvim_lsp.jsonls.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- Eslint
nvim_lsp.eslint.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})

-- Python
nvim_lsp.pyright.setup({
	on_attach = on_attach,
	capabilities = capabilities,
})
  • vim lualine.lua
local status, lualine = pcall(require, "lualine")
if not status then
	return
end

lualine.setup({
	options = {
		icons_enabled = true,
		theme = "powerline",
		component_separators = { left = "", right = "" },
		section_separators = { left = "", right = "" },
		disabled_filetypes = {
			statusline = {},
			winbar = {},
		},
		ignore_focus = {},
		always_divide_middle = true,
		globalstatus = false,
		refresh = {
			statusline = 1000,
			tabline = 1000,
			winbar = 1000,
		},
	},
	sections = {
		lualine_a = { "mode" },
		lualine_b = { "branch", "diff", "diagnostics" },
		lualine_c = { "filename" },
		lualine_x = { "encoding", "fileformat", "filetype" },
		lualine_y = { "progress" },
		lualine_z = { "location" },
	},
	inactive_sections = {
		lualine_a = {},
		lualine_b = {},
		lualine_c = { "filename" },
		lualine_x = { "location" },
		lualine_y = {},
		lualine_z = {},
	},
	tabline = {},
	winbar = {},
	inactive_winbar = {},
	extensions = {},
})
  • mason-lsp.lua
local status, masonlsp = pcall(require, "mason-lspconfig")

if not status then
  return
end

masonlsp.setup({
  automatic_installation = true,
  ensure_installed = {
    "cssls",
    "eslint",
    "html",
    "jsonls",
    "tsserver",
    "pyright",
    "tailwindcss",
  },
})
  • null-ls.lua
local status, nls = pcall(require, "null-ls")

if not status then
	return
end

local augroup = vim.api.nvim_create_augroup("LspFormatting", {})

local fmt = nls.builtins.formatting
local dgn = nls.builtins.diagnostics
local cda = nls.builtins.code_actions

nls.setup({
	sources = {

		-- Formatting
		fmt.prettierd,
		fmt.eslint_d,
		fmt.prettier.with({
			filetypes = { "html", "json", "yaml", "markdown", "javascript", "typescript" },
		}),
		fmt.stylua,
		fmt.rustfmt,

		-- Diagnostics
		dgn.eslint_d,
		dgn.shellcheck,
		dgn.pylint.with({
			method = nls.methods.DIAGNOSTICS_ON_SAVE,
		}),

		-- Code Actions
		cda.eslint_d,
		cda.shellcheck,
	},
	on_attach = function(client, bufnr)
		if client.supports_method("textDocument/formatting") then
			vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
			vim.api.nvim_create_autocmd("BufWritePre", {
				group = augroup,
				buffer = bufnr,
				callback = function()
					vim.lsp.buf.format({ bufnr = bufnr })
				end,
			})
		end
	end,
})

  • toggleterm.lua
local status, toggleterm = pcall(require, "toggleterm")

if not status then
	return
end

toggleterm.setup({
	size = 10,
	open_mapping = [[<F7>]],
	shading_factor = 2,
	direction = "float",
	float_opts = {
		border = "curved",
		highlights = {
			border = "Normal",
			background = "Normal",
		},
	},
})
  • treesitter.lua
local status, ts = pcall(require, "nvim-treesitter.configs")
if not status then
	return
end

ts.setup({
	highlight = {
		enable = true,
		additional_vim_regex_highlighting = false,
	},
	context_commentstring = {
		enable = true,
		enable_autocmd = false,
	},
	ensure_installed = {
		"markdown",
		"tsx",
		"typescript",
		"javascript",
		"toml",
		"c_sharp",
		"json",
		"yaml",
		"rust",
		"css",
		"html",
		"lua",
	},
	rainbow = {
		enable = true,
		disable = { "html" },
		extended_mode = false,
		max_file_lines = nil,
	},
	autotag = { enable = true },
	incremental_selection = { enable = true },
	indent = { enable = true },
})

local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
parser_config.tsx.filetype_to_parsername = { "javascript", "typescript.tsx" }
  • 安装插件

进入Neovim后使用命令:PackerSync

在这里插入图片描述

  • 设置快捷键
cd lua
vim maps.lua
  • maps.lua
local function map(mode, lhs, rhs)
  vim.keymap.set(mode, lhs, rhs, { silent = true })
end

local status, telescope = pcall(require, "telescope.builtin")
if status then
  -- telescope
  map("n", "<leader>ff", telescope.find_files)
  map("n", "<leader>fg", telescope.live_grep)
  map("n", "<leader>fb", telescope.buffers)
  map("n", "<leader>fh", telescope.help_tags)
  map("n", "<leader>fs", telescope.git_status)
  map("n", "<leader>fc", telescope.git_commits)
else
  print("Telexcope not found")
end

-- Save
map("n", "<leader>w", "<CMD>update<CR>")

-- Quit
map("n", "<leader>q", "<CMD>q<CR>")

-- Exit insert mode
map("i", "jk", "<ESC>")

-- Windows
map("n", "<leader>ñ", "<CMD>vsplit<CR>")
map("n", "<leader>n", "<CMD>split<CR>")

-- Neotree
map("n", "<leader>e", "<CMD>Neotree toggle<CR>")
map("n", "<leader>o", "<CMD>Neotree focus<CR>")

-- buffer
map("n", "<TAB>", "<CMD>bnext<CR>")
map("n", "<S-TAB>", "<CMD>bprevious<CR>")

-- Ternimal
map("n", "<leader>th", "<CMD>ToggleTerm size=10 direction=horizontal<CR>")
map("n", "<leader>tv", "<CMD>ToggleTerm size=80 direction=vertical<CR>")

-- Markdown Preview
map("n", "<leader>m", "<CMD>MarkdownPreview<CR>")
map("n", "<leader>mn", "<CMD>MarkdownPreviewStop<CR>")

-- Windows Navigation
map("n", "<C-h>", "<C-w>h")
map("n", "<C-l>", "<C-w>l")
map("n", "<C-k>", "<C-w>k")
map("n", "<C-j>", "<C-w>j")

-- Resize Windows
map("n", "<C-Left>", "<C-w><")
map("n", "<C-Right>", "<C-w>>")
map("n", "<C-Up>", "<C-w>+")
map("n", "<C-Down>", "<C-w>-")

3. 可能会出现的疑难杂症

3.1 command stylua is not executable (make sure it’s installed and on your $PATH)

进入Neovim,使用命令:MasonInstall stylua

参考文献

  1. Windows 10 系统下 Neovim 安装与配置
  2. 我的现代化Neovim配置
  3. learn-neovim-lua
  4. MSYS2 介绍与使用
  5. How to Install C and C++ Compilers on Windows
  6. Terminals-MSYS2
  7. 给萌新的C/C++环境搭建攻略(VSCode和MSYS2)
  8. Windows terminal添加msys2
  9. MSYS2 + Windows Terminal + Oh My Zsh
  10. pacman命令详解
  11. 使用msys2打造优雅的开发环境
  12. MSYS2开发环境搭建
  13. New Env in msys2: msys2引入的新环境
  14. MSYS2开发环境搭建
  15. GCC and MinGW-w64 for Windows
  16. Windows 安装 msys2 gcc c++ 开发环境
  17. 在windows上通过msys2/mingw来安装gcc / clang
  18. MSYS2安装gcc、make环境
  19. Windows Terminal + MSYS2 配置
  20. 使用Neovim打造酷炫IDE – 快捷键配置
  21. neovim一些插件的快捷键备忘录
  22. eslint_d: command eslint_d is not executable (make sure it’s installed and on your $PATH)
  23. 让neovim更舒适的写代码
  24. Windows Terminal + MSYS2 配置
  25. slydragonn/dotfiles
  26. No C compiler found
  27. Neovim学习一:插件管理和配置
  28. 插件管理器之王packer
  29. VIM学习笔记 前缀键(leader)
  30. 现代Neovim配置-(3)-插件管理
  31. Neovim 插件管理与配置
  32. 2022 年的 neovim 配置方案
  33. nanofrog/learn-neovim-lua
  34. Neovim 的快捷键配置
  35. nvim 打造一个适合自己的开发环境
  36. Neovim 配置实战:从0到1打造自己的IDE
  37. 使用lua配置neovim所需的一切
  38. Documentation: ~/.local/share/nvim/site/pack or ~/.config/nvim/pack ?
  39. vim-plug插件安装及使用
  40. vim配置汇总
  41. NeoVim飞升过程
  42. nvim 的配置文件
  43. 让你的 neovim 像 IDE 一样强大
  44. Neovim 基础配置

猜你喜欢

转载自blog.csdn.net/Y1575071736/article/details/130086092
今日推荐