Neovim 配置全面解析(上)

news2024/12/30 2:45:28

Neovim 配置全面解析(上)

原文:Neovim 配置全面解析(上) - 知乎 (zhihu.com)

环境:Ubuntu 20.04

宿主机:windows (windows terminal)WSL 2

NVIM:v 0.10.0-dev

配置 Neovim 需要保证流畅的 github 环境(以便于快速拉取插件),可以使用代理或是配置 Github SSH key

本篇博客是学习掘金小册的学习笔记,有兴趣的朋友可以直接点击下文链接了解详情

小册链接: https://s.juejin.cn/ds/iFGpuLW6/

因为文章字数超出平台限制,所以整体分上下两章节

这里提前说下,我非常不建议大家再按照本篇文章的步骤自己从零开始搭建一遍,不仅耗时而且意义不大,并且因为时效性上的原因,可能很多配置或是插件已经过时或是不再维护

本篇文章的目的仅仅只是展示下我自己当初如何从零搭建的记录,当时做仅仅只是因为“看上去很炫酷”,但其实如果你不是某些领域的开发,做这些东西没多大意义,也基本不能提高你的开发效率

所以比较好的方法就是,了解 neovim 的基本使用之后,自行找 lazy vim 的配置教程,因为 lazy 可以开箱即用,节约时间,可以看 Vhryyo 还有 typecraft 的视频(评论中知友推荐的),如果仅仅 lazy 满足不了你,可以自行从 reddit neovim 找些自己喜欢的配置,就是这样

成品示例图

动图封面

配置文件整体结构

├── LICENSE
├── README.md
├── init.lua
└── lua
    ├── autocmds.lua
    ├── basic.lua
    ├── colorscheme.lua
    ├── keybindings.lua
    ├── lsp
    │   ├── cmp.lua
    │   ├── config
    │   │   ├── bash.lua
    │   │   ├── emmet.lua
    │   │   ├── html.lua
    │   │   ├── json.lua
    │   │   ├── lua.lua
    │   │   ├── markdown.lua
    │   │   ├── pyright.lua
    │   │   ├── rust.lua
    │   │   └── ts.lua
    │   ├── formatter.lua
    │   ├── null-ls.lua
    │   ├── setup.lua
    │   └── ui.lua
    ├── plugin-config
    │   ├── bufferline.lua
    │   ├── comment.lua
    │   ├── dashboard.lua
    │   ├── gitsigns.lua
    │   ├── indent-blankline.lua
    │   ├── lualine.lua
    │   ├── nvim-autopairs.lua
    │   ├── nvim-tree.lua
    │   ├── nvim-treesitter.lua
    │   ├── project.lua
    │   ├── surround.lua
    │   ├── telescope.lua
    │   ├── toggleterm.lua
    │   ├── vimspector.lua
    │   └── which-key.lua
    ├── plugins.lua
    └── utils
        ├── fix-yank.lua
        ├── global.lua
        └── im-select.lua

首先 init. lua 是整个配置的入口文件,负责引用所有其他的模块,基本上想要打开或关闭某个插件只要在这里修改一行代码即可。

  • basic. lua: 基础配置,是对默认配置的一个重置。
     

  • colorscheme. lua: 我们安装的主题皮肤配置,在这里切换主题。
     

  • keybindings. lua: 快捷键的设置,所有插件的快捷键也都会放在这里。
     

  • plugins. lua: 插件安装管理,插件安装或卸载全在这里设置。
     

  • lsp 文件夹:

    是对 Neovim 内置 LSP 功能的配置,包括常见编程语言与语法提示等。
     
    • config 文件夹包含各种语言服务器单独的配置文件。

    • setup. lua 内置 LSP 的配置。

    • cmp. lua 语法自动补全补全的配置,包括各种补全源,与自定义代码段。

    • ui. lua: 对内置 LSP 功能增强和 UI 美化。

    • formatter. lua: 独立代码格式化功能。

  • plugin-config 文件夹: 是对第三方插件的配置,未来每添加一个插件,这里就多一个配置文件。
     

  • utils 文件夹: 是对常见问题的修改,包括输入法切换,针对 windows 的特殊配置等。
     

配置 Nerd Fonts

官网:Nerd Fonts - Iconic font aggregator, glyphs/icons collection, & fonts patcher

下载字体文件FiraCodeNerdFont-Regular.ttf下载之后双击 ttf 文件点击安装即可添加到系统字体文件中

配置步骤:

最后点击保存

安装 Neovim

旧版本卸载:sudo apt-get remove neovim

官网:Installing Neovim · neovim/neovim Wiki (github.com)

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:neovim-ppa/unstable
sudo apt-get update
sudo apt-get install neovim

执行nvim --version,确保版本必须为 0.7 及以上。

执行nvim ~/.bashrc

alias vim='nvim'
alias vi='nvim'
alias v='nvim'

执行source ~/.bashrc重新加载配置文件

配置入口 init. lua

~/.config/nvim/init.lua 写入如下内容:

-- 基础设置
require('basic')

require 函数在 Lua 中用于加载一个模块,而这些模块通常位于 runtimepath 中的 lua/ 目录下,也就是我们的 ~/.config/nvim/lua/ 目录。

所以上边的代码,就是加载 ~/.config/nvim/lua/basic.lua 文件(注意:require 里没有 .lua 扩展名)。当然也可以创建 ~/.config/nvim/lua/basic/ 目录,在目录下边创建 init.lua 文件也是可以成功加载的。

创建基础配置文件~/.config/nvim/lua/basic.lua,并添加如下内容:

