秋澪冬安 秋澪冬安
🏠 主页
  • 🌐 网站
  • 📦 资源
  • 📝 教程
  • 📐 制表符
  • 🗃️ 分类
  • 🏷️ 标签
  • 🗄️ 归档
  • 原神祈愿记录 (opens new window)
📃 博客日志
ℹ️ 关于

秋澪冬安

风带来故事的种子,时间使之发芽
🏠 主页
  • 🌐 网站
  • 📦 资源
  • 📝 教程
  • 📐 制表符
  • 🗃️ 分类
  • 🏷️ 标签
  • 🗄️ 归档
  • 原神祈愿记录 (opens new window)
📃 博客日志
ℹ️ 关于
  • 技术文档

  • 技术教程

    • 使用fluxion钓鱼获得wifi密码
    • 使用iPerf3测内网的网速
    • Windows配置Java环境变量
    • 使用qBittorrent完成自动追番功能
    • 解决Linux系统下挂载NTFS文件系统硬盘后权限777的问题并配置自动挂载
    • Ubuntu 搭建SMB服务
    • 从零开始配置Neovim
      • 1 安装
      • 2 配置 neovim
      • 3 安装插件管理器
      • 4 安装插件
      • 5 写在最后
  • Git工具

  • Nodejs

  • Linux安全

  • 技术
  • 技术教程
2023-07-19
目录

从零开始配置Neovim

# 1 安装

以 Ubuntu 操作系统为例,执行一下命令安装:

apt install neovim

安装完成后,在 .config 文件夹中创建 nvim 文件夹:

mkdir -p .config/nvim

然后进入 .config/nvim 文件夹中,创建 init.lua 文件:

touch init.lua

写这篇文章的时候,我的 neovim 版本是 0.9.1

# 2 配置 neovim

我们采用模块化的方式来配置 neovim ,所以还需要新建一些文件夹和文件,在 nvim 文件夹中依次执行下面的命令:

mkdir lua && cd lua
mkdir core && cd core
touch options.lua

上面的命令创建了一个 options.lua 文件,在这个文件里面配置选项功能:

local opt = vim.opt

-- 行号
opt.relativenumber = true
opt.number = true

-- 缩进
opt.tabstop = 2
opt.shiftwidth = 2
opt.expandtab = true
opt.autoindent = true

-- 防止包裹
opt.wrap = false

-- 光标行
opt.cursorline = true

-- 启用鼠标
opt.mouse:append("a")

-- 系统剪切板
opt.clipboard:append("unnamedplus")

-- 默认新窗口右和下
opt.splitright = true
opt.splitbelow = true

-- 搜索 区分大小写
opt.ignorecase = true
opt.smartcase = true

-- 外观
opt.termguicolors = true
opt.signcolumn = "yes"

接下来是改键,在 options.lua 同级目录下创建文件 keymaps.lua :

touch keymaps.lua

在 keymaps.lua 文件中配置改键:

vim.g.mapleader = " "

local keymap = vim.keymap

-- ---------- 视觉模式 ---------- --
-- 当行或多行移动
keymap.set("v", "J", ":m '>+1<CR>gv=gv")
keymap.set("v", "K", ":m '<-2<CR>gv=gv")

-- ---------- 正常模式 ---------- --
-- 窗口
keymap.set("n", "<leader>sv", "<C-w>v") -- 水平新增窗口 
keymap.set("n", "<leader>sh", "<C-w>s") -- 垂直新增窗口

-- 取消高亮
keymap.set("n", "<leader>nh", ":nohl<CR>")

最后,在 init.lua 文件中写入:

require("core.options")
require("core.keymaps")

# 3 安装插件管理器

在 .config/nvim 文件夹中创建一个 plugins 文件夹:

mkdir ~/.config/nvim/plugins

然后创建一个 plugins-setup.lua 文件:

touch ~/.config/nvim/plugins/plugins-setup.lua

打开 packer (opens new window) 仓库,复制 Bootstrapping 下面的所有代码到 plugins-setup.lua 文件中

