[Share Experiences] Deepin v20下编译安装vim9和neovim9,默认的vim和neovim版本太低
Tofloor
poster avatar
暗黑程序员
deepin
2023-05-04 01:58
Author

一、编译vim9

1、先卸载默认的vim8

sudo apt purge vim vim-*
sudo apt autoremove

2、安装编译依赖

sudo apt install lua5.3 liblua5.3-dev ruby2.5-dev python3-pip cmake gettext

3、下载源码

git clone -b v9.0.1504 https://github.com/vim/vim.git ~/Downloads/vim9

4、编译与安装

./configure --prefix=/opt/vim \
    --with-features=huge \
    --enable-multibyte \
    --enable-rubyinterp=yes \
    --enable-python3interp=yes \
    --enable-luainterp=yes \
    --enable-gui=gtk2 \
    --enable-cscope \
    --enable-fail-if-missing

make -j6
sudo make install
sudo ln -s /opt/vim/bin/vim /usr/local/bin/vim

二、编译neovim

1、下载源码

git clone -b v0.9.0 https://github.com/neovim/neovim.git ~/Downloads/neovim9

2、编译与安装

make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=/opt/neovim"
sudo make install
sudo ln -s /opt/neovim/bin/nvim /usr/local/bin/nvim

三、分享vim和nvim的配置

  • vim配置 ~/.vimrc
call plug#begin('~/.vim/plugged')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'tpope/vim-fugitive'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'jiangmiao/auto-pairs'
Plug 'easymotion/vim-easymotion'
Plug 'tpope/vim-surround'
Plug 'scrooloose/nerdcommenter'
Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'
Plug 'skywind3000/vim-terminal-help'
Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
call plug#end()

let mapleader = ','

syntax on
syntax enable
colorscheme monokai
highlight! link SignColumn LineNr

set t_Co=256
set nocompatible
set hlsearch
set incsearch
set smartcase
set ignorecase
set showmode
set showmatch
set showtabline=2
set number
set relativenumber
set scrolloff=5
set history=500
set ruler
set wrap
set shiftwidth=2
set tabstop=2
set softtabstop=2
set expandtab
set smartindent
set backspace=2
set ff=unix
set nobackup
set noswapfile
set clipboard=unnamed
set laststatus=2
set fenc=utf-8
set mouse=a
set fdm=marker
set signcolumn=yes
set updatetime=300

let NERDTreeChDirMode=1
let NERDTreeShowBookmarks=1
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']
let NERDTreeWinSize=25

let g:airline_symbols = {}
let g:airline_symbols.space = "\ua0"
let g:airline_exclude_filename = []
let g:airline_theme='angr'
let g:airline_powerline_fonts=0
let g:bufferline_echo=0
let g:Powerline_symbols='fancy'
let g:airline_powerline_fonts = 1 
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#fnametruncate = 16
let g:airline#extensions#tabline#formatter = 'unique_tail'

" ============ coc.nvim ==============>
let g:coc_global_extensions = ['coc-json', 'coc-git', 'coc-sql', 'coc-yaml', 'coc-xml', 'coc-toml', 'coc-webview', 'coc-markdownlint', 'coc-markdown-preview-enhanced', 'coc-go', 'coc-pyright', 'coc-rust-analyzer', 'coc-java']

function! CheckBackspace() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

function! ShowDocumentation()
  if CocAction('hasProvider', 'hover')
    call CocActionAsync('doHover')
  else
    call feedkeys('K', 'in')
  endif
endfunction

" ============== keymaps ===================

nnoremap tt :NERDTreeToggle
nnoremap tf :NERDTreeFind

nnoremap  :vertical resize -1
nnoremap   :vertical resize +1

nmap  gd (coc-definition)
nmap  gD (coc-type-definition)
nmap  gi (coc-implementation)
nmap  gr (coc-references)

nmap rn (coc-rename)
nmap ac (coc-codeaction-cursor)
nmap as (coc-codeaction-source)
nmap qf (coc-fix-current)

