From Vimscript to Lua in Neovim


Neovim:从 Vimscript 到 Lua

本文简要介绍如何在 neovim 中使用 lua 来代替 vimscript。

why or why not lua

  1. 相比 vimscript,lua 有更好的工具支持,包括 lsp 和 formatter(vimscript 没有格式化工具是最大的痛点)。
  2. 代码量庞大的情况下 lua 比 vimscript 更有优势。
  3. 写 neovim 配置文件时,vimscript 在自动补全方面更强(lua 的全局变量 vim 默认情况下不被 lsp 识别,因此后续的补全无法进行。这一点或许可以通过配置 lsp 解决。)。
  4. lua 的配置仅适用于 neovim, vim 无法使用。

依赖

  1. neovim 的版本必须在 0.5 以上。
  2. 编译 neovim 时使用的 lua 版本必须是 luajit(具体版本需与 neovim 版本对应)。一般直接下载的编译好的 neovim 都是使用 luajit 的,但是在 gentoo 中需要手动设置 USE FLAG lua_single_target_luajit

包管理器

使用packer.nvim代替原来的包管理器。

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

~/.config/nvim/lua/plugins.lua中写插件的配置。以下是一个示例,use之后的很明显是插件,config中是对packer.nvim的配置。如果不需要更改配置,则按示例填入即可,注意先把其他插件删除,只留下第一个。

vim.cmd [[packadd packer.nvim]]

return require('packer').startup({
    function()
        use 'wbthomason/packer.nvim'
        use 'vim-airline/vim-airline'
        use 'vim-airline/vim-airline-themes'
        use 'enricobacis/vim-airline-clock'
        use 'liuchengxu/vim-which-key'
        use 'voldikss/vim-floaterm'
        use 'tpope/vim-surround'
        use {'neoclide/coc.nvim', branch = 'release'}
        use 'euclio/vim-markdown-composer'
        use 'simnalamburt/vim-mundo'
        use 'lambdalisue/suda.vim'
        use 'hardcoreplayers/dashboard-nvim'
        use 'ryanoasis/vim-devicons'
        use 'voldikss/vim-codelf'
        use 'RRethy/vim-illuminate'
        use 'kshenoy/vim-signature'
        use 'tpope/vim-repeat'
        use 'sheerun/vim-polyglot'
        use 'terryma/vim-smooth-scroll'
        use 'liuchengxu/vista.vim'
        use 'vhda/verilog_systemverilog.vim'
        use 'easymotion/vim-easymotion'
        use 'Yggdroot/indentLine'
        use 'honza/vim-snippets'
        use 'lilydjwg/fcitx.vim'
        use 'xolox/vim-misc'
        use {'cespare/vim-toml', ft = 'toml'}
        use {'liuchengxu/vim-clap', run = ':Clap install-binary'}
        use {'Yggdroot/LeaderF', run = ':LeaderfInstallCExtension'}
        use 'preservim/nerdcommenter'
        use 'rbtnn/vim-vimscript_indentexpr'
        use 'tpope/vim-fugitive'
        use 'airblade/vim-gitgutter'
        use 'skywind3000/asynctasks.vim'
        use 'skywind3000/asyncrun.vim'
        use 'liuchengxu/space-vim-dark'
        use 'dhruvasagar/vim-zoom'
        use 'sbdchd/neoformat'
        use 'leafOfTree/vim-vue-plugin'
        use 'arzg/vim-swift'
        use 'andymass/vim-matchup'
        use 'nvim-treesitter/nvim-treesitter'
        use 'jeffkreeftmeijer/vim-numbertoggle'
        use 'bagrat/vim-buffet'
        use 'luochen1990/rainbow'
        use 'puremourning/vimspector'
        use {'sindrets/diffview.nvim', requires = 'nvim-lua/plenary.nvim'}
    end,
    config = {
        ensure_dependencies = true,
        plugin_package = 'packer',
        max_jobs = nil,
        auto_clean = true,
        compile_on_sync = true,
        disable_commands = false,
        opt_default = false,
        transitive_opt = true,
        transitive_disable = true,
        auto_reload_compiled = true,
        git = {
            cmd = 'git',
            subcommands = {
                update = 'pull --ff-only --progress --rebase=false',
                install = 'clone --depth %i --no-single-branch --progress',
                fetch = 'fetch --depth 999999 --progress',
                checkout = 'checkout %s --',
                update_branch = 'merge --ff-only @{u}',
                current_branch = 'branch --show-current',
                diff = 'log --color=never --pretty=format:FMT --no-show-signature HEAD@{1}...HEAD',
                diff_fmt = '%%h %%s (%%cr)',
                get_rev = 'rev-parse --short HEAD',
                get_msg = 'log --color=never --pretty=format:FMT --no-show-signature HEAD -n 1',
                submodules = 'submodule update --init --recursive --progress'
            },
            depth = 1,
            clone_timeout = 60,
            default_url_format = 'https://github.com/%s'
        },
        display = {
            non_interactive = false,
            open_fn = nil,
            open_cmd = '65vnew \\[packer\\]',
            working_sym = '⟳',
            error_sym = '✗',
            done_sym = '✓',
            removed_sym = '-',
            moved_sym = '→',
            header_sym = '━',
            show_all_info = true,
            prompt_border = 'double',
            keybindings = {
                quit = 'q',
                toggle_info = '<CR>',
                diff = 'd',
                prompt_revert = 'r'
            }
        },
        luarocks = {python_cmd = 'python'},
        log = {level = 'warn'},
        profile = {enable = false, threshold = 1}
    }
})

然后在init.vim顶部写入lua require('plugins'),即可加载plugins.lua配置文件。

如果你对 lua 配置很熟悉,可以直接用init.lua。该配置存在时init.vim会失效。

安装插件只需要在plugins.lua中写入配置,然后使用:PackerSync即可。

该命令会一次性完成安装、更新、清理、配置。

以上只是该包管理器最基本的使用,更多功能应查看github

lua 配置文件

所有lua配置文件默认应当放在~/.config/nvim/lua下。然后在init.vim中调用。

比如有一个插件叫xxx,然后可以使用配置文件~/.config/nvim/lua/plugins/Xxx.lua。注意配置文件的名称尽量与插件名不同,比如这里将首字母大写。这是因为如果插件是 lua 插件,那么该插件很可能有一个文件叫xxx.lua,一旦配置文件与该文件重名就会发生错误。

调用时只需要按路径写入即可。如lua require('plugins/Xxx')

lua 及配置学习资料

一份中文学习资料

建议掌握度较高之后再使用init.lua,一开始还是用init.vim缓冲一下,慢慢把配置从vimscript转为lua


文章作者: niuiic
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 niuiic !
评论
  目录