然后在 local packer_bootstrap = ensure_packer() 这行代码的下方添加一段代码,使得保存 plugins-setup.lua 文件之后能够自动同步:

-- 保存此文件自动更新安装软件
-- 注意PackerCompile改成了PackerSync
-- plugins.lua改成了plugins-setup.lua,适应本地文件名字
vim.cmd([[
  augroup packer_user_config
    autocmd!
    autocmd BufWritePost plugins-setup.lua source <afile> | PackerSync
  augroup end
]])

最后在 init.lua 文件中写入 require("plugins.plugins-setup") :

require("plugins.plugins-setup")

require("core.options")
require("core.keymaps")

# 4 安装插件

# 4.1 主题

这里我安装的主题是 one dark pro (opens new window) ,可根据自己喜好安装其它主题。

首先打开 plugins-setup.lua 文件,在如下的位置添加一行代码:

use 'olimorris/onedarkpro.nvim'

修改位置及结果:

return require('packer').startup(function(use)
  use 'wbthomason/packer.nvim'
  use 'olimorris/onedarkpro.nvim'
  if packer_bootstrap then
    require('packer').sync()
  end
end)

然后打开 options.lua 文件,在末尾添加一行代码:

vim.cmd("colorscheme onedark")

# 4.2 底部状态栏

安装的是 lualine (opens new window) 。

打开 plugins-setup.lua 文件,在如下的位置添加几行代码:

use {
  'nvim-lualine/lualine.nvim',
  requires = { 'nvim-tree/nvim-web-devicons', opt = true }
}

修改位置及结果:

return require('packer').startup(function(use)
  use 'wbthomason/packer.nvim'
  use 'olimorris/onedarkpro.nvim'
  use {
    'nvim-lualine/lualine.nvim',
    requires = { 'nvim-tree/nvim-web-devicons', opt = true }
  }
  if packer_bootstrap then
    require('packer').sync()
  end
end)

在 .config/nvim/plugins 文件夹中创建 lualine.lua 文件:

require('lualine').setup({
  options = {
    theme = 'onedark'
  }
})

在 init.lua 文件中添加一行代码 require("plugins.lualine") :

require("plugins.plugins-setup")

require("core.options")
require("core.keymaps")

-- 插件
require("plugins.lualine")

# 4.3 文档树和窗口切换

安装的是 nvim-tree (opens new window) 和 vim-tmux-navigator (opens new window) 。

打开 plugins-setup.lua 文件,如上面安装插件一样,在相同的位置,新增几行代码:

use {
  'nvim-tree/nvim-tree.lua',
  requires = {
    'nvim-tree/nvim-web-devicons', -- optional
  },
}
use "christoomey/vim-tmux-navigator" -- 用ctl-hjkl来定位窗口

在 .config/nvim/plugins 文件夹中创建 nvim-tree.lua 文件:

-- 默认不开启nvim-tree
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

require("nvim-tree").setup()

在 init.lua 文件中添加一行代码 require("plugins.nvim-tree") :

require("plugins.plugins-setup")

require("core.options")
require("core.keymaps")

-- 插件
require("plugins.lualine")
require("plugins.nvim-tree")

# 4.4 语法高亮和彩色括号

安装的是 nvim-treesitter (opens new window) 和 nvim-ts-rainbow (opens new window) 。

依旧是打开 plugins-setup.lua 文件,新增几行代码:

use "nvim-treesitter/nvim-treesitter" -- 语法高亮
use "p00f/nvim-ts-rainbow" -- 配合treesitter,不同括号颜色区分

在 .config/nvim/plugins 文件夹中创建 treesitter.lua 文件:

require'nvim-treesitter.configs'.setup {
  -- 添加不同语言
  ensure_installed = { "vim", "bash", "c", "cpp", "javascript", "json", "lua", "python", "typescript", "tsx", "css", "rust", "markdown", "markdown_inline" }, -- one of "all" or a list of languages

  highlight = { enable = true },
  indent = { enable = true },

  -- 不同括号颜色区分
  rainbow = {
    enable = true,
    extended_mode = true,
    max_file_lines = nil,
  }
}

在 init.lua 文件中添加一行代码 require("plugins/treesitter") :

require("plugins.plugins-setup")

require("core.options")
require("core.keymaps")

-- 插件
require("plugins.lualine")
require("plugins.nvim-tree")
require("plugins/treesitter")

# 4.5 LSP和自动补全

照葫芦画瓢,不多赘述了,首先是 plugins-setup.lua 文件要加的代码:

use {
  "williamboman/mason.nvim",
  "williamboman/mason-lspconfig.nvim",  -- 这个相当于mason.nvim和lspconfig的桥梁
  "neovim/nvim-lspconfig"
}
-- 自动补全
use "hrsh7th/nvim-cmp"
use "hrsh7th/cmp-nvim-lsp"
use "L3MON4D3/LuaSnip" -- snippets引擎,不装这个自动补全会出问题
use "saadparwaiz1/cmp_luasnip"
use "rafamadriz/friendly-snippets"
use "hrsh7th/cmp-path" -- 文件路径

然后在 .config/nvim/plugins 文件夹中创建 lsp.lua 文件:

require("mason").setup({
  ui = {
    icons = {
      package_installed = "✓",
      package_pending = "➜",
      package_uninstalled = "✗"
    }
  }
})

require("mason-lspconfig").setup({
  -- 确保安装,根据需要填写
  ensure_installed = {
    "lua_ls",
  },
})

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

require("lspconfig").lua_ls.setup {
  capabilities = capabilities,
}

在 .config/nvim/plugins 文件夹中创建 cmp.lua 文件:

local cmp_status_ok, cmp = pcall(require, "cmp")
if not cmp_status_ok then
  return
end

local snip_status_ok, luasnip = pcall(require, "luasnip")
if not snip_status_ok then
  return
end

require("luasnip.loaders.from_vscode").lazy_load()

-- 下面会用到这个函数
local check_backspace = function()
  local col = vim.fn.col "." - 1
  return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
end


cmp.setup({
  snippet = {
    expand = function(args)
      require('luasnip').lsp_expand(args.body)
    end,
  },
  mapping = cmp.mapping.preset.insert({
    ['<C-b>'] = cmp.mapping.scroll_docs(-4),
    ['<C-f>'] = cmp.mapping.scroll_docs(4),
    ['<C-e>'] = cmp.mapping.abort(),  -- 取消补全,esc也可以退出
    ['<CR>'] = cmp.mapping.confirm({ select = true }),

    ["<Tab>"] = cmp.mapping(function(fallback)
      if cmp.visible() then
        cmp.select_next_item()
      elseif luasnip.expandable() then
        luasnip.expand()
      elseif luasnip.expand_or_jumpable() then
        luasnip.expand_or_jump()
      elseif check_backspace() then
        fallback()
      else
        fallback()
      end
    end, {
      "i",
      "s",
    }),

    ["<S-Tab>"] = cmp.mapping(function(fallback)
      if cmp.visible() then
        cmp.select_prev_item()
      elseif luasnip.jumpable(-1) then
        luasnip.jump(-1)
      else
        fallback()
      end
    end, {
      "i",
      "s",
    }),
  }),

  -- 这里重要
  sources = cmp.config.sources({
    { name = 'nvim_lsp' },
    { name = 'luasnip' },
    { name = 'path' },
  }, {
    { name = 'buffer' },
  })
})

最后在 init.lua 文件中添加代码:

require("plugins/lsp")
require("plugins/cmp")

# 4.6 快速注释和自动补全括号

同样在 plugins-setup.lua 文件添加代码:

use "numToStr/Comment.nvim" -- gcc和gc注释
use "windwp/nvim-autopairs" -- 自动补全括号

在 .config/nvim/plugins 文件夹中创建 comment.lua 文件:

require('Comment').setup()

然后在 .config/nvim/plugins 文件夹中创建 autopairs.lua 文件:

local npairs_ok, npairs = pcall(require, "nvim-autopairs")
if not npairs_ok then
  return
end

