GithubHelp home page GithubHelp logo

nshen / learn-neovim-lua Goto Github PK

View Code? Open in Web Editor NEW
1.1K 22.0 197.0 12.34 MB

Neovim 配置实战:从 0 到 1 打造自己的 IDE

License: MIT License

Lua 100.00%
nvim neovim vimrc learn-vim learning-by-doing vim lua

learn-neovim-lua's Introduction

📜 Neovim 配置实战:从 0 到 1 打造自己的 IDE

《学习 Neovim 全 lua 配置》已经在稀土掘金专业编辑的指点下完全重写。

新名字是:《Neovim 配置实战:从 0 到 1 打造自己的 IDE》

好消息是新版本由掘金专业把关,目录经过了优化,解释也更加详细,所有动图都重新截取了。

内容翻新的同时代码也进行了比较大幅的改动,文章质量肯定更高了。

坏消息是变成了收费小册了,但价格不高,掘金常年打折,如没折扣可联系我索取作者专属 7 折的折扣码。

更新一下分支说明

  • bak 分支是最早期还没有小册时候的旧版备份已经过期,不建议参考
  • main 分支是小册的版本,为保持小册内容稳定已在 plugins.lua 中锁定了插件版本,是小册的对应源码
  • v2 分支是小册完成后,插件更新对应配置的持续修改,如果取消了main分支插件版本锁定,建议对应此分支更新配置。
  • 随着 v2 分支改动越来越多,我创建了全新项目 InsisVim,欢迎大佬们一起参与提 PR

新版购买链接

Neovim 配置实战:从 0 到 1 打造自己的 IDE

第一次写收费小册,希望大家能够少喝一杯咖啡,十几块钱支持一下。

下边是掘金小册介绍:

0a0f17793e35487d939955ce1ddc1ba5_tplv-k3u1fbpfcp-watermark

由于近来 VSCode 越来越臃肿,已经逐渐脱离了其高性能、轻量级的定位。而随着 Neovim 0.5+ 版本的发布,内置 LSP 的支持,让 Lua  成了编辑器的一等语言,使得古老的 VIM 编辑器变得更加现代化了。

加上这些年 Windows 系统的快速发展 ,WSL2 、Windows Terminal 的推出,Windows 命令行也有了 UTF8、GPU 加速文本渲染引擎的支持,使我们有能力,也有理由转到更加轻便高效、面向未来的 Neovim 编辑器上做程序开发,提升开发效率。

如果你在 Google 上搜索 "Years of Vim" ,会看到很多高手都已经用 VIM 编辑器 10 年以上了,他们都会一直维护一个属于自己独一无二的配置,彼此各不相同,通过不断地调教,使之越来越适合自己,达到了“人剑合一”的境界。

学会调教  Neovim  在程序开发生涯中是非常有意义的一件事,让编辑器适配你的习惯,而不是无限地追赶编辑器的更新,也是成为“10 倍速程序员”必经之路。

这里展示一下学完本小册后,大致的配置效果:

features2

从 VSCode 转移到 Neovim 时 ,我也看了很多文档,参考了很多配置资料,尝试了很多插件,走了很多弯路,最终我对 Neovim 的配置已经完全可以满足我对代码编辑器的需求了。我把配置方法写成小册,通过对这个小册的学习,你也可以把 Neovim  配置成你希望的样子,也许跟我的完全不同。

小册分为 基建篇代码篇

基建篇 中,我们会先从安装 Neovim 开始,介绍配置文件位置,以及我们应该如何组织配置文件、快捷键如何设置、插件如何安装和管理。然后通过逐个介绍目前流行的插件安装方式和使用方法来补全文本编辑器所需的所有功能。

基建篇完成后,你将会得到一个现代化的文本编辑器。

代码篇 中,我们会补全程序开发相关的功能,包括如何实现代码高亮、什么是内置 LSP、如何配置内置 LSP、代码如何补全 代码格式化、UI 可否美化等。之后还会专门针对前端开发和 rust 开发所必备的插件配置介绍,一步一步帮助你将手中的 Neovim 装配成 VSCode 般的开发环境。

xmind.png

你会学到什么?

本小册包含大量动图演示,章节相对独立,参照配置每完成一章,即可立刻看到反馈效果。总的来说,你将收获:

  • 基于最新版本的 Neovim ,从零开始基于 Lua 搭建现代化 Neovim 开发环境。
  • 了解 Neovim 的配置原理与思路,以及完整的配套源码。
  • 最重要的是你会得到属于你的专属 Neovim 版本。

0-2.png

