最新要闻
- 呼和浩特:春雨贵如油!气象部门开展人工增雨作业 助力蓄水增墒
- 世界看点:一个时代结束!小灵通退出日本市场 中国运营商早已抛弃
- 世界新消息丨ChatGPT大封号、亚洲成重灾区!网友自救喊话:不要登录、不要登录
- 【报资讯】业主投诉邻居每天5点剁馅:万没想到结果是只啄木鸟
- 朱拉隆功大学相当于国内什么大学?朱拉隆功大学留学条件
- 泰版流星花园花泽类的扮演者是谁?泰版流星花园演员表
- 郑秀妍和郑秀晶的关系是什么?郑秀妍个人简介资料
- 多宁生物拟香港IPO上市,招股书显示2022年净利降86%
- 杨迪达人秀是哪一届?杨迪在达人秀里表演的是什么节目?
- 【天天新要闻】经验不足口气不小!韩国企业自研首枚商用火箭:要追上SpaceX
- 今日快看!摩托车、电动自行车头盔新国标正式发布:三大特点
- 环球热讯:每天扫码60亿次!条形码迎来50岁生日:首用于口香糖
- 今日热门!服务业开始了?麦当劳暂时关闭美国办公室:将通知裁员事宜
- 国乒官宣世乒赛参赛名单!林高远压线入围男单,林诗栋蒯曼打混双
- 广汉鲜花礼品
- 2022年全国因公牺牲民警308名 辅警179名
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
今日快讯:Neovim,要尝一口不?
Neovim风评很好,我机器上其实早装了它来替代 vim。只不过这两年用 vscode较多,冷落了它,除了偶尔改改配置文件,很少用。难得大过年的有点儿空,就来倒腾它一下子,最终效果如下。
基础配置
从 0.5版开始,Neovim允许使用 Lua代替 VimL作为配置语言,所以这里也直接从 init.lua开始了。
mkdir -p ~/.config/nvimtouch ~/.config/nvim/init.lua
打开此文件,开始配置。
(资料图片仅供参考)
nvim ~/.config/nvim/init.lua
先设置一下缩进,默认是 8 个字符,改为 4 个字符且按 tab键自动补空格:
vim.g.shiftround = truevim.bo.expandtab = truevim.bo.shiftwidth = 4vim.bo.softtabstop = 4vim.bo.tabstop = 4
再来显示下行号及右边界警示线。右边界一般建议为 80,即代码超过 80 个字符应该注意换行。对现在的屏幕分辨率来说,80 其实有些窄,可以设为 120。
vim.wo.number = truevim.wo.colorcolumn = "120"
neovim默认打开了不少之前在 vim中需要单独设置的选项,比如说自动缩进、文件类型检测、语法高亮等等。有了上面这几行,基础的配置差不多就够了,其它的安装插件后再调整。
插件管理
选用 lazy,与 packer相比,它不需要编译、更快、界面也好看些,还有其它优点,不罗列了。总之,就是它了。
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "git@github.com:folke/lazy.nvim.git", "--branch=stable", lazypath, })endvim.opt.rtp:prepend(lazypath)
注意与官方文档相比,我把 clone 地址由 https://github.com/folke/lazy.nvim.git
改为了 git@github.com:folke/lazy.nvim.git
,原因你知道的,国内访问 Github网址抽风,改用后者要好一些。
接着就是让 lazy起作用了,加入如下配置:
require("lazy").setup({-- 插件写这里}, { git = { url_format = "git@github.com:%s" }})
以上同样加了些针对 git 下载路径的自定义设置,原因同上。
需要特别说明的是,为了节省篇幅,后续凡是提到安装插件的,相关代码都是追加到如下注释的地方:
-- 以上省略require("lazy").setup({-- 插件相关配置在这里追加}, {-- 以下省略
然后输入如下命令就可以打开安装界面进行安装了:
:Lazy
配色方案
配色方案也是插件,可选的太多了,我使用 Nightfox。它本身又包含了多套方案,如下用的是 nordfox:
{ "EdenEast/nightfox.nvim", lazy = false, priority = 1000, config = function() vim.cmd([[colorscheme nordfox]]) end, },
安装之后,界面长这样:
还是很好看的。
字体与图标
首先打开 NERD FONTS,找一款你喜欢的编程字体装进系统里,然后设置你的终端使用该字体。接下来安装插件 nvim-web-devicons:
"nvim-tree/nvim-web-devicons",
以上操作目的是为了给 neovim提供图标支撑,目前暂时看不到变化,算是为后续做些准备工作。
状态栏
选用 lualine插件:
{ "nvim-lualine/lualine.nvim", opts = { options = { section_separators = "", component_separators = "" } } },
其实可以只保留如下一行,显示效果可能还好一些。我个人偏爱简洁样式,用上述选项是为了去掉分隔符。
"nvim-lualine/lualine.nvim",
文件管理
选 nvim-tree,用的人多,比较活跃。
{ "nvim-tree/nvim-tree.lua", config = function() vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 vim.g.termguicolors = true require("nvim-tree").setup({ sort_by = "case_sensitive", }) end, },
安装后,输入命令:
:NvimTreeToggle
就会打开文件树,如下图:
但是每次输入命令打开关闭文件树不太爽,用快捷键就好多了。
快捷键
先定义一下全局的快捷起始键,通常用空格或逗号,如下定义为逗号:
vim.g.mapleader = ","
如下定义 ,+空格
取消搜索高亮:
vim.keymap.set("n", "", "nohlsearch", { silent = true })
快捷键用熟了很好,刚定义时容易忘。想要提示的话,可以用 which-key插件来定义快捷键。
{ "folke/which-key.nvim", config = function() vim.o.timeout = true vim.o.timeoutlen = 300 local wk = require("which-key") -- 快捷键在这里定义 wk.setup() end, },
注意其中的注释,后续对快捷键定义如无特殊说明,都写在上述注释所在的位置。
现在可以试一下了,按下 Ctrl-W
组合键,效果如下:
Amazing,比较带劲是不是?
接下来注册自己想要的快捷键,比如:
wk.register({ [""] = { "nohlsearch", "取消搜索高亮" }, ["d"] = { "NvimTreeToggle", "显示/隐藏目录树" }, }, { prefix = "" })
这样就可以用 ,+d
来切换目录树的显示了。顺便的,当使用 /或 ?搜索时,匹配项会高亮显示,现在可以使用 ,+空格
来取消高亮了。如果按下 ,键,则会弹出以上快捷键的说明。相当不错!
多文档
vim/neovim有两种模式支持多文档编辑:标签页或缓冲区。这里选择使用缓冲区,bufferline插件可以展示多个缓冲区的文档标签:
{ "akinsho/bufferline.nvim", tag = "v3.*", config = function() vim.g.termguicolors = true require("bufferline").setup() end, },
试下效果吧。用 ,+d
打开目录树,按 j
或 k
选中个文件,再按 o
或直接回车就打开了,注意上方多出来的标签页。
试试用鼠标点击标签页以及其中的关闭按纽,功能正是你想要的,对吧?不过在 vim中用鼠标似乎有些 low,用命令 :bn
、:bp
算是正常途径。也可以定义快捷键,如下:
vim.keymap.set("n", "bp", "BufferLineCyclePrev", { silent = true }) vim.keymap.set("n", "bn", "BufferLineCycleNext", { silent = true }) vim.keymap.set("n", "bd", "bd", { silent = true })
配置到现在,乍一看很象回事了。但是用来写代码的话,还不太够,所以继续。
参考线及特殊字符
先加两行全局配置,以区分空格与制表符、以及折行与回车换行:
vim.o.listchars = "eol:↵,lead:‧"vim.wo.list = true
然后装个 indent-blankline插件:
{ "lukas-reineke/indent-blankline.nvim", },
代码片断
使用插件 luasnip,与自动完成的集成稍后再说。
{ "L3MON4D3/LuaSnip", version = "^1.1.0", dependencies = { "rafamadriz/friendly-snippets", }, config = function() require("luasnip.loaders.from_vscode").lazy_load() end, },
自动完成
从这里开始,进入稍微复杂的配置部分。先来弄自动完成。自动完成的原材料可以来源于当前文档关键字、可以来源于代码片断,当然我们更希望它来源于我们的编程上下文语义,即 LSP集成。如下是相关插件配置。
{ "hrsh7th/nvim-cmp", dependencies = { "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "hrsh7th/cmp-nvim-lsp", "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", }, config = function() local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.abort(), [""] = cmp.mapping.confirm({ select = true }), }), sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "luasnip" }, }, { { name = "buffer" }, { name = "path" }, }), }) end, },
看起来比较复杂,对吧?简单解释一下:
- 自动完成使用了 nvim-cmp插件;
- 提示内容可以来源于当前文档、路径、代码片断及上下文语义;
- 定义了几个快捷键;
上下文语义(LSP)
可能是最复杂的部分,配置如下:
{ "neovim/nvim-lspconfig", dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", "hrsh7th/cmp-nvim-lsp", }, config = function() require("mason-lspconfig").setup({ ensure_installed = { "bashls", "clangd", "denols", "pyright", "rust_analyzer", }, }) local capabilities = require("cmp_nvim_lsp").default_capabilities() local lspcfg = require("lspconfig") lspcfg.bashls.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.clangd.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.denols.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.pyright.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.rust_analyzer.setup({ capabilities = capabilities, on_attach = on_attach }) end, },
仍然是最简单的解释一下:
- 使用了 nvim-lspconfig插件来做 LSP 的配置;
- 不同的编程语言要安装不同的语言服务,使用 mason来统一管理这些语言服务组件;
- 自动安装 bash、c/c++、js/ts、python、rust 语言服务;
- 集成上述编程语言的语义化自动完成功能;
其中有个 on_attach
在给出的配置代码中暂未给出,是因为这是个公用函数,下文的代码格式化也会用到,所以稍后再描述。
格式化及诊断
这两项内容均使用 null-ls插件实现,配置如下:
{ "jose-elias-alvarez/null-ls.nvim", dependencies = { "nvim-lua/plenary.nvim", }, config = function() local nl = require("null-ls") local sources = { nl.builtins.diagnostics.eslint_d, nl.builtins.diagnostics.ruff, nl.builtins.formatting.beautysh, nl.builtins.formatting.black, nl.builtins.formatting.clang_format, nl.builtins.formatting.prettierd, nl.builtins.formatting.rustfmt, nl.builtins.formatting.sql_formatter, } nl.setup({ sources = sources, on_attach = on_attach, }) end, },
很明显,诊断与格式化也都与编程语言相关,同样依赖一些第三方组件。尽管上述配置没用明确给出,也可以通过 mason管理,之前已经安装过些插件。输入 :Mason
即可打开其界面如下:
可以看到我已经安装了 LSP 及格式化与诊断相关的几个组件。
是时候说一下 on_attach
了,其代码如下:
local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") local bufopts = { noremap=true, silent=true, buffer=bufnr } vim.keymap.set("n", "gD", vim.lsp.buf.declaration, bufopts) vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts) vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts) vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts) vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts) vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set("n", "wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set("n", "D", vim.lsp.buf.type_definition, bufopts) vim.keymap.set("n", "rn", vim.lsp.buf.rename, bufopts) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, bufopts) vim.keymap.set("n", "f", function() vim.lsp.buf.format { async = true } end, bufopts) local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) 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({ filter = function(client) return client.name == "null-ls" end, bufnr = bufnr, }) end, }) endend
主要是定义了一些快捷键,例如:
gd
可以跳转至关键字定义;gi
可以跳转至类型实现;,D
可以跳转至类型定义;,f
代码格式化;- 保存时自动进行代码格式化;
其它
- 注释,使用插件:comment.nvim;
- 错误列表,使用插件:trouble.nvim;
完整配置
vim.o.listchars = "eol:↵,lead:‧"vim.wo.list = truevim.wo.number = truevim.wo.signcolumn = "yes"vim.wo.colorcolumn = "80"vim.g.shiftround = truevim.bo.expandtab = truevim.bo.shiftwidth = 4vim.bo.softtabstop = 4vim.bo.tabstop = 4vim.g.termguicolors = truevim.g.completeopt = "menu,menuone,noselect"vim.g.mapleader = ","vim.keymap.set("n", "", "nohlsearch", { silent = true })-- vim.lsp.set_log_level("debug")local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") local bufopts = { noremap=true, silent=true, buffer=bufnr } vim.keymap.set("n", "gD", vim.lsp.buf.declaration, bufopts) vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts) vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts) vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts) vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts) vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set("n", "wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set("n", "D", vim.lsp.buf.type_definition, bufopts) vim.keymap.set("n", "rn", vim.lsp.buf.rename, bufopts) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, bufopts) vim.keymap.set("n", "f", function() vim.lsp.buf.format { async = true } end, bufopts) local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) 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({ filter = function(client) return client.name == "null-ls" end, bufnr = bufnr, }) end, }) endendlocal lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "git@github.com:folke/lazy.nvim.git", "--branch=stable", lazypath, })endvim.opt.rtp:prepend(lazypath)require("lazy").setup({ "nvim-tree/nvim-web-devicons", { "EdenEast/nightfox.nvim", lazy = false, priority = 1000, config = function() vim.cmd([[colorscheme nordfox]]) end, }, { "nvim-tree/nvim-tree.lua", config = function() vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 require("nvim-tree").setup({ sort_by = "case_sensitive", }) vim.keymap.set("n", "d", "NvimTreeToggle", { silent = true }) end, }, { "nvim-lualine/lualine.nvim", dependencies = { "nvim-tree/nvim-web-devicons", }, opts = { options = { section_separators = "", component_separators = "⁞", }, }, }, { "akinsho/bufferline.nvim", version = "^3.1.0", config = function() require("bufferline").setup() vim.keymap.set("n", "bp", "BufferLineCyclePrev", { silent = true }) vim.keymap.set("n", "bn", "BufferLineCycleNext", { silent = true }) vim.keymap.set("n", "bd", "bd", { silent = true }) end, }, { "lukas-reineke/indent-blankline.nvim", opts = { show_end_of_line = true, space_char_blankline = " ", }, }, { "L3MON4D3/LuaSnip", version = "^1.1.0", dependencies = { "rafamadriz/friendly-snippets", }, config = function() require("luasnip.loaders.from_vscode").lazy_load() end, }, { "hrsh7th/nvim-cmp", dependencies = { "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "hrsh7th/cmp-nvim-lsp", "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", }, config = function() local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.abort(), [""] = cmp.mapping.confirm({ select = true }), }), sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "luasnip" }, }, { { name = "buffer" }, { name = "path" }, }), }) end, }, { "williamboman/mason.nvim", opts = { ui = { check_outdated_packages_on_open = false, }, }, }, { "neovim/nvim-lspconfig", dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", "hrsh7th/cmp-nvim-lsp", }, config = function() require("mason-lspconfig").setup({ ensure_installed = { "bashls", "clangd", "denols", "pyright", "rust_analyzer", }, }) local capabilities = require("cmp_nvim_lsp").default_capabilities() local lspcfg = require("lspconfig") lspcfg.bashls.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.clangd.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.denols.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.pyright.setup({ capabilities = capabilities, on_attach = on_attach }) lspcfg.rust_analyzer.setup({ capabilities = capabilities, on_attach = on_attach }) end, }, { "jose-elias-alvarez/null-ls.nvim", dependencies = { "nvim-lua/plenary.nvim", }, config = function() local nl = require("null-ls") local sources = { nl.builtins.diagnostics.eslint_d, nl.builtins.diagnostics.ruff, nl.builtins.formatting.beautysh, nl.builtins.formatting.black, nl.builtins.formatting.clang_format, nl.builtins.formatting.prettierd, nl.builtins.formatting.rustfmt, nl.builtins.formatting.sql_formatter, } nl.setup({ sources = sources, on_attach = on_attach, }) end, }, { "numToStr/Comment.nvim", config = true, }, { "folke/trouble.nvim", dependencies = { "nvim-tree/nvim-web-devicons", }, config = true, },}, { git = { url_format = "git@github.com:%s", },})
关键词:
今日快讯:Neovim,要尝一口不?
每日关注!利用高德地图 API 显示地图信息
呼和浩特:春雨贵如油!气象部门开展人工增雨作业 助力蓄水增墒
世界看点:一个时代结束!小灵通退出日本市场 中国运营商早已抛弃
世界新消息丨ChatGPT大封号、亚洲成重灾区!网友自救喊话:不要登录、不要登录
【报资讯】业主投诉邻居每天5点剁馅:万没想到结果是只啄木鸟
北京银行短贷宝多久时间到账?北京银行短贷宝怎么申请?
朱拉隆功大学相当于国内什么大学?朱拉隆功大学留学条件
泰版流星花园花泽类的扮演者是谁?泰版流星花园演员表
郑秀妍和郑秀晶的关系是什么?郑秀妍个人简介资料
多宁生物拟香港IPO上市,招股书显示2022年净利降86%
杨迪达人秀是哪一届?杨迪在达人秀里表演的是什么节目?
环球最新:从C#中的数组中删除指定元素的几种方法,超简单
【天天新要闻】经验不足口气不小!韩国企业自研首枚商用火箭:要追上SpaceX
今日快看!摩托车、电动自行车头盔新国标正式发布:三大特点
环球热讯:每天扫码60亿次!条形码迎来50岁生日:首用于口香糖
今日热门!服务业开始了?麦当劳暂时关闭美国办公室:将通知裁员事宜
国乒官宣世乒赛参赛名单!林高远压线入围男单,林诗栋蒯曼打混双
广汉鲜花礼品
当前短讯!使用篇丨链路追踪(Tracing)其实很简单:请求轨迹回溯与多维链路筛选
天天快看:mysql/mariadb配置详解
世界报道:“5步”做好研发效能度量,打造DevOps研发管理闭环
2022年全国因公牺牲民警308名 辅警179名
世界观热点:小牛自游家汽车真要“黄了”?官方APP已停止服务
独家!RTX 4070国行价格确定:比预期贵那么一点点
每日看点!《铃芽之旅》连续10天票房日冠:观影人次第一
世界微速讯:亏电油耗5.55升 新款魏牌摩卡DHT-PHEV官图曝光:改头又换面
速递!热气球空中起火:画面骇人!致墨西哥两游客身亡
【时快讯】南阳市西峡县:寻访老君印迹 畅游紫荆花海
当前速读:大众将停产燃油版高尔夫车型,但将保留该名称用于未来的电动车型
天天观天下!云原生(一):云原生是什么
世界滚动:React Native 开发环境搭建
今日最新!易基因-单细胞甲基化测序&单细胞转录组测序
环球速看:山东:聚焦这些重点领域做好恶劣天气防范应对
真我11系列配置出炉:首发联发科新平台 顶配16GB+1TB
大容量还防水!宏碁15.6寸电脑双肩包大促:券后69元(省130元)
环球即时看!贵州遵义遇暴雨冰雹 街上冰雹流成河:帐篷都被吹飞
全球播报:新能源汽车安全吗?中科院院士:2021年起火3千辆 起火率约为万分之一
B站上线综艺《原梦冒险团》:一加Ace 2抢镜 性能标杆
祝贺!白城医学高等专科学校运动员荣获这个项目金牌
比亚迪高端MPV腾势D9 3月销量10398辆:35万以上新能源豪华MPV第一
暴雨预警来了:逾10省区市将现大到暴雨!今年来范围最广最强雨雪上线
环球实时:降价威力巨大!特斯拉一季度交付量暴涨36%
世界新消息丨10-15万中美德日韩轿车大横评 论省油:比亚迪秦PLUS DM-i真大哥
花木小志
当前热点-读SQL进阶教程笔记06_外连接
全球今头条!简单实用出入库管理系统开源 实用进销存管理系统 快销品管理平台 电商进出库管理系统 开源下载
快报:求求你别乱脱敏了!MyBatis 插件 + 注解轻松实现数据脱敏,So easy~!
博客园添加打赏按钮
Pytorch 备忘清单_开发速查表分享
中金普洛斯REIT第一次扩募并新购入基础设施项目正式获批
吸收外资扩量更要提质
年内19只债基降低管理费 一级债基成主力
环球热点!当市场恐慌时,美联储会采取行动吗?
陕西省19个农产品区域公用品牌亮相第22届绿色食品博览会
环球微头条丨你为啥不升级Win11?数据:Win11份额历史新高 用过都说好?
每日热点:想薅羊毛?本轮汽车降价你需要知道事:10万以下车别想 理想蔚来等不跟定位豪华
今日最新!NVIDIA对RTX 4070定价有信心:3060的功耗输出3080性能
每日时讯!气温跳水!今年来范围最广最强雨雪上线:北方多地降温达10℃
时代终结!50年的大众经典神车高尔夫要停产了
送牙刷:纳美氨基酸牙膏4支/19.9元清仓
重磅!“笔吧”称将转行评测飞机杯?看了眼日期我悟了
【世界聚看点】速度可达600km/h!我国自研高温超导电动悬浮交通系统实现首次悬浮运行
天天精选!马斯克74岁母亲来武汉游玩:频繁晒照 称中国悠久的历史令人着迷
全球热资讯!基于zynq的OV5640摄像头的sobel算子边缘检测
天天新动态:小米路由器3C刷入Breed和OpenWrt
【世界播资讯】Microsoft Visual Studio 2022 透明背景设置
全球快播:相同基准点的多个rvt BIM模型数据配准后位置有错位偏差问题处理
哥伦比亚发布橙色预警!这座火山,或在未来几天喷发?曾致超2.3万人死亡
今日聚焦!建议友商跟进!长安深蓝豪送大礼:已提车用户享终身整车质保
热点在线丨专家:发展电车一年可节约500亿美元石油进口、这钱拿来干什么不好
天天观点:送给老师的便宜小礼物
头条焦点:Redis——内存淘汰策略
理想杀疯了!3月交付破2万辆 成新势力新老大 李想:30-50万SUV市场占比已接近20%
讯息:波兰蠢驴营收向好
世界今日讯!斗罗大陆游戏激活码有哪些(斗罗大陆游戏激活码是多少)
全球今日报丨Java 基础 -- NIO 多人聊天室
环球热推荐:四元数法
环球快资讯丨iPhone大面积bug:苹果自带天气崩了 无任何数据
shell 脚本之一键部署安装 Nginx
环球实时:国产PCSK9抑制剂 ,即将迎来商业爆发?
全球观速讯丨韩国主持人流鼻血仍淡定直播 本人回应没事:网友看笑但直呼真敬业
热文:钟南山亲自颁发!理想L9获颁“五星健康车”:383.4分创造历史
全球热头条丨文峰股份:3月31日融券卖出5300股,融资融券余额1.56亿元
全球动态:读SQL进阶教程笔记04_集合运算
加满一箱油少花13元!油价迎今年来最大降幅
天天热资讯!2020广州大佛寺中秋佳节拜月法会安排一览
Swift与OC混编
环球信息:知乎使用指南
汉唐元三车齐发!比亚迪乘用车在西班牙正式开售
【世界独家】不虚标!比亚迪汉EV冠军版实测光电续航达成率93.1%
世界今热点:中国最畅销手机出炉:“十三香”传奇上演 安卓高端难成
内存狂魔第一次冲上8200MHz!芝奇带来96GB DDR5
佛山企业标准“领跑者”数量连续三年全国第一
当前视点!腮腺炎初期有什么症状?_腮腺炎初期有什么症状
全球时讯:深度学习——用简单的线性模型构建识别鸟与飞机模型
Redhat/CentOS Linux 系统进入单用户模式
天天即时看!万恶的环境 二 java
今日要闻!验证码被攻破!谷歌AI已能精准识别 GPT-4则装瞎求人帮忙
美女博主在家拍擦边视频?穿瑜伽服涨粉百万!真相是...