npairs.setup {
  check_ts = true,
  ts_config = {
    lua = { "string", "source" },
    javascript = { "string", "template_string" },
  },
  fast_wrap = {
    map = '<M-e>',
    chars = { '{', '[', '(', '"', "'" },
    pattern = [=[[%'%"%)%>%]%)%}%,]]=],
    end_key = '$',
    keys = 'qwertyuiopzxcvbnmasdfghjkl',
    check_comma = true,
    highlight = 'Search',
    highlight_grey='Comment'
  },
}

-- 配置这个使得自动补全会把括号带上

local cmp_autopairs = require "nvim-autopairs.completion.cmp"
local cmp_status_ok, cmp = pcall(require, "cmp")
if not cmp_status_ok then
  return
end
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done { map_char = { tex = "" } })

在 init.lua 文件中添加代码:

require("plugins/comment")
require("plugins/autopairs")

# 4.7 其它一些插件

摆烂了,因为写到这儿我发现有一个开箱即用的 lunarvim (opens new window) ,不用这么麻烦的去配置,但是我觉得还是要写完,所以接下来的插件我将一笔带过。

安装的几个插件分别是:git提示插件、类似 VSCode 那样的打开的文件选项卡插件和文件搜索插件。

plugins-setup.lua 文件:

  use "akinsho/bufferline.nvim" -- buffer分割线
  use "lewis6991/gitsigns.nvim" -- 左则git提示
  use {
    'nvim-telescope/telescope.nvim', tag = '0.1.1',  -- 文件检索
    requires = { {'nvim-lua/plenary.nvim'} }
  }

在 .config/nvim/plugins 文件夹中创建 bufferline.lua 文件:

vim.opt.termguicolors = true

require("bufferline").setup {
    options = {
        -- 使用 nvim 内置lsp
        diagnostics = "nvim_lsp",
        -- 左侧让出 nvim-tree 的位置
        offsets = {{
            filetype = "NvimTree",
            text = "File Explorer",
            highlight = "Directory",
            text_align = "left"
        }}
    }
}

在 .config/nvim/plugins 文件夹中创建 gitsigns.lua 文件:

require('gitsigns').setup {
  signs = {
    add = { text = '+' },
    change = { text = '~' },
    delete = { text = '_' },
    topdelete = { text = '‾' },
    changedelete = { text = '~' },
  },
}

在 .config/nvim/plugins 文件夹中创建 telescope.lua 文件:

local builtin = require('telescope.builtin')

-- 进入telescope页面会是插入模式,回到正常模式就可以用j和k来移动了

vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.live_grep, {})  -- 环境里要安装ripgrep
vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})

最后在 init.lua 文件中添加代码:

require("plugins/bufferline")
require("plugins/gitsigns")
require("plugins/telescope")

改键:

编辑 keymaps.lua 文件,添加两行配置:

-- 切换buffer
keymap.set("n", "<C-L>", ":bnext<CR>")
keymap.set("n", "<C-H>", ":bprevious<CR>")

修改的是,切换打开的文件选项卡的快捷键,使用 ctrl + shift + h 和 ctrl + shift + l ,但是我这里试着没效果,不想搞了,摆烂。

# 5 写在最后

这篇文章是跟着B站up主技术蛋老师 (opens new window)的视频【全程讲解】Neovim从零配置成属于你的个人编辑器 (opens new window) 来写的,配置基本上都是照抄的,相当于是看着视频做了个笔记。

不过说实话,折腾下来太麻烦了 (;′⌒`) ,但是秉着写都写了的原则,还是跟着视频配置了一遍。

#neovim
上次编辑: 2023/07/19, 22:19:05

← Ubuntu 搭建SMB服务 Git配置ssh链接远程仓库→

最近更新
01
Linux安全-SSH安全
09-28
02
Nginx 反向代理路径问题
08-06
03
Linux安全-防爆破
03-07
更多文章>
Theme by Vdoing | Copyright © 2020-2023 秋澪冬安 | 蜀ICP备2022009760号-1 | 川公网安备51012402000786号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式