当前位置: 首页 > news >正文

语法高亮不够漂亮?这里有你想要的 Rouge 主题

写了那么久的代码,找到了满意的代码着色风格吗?想必文本编辑器的代码着色风格你已经找到了中意的了,那么你在网上 post 上去的代码呢?

Rouge 是一款基于 Ruby 的语法高亮工具,能为你的代码生成漂亮的语法高亮样式。本文将介绍如何使用它,并为大家提供它默认的语法高亮样式预览。


在 Jekyll 中使用 Rouge 语法高亮插件

Jekyll 中的 __config.yml 文件记录了 Jekyll 的最核心配置。其中,markdown 字段的值表示使用哪一款插件来将 Markdown 文本转换为 HTML 页面结构。

GitHub 推荐使用的 Jekyll 的 Markdown 插件为 kramdown。kramdown 是一个强大且高性能的文本转换引擎,你可以通过阅读 kramdown 和 markdown 较大的差异比较 - Hom 了解 kramdown 的强大之处。

不过,我们现在关系的是它可以使用的语法高亮工具 —— Rouge。在 Jekyll 的配置文件中这样配置它们:

markdown: kramdown
kramdown:
  input: GFM
  syntax_highlighter: rouge

其中,input: GFM 指的是 GitHub Flavored Markdown Spec。

Rouge 支持的语言可以前往此处查看:Rouge

生成 Rouge 语法高亮样式

当然,以上配置只是告诉 kramdown 转换引擎在转换 Markdown 为 HTML 的时候,使用 rouge 格式的样式(具体只语法高亮所用的 css 的 class)。我们需要另外使用 rougify 工具生成对应的样式文件才行。

你需要先配好 Ruby 环境。如果没有配好,推荐阅读 快速在 Windows 上搭建 Jekyll 开发环境 快速配置。

随后,你便可以使用命令来安装 Rouge。

$ gem install rouge

安装之后,使用以下命令查看自带的样式有哪些:

$ rougify help style

随后得到的输出中可以得知样式有很多种。

usage: rougify style [<theme-name>] [<options>]

Print CSS styles for the given theme.  Extra options are
passed to the theme.  Theme defaults to thankful_eyes.

options:
  --scope       (default: .highlight) a css selector to scope by

available themes:
  base16, base16.dark, base16.light, base16.monokai, base16.monokai.dark, base16.monokai.light, base16.solarized, base16.solarized.dark, base16.solarized.light, colorful, github, gruvbox, gruvbox.dark, gruvbox.light, igorpro, molokai, monokai, monokai.sublime, thankful_eyes, tulip

使用以下命令生成一个 github 风格的样式到 assets/css/syntax.css 文件中:

$ rougify style github > assets/css/syntax.css

别忘了在你的 <head> 中把这份 css 文件加进去哦!

{% raw %}

<link rel="stylesheet" href="{{ "/assets/css/syntax.css" | prepend: site.baseurl }}">

{% endraw %}

Rouge 自带语法高亮主题预览

虽然 Rouge 自带了很多种不同的语法高亮样式,但都没有办法直接看到语法高亮的效果。于是我尝试了一些,并贴出了我的 C# 代码在 Rouge 自带语法高亮主题下的效果。

一般来说很难找到一种语法高亮适用于各种语言,所以选择的时候推荐选一个差不多的,然后再慢慢改。

以下每张图片的后面都标注了这种风格主题再 rouge 中的名称,使用上一节中提到的命令可以生成语法高亮样式。

github
▲ github 需要额外设置前景色 #24292e

colorful
▲ colorful

monokai.sublime
▲ monokai.sublime

tulip
▲ tulip

thankful_eyes
▲ thankful_eyes

monokai
▲ monokai

molokai
▲ molokai

igorpro
▲ igorpro

gruvbox.dark
▲ gruvbox.dark

gruvbox
▲ gruvbox

base16
▲ base16

我修改的样式

我发现我以前的样式与 monokai.sublime 是很接近的。这应该算是巧合,因为此前我是仿我的 VSCode 主题 One Dark Pro Vivid。

既然如此,我就直接基于 monokai.sublime 修改好了。我将默认文字颜色从白色 #ffffff 改成了 #bbbbbb,然后将 diff 的颜色也修改成 monokai 的样式。

在这里插入图片描述

点击下载 syntax.monokai.sublime.css


参考资料

  • Plugins - Jekyll • Simple, blog-aware, static sites
  • kramdown 和 markdown 较大的差异比较 - Hom
  • GitHub Flavored Markdown Spec
  • jneen/rouge: A pure-ruby code highlighter that is compatible with pygments http://rouge.jneen.net/
  • Rouge

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
  • UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
  • 图片点击放大,你的网页也能做到!
  • UWP 应用中 CoreApplication / Application, CoreWindow / Window 之间的区别
  • 使用 C# 代码创建快捷方式文件
  • 发布了一款库(或工具包),如何持续地编写更新日志(ChangeLog)?
  • Windows 无法删除文件夹 —— 访问被拒绝 / 因为目录不是空的
  • 如何精准地用打印机在贺卡或邀请函上打字
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • 使用 Postman 调试 ASP.NET Core 开发的 API
  • 只有你能 new 出来!.NET 隐藏构造函数的 n 种方法(Builder Pattern / 构造器模式)
  • UWP 中的各种文件路径(用户、缓存、漫游、安装……)
  • 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)
  • 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)
  • csproj 文件中那个空的 NuGetPackageImportStamp 是干什么的?
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 77. Combinations
  • Android单元测试 - 几个重要问题
  • CSS 三角实现
  • JavaScript-Array类型
  • Koa2 之文件上传下载
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Python语法速览与机器学习开发环境搭建
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 回流、重绘及其优化
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 突破自己的技术思维
  • 我有几个粽子,和一个故事
  • 【云吞铺子】性能抖动剖析(二)
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​人工智能书单(数学基础篇)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (算法设计与分析)第一章算法概述-习题
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)visual stdio 书签功能介绍
  • (转)关于pipe()的详细解析
  • (转)树状数组
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core 依赖注入的基本用发
  • .Net Core与存储过程(一)
  • .net 无限分类
  • .NET 中创建支持集合初始化器的类型
  • .NET大文件上传知识整理
  • ?php echo ?,?php echo Hello world!;?
  • @staticmethod和@classmethod的作用与区别
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [<事务专题>]
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory