在 Ubuntu 18.04 (WSL) 上配置 LazyVim

在 Ubuntu 18.04 (WSL) 上配置 LazyVim 的终极指南:解决 GLIBC 和 Tree-sitter 依赖难题

前言

在 Ubuntu 18.04 这种“古董”系统上安装现代化的 Neovim 配置(如 LazyVim)是一场噩梦。
LazyVim 要求 Neovim >= 0.10,而 Ubuntu 18.04 的apt源里只有 0.6 版本。更糟糕的是,系统底层的glibc版本仅为 2.27,导致官方的 AppImage 无法运行,最新的tree-sitter编译工具也会直接报错退出。

经过一番折腾,我总结出了一套绕过系统限制的完美方案:使用 Homebrew 管理软件包,并手动降级编译 Tree-sitter。

核心思路

  1. 放弃 apt 和 Snap:系统源太老,Snap 在 WSL 容器中常有服务连接问题。
  2. 使用 Homebrew (Linuxbrew):它自带较新的编译链,能安装最新版 Neovim 和工具。
  3. 降级 Tree-sitter-cli:这是最关键的一步,手动编译一个兼容老系统的版本。

第一步:安装 Homebrew

既然系统自带的库太老,我们就用 Homebrew 来接管软件包管理。

# 1. 安装 Homebrew/bin/bash -c"$(curl-fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"# 2. 配置环境变量 (根据安装结束时的提示,将以下内容加入 ~/.bashrc)(echo;echo'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"')>>~/.bashrceval"$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"# 3. 验证安装brew --version

第二步:安装 Neovim 及必备工具

LazyVim 依赖很多外部工具(搜索、Git 管理、LSP 环境)。使用 Brew 一键安装,避免版本不兼容。

# 安装 Neovim 以及 LazyVim 依赖的工具brewinstallneovim ripgrep fd lazygitgitgccnode# 验证 Neovim 版本 (必须 >= 0.9.0)nvim --version

第三步:解决 Tree-sitter 的 GLIBC 报错 (关键!)

这是最容易卡住的地方。LazyVim 的插件会自动下载最新版的tree-sitter-cli(v0.25+),但这个版本需要 GLIBC 2.29+ 和复杂的 C++ 依赖,在 Ubuntu 18.04 上无法运行,会导致代码没有高亮。

解决方案:使用 Rust 手动编译一个旧版本 (v0.22.6),这个版本对老系统兼容性最好。

1. 安装 Rust 环境

curl--proto'=https'--tlsv1.2 -sSf https://sh.rustup.rs|shsource"$HOME/.cargo/env"

2. 编译兼容版 Tree-sitter

# 指定安装 v0.22.6 版本cargoinstalltree-sitter-cli --version0.22.6

3. 偷梁换柱:强制 Neovim 使用我们编译的版本

为了防止 LazyVim 的包管理器 (Mason) 自动下载坏掉的新版本,我们需要建立软链接,“欺骗”Neovim。

# 1. 创建目录结构mkdir-p ~/.local/share/nvim/mason/bin# 2. 删除可能已经存在的坏文件rm-f ~/.local/share/nvim/mason/bin/tree-sitter# 3. 建立软链接 (指向 Cargo 编译的好文件)ln-sf ~/.cargo/bin/tree-sitter ~/.local/share/nvim/mason/bin/tree-sitter# 4. 验证 (确保显示 0.22.6 且不报错)~/.local/share/nvim/mason/bin/tree-sitter --version

第四步:安装 LazyVim

环境准备好后,安装 LazyVim 就很简单了。

# 1. 备份旧配置 (如果有)mv~/.config/nvim ~/.config/nvim.bakmv~/.local/share/nvim ~/.local/share/nvim.bak# 2. 克隆 LazyVim 模版gitclone https://github.com/LazyVim/starter ~/.config/nvim# 3. 移除模版的 .git 目录rm-rf ~/.config/nvim/.git

第五步:收尾工作 (Locale 和字体)

1. 修复 Locale (解决乱码/方框问题)

