赞
踩
Cygwin
MSYS2
来源于Cyguns
的Cygwin
,最初Cyguns
的一位程师Steve Chamberlain
发现Windows
系统使用COFF
作为目标文件 (即可执行文件),而GNU
的工具链已经支持x86
和COFF
的目标文件,并提供C
语言库newlib
,那么理论上只要将GCC
重定向(根据对应目标平台重新编译), 作为一个cross compiler
(交叉编译器),那么这个GCC
编译器就可以生成Windows
平台下的可执行文件。基于这一思路Steve Chamberlain
设计出最初的Cygwin
,作为Windows
平台的GCC
编译工具以替代其自身的MSVC
来生成Windows
平台的应用程序。为了使GCC
的使用更加顺畅,Steve Chamberlain
通过提供一套抽象层dll
将部分Posix
调用转换成Windows
的API
调用,实现Bourne shell
命令解释器(比如 bash
)的集成。由于Cygwin
能够提供Windows
系统上的嵌入式工具链(以往的方案是使用DJGPP
)并且还可以实现three-way cross-compile
(第三方交叉编译),即可以在远程工作站上使用Cygwin
来编译其他平台的代码,从而吸引大批工程师参与开发。后来,随着Linux
系统的发展壮大,目前的Cygwin
已经不但可以提供POSIX
兼容,还实现了更多模拟层的依赖关系,使很多人希望将Linux
应用移植到Windows
平台的任务交给Cygwin
。MinGW
Cygwin
的编译和调用需要依赖POSIX
到Windows API
的中间层,这也导致Cygwin
的体积日益庞大,开发者对不需要中间层的GNU
工具链的需求也越来越强烈。为达到这一目的,Colin Peters
在1998年创建了一个开源项目将其命名为mingw32
(Minimalist GNU for W32),后来“32”被移除项目名称变为MinGW
,他为MSVCRT.DLL
(Microsoft Visual C Runtime
)库提供了一组头文件和一个导入库, 以尽可能减少GNU
工具链对Cygwin
的依赖和使用。随着更加激进的Jan-Jaap van der Heijden
的加入并着手开发了binutils
、GCC
和make
,MinGW
也彻底摆脱了对Cygwin
的依赖,而Mumit Khan
的主要贡献则是向程序包添加了更多Windows
特定的功能。该项目在2000年迁移至SourceForge
,以寻求社区的更多帮助并集中开发,后因项目组与SourceForge
间存在分歧,该项目于2018年迁移至OSDN
。MSYS
MSYS
(Minimal 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
更新过于缓慢且太过老旧,MSYS2
(Minimal SYStem 2
)基于更现代的Cygwin
和MinGW-w64
对MSYS
进行了独立重写。不同于Cygwin
尝试为Windows
带来一个与POSXI
兼容的环境,MSYS2
试图为构建本机Windows
软件提供环境,不过由于其使用了GUN
构建工具而与Unix
深度耦合,又因为它实际上基于Cygwin
所以也提供了与POSIX
兼容的环境。另外,MSYS2
提供基于互联网的运行AutoTools
和其他构建系统所需的最小外壳,使移植Unix
程序在Windows
上本地运行成为可能,并且MSYS2
不会在非必要时重复Cygwin
的工作,也使得其提供的POSIX
的仿真软件数量极少。MSYS2
的下载地址为https://www.msys2.orgMSYS2
MSYS2
装在D
盘,默认会装在C
盘MSYS2
会自动打开MSYS2 UCR64
环境MSYS2
会安装多个环境,常用的主要有以下几个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
环境及相关的默认设置
-defterm
:MSYS2
启动后使用系统默认终端
-here
:MSYS2
环境打开后进入当前命令执行的环境, 如果不指定该参数, 则默认会进入HOME
目录
-where
: 可以指定MSYS2
打开后要进入的文件夹
-use-full-path(-full-path)
:将整个Windows
的PATH
添加到MSYS2
环境
-no-start
: 直接在当前终端进入MSYS2
环境,不再启动MSYS2
自带的终端程序
-shell
:指定MSYS2
环境的默认shell
解释器类型
HOME
目录的设定有时需要指定
MSYS2
home
目录的位置, 但是msys2_shell.cmd
并没有这一选项
要设定HOME
目录,目前有两方案一是修改msys2_shell.cmd
文件,二是msys2_shell.cmd
的-here
参数与Windows Terminal
的startingDirectory
参数两者配合使
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)"
MSYS2
运行环境
MSYS2
实际上是由7个独立的子环境组成,每个子环境会有一个单独的文件夹,和一个专门的命令行界面入口,不同环境的差别主要是其基于的基础库存在差异。一般来说,直接使用UCRT64
就足矣,推荐打开UCRT64
窗口,选择ucrt64
前缀的软件进行安装
MSYS2
不同环境的差别主要体现在以下几个方面:
- 路径前缀:因为
msys2
是多环境混合的,所以就可能同时存在多个gcc
这样的程序,因此使用路径前缀区分Toolchain
:就是一套默认的编译链,像arch
上的base-devel
和ubuntu
上build-essential
- 架构:64和32位
C
库:C
语言的标准库,环境决定C++
库:C++
标准库,编译器决定不同环境间的具体差异如下:
msys2
:这是msys2
的基础环境,包含各种linux
命令行工具(例如pacman
等),其它子环境都继承于它。但在这个子环境里编译的程序依赖于MSYS2
的动态库,编译出的工具是供应msys
本身或者开发者本身使用,比如vim
编辑器往往是自己编译自己用,只提供msys
版就足够,不建议用它干任何除了pacman
包管理以外的任何事。mingw64 & mingw32
:在全32位的时代,mingw32
基于msvcrt
(Microsoft Visual C++ Runtime
)比cygwin
(需要一堆支持库)更好用,可以直接在Windows
下运行。后来64位成为了主流,基于mingw32做的mingw64
,包更新太慢,而且w32
和w64
的更新器也非常难用,于是msys2
出来带着pacman
来管理各个包。- ucrt64:
Visual Studio
的新宠,全名是Universal C Runtime
,用来替代前面mingw64&w32
里的msvcrt
。ucrt
不支持加载msvcrt
的产物,因此老版本Windows(<10)
不能直接兼容基于msvcrt
的软件。这并不是无理由的激进,要知道msvcrt
在当前开发环境(原生)不支持C99
和UTF8
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
使用ArchLinux
的pacman
包管理工具来进行软件包的管理,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
:清理所有的缓存文件
所谓经典方式主要指两点
- 以该方式安装的
C/C++
环境所使用的库是Windows
上经典的msvcrt
库- 这种安装方式比较繁索和机械
MSYS2 UTRC64
pacman -Syu
MSYS2 UCRT64
后继续之前的更新pacman -Su
pacman -Sy
GCC
和G++
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
本文中此方法主要用在
UCRT64
环境的C/C++
环境搭建中,其它环境以此类推
该命令会打包安装gcc
、gdb
、make
等编译工具,并将其安装在D:\msys64\ucrt64\bin
目录下
此为pacman
的虚拟包安装方式,主要用于安装软件集合,其它操作如删除等需要做用真实的软件包名
MINGW64
环境下软件包名为:mingw-w64-x86_64-toolchain
pacman -Syu
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
UCRT64
的bin
文件夹添加到环境变量
UCRT64
的bin
文件夹路径为:D:\msys64\ucrt64\bin
GCC
环境gcc --version
g++ --version
gdb --version
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"
plugin
与packer_compiled.lua
是Packer
初始化后自动生成的
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.0NodeJS 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>-")
进入
Neovim
,使用命令:MasonInstall stylua
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。