-- utf8
vim.g.encoding = "UTF-8"
vim.o.fileencoding = 'utf-8'
-- jkhl 移动时光标周围保留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
-- 命令行高为2,提供足够的显示空间
vim.o.cmdheight = 2
-- 当文件被外部程序修改时,自动加载
vim.o.autoread = true
vim.bo.autoread = true
-- 禁止折行
vim.wo.wrap = false
-- 光标在行首尾时<Left><Right>可以跳到下一行
vim.o.whichwrap = '<,>,[,]'
-- 允许隐藏被修改过的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 为等待键盘快捷键连击时间500毫秒,可根据需要设置
vim.o.timeoutlen = 500
-- 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'
-- 补全最多显示10行
vim.o.pumheight = 10
-- 永远显示 tabline
vim.o.showtabline = 2
-- 使用增强状态栏插件后不再需要 vim 的模式提示
vim.o.showmode = false

说明

  • vim.g.{name}: 全局变量

  • vim.b.{name}: 缓冲区变量

  • vim.w.{name}: 窗口变量

  • vim.bo.{option}: buffer-local 选项

  • vim.wo.{option}: window-local 选项

一般来说,全部设置在 vim.opt 下也是可以的,例如 vim.opt.number = true 也是有效的,只是我们上边设置到了比较详细位置而已,具体每个变量的分类可以在 : help 文档中查看。

快捷键设置

创建lua/keybindings.lua

vim.g.mapleader = " "
vim.g.maplocalleader = " "

local map = vim.api.nvim_set_keymap
-- 复用 opt 参数
local opt = {noremap = true, silent = true }

-- 取消 s 默认功能
map("n", "s", "", opt)
-- windows 分屏快捷键
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)
-- Alt + hjkl  窗口之间跳转
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)

-- 左右比例控制
map("n", "<C-Left>", ":vertical resize -2<CR>", opt)
map("n", "<C-Right>", ":vertical resize +2<CR>", opt)
map("n", "s,", ":vertical resize -20<CR>", opt)
map("n", "s.", ":vertical resize +20<CR>", opt)
-- 上下比例
map("n", "sj", ":resize +10<CR>", opt)
map("n", "sk", ":resize -10<CR>", opt)
map("n", "<C-Down>", ":resize +2<CR>", opt)
map("n", "<C-Up>", ":resize -2<CR>", opt)
-- 等比例
map("n", "s=", "<C-w>=", opt)

-- Terminal相关
map("n", "<leader>t", ":sp | terminal<CR>", opt)
map("n", "<leader>vt", ":vsp | terminal<CR>", opt)
map("t", "<Esc>", "<C-\\><C-n>", opt)
map("t", "<A-h>", [[ <C-\><C-N><C-w>h ]], opt)
map("t", "<A-j>", [[ <C-\><C-N><C-w>j ]], opt)
map("t", "<A-k>", [[ <C-\><C-N><C-w>k ]], opt)
map("t", "<A-l>", [[ <C-\><C-N><C-w>l ]], opt)

-- visual模式下缩进代码
map("v", "<", "<gv", opt)
map("v", ">", ">gv", opt)
-- 上下移动选中文本
map("v", "J", ":move '>+1<CR>gv-gv", opt)
map("v", "K", ":move '<-2<CR>gv-gv", opt)

-- 上下滚动浏览
map("n", "<C-j>", "4j", opt)
map("n", "<C-k>", "4k", opt)
-- ctrl u / ctrl + d  只移动9行,默认移动半屏
map("n", "<C-u>", "9k", opt)
map("n", "<C-d>", "9j", opt)

-- 在visual 模式里粘贴不要复制
map("v", "p", '"_dP', opt)

-- 退出
map("n", "q", ":q<CR>", opt)
map("n", "qq", ":q!<CR>", opt)
map("n", "Q", ":qa!<CR>", opt)

-- insert 模式下,跳到行首行尾
map("i", "<C-h>", "<ESC>I", opt)
map("i", "<C-l>", "<ESC>A", opt)

最后在init.lua中引入快捷键文件

-- 快捷键映射
require("keybindings")

插件配置

目前在 Neovim 最常见的插件管理器主要有 vim-plug 和 packer 两个。

安装步骤(请参照官网步骤):

执行git clone --depth 1 https://github.com/wbthomason/packer.nvim\ ~/.local/share/nvim/site/pack/packer/start/packer.nvim

安装成功后添加配置文件lua/plugins.lua,添加如下内容

local packer = require("packer")
packer.startup(
  function(use)
   -- Packer 可以管理自己本身
   use 'wbthomason/packer.nvim'
   -- 你的插件列表...
end)

init.lua中添加如下内容

-- Packer 插件管理
require("plugins")

配置生效后,Neovim 会增加以下命令。

  • :PackerCompile: 每次改变插件配置时,必须运行此命令或 PackerSync, 重新生成编译的加载文件

  • :PackerClean : 清除所有不用的插件

  • :PackerInstall : 清除,然后安装缺失的插件

  • :PackerUpdate : 清除,然后更新并安装插件

  • :PackerSync : 执行 PackerUpdate 后,再执行 PackerCompile

  • :PackerLoad : 立刻加载 opt 插件

通过上边的说明,我们观察到 :PackerSync 命令包含了 :PackerUpdate 和:PackerCompile,而 :PackerUpdate 又包含了 :PackerClean 和 :PackerInstall 流程。

所以通常情况下,无论安装还是更新插件,我只需要下边这一条命令就够::PackerSync

每次修改完 lua/plugins.lua 这个文件后,保存退出,重新打开并调用 :PackerSync 就可以了