inoremap   coc#pum#visible() ? coc#pum#next(1) : CheckBackspace() ? "\" : coc#refresh()
inoremap   coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\"
inoremap  coc#pum#visible() ? coc#pum#prev(1) : "\"
nnoremap  K :call ShowDocumentation()

  • nvim配置 ~/.config/nvim/init.lua
    local home = os.getenv('HOME')
    
    -- Automatically install lazy.nvim if it does not exist
    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","https://github.com/folke/lazy.nvim.git","--branch=stable",lazypath})
    end
    vim.opt.rtp:prepend(lazypath)
    
    -- set leader space
    vim.g.mapleader = ","
    vim.g.maplocalleader = ","
    
    -- disable language provider support (lua and vimscript plugins only)
    vim.g.loaded_perl_provider = 0
    vim.g.loaded_ruby_provider = 0
    vim.g.loaded_node_provider = 0
    vim.g.loaded_python_provider = 0
    vim.g.loaded_python3_provider = 1
    
    -- disable unused stuff
    vim.g.loaded = 1
    vim.g.loaded_netrw = 1
    vim.g.loaded_netrwPlugin = 1
    vim.g.loaded_2html_plugin = 1
    vim.g.loaded_tutor_mode_plugin = 1
    vim.g.loaded_matchit = 1  -- use vim-matchup
    vim.g.loaded_matchparen = 1  -- use vim-matchup
    
    vim.g.coc_global_extensions = {
      'coc-json', 'coc-git', 'coc-sql', 'coc-yaml', 'coc-xml', 'coc-toml', 
      'coc-webview', 'coc-markdownlint', 'coc-markdown-preview-enhanced', 'coc-go', 'coc-pyright', 'coc-rust-analyzer'
    }
    
    -- basic settings
    vim.cmd('filetype plugin on')
    vim.cmd('highlight! link SignColumn LineNr')
    vim.cmd('colorscheme monokai')
    vim.g.completeopt = { "menuone", "noinsert", "noselect" }
    vim.opt_global.shortmess:remove("F")
    vim.opt.mouse = 'a' -- allow the mouse to be used in Nvim
    vim.opt.encoding = "utf-8"
    vim.opt.backspace = "indent,eol,start" -- backspace works on every char in insert mode
    vim.opt.history = 1000
    vim.opt.startofline = true
    vim.opt.clipboard = 'unnamedplus'
    vim.opt.textwidth = 80
    
    -- wait time
    -- opt.timeout = false
    vim.opt.timeoutlen = 300
    vim.opt.ttimeout = true
    vim.opt.ttimeoutlen = 100
    
    -- display
    vim.opt.showmatch  = true -- show matching brackets
    vim.opt.scrolloff = 5 -- always show 3 rows from edge of the screen
    vim.opt.synmaxcol = 300 -- stop syntax highlight after x lines for performance
    vim.opt.laststatus = 2 -- always show status line
    
    vim.opt.list = false -- do not display white characters
    vim.opt.foldenable = false
    vim.opt.foldlevel = 4 -- limit folding to 4 levels
    vim.opt.foldmethod = 'syntax' -- use language syntax to generate folds
    vim.opt.wrap = false --do not wrap lines even if very long
    vim.opt.eol = false -- show if there's no eol char
    vim.opt.showbreak= '↪' -- character to show when line is broken
    
    vim.opt.termguicolors = true
    
    -- sidebar
    vim.opt.number = true -- line number on the left
    vim.opt.relativenumber = true -- line relative number
    vim.opt.numberwidth = 3 -- always reserve 3 spaces for line number
    vim.opt.signcolumn = 'yes' -- keep 1 column for coc.vim  check
    vim.opt.updatetime = 300
    vim.opt.modelines = 0
    vim.opt.showcmd = true -- display command in bottom bar
    
    -- search
    vim.opt.incsearch = true -- starts searching as soon as typing, without enter needed
    vim.opt.ignorecase = true -- ignore letter case when searching
    vim.opt.smartcase = true -- case insentive unless capitals used in search
    
    -- backup and undo
    vim.opt.backup = true
    vim.opt.swapfile = false
    vim.opt.backupdir = home .. '/.config/nvim/.backup/'
    vim.opt.directory = home .. '/.config/nvim/.swp/'
    vim.opt.undodir = home .. '/.config/nvim/.undo/'
    vim.opt.undofile = true
    vim.opt.undolevels = 1000
    vim.opt.undoreload = 10000
    
    -- text format
    vim.opt.tabstop = 2
    vim.opt.shiftwidth = 2
    vim.opt.softtabstop = 2
    vim.opt.cindent = true
    vim.opt.autoindent = true
    vim.opt.smartindent = true
    vim.opt.expandtab = true -- expand tab to spaces
    vim.opt.smarttab = true
    
    require('lazy').setup(
      {
        { 'nvim-lua/plenary.nvim' }, -- nvim基础库
        { 'neoclide/coc.nvim', branch = 'release'}, -- 提供ide补全功能
        { 'puremourning/vimspector' }, -- 提供ide调试功能
        { 'j-hui/fidget.nvim', config = function () require('fidget').setup() end }, -- nvim-lsp进度展示
        { 'gelguy/wilder.nvim' }, -- 模糊匹配路径提示
        { 'easymotion/vim-easymotion' }, -- 快速上下文跳转
        { 'chentoast/marks.nvim', config = function () require("marks").setup() end }, -- 标记跳转
        { 'folke/which-key.nvim', config = function() require("which-key").setup() end }, -- 命令提示
        { 'skywind3000/vim-terminal-help' }, -- 终端助手
        { 'goolord/alpha-nvim', config = function () require('alpha').setup(require'alpha.themes.startify'.config) end }, -- 首屏快捷展示
        { 'tpope/vim-surround', dependencies = {'tpope/vim-commentary','tpope/vim-fugitive','tpope/vim-repeat','tpope/vim-rhubarb','tpope/vim-unimpaired','tyru/open-browser.vim','andymass/vim-matchup'}}, -- 小工具
        { 'nvim-lualine/lualine.nvim' }, -- 状态栏
        { 'nvim-tree/nvim-tree.lua', dependencies = { 'akinsho/bufferline.nvim', 'nvim-tree/nvim-web-devicons' }}, -- 侧边栏
        { 'nvim-treesitter/nvim-treesitter',  build = function() require('nvim-treesitter.install').update({ with_sync = true }) end},
        { 'nvim-telescope/telescope.nvim', branch = '0.1.x', dependencies = {'nvim-telescope/telescope-fzf-native.nvim','nvim-telescope/telescope-ui-select.nvim'}},
      }
    )
    
    -----------------------------------------------------------
    -- Define keymaps of Neovim and installed plugins.
    -----------------------------------------------------------
    
    function remap(mode, rhs, lhs, bufopts, desc)
      if bufopts == nil then
        bufopts = {}
      end
      bufopts.desc = desc
      vim.keymap.set(mode, rhs, lhs, bufopts)
    end
    
    local bufopts = { silent = true, noremap = true }
    
    -- disable search highlighting by pressing enter
    remap("n", "ch", ":nohlsearch")
    
    -- tab management
    require("which-key").register({ t = { name = "tabs" }}, { prefix = "" })
    remap("n", "tt", ":NvimTreeToggle", bufopts, "Tree List")
    remap("n", "tf", ":NvimTreeFindFile", bufopts, "Tree Find")
    
    -- window management
    remap("n", "", ":vertical resize -1", bufopts, "Minimize window")
    remap("n", "",  ":vertical resize +1", bufopts, "Maximize window")
    
    -- telescope
    require("which-key").register({ f = {name = "find"}}, { prefix = "" })
    remap("n", "ff", "Telescope find_files", bufopts, "Find file")
    remap("n", "fg", "Telescope live_grep", bufopts, "Grep")
    remap("n", "fb", "Telescope buffers", bufopts, "Find buffer")
    remap("n", "fm", "Telescope marks", bufopts, "Find mark")
    
    -- Coc
    function _G.check_back_space()
        local col = vim.fn.col('.') - 1
        return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') ~= nil
    end
    function _G.show_docs()
        local cw = vim.fn.expand('')
        if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 then
            vim.api.nvim_command('h ' .. cw)
        elseif vim.api.nvim_eval('coc#rpc#ready()') then
            vim.fn.CocActionAsync('doHover')
        else
            vim.api.nvim_command('!' .. vim.o.keywordprg .. ' ' .. cw)
        end
    end
    vim.opt.statusline:prepend("%{coc#status()}%{get(b:,'coc_current_function','')}")
    
    local opts = {silent = true, noremap = true, expr = true, replace_keycodes = false}
    vim.keymap.set("i", "", 'coc#pum#visible() ? coc#pum#next(1) : v:lua.check_back_space() ? "" : coc#refresh()', opts)
    vim.keymap.set("i", "", [[coc#pum#visible() ? coc#pum#prev(1) : "\"]], opts)
    vim.keymap.set("i", "", [[coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\"]], opts)
    vim.keymap.set("n", "gd", "(coc-definition)", {silent = true})
    vim.keymap.set("n", "gD", "(coc-type-definition)", {silent = true})
    vim.keymap.set("n", "gi", "(coc-implementation)", {silent = true})
    vim.keymap.set("n", "gr", "(coc-references)", {silent = true})
    vim.keymap.set("n", "K", 'lua _G.show_docs()', {silent = true})
    
    require("bufferline").setup({
      options = {
        numbers = "buffer_id",
        labels = "both",
        mode = "buffer"
      }
    })
    
    require("nvim-tree").setup({
      disable_netrw = true,
      hijack_netrw = true,
      view = {
        adaptive_size = true,
        float = {
          enable = true,
        },
      },
      actions = {
        open_file = {
          quit_on_open = true,
        }
      }
    })
    
    require'nvim-treesitter.configs'.setup {
      ensure_installed = {"html", "css", "vim", "lua",*", "typescript", "tsx", "java", "python", "markdown"},
      highlight = {
        enable = true,
        additional_vim_regex_highlighting = true
      },
      matchup = {
        enable = true,
      },
    }
    
    
    require('telescope').setup({
      defaults = {
        path_display = {
          shorten = {
            len = 3, exclude = {1, -1}
          },
          truncate = true
        },
        dynamic_preview_title = true,
        mappings = {
          n = {
            [''] = require('telescope.actions').delete_buffer
          },
          i = {
            [''] = require('telescope.actions').delete_buffer
          },
        },
      },
      extensions = {
        fzf = {
          fuzzy = true,                    -- false will only do exact matching
          override_generic_sorter = true,  -- override the generic sorter
          override_file_sorter = true,     -- override the file sorter
          case_mode = "smart_case",        -- or "ignore_case" or "respect_case"
                                           -- the default case_mode is "smart_case"
        },
      }
    })
    
    require('telescope').load_extension('fzf')
    require('telescope').load_extension('ui-select')
    
    require('lualine').setup {
      options = {
        theme = 'gruvbox'
      },
      sections = {
        lualine_c = { 'filename', 'g:coc_status'}
      }
    } 
    
    local wilder = require('wilder')
    
    wilder.setup({modes = {':', '/', '?'}})
    vim.api.nvim_command("silent! UpdateRemotePlugins") -- 需要载入一次py依赖 不然模糊过滤等失效
    
    wilder.set_option('use_python_remote_plugin', 0)
    
    -- 设置source
    wilder.set_option('pipeline', {
        wilder.branch(
            -- 当默认无输入时 展示15条历史记录
            {
                wilder.check(function (_, x) return vim.fn.empty(x) end),
                wilder.history(15)
            },
            -- 当输入时 展示所有匹配项(模糊匹配)
            wilder.cmdline_pipeline({
                fuzzy = 1,
                fuzzy_filter = wilder.vim_fuzzy_filter()
            }),
            -- pipeline for search
            wilder.search_pipeline()
        ),
    })
    
    -- 设置样式
    wilder.set_option('renderer', wilder.popupmenu_renderer(
        wilder.popupmenu_border_theme({
            -- 设置特定高亮
            highlights = {
                accent = "WilderAccent",
                selected_accent = "WilderSelectedAccent",
            },
            highlighter = wilder.basic_highlighter(),
            left = { ' ', wilder.popupmenu_devicons() },   -- 左侧加入icon
            right = { ' ', wilder.popupmenu_scrollbar() }, -- 右侧加入滚动条
            border = 'rounded',
            max_height = 17 -- 最大高度限制 因为要计算上下 所以17支持最多15个选项
        })
    ))
    
    
Reply Favorite View the author
All Replies
广快开饭
deepin
2023-05-04 06:47
#1

感谢分享!

kissing_heart

Reply View the author
W2J
deepin
2023-05-04 17:32
#2

感谢分享。等有空也编译一下

Reply View the author
deepinuser17
deepin
2023-05-04 18:19
#3

顺便问一下, 你是怎么加入代码的?

每次我加代码, 必须在开头和结尾加单引号. 不然, <>里面的字符就凭空消失了.

Reply View the author