适宜人群

  • 适合有一点 VIM 基础的使用者(至少知道怎么编辑文件和退出 VIM 😁)。
  • 有程序开发基础,有可以访问 Github 的网络环境,想要提升开发效率与开发体验的程序开发人员。
  • 想要系统学习 Neovim 配置,却被网上零散过时的 VIM 配置教程困扰的同学们。

learn-neovim-lua's People

Contributors

nshen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

learn-neovim-lua's Issues

可以请教下如何设置 pyright LSP吗

非常感谢分享nvim lua的设置,很多资料看的是一头雾水。

我按照你在知乎上分享的步骤一路走下来,现在打算配置一下 pyright 的lsp
我创建了 lua/lsp/pyrght.lua, 文件的内容是从 nvim-lspconfig 那里抄来的

require'lspconfig'.pyright.setup{}

然后我在setup.lua下添加了这个配置,现在这个文件是这样的:

setup.lua
local lsp_installer = require "nvim-lsp-installer"
-- 安装列表
-- https://github.com/williamboman/nvim-lsp-installer#available-lsps
-- { key: 语言 value: 配置文件 }
local servers = {
    sumneko_lua = require "lsp.lua", -- /lua/lsp/lua.lua
    rust_analyzer = require "lsp.rust",
    pyright = require "lsp.pyright",
  }
  
  -- 自动安装 LanguageServers
  for name, _ in pairs(servers) do
    local server_is_found, server = lsp_installer.get_server(name)
    if server_is_found then
      if not server:is_installed() then
        print("Installing " .. name)
        server:install()
      end
    end
end

lsp_installer.on_server_ready(function(server)
    local opts = servers[server.name]
    if opts then
      opts.on_attach = function(_, bufnr)
        local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
        -- local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
        -- 绑定快捷键
        require('keybinds').maplsp(buf_set_keymap)
      end
      opts.flags = {
        debounce_text_changes = 150,
      }
      server:setup(opts)
    end
  end)

这样子启动之后可以正常实现报错和补全,但是初次启动的时候一直有一个报错如下:
image

请问这个报错有什么办法可以判决吗

快捷键绑定<C-h>失效

当我尝试将bufferline的标签左右切换改为和时,只有C-l生效,C-h在终端里好像默认被解释为delete,请问你有碰到这个问题吗,是如何解决的呢?感谢~

配置 Lua 快捷键绑定问题

您好。进行到 LSP 基础配置的部分,修改 lua/lsp/setup.lua,添加快捷键绑定的程序块,会出现:

attempt to index local 'opts' (a boolean value) 的提示。可能是哪里的问题?

谢谢!

咨询下

大佬,neovim最新版支持client/server模式么,像emacs --daemon / emacsclient

/.config/nvim/lua/lsp/cmp.lua:55: attempt to index field 'preset' (a nil value)

当打开nvim的时候,出现了这样的错误,作者有什么建议吗?

Error detected while processing /home/lzg/.config/nvim/init.lua: E5113: Error while calling lua chunk: /home/lzg/.config/nvim/lua/lsp/cmp.lua:55: attempt to index field 'preset' (a nil value) stack traceback: /home/lzg/.config/nvim/lua/lsp/cmp.lua:55: in main chunk [C]: in function 'require' /home/lzg/.config/nvim/init.lua:27: in main chunk Vimspector unavailable: Requires Vim compiled with +python3 Press ENTER or type command to continue

image

treersitter/highlighter出错