添加自动安装

lua/plugins.lua 文件,在最后添加

-- 每次保存 plugins.lua 自动安装插件
pcall(
  vim.cmd,
  [[
    augroup packer_user_config
    autocmd!
    autocmd BufWritePost plugins.lua source <afile> | PackerSync
    augroup end
  ]]
)

注意:保证自己可以 ping 通 github 的情况下,但是仍旧执行 :PackerSync失败,按 R 多次拉取失败插件,如果依旧失败则在错误插件处点击回车,查看问题,具体问题具体分析,我一般多试几次 R 就会成功

配置主题

init.lua中添加如下内容:

-- 主题设置 (新增)
require("colorscheme")

lua/colorscheme.lua添加

local colorscheme = "tokyonight"
local status_ok, _ = pcall(vim.cmd, "colorscheme " .. colorscheme)
if not status_ok then
  vim.notify("colorscheme " .. colorscheme .. " 没有找到!")
  return
end

安装第三方主题

lua/plugins.lua文件

packer.startup({
  function(use)
    -- Packer 可以升级自己
    use("wbthomason/packer.nvim")
    --------------------- colorschemes --------------------
    -- tokyonight
    use("folke/tokyonight.nvim")
    -------------------------------------------------------

    -- 略...
})

:w保存 p退出

其他主体配色链接:neovim-colorscheme · GitHub Topics

lua/plugins.lua添加插件配置后,修改 lua/colorscheme.lua 内 colorscheme 变量为相应的主题即可

侧边栏文件浏览器

相关插件:

  • nvim-tree/nvim-tree.lua: A file explorer tree for neovim written in lua (github.com)

lua/plugins.lua 中添加