如果打开 Neovim 发现图标显示异常或报错Locale does not support UTF-8,执行以下命令:

# 安装语言包sudoapt-getinstall-y localessudolocale-gen en_US.UTF-8# 在 ~/.bashrc 中添加环境变量echo'export LANG=en_US.UTF-8'>>~/.bashrcecho'export LC_ALL=en_US.UTF-8'>>~/.bashrc# 使配置生效source~/.bashrc

2. 字体设置

确保你本地电脑(Windows/Mac)的终端模拟器使用的是Nerd Font(推荐 JetBrainsMono Nerd Font),否则图标会显示为乱码。


验证与完成

打开终端,输入nvim

  1. LazyVim 会自动拉取插件。
  2. 输入:TSUpdate,如果底部进度条正常走动,且没有弹出 GLIBC 错误,说明 Tree-sitter 修复成功。
  3. <Space>键,应该能看到漂亮的菜单弹出。

虽然:checkhealth可能会警告tree-sitter-cli v0.25.0 is required,但只要代码高亮正常,完全可以忽略这个警告。

至此,你已经成功在 Ubuntu 18.04 上拥有了最新、最强、最快的 Neovim 体验!

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

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

相关文章

【超全解析】前端如何优雅地判断是否为移动端?从 UA 检测到现代解决方案

【超全解析】前端如何优雅地判断是否为移动端&#xff1f;从 UA 检测到现代解决方案 在前端开发中&#xff0c;「判断当前访问设备是否为移动端」几乎是一个绕不开的问题。 无论是 响应式布局、条件渲染、跳转 H5 / PC 站点、性能优化&#xff0c;还是 埋点分析&#xff0c;都可…

Linux Kernel 4.4 `printk` 源码分析与使用详解

Linux Kernel 4.4 printk 源码分析与使用详解 参考资料&#xff1a;百问网 - UART子系统Kernel版本&#xff1a;Linux 4.4.154开发板&#xff1a;Firefly-RK3288关键文件&#xff1a;kernel/printk/printk.c, include/linux/kern_levels.h 一、printk 的基本使用与打印级别 调…

融合DWA的青蒿素优化算法(Artemisinin Optimization Algorithm, AOA)求解无人机三维动态避障路径规划附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

【课程设计/毕业设计】基于python-cnn机器学习的罗马数据集训练识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

在Windows11下编译openjdk 21

在Windows11下编译openjdk 21 下载openjdk 20作为boot jdk&#xff0c;假设我下载解压后的路径如下 D:\Downloads\jdk-20.0.2_windows-x64_bin\jdk-20.0.2首先下载Cygwin&#xff0c;因为这是在Windows中模拟UNIX&#xff0c;在安装程序界面选择要安装的包 autoconf make zip u…

5G时代下联邦学习在AI原生应用中的新机遇

5G联邦学习&#xff1a;AI原生应用的下一个爆发点 一、引言&#xff1a;AI原生应用的“数据困局”与破局之道 清晨7点&#xff0c;自动驾驶汽车在早高峰的车流中平稳行驶&#xff0c;它通过路侧单元&#xff08;RSU&#xff09;实时获取前方施工路段的临时交通灯信息&#xff0…

【四旋翼控制】基于6自由度四旋翼跟踪轨迹(利用LQR整体动作设定点控制,姿态控制和PD路径跟踪控制器Matlab仿真)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

牙齿拥挤数据集3206张yolo

牙齿拥挤数据集3206张VOCYOLO格式 数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;3206 Annotations文件夹中xml文件总计&#xff1a;3206 labels文件夹中txt文件总…

Microsoft 开发的关系型数据库管理系统(RDBMS)

SQL Server 简介 SQL Server 是由 Microsoft 开发的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;支持企业级数据管理、分析和应用开发。其核心功能包括数据存储、事务处理、商业智能&#xff08;BI&#xff09;和高可用性解决方案。 SQL Server 版本 企业…

Java进阶知识-反射