问题描述
`treesitter/highligher: Error executing lua: /usr/share/nvim/runtime/lua/vim/treesitter/query.lua:161:query: invalia node'
安装结束后 打开任一个文件都会出现这提示?
感谢

设置快捷键报错

这是报错
image
这是我的init.vim文件
image
这是我的目录结构
image
这是我的keybindings文件内容,说map是nil
image
请问如何解决呢,卡了我挺久的

自动补全bug

OS: Win11
SHELL: zsh
NVIM: v0.6.1

bug描述
输入: :r !
!会很卡,经过大概 20 秒左右后会显示补全内容,但 UI 效果依旧很卡

按键绑定遇到的问题

您好 我近日参考您在知乎的教程在win10下配置neovim
在完成自动补全部分的插件安装后 我发现go xx部分的快捷键似乎有问题
我安装了sumneko_lua并尝试对lua文件复现知乎上的gif
结果在normal模式下gd可以正常在当前文件内进行跳转 而gh似乎并没有效果 并且在按完gh后按任意按键会直接替换光标对应内容

以下是我的keybindings.lua的配置内容

-- leader key 为空格
vim.g.mapleader = " "
vim.g.maplocalleader = " "

-- 本地变量
local map = vim.api.nvim_set_keymap
local opt = {
  noremap = true,
  silent = true
}

map("n", "<C-j>", "4j", opt)
map("n", "<C-k>", "4k", opt)
map("i", "<C-h>", "<ESC>I", opt)
map("i", "<C-l>", "<ESC>A", opt)

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

-- magic search
map("n", "/", "/\\v", { noremap = true , silent = false})
map("v", "/", "/\\v", { noremap = true , silent = false})

------------------------------------------------------------------

-- 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) -- close others

-- 比例控制
map("n", "s.", ":vertical resize +20<CR>", opt)
map("n", "s,", ":vertical resize -20<CR>", opt)
map("n", "s=", "<C-w>=", opt)
map("n", "sj", ":resize +10<CR>", opt)
map("n", "sk", ":resize -10<CR>", 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)

--------------------------------------------------------------------
-- 插件快捷键
-- nvimTree
map('n', '<A-m>', ':NvimTreeToggle<CR>', opt)

-- bufferline 左右Tab切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)
map("n", "<C-w>", ":bd<CR>", opt)



local pluginKeys = {}

-- lsp 回调函数快捷键设置
pluginKeys.maplsp = function(mapbuf)
  -- rename
  mapbuf('n', '<leader>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opt)
  -- code action
  mapbuf('n', '<space>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', 'go', '<cmd>lua vim.diagnostic.open_float()<CR>', opt)
  mapbuf('n', 'gp', '<cmd>lua vim.diagnostic.goto_prev()<CR>', opt)
  mapbuf('n', 'gn', '<cmd>lua vim.diagnostic.goto_next()<CR>', opt)
  -- mapbuf('n', '<leader>q', '<cmd>lua vim.diagnostic.setloclist()<CR>', opt)
  mapbuf('n', '<gk>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opt)
  -- leader + =
  mapbuf('n', '<leader>=', '<cmd>lua vim.lsp.buf.formatting()<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

-- nvim-cmp 自动补全
pluginKeys.cmp = function(cmp)
  return {
    -- 上一个
    ['<C-k>'] = cmp.mapping.select_prev_item(),
    -- 下一个
    ['<C-j>'] = cmp.mapping.select_next_item(),
    -- 出现补全
    ['<A-.>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
    -- 取消
    ['<A-,>'] = cmp.mapping({
      i = cmp.mapping.abort(),
      c = cmp.mapping.close(),
    }),
    -- 确认
    -- Accept currently selected item. If none selected, `select` first item.
    -- Set `select` to `false` to only confirm explicitly selected items.
    ['<CR>'] = cmp.mapping.confirm({
      select = true ,
      behavior = cmp.ConfirmBehavior.Replace
    }),
    -- ['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
    ['<C-u>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
    ['<C-d>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
  }
end

return pluginKeys

想请教一下大佬如何解决

ps: 我尝试将gd那行的改成

mapbuf('n', 'gd', '<cmd>lua vim.lsp.buf.hover()<CR>', opt)

结果在lua文件中还是跳转回当前文件中的定义处 似乎maplsp并没有生效?

打开neovim报错, bufferline.nvim安装失败

环境:
mac-mini m1 系统终端zsh

问题1:
在挂代理的情况下运行:PackerSync的时候akinsho/bufferline.nvim始终更新失败

问题2:
在终端运行vim命令报错(直接用的作者的仓库文件)
Error detected while processing /Users/xxx/.config/nvim/init.lua:
E5113: Error while calling lua chunk: /Users/xxx/.config/nvim/lua/autocmds.lua:1: attempt to cal
l field 'nvim_create_augroup' (a nil value)
stack traceback:
/Users/xxx/.config/nvim/lua/autocmds.lua:1: in main chunk
[C]: in function 'require'
/Users/xxx/.config/nvim/init.lua:10: in main chunk

Auto command does not enable automatic plugin update when `plugins.lua` is saved

自动命令无法实现当plugins.lua保存后自动更新插件

版本

NVIM v0.8.1
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by linuxbrew@43b3775c8372

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "
/home/linuxbrew/.linuxbrew/Cellar/neovim/0.8.1/share/nvim"

Run :checkhealth for more info

背景

将原本plugins.lua中的自动安装移除

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

新增autocmds.lua

-- 修改lua/plugins.lua 自动更新插件
autocmd("BufWritePost", {
    group = myAutoGroup,
    -- autocmd BufWritePost plugins.lua source <afile> | PackerSync
    callback = function()
        if vim.fn.expand("<afile>") == "lua/plugins.lua" then
            vim.api.nvim_command("source lua/plugins.lua")
            vim.api.nvim_command("PackerSync")
        end
    end,
})

同时在init.lua中新增

require("autocmds")

问题

自动命令无法实现当plugins.lua保存后自动更新插件

autocmds.lua

  1. 进入Terminal 自动进入插入模式
  2. 保存时自动格式化
  3. Highlight on yank
  4. 用o换行不要延续注释

均可以使用,唯独自动更新插件无法使用

问题配置

个人配置文件如下
https://github.com/uxfion/dotfiles

初步测试

将自动命令单独拎出来

local myAutoGroup = vim.api.nvim_create_augroup("myAutoGroup", {
    clear = true,
})

local autocmd = vim.api.nvim_create_autocmd
vim.notify("aaaaaaaaaaaaaaaaaaaaaaaaaa")

-- 修改lua/plugins.lua 自动更新插件
autocmd("BufWritePost", {
    group = myAutoGroup,
    -- autocmd BufWritePost plugins.lua source <afile> | PackerSync
    callback = function()
        print("bbbbbbbbbbbbbbbbbbbbbb")
        if vim.fn.expand("<afile>") == "lua/plugins.lua" then
            print("cccccccccccccccccccccc")
--            vim.api.nvim_command("source lua/plugins.lua")
            vim.api.nvim_command("PackerSync")
        end
        print("dddddddddddddddddddddd")
    end,
})

aaaaaaaaaaaaaaaaaaaaaaaaaa 正常输出
bbbbbbbbbbbbbbbbbbbbbb 正常输出
dddddddddddddddddddddd 正常输出

image

没有cccccccccccccccccccccc

if vim.fn.expand("<afile>") == "lua/plugins.lua" then判断出问题了?

attempt to call field "cmp_format" ( a nil value)

When I want open the nvim, I get this error.
This computer is ubuntu 16.04

Error detected while processing /home/auto/.config/nvim/init.lua: E5113: Error while calling lua chunk: /home/auto/.config/nvim/lua/lsp/ui.lua:117: attempt to call field 'cmp_format' (a nil value) stack traceback: /home/auto/.config/nvim/lua/lsp/ui.lua:117: in main chunk [C]: in function 'require' /home/auto/.config/nvim/lua/lsp/cmp.lua:43: in main chunk [C]: in function 'require' /home/auto/.config/nvim/init.lua:27: in main chunk Press ENTER or type command to continue

image

image

Can you give me some advise?

turn off different tab sizes for each language

-- 缩进4个空格等于一个Tab
vim.o.tabstop = 4
vim.bo.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftround = true

-- 空格替代tab
vim.o.expandtab = true
vim.bo.expandtab = true

-- 新行对齐当前行
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true

基础设置如上所示,但是发现对于不同文件类型,比如yaml,一个tab就变成了2

请问,对于所有文件,我该如何设置,才能使tab size = 4

设置keybindings 不生效

image

.config/nvim/lua/keybindings.lua 中已经设置了对应的快捷键映射。

image
init.lua 中也已经require了

但是使用 sc 这类 s 开头的命令还是会删除当前字符并改为insert模式,其他的快捷键也都不生效,例如 leader + t 打开终端也不生效。

系统是wls2 ubuntu 22.04

语法高亮不生效

nvim-treesitter 已经设置 tsinstall 已经安装 lua html 等语言
原始配置直接 clone,colorscheme 配置的是小册推荐的
checkhealth nvim-tresitter 信息如截图,没有一点思路
image

keybindings comment部分出问题

-- 代码注释插件
pluginKeys.comment = {
...,
opleader = {
line = "gc",
--bock = "gb",
block = "gb", -- fix
},
}
-- Ctrl + /
map("n", "<C->", "gcc", { noremap = false })
-- map("v", "<C-
>", "gcc", { noremap = false })
map("v", "<C-_>", "gc", { noremap = false }) -- fix

VISUAL 模式下使用注释,多出一个c出来,导致内容突然删除并进入编辑模式
大佬,使用的时候不慌的吗,还是没用上,手动狗头[doge][doge][doge]

某个组合按键映射无反应

设置分屏窗口跳转的快捷键时,alt + h j l 也就是左右下这三个都能生效,但是alt + k没有反应
排查了没有冲突的键位,下面的leader + k也可以生效
这让我百思不得其解,不知道有没有什么方法来解决这个问题
image

trouble插件的配置解耦问题

我看plugins.lua和trouble本身的说明 都是说
在packer下直接设置config = ....

这种情况下如何解耦到单独创建plugin-config目录下的单独配置文件呢。

不是很会lua和其他的内部原理。。 可能有点偏执,求指教。

期待更新!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.