packer.startup({
  function(use)
    -- Packer 可以升级自己
    use("wbthomason/packer.nvim")
    -------------------------- plugins -------------------------------------------
    -- nvim-tree (新增)
    use({ "kyazdani42/nvim-tree.lua", requires = "kyazdani42/nvim-web-devicons" })

...略

配置 nvim-tree

lua/plugin-config/nvim-tree.lua

local status, nvim_tree = pcall(require, "nvim-tree")
if not status then
    vim.notify("没有找到 nvim-tree")
  return
end

-- 列表操作快捷键
local list_keys = require('keybindings').nvimTreeList
nvim_tree.setup({
    -- 不显示 git 状态图标
    git = {
        enable = false,
    },
    -- project plugin 需要这样设置
    update_cwd = true,
    update_focused_file = {
        enable = true,
        update_cwd = true,
    },
    -- 隐藏 .文件 和 node_modules 文件夹
    filters = {
        dotfiles = true,
        custom = { 'node_modules' },
    },
    view = {
        -- 宽度
        width = 40,
        -- 也可以 'right'
        side = 'left',
        -- 隐藏根目录
        hide_root_folder = false,
        -- 自定义列表中快捷键
        mappings = {
            custom_only = false,
            list = list_keys,
        },
        -- 不显示行数
        number = false,
        relativenumber = false,
        -- 显示图标
        signcolumn = 'yes',
    },
    actions = {
        open_file = {
            -- 首次打开大小适配
            resize_window = true,
            -- 打开文件时关闭
            quit_on_open = true,
        },
    },
    -- wsl install -g wsl-open
    -- https://github.com/4U6U57/wsl-open/
    system_open = {
        cmd = 'wsl-open', -- mac 直接设置为 open
    },
})
-- 自动关闭
vim.cmd([[
  autocmd BufEnter * ++nested if winnr('$') == 1 && bufname() == 'NvimTree_' . tabpagenr() | quit | endif
]])

上边代码就是 nvim-tree 的配置,可以根据注释进行修改。这里简单解释一下,值得注意的是 system_open 项,如果想要在 WSL 中用 Windows 系统默认设置打开文件,需要使用 Node.js 全局安装一个 wsl-open 包,使用命令 npm install -g wsl-open,如果不需要这个功能,也可以不用安装。如果不是 Windows 系统也就不需要安装。

nvim-tree 初始化支持很多参数,如果想知道还有哪些其他的参数,可以运行 :h nvim-tree.setup 调出帮助文档查看。

lua/keybindings.lua添加

-- 插件快捷键
local pluginKeys = {}

-- nvim-tree
-- alt + m 键打开关闭tree
map("n", "<A-m>", ":NvimTreeToggle<CR>", opt)
-- 列表快捷键
pluginKeys.nvimTreeList = {
  -- 打开文件或文件夹
  { key = {"<CR>", "o", "<2-LeftMouse>"}, action = "edit" },
  -- 分屏打开文件
  { key = "v", action = "vsplit" },
  { key = "h", action = "split" },
  -- 显示隐藏文件
  { key = "i", action = "toggle_custom" }, -- 对应 filters 中的 custom (node_modules)
  { key = ".", action = "toggle_dotfiles" }, -- Hide (dotfiles)
  -- 文件操作
  { key = "<F5>", action = "refresh" },
  { key = "a", action = "create" },
  { key = "d", action = "remove" },
  { key = "r", action = "rename" },
  { key = "x", action = "cut" },
  { key = "c", action = "copy" },
  { key = "p", action = "paste" },
  { key = "s", action = "system_open" },
}
return pluginKeys

init.lua添加

-- 插件配置
require("plugin-config.nvim-tree")

但是出现问题view.mappings.list has been deprecated in favour of on_attach.please run,应该是某些插件更新:相关链接:Migrating To on_attach · nvim-tree/nvim-tree.lua Wiki (github.com)

表明view.mappings and remove_keymaps已经启用需要移除

解决方案:

注释掉view.mappings

执行:NvimTreeGenerateOnAttach,复制nvim-tree-on-attach.lua中的内容粘贴到nvim-tree.lua中(需要添加在 setup 之前)

添加

require("nvim-tree").setup({
  ...
  on_attach = on_attach,
})

问题解决~

顶部标签页和底部信息栏

相关插件:

  • akinsho/bufferline.nvim: A snazzy bufferline for Neovim (github.com)

  • nvim-lualine/lualine.nvim: A blazing fast and easy to configure neovim statusline plugin written in pure lua. (github.com)

顶部标签页

lua/plugins.lua

packer.startup({
  function(use)
    -- Packer 可以升级自己
    use("wbthomason/packer.nvim")
    -------------------------- plugins -------------------------------------------
    -- nvim-tree
    use({ "kyazdani42/nvim-tree.lua", requires = "kyazdani42/nvim-web-devicons" })
    -- bufferline (新增)
    use({ "akinsho/bufferline.nvim", requires = { "kyazdani42/nvim-web-devicons", "moll/vim-bbye" }})

...略

:w 保存,自动安装,安装完整按 q 退出

出现GnuTLS recv error (-110)问题

解决方案:

# 依次执行
apt-get install gnutls-bin
# 关闭 SSL 验证
git config --global http.sslVerify false
# 第二个命令是用于设置缓冲区大小
git config --global http.postBuffer 1048576000
# 或是
sudo update-alternatives --set fakeroot /usr/bin/fakeroot-tcp

这里我增加了一个 moll/vim-bbye 依赖,因为这个插件安装后会增加一个 :Bdelete 命令,相比内置的 :bdelete, 它删除 buffer 的同时,并不会搞乱布局。待会儿我们会配置 Bdelete 为关闭 Tab 的命令。

新建lua/plugin-config/bufferline.lua文件并添加内容

local status, bufferline = pcall(require, "bufferline")
if not status then
    vim.notify("没有找到 bufferline")
  return
end

-- bufferline 配置
-- https://github.com/akinsho/bufferline.nvim#configuration
bufferline.setup({
  options = {
    -- 关闭 Tab 的命令,这里使用 moll/vim-bbye 的 :Bdelete 命令
    close_command = "Bdelete! %d",
    right_mouse_command = "Bdelete! %d",
    -- 侧边栏配置
    -- 左侧让出 nvim-tree 的位置,显示文字 File Explorer
    offsets = {
      {
        filetype = "NvimTree",
        text = "File Explorer",
        highlight = "Directory",
        text_align = "left",
      },
    },
    -- 使用 nvim 内置 LSP  后续课程会配置
    diagnostics = "nvim_lsp",
    -- 可选,显示 LSP 报错图标
    ---@diagnostic disable-next-line: unused-local
    diagnostics_indicator = function(count, level, diagnostics_dict, context)
      local s = " "
      for e, n in pairs(diagnostics_dict) do
        local sym = e == "error" and " " or (e == "warning" and " " or "")
        s = s .. n .. sym
      end
      return s
    end,
  },
})

lua/keybindings.lua

-- bufferline
-- 左右Tab切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)
-- 关闭
--"moll/vim-bbye"
map("n", "<C-w>", ":Bdelete!<CR>", opt)
map("n", "<leader>bl", ":BufferLineCloseRight<CR>", opt)
map("n", "<leader>bh", ":BufferLineCloseLeft<CR>", opt)
map("n", "<leader>bc", ":BufferLinePickClose<CR>", opt)

init.lua添加

require("plugin-config.bufferline")

底部信息栏

lua/plugins.lua

    -- lualine (新增)
    use({ "nvim-lualine/lualine.nvim", requires = { "kyazdani42/nvim-web-devicons" } })
    use("arkav/lualine-lsp-progress")

新建lua/plugin-config/lualine.lua

-- 如果找不到 lualine 组件,就不继续执行
local status, lualine = pcall (require, "lualine")
if not status then
    vim.notify ("没有找到 lualine")
  return
end

lualine.setup ({
  options = {
    theme = "tokyonight",
    component_separators = { left = "|", right = "|" },
    -- https://github.com/ryanoasis/powerline-extra-symbols
    section_separators = { left = " ", right = "" },
  },
  extensions = { "nvim-tree", "toggleterm" },
  sections = {
    lualine_c = {
      "filename",
      {
        "lsp_progress",
        spinner_symbols = { " ", " ", " ", " ", " ", " " },
      },
    },
    lualine_x = {
      "filesize",
      {
        "fileformat",
        -- symbols = {
        --   unix = '', -- e 712
        --   dos = '', -- e 70 f
        --   mac = '', -- e 711
        -- },
        symbols = {
          unix = "LF",
          dos = "CRLF",
          mac = "CR",
        },
      },
      "encoding",
      "filetype",
    },
  },
})

init. lua添加

require ("plugin-config. lualine")

模糊搜索快速查找文件

相关插件:nvim-telescope/telescope.nvim: Find, Filter, Preview, Pick. All lua, all the time. (github.com)

lua/plugins. lua

    -- telescope (新增)
    use { 'nvim-telescope/telescope. nvim', requires = { "nvim-lua/plenary. nvim" } }

: checkhealth telescope 检查依赖情况,这里通常会提示 ripgrep 不存在,因为 telescope 依赖以下两个项目。

  • sharkdp/fd: A simple, fast and user-friendly alternative to 'find' (github.com)

  • BurntSushi/ripgrep: ripgrep recursively searches directories for a regex pattern while respecting your gitignore (github.com)

解决方案:

# 20.04 安装 repgrep
sudo apt install ripgrep
# 18.04 安装 repgrep
sudo add-apt-repository ppa: x 4121/ripgrep
sudo apt-get update
sudo apt install ripgrep
# 安装 fd
npm install -g fd-find

配置 node 环境

node

配置源,需要哪个版本可以将 16 替换为相应版本

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -

安装

sudo apt-get update -y
sudo apt install -y nodejs

如果不想要自己配置指定版本源的情况下,可以直接执行

sudo apt update -y
sudo apt install nodejs npm

nvm

官网:nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions (github.com)

git clone nvm 仓库时遇到如下错误

GnuTLS recv error (-110): The TLS connection 。。。

我是因为 Ipv 6 的问题,可以 git clone -4 指定使用 Ipv 4 连接

但是执行ap-get update遇到问题:

Err: 12  http://ppa.launchpad.net/x4121/ripgrep/ubuntu focal Release
404 Not Found [IP: 185.125.190.52 80]
Reading package lists...
E: The repository '  http://ppa.launchpad.net/x4121/ripgrep/ubuntu focal Release' does not have a Release file.

这是因为之前我执行过sudo add-apt-repository ppa: x 4121/ripgrep所以可以直接手动删除

解决方案(自动移除再更新):

sudo apt-add-repository -r ppa: x 4121/ripgrep
# 指的是先移除 armagetronad-dev 这个 ppa 包,再添加这个 ppa 包
sudo apt update -q

手动删除

cd /etc/apt/sources. list. d
rm x 4121-ubuntu-ripgrep-focal. list
# .save 文件是备份,不需要管

后面我在使用更新插件包时爆出:Could not resolve host github. com

解决 1(失败):

# 从全局配置文件中删除代理设置
git config --global --unset http. proxy
git config --global --unset https. proxy

解决 2(成功):

我直接 ping 了下网络,发现不只是 github 连不上,而是整个 WSL 网络都不能使用,在宿主机中我查看 WSL 网络配置,发现未修复之前两个红框中的 ip 地址是没有的

直接在宿主机上使用管理员权限执行netsh winsock reset重启网络即可(注意:不需要重启)

下面解决方案没有试过,仅作为备用方案

解决 3:

# 重启 WSL 指令
$ wsl --shutdown
# 之后就重新启动进入即可
$ wsl

自定义启动页与项目列表

当我们在命令行中输入 nvim 不带任何路径并敲击回车的时候,就会打开这个界面,通常我们会在这个界面中配置最常用功能,比如打开最近编辑过的文件,快速打开项目文件夹,快速修改快捷键等。

使用官方配置的图像: Ascii Header Text · nvimdev/dashboard-nvim Wiki (github.com)

使用字体生成器:[Text to ASCII Art Generator (TAAG) (patorjk. com)]( http://patorjk.com/software/taag/#p=display&f=ANSI Shadow&t=rettmp)

同样 plugins. lua 中添加:

    -- dashboard-nvim (新增)
    use ("glepnir/dashboard-nvim")

创建 lua/plugin-config/dashboard. lua ,并添加:

local status, db = pcall (require, "dashboard")
if not status then
  vim.notify ("没有找到 dashboard")
  return
end

db.setup ({
  theme = 'doom',
  config = {
    header = {
[[                                                     ]],
[[                                                     ]],
[[██████╗ ███████╗████████╗████████╗███╗   ███╗██████╗ ]],
[[██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝████╗ ████║██╔══██╗]],
[[██████╔╝█████╗     ██║      ██║   ██╔████╔██║██████╔╝]],
[[██╔══██╗██╔══╝     ██║      ██║   ██║╚██╔╝██║██╔═══╝ ]],
[[██║  ██║███████╗   ██║      ██║   ██║ ╚═╝ ██║██║     ]],
[[╚═╝  ╚═╝╚══════╝   ╚═╝      ╚═╝   ╚═╝     ╚═╝╚═╝     ]],
[[                                                     ]],
[[                [ version : 1.0.0 ]                  ]],
[[                                                     ]],
    }, --your header
    center = {
  {
    icon = "  ",
    desc = "Projects                            ",
    action = "Telescope projects",
  },
  {
    icon = "  ",
    desc = "Recently files                      ",
    action = "Telescope oldfiles",
  },
  {
    icon = "  ",
    desc = "Edit keybindings                    ",
    action = "edit ~/. config/nvim/lua/keybindings. lua",
  },
  {
    icon = "  ",
    desc = "Edit Projects                       ",
    action = "edit ~/. local/share/nvim/project_nvim/project_history",
  },
    },
    footer = {}  --your footer
  }
})

但是里面的 Telescope projects 并不是 telescope 内置的命令。需要安装ahmedkhalf/project. nvim插件,执行如下步骤

步骤

添加插件

-- project
use ("ahmedkhalf/project. nvim")

确保lua/plugin-config/nvim-tree. lua文件中有如下代码:

nvim_tree.setup ({
  --- 上略

  -- project plugin 需要这样设置
  update_cwd = true,
  update_focused_file = {
    enable = true,
    update_cwd = true,
  },

  -- 下略
}

创建lua/plugin-config/project. lua

local status, project = pcall (require, "project_nvim")
if not status then
    vim.notify ("没有找到 project_nvim")
  return
end

-- nvim-tree 支持
vim. g. nvim_tree_respect_buf_cwd = 1

project.setup ({
  detection_methods = { "pattern" },
  patterns = { ". git", "_darcs", ". hg", ". bzr", ". svn", "Makefile", "package. json", ". sln" },
})

local status, telescope = pcall (require, "telescope")
if not status then
  vim.notify ("没有找到 telescope")
  return
end
pcall (telescope. load_extension, "projects")

init. lua

require ("plugin-config. dashboard")
require ("plugin-config. project")

手动编辑 project_history 列表

执行: lua print (require ("project_nvim. utils. path"). historyfile)

我得到了~/. local/share/nvim/project_nvim/project_history这个文件,直接编辑即可

添加

/root/. config/nvim

以后的话可以方便编写 nvim 项目配置 :)

语法高亮安装及配置

相关插件:nvim-treesitter/nvim-treesitter: Nvim Treesitter configurations and abstraction layer (github.com)

添加插件

    -- treesitter (新增)
    use ({ "nvim-treesitter/nvim-treesitter", run = ": TSUpdate" })

手动安装 Language parser

运行 :TSInstallInfo 命令查看 language parsers 列表与安装状态

安装:: TSInstall javascript

卸载:: TSUninstall javascript

安装后会在 packer 中生成相应语言的 so 文件

自动安装配置

lua/plugin-config/nvim-treesitter. lua

local status, treesitter = pcall (require, "nvim-treesitter. configs")
if not status then
    vim.notify ("没有找到 nvim-treesitter")
    return
end

treesitter.setup ({
  -- 安装 language parser
  -- : TSInstallInfo 命令查看支持的语言
  ensure_installed = { "json", "html", "css", "vim", "lua", "javascript", "typescript", "tsx" },
  -- 启用代码高亮模块
  highlight = {
    enable = true,
    additional_vim_regex_highlighting = false,
  },
})

init. lua

require ("plugin-config. nvim-treesitter")

稍微说下里面 nvim-treesitter 中的配置

增量选择模块

当你的光标在一个语法结点上时,可以设置一个增加键和一个减少键,敲击这两个,在表现上为不断外扩和收缩选中代码。

增加和减少结点的快捷键设置成了 回车 和 退格 。通过不断的按 Enter 选择区域会从里层不断外扩, Backspace 则相反不断内收。

-- 启用增量选择模块
incremental_selection = {
  enable = true,
  keymaps = {
    init_selection = "<CR>",
    node_incremental = "<CR>",
    node_decremental = "<BS>",
    scope_incremental = "<TAB>",
  },
},

代码缩进

在 visual 模式中按 = 即可实现代码缩进

  -- 启用代码缩进模块 (=)
  indent = {
    enable = true,
  },

代码折叠

快捷键中设置了zc 组合键来折叠 {} 中的内容,还使用 zo 组合键来打开对应的折叠。

-- 开启 Folding 模块
vim. opt. foldmethod = "expr"
vim. opt. foldexpr = "nvim_treesitter #foldexpr ()"
-- 默认不要折叠
-- https://stackoverflow.com/questions/8316139/how-to-set-the-default-to-unfolded-when-you-open-a-file
vim. opt. foldlevel = 99

执行:TSModuleInfo查看是否成功

如果出现问题先执行TSUpdate看是否可以解决,无法解决查看官方 issues 或 wiki

LSP 基础配置

目的:实现类似 IDE 的智能提示、语法检查和解析、悬停文档等交互体验

定义:LSP(Language Server Protocol) 语言服务协议,该协议定义了在编辑器或 IDE 与语言服务器之间使用的协议,该语言服务器提供了例如自动补全,转到定义,查找所有引用等的功能;语言服务器索引格式的目标是支持在开发工具中进行丰富的代码导航或者一个无需本地源码副本的 WebUI。

开启 neovim 内置 LSP

执行: h lsp查看 quick start,里面的步骤如下

  • 使用包管理器安装语言服务器

  • 为每一种语言服务器配置 LSP 客户端

  • 配置快捷键 (keymaps)和自动命令 (autocmds)

配置客户端

安装插件:neovim/nvim-lspconfig: Quickstart configs for Nvim LSP (github.com)

配置语言服务器

安装插件:williamboman/nvim-lsp-installer: Further development has moved to https://github.com/williamboman/mason.nvim!

配置插件:

    --------------------- LSP --------------------
    use ("williamboman/nvim-lsp-installer")
    -- Lspconfig
    use ({ "neovim/nvim-lspconfig" })

安装 LSP Server

运行:LspInstallInfo ,点击 i 即可安装相应的 Server ,进入之后安装 Lua server

从最上面的介绍得知作者未来会用 mason. nvim 取代 nvim-lsp-installermason. nvim 项目支持更多的 server 安装,不仅仅是 LSP Server 还支持 DAP servers、 linters、formatters 等等超过 150 个包,100+ 种编程语言,并且升级也是非常简单的

但是安装失败,直接重新安装即可成功

但是有时遇到could not find executable "unzip" in path 问题,可以使用如下命令

sudo apt-get install zip unzip

但是安装成功之后发现问题,我从 issues 中了解到是因为 lua server 的仓库地址发生变化

鉴于nvim-lsp-installer出现的各种问题,现在使用mason. nvim代替nvim-lsp-installer

步骤:

  • 运行:LspUninstallAll卸载nvim-lsp-installer

  • plugins. lua 替换 nvim-lsp-installer 插件为 mason. nvim 和 mason-lspconfig. nvim

    use ({ "williamboman/mason. nvim" })
    use ({ "williamboman/mason-lspconfig. nvim" })

  • lua/lsp/setup. lua 相应部分替换为(这个文件后面会创建,现在先讲下)

local status, mason = pcall (require, "mason")
if not status then
  vim.notify ("没有找到 mason")
  return
end

local status, mason_config = pcall (require, "mason-lspconfig")
if not status then
  vim.notify ("没有找到 mason-lspconfig")
  return
end

local status, lspconfig = pcall (require, "lspconfig")
if not status then
  vim.notify ("没有找到 lspconfig")
  return
end

-- : h mason-default-settings
-- ~/. local/share/nvim/mason
mason.setup ({
  ui = {
    icons = {
      package_installed = "✓",
      package_pending = "➜",
      package_uninstalled = "✗",
    },
  },
})

-- mason-lspconfig uses the `lspconfig` server names in the APIs it exposes - not `mason. nvim` package names
-- https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md
mason_config.setup ({
  ensure_installed = {
    "lua_ls",
  },
})

-- 安装列表
-- { key: 服务器名, value: 配置文件 }
-- key 必须为下列网址列出的 server name,不可以随便写
-- https://github.com/williamboman/nvim-lsp-installer#available-lsps
local servers = {
  lua_ls = require ("lsp. config. lua"), -- lua/lsp/config/lua. lua
}

for name, config in pairs (servers) do
  if config ~= nil and type (config) == "table" then
    -- 自定义初始化配置文件必须实现 on_setup 方法
    config. on_setup (lspconfig[name])
  else
    -- 使用默认参数
    lspconfig[name]. setup ({})
  end
end

require ("lsp. ui")

保存之后默认安装到 ~/. local/share/nvim/mason

执行:Mason即可打开,操作基本和上面的一样,只不过多了 1,2,3,4,5 是上边 TAB 快捷键,按 2 即可切换到 LSP

Mason 仓库地址:Mason

配置 LSP Server

创建一个新的目录 lua/lsp/ 专门存放 lsp 相关的配置,使用: h mason-lspconfig-automatic-server-setup查看如何配置 setup,或是直接看官网

创建lua/lsp/setup. lua

local status, mason = pcall (require, "mason")
if not status then
  vim.notify ("没有找到 mason")
  return
end

local status, mason_config = pcall (require, "mason-lspconfig")
if not status then
  vim.notify ("没有找到 mason-lspconfig")
  return
end

local status, lspconfig = pcall (require, "lspconfig")
if not status then
  vim.notify ("没有找到 lspconfig")
  return
end

-- : h mason-default-settings
-- ~/. local/share/nvim/mason
mason.setup ({
  ui = {
    icons = {
      package_installed = "✓",
      package_pending = "➜",
      package_uninstalled = "✗",
    },
  },
})

-- mason-lspconfig uses the `lspconfig` server names in the APIs it exposes - not `mason. nvim` package names
-- https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md
mason_config.setup ({
  ensure_installed = {
    "lua_ls",
  },
})

-- 安装列表
-- { key: 服务器名, value: 配置文件 }
-- key 必须为下列网址列出的 server name,不可以随便写
-- https://github.com/williamboman/nvim-lsp-installer#available-lsps
local servers = {
  lua_ls = require ("lsp. config. lua"), -- lua/lsp/config/lua. lua
}

for name, config in pairs (servers) do
  if config ~= nil and type (config) == "table" then
    -- 自定义初始化配置文件必须实现 on_setup 方法
    config. on_setup (lspconfig[name])
  else
    -- 使用默认参数
    lspconfig[name]. setup ({})
  end
end

require ("lsp. ui")

配置 lua Server

创建/lua/lsp/config/lua. lua

-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
local runtime_path = vim.split (package. path, ';')
table.insert (runtime_path, 'lua/?. lua')
table.insert (runtime_path, 'lua/?/init. lua')

local opts = {
    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),
                checkThirdParty = false,
            },
            -- Do not send telemetry data containing a randomized but unique identifier
            telemetry = {
                enable = false,
            },
        },
    },
    flags = {
        debounce_text_changes = 150,
    },
    on_attach = function (client, bufnr)
        -- 禁用格式化功能,交给专门插件插件处理
        client. resolved_capabilities. document_formatting = false
        client. resolved_capabilities. document_range_formatting = false

        local function buf_set_keymap (...)
            vim. api. nvim_buf_set_keymap (bufnr, ...)
        end
        -- 绑定快捷键
        require ('keybindings'). mapLSP (buf_set_keymap)
        -- 保存时自动格式化
        vim.cmd ('autocmd BufWritePre <buffer> lua vim. lsp. buf. formatting_sync ()')
    end,
}