获取Class对象 有三种方式获取Class对象&#xff1a;根据类的完整包名获取Class Class clazz Class.forName(“com.example.xjp.demo.reflect.PersonInfo”);根据类名直接获取Class Class clazz PersonInfo.class;根据实例类的对象获取Class PersonInfo personInfo new Pers…

Gemini认证疑难解答会

Gemini认证疑难解答会通常是指围绕Google推出的Gemini大模型系列在使用、集成或开发过程中遇到的技术问题进行讨论与解决的会议或交流活动。这类会议可能由开发者社区、企业技术团队或Google官方组织&#xff0c;旨在帮助用户更好地理解Gemini API的认证机制、权限配置、访问控…

Django 视图基础

Django 视图基础Django 视图是处理用户请求并返回响应的核心组件。视图可以是函数或类&#xff0c;通常定义在 views.py 文件中。函数视图示例&#xff1a;from django.http import HttpResponsedef hello_world(request):return HttpResponse("Hello, World!")类视图…

Java 进阶:异常影响性能吗?

Java 进阶异常影响性能吗 catch 中不做任何事情catch 中输出异常到日志catch 中获取异常栈总结 Java 进阶&#xff1a;异常影响性能吗&#xff1f; 曾经在给一个业务系统增加限流功能&#xff0c;使用的限流组件在流量超过阈值时&#xff0c;会直接抛异常&#xff0c;异常导…

【Qt改变虚拟键盘的大小】

默认情况下qtvirtualkeyboard占据了半个屏幕 可以通过修改源码的方式来修改其大小。 1.找到desktopinputpanel.cpp,参考路径 2.修改show函数注释的代码为源文件原来的代码。 3.键盘样式修改需要修改对应的qml文件&#xff0c;路径为qtvirtualkeyboard/src/virtualkeyboard/cont…

java进阶训练营 极客,关于架构极客大学java进阶训练营

C语言中&#xff0c; 数组[2]属于结构数据类型。一个数组能够合成为多个数组元素&#xff0c;这些数组元素能够是根本数据类型或是构造类型。因而按数组元素的类型不同&#xff0c;数组又可分为数值数组、字符数组、指针数组、构造数组等各种类别。 对于可变长数组(VLA)的问题&…

Java进阶整理

对于一个程序员不能只是停留在满足平常的业务开发的水平&#xff0c;所以今天来整理一下Java的进阶知识。 通过以下几个方面来讲一讲Java的进阶知识&#xff1a; Jvm Jvm结构类加载对象的分配过程 、对象存储布局Java的内存模型、GC&#xff08;MinorGC&#xff08;新生代&a…

java头歌-数组进阶

第一关 public static void main(String[] args) {//动态构建arr1int[] arr1 new int[3];Scanner sc new Scanner(System.in);for(int i 0 ; i< arr1.length ; i){arr1[i] sc.nextInt();}/********** Begin **********///创建数组arr2int[] arr2 new int[3];for (int i…

java进阶知识点

java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达&#xff0c;将一些事情整好了反过来传给需要用到的地方~ 这样做得好处&#xff1a;做到了单一职责&#xff0c;并且提高了复用性&#xff0c;解耦了之后&#xff0c;任你如何实现&#xf…

破解空间困局:看紧凑型ARM工控机如何一机多能

在智能工厂的角落、自动化产线的缝隙、或是移动设备的内部&#xff0c;工程师们常常面临一个经典难题&#xff1a;空间极其有限&#xff0c;但需要连接和控制的设备却一点不少。 摄像头、传感器、PLC、扫码枪、显示屏、机械臂……每一个都需要一个“对话”的接口。传统的工控机…

Java基础进阶-水仙花数

/* 功能&#xff1a;求水仙花数&#xff0c;打印并统计总个数。 思路&#xff1a; 水仙花数是定义范围100-999&#xff0c;满足每个位上的数子的3次方相加和等于这个数 第一步&#xff1a;循环遍历数据范围 第二步&#xff1b;取出当前数字的个位&#xff0c;十位&#xff0c;百…