-- 查看目录等信息
return {
    on_setup = function (server)
        server: setup (opts)
    end,
}

配置 LSP 快捷键

lua/keybindings. lua

-- lsp 回调函数快捷键设置
pluginKeys. mapLSP = function (mapbuf)
  -- rename
  mapbuf ("n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename ()<CR>", opt)
  -- code action
  mapbuf ("n", "<leader>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", "gp", "<cmd>lua vim. diagnostic. open_float ()<CR>", opt)
  mapbuf ("n", "gk", "<cmd>lua vim. diagnostic. goto_prev ()<CR>", opt)
  mapbuf ("n", "gj", "<cmd>lua vim. diagnostic. goto_next ()<CR>", opt)
  mapbuf ("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting ()<CR>", opt)
  -- 没用到
  -- mapbuf ('n', '<leader>q', '<cmd>lua vim.diagnostic.setloclist ()<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

init. lua

-- 内置 LSP (新增)
require ("lsp. setup")

这里记录下:使用: verbose map 可以查看所有生效的快捷键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…

网络攻击攻击之-远程命令执行/RCE告警运营分析篇

在各种网络安全产品的告警中,远程命令执行是一种非常常见的告警。本文将从远程命令执行的定义,远程命令执行利用的流量数据包示例,远程命令执行的suricata规则,远程命令执行的告分析警研判,远程命令执行的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的远程…

Linux系统编程(三)进程间通信(IPC)

本文目录 一、linux 进程之间的通信种类二、管道1. 管道的概述2. 什么是管道文件&#xff1f;3. 管道的特点4. 管道类型&#xff08;1&#xff09;无名管道&#xff08;pipe&#xff09;&#xff08;2&#xff09;有名(命名)管道&#xff08;fifo&#xff09; 三、信号&#xf…

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量&#xff08;仅对当前用户有效&#xff09; vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

前端设计模式学习记录

设计模式介绍 概念 设计模式是我们在解决问题的时候针对特定的问题给出的简洁而优化的处理方案在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化将变与不变分离&#xff0c;确保变化的部分灵活、不变的部分稳定 注意&#xff1a;下面文章介绍的设计模式&#xff…

shell脚本实战--批量修改文件名

字符串截取 先来了解一下shell字符串相关操作的变量 # 从开头删除匹配最短 ## 从开头删除匹配最长 % 从结尾削除匹配最短 %% 从结尾删除匹配最长#指定字符内容截取 a*c 匹配开头为a&#xff0c;中间任意个字符&#xff0c;结尾为c的字符串 a*C 匹配…

​​​【收录 Hello 算法】10.4 哈希优化策略

目录 10.4 哈希优化策略 10.4.1 线性查找&#xff1a;以时间换空间 10.4.2 哈希查找&#xff1a;以空间换时间 10.4 哈希优化策略 在算法题中&#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…

LINGO:存贮问题

存贮模型中的基本概念 模型&#xff1a; 基本要素&#xff1a; &#xff08;1&#xff09;需求率&#xff1a;单位时间内对某种物品的需求量&#xff0c;用D表示。 &#xff08;2&#xff09;订货批量&#xff1a;一次订货中&#xff0c;包含某种货物的数量&#xff0c;用 Q表…

AI网络爬虫-从当当网批量获取图书信息

工作任务和目标&#xff1a;用户输入一个图书名称&#xff0c;然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置&#xff1a; 第一步&#xff1a;在deepseek中输入提示词&#xff1a; 你是一个Python爬虫专家&#xff0c;一步步的思考&#xff0c;完成以下…

Linux定时计划

定时计划 一、计划任务种类 突发性&#xff1a;临时决定只执行一次的任务 at&#xff1a;处理执行一次任务就结束定时性&#xff1a;每隔一定时间需要重复执行此命令 crontab&#xff1a;指定任务&#xff0c;按照设定的周期一直循环执行二、作用 定时任务可以用于自动备份…

AI办公自动化:用kimi批量将word文档部分文件名保存到Excel中

文件夹中有很多个word文档&#xff0c;现在只要英文部分的文件名&#xff0c;保存到一个Excel文件中。 可以在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

51单片机-实机演示(LED,呼吸,蜂鸣器)

一&#xff0c;LED点灯 #include "REG52.H"sbit LED P0^0;void main() {LED 1;while (1){} }控制P00输出。 烧录 重启 再换个引脚插入的位置。 二&#xff0c;蜂鸣器 代码&#xff0c;和烧录步骤同上。 只需要换一下&#xff0c;引脚位置即可 三&#xff0c;呼…

jmeter之MD5加密接口请求教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选择…

ssm整合教程

目录 写在前面 目录结构 添加依赖 web.xml jdbc.properties spring.xml mybatis.xml springmvc.xml pom.xml额外配置 last&#xff1a;写个测试样例看看整合成功没。 User.java UserDao.java(接口) UserController.java UserService.java UserServiceImpl.java …

人工智能在鼻咽癌领域的最新应用|【医学AI·论文速递·05-27】

小罗碎碎念 2024-05-27&#xff5c;文献速递 接下来打算把人工智能在主流癌种治疗中的应用&#xff0c;每天和大家做一期推送&#xff0c;方便大家了解各自领域最新的一个进展。 因为小罗的课题是鼻咽癌相关的&#xff0c;所以这一期推文就先从人工智能在鼻咽癌中最新的应用开…

MyBatis框架的使用:mybatis介绍+环境搭建+基础sql的使用+如何使用Map传入多个参数+返回多个实体用List或者Map接收+特殊sql的使用

MyBatis框架的使用&#xff1a;mybatis介绍环境搭建基础sql的使用如何使用Map传入多个参数返回多个实体用List或者Map接收特殊sql的使用 一、MyBatis介绍1.1 特性1.2 下载地址1.3 和其它持久层技术对比 二、搭建环境2.1配置maven2.2 创建mybatis配置文件2.3 搭建测试环境 三、基…

【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)

web7 1 阿呆得到最高指示&#xff0c;如果还出问题&#xff0c;就卷铺盖滚蛋&#xff0c;阿呆心在流血。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…

宿舍管理系统代码详解(操作界面)

目录 一、前端代码 1.样式展示 2.代码详解 <1>主页面列表部分 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <2>新增页面 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <3>修改页面…

C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现

string&#xff08;上&#xff09;&#xff1a;C初阶学习第六弹——探索STL奥秘&#xff08;一&#xff09;——标准库中的string类-CSDN博客 string&#xff08;下&#xff09;&#xff1a;C初阶学习第七弹——探索STL奥秘&#xff08;二&#xff09;——string的模拟实现-CS…