精品嵌入式资源汇总
本文由 简悦 SimpRead 转码, 原文地址 github.com
精品嵌入式资源汇总. Contribute to zhengnianli/EmbedSummary development by creating an account on GitHub.
diff --git "a/site/cs/\345\245\275\344\271\246\346\216\250\350\215\220/index.html" "b/site/cs/\345\245\275\344\271\246\346\216\250\350\215\220/index.html" index cb4b866..1fc96d6 100644 --- "a/site/cs/\345\245\275\344\271\246\346\216\250\350\215\220/index.html" +++ "b/site/cs/\345\245\275\344\271\246\346\216\250\350\215\220/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\345\277\205\345\255\246\345\267\245\345\205\267/index.html" "b/site/cs/\345\277\205\345\255\246\345\267\245\345\205\267/index.html" index 2a4919d..b000817 100644 --- "a/site/cs/\345\277\205\345\255\246\345\267\245\345\205\267/index.html" +++ "b/site/cs/\345\277\205\345\255\246\345\267\245\345\205\267/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\346\225\260\345\255\246\345\237\272\347\241\200/index.html" "b/site/cs/\346\225\260\345\255\246\345\237\272\347\241\200/index.html" index 649c824..a8f26a6 100644 --- "a/site/cs/\346\225\260\345\255\246\345\237\272\347\241\200/index.html" +++ "b/site/cs/\346\225\260\345\255\246\345\237\272\347\241\200/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\346\225\260\345\255\246\350\277\233\351\230\266/index.html" "b/site/cs/\346\225\260\345\255\246\350\277\233\351\230\266/index.html" index f951f68..6ba693a 100644 --- "a/site/cs/\346\225\260\345\255\246\350\277\233\351\230\266/index.html" +++ "b/site/cs/\346\225\260\345\255\246\350\277\233\351\230\266/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" "b/site/cs/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" index cc4796c..99b7c90 100644 --- "a/site/cs/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" +++ "b/site/cs/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\347\224\265\345\255\220\345\237\272\347\241\200/index.html" "b/site/cs/\347\224\265\345\255\220\345\237\272\347\241\200/index.html" index e6fecf1..c70417e 100644 --- "a/site/cs/\347\224\265\345\255\220\345\237\272\347\241\200/index.html" +++ "b/site/cs/\347\224\265\345\255\220\345\237\272\347\241\200/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\347\233\256\345\275\225/index.html" "b/site/cs/\347\233\256\345\275\225/index.html" index 3444e11..530564c 100644 --- "a/site/cs/\347\233\256\345\275\225/index.html" +++ "b/site/cs/\347\233\256\345\275\225/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git "a/site/cs/\347\274\226\347\250\213\345\205\245\351\227\250/index.html" "b/site/cs/\347\274\226\347\250\213\345\205\245\351\227\250/index.html" index 2966224..4d51d81 100644 --- "a/site/cs/\347\274\226\347\250\213\345\205\245\351\227\250/index.html" +++ "b/site/cs/\347\274\226\347\250\213\345\205\245\351\227\250/index.html" @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/dev-guide/api/index.html b/site/dev-guide/api/index.html index 0e9b8af..0eea989 100644 --- a/site/dev-guide/api/index.html +++ b/site/dev-guide/api/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/dev-guide/index.html b/site/dev-guide/index.html index 4592fe6..eb51da4 100644 --- a/site/dev-guide/index.html +++ b/site/dev-guide/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/dev-guide/plugins/index.html b/site/dev-guide/plugins/index.html index 4ffcb54..e2f45dd 100644 --- a/site/dev-guide/plugins/index.html +++ b/site/dev-guide/plugins/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/dev-guide/themes/index.html b/site/dev-guide/themes/index.html index 2eef2c0..c425c8b 100644 --- a/site/dev-guide/themes/index.html +++ b/site/dev-guide/themes/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/dev-guide/translations/index.html b/site/dev-guide/translations/index.html index 2347ae4..dad2aa1 100644 --- a/site/dev-guide/translations/index.html +++ b/site/dev-guide/translations/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/feed_rss_created.xml b/site/feed_rss_created.xml index b7b68d2..a35a6e1 100644 --- a/site/feed_rss_created.xml +++ b/site/feed_rss_created.xml @@ -1 +1 @@ -\ No newline at end of file + 知识文档 https://www.zmta.info/en Sun, 03 Sep 2023 01:50:10 -0000 Sun, 03 Sep 2023 01:50:10 -0000 1440 MkDocs RSS plugin - v1.6.0 精品嵌入式资源汇总 <blockquote><p>本文由 <a href="http://ksria.com/simpread/">简悦 SimpRead</a> 转码, 原文地址 <a href="https://github.com/zhengnianli/EmbedSummary">github.com</a></p><p>精品嵌入式资源汇总. Contribute to zhengnianli/Em...</p></blockquote> https://www.zmta.info/collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ 简悦 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><ul><li><a href="01_精品嵌入式资源汇总.md.md">01_精品嵌入式资源汇总</a></li></ul> https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ 主页 <h1>知识文档</h1><p>Knowledge Document with Markdown.</p><hr><p>本<a href="https://www.likui.info/wiki/site">知识文档</a>工具旨在分享相关学习内容,通过<a class = "fa f...</p> https://www.zmta.info/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ 开始 <h1>Getting Started with MkDocs</h1><p>An introductory tutorial!</p><hr><h2>Installation</h2><p>To install MkDocs, run the following command from the command line:</p><p>```bash...</p> https://www.zmta.info/getting-started/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/getting-started/ About <h2>关于</h2><hr><ul><li><a href="#关于">关于</a></li><li><a href="#文档搭建">文档搭建</a></li><li><a href="#使用的扩展">使用的扩展</a></li></ul><hr><h2>文档搭建</h2><blockquote><p>NEW: <strong>文档搭建环境</strong></p><h5>本文档通过 <a href="https://www.mkdocs.org">mkdocs</a> 构建</h5></blockquote><h2>使用的扩展</h2><blockquote><p>...</p></blockquote> https://www.zmta.info/about/about/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/about/about/ 好书推荐 <h1>好书推荐</h1> https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/ 必学工具 <h1>必学工具</h1> https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/ 数学基础 <h1>数学基础</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/ 数学进阶 <h1>数学进阶</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/ 数据结构与算法 <h1>数据结构与算法</h1> https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 电子基础 <h1>电子基础</h1> https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/ 目录 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><p><a href="https://csdiy.wiki/">csdiy</a></p><p><img alt="" src="../diagrams/out/context_goals.svg"></p> https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/ 编程入门 <h1>编程入门</h1> https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/ README <h1>Developer Guide</h1><p>Extending MkDocs</p><hr><p>The MkDocs Developer Guide provides documentation for developers of thirdparty themes and plugins. Please see the ...</p> https://www.zmta.info/dev-guide/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/ API <h1>API reference</h1><p>NOTE: The main entry point to the API is through <a href="plugins.md#events">Events</a> that are received by plugins. These events' descriptions link b...</p> https://www.zmta.info/dev-guide/api/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/api/ Plugins <h1>MkDocs Plugins</h1><p>A Guide to installing, using and creating MkDocs Plugins</p><hr><h2>Installing Plugins</h2><p>Before a plugin can be used, it must be installed on ...</p> https://www.zmta.info/dev-guide/plugins/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/plugins/ Themes <h1>Developing Themes</h1><p>A guide to creating and distributing custom themes.</p><hr><p>NOTE:If you are looking for existing third party themes, they are listed in t...</p> https://www.zmta.info/dev-guide/themes/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/themes/ Translations <p>about/contributing.md# Translations</p><p>Theme localization guide.</p><hr><p>The [built-in themes] that are included with MkDocs provide support fortranslations. Th...</p> https://www.zmta.info/dev-guide/translations/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/translations/ ppt <h1>Matlab</h1> https://www.zmta.info/ppt/matlab/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ppt/matlab/ Books <h2>Books</h2><p><img alt="" src="../diagrams/out/mindmap.svg"></p> https://www.zmta.info/read/Books/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/read/Books/ \ No newline at end of file diff --git a/site/feed_rss_updated.xml b/site/feed_rss_updated.xml index 9379de2..c1a0ec2 100644 --- a/site/feed_rss_updated.xml +++ b/site/feed_rss_updated.xml @@ -1 +1 @@ - 知识文档 https://www.zmta.info/en Sun, 03 Sep 2023 01:53:10 -0000 Sun, 03 Sep 2023 01:53:10 -0000 1440 MkDocs RSS plugin - v1.6.0 简悦 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><ul><li><a href="精品嵌入式资源汇总.md">01_精品嵌入式资源汇总</a></li></ul> https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ 精品嵌入式资源汇总 <h1>精品嵌入式资源汇总</h1><blockquote><p>本文由 <a href="http://ksria.com/simpread/">简悦 SimpRead</a> 转码, 原文地址 <a href="https://github.com/zhengnianli/EmbedSummary">github.com</a></p><p>精品嵌入式资源汇总. Contribute to z...</p></blockquote> https://www.zmta.info/collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 01:53:14 +0000 https://www.zmta.info/collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ 主页 <h1>知识文档</h1><p>Knowledge Document with Markdown.</p><hr><p>本<a href="https://www.likui.info/wiki/site">知识文档</a>工具旨在分享相关学习内容,通过<a class = "fa f...</p> https://www.zmta.info/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ 开始 <h1>Getting Started with MkDocs</h1><p>An introductory tutorial!</p><hr><h2>Installation</h2><p>To install MkDocs, run the following command from the command line:</p><p>```bash...</p> https://www.zmta.info/getting-started/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/getting-started/ About <h2>关于</h2><hr><ul><li><a href="#关于">关于</a></li><li><a href="#文档搭建">文档搭建</a></li><li><a href="#使用的扩展">使用的扩展</a></li></ul><hr><h2>文档搭建</h2><blockquote><p>NEW: <strong>文档搭建环境</strong></p><h5>本文档通过 <a href="https://www.mkdocs.org">mkdocs</a> 构建</h5></blockquote><h2>使用的扩展</h2><blockquote><p>...</p></blockquote> https://www.zmta.info/about/about/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/about/about/ 好书推荐 <h1>好书推荐</h1> https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/ 必学工具 <h1>必学工具</h1> https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/ 数学基础 <h1>数学基础</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/ 数学进阶 <h1>数学进阶</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/ 数据结构与算法 <h1>数据结构与算法</h1> https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 电子基础 <h1>电子基础</h1> https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/ 目录 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><p><a href="https://csdiy.wiki/">csdiy</a></p><p><img alt="" src="../diagrams/out/context_goals.svg"></p> https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/ 编程入门 <h1>编程入门</h1> https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/ README <h1>Developer Guide</h1><p>Extending MkDocs</p><hr><p>The MkDocs Developer Guide provides documentation for developers of thirdparty themes and plugins. Please see the ...</p> https://www.zmta.info/dev-guide/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/ API <h1>API reference</h1><p>NOTE: The main entry point to the API is through <a href="plugins.md#events">Events</a> that are received by plugins. These events' descriptions link b...</p> https://www.zmta.info/dev-guide/api/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/api/ Plugins <h1>MkDocs Plugins</h1><p>A Guide to installing, using and creating MkDocs Plugins</p><hr><h2>Installing Plugins</h2><p>Before a plugin can be used, it must be installed on ...</p> https://www.zmta.info/dev-guide/plugins/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/plugins/ Themes <h1>Developing Themes</h1><p>A guide to creating and distributing custom themes.</p><hr><p>NOTE:If you are looking for existing third party themes, they are listed in t...</p> https://www.zmta.info/dev-guide/themes/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/themes/ Translations <p>about/contributing.md# Translations</p><p>Theme localization guide.</p><hr><p>The [built-in themes] that are included with MkDocs provide support fortranslations. Th...</p> https://www.zmta.info/dev-guide/translations/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/translations/ ppt <h1>Matlab</h1> https://www.zmta.info/ppt/matlab/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ppt/matlab/ Books <h2>Books</h2><p><img alt="" src="../diagrams/out/mindmap.svg"></p> https://www.zmta.info/read/Books/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/read/Books/ \ No newline at end of file + 知识文档 https://www.zmta.info/en Sun, 03 Sep 2023 01:50:10 -0000 Sun, 03 Sep 2023 01:50:10 -0000 1440 MkDocs RSS plugin - v1.6.0 精品嵌入式资源汇总 <blockquote><p>本文由 <a href="http://ksria.com/simpread/">简悦 SimpRead</a> 转码, 原文地址 <a href="https://github.com/zhengnianli/EmbedSummary">github.com</a></p><p>精品嵌入式资源汇总. Contribute to zhengnianli/Em...</p></blockquote> https://www.zmta.info/collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ 简悦 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><ul><li><a href="01_精品嵌入式资源汇总.md.md">01_精品嵌入式资源汇总</a></li></ul> https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ About <h2>关于</h2><hr><ul><li><a href="#关于">关于</a></li><li><a href="#文档搭建">文档搭建</a></li><li><a href="#使用的扩展">使用的扩展</a></li></ul><hr><h2>文档搭建</h2><blockquote><p>NEW: <strong>文档搭建环境</strong></p><h5>本文档通过 <a href="https://www.mkdocs.org">mkdocs</a> 构建</h5></blockquote><h2>使用的扩展</h2><blockquote><p>...</p></blockquote> https://www.zmta.info/about/about/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationWed, 07 Jun 2023 10:21:34 +0200 https://www.zmta.info/about/about/ 主页 <h1>知识文档</h1><p>Knowledge Document with Markdown.</p><hr><p>本<a href="https://www.likui.info/wiki/site">知识文档</a>工具旨在分享相关学习内容,通过<a class = "fa f...</p> https://www.zmta.info/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ 开始 <h1>Getting Started with MkDocs</h1><p>An introductory tutorial!</p><hr><h2>Installation</h2><p>To install MkDocs, run the following command from the command line:</p><p>```bash...</p> https://www.zmta.info/getting-started/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/getting-started/ 好书推荐 <h1>好书推荐</h1> https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/ 必学工具 <h1>必学工具</h1> https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/ 数学基础 <h1>数学基础</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/ 数学进阶 <h1>数学进阶</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/ 数据结构与算法 <h1>数据结构与算法</h1> https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 电子基础 <h1>电子基础</h1> https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/ 目录 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><p><a href="https://csdiy.wiki/">csdiy</a></p><p><img alt="" src="../diagrams/out/context_goals.svg"></p> https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/ 编程入门 <h1>编程入门</h1> https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/ README <h1>Developer Guide</h1><p>Extending MkDocs</p><hr><p>The MkDocs Developer Guide provides documentation for developers of thirdparty themes and plugins. Please see the ...</p> https://www.zmta.info/dev-guide/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/ API <h1>API reference</h1><p>NOTE: The main entry point to the API is through <a href="plugins.md#events">Events</a> that are received by plugins. These events' descriptions link b...</p> https://www.zmta.info/dev-guide/api/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/api/ Plugins <h1>MkDocs Plugins</h1><p>A Guide to installing, using and creating MkDocs Plugins</p><hr><h2>Installing Plugins</h2><p>Before a plugin can be used, it must be installed on ...</p> https://www.zmta.info/dev-guide/plugins/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/plugins/ Themes <h1>Developing Themes</h1><p>A guide to creating and distributing custom themes.</p><hr><p>NOTE:If you are looking for existing third party themes, they are listed in t...</p> https://www.zmta.info/dev-guide/themes/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/themes/ Translations <p>about/contributing.md# Translations</p><p>Theme localization guide.</p><hr><p>The [built-in themes] that are included with MkDocs provide support fortranslations. Th...</p> https://www.zmta.info/dev-guide/translations/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/translations/ ppt <h1>Matlab</h1> https://www.zmta.info/ppt/matlab/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ppt/matlab/ Books <h2>Books</h2><p><img alt="" src="../diagrams/out/mindmap.svg"></p> https://www.zmta.info/read/Books/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/read/Books/ \ No newline at end of file diff --git a/site/getting-started/index.html b/site/getting-started/index.html index 0192c83..94b22ef 100644 --- a/site/getting-started/index.html +++ b/site/getting-started/index.html @@ -171,7 +171,7 @@ 知识文档 https://www.zmta.info/en Sun, 03 Sep 2023 01:53:10 -0000 Sun, 03 Sep 2023 01:53:10 -0000 1440 MkDocs RSS plugin - v1.6.0 简悦 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><ul><li><a href="精品嵌入式资源汇总.md">01_精品嵌入式资源汇总</a></li></ul> https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 09:44:48 +0200 https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ 精品嵌入式资源汇总 <h1>精品嵌入式资源汇总</h1><blockquote><p>本文由 <a href="http://ksria.com/simpread/">简悦 SimpRead</a> 转码, 原文地址 <a href="https://github.com/zhengnianli/EmbedSummary">github.com</a></p><p>精品嵌入式资源汇总. Contribute to z...</p></blockquote> https://www.zmta.info/collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationSun, 03 Sep 2023 01:53:14 +0000 https://www.zmta.info/collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ About <h2>关于</h2><hr><ul><li><a href="#关于">关于</a></li><li><a href="#文档搭建">文档搭建</a></li><li><a href="#使用的扩展">使用的扩展</a></li></ul><hr><h2>文档搭建</h2><blockquote><p>NEW: <strong>文档搭建环境</strong></p><h5>本文档通过 <a href="https://www.mkdocs.org">mkdocs</a> 构建</h5></blockquote><h2>使用的扩展</h2><blockquote><p>...</p></blockquote> https://www.zmta.info/about/about/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationWed, 07 Jun 2023 10:21:34 +0200 https://www.zmta.info/about/about/ 主页 <h1>知识文档</h1><p>Knowledge Document with Markdown.</p><hr><p>本<a href="https://www.likui.info/wiki/site">知识文档</a>工具旨在分享相关学习内容,通过<a class = "fa f...</p> https://www.zmta.info/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ 开始 <h1>Getting Started with MkDocs</h1><p>An introductory tutorial!</p><hr><h2>Installation</h2><p>To install MkDocs, run the following command from the command line:</p><p>```bash...</p> https://www.zmta.info/getting-started/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/getting-started/ 好书推荐 <h1>好书推荐</h1> https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/ 必学工具 <h1>必学工具</h1> https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/ 数学基础 <h1>数学基础</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/ 数学进阶 <h1>数学进阶</h1> https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/ 数据结构与算法 <h1>数据结构与算法</h1> https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 电子基础 <h1>电子基础</h1> https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/ 目录 <h1>目录</h1><blockquote><p>数据来源</p></blockquote><p><a href="https://csdiy.wiki/">csdiy</a></p><p><img alt="" src="../diagrams/out/context_goals.svg"></p> https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%9B%AE%E5%BD%95/ 编程入门 <h1>编程入门</h1> https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/ README <h1>Developer Guide</h1><p>Extending MkDocs</p><hr><p>The MkDocs Developer Guide provides documentation for developers of thirdparty themes and plugins. Please see the ...</p> https://www.zmta.info/dev-guide/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/ API <h1>API reference</h1><p>NOTE: The main entry point to the API is through <a href="plugins.md#events">Events</a> that are received by plugins. These events' descriptions link b...</p> https://www.zmta.info/dev-guide/api/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/api/ Plugins <h1>MkDocs Plugins</h1><p>A Guide to installing, using and creating MkDocs Plugins</p><hr><h2>Installing Plugins</h2><p>Before a plugin can be used, it must be installed on ...</p> https://www.zmta.info/dev-guide/plugins/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/plugins/ Themes <h1>Developing Themes</h1><p>A guide to creating and distributing custom themes.</p><hr><p>NOTE:If you are looking for existing third party themes, they are listed in t...</p> https://www.zmta.info/dev-guide/themes/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/themes/ Translations <p>about/contributing.md# Translations</p><p>Theme localization guide.</p><hr><p>The [built-in themes] that are included with MkDocs provide support fortranslations. Th...</p> https://www.zmta.info/dev-guide/translations/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/dev-guide/translations/ ppt <h1>Matlab</h1> https://www.zmta.info/ppt/matlab/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/ppt/matlab/ Books <h2>Books</h2><p><img alt="" src="../diagrams/out/mindmap.svg"></p> https://www.zmta.info/read/Books/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndicationFri, 19 May 2023 19:06:19 +0200 https://www.zmta.info/read/Books/ - 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/index.html b/site/index.html index c45c8de..8e9567d 100644 --- a/site/index.html +++ b/site/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 @@ -463,5 +463,5 @@Keyboard Shortcuts
diff --git a/site/ppt/matlab/index.html b/site/ppt/matlab/index.html index 37d68d1..a0ee670 100644 --- a/site/ppt/matlab/index.html +++ b/site/ppt/matlab/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/read/Books/index.html b/site/read/Books/index.html index 37c254f..2acb3d8 100644 --- a/site/read/Books/index.html +++ b/site/read/Books/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/read/Reading/index.html b/site/read/Reading/index.html index 544876c..52bef85 100644 --- a/site/read/Reading/index.html +++ b/site/read/Reading/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 @@ -206,7 +206,7 @@- + Previous diff --git a/site/search/search_index.json b/site/search/search_index.json index 99985fa..6756759 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"\u77e5\u8bc6\u6587\u6863 Knowledge Document with Markdown. \u672c \u77e5\u8bc6\u6587\u6863 \u5de5\u5177\u65e8\u5728\u5206\u4eab\u76f8\u5173\u5b66\u4e60\u5185\u5bb9\uff0c\u901a\u8fc7 \u5171\u4eab\u534f\u8bae \u6765\u5206\u53d1\u548c\u6f14\u7ece\u672c\u7ad9\u5185\u5bb9\uff0c\u53ea\u9700\u4fdd\u7559\u672c\u7ad9\u7f72\u540d\u4e14\u975e\u5546\u4e1a\u4f7f\u7528\u3002 \u5f00\u59cb \u7528\u6237\u624b\u518c \u529f\u80fd \u4e3b\u9875 There's a stack of good looking themes available for MkDocs. Choose between the built in themes: mkdocs and readthedocs , select one of the third-party themes (on the MkDocs Themes wiki page as well as Best-of-MkDocs ), or build your own . \u5f00\u59cb Get your project documentation looking just the way you want it by customizing your theme and/or installing some plugins . Modify Markdown's behavior with Markdown extensions . Many configuration options are available. \u7528\u6237\u624b\u518c The built-in dev-server allows you to preview your documentation as you're writing it. It will even auto-reload and refresh your browser whenever you save your changes. \u5f00\u53d1\u6307\u5357 API Plugins Themes Translations README PPT The built-in dev-server allows you to preview your documentation as you're writing it. It will even auto-reload and refresh your browser whenever you save your changes. CS \u76ee\u5f55 \u5fc5\u5b66\u5de5\u5177 \u5fc5\u5b66\u5de5\u5177 \u597d\u4e66\u63a8\u8350 \u6570\u5b66\u57fa\u7840 \u6570\u5b66\u8fdb\u9636 \u9605\u8bfb \u9605\u8bfb \u4e66\u7c4d \u5173\u4e8e \u5173\u4e8e","title":"\u4e3b\u9875"},{"location":"#_1","text":"Knowledge Document with Markdown. \u672c \u77e5\u8bc6\u6587\u6863 \u5de5\u5177\u65e8\u5728\u5206\u4eab\u76f8\u5173\u5b66\u4e60\u5185\u5bb9\uff0c\u901a\u8fc7 \u5171\u4eab\u534f\u8bae \u6765\u5206\u53d1\u548c\u6f14\u7ece\u672c\u7ad9\u5185\u5bb9\uff0c\u53ea\u9700\u4fdd\u7559\u672c\u7ad9\u7f72\u540d\u4e14\u975e\u5546\u4e1a\u4f7f\u7528\u3002 \u5f00\u59cb \u7528\u6237\u624b\u518c","title":"\u77e5\u8bc6\u6587\u6863"},{"location":"getting-started/","text":"Getting Started with MkDocs An introductory tutorial! Installation To install MkDocs, run the following command from the command line: pip install mkdocs For more details, see the Installation Guide . Creating a new project Getting started is super easy. To create a new project, run the following command from the command line: mkdocs new my-project cd my-project Take a moment to review the initial project that has been created for you. There's a single configuration file named mkdocs.yml , and a folder named docs that will contain your documentation source files ( docs is the default value for the docs_dir configuration setting). Right now the docs folder just contains a single documentation page, named index.md . MkDocs comes with a built-in dev-server that lets you preview your documentation as you work on it. Make sure you're in the same directory as the mkdocs.yml configuration file, and then start the server by running the mkdocs serve command: $ mkdocs serve INFO - Building documentation... INFO - Cleaning site directory [I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000 [I 160402 15:50:43 handlers:58] Start watching changes [I 160402 15:50:43 handlers:60] Start detecting changes Open up http://127.0.0.1:8000/ in your browser, and you'll see the default home page being displayed: The dev-server also supports auto-reloading, and will rebuild your documentation whenever anything in the configuration file, documentation directory, or theme directory changes. Open the docs/index.md document in your text editor of choice, change the initial heading to MkLorum , and save your changes. Your browser will auto-reload and you should see your updated documentation immediately. Now try editing the configuration file: mkdocs.yml . Change the site_name setting to MkLorum and save the file. site_name: MkLorum site_url: https://example.com/ Your browser should immediately reload, and you'll see your new site name take effect. Note The site_name and site_url configuration options are the only two required options in your configuration file. When you create a new project, the site_url option is assigned the placeholder value: https://example.com . If the final location is known, you can change the setting now to point to it. Or you may choose to leave it alone for now. Just be sure to edit it before you deploy your site to a production server. Adding pages Now add a second page to your documentation: curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md As our documentation site will include some navigation headers, you may want to edit the configuration file and add some information about the order, title, and nesting of each page in the navigation header by adding a nav setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md Save your changes and you'll now see a navigation bar with Home and About items on the left as well as Search , Previous , and Next items on the right. Try the menu items and navigate back and forth between pages. Then click on Search . A search dialog will appear, allowing you to search for any text on any page. Notice that the search results include every occurrence of the search term on the site and links directly to the section of the page in which the search term appears. You get all of that with no effort or configuration on your part! Theming our documentation Now change the configuration file to alter how the documentation is displayed by changing the theme. Edit the mkdocs.yml file and add a theme setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md theme: readthedocs Save your changes, and you'll see the ReadTheDocs theme being used. Changing the Favicon Icon By default, MkDocs uses the MkDocs favicon icon. To use a different icon, create an img subdirectory in the docs directory and copy your custom favicon.ico file to that directory. MkDocs will automatically detect and use that file as your favicon icon. Building the site That's looking good. You're ready to deploy the first pass of your MkLorum documentation. First build the documentation: mkdocs build This will create a new directory, named site . Take a look inside the directory: $ ls site about fonts index.html license search.html css img js mkdocs sitemap.xml Notice that your source documentation has been output as two HTML files named index.html and about/index.html . You also have various other media that's been copied into the site directory as part of the documentation theme. You even have a sitemap.xml file and mkdocs/search_index.json . If you're using source code control such as git you probably don't want to check your documentation builds into the repository. Add a line containing site/ to your .gitignore file. echo \"site/\" >> .gitignore If you're using another source code control tool you'll want to check its documentation on how to ignore specific directories. Other Commands and Options There are various other commands and options available. For a complete list of commands, use the --help flag: mkdocs --help To view a list of options available on a given command, use the --help flag with that command. For example, to get a list of all options available for the build command run the following: mkdocs build --help Deploying The documentation site that you just built only uses static files so you'll be able to host it from pretty much anywhere. Simply upload the contents of the entire site directory to wherever you're hosting your website from and you're done. For specific instructions on a number of common hosts, see the Deploying your Docs page. Getting help See the User Guide for more complete documentation of all of MkDocs' features. To get help with MkDocs, please use the GitHub discussions or GitHub issues .","title":"\u5f00\u59cb"},{"location":"getting-started/#getting-started-with-mkdocs","text":"An introductory tutorial!","title":"Getting Started with MkDocs"},{"location":"getting-started/#installation","text":"To install MkDocs, run the following command from the command line: pip install mkdocs For more details, see the Installation Guide .","title":"Installation"},{"location":"getting-started/#creating-a-new-project","text":"Getting started is super easy. To create a new project, run the following command from the command line: mkdocs new my-project cd my-project Take a moment to review the initial project that has been created for you. There's a single configuration file named mkdocs.yml , and a folder named docs that will contain your documentation source files ( docs is the default value for the docs_dir configuration setting). Right now the docs folder just contains a single documentation page, named index.md . MkDocs comes with a built-in dev-server that lets you preview your documentation as you work on it. Make sure you're in the same directory as the mkdocs.yml configuration file, and then start the server by running the mkdocs serve command: $ mkdocs serve INFO - Building documentation... INFO - Cleaning site directory [I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000 [I 160402 15:50:43 handlers:58] Start watching changes [I 160402 15:50:43 handlers:60] Start detecting changes Open up http://127.0.0.1:8000/ in your browser, and you'll see the default home page being displayed: The dev-server also supports auto-reloading, and will rebuild your documentation whenever anything in the configuration file, documentation directory, or theme directory changes. Open the docs/index.md document in your text editor of choice, change the initial heading to MkLorum , and save your changes. Your browser will auto-reload and you should see your updated documentation immediately. Now try editing the configuration file: mkdocs.yml . Change the site_name setting to MkLorum and save the file. site_name: MkLorum site_url: https://example.com/ Your browser should immediately reload, and you'll see your new site name take effect. Note The site_name and site_url configuration options are the only two required options in your configuration file. When you create a new project, the site_url option is assigned the placeholder value: https://example.com . If the final location is known, you can change the setting now to point to it. Or you may choose to leave it alone for now. Just be sure to edit it before you deploy your site to a production server.","title":"Creating a new project"},{"location":"getting-started/#adding-pages","text":"Now add a second page to your documentation: curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md As our documentation site will include some navigation headers, you may want to edit the configuration file and add some information about the order, title, and nesting of each page in the navigation header by adding a nav setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md Save your changes and you'll now see a navigation bar with Home and About items on the left as well as Search , Previous , and Next items on the right. Try the menu items and navigate back and forth between pages. Then click on Search . A search dialog will appear, allowing you to search for any text on any page. Notice that the search results include every occurrence of the search term on the site and links directly to the section of the page in which the search term appears. You get all of that with no effort or configuration on your part!","title":"Adding pages"},{"location":"getting-started/#theming-our-documentation","text":"Now change the configuration file to alter how the documentation is displayed by changing the theme. Edit the mkdocs.yml file and add a theme setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md theme: readthedocs Save your changes, and you'll see the ReadTheDocs theme being used.","title":"Theming our documentation"},{"location":"getting-started/#changing-the-favicon-icon","text":"By default, MkDocs uses the MkDocs favicon icon. To use a different icon, create an img subdirectory in the docs directory and copy your custom favicon.ico file to that directory. MkDocs will automatically detect and use that file as your favicon icon.","title":"Changing the Favicon Icon"},{"location":"getting-started/#building-the-site","text":"That's looking good. You're ready to deploy the first pass of your MkLorum documentation. First build the documentation: mkdocs build This will create a new directory, named site . Take a look inside the directory: $ ls site about fonts index.html license search.html css img js mkdocs sitemap.xml Notice that your source documentation has been output as two HTML files named index.html and about/index.html . You also have various other media that's been copied into the site directory as part of the documentation theme. You even have a sitemap.xml file and mkdocs/search_index.json . If you're using source code control such as git you probably don't want to check your documentation builds into the repository. Add a line containing site/ to your .gitignore file. echo \"site/\" >> .gitignore If you're using another source code control tool you'll want to check its documentation on how to ignore specific directories.","title":"Building the site"},{"location":"getting-started/#other-commands-and-options","text":"There are various other commands and options available. For a complete list of commands, use the --help flag: mkdocs --help To view a list of options available on a given command, use the --help flag with that command. For example, to get a list of all options available for the build command run the following: mkdocs build --help","title":"Other Commands and Options"},{"location":"getting-started/#deploying","text":"The documentation site that you just built only uses static files so you'll be able to host it from pretty much anywhere. Simply upload the contents of the entire site directory to wherever you're hosting your website from and you're done. For specific instructions on a number of common hosts, see the Deploying your Docs page.","title":"Deploying"},{"location":"getting-started/#getting-help","text":"See the User Guide for more complete documentation of all of MkDocs' features. To get help with MkDocs, please use the GitHub discussions or GitHub issues .","title":"Getting help"},{"location":"about/about/","text":"\u5173\u4e8e \u5173\u4e8e \u6587\u6863\u642d\u5efa \u4f7f\u7528\u7684\u6269\u5c55 \u6587\u6863\u642d\u5efa \u6587\u6863\u642d\u5efa\u73af\u5883 \u672c\u6587\u6863\u901a\u8fc7 mkdocs \u6784\u5efa \u4f7f\u7528\u7684\u6269\u5c55 \u6765\u6e90\u4e8e best-of-mkdocs \u540d\u79f0 \u4ed3\u5e93\u5730\u5740 \u8bf4\u660e click click \u901a\u8fc7\u547d\u4ee4\u884c\u751f\u6210\u6587\u6863 mermaid2 mermaid2 \u751f\u6210\u7ed3\u6784\u56fe plantuml plantuml UML\u56fe\u751f\u6210","title":"About"},{"location":"about/about/#_1","text":"\u5173\u4e8e \u6587\u6863\u642d\u5efa \u4f7f\u7528\u7684\u6269\u5c55","title":"\u5173\u4e8e"},{"location":"about/about/#_2","text":"\u6587\u6863\u642d\u5efa\u73af\u5883","title":"\u6587\u6863\u642d\u5efa"},{"location":"about/about/#mkdocs","text":"","title":"\u672c\u6587\u6863\u901a\u8fc7 mkdocs \u6784\u5efa"},{"location":"about/about/#_3","text":"\u6765\u6e90\u4e8e best-of-mkdocs \u540d\u79f0 \u4ed3\u5e93\u5730\u5740 \u8bf4\u660e click click \u901a\u8fc7\u547d\u4ee4\u884c\u751f\u6210\u6587\u6863 mermaid2 mermaid2 \u751f\u6210\u7ed3\u6784\u56fe plantuml plantuml UML\u56fe\u751f\u6210","title":"\u4f7f\u7528\u7684\u6269\u5c55"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/","text":"\u672c\u6587\u7531 \u7b80\u60a6 SimpRead \u8f6c\u7801\uff0c \u539f\u6587\u5730\u5740 github.com \u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b. Contribute to zhengnianli/EmbedSummary development by creating an account on GitHub. ======================================================= \u5b66\u4e60\u521d\u671f\u6700\u96be\u627e\u7684\u5c31\u662f\u627e\u5b66\u4e60\u8d44\u6599\u4e86\uff0c\u672c\u8d34\u7cbe\u5fc3\u6c47\u603b\u4e86\u4e00\u4e9b\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u7f16\u7a0b\u8bed\u8a00\u3001\u5355\u7247\u673a\u3001\u5f00\u6e90\u9879\u76ee\u3001\u7269\u8054\u7f51\u3001\u64cd\u4f5c\u7cfb\u7edf\u3001Linux\u3001\u8ba1\u7b97\u673a\u7b49\u8d44\u6e90\uff0c\u5e76\u4e14\u5728\u4e0d\u65ad\u5730\u66f4\u65b0\u4e2d\uff0c\u81f4\u529b\u4e8e\u6253\u9020\u5168\u7f51\u6700\u5168\u7684\u5d4c\u5165\u5f0f\u8d44\u6599\u5e93\u3002\u6709\u597d\u7684\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\u7684\u670b\u53cb\u6b22\u8fce\u505a\u8d21\u732e\uff0c\u5229\u4eba\u5229\u5df1\u3002 \u6536\u5f55\u516c\u5f00\u8d44\u6599\u4ec5\u4e3a\u4e86\u65b9\u4fbf\u5927\u5bb6\u8fdb\u884c\u5b66\u4e60\u3002\u5982\u679c\u4f60\u8ba4\u4e3a\u672c\u4ed3\u5e93\u7684\u4e00\u4e9b\u6587\u4ef6\u4fb5\u72af\u4e86\u60a8\u7684\u6743\u76ca\uff0c\u8bf7 \u5411\u6211\u53cd\u9988 \u3002\u6211\u5c06\u4f1a\u4ece\u4ed3\u5e93\u4e2d\u5f7b\u5e95\u6e05\u9664\u8fd9\u4e9b\u6587\u4ef6\u3002 \u4ee5\u4e0b\u4e3a\u6700\u65b0\u8d44\u6599\u6c47\u603b\uff1a gitee\uff1a https://gitee.com/zhengnianli/EmbedSummary github\uff1a https://github.com/zhengnianli/EmbedSummary 1\u3001OS \u9e3f\u8499 OS \uff1a \u4e00\u6b3e\u9762\u5411\u5168\u573a\u666f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 RT-Thread \uff1a\u4e00\u6b3e\u5c0f\u800c\u7f8e\u7684\u7269\u8054\u7f51\u64cd\u4f5c\u7cfb\u7edf\u3002 TencentOS tiny \uff1a\u4e00\u6b3e\u9762\u5411\u7269\u8054\u7f51\u9886\u57df\u5f00\u53d1\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 freertos \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u64cd\u4f5c\u7cfb\u7edf\u3002 \u00b5C/OS \uff1a\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 Azure RTOS \uff1aAzure RTOS \u662f\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5f00\u53d1\u5957\u4ef6\u3002 eventos-nano \uff1a\u4e00\u4e2a\u8d85\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f\u5f00\u53d1\u6846\u67b6\uff0c\u4e8b\u4ef6\u9a71\u52a8\uff0c\u5360\u7528\u8d44\u6e90\u5c0f\uff0c\u53ef\u8fd0\u7528\u4e8e\u5404\u578b\u5355\u7247\u673a\u3002 zephyr \uff1aZephyr \u662f Linux \u57fa\u91d1\u4f1a\u63a8\u51fa\u7684\u4e00\u4e2a\u9002\u7528\u4e8e\u7269\u8054\u7f51\u7684\u5c0f\u578b\u53ef\u4f38\u7f29\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 mbed-os \uff1aARM \u81ea\u5df1\u6253\u9020\u3001\u4e3b\u6253 IoT \u7684\u4e00\u6574\u5957\u8f6f\u4ef6\u89e3\u51b3\u65b9\u6848 \u3002 BabyOS \uff1a \u4e13\u4e3a MCU \u9879\u76ee\u5f00\u53d1\u63d0\u901f\u7684\u4ee3\u7801\u6846\u67b6 \u3002 LuatOS \uff1a LuatOS \u662f\u8fd0\u884c\u5728\u5d4c\u5165\u5f0f\u786c\u4ef6\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\uff0c\u53ea\u9700\u8981\u5c11\u91cf\u5185\u5b58\u7684 flash \u7a7a\u95f4\u5c31\u80fd\u8fd0\u884c\uff0c\u7528\u6237\u7f16\u5199 lua \u4ee3\u7801\u5c31\u53ef\u5b8c\u6210\u5404\u79cd\u529f\u80fd\u3002 Contiki-OS \uff1a \u4e00\u4e2a\u5c0f\u578b\u7684\uff0c\u5f00\u6e90\u7684\uff0c\u6781\u6613\u79fb\u690d\u7684\u591a\u4efb\u52a1\u64cd\u4f5c\u7cfb\u7edf\u3002 DJYOS \uff1a \u90fd\u6c5f\u5830\u64cd\u4f5c\u7cfb\u7edf\u3002 klite \uff1a \u7b80\u6d01\u6613\u7528\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 lmosem \uff1a \u4e00\u4e2a\u5b8c\u5168\u4ece\u7b2c\u4e00\u884c\u5f15\u5bfc\u4ee3\u7801\u5f00\u59cb\u7f16\u5199\uff0c\u57fa\u4e8e ARM \u5e73\u53f0\uff0c\u652f\u6301\u591a\u8fdb\u7a0b\u3001\u591a CPU\u3001\u5185\u5b58\u7ba1\u7406\u3001\u6587\u4ef6\u4e0e\u8bbe\u5907\u7ba1\u7406\u7684\u5168 32 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 freenos \uff1aFreeNOS \u5fae\u5185\u6838\u64cd\u4f5c\u7cfb\u7edf\u3002 ros \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\u3002 openwrt \uff1aopenwrt \u6587\u6863\u3002 cola_os \uff1a300 \u884c\u4ee3\u7801\u5b9e\u73b0\u591a\u4efb\u52a1\u7ba1\u7406\u7684 OS\u3002 MS-RTOS \uff1a Micro Safe RTOS \u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 2\u3001\u5b9e\u7528\u5e93 / \u6846\u67b6 ametal \u6216 ametal \uff1aAMetal \u662f\u82af\u7247\u7ea7\u7684\u88f8\u673a\u8f6f\u4ef6\u5305\uff0c\u5b9a\u4e49\u4e86\u8de8\u5e73\u53f0\u7684\u901a\u7528\u63a5\u53e3\u3002 Melon \uff1a\u4e00\u4e2a\u7528\u4e8e\u7b80\u5316\u5f00\u53d1\u7684 C \u6846\u67b6\u5e93\u3002 zlog \uff1a\u4e00\u4e2a\u9ad8\u53ef\u9760\u6027\u3001\u9ad8\u6027\u80fd\u3001\u7eaf C \u65e5\u5fd7\u51fd\u6570\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 Smartlink \uff1aLinux \u4e0a\u5b9e\u73b0\u7684 smartconfig\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 CodeBrick \uff1a\u4e00\u79cd\u65e0 OS \u7684 MCU \u5b9e\u7528\u8f6f\u4ef6\u7ba1\u7406\u7cfb\u7edf\u3002 RIL \uff1a\u4e00\u6b3e\u4e13\u95e8\u4e3a\u5d4c\u5165\u5f0f\u5e73\u53f0\u5f00\u53d1\u7684\u65e0\u7ebf\u901a\u4fe1\u6a21\u5757 (GSM/GPRS/CatM1/NB) \u7ba1\u7406\u6846\u67b6\u3002 cJSON \uff1a\u4e00\u4e2a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8f7b\u91cf\u7ea7\u7684 JSON \u89e3\u6790\u5e93\u3002 jsmn \uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u57fa\u4e8e C \u8bed\u8a00\u7684 JSON \u89e3\u6790\u5e93\u3002 inih \uff1a C \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 MultiTimer \uff1a \u4e00\u4e2a\u8f6f\u4ef6\u5b9a\u65f6\u5668\u6269\u5c55\u6a21\u5757\u3002 MultiButton \uff1a \u4e00\u4e2a\u5c0f\u5de7\u7b80\u5355\u6613\u7528\u7684\u4e8b\u4ef6\u9a71\u52a8\u578b\u6309\u952e\u9a71\u52a8\u6a21\u5757\u3002 SmartTimer \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u57fa\u4e8e STM32 \u7684\u5b9a\u65f6\u5668\u8c03\u5ea6\u5668 \u3002 FlexibleButton \uff1a\u4e00\u4e2a\u57fa\u4e8e\u6807\u51c6 C \u8bed\u8a00\u7684\u5c0f\u5de7\u7075\u6d3b\u7684\u6309\u952e\u5904\u7406\u5e93\u3002 CmBacktrace \uff1a \u4e00\u6b3e\u9488\u5bf9 ARM Cortex-M \u7cfb\u5217 MCU \u7684\u9519\u8bef\u4ee3\u7801\u81ea\u52a8\u8ffd\u8e2a\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 limlog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 NanoLog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 EasyFlash \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f Flash \u5b58\u50a8\u5668\u5e93 \u3002 SFUD \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u4e32\u884c SPI Flash \u901a\u7528\u9a71\u52a8\u5e93\u3002 lw_oopc \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u6846\u67b6\u3002 PLOOC \uff1a\u53d7\u4fdd\u62a4\u7684\u4f4e\u5f00\u9500\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3002 cmd-parser \uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u597d\u7528\u7684\u547d\u4ee4\u89e3\u6790\u5668\u3002 mqttclient \uff1a\u4e00\u4e2a\u7701\u8d44\u6e90\u3001\u9ad8\u7a33\u5b9a\u7684 MQTT \u5ba2\u6237\u7aef\u3002 NorthFrame \uff1a\u4e00\u4e2a\u5355\u7247\u673a\u6781\u7b80\u56fe\u5f62\u5316\u72b6\u6001\u673a\u6846\u67b6 \u3002 letter-shell \uff1a\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u5d4c\u5165\u5f0f shell\u3002 nr_micro_shell \uff1a shell for MCU\uff0c\u5355\u7247\u673a\u547d\u4ee4\u884c\u4ea4\u4e92\u3002 pigweed \uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u76ee\u6807\u5e93\uff08\u6a21\u5757\uff09\u96c6\u5408\u3002 lwrb \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u901a\u7528\u73af\u7f13\u51b2\u533a\u7ba1\u7406\u5668\u5e93\u3002 cQueue \uff1a\u4f7f\u7528 ANSI C \u7f16\u5199\u7684\u6d88\u606f\u961f\u5217\u529f\u80fd\u51fd\u6570\u3002 Unity \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u3001\u9002\u5408\u5d4c\u5165\u5f0f\u7684\u6d4b\u8bd5\u6846\u67b6\u3002 Embedded Unit \uff1a \u662f\u4e2a\u7eaf\u6807\u51c6 c \u6784\u5efa\u7684\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 CuTest \uff1a\u4e00\u6b3e\u5fae\u5c0f\u7684 C \u8bed\u8a00\u5355\u5143\u6d4b\u8bd5\u6846\uff0c \u5168\u90e8\u4ee3\u7801\u52a0\u8d77\u6765\u4e0d\u5230\u4e00\u5343\u884c\u3002 cmockery \uff1a \u8c37\u6b4c C \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6\u3002 znfat \uff1a\u632f\u5357 fat\uff0c\u56fd\u4ea7\u5d4c\u5165\u5f0f\u6587\u4ef6\u7cfb\u7edf\u65b9\u6848 \u3002 libu \uff1a\u4e00\u4e2a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 toolkit \uff1aToolKit \u662f\u4e00\u5957\u5e94\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u7684\u901a\u7528\u5de5\u5177\u5305\u3002 LWIP \uff1a \u4e00\u4e2a\u5c0f\u578b\u5f00\u6e90\u7684 TCP/IP \u534f\u8bae\u6808 \u3002 SQLite \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u5173\u7cfb\u6570\u636e\u5e93\u3002 OpenBLT \uff1a\u4e00\u79cd\u5f00\u6e90\u5f15\u5bfc\u52a0\u8f7d\u7a0b\u5e8f\u3002 Linux Lab \uff1a Linux \u5185\u6838\u5b9e\u9a8c\u5ba4\uff0c\u57fa\u4e8e Docker/Qemu \u7684\u6781\u901f Linux \u5185\u6838\u5b66\u4e60\u3001\u5f00\u53d1\u548c\u6d4b\u8bd5\u73af\u5883\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 mbedtls \uff1a\u4e00\u4e2a\u5f00\u6e90\u3001\u4fbf\u643a, \u6613\u4e8e\u4f7f\u7528, \u53ef\u8bfb\u7684\u548c\u7075\u6d3b\u7684 SSL \u5e93\u3002 mosquitto \u6216 mosquitto(\u4e0b\u8f7d\u901f\u5ea6\u5feb) \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684 MQTT \u4ee3\u7406\u3002 inih \uff1aC \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 QP \uff1aQP \u5b9e\u65f6\u5d4c\u5165\u5f0f\u6846\u67b6\u3002 MS-RTOS \uff1aMicro Safe RTOS \u3002 protobuf-c \uff1aprotobuf-c\u3002 eepromfs \uff1a \u57fa\u4e8e EEPROM \u7684\u7b80\u6613\u7c7b\u6587\u4ef6\u7684\u6570\u636e\u8bfb\u5199\u5e93 \u3002 gear-lib \uff1a \u9002\u7528\u4e8e IOT / \u5d4c\u5165\u5f0f / \u7f51\u7edc\u670d\u52a1\u5f00\u53d1\u7684 C \u5e93 \u3002 mult_timer \uff1a \u4e00\u4e2a Linux \u4e0b\u7684\u8d85\u7ea7\u7cbe\u7b80\u7684\u591a\u91cd\u5b9a\u65f6\u5668 \u3002 EFSM \uff1a \u662f\u4e00\u4e2a\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684\u6709\u9650\u72b6\u6001\u673a \u3002 EasyX \uff1a\u4e00\u4e2a\u514d\u8d39\u7684\u56fe\u5f62\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 sys/queue.h \uff1a\u7528\u5b8f\u5b9e\u73b0\u7684\u5e38\u7528\u6570\u636e\u7ed3\u6784\u3002 nanomsg \uff1a\u4e00\u4e2a\u5b9e\u73b0\u4e86\u51e0\u79cd \u201c\u53ef\u6269\u5c55\u534f\u8bae\u201d \u7684\u9ad8\u6027\u80fd\u901a\u4fe1\u5e93\u3002 thttpd \uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u5c0f\u578b\uff0c\u53ef\u79fb\u690d\uff0c\u5feb\u901f\u4e14\u5b89\u5168\u7684 HTTP \u670d\u52a1\u5668\u3002 boa \uff1a\u4e00\u4e2a\u5c0f\u5de7\u9ad8\u6548\u7684 web \u670d\u52a1\u5668\u3002 FreeTpye \uff1a\u5b57\u4f53\u6e32\u67d3\u5e93\u3002 qpc \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u72b6\u6001\u673a\u5b9e\u73b0\u3002 Quantum Leaps \uff1a\u72b6\u6001\u673a\u7ec4\u7ec7\u3002 ZBar \uff1a\u4e8c\u7ef4\u7801\u626b\u63cf\u5de5\u5177\u548c\u5f00\u53d1\u5305. FFmpeg \uff1a\u591a\u5a92\u4f53\u5904\u7406\u5de5\u5177\u5e93. libnabo \uff1a\u662f\u4e00\u4e2a\u5feb\u901f\u4e3a\u4f4e\u7ef4\u5ea6\u7a7a\u95f4\u63d0\u4f9b K \u6700\u8fd1\u90bb\u5c45\u7b97\u6cd5\u5e93\u3002 DSAL \uff1a\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u5e93\u3002 FLINT \uff1a\u662f\u4e00\u4e2a\u6570\u8bba\u5e93\uff0c\u7528 C \u8bed\u8a00\u7f16\u5199\uff0c\u5b83\u5305\u62ec\u4e00\u4e2a\u975e\u5e38\u5feb\u7684\u591a\u9879\u5f0f\u7b97\u6cd5\u5e93\u3002 LibMMSeg \uff1a\u4e2d\u6587\u5206\u8bcd\u8f6f\u4ef6\u5305 \u3002 CDS \uff1aCDS \u662f\u4e00\u4e2a C++ \u6a21\u677f\u5e93\uff0c\u5305\u542b lock-free and fine-grained \u7b97\u6cd5\u3002 hashlib++ \uff1a\u662f\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u7528\u6765\u751f\u6210 checksum \u7b97\u6cd5\u3002 libcstl \uff1aC \u8bed\u8a00\u7f16\u5199\u7684\u4e00\u4e2a\u901a\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u5e38\u7528\u7684\u7b97\u6cd5\u5e93\u3002 Botan \uff1aBotan \u662f\u4e00\u4e2a C++ \u7684\u52a0\u5bc6\u7b97\u6cd5\u5e93\u3002 CGAL \uff1a\u8ba1\u7b97\u51e0\u4f55\u7b97\u6cd5\u5e93\u3002 MyMediaLite \uff1a\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u591a\u7528\u9014\u7684\u63a8\u8350\u7cfb\u7edf\u7684\u7b97\u6cd5\u5e93\u3002 cblas \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 blas \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002f2c \u5b98\u7f51\u3002 clapack \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 lapack \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002 scalapack \uff1a\u63d0\u4f9b\u5e76\u884c\u8fd0\u7b97\u7684 lapack \u5e93\uff0c\u6e90\u7801\u7528 fortran \u7f16\u5199\u3002 armadillo \uff1a\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\uff0c\u6e90\u7801\u7528 c++ \u7f16\u5199\u3002 openblas \uff1a\u9488\u5bf9 intel cpu \u4f18\u5316\u7684 blas \u5e93\u3002 mkl \uff1a\u6269\u5c55\u7684\u4e14\u9488\u5bf9 intel cpu \u4f18\u5316\u7684\u5e93\uff0c\u5305\u62ec\u5feb\u901f\u5085\u7acb\u53f6\u53d8\u6362\uff08FFT\uff09\u3001\u77e2\u91cf\u6570\u5b66\u5e93\u3002 eigen \uff1aC++ \u5199\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\u3002 libjpeg \uff1a\u7528 libjpeg \u5e93\u5728 LCD \u4e0a\u663e\u793a\u56fe\u7247\u3002 x264 \uff1ax264 \u5f00\u6e90\u7684\u89e3\u7801\u7f16\u7801\u5e93\u3002 ws2812 \uff1aws2812 \u9a71\u52a8\u5e93\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 3\u3001GUI \u76f8\u5173 GuiLite \uff1a\u5927\u9053\u81f3\u7b80 - 5 \u5343\u884c / \u4ec5\u5934\u6587\u4ef6 / \u5168\u5e73\u53f0 GUI \u5e93 \u3002 yoxios \uff1a \u57fa\u4e8e Linux \u5f00\u53d1\u7684\u8f7b\u91cf\u7ea7\u7269\u8054\u7f51\u7cfb\u7edf\u548c\u786c\u4ef6\u5e73\u53f0\u3002 ToughGFX \uff1a \u4e00\u4e2a C++ \u7f16\u5199\u7684 GUI \u8f6f\u4ef6\u6846\u67b6 \u3002 emwin \uff1a\u4e00\u4e2a\u8001\u724c GUI \u5e93\u3002 littlevGL \uff1a \u4e00\u4e2a\u514d\u8d39\u7684\u5f00\u6e90\u56fe\u5f62\u5e93\u3002 \u91ce\u725b LittlevGL demo \uff1a\u57fa\u4e8e\u91ce\u725b\u5f00\u53d1\u677f\u7684 LittlevGL demo \u7a0b\u5e8f \u3002 MonoGUI \uff1a\u4e00\u4e2a\u9ed1\u767d\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7cfb\u7edf \u3002 MiniGUI \uff1a \u4e00\u4e2a\u5feb\u901f\u3001\u7a33\u5b9a\u3001\u8de8\u64cd\u4f5c\u7cfb\u7edf\u7684 GUI\u3002 QT \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6\u3002 QT_Creator \uff1aQT_Creator \u4e0b\u8f7d\u94fe\u63a5\u3002 Gtk \uff1a \u4e00\u4e2a\u7528\u4e8e\u521b\u9020\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7684\u56fe\u5f62\u5e93\u3002 AWTK \uff1a\u662f ZLG \u503e\u5fc3\u6253\u9020\u7684\u4e00\u5957\u57fa\u4e8e C \u8bed\u8a00\u5f00\u53d1\u7684 GUI \u6846\u67b6 \u3002 \u73b2\u73d1 GUI \uff1a\u73b2\u73d1 GUI \u6559\u7a0b\u9875\u3002 std \uff1a\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5c0f\u578b\u56fe\u5f62\u5e93\u3002 CUGUI \uff1a\u4e3a\u5355\u7247\u673a\u5199\u7684 GUI \uff0c\u652f\u6301\u5b57\u4f53\uff0c\u6309\u952e\uff0c\u56fe\u7247\uff0c\u6ed1\u52a8\u6761\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 4\u3001\u9879\u76ee / \u8f6f\u786c\u7ed3\u5408 ElectronBot \uff1a\u4e00\u4e2a\u684c\u9762\u7ea7\u5c0f\u673a\u5668\u4eba\u3002 Planck-Pi \uff1a\u8d85\u8ff7\u4f60 Linux \u5f00\u53d1\u677f\u3002 qt_2019_ncov \uff1a\u57fa\u4e8e Qt/C++ \u5b9e\u73b0\u7684\u65b0\u51a0\u80ba\u708e\u75ab\u60c5\u76d1\u63a7\u5e73\u53f0\u3002 H7-TOOL_STM32H7_App \uff1a\u5b89\u5bcc\u83b1 H7-TOOL \u591a\u529f\u80fd\u5f00\u53d1\u5de5\u5177\u3002 the-little-bili-tv \uff1a\u57fa\u4e8e esp32+lvgl8.0 \u7684\u54d4\u54e9\u54d4\u54e9\u5c0f\u7535\u89c6\u3002 DAPLink/CMSIS DAP \uff1a\u4e00\u4e2a\u8c03\u8bd5\u5668\uff0c \u96c6\u6210\u4e0b\u8f7d\u3001\u8c03\u8bd5\u548c USB \u865a\u62df\u4e32\u53e3\u3002 Crazepony \uff1aCrazepony \u5f00\u6e90\u56db\u8f74\u98de\u884c\u5668\u3002 MiniQ \uff1a\u4e00\u4e2a\u8ff7\u4f60\u56db\u8f74\u98de\u884c\u5668\u3002 LiPow-Firmware \uff1a\u57fa\u4e8e STM32G0 \u91c7\u7528 USB type-C \u4f9b\u7535\u7684\u5f00\u6e90\u9502\u7535\u6c60\u5145\u7535\u5668\u3002 Avem \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u3002 esp8266-lattice-clock \uff1aEsp8266 \u591a\u529f\u80fd\u70b9\u9635\u65f6\u949f\u3002 SoftWareSerial \uff1a\u4e00\u4e2a STM32 IO \u53e3\u6a21\u62df\u5b9e\u73b0\u8f6f\u4ef6\u4e32\u53e3\u7a0b\u5e8f\u3002 \u4e32\u53e3 ISP \u7a0b\u5e8f \uff1a\u4e00\u4e2a stm32 \u4e32\u53e3 ISP \u7a0b\u5e8f\u3002 DSO_Nano \uff1a\u4e00\u4e2a\u624b\u6301\u793a\u6ce2\u5668\u3002 DSView \uff1a \u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u903b\u8f91\u5206\u6790\u4eea\u3002 MCU-Development \uff1a \u57fa\u4e8e 51\u3001430\u3001STM32F10X\u3001STM32F407X\u3001T4MC123G \u5e73\u53f0\u7684\u5404\u5e38\u89c1\u786c\u4ef6\u6a21\u5757 demo\u3002 Arduino \uff1a \u5f00\u6e90\u7535\u5b50\u539f\u578b\u5e73\u53f0\u3002 EWAHBoolArray \uff1a bitmap \u7b97\u6cd5\u3002 mcush \uff1aMCU shell\u3002 DoST \uff1a Linux \u4e0b\u5f00\u53d1 STM32 \u3002 Avem : \u8fd9\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u9879\u76ee\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 5\u3001\u8d44\u6e90 / \u5de5\u5177 / \u7f51\u7ad9 / \u8bba\u575b 100ask download \uff1a\u767e\u6587\u7f51\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 armfly \uff1a\u5b89\u5bcc\u83b1 / \u786c\u6c49\u5d4c\u5165\u5f0f\u8bba\u575b\u3002 fire download \uff1a\u91ce\u706b\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 openedv download \uff1a\u6b63\u70b9\u539f\u5b50\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 \u91ce\u706b \uff1a\u91ce\u706b\u7535\u5b50\u8bba\u575b\u3002 \u6b63\u70b9 \uff1a\u6b63\u70b9\u539f\u5b50\u8bba\u575b\u3002 \u5c0f\u718a\u732b C++ IDE \uff1a\u8de8\u5e73\u53f0\u3001\u8f7b\u91cf\u6613\u7528\u7684\u5f00\u6e90 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 ST \uff1aST \u4e2d\u6587\u793e\u533a\u3002 \u8baf\u4e3a\u5f00\u53d1\u793e\u533a \uff1a\u5317\u4eac\u8baf\u4e3a ARM \u5f00\u53d1\u793e\u533a\u3002 \u8baf\u4e3a\u5b98\u7f51 \uff1a\u8baf\u4e3a\u5b98\u7f51\u3002 NXP \u793e\u533a \uff1a\u6069\u667a\u6d66\u8bba\u575b\u3002 Linux \uff1aLinux \u5185\u6838\u5b98\u7f51\u3002 Linux \u6e90\u7801 \uff1a\u53ef\u5728\u7ebf\u9605\u8bfb Linux \u5185\u6838\u6e90\u7801\u3002 Buildroot \uff1abuildroot \u6e90\u7801\u3002 Debian \uff1aDebian \u5b98\u7f51\u3002 Ubuntu \uff1aUbuntu \u5b98\u7f51\u3002 BOA \u5b98\u7f51 \uff1a\u4e00\u4e2a\u5355\u4efb\u52a1 web \u670d\u52a1\u5668 \uff0c\u53ef\u4ee5\u79fb\u690d\u5230\u5d4c\u5165\u5f0f\u5e73\u53f0\u3002 \u8354\u679d\u6d3e \uff1a\u8354\u679d\u6d3e\u6307\u5357\u3002 \u6e05\u534e\u955c\u50cf\u7ad9 \uff1a\u6e05\u534e\u5927\u5b66\u5f00\u6e90\u8f6f\u4ef6\u955c\u50cf\u7ad9\u3002 \u4e2d\u79d1\u5927\u955c\u50cf\u7ad9 \uff1a\u4e2d\u56fd\u79d1\u6280\u5927\u5b66\u955c\u50cf\u7ad9\u3002 u-boot \uff1au-boot \u6e90\u7801\u4e0b\u8f7d\u9875\u9762\u3002 bear-pi \uff1a\u5c0f\u718a\u6d3e demo\u3002 \u5b85\u5b66\u90e8\u843d \uff1a\u4e00\u4e2a Linux\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u5185\u6838\u3001\u9a71\u52a8\u5f00\u53d1\u5b66\u4e60\u7f51\u7ad9\u3002 \u5355\u7247\u673a\u6559\u7a0b\u7f51 \uff1a\u5355\u7247\u673a\u57fa\u7840\u3001\u8bbe\u8ba1\u5b9e\u4f8b\u3001\u8bba\u575b\u3002 GNU \uff1aGNU \u5b98\u7f51\u3002 ChinaUnix \uff1aLinux/Unix \u76f8\u5173\u3002 PyQt5 \uff1aPyQt5 \u6559\u7a0b\u3002 qter \uff1aQT \u5f00\u6e90\u793e\u533a\u3002 git \u624b\u518c \uff1agit \u5b66\u4e60\u624b\u518c\u3002 \u5f00\u6e90\u9879\u76ee\u98ce\u683c \uff1aGoogle \u5f00\u6e90\u9879\u76ee\u98ce\u683c\u6307\u5357 (\u4e2d\u6587\u7248)\u3002 \u7535\u5b50\u4e16\u5bb6 \uff1a\u4e00\u4e2a\u7535\u5b50\u7c7b\u5bfc\u822a\u7f51\u7ad9\u3002 21ic \uff1a21IC \u4e2d\u56fd\u7535\u5b50\u7f51\u3002 \u82af\u8def\u6052\u7535\u5b50 \uff1a\u5c0f\u6885\u54e5\u535a\u5ba2\u3001FPGA \u8bba\u575b\u3002 \u5d4c\u5165\u5f0f\u5f00\u53d1\u8005\u793e\u533a \uff1a\u521b\u9f99\u8bba\u575b\u3002 micropython \uff1amicropython \u4e2d\u6587\u7f51\u3002 \u6cf0\u6653\u79d1\u6280 \uff1aLinux \u76f8\u5173\u3002 \u7535\u5802\u79d1\u6280 \uff1aSTM32 \u76f8\u5173\u3002 \u6e90\u4ee3\u7801\u4f7f\u7528\u793a\u4f8b\u805a\u5408\u5668 \uff1a \u4ece\u8d85\u8fc7 100 \u4e07\u4e2a\u5f00\u6e90\u9879\u76ee\u641c\u7d22 CPP \u4ee3\u7801\u793a\u4f8b\u3002 KST-51 \uff1a\u300a\u624b\u628a\u624b\u6559\u4f60\u5b66 51 \u5355\u7247\u673a\u300b \u3002 \u539f\u5b50\u54e5 \uff1a\u4e13\u6ce8\u7535\u5b50\u6280\u672f\u6559\u5b66\u3002\u3002 digoboy \uff1a\u5730\u74dc\u6d3e\u89c6\u9891\u7f51\u3002 c.biancheng \uff1aC \u8bed\u8a00\u4e2d\u6587\u7f51\u3002 open-c-book \uff1a\u300aC \u8bed\u8a00\u7f16\u7a0b\u900f\u89c6\u300b\u3002 PyQt5 \uff1aPyQt5 \u5728\u7ebf\u6559\u7a0b\u3002 open-shell-book \uff1a\u300aShell \u7f16\u7a0b\u8303\u4f8b\u300b \u3002 software_unit_test \uff1a \u300a\u8f6f\u4ef6\u5355\u5143\u6d4b\u8bd5\u5165\u95e8\u4e0e\u5b9e\u8df5\u300b\u3002 kerneltravel \uff1aLinux \u5185\u6838\u4e4b\u65c5\u3002 \u8717\u7a9d\u79d1\u6280 \uff1a\u6162\u4e0b\u6765\uff0c\u4eab\u53d7\u6280\u672f\u3002 bookstack \uff1a\u4e66\u6808\u7f51\u3002 wireshark \uff1a\u6293\u5305\u5de5\u5177\u4e0b\u8f7d\u94fe\u63a5\u3002 MobaXterm \uff1a\u4e00\u4e2a\u597d\u7528\u7684\u7ec8\u7aef\u8f6f\u4ef6\u3002 Stduino \uff1a \u4e00\u6b3e\u9762\u5411 32 \u4f4d\u5904\u7406\u5668\u5feb\u901f\u5165\u95e8\u5b66\u4e60\u7684\u96c6\u6210\u5f00\u53d1\u5e73\u53f0 \u3002 easyicon \uff1a\u4e00\u4e2a\u514d\u8d39\u56fe\u6807\u4e0b\u8f7d\u7f51\u7ad9\u3002 codingdict \uff1a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u83dc\u9e1f\u6559\u7a0b\u7684\u7f16\u7a0b\u7c7b\u6559\u7a0b\u7f51\u7ad9\u3002 codingdict \u5f00\u6e90\u8f6f\u4ef6 \uff1acodingdict \u7f51\u7ad9\u6536\u96c6\u7684\u5404\u7c7b\u5f00\u6e90\u8f6f\u4ef6\u96c6\u5408\u3002 C \u7ecf\u5178\u793a\u4f8b \uff1a\u4e00\u4e9b C \u8bed\u8a00\u7684\u5b9e\u4f8b\u3002 xmake \uff1a\u8f7b\u91cf\u7ea7\u8de8\u5e73\u53f0 C/C++ \u6784\u5efa\u5de5\u5177\u3002 spacevim \uff1a\u4e00\u4e2a\u6a21\u5757\u5316\u7684 Vim IDE\u3002 vofa+ \uff1a\u4e00\u4e2a\u63d2\u4ef6\u9a71\u52a8\u7684\u9ad8\u81ea\u7531\u5ea6\u4e0a\u4f4d\u673a\u3002 \u8054\u5408\u5f00\u53d1\u7f51 \uff1a356 \u4e07\u4e2a\u7f16\u7a0b\u6e90\u7801\u8d44\u6599 \u89c5\u601d\u6587\u6863 \uff1a\u79c1\u6709\u4e91\u7b14\u8bb0\u3001\u4e91\u6587\u6863\u548c\u77e5\u8bc6\u5e93\u7cfb\u7edf\u3002 aardio \uff1a\u6613\u7528\u6027\u6781\u5f3a\u7684\u52a8\u6001\u8bed\u8a00\u3002 OneNET SDK \uff1aOneNET SDK \u4ed3\u5e93\u3002 ros \u624b\u518c \uff1aros \u7684\u5b98\u65b9\u624b\u518c\u3002 gnu \u7684\u5f00\u6e90\u8f6f\u4ef6 \uff1agnu \u7684\u5f00\u6e90\u8f6f\u4ef6 soft-and-hard \uff1a\u8fd9\u662f\u4e00\u4e2a\u4ee5\u7269\u8054\u7f51\u9879\u76ee\u4e3a\u4e3b\u65b9\u5411\u5206\u4eab web \u5f00\u53d1\u6559\u7a0b\u3002 FireflyTeam \uff1a\u4e00\u4e2a\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u4ed3\u5e93\u3002 python \u811a\u672c \uff1a\u4e00\u4e9b\u597d\u7528\u7684 python \u811a\u672c\u3002 C++ libraries \uff1aA list of open source C++ libraries. Lindenis \uff1aAn open source software for Lindenis SBC\u3002 fast-line-following \uff1a\u4e00\u4e2a\u5feb\u901f\u5bfb\u7ebf\u673a\u5668\u4eba\u7684\u7b97\u6cd5\u3002 \u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177 \uff1a\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177\u3002 Awesome-Embedded \uff1a\u6c47\u805a\u4e86\u5404\u79cd\u5d4c\u5165\u5f0f\u76f8\u5173\u7684\u8d44\u6e90\u3002 FreeModbus : FreeModbus \u662f\u4e00\u6b3e\u5f00\u6e90\u7684 Modbus \u534f\u8bae\u6808\uff0c\u4f46\u662f\u53ea\u6709\u4ece\u673a\u5f00\u6e90\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 6\u3001\u4e00\u4e9b\u82af\u7247\u539f\u5382\u4ee3\u7801\u4ed3\u5e93 STMicroelectronics \uff1a\u610f\u6cd5\u534a\u5bfc\u4f53\uff08ST\uff09\u3002 TI \uff1a\u5fb7\u5dde\u4eea\u5668\uff08TI\uff09\u3002 NXP \uff1a\u6069\u667a\u6d66\uff08NXP\uff09\u3002 Freescale \uff1a\u98de\u601d\u5361\u5c14\u534a\u5bfc\u4f53\uff08Freescale\uff09\u3002 hisilicon \uff1a\u6d77\u601d\u3002 rockchip \uff1a\u745e\u82af\u5fae\u3002 Samsung \uff1a\u4e09\u661f\u3002 Infineon \uff1a\u82f1\u98de\u51cc\u3002 analogdevicesinc \uff1a\u4e9a\u5fb7\u8bfa\u534a\u5bfc\u4f53\uff08ADI\uff09\u3002 MicrochipTech \uff1a\u5fae\u82af\u534a\u5bfc\u4f53\uff08Microchip \uff09\u3002 NordicSemiconductor \uff1a\u5317\u6b27\u96c6\u6210\u7535\u8def\uff08Nordic\uff09\u3002 cypress-io \uff1a\u8d5b\u666e\u62c9\u65af\u534a\u5bfc\u4f53\uff08Cypress\uff09\u3002 GD32 \uff1a\u6613\u5146\u521b\u65b0 (GD)\u3002 GD32 \u7f51\u76d8 \uff1a\uff1a\u6613\u5146\u521b\u65b0 (GD) \u7f51\u76d8\u8d44\u6599\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 7\u3001\u7269\u8054\u7f51\u3001\u667a\u80fd\u5bb6\u5c45 Domoticz \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u667a\u80fd\u5bb6\u5c45\u7cfb\u7edf \u3002 Kaa IoT Platform \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5f00\u653e\u548c\u9ad8\u6548\u7684\u7269\u8054\u7f51\u4e91\u5e73\u53f0\u3002 RT-Thread IoT SDK \uff1a\u57fa\u4e8e RT-Thread IOT \u5f00\u53d1\u677f\u7684\u5404\u7c7b\u4f8b\u7a0b\u3002 \u4ece\u96f6\u6253\u9020\u7269\u8054\u7f51 \uff1a\u4e00\u4efd\u9002\u5408\u5d4c\u5165\u5f0f\u5f00\u53d1\u4eba\u5458\u5b66\u4e60\u7684 web \u5f00\u53d1\u6559\u7a0b\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 8\u3001\u673a\u5668\u4eba\u76f8\u5173 / \u5b9a\u4f4d / \u89c6\u89c9 RoboCar \uff1a\u673a\u5668\u4eba\u81ea\u52a8\u5bfb\u7ebf\u3001\u907f\u969c\u3001\u5efa\u56fe\u3001\u5bfc\u822a\u3001\u9065\u63a7\u7248\u672c / \u8f66\u8f7d\u7535\u8111\u7248\u672c\u8def\u9762\u5206\u6790\uff0c\u53ca\u4ea4\u901a\u8def\u51b5\u8bc6\u522b\u7684\u8f66\u8f86\u8f85\u52a9\u9a7e\u9a76\u7cfb\u7edf ROS \u6559\u7a0b \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf slam \uff1a\u601d\u5c9a\u79d1\u6280\u3002 9\u3001\u63a8\u8350\u535a\u5ba2 / \u535a\u6587 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 11 \u671f aardio \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 10 \u671f inih \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 9 \u671f nanopb \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 8 \u671f AMetal \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 7 \u671f zlog \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 6 \u671f FlexibleButton \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 5 \u671f smartlink \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 4 \u671f cola_os \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 3 \u671f sys/queue.h \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 2 \u671f llgui \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 1 \u671f gear-lib \u535a\u6587\u2014\u2014Tslib \u79fb\u690d\u4e0e\u5206\u6790 \u535a\u4e3b\u2014\u2014ychy \u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9 \uff0c\u67e5\u770b\u66f4\u591a\u8d44\u6e90\u3002 \u4e0b\u9762\u8ba1\u7b97\u673a\u8d44\u6e90\u4e3a\u7f51\u53cb dianjixz \u8d21\u732e\uff0c\u611f\u8c22\u8fd9\u4f4d\u670b\u53cb\u3002 \u8ba1\u7b97\u673a\u76f8\u5173\u8d44\u6e90 ------ \u6301\u7eed\u66f4\u65b0\u4e2d 1\u3001 \u6807\u51c6\u5e93 C++ \u6807\u51c6\u5e93\uff0c\u5305\u62ec\u4e86 STL \u5bb9\u5668\uff0c\u7b97\u6cd5\u548c\u51fd\u6570\u7b49\u3002 C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7c7b\u548c\u51fd\u6570\u7684\u96c6\u5408\uff0c\u4f7f\u7528\u6838\u5fc3\u8bed\u8a00\u7f16\u5199\uff0c\u4e5f\u662f C++ISO \u81ea\u8eab\u6807\u51c6\u7684\u4e00\u90e8\u5206\u3002 Standard Template Library \uff1a\u6807\u51c6\u6a21\u677f\u5e93 C POSIX library \uff1a POSIX \u7cfb\u7edf\u7684 C \u6807\u51c6\u5e93\u89c4\u8303 ISO C++ Standards Committee \uff1aC++ \u6807\u51c6\u59d4\u5458\u4f1a 2\u3001 \u6846\u67b6 C++ \u901a\u7528\u6846\u67b6\u548c\u5e93 Apache C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7b97\u6cd5\uff0c\u5bb9\u5668\uff0c\u8fed\u4ee3\u5668\u548c\u5176\u4ed6\u57fa\u672c\u7ec4\u4ef6\u7684\u96c6\u5408 ASL \uff1aAdobe \u6e90\u4ee3\u7801\u5e93\u63d0\u4f9b\u4e86\u540c\u884c\u7684\u8bc4\u5ba1\u548c\u53ef\u79fb\u690d\u7684 C++ \u6e90\u4ee3\u7801\u5e93\u3002 Boost \uff1a\u5927\u91cf\u901a\u7528 C++ \u5e93\u7684\u96c6\u5408\u3002 BDE \uff1a\u6765\u81ea\u4e8e\u5f6d\u535a\u8d44\u8baf\u5b9e\u9a8c\u5ba4\u7684\u5f00\u53d1\u73af\u5883\u3002 Cinder \uff1a\u63d0\u4f9b\u4e13\u4e1a\u54c1\u8d28\u521b\u9020\u6027\u7f16\u7801\u7684\u5f00\u6e90\u5f00\u53d1\u793e\u533a\u3002 Cxxomfort \uff1a\u8f7b\u91cf\u7ea7\u7684\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\u7684\u5e93\uff0c\u5c06 C++ 11 \u7684\u4e00\u4e9b\u65b0\u7279\u6027\u79fb\u690d\u5230 C++03 \u4e2d\u3002 Dlib \uff1a\u4f7f\u7528\u5951\u7ea6\u5f0f\u7f16\u7a0b\u548c\u73b0\u4ee3 C++ \u79d1\u6280\u8bbe\u8ba1\u7684\u901a\u7528\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 EASTL \uff1aEA-STL \u516c\u5171\u90e8\u5206 ffead-cpp \uff1a\u4f01\u4e1a\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Folly \uff1a\u7531 Facebook \u5f00\u53d1\u548c\u4f7f\u7528\u7684\u5f00\u6e90 C++ \u5e93 JUCE \uff1a\u5305\u7f57\u4e07\u8c61\u7684 C++ \u7c7b\u5e93\uff0c\u7528\u4e8e\u5f00\u53d1\u8de8\u5e73\u53f0\u8f6f\u4ef6 libPhenom \uff1a\u7528\u4e8e\u6784\u5efa\u9ad8\u6027\u80fd\u548c\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7cfb\u7edf\u7684\u4e8b\u4ef6\u6846\u67b6\u3002 LibSourcey \uff1a\u7528\u4e8e\u5b9e\u65f6\u7684\u89c6\u9891\u6d41\u548c\u9ad8\u6027\u80fd\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u7684 C++11 evented IO LibU \uff1a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93 Loki \uff1aC++ \u5e93\u7684\u8bbe\u8ba1\uff0c\u5305\u62ec\u5e38\u89c1\u7684 \u8bbe\u8ba1\u6a21\u5f0f \u548c\u4e60\u8bed\u7684\u5b9e\u73b0\u3002 MiLi \uff1a\u53ea\u542b\u5934\u6587\u4ef6\u7684\u5c0f\u578b C++ \u5e93 openFrameworks \uff1a\u5f00\u53d1 C++ \u5de5\u5177\u5305\uff0c\u7528\u4e8e\u521b\u610f\u6027\u7f16\u7801\u3002 Qt \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6 Reason \uff1a\u8de8\u5e73\u53f0\u7684\u6846\u67b6\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u5bb9\u6613\u5730\u4f7f\u7528 Java\uff0c.Net \u548c Python\uff0c\u540c\u65f6\u4e5f\u6ee1\u8db3\u4e86\u4ed6\u4eec\u5bf9 C++ \u6027\u80fd\u548c\u4f18\u52bf\u7684\u9700\u6c42\u3002 ROOT \uff1a\u5177\u5907\u6240\u6709\u529f\u80fd\u7684\u4e00\u7cfb\u5217\u9762\u5411\u5bf9\u8c61\u7684\u6846\u67b6\uff0c\u80fd\u591f\u975e\u5e38\u9ad8\u6548\u5730\u5904\u7406\u548c\u5206\u6790\u5927\u91cf\u7684\u6570\u636e\uff0c\u4e3a\u6b27\u6d32\u539f\u5b50\u80fd\u7814\u7a76\u673a\u6784\u6240\u7528\u3002 STLport \uff1a\u662f STL \u5177\u6709\u4ee3\u8868\u6027\u7684\u7248\u672c STXXL \uff1a\u7528\u4e8e\u989d\u5916\u7684\u5927\u578b\u6570\u636e\u96c6\u7684\u6807\u51c6\u6a21\u677f\u5e93\u3002 Ultimate++ \uff1aC++ \u8de8\u5e73\u53f0\u5feb\u901f\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Windows Template Library \uff1a\u7528\u4e8e\u5f00\u53d1 Windows \u5e94\u7528\u7a0b\u5e8f\u548c UI \u7ec4\u4ef6\u7684 C++ \u5e93 Yomm11 \uff1aC++11 \u7684\u5f00\u653e multi-methods. 3\u3001 \u4eba\u5de5\u667a\u80fd btsk \uff1a\u6e38\u620f\u884c\u4e3a\u6811\u542f\u52a8\u5668\u5de5\u5177 Evolving Objects \uff1a\u57fa\u4e8e\u6a21\u677f\u7684\uff0cANSI C++ \u6f14\u5316\u8ba1\u7b97\u5e93\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u975e\u5e38\u5feb\u901f\u5730\u7f16\u5199\u51fa\u81ea\u5df1\u7684\u968f\u673a\u4f18\u5316\u7b97\u6cd5\u3002 Neu \uff1aC++11 \u6846\u67b6\uff0c\u7f16\u7a0b\u8bed\u8a00\u96c6\uff0c\u7528\u4e8e\u521b\u5efa\u4eba\u5de5\u667a\u80fd\u5e94\u7528\u7a0b\u5e8f\u7684\u591a\u7528\u9014\u8f6f\u4ef6\u7cfb\u7edf\u3002 4\u3001 \u5f02\u6b65\u4e8b\u4ef6\u5faa\u73af Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 libev \uff1a\u529f\u80fd\u9f50\u5168\uff0c\u9ad8\u6027\u80fd\u7684\u65f6\u95f4\u5faa\u73af\uff0c\u8f7b\u5fae\u5730\u4eff\u6548 libevent\uff0c\u4f46\u662f\u4e0d\u518d\u50cf libevent \u4e00\u6837\u6709\u5c40\u9650\u6027\uff0c\u4e5f\u4fee\u590d\u4e86\u5b83\u7684\u4e00\u4e9b bug\u3002 libevent \uff1a\u4e8b\u4ef6\u901a\u77e5\u5e93 libuv \uff1a\u8de8\u5e73\u53f0\u5f02\u6b65 I/O\u3002 5\u3001\u97f3\u9891 \u97f3\u9891\uff0c\u58f0\u97f3\uff0c\u97f3\u4e50\uff0c\u6570\u5b57\u5316\u97f3\u4e50\u5e93 FMOD \uff1a\u6613\u4e8e\u4f7f\u7528\u7684\u8de8\u5e73\u53f0\u7684\u97f3\u9891\u5f15\u64ce\u548c\u97f3\u9891\u5185\u5bb9\u7684\u6e38\u620f\u521b\u4f5c\u5de5\u5177\u3002 Maximilian \uff1aC++ \u97f3\u9891\u548c\u97f3\u4e50\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5e93 OpenAL \uff1a\u5f00\u6e90\u97f3\u9891\u5e93\u2014\u8de8\u5e73\u53f0\u7684\u97f3\u9891 API Opus \uff1a\u4e00\u4e2a\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u514d\u7248\u7a0e\u7684\uff0c\u9ad8\u5ea6\u901a\u7528\u7684\u97f3\u9891\u7f16\u89e3\u7801\u5668 Speex \uff1a\u514d\u8d39\u7f16\u89e3\u7801\u5668\uff0c\u4e3a Opus \u6240\u5e9f\u5f03 Tonic \uff1a C++ \u6613\u7528\u548c\u9ad8\u6548\u7684\u97f3\u9891\u5408\u6210 Vorbis \uff1a Ogg Vorbis \u662f\u4e00\u79cd\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u975e\u4e13\u6709\u7684\uff0c\u514d\u7248\u7a0e\u7684\u901a\u7528\u538b\u7f29\u97f3\u9891\u683c\u5f0f\u3002 6\u3001 \u751f\u6001\u5b66 \u751f\u7269\u4fe1\u606f\uff0c\u57fa\u56e0\u7ec4\u5b66\u548c\u751f\u7269\u6280\u672f libsequence \uff1a\u7528\u4e8e\u8868\u793a\u548c\u5206\u6790\u7fa4\u4f53\u9057\u4f20\u5b66\u6570\u636e\u7684 C++ \u5e93\u3002 SeqAn \uff1a\u4e13\u6ce8\u4e8e\u751f\u7269\u6570\u636e\u5e8f\u5217\u5206\u6790\u7684\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u3002 Vcflib \uff1a\u7528\u4e8e\u89e3\u6790\u548c\u5904\u7406 VCF \u6587\u4ef6\u7684 C++ \u5e93 Wham \uff1a\u76f4\u63a5\u628a\u8054\u60f3\u6d4b\u8bd5\u5e94\u7528\u5230 BAM \u6587\u4ef6\u7684\u57fa\u56e0\u7ed3\u6784\u53d8\u5f02\u3002 7\u3001 \u538b\u7f29 \u538b\u7f29\u548c\u5f52\u6863\u5e93 bzip2 \uff1a\u4e00\u4e2a\u5b8c\u5168\u514d\u8d39\uff0c\u514d\u8d39\u4e13\u5229\u548c\u9ad8\u8d28\u91cf\u7684\u6570\u636e\u538b\u7f29 doboz \uff1a\u80fd\u591f\u5feb\u901f\u89e3\u538b\u7f29\u7684\u538b\u7f29\u5e93 PhysicsFS \uff1a\u5bf9\u5404\u79cd\u5f52\u6863\u63d0\u4f9b\u62bd\u8c61\u8bbf\u95ee\u7684\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\u89c6\u9891\u6e38\u620f\uff0c\u8bbe\u8ba1\u7075\u611f\u90e8\u5206\u6765\u81ea\u4e8e Quake3 \u7684\u6587\u4ef6\u5b50\u7cfb\u7edf\u3002 KArchive \uff1a\u7528\u4e8e\u521b\u5efa\uff0c\u8bfb\u5199\u548c\u64cd\u4f5c\u6587\u4ef6\u6863\u6848\uff08\u4f8b\u5982 zip \u548c tar\uff09\u7684\u5e93\uff0c\u5b83\u901a\u8fc7 QIODevice \u7684\u4e00\u7cfb\u5217\u5b50\u7c7b\uff0c\u4f7f\u7528 gzip \u683c\u5f0f\uff0c\u63d0\u4f9b\u4e86\u900f\u660e\u7684\u538b\u7f29\u548c\u89e3\u538b\u7f29\u7684\u6570\u636e\u3002 LZ4 \uff1a\u975e\u5e38\u5feb\u901f\u7684\u538b\u7f29\u7b97\u6cd5 LZHAM \uff1a\u65e0\u635f\u538b\u7f29\u6570\u636e\u5e93\uff0c\u538b\u7f29\u6bd4\u7387\u8ddf LZMA \u63a5\u8fd1\uff0c\u4f46\u662f\u89e3\u538b\u7f29\u901f\u5ea6\u5374\u8981\u5feb\u5f97\u591a\u3002 LZMA \uff1a7z \u683c\u5f0f\u9ed8\u8ba4\u548c\u901a\u7528\u7684\u538b\u7f29\u65b9\u6cd5\u3002 LZMAT \uff1a\u53ca\u5176\u5feb\u901f\u7684\u5b9e\u65f6\u65e0\u635f\u6570\u636e\u538b\u7f29\u5e93 miniz \uff1a\u5355\u4e00\u7684 C \u6e90\u6587\u4ef6\uff0c\u7d27\u7f29 / \u81a8\u80c0\u538b\u7f29\u5e93\uff0c\u4f7f\u7528 zlib \u517c\u5bb9 API\uff0cZIP \u5f52\u6863\u8bfb\u5199\uff0cPNG \u5199\u65b9\u5f0f\u3002 Minizip \uff1aZlib \u6700\u65b0 bug \u4fee\u590d\uff0c\u652f\u6301 PKWARE \u78c1\u76d8\u8de8\u8d8a\uff0cAES \u52a0\u5bc6\u548c IO \u7f13\u51b2\u3002 Snappy \uff1a\u5feb\u901f\u538b\u7f29\u548c\u89e3\u538b\u7f29 ZLib \uff1a\u975e\u5e38\u7d27\u51d1\u7684\u6570\u636e\u6d41\u538b\u7f29\u5e93 ZZIPlib \uff1a\u63d0\u4f9b ZIP \u5f52\u6863\u7684\u8bfb\u6743\u9650\u3002 8\u3001\u5e76\u53d1\u6027 \u5e76\u53d1\u6267\u884c\u548c\u591a\u7ebf\u7a0b Boost.Compute \uff1a\u7528\u4e8e OpenCL \u7684 C++GPU \u8ba1\u7b97\u5e93 Bolt \uff1a\u9488\u5bf9 GPU \u8fdb\u884c\u4f18\u5316\u7684 C++ \u6a21\u677f\u5e93 C++React \uff1a\u7528\u4e8e C++11 \u7684\u53cd\u5e94\u6027\u7f16\u7a0b\u5e93 Intel TBB \uff1aIntel \u7ebf\u7a0b\u6784\u4ef6\u5757 Libclsph \uff1a\u57fa\u4e8e OpenCL \u7684 GPU \u52a0\u901f SPH \u6d41\u4f53\u4eff\u771f\u5e93 OpenCL \uff1a\u5e76\u884c\u7f16\u7a0b\u7684\u5f02\u6784\u7cfb\u7edf\u7684\u5f00\u653e\u6807\u51c6 OpenMP \uff1aOpenMP API Thrust \uff1a\u7c7b\u4f3c\u4e8e C++ \u6807\u51c6\u6a21\u677f\u5e93\u7684\u5e76\u884c\u7b97\u6cd5\u5e93 HPX \uff1a\u7528\u4e8e\u4efb\u4f55\u89c4\u6a21\u7684\u5e76\u884c\u548c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u7684\u901a\u7528 C++ \u8fd0\u884c\u65f6\u7cfb\u7edf VexCL \uff1a\u7528\u4e8e OpenCL/CUDA \u7684 C++ \u5411\u91cf\u8868\u8fbe\u5f0f\u6a21\u677f\u5e93\u3002 9\u3001 \u5bb9\u5668 C++ B-tree \uff1a\u57fa\u4e8e B \u6811\u6570\u636e\u7ed3\u6784\uff0c\u5b9e\u73b0\u547d\u4ee4\u5185\u5b58\u5bb9\u5668\u7684\u6a21\u677f\u5e93 Hashmaps \uff1a C++ \u4e2d\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7b97\u6cd5\u7684\u5b9e\u73b0 10\u3001 \u5bc6\u7801\u5b66 Bcrypt \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u6587\u4ef6\u52a0\u5bc6\u5de5\u5177\uff0c\u52a0\u5bc6\u6587\u4ef6\u53ef\u4ee5\u79fb\u690d\u5230\u6240\u6709\u53ef\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\u548c\u5904\u7406\u5668\u4e2d\u3002 BeeCrypt \uff1a Botan \uff1a C++ \u52a0\u5bc6\u5e93 Crypto++ \uff1a\u4e00\u4e2a\u6709\u5173\u52a0\u5bc6\u65b9\u6848\u7684\u514d\u8d39\u7684 C++ \u5e93 GnuPG \uff1a OpenPGP \u6807\u51c6\u7684\u5b8c\u6574\u5b9e\u73b0 GnuTLS \uff1a\u5b9e\u73b0\u4e86 SSL\uff0cTLS \u548c DTLS \u534f\u8bae\u7684\u5b89\u5168\u901a\u4fe1\u5e93 Libgcrypt libmcrypt LibreSSL \uff1a\u514d\u8d39\u7684 SSL/TLS \u534f\u8bae\uff0c\u5c5e\u4e8e 2014 OpenSSL \u7684\u4e00\u4e2a\u5206\u652f LibTomCrypt \uff1a\u4e00\u4e2a\u975e\u5e38\u5168\u9762\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u79fb\u690d\u7684\u52a0\u5bc6\u5de5\u5177 libsodium \uff1a\u57fa\u4e8e NaCI \u7684\u52a0\u5bc6\u5e93\uff0c\u56fa\u6267\u5df1\u89c1\uff0c\u5bb9\u6613\u4f7f\u7528 Nettle \u5e95\u5c42\u7684\u52a0\u5bc6\u5e93 OpenSSL \uff1a \u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u5546\u7528\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\uff0c\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u52a0\u5bc6\u5e93\u3002 Tiny AES128 in C \uff1a\u7528 C \u5b9e\u73b0\u7684\u4e00\u4e2a\u5c0f\u5de7\uff0c\u53ef\u79fb\u690d\u7684\u5b9e\u73b0\u4e86 AES128ESB \u7684\u52a0\u5bc6\u7b97\u6cd5 11\u3001 \u6570\u636e\u5e93 \u6570\u636e\u5e93\uff0cSQL \u670d\u52a1\u5668\uff0cODBC \u9a71\u52a8\u7a0b\u5e8f\u548c\u5de5\u5177 hiberlite \uff1a\u7528\u4e8e Sqlite3 \u7684 C++ \u5bf9\u8c61\u5173\u7cfb\u6620\u5c04 Hiredis \uff1a \u7528\u4e8e Redis \u6570\u636e\u5e93\u7684\u5f88\u7b80\u5355\u7684 C \u5ba2\u6237\u7aef\u5e93 LevelDB \uff1a \u5feb\u901f\u952e\u503c\u5b58\u50a8\u5e93 LMDB \uff1a\u7b26\u5408\u6570\u636e\u5e93\u56db\u5927\u57fa\u672c\u5143\u7d20\u7684\u5d4c\u5165\u952e\u503c\u5b58\u50a8 MySQL++ \uff1a\u5c01\u88c5\u4e86 MySql \u7684 C API \u7684 C++ \u5305\u88c5\u5668 RocksDB \uff1a\u6765\u81ea Facebook \u7684\u5d4c\u5165\u952e\u503c\u7684\u5feb\u901f\u5b58\u50a8 SQLite \uff1a\u4e00\u4e2a\u5b8c\u5168\u5d4c\u5165\u5f0f\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5173\u7cfb\u6570\u636e\u5e93\uff0c\u53ea\u6709\u51e0\u767e KB\uff0c\u53ef\u4ee5\u6b63\u786e\u5305\u542b\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u3002 12\u3001 \u8c03\u8bd5 \u8c03\u8bd5\u5e93\uff0c \u5185\u5b58\u548c\u8d44\u6e90\u6cc4\u9732\u68c0\u6d4b\uff0c\u5355\u5143\u6d4b\u8bd5 Boost.Test \uff1aBoost \u6d4b\u8bd5\u5e93 Catch \uff1a\u4e00\u4e2a\u5f88\u65f6\u5c1a\u7684\uff0cC++ \u539f\u751f\u7684\u6846\u67b6\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\uff0c\u7528\u4e8e\u5355\u5143\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\u548c\u884c\u4e3a\u9a71\u52a8\u5f00\u53d1\u3002 CppUnit \uff1a\u7531 JUnit \u79fb\u690d\u8fc7\u6765\u7684 C++ \u6d4b\u8bd5\u6846\u67b6 CTest \uff1aCMake \u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6 ig-debugheap \uff1a\u7528\u4e8e\u8ddf\u8e2a\u5185\u5b58\u9519\u8bef\u7684\u591a\u5e73\u53f0\u8c03\u8bd5\u5806 libtap \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u6d4b\u8bd5 MemTrack \u2014\u7528\u4e8e C++ \u8ddf\u8e2a\u5185\u5b58\u5206\u914d microprofile - \u8de8\u5e73\u53f0\u7684\u7f51\u7edc\u8bd5\u56fe\u5206\u6790\u5668 minUnit \uff1a\u4f7f\u7528 C \u5199\u7684\u8ff7\u4f60\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff0c\u53ea\u4f7f\u7528\u4e86\u4e24\u4e2a\u5b8f Remotery \uff1a\u7528\u4e8e web \u89c6\u56fe\u7684\u5355\u4e00 C \u6587\u4ef6\u5206\u6790\u5668 UnitTest++ \uff1a\u8f7b\u91cf\u7ea7\u7684 C++ \u5355\u5143\u6d4b\u8bd5\u6846\u67b6 13\u3001 \u6e38\u620f\u5f15\u64ce Cocos2d-x \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u6846\u67b6\uff0c\u7528\u4e8e\u6784\u5efa 2D \u6e38\u620f\uff0c\u4e92\u52a8\u56fe\u4e66\uff0c\u6f14\u793a\u548c\u5176\u4ed6\u56fe\u5f62\u5e94\u7528\u7a0b\u5e8f\u3002 Grit \uff1a\u793e\u533a\u9879\u76ee\uff0c\u7528\u4e8e\u6784\u5efa\u4e00\u4e2a\u514d\u8d39\u7684\u6e38\u620f\u5f15\u64ce\uff0c\u5b9e\u73b0\u5f00\u653e\u7684\u4e16\u754c 3D \u6e38\u620f\u3002 Irrlicht \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u5f00\u6e90\u9ad8\u6027\u80fd\u7684\u5b9e\u65f6 #D \u5f15\u64ce Polycode \uff1aC++ \u5b9e\u73b0\u7684\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u5f00\u6e90\u6846\u67b6\uff08\u4e0e Lua \u7ed1\u5b9a\uff09\u3002 14\u3001 \u56fe\u5f62\u7528\u6237\u754c\u9762 CEGUI \uff1a \u5f88\u7075\u6d3b\u7684\u8de8\u5e73\u53f0 GUI \u5e93 FLTK \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u8de8\u5e73\u53f0\u7684 C++GUI \u5de5\u5177\u5305\u3002 GTK+ \uff1a \u7528\u4e8e\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684\u8de8\u5e73\u53f0\u5de5\u5177\u5305 gtkmm \uff1a\u7528\u4e8e\u53d7\u6b22\u8fce\u7684 GUI \u5e93 GTK + \u7684\u5b98\u65b9 C++ \u63a5\u53e3\u3002 imgui \uff1a\u62e5\u6709\u6700\u5c0f\u4f9d\u8d56\u5173\u7cfb\u7684\u7acb\u5373\u6a21\u5f0f\u56fe\u5f62\u7528\u6237\u754c\u9762 libRocket \uff1a libRocket \u662f\u4e00\u4e2a C++ HTML/CSS \u6e38\u620f\u63a5\u53e3\u4e2d\u95f4\u4ef6 MyGUI \uff1a\u5feb\u901f\uff0c\u7075\u6d3b\uff0c\u7b80\u5355\u7684 GUI Ncurses \uff1a\u7ec8\u7aef\u7528\u6237\u754c\u9762 QCustomPlot \uff1a\u6ca1\u6709\u66f4\u591a\u4f9d\u8d56\u5173\u7cfb\u7684 Qt \u7ed8\u56fe\u63a7\u4ef6 Qwt \uff1a\u7528\u6237\u4e0e\u6280\u672f\u5e94\u7528\u7684 Qt \u63a7\u4ef6 QwtPlot3D \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u57fa\u4e8e Qt/OpenGL \u7684 C++ \u7f16\u7a0b\u5e93\uff0c\u672c\u8d28\u4e0a\u63d0\u4f9b\u4e86\u4e00\u7fa4 3D \u63a7\u4ef6 OtterUI \uff1a OtterUI \u662f\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u548c\u4e92\u52a8\u5a31\u4e50\u8f6f\u4ef6\u7684\u7528\u6237\u754c\u9762\u5f00\u53d1\u89e3\u51b3\u65b9\u6848 PDCurses \u5305\u542b\u6e90\u4ee3\u7801\u548c\u9884\u7f16\u8bd1\u5e93\u7684\u516c\u5171\u56fe\u5f62\u51fd\u6570\u5e93 wxWidgets C++ \u5e93\uff0c\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u4f7f\u7528\u4e00\u4e2a\u4ee3\u7801\u5e93\u53ef\u4ee5\u4e3a widows\uff0c Mac OS X\uff0cLinux \u548c\u5176\u4ed6\u5e73\u53f0\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f 15\u3001 \u56fe\u5f62 bgfx \uff1a\u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u5e93 Cairo \uff1a\u652f\u6301\u591a\u79cd\u8f93\u51fa\u8bbe\u5907\u7684 2D \u56fe\u5f62\u5e93 Horde3D \u4e00\u4e2a\u5c0f\u578b\u7684 3D \u6e32\u67d3\u548c\u52a8\u753b\u5f15\u64ce magnum C++11 \u548c OpenGL 2D/3D \u56fe\u5f62\u5f15\u64ce Ogre 3D \u7528 C++ \u7f16\u5199\u7684\u4e00\u4e2a\u9762\u5411\u573a\u666f\uff0c\u5b9e\u65f6\uff0c\u7075\u6d3b\u7684 3D \u6e32\u67d3\u5f15\u64ce\uff08\u5e76\u975e\u6e38\u620f\u5f15\u64ce\uff09 OpenSceneGraph \u5177\u6709\u9ad8\u6027\u80fd\u7684\u5f00\u6e90 3D \u56fe\u5f62\u5de5\u5177\u5305 Panda3D \u7528\u4e8e 3D \u6e32\u67d3\u548c\u6e38\u620f\u5f00\u53d1\u7684\u6846\u67b6\uff0c\u7528 Python \u548c C++ \u7f16\u5199\u3002 Skia \u7528\u4e8e\u7ed8\u5236\u6587\u5b57\uff0c\u56fe\u5f62\u548c\u56fe\u50cf\u7684\u5b8c\u6574\u7684 2D \u56fe\u5f62\u5e93 urho3d \u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u548c\u6e38\u620f\u5f15\u64ce\u3002 16\u3001 \u56fe\u50cf\u5904\u7406 Boost.GIL \uff1a\u901a\u7528\u56fe\u50cf\u5e93 CImg \uff1a\u7528\u4e8e\u56fe\u50cf\u5904\u7406\u7684\u5c0f\u578b\u5f00\u6e90 C++ \u5de5\u5177\u5305 CxImage \uff1a\u7528\u4e8e\u52a0\u8f7d\uff0c\u4fdd\u5b58\uff0c\u663e\u793a\u548c\u8f6c\u6362\u7684\u56fe\u50cf\u5904\u7406\u548c\u8f6c\u6362\u5e93\uff0c\u53ef\u4ee5\u5904\u7406\u7684\u56fe\u7247\u683c\u5f0f\u5305\u62ec BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K\u3002 FreeImage \uff1a\u5f00\u6e90\u5e93\uff0c\u652f\u6301\u73b0\u5728\u591a\u5a92\u4f53\u5e94\u7528\u6240\u9700\u7684\u901a\u7528\u56fe\u7247\u683c\u5f0f\u548c\u5176\u4ed6\u683c\u5f0f\u3002 GDCM \uff1aGrassroots DICOM \u5e93 ITK \uff1a\u8de8\u5e73\u53f0\u7684\u5f00\u6e90\u56fe\u50cf\u5206\u6790\u7cfb\u7edf Magick++ \uff1aImage Magic k \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 MagickWnd \uff1aImageMagick \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 OpenCV \uff1a \u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u7c7b\u5e93 tesseract-ocr \uff1aOCR \u5f15\u64ce VIGRA \uff1a\u7528\u4e8e\u56fe\u50cf\u5206\u6790\u901a\u7528 C++ \u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 VTK \uff1a\u7528\u4e8e 3D \u8ba1\u7b97\u673a\u56fe\u5f62\u5b66\uff0c\u56fe\u50cf\u5904\u7406\u548c\u53ef\u89c6\u5316\u7684\u5f00\u6e90\u514d\u8d39\u8f6f\u4ef6\u7cfb\u7edf\u3002 17\u3001 \u56fd\u9645\u5316 gettext \uff1aGNU `gettext\u2019 IBM ICU \uff1a\u63d0\u4f9b Unicode \u548c\u5168\u7403\u5316\u652f\u6301\u7684 C\u3001C++ \u548c Java \u5e93 libiconv \uff1a\u7528\u4e8e\u4e0d\u540c\u5b57\u7b26\u7f16\u7801\u4e4b\u95f4\u7684\u7f16\u7801\u8f6c\u6362\u5e93 18\u3001 Jason frozen \uff1a C/C++ \u7684 Jason \u89e3\u6790\u751f\u6210\u5668 Jansson \uff1a\u8fdb\u884c\u7f16\u89e3\u7801\u548c\u5904\u7406 Jason \u6570\u636e\u7684 C \u8bed\u8a00\u5e93 jbson \uff1aC++14 \u4e2d\u6784\u5efa\u548c\u8fed\u4ee3 BSON data, \u548c Json \u6587\u6863\u7684\u5e93 JeayeSON \uff1a\u975e\u5e38\u5065\u5168\u7684 C++ JSON \u5e93\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 JSON++ \uff1a C++ JSON \u89e3\u6790\u5668 json-parser \uff1a\u7528\u53ef\u79fb\u690d\u7684 ANSI C \u7f16\u5199\u7684 JSON \u89e3\u6790\u5668\uff0c\u5360\u7528\u5185\u5b58\u975e\u5e38\u5c11 json11 \uff1a\u4e00\u4e2a\u8ff7\u4f60\u7684 C++11 JSON \u5e93 jute \uff1a\u975e\u5e38\u7b80\u5355\u7684 C++ JSON \u89e3\u6790\u5668 ibjson \uff1aC \u8bed\u8a00\u4e2d\u7684 JSON \u89e3\u6790\u548c\u6253\u5370\u5e93\uff0c\u5f88\u5bb9\u6613\u548c\u4efb\u4f55\u6a21\u578b\u96c6\u6210\u3002 libjson \uff1a\u8f7b\u91cf\u7ea7\u7684 JSON \u5e93 PicoJSON \uff1aC++ \u4e2d JSON \u89e3\u6790\u5e8f\u5217\u5316\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 qt-json \uff1a\u7528\u4e8e JSON \u6570\u636e\u548c QVariant \u5c42\u6b21\u95f4\u7684\u76f8\u4e92\u89e3\u6790\u7684\u7b80\u5355\u7c7b QJson \uff1a\u5c06 JSON \u6570\u636e\u6620\u5c04\u5230 QVariant \u5bf9\u8c61\u7684\u57fa\u4e8e Qt \u7684\u5e93 RapidJSON \uff1a \u7528\u4e8e C++ \u7684\u5feb\u901f JSON \u89e3\u6790\u751f\u6210\u5668\uff0c\u5305\u542b SAX \u548c DOM \u4e24\u79cd\u98ce\u683c\u7684 API YAJL \uff1aC \u8bed\u8a00\u4e2d\u5feb\u901f\u6d41 JSON \u89e3\u6790\u5e93 19\u3001 \u65e5\u5fd7 Boost.Log \uff1a\u8bbe\u8ba1\u975e\u5e38\u6a21\u5757\u5316\uff0c\u5e76\u4e14\u5177\u6709\u6269\u5c55\u6027 easyloggingpp \uff1aC++ \u65e5\u5fd7\u5e93\uff0c\u53ea\u5305\u542b\u5355\u4e00\u7684\u5934\u6587\u4ef6\u3002 Log4cpp \uff1a\u4e00\u7cfb\u5217 C++ \u7c7b\u5e93\uff0c\u7075\u6d3b\u6dfb\u52a0\u65e5\u5fd7\u5230\u6587\u4ef6\uff0c\u7cfb\u7edf\u65e5\u5fd7\uff0cIDSA \u548c\u5176\u4ed6\u5730\u65b9\u3002 templog \uff1a\u8f7b\u91cf\u7ea7 C++ \u5e93\uff0c\u53ef\u4ee5\u6dfb\u52a0\u65e5\u5fd7\u5230\u4f60\u7684 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d 20\u3001 \u673a\u5668\u5b66\u4e60 Caffe \uff1a\u5feb\u901f\u7684\u795e\u7ecf\u7f51\u7edc\u6846\u67b6 CCV \uff1a\u4ee5 C \u8bed\u8a00\u4e3a\u6838\u5fc3\u7684\u73b0\u4ee3\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 mlpack \uff1a\u53ef\u6269\u5c55\u7684 C++ \u673a\u5668\u5b66\u4e60\u5e93 OpenCV \uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 Recommender \uff1a\u4f7f\u7528\u534f\u540c\u8fc7\u6ee4\u8fdb\u884c\u4ea7\u54c1\u63a8\u8350 / \u5efa\u8bae\u7684 C \u8bed\u8a00\u5e93\u3002 SHOGUN \uff1aShogun \u673a\u5668\u5b66\u4e60\u5de5\u5177 sofia-ml \uff1a\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684\u5feb\u901f\u589e\u91cf\u7b97\u6cd5\u5957\u4ef6 21\u3001 \u6570\u5b66 Armadillo \uff1a\u9ad8\u8d28\u91cf\u7684 C++ \u7ebf\u6027\u4ee3\u6570\u5e93\uff0c\u901f\u5ea6\u548c\u6613\u7528\u6027\u505a\u5230\u4e86\u5f88\u597d\u7684\u5e73\u8861\u3002\u8bed\u6cd5\u548c MatlAB \u5f88\u76f8\u4f3c blaze \uff1a\u9ad8\u6027\u80fd\u7684 C++ \u6570\u5b66\u5e93\uff0c\u7528\u4e8e\u5bc6\u96c6\u548c\u7a00\u758f\u7b97\u6cd5\u3002 ceres-solver \uff1a\u6765\u81ea\u8c37\u6b4c\u7684 C++ \u5e93\uff0c\u7528\u4e8e\u5efa\u6a21\u548c\u89e3\u51b3\u5927\u578b\u590d\u6742\u975e\u7ebf\u6027\u6700\u5c0f\u5e73\u65b9\u95ee\u9898\u3002 CGal \uff1a \u9ad8\u6548\uff0c\u53ef\u9760\u7684\u96c6\u5408\u7b97\u6cd5\u96c6\u5408 cml \uff1a\u7528\u4e8e\u6e38\u620f\u548c\u56fe\u5f62\u7684\u514d\u8d39 C++ \u6570\u5b66\u5e93 Eigen \uff1a\u9ad8\u7ea7 C++ \u6a21\u677f\u5934\u6587\u4ef6\u5e93\uff0c\u5305\u62ec\u7ebf\u6027\u4ee3\u6570\uff0c\u77e9\u9635\uff0c\u5411\u91cf\u64cd\u4f5c\uff0c\u6570\u503c\u89e3\u51b3\u548c\u5176\u4ed6\u76f8\u5173\u7684\u7b97\u6cd5\u3002 GMTL \uff1a\u6570\u5b66\u56fe\u5f62\u6a21\u677f\u5e93\u662f\u4e00\u7ec4\u5e7f\u6cdb\u5b9e\u73b0\u57fa\u672c\u56fe\u5f62\u7684\u5de5\u5177\u3002 GMP \uff1a\u7528\u4e8e\u4e2a\u9ad8\u7cbe\u5ea6\u8ba1\u7b97\u7684 C/C++ \u5e93\uff0c\u5904\u7406\u6709\u7b26\u53f7\u6574\u6570\uff0c\u6709\u7406\u6570\u548c \u6d6e\u70b9\u6570 \u3002 22\u3001 \u591a\u5a92\u4f53 GStreamer \uff1a\u6784\u5efa\u5a92\u4f53\u5904\u7406\u7ec4\u4ef6\u56fe\u5f62\u7684\u5e93 LIVE555 Streaming Media \uff1a\u4f7f\u7528\u5f00\u653e\u6807\u51c6\u534f\u8bae (RTP/RTCP, RTSP, SIP) \u7684\u591a\u5a92\u4f53\u6d41\u5e93 libVLC \uff1alibVLC (VLC SDK) \u5a92\u4f53\u6846\u67b6 QtAv \uff1a\u57fa\u4e8e Qt \u548c FFmpeg \u7684\u591a\u5a92\u4f53\u64ad\u653e\u6846\u67b6\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u8f7b\u800c\u6613\u4e3e\u5730\u7f16\u5199\u51fa\u4e00\u4e2a\u64ad\u653e\u5668 SDL \uff1a\u7b80\u5355\u76f4\u63a7\u5a92\u4f53\u5c42 SFML \uff1a\u5feb\u901f\uff0c\u7b80\u5355\u7684\u591a\u5a92\u4f53\u5e93 23\u3001 \u7f51\u7edc ACE \uff1aC++ \u9762\u5411\u5bf9\u8c61\u7f51\u7edc\u53d8\u6210\u5de5\u5177\u5305 Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93 Casablanca \uff1aC++ REST SDK cpp-netlib \uff1a\u9ad8\u7ea7\u7f51\u7edc\u7f16\u7a0b\u7684\u5f00\u6e90\u5e93\u96c6\u5408 Dyad.c \uff1aC \u8bed\u8a00\u7684\u5f02\u6b65\u7f51\u7edc libcurl : \u591a\u534f\u8bae\u6587\u4ef6\u4f20\u8f93\u5e93 Mongoose \uff1a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7f51\u7edc\u670d\u52a1\u5668 Muduo \uff1a\u7528\u4e8e Linux \u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u7684 C++ \u975e\u963b\u585e\u7f51\u7edc\u5e93 net_skeleton \uff1aC/C++ \u7684 TCP \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 nope.c \uff1a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8d85\u8f7b\u578b\u8f6f\u4ef6\u5e73\u53f0\uff0c\u7528\u4e8e\u53ef\u6269\u5c55\u7684\u670d\u52a1\u5668\u7aef\u548c\u7f51\u7edc\u5e94\u7528\u3002 \u5bf9\u4e8e C \u7f16\u7a0b\u4eba\u5458\uff0c\u53ef\u4ee5\u8003\u8651 node.js Onion :C \u8bed\u8a00 HTTP \u670d\u52a1\u5668\u5e93\uff0c\u5176\u8bbe\u8ba1\u4e3a\u8f7b\u91cf\u7ea7\uff0c\u6613\u4f7f\u7528\u3002 POCO \uff1a\u7528\u4e8e\u6784\u5efa\u7f51\u7edc\u548c\u57fa\u4e8e\u4e92\u8054\u7f51\u5e94\u7528\u7a0b\u5e8f\u7684 C++ \u7c7b\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728\u684c\u9762\uff0c\u670d\u52a1\u5668\uff0c\u79fb\u52a8\u548c\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3002 RakNet \uff1a\u4e3a\u6e38\u620f\u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u7684\u8de8\u5e73\u53f0\u7684\u5f00\u6e90 C++ \u7f51\u7edc\u5f15\u64ce\u3002 Tuf o \uff1a\u7528\u4e8e Qt \u4e4b\u4e0a\u7684 C++ \u6784\u5efa\u7684\u5f02\u6b65 Web \u6846\u67b6\u3002 WebSocket++ \uff1a\u57fa\u4e8e C++/Boost Aiso \u7684 websocket \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 ZeroMQ \uff1a\u9ad8\u901f\uff0c\u6a21\u5757\u5316\u7684\u5f02\u6b65\u901a\u4fe1\u5e93 24\u3001 \u7269\u7406\u5b66 \u52a8\u529b\u5b66\u4eff\u771f\u5f15\u64ce Box2D \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Bullet \uff1a3D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Chipmunk \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684 2D \u6e38\u620f\u7269\u7406\u5e93 LiquidFun \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce ODE \uff1a\u5f00\u653e\u52a8\u529b\u5b66\u5f15\u64ce - \u5f00\u6e90\uff0c\u9ad8\u6027\u80fd\u5e93\uff0c\u6a21\u62df\u521a\u4f53\u52a8\u529b\u5b66\u3002 ofxBox2d \uff1aBox2D \u5f00\u6e90\u6846\u67b6\u5305\u88c5\u5668\u3002 Simbody \uff1a\u9ad8\u6027\u80fd C++ \u591a\u4f53\u52a8\u529b\u5b66 / \u7269\u7406\u5e93\uff0c\u6a21\u62df\u5173\u8282\u751f\u7269\u529b\u5b66\u548c\u673a\u68b0\u7cfb\u7edf\uff0c\u50cf\u8f66\u8f86\uff0c\u673a\u5668\u4eba\u548c\u4eba\u4f53\u9aa8\u9abc\u3002 25\u3001 \u673a\u5668\u4eba\u5b66 MOOS-IvP \uff1a\u4e00\u7ec4\u5f00\u6e90 C++ \u6a21\u5757\uff0c\u63d0\u4f9b\u673a\u5668\u4eba\u5e73\u53f0\u7684\u81ea\u4e3b\u6743\uff0c\u5c24\u5176\u662f\u81ea\u4e3b\u7684\u6d77\u6d0b\u8f66\u8f86\u3002 MRPT \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u7f16\u7a0b\u5de5\u5177\u5305 PCL \uff1a\u70b9\u4e91\u5e93\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\uff0c\u5927\u89c4\u6a21\u7684\u5f00\u653e\u9879\u76ee\uff0c\u7528\u4e8e 2D/3D \u56fe\u50cf\u548c\u70b9\u4e91\u5904\u7406\u3002 Robotics Library (RL) \uff1a \u4e00\u4e2a\u72ec\u7acb\u7684 C++ \u5e93\uff0c\u5305\u62ec\u673a\u5668\u4eba\u52a8\u529b\u5b66\uff0c\u8fd0\u52a8\u89c4\u5212\u548c\u63a7\u5236\u3002 RobWork \uff1a\u4e00\u7ec4 C++ \u5e93\u7684\u96c6\u5408\uff0c\u7528\u4e8e\u673a\u5668\u4eba\u7cfb\u7edf\u7684\u4eff\u771f\u548c\u63a7\u5236\u3002 ROS \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b\u5e93\u548c\u5de5\u5177\u5e2e\u52a9\u8f6f\u4ef6\u5f00\u53d1\u4eba\u5458\u521b\u5efa\u673a\u5668\u4eba\u5e94\u7528\u7a0b\u5e8f\u3002 26\u3001 \u79d1\u5b66\u8ba1\u7b97 FFTW : \u7528\u4e00\u7ef4\u6216\u8005\u591a\u7ef4\u8ba1\u7b97 DFT \u7684 C \u8bed\u8a00\u5e93\u3002 GSL \uff1aGNU \u79d1\u5b66\u5e93\u3002 27\u3001 \u811a\u672c ChaiScript \uff1a\u7528\u4e8e C++ \u7684\u6613\u4e8e\u4f7f\u7528\u7684\u5d4c\u5165\u5f0f\u811a\u672c\u8bed\u8a00\u3002 Lua \uff1a\u7528\u4e8e\u914d\u7f6e\u6587\u4ef6\u548c\u57fa\u672c\u5e94\u7528\u7a0b\u5e8f\u811a\u672c\u7684\u5c0f\u578b\u5feb\u901f\u811a\u672c\u5f15\u64ce\u3002 luacxx \uff1a\u7528\u4e8e\u521b\u5efa Lua \u7ed1\u5b9a\u7684 C++ 11 API SWIG \uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u7684 C++ \u4ee3\u7801\u94fe\u63a5\u5230 JavaScript\uff0cPerl\uff0cPHP\uff0cPython\uff0cTcl \u548c Ruby \u7684\u5305\u88c5\u5668 / \u63a5\u53e3\u751f\u6210\u5668 V7 \uff1a\u5d4c\u5165\u5f0f\u7684 JavaScript \u5f15\u64ce\u3002 V8 \uff1a\u8c37\u6b4c\u7684\u5feb\u901f JavaScript \u5f15\u64ce\uff0c\u53ef\u4ee5\u88ab\u5d4c\u5165\u5230\u4efb\u4f55 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002 28\u3001 \u5e8f\u5217\u5316 Cap\u2019n Proto \uff1a\u5feb\u901f\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u548c RPC \u7cfb\u7edf\u3002 cereal \uff1aC++11 \u5e8f\u5217\u5316\u5e93 FlatBuffers \uff1a\u5185\u5b58\u9ad8\u6548\u7684\u5e8f\u5217\u5316\u5e93 MessagePack \uff1aC/C++ \u7684\u9ad8\u6548\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u5e93\uff0c\u4f8b\u5982 JSON protobuf \uff1a\u534f\u8bae\u7f13\u51b2\uff0c\u8c37\u6b4c\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u3002 protobuf-c \uff1aC \u8bed\u8a00\u7684\u534f\u8bae\u7f13\u51b2\u5b9e\u73b0 SimpleBinaryEncoding \uff1a\u7528\u4e8e\u4f4e\u5ef6\u8fdf\u5e94\u7528\u7a0b\u5e8f\u7684\u5bf9\u4e8c\u8fdb\u5236\u683c\u5f0f\u7684\u5e94\u7528\u7a0b\u5e8f\u4fe1\u606f\u7684\u7f16\u7801\u548c\u89e3\u7801\u3002 Thrift \uff1a\u9ad8\u6548\u7684\u8de8\u8bed\u8a00 IPC/RPC\uff0c\u7528\u4e8e C++\uff0cJava\uff0cPython\uff0cPHP\uff0cC# \u548c\u5176\u5b83\u591a\u79cd\u8bed\u8a00\u4e2d\uff0c\u6700\u521d\u7531 Twitter \u5f00\u53d1\u3002 29\u3001 \u89c6\u9891 libvpx \uff1aVP8/VP9 \u7f16\u7801\u89e3\u7801 SDK FFmpeg \uff1a\u4e00\u4e2a\u5b8c\u6574\u7684\uff0c\u8de8\u5e73\u53f0\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u7528\u4e8e\u8bb0\u5f55\uff0c\u8f6c\u6362\u89c6\u9891\u548c\u97f3\u9891\u6d41\u3002 libde265 \uff1a\u5f00\u653e\u7684 h.265 \u89c6\u9891\u7f16\u89e3\u7801\u5668\u7684\u5b9e\u73b0\u3002 OpenH264 \uff1a\u5f00\u6e90 H.364 \u7f16\u89e3\u7801\u5668\u3002 Theora \uff1a\u514d\u8d39\u5f00\u6e90\u7684\u89c6\u9891\u538b\u7f29\u683c\u5f0f\u3002 30\u3001 \u865a\u62df\u673a CarpVM \uff1aC \u4e2d\u6709\u8da3\u7684 VM\uff0c\u8ba9\u6211\u4eec\u4e00\u8d77\u6765\u770b\u770b\u8fd9\u4e2a\u3002 MicroPython \uff1a\u65e8\u5728\u5b9e\u73b0\u5355\u7247\u673a\u4e0a Python3.x \u7684\u5b9e\u73b0 TinyVM \uff1a\u7528\u7eaf\u7cb9\u7684 ANSI C \u7f16\u5199\u7684\u5c0f\u578b\uff0c\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u865a\u62df\u673a\u3002 31\u3001 Web \u5e94\u7528\u6846\u67b6 Civetweb \uff1a\u63d0\u4f9b\u6613\u4e8e\u4f7f\u7528\uff0c\u5f3a\u5927\u7684\uff0cC/C++ \u5d4c\u5165\u5f0f Web \u670d\u52a1\u5668\uff0c\u5e26\u6709\u53ef\u9009\u7684 CGI\uff0cSSL \u548c Lua \u652f\u6301\u3002 CppCMS \uff1a\u514d\u8d39\u9ad8\u6027\u80fd\u7684 Web \u5f00\u53d1\u6846\u67b6\uff08\u4e0d\u662f CMS\uff09. Crow \uff1a\u4e00\u4e2a C++ \u5fae\u578b web \u6846\u67b6\uff08\u7075\u611f\u6765\u81ea\u4e8e Python Flask\uff09 Kore : \u4f7f\u7528 C \u8bed\u8a00\u5f00\u53d1\u7684\u7528\u4e8e web \u5e94\u7528\u7a0b\u5e8f\u7684\u8d85\u5feb\u901f\u548c\u7075\u6d3b\u7684 web \u670d\u52a1\u5668 / \u6846\u67b6\u3002 libOnion \uff1a\u8f7b\u91cf\u7ea7\u7684\u5e93\uff0c\u5e2e\u52a9\u4f60\u4f7f\u7528 C \u7f16\u7a0b\u8bed\u8a00\u521b\u5efa web \u670d\u52a1\u5668\u3002 QDjango \uff1a\u4f7f\u7528 C++ \u7f16\u5199\u7684\uff0c\u57fa\u4e8e Qt \u5e93\u7684 web \u6846\u67b6\uff0c\u8bd5\u56fe\u6548\u4eff Django API\uff0c\u56e0\u6b64\u5f97\u6b64\u540d\u3002 Wt \uff1a\u5f00\u53d1 Web \u5e94\u7528\u7684 C++ \u5e93\u3002 32\u3001 XML XML \u5c31\u662f\u4e2a\u5783\u573e\uff0cxml \u7684\u89e3\u6790\u5f88\u70e6\u4eba\uff0c\u5bf9\u4e8e\u8ba1\u7b97\u673a\u5b83\u4e5f\u662f\u4e2a\u707e\u96be\u3002\u8fd9\u79cd\u7cdf\u7cd5\u7684\u4e1c\u897f\u5b8c\u5168\u6ca1\u6709\u5b58\u5728\u7684\u7406\u7531\u4e86\u3002-Linus Torvalds Expat \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u7684 xml \u89e3\u6790\u5e93 Libxml2 \uff1aGnome \u7684 xml C \u89e3\u6790\u5668\u548c\u5de5\u5177\u5305 libxml++ \uff1aC++ \u7684 xml \u89e3\u6790\u5668 PugiXML \uff1a\u7528\u4e8e C++ \u7684\uff0c\u652f\u6301 XPath \u7684\u8f7b\u91cf\u7ea7\uff0c\u7b80\u5355\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\u3002 RapidXml \uff1a\u8bd5\u56fe\u521b\u5efa\u6700\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\uff0c\u540c\u65f6\u4fdd\u6301\u6613\u7528\u6027\uff0c\u53ef\u79fb\u690d\u6027\u548c\u5408\u7406\u7684 W3C \u517c\u5bb9\u6027\u3002 TinyXML \uff1a\u7b80\u5355\u5c0f\u578b\u7684 C++XML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML2 \uff1a\u7b80\u5355\u5feb\u901f\u7684 C++CML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML++ \uff1aTinyXML \u7684\u4e00\u4e2a\u5168\u65b0\u7684\u63a5\u53e3\uff0c\u4f7f\u7528\u4e86 C++ \u7684\u8bb8\u591a\u8bb8\u591a\u4f18\u52bf\uff0c\u6a21\u677f\uff0c\u5f02\u5e38\u548c\u66f4\u597d\u7684\u5f02\u5e38\u5904\u7406\u3002 Xerces-C++ \uff1a\u7528\u53ef\u79fb\u690d\u7684 C++ \u7684\u5b50\u96c6\u7f16\u5199\u7684 XML \u9a8c\u8bc1\u89e3\u6790\u5668\u3002 33\u3001 \u591a\u9879\u6df7\u6742 \u4e00\u4e9b\u6709\u7528\u7684\u5e93\u6216\u8005\u5de5\u5177\uff0c\u4f46\u662f\u4e0d\u9002\u5408\u4e0a\u9762\u7684\u5206\u7c7b\uff0c\u6216\u8005\u8fd8\u6ca1\u6709\u5206\u7c7b\u3002 C++ Format \uff1aC++ \u7684\u5c0f\u578b\uff0c\u5b89\u5168\u548c\u5feb\u901f\u683c\u5f0f\u5316\u5e93 casacore \uff1a\u4ece aips++ \u6d3e\u751f\u7684\u4e00\u7cfb\u5217 C++ \u6838\u5fc3\u5e93 cxx-prettyprint \uff1a\u7528\u4e8e C++ \u5bb9\u5668\u7684\u6253\u5370\u5e93 DynaPDF \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 PDF \u751f\u6210\u5e93 gcc-poison \uff1a\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u7981\u6b62\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e0d\u5b89\u5168\u7684 C/C++ \u51fd\u6570\u7684\u7b80\u5355\u7684\u5934\u6587\u4ef6\u3002 googlemock \uff1a\u7f16\u5199\u548c\u4f7f\u7528 C++ \u6a21\u62df\u7c7b\u7684\u5e93 HTTP Parser \uff1aC \u7684 http \u8bf7\u6c42 / \u54cd\u5e94\u89e3\u6790\u5668 libcpuid \uff1a\u7528\u4e8e x86 CPU \u68c0\u6d4b\u76d2\u7279\u5f81\u63d0\u53d6\u7684\u5c0f\u578b C \u5e93 libevil \uff1a\u8bb8\u53ef\u8bc1\u7ba1\u7406\u5668 libusb \uff1a\u5141\u8bb8\u79fb\u52a8\u8bbf\u95ee USB \u8bbe\u5907\u7684\u901a\u7528 USB \u5e93 PCRE \uff1a\u6b63\u5219\u8868\u8fbe\u5f0f C \u5e93\uff0c\u7075\u611f\u6765\u81ea\u4e8e Perl \u4e2d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u529f\u80fd\u3002 Remote Call Framework \uff1aC++ \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u6846\u67b6\u3002 Scintilla \uff1a\u5f00\u6e90\u7684\u4ee3\u7801\u7f16\u8f91\u63a7\u4ef6 Serial Communication Library \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u8de8\u5e73\u53f0\uff0c\u4e32\u53e3\u5e93\u3002 SDS \uff1aC \u7684\u7b80\u5355\u52a8\u6001\u5b57\u7b26\u4e32\u5e93 SLDR \uff1a\u8d85\u8f7b\u7684 DNS \u89e3\u6790\u5668 SLRE \uff1a \u8d85\u8f7b\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5e93 Stage \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u6a21\u62df\u5668 VarTypes \uff1aC++/Qt4 \u529f\u80fd\u4e30\u5bcc\uff0c\u9762\u5411\u5bf9\u8c61\u7684\u7ba1\u7406\u53d8\u91cf\u7684\u6846\u67b6\u3002 ZBar \uff1a\u2018\u6761\u5f62\u7801\u626b\u63cf\u5668\u2019\u5e93\uff0c\u53ef\u4ee5\u626b\u63cf\u7167\u7247\uff0c\u56fe\u7247\u548c\u89c6\u9891\u6d41\u4e2d\u7684\u6761\u5f62\u7801\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\u3002 CppVerbalExpressions \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 C++ \u6b63\u5219\u8868\u8fbe\u5f0f QtVerbalExpressions \uff1a\u57fa\u4e8e C++ VerbalExpressions \u5e93\u7684 Qt \u5e93 PHP-CPP \uff1a\u4f7f\u7528 C++ \u6765\u6784\u5efa PHP \u6269\u5c55\u7684\u5e93 Better String \uff1aC \u7684\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e93\uff0c\u529f\u80fd\u66f4\u4e30\u5bcc\uff0c\u4f46\u662f\u6ca1\u6709\u7f13\u51b2\u6ea2\u51fa\u95ee\u9898\uff0c\u8fd8\u5305\u542b\u4e86\u4e00\u4e2a C++ \u5305\u88c5\u5668\u3002 34\u3001 \u8f6f\u4ef6 \u7528\u4e8e\u521b\u5efa\u5f00\u53d1\u73af\u5883\u7684\u8f6f\u4ef6 aardio : arrdio \u662f\u4e00\u4e2a\u80fd\u5728 windows \u7cfb\u7edf\u4e2d\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u4e00\u95e8\u8bed\u8a00\uff0c\u4e5f\u662f\u4e00\u4e2a\u8d85\u7ea7\u80f6\u6c34\u5de5\u5177\u3002\u4f60\u53ef\u4ee5\u7528 python\u3001java\u3001C\u3001C#\u3001javastrip\u3001PHP \u7b49\u6570\u503c\u7684\u7f16\u7a0b\u8bed\u8a00\u7ed3\u5408 arrdio \u51e0\u5206\u949f\u5c31\u53ef\u4ee5\u5f00\u53d1\u4e00\u6b3e\u5e26\u754c\u9762\u7684\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u4f60\u53ef\u4ee5\u7528 html \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6216\u8005\u7528\u5176\u4ed6\u754c\u9762\u5e93\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u3002\u4e00\u5207\u90fd\u662f\u4f60\u8bf4\u4e86\u7b97\uff01\u8d85\u5c0f\u7684\u8f6f\u4ef6\u4f53\u79ef\uff0c\u8d85\u5feb\u7684\u521b\u5efa\u901f\u5ea6\uff01 cmder : cmder \u662f\u4e00\u4e2a\u589e\u5f3a\u578b\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u4e0d\u4ec5\u53ef\u4ee5\u4f7f\u7528 windows \u4e0b\u7684\u6240\u6709\u547d\u4ee4\uff0c\u66f4\u723d\u7684\u662f\u53ef\u4ee5\u4f7f\u7528 linux \u7684\u547d\u4ee4, shell \u547d\u4ee4\u3002windows \u4e0b\u7684\u8f6f\u4ef6. 35\u3001 \u7f16\u8bd1\u5668 C/C++ \u7f16\u8bd1\u5668\u5217\u8868 Clang : \u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1\u7684 GCC \uff1aGNU \u7f16\u8bd1\u5668\u96c6\u5408 Intel C++ Compiler \uff1a\u7531\u82f1\u7279\u5c14\u516c\u53f8\u5f00\u53d1 LLVM \uff1a\u6a21\u5757\u5316\u548c\u53ef\u91cd\u7528\u7f16\u8bd1\u5668\u548c\u5de5\u5177\u94fe\u6280\u672f\u7684\u96c6\u5408 Microsoft Visual C++ \uff1aMSVC\uff0c\u7531\u5fae\u8f6f\u516c\u53f8\u5f00\u53d1 Open WatCom \uff1aWatcom\uff0cC\uff0cC++ \u548c Fortran \u4ea4\u53c9\u7f16\u8bd1\u5668\u548c\u5de5\u5177 TCC \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u7f16\u8bd1\u5668 36\u3001 \u5728\u7ebf\u7f16\u8bd1\u5668 \u5728\u7ebf C/C++ \u7f16\u8bd1\u5668\u5217\u8868 codepad \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u534f\u4f5c\u5de5\u5177 CodeTwist \uff1a\u4e00\u4e2a\u7b80\u5355\u7684\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4f60\u53ef\u4ee5\u7c98\u8d34\u7684 C,C++ \u6216\u8005 Java \u4ee3\u7801\uff0c\u5728\u7ebf\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c coliru \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / shell\uff0c \u652f\u6301\u5404\u79cd C++ \u7f16\u8bd1\u5668 Compiler Explorer \uff1a\u4ea4\u4e92\u5f0f\u7f16\u8bd1\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u6c47\u7f16\u8f93\u51fa CompileOnline \uff1aLinux \u4e0a\u5728\u7ebf\u7f16\u8bd1\u548c\u6267\u884c C++ \u7a0b\u5e8f Ideone \uff1a\u4e00\u4e2a\u5728\u7ebf\u7f16\u8bd1\u5668\u548c\u8c03\u8bd5\u5de5\u5177\uff0c\u5141\u8bb8\u4f60\u5728\u7ebf\u7f16\u8bd1\u6e90\u4ee3\u7801\u5e76\u6267\u884c\uff0c\u652f\u6301 60 \u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u3002 37\u3001 \u8c03\u8bd5\u5668 C/C++ \u8c03\u8bd5\u5668\u5217\u8868 Comparison of debuggers \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u8c03\u8bd5\u5668\u5217\u8868 GDB \uff1aGNU \u8c03\u8bd5\u5668 Valgrind \uff1a\u5185\u5b58\u8c03\u8bd5\uff0c\u5185\u5b58\u6cc4\u9732\u68c0\u6d4b\uff0c\u6027\u80fd\u5206\u6790\u5de5\u5177\u3002 38\u3001 \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u5217\u8868 AppCode \uff1a\u6784\u5efa\u4e0e JetBrains\u2019 IntelliJ IDEA \u5e73\u53f0\u4e0a\u7684\u7528\u4e8e Objective-C\uff0cC,C++\uff0cJava \u548c Java \u5f00\u53d1\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CLion \uff1a\u6765\u81ea JetBrains \u7684\u8de8\u5e73\u53f0\u7684 C/C++ \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 Code::Blocks \uff1a\u514d\u8d39 C\uff0cC++ \u548c Fortran \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CodeLite \uff1a\u53e6\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u514d\u8d39\u7684 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Dev-C++ \uff1a\u53ef\u79fb\u690d\u7684 C/C++/C++11 \u96c6\u6210\u5f00\u53d1\u73af\u5883 Eclipse CDT \uff1a\u57fa\u4e8e Eclipse \u5e73\u53f0\u7684\u529f\u80fd\u9f50\u5168\u7684 C \u548c C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Geany \uff1a\u8f7b\u91cf\u7ea7\u7684\u5feb\u901f\uff0c\u8de8\u5e73\u53f0\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 IBM VisualAge \uff1a\u6765\u81ea IBM \u7684\u5bb6\u5ead\u8ba1\u7b97\u673a\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 Irony-mode \uff1a\u7531 libclang \u9a71\u52a8\u7684\u7528\u4e8e Emacs \u7684 C/C++ \u5fae\u6a21\u5f0f KDevelop \uff1a\u514d\u8d39\u5f00\u6e90\u96c6\u6210\u5f00\u53d1\u73af\u5883 Microsoft Visual Studio \uff1a\u6765\u81ea\u5fae\u8f6f\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 NetBeans \uff1a\u4e3b\u8981\u7528\u4e8e Java \u5f00\u53d1\u7684\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u652f\u6301\u5176\u4ed6\u8bed\u8a00\uff0c\u5c24\u5176\u662f PHP\uff0cC/C++ \u548c HTML5\u3002 Qt Creator \uff1a\u8de8\u5e73\u53f0\u7684 C++\uff0cJavascript \u548c QML \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u662f Qt SDK \u7684\u4e00\u90e8\u5206\u3002 rtags \uff1aC/C++ \u7684\u5ba2\u6237\u7aef\u670d\u52a1\u5668\u7d22\u5f15\uff0c\u7528\u4e8e \u8ddf\u57fa\u4e8e clang \u7684 emacs \u7684\u96c6\u6210 Xcode \uff1a\u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1 YouCompleteMe \uff1a\u4e00\u4e2a\u7528\u4e8e Vim \u7684\u6839\u636e\u4f60\u6572\u7684\u4ee3\u7801\u5feb\u901f\u6a21\u7cca\u641c\u7d22\u5e76\u8fdb\u884c\u4ee3\u7801\u8865\u5168\u7684\u5f15\u64ce\u3002 39\u3001 \u6784\u5efa\u7cfb\u7edf Bear \uff1a\u7528\u4e8e\u4e3a clang \u5de5\u5177\u751f\u6210\u7f16\u8bd1\u6570\u636e\u5e93\u7684\u5de5\u5177 Biicode \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u7b80\u5355\u4f9d\u8d56\u7ba1\u7406\u5668\u3002 CMake \uff1a\u8de8\u5e73\u53f0\u7684\u514d\u8d39 \u5f00\u6e90\u8f6f\u4ef6 \u7528\u4e8e\u7ba1\u7406\u8f6f\u4ef6\u4f7f\u7528\u72ec\u7acb\u7f16\u8bd1\u7684\u65b9\u6cd5\u8fdb\u884c\u6784\u5efa\u7684\u8fc7\u7a0b\u3002 CPM \uff1a\u57fa\u4e8e CMake \u548c Git \u7684 C++ \u5305\u7ba1\u7406\u5668 FASTBuild \uff1a\u9ad8\u6027\u80fd\uff0c\u5f00\u6e90\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u652f\u6301\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7684\u7f16\u8bd1\uff0c\u7f13\u51b2\u548c\u7f51\u7edc\u5206\u5e03\u3002 Ninja \uff1a\u4e13\u6ce8\u4e8e\u901f\u5ea6\u7684\u5c0f\u578b\u6784\u5efa\u7cfb\u7edf Scons \uff1a\u4f7f\u7528 Python scipt \u914d\u7f6e\u7684\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177 tundra \uff1a\u9ad8\u6027\u80fd\u7684\u4ee3\u7801\u6784\u5efa\u7cfb\u7edf\uff0c\u751a\u81f3\u5bf9\u4e8e\u975e\u5e38\u5927\u578b\u7684\u8f6f\u4ef6\u9879\u76ee\uff0c\u4e5f\u80fd\u63d0\u4f9b\u6700\u597d\u7684\u589e\u91cf\u6784\u5efa\u6b21\u6570\u3002 tup \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u7528\u4e8e\u540e\u53f0\u76d1\u63a7\u53d8\u5316\u7684\u6587\u4ef6\u3002 40\u3001 \u9759\u6001\u4ee3\u7801\u5206\u6790 \u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u7684\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 Cppcheck \uff1a\u9759\u6001 C/C++ \u4ee3\u7801\u5206\u6790\u5de5\u5177 include-what-you-use \uff1a\u4f7f\u7528 clang \u8fdb\u884c\u4ee3\u7801\u5206\u6790\u7684\u5de5\u5177\uff0c\u53ef\u4ee5 #include \u5728 C \u548c C++ \u6587\u4ef6\u4e2d\u3002 OCLint \uff1a\u7528\u4e8e C\uff0cC++ \u548c Objective-C \u7684\u9759\u6001\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177\uff0c\u7528\u4e8e\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u3002 Clang Static Analyzer \uff1a\u67e5\u627e C\uff0cC++ \u548c Objective-C \u7a0b\u5e8f bug \u7684\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177 List of tools for static code analysis \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u9759\u6001\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 41\u3001 linux \u5b9e\u7528\u5de5\u5177 picocom : linux \u4e0b\u7684\u4e00\u4e2a\u597d\u7528\u7684\u4e32\u53e3\u7ec8\u7aef. w3m : \u7ec8\u7aef\u6d4f\u89c8\u5668, \u771f\u6b63\u7684\u7a0b\u5e8f\u5458\u5c31\u8be5\u4f7f\u7528\u547d\u4ee4\u884c\u6765\u6d4f\u89c8\u7f51\u9875\u3002 The Fuck : \u5728\u7ec8\u7aef\u4e0b\u662f\u4e0d\u662f\u7ecf\u5e38\u8f93\u9519\u547d\u4ee4\uff0c\u641e\u5f97\u81ea\u5df1\u5fc3\u70e6\u610f\u4e71\uff0cThe Fuck \u662f\u4e00\u6b3e\u4e86\u4e0d\u8d77\u7684\u5de5\u5177\uff0c\u5e2e\u4f60\u5f7b\u5e95\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5f53\u4f60\u8f93\u9519\u547d\u4ee4\u540e\uff0c\u53ea\u8981\u8f93\u5165 fuck \u547d\u4ee4\uff0c\u5b83\u4f1a\u5e2e\u4f60\u81ea\u52a8\u7ea0\u6b63\u9519\u8bef\uff0c\u7cbe\u5f69\u4e4b\u6781\uff01 tldr : tldr \u662f Too long, Don't read \u7684\u7f29\u5199\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u67e5\u770b\u5e38\u7528\u547d\u4ee4\u7684\u4f7f\u7528\u5b9e\u4f8b\uff0c\u6bd4\u5982 tar \u547d\u4ee4\uff0c\u90a3\u540e\u9762\u4e00\u957f\u4e32\u53c2\u6570\u8c01\u8bb0\u5f97\u6e05\u5462\uff1f\u5f53\u7136\uff0clinux \u5927\u4f6c\u9664\u5916\u3002 fzf : fzf \u662f\u4e00\u6b3e\u652f\u6301\u6a21\u7cca\u641c\u7d22\u7684\u4ea4\u4e92\u5f0f\u5de5\u5177\uff0c\u53ef\u4ee5\u7528\u6765\u67e5\u627e\u4efb\u4f55\u5217\u8868\u5185\u5bb9\uff0c\u5305\u62ec\u6587\u4ef6\u3001Git \u5206\u652f\u3001\u8fdb\u7a0b\u7b49\u3002 fd : \u7b80\u5355\u3001\u5feb\u901f\u3001\u597d\u7528\uff0c\u7528\u4e8e\u66ff\u6362 find \u7684\u641c\u7d22\u5de5\u5177\u3002 exa : \u7528\u6765\u66ff\u6362 ls \u547d\u4ee4\u7684\u73b0\u4ee3\u5316\u5de5\u5177\u3002 nnn : nnn (n\u00b3) \u662f\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u7ec8\u7aef\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u901f\u5ea6\u975e\u5e38\u5feb\u4e14\u51e0\u4e4e 0 \u914d\u7f6e\uff0c\u4e5f\u662f\u4e00\u4e2a\u975e\u5e38\u4e0d\u9519\u7684\u9009\u62e9\u3002 powerline : \u7ec8\u7aef\u672c\u8eab\u662f\u9ad8\u6548\u7684\uff0c\u4f46\u6709\u65f6\u4e5f\u7565\u663e\u4e4f\u5473\uff0c\u4f7f\u7528 powerline \u53ef\u4ee5\u4e3a\u7ec8\u7aef\u52a0\u4e0a\u5f3a\u5927\u7684 \u72b6\u6001\u680f\uff0c\u6bd4\u5982\u5728 vim \u4e2d\u663e\u793a\u5f53\u524d\u72b6\u6001\uff0c\u5728\u6253\u5f00 git \u76ee\u5f55\u65f6\u663e\u793a\u5f53\u524d\u5206\u652f\u7b49\u7b49\u3002 dtrx \u6709\u4e86\u8fd9\u4e2a\u5de5\u5177\u4f60\u57fa\u672c\u518d\u4e5f\u4e0d\u7528\u8bb0\u4f4f\u5982\u4f55\u5728 linux \u4e0a\u9762\u89e3\u538b\u5404\u79cd\u540e\u7f00\u7684\u6587\u4ef6\u4e86\uff0c\u4ec0\u4e48 tar.gz,tgz,xz,bz2,zip.rar \u7b49\u901a\u901a\u641e\u5b9a\uff0c\u8fd9\u662f\u4e00\u4e2a python \u5de5\u5177. autojump : \u8bb0\u5fc6\u8fdb\u8fc7\u7684\u6587\u4ef6\u5939\uff0c\u4e0b\u6b21\u53ef\u7528 j + \u6587\u4ef6\u5939\u540d \u76f4\u63a5\u8df3\u8fdb\uff0c \u5f88\u65b9\u4fbf. \u8f6f\u4ef6\u5b89\u88c5\u5b8c\u540e\u8f93\u5165\u4e0b\u9762\u547d\u4ee4\u751f\u6548\u7ec8\u7aef (echo \"\"# autojump\\nsource /usr/share/autojump/autojump.bash\">> ~/.bashrc) rebash : \u811a\u672c\u5e93 / \u6846\u67b6\u3002\u7279\u70b9\uff1a\u8fdb\u53e3\uff0c\u4f8b\u5916\uff0c\u6587\u4ef6\u6d4b\u8bd5... shutit : \u57fa\u4e8e bash \u548c pexpect \u7684\u81ea\u52a8\u5316\u6846\u67b6 dispatch : 50 \u884c\u53ef\u79fb\u690d shell \u811a\u672c\u4e2d\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002 bashful : \u4e00\u4e2a\u5e93\u7684\u96c6\u5408\uff0c\u4ee5\u7b80\u5316\u7f16\u5199 Bash \u811a\u672c ansi : \u5728\u7eaf bash \u4e2d\u7684 ANSI \u8f6c\u4e49\u7801 - \u66f4\u6539\u6587\u672c\u989c\u8272\uff0c\u5b9a\u4f4d\u5149\u6807\uff0c\u7b49\u7b49 history : \u975e\u5e38\u7b80\u5355\uff0c\u5c24\u5176\u662f\u5728\u4f60\u4f9d\u8d56\u4e8e\u590d\u5236\u4f7f\u7528\u8fc7\u7684\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e2a\u547d\u4ee4\u7279\u522b\u6709\u7528\u3002 sort, uniq\uff1a\u6392\u5e8f\u53bb\u91cd\u3002 awk, grep, sed\uff1a\u6587\u672c\u5904\u7406\u795e\u5668\u3002 jq \uff0c\u547d\u4ee4\u884c\u7684 json \u67e5\u8be2\u548c\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u9002\u5408\u67e5\u770b rest \u63a5\u53e3\u7684\u8f93\u51fa strace\uff0c\u6253\u5370\u51fa\u8fdb\u7a0b\u8c03\u7528\u4e86\u54ea\u4e9b\u7cfb\u7edf\u8c03\u7528\u3002 objdump\uff0c\u6253\u5370\u76ee\u6807\u7801\u548c\u53cd\u6c47\u7f16\u7ed3\u679c transfer.sh : \u53ef\u901a\u8fc7\u7b80\u5355\u7684\u547d\u4ee4\u884c\u6765\u5feb\u901f\u5b8c\u6210\u6587\u4ef6\u5171\u4eab\u64cd\u4f5c stegify : \u4e00\u6b3e\u795e\u5947\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u80fd\u5c06\u4efb\u610f\u6587\u4ef6\u9690\u85cf\u5230\u56fe\u7247\u91cc\u9762\u3002 Httpie \u4e00\u4e2a HTTP \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u4f7f\u7528\u8d77\u6765\u6bd4 curl \u66f4\u4e3a\u53cb\u597d\uff0c\u5e76\u652f\u6301\u8f93\u51fa JSON\u3001\u8bed\u6cd5\u9ad8\u4eae\u7b49\u7279\u6027\uff0c\u4e3a\u5f00\u53d1\u8005\u5448\u73b0\u66f4\u4e3a\u76f4\u89c2\u7684 UI\uff0c\u4e0e\u670d\u52a1\u5668\u95f4\u7684\u8c03\u8bd5\u4f53\u9a8c\u4e5f\u66f4\u4e3a\u4eba\u6027\u5316\u3002 PM2 : \u7528\u4ee5\u5728\u540e\u53f0\u8fd0\u884c\u548c\u7ba1\u7406\u8fdb\u7a0b SpaceVim \uff1a\u8fd9\u662f\u4e00\u4e2a vim \u63d2\u4ef6\uff0c\u4f7f\u4f60\u7684 Vim \u53d8\u6210\u5e26\u4ee3\u7801\u81ea\u52a8\u8865\u5168\u7b49\u529f\u80fd\u7684\u66f4\u52a0\u5f3a\u5927\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff01 axel\uff1a\u591a\u7ebf\u7a0b\u65ad\u70b9\u4e0b\u8f7d\u5de5\u5177\uff0c\u975e\u5e38\u597d\u7528\u3002\u4f8b\u5982\u4e0b\u56fe\u4e2d\u8fd9\u6837\uff0c\u6307\u5b9a\u4e86 8 \u4e2a\u7ebf\u7a0b\u540c\u65f6\u4e0b\u8f7d\u3002 nmon\uff1a\u5b83\u80fd\u591f\u5e2e\u4f60\u8fdb\u884c\u7535\u8111\u7684\u6027\u80fd\u76d1\u63a7\uff0c\u5305\u62ec CPU\uff0c\u5185\u5b58\uff0c\u78c1\u76d8 IO\uff0c\u7f51\u7edc IO\uff0c\u5e76\u4e14\u754c\u9762\u5f88\u70ab\u9177\uff0c\u662f\u4e0d\u662f\u5f88\u50cf\u9ed1\u5ba2\uff0c\u5feb\u53bb\u8bd5\u8bd5\u5427 nmon for Linux | Main Alex \uff1a\u5b83\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u5f88\u6709\u7528\u7684\u5c0f\u5de5\u5177\u3002\u9002\u7528\u4e8e\u660e\u6587\u6587\u672c\u6216\u8005\u683c\u5f0f\u4e3a Markdown \u6216 HTML \u7684\u6587\u6863\u3002Alex \u4f1a\u5bf9 \u201c\u6027\u522b\u504f\u597d\u3001\u6781\u7aef\u4e3b\u4e49\u3001\u79cd\u65cf\u76f8\u5173\u3001\u5b97\u6559\uff0c\u6216\u8005\u6587\u7ae0\u4e2d\u5176\u4ed6\u4e0d\u5e73\u7b49\u7684\u63aa\u8f9e\u201d \u4ea7\u751f\u8b66\u544a\u3002\u5982\u679c\u4f60\u60f3\u8981\u8bd5\u8bd5\u770b Alex\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u5728\u7ebf demo \uff1b GNU Aspell \uff1a\u5b83\u80fd\u591f\u4ea4\u4e92\u5f0f\u5730\u68c0\u6d4b\u6587\u672c\u6587\u6863\uff0c\u80fd\u9ad8\u4eae\u663e\u793a\u62fc\u5199\u9519\u8bef\uff0c\u8fd8\u80fd\u5728\u62fc\u5199\u9519\u8bef\u7684\u4e0a\u65b9\u63d0\u4f9b\u6b63\u786e\u7684\u62fc\u5199\u5efa\u8bae\u3002Aspell \u5728\u8fdb\u884c\u62fc\u5199\u68c0\u67e5\u7684\u65f6\u5019\uff0c\u540c\u6837\u80fd\u591f\u5ffd\u7565\u8bb8\u591a\u8bed\u6cd5\u6807\u8bb0\uff1b Proselint \uff1a\u5b83\u662f\u4e00\u6b3e\u5168\u80fd\u7684\u5b9e\u65f6\u68c0\u67e5\u5de5\u5177\u3002\u5b83\u4f1a\u627e\u51fa\u884c\u8bdd\u3001\u5927\u8bdd\u3001\u4e0d\u6b63\u786e\u65e5\u671f\u548c\u65f6\u95f4\u683c\u5f0f\u3001\u6ee5\u7528\u7684\u672f\u8bed \u7b49\u7b49 \u3002\u5b83\u4e5f\u5f88\u5bb9\u6613\u8fd0\u884c\u5e76\u5ffd\u7565\u6587\u672c\u4e2d\u7684\u6807\u8bb0\uff1b WordGrinder \uff1a\u5b83\u662f\u4e00\u6b3e\u4f7f\u7528\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u62e5\u6709\u8db3\u591f\u7684\u7f16\u5199\u548c\u53d1\u5e03\u529f\u80fd\u7684\u6587\u5b57\u7f16\u8f91\u5668\u3002\u5b83\u652f\u6301\u57fa\u672c\u7684\u683c\u5f0f\u548c\u6837\u5f0f\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u5c06\u4f60\u7684\u6587\u5b57\u4ee5 Markdown\u3001ODT\u3001LaTeX \u6216\u8005 HTML \u7b49\u683c\u5f0f\u5bfc\u51fa\uff1b cloc : \u7528\u6765\u7edf\u8ba1\u4ee3\u7801\u884c\u6570\uff0c\u7edf\u8ba1\u7ed3\u679c\u6bd4\u8f83\u5206\u7c7b\u6bd4\u8f83\u8be6\u7ec6\uff0c\u652f\u6301\u5927\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u3002 tldr : \u5982\u679c\u4f60\u7ecf\u5e38\u4e0d\u60f3\u8be6\u8bfb man \u6587\u6863\uff0c\u90a3\u4e48\u4f60\u5e94\u8be5\u8bd5\u8bd5\u8fd9\u4e2a\u5c0f\u5de5\u5177\u3002 cppman \uff1aC++ 98/11/14 \u624b\u518c\u67e5\u8be2 for Linux/MacOS icdiff \uff1a\u5206\u5c4f\u663e\u793a diff mcedit \uff1a\u7ec8\u7aef\u4e0b\u9762\u7684 NotePad++ owncloud \uff1aDropBox \u7684\u5f00\u6e90\u66ff\u4ee3\u54c1\uff0c\u63d0\u4f9b\u547d\u4ee4\u884c\u5ba2\u6237\u7aef owncloudcmd pm \uff1a\u5728 bash / zsh \u4e2d\u8fc5\u901f\u5207\u6362\u9879\u76ee\u76ee\u5f55 ncdu \uff1a\u53ef\u89c6\u5316\u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f, \u4f60\u53d1\u73b0\u6709\u4eba\u628a /home \u7a7a\u95f4\u6491\u7206\u4e86\uff0c\u5f71\u54cd\u4e86\u5927\u5bb6\u7684\u5de5\u4f5c\uff0c\u4f60\u6124\u6012\u4e86\u4e00\u5c42\u5c42\u7684 du\uff0c\u4e00\u5c42\u5c42\u7684 cd\uff0c\u6574\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u5228\u5783\u573e\u5806\u4e00\u6837\u7684\u6076\u5fc3\uff0c\u540e\u6765\u53d1\u73b0\u4e86 ncdu \u8fd9\u4e2a\u57fa\u4e8e ncurses \u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f\uff1a glances \uff1a\u66f4\u5f3a\u5927\u7684 htop / top \u4ee3\u66ff\u8005 htop \u4ee3\u66ff top\uff0cglances \u4ee3\u66ff htop\uff1a mc \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8 ranger \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8\u53e6\u4e00\u6b3e\u5185\u5bb9\u9884\u89c8\u8f6f\u4ef6\uff0c\u754c\u9762\u6ca1\u6709 mc \u90a3\u4e48\u6f02\u4eae\uff0c\u6807\u8bb0\u62f7\u8d1d\u4e5f\u6ca1\u5b83\u5f3a\uff0c\u4f46\u662f\u9884\u89c8\u529f\u80fd\u505a\u7684\u5f88\u4e0d\u9519\uff0c\u5982\u679c\u4f60\u4e60\u60ef vim \u952e\u4f4d\u7684\u8bdd\uff0c\u4f60\u4f1a\u53d1\u73b0 ranger \u6709\u4e9b\u5730\u65b9\u6bd4 mc \u505a\u7684\u597d\u4e0d\u5c11\uff1a dstat \uff1avmstat \u4ee3\u66ff\u8005, \u53ef\u80fd\u4e0d\u5c11\u4eba\u90fd\u7528\u8fc7\uff0c\u4f46\u662f\u672c\u95ee\u9898\u4e0b\u597d\u50cf\u6ca1\u4eba\u63d0\uff1f cheat \uff1a\u547d\u4ee4\u884c\u7b14\u8bb0, \u5c31\u662f\u5404\u79cd cheat sheet \uff0c\u6bd4\u5982\u7ecf\u5e38\u641e\u5fd8 redis \u547d\u4ee4\u7684\u8bdd\uff0c\u4f60\u53ef\u4ee5\u65b0\u5efa ~/.cheat/redis \u8fd9\u4e2a\u6587\u4ef6\uff0c\u5199\u4e00\u4e9b\u5185\u5bb9\uff0c\u6bd4\u5982\uff1a multitail \uff1a\u591a\u91cd tail, \u901a\u5e38\u4f60\u4e0d\u6b62\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\u8981\u76d1\u63a7\uff0c\u600e\u4e48\u529e\uff1f\u7ec8\u7aef\u8f6f\u4ef6\u91cc\u5f00\u591a\u4e2a tab \u592a\u5360\u5730\u65b9\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u8fd9\u4e2a\u5de5\u5177\uff1a bro \uff1a\u4ee5\u7528\u4f8b\u4e3a\u4e3b\u7684\u5e2e\u52a9\u7cfb\u7edf, \u7c7b\u4f3c\u4e8e man, \u4f46\u662f\u5bf9\u65b0\u624b\u53cb\u597d. http.server : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u4f46\u6ca1\u6709\u4e0a\u4f20\u529f\u80fd. SimpleHTTPServerWithUpload.py : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u6709\u4e0a\u4f20\u529f\u80fd. \u6709 python2 \u548c python3 \u4e24\u4e2a\u7248\u672c. \u53c2\u8003\u8fde\u63a5: \u5e72\u8d27 | C++ \u8d44\u6e90\u3001\u6846\u67b6\u5927\u5168\uff0c\u63a8\u8350\u6536\u85cf https://www.zhihu.com/question/59227720/answer/286665684 https://www.zhihu.com/question/59227720/answer/578875058 https://www.zhihu.com/question/59227720/answer/163933473 https://www.zhihu.com/question/59227720/answer/163966430","title":"\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#1os","text":"\u9e3f\u8499 OS \uff1a \u4e00\u6b3e\u9762\u5411\u5168\u573a\u666f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 RT-Thread \uff1a\u4e00\u6b3e\u5c0f\u800c\u7f8e\u7684\u7269\u8054\u7f51\u64cd\u4f5c\u7cfb\u7edf\u3002 TencentOS tiny \uff1a\u4e00\u6b3e\u9762\u5411\u7269\u8054\u7f51\u9886\u57df\u5f00\u53d1\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 freertos \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u64cd\u4f5c\u7cfb\u7edf\u3002 \u00b5C/OS \uff1a\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 Azure RTOS \uff1aAzure RTOS \u662f\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5f00\u53d1\u5957\u4ef6\u3002 eventos-nano \uff1a\u4e00\u4e2a\u8d85\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f\u5f00\u53d1\u6846\u67b6\uff0c\u4e8b\u4ef6\u9a71\u52a8\uff0c\u5360\u7528\u8d44\u6e90\u5c0f\uff0c\u53ef\u8fd0\u7528\u4e8e\u5404\u578b\u5355\u7247\u673a\u3002 zephyr \uff1aZephyr \u662f Linux \u57fa\u91d1\u4f1a\u63a8\u51fa\u7684\u4e00\u4e2a\u9002\u7528\u4e8e\u7269\u8054\u7f51\u7684\u5c0f\u578b\u53ef\u4f38\u7f29\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 mbed-os \uff1aARM \u81ea\u5df1\u6253\u9020\u3001\u4e3b\u6253 IoT \u7684\u4e00\u6574\u5957\u8f6f\u4ef6\u89e3\u51b3\u65b9\u6848 \u3002 BabyOS \uff1a \u4e13\u4e3a MCU \u9879\u76ee\u5f00\u53d1\u63d0\u901f\u7684\u4ee3\u7801\u6846\u67b6 \u3002 LuatOS \uff1a LuatOS \u662f\u8fd0\u884c\u5728\u5d4c\u5165\u5f0f\u786c\u4ef6\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\uff0c\u53ea\u9700\u8981\u5c11\u91cf\u5185\u5b58\u7684 flash \u7a7a\u95f4\u5c31\u80fd\u8fd0\u884c\uff0c\u7528\u6237\u7f16\u5199 lua \u4ee3\u7801\u5c31\u53ef\u5b8c\u6210\u5404\u79cd\u529f\u80fd\u3002 Contiki-OS \uff1a \u4e00\u4e2a\u5c0f\u578b\u7684\uff0c\u5f00\u6e90\u7684\uff0c\u6781\u6613\u79fb\u690d\u7684\u591a\u4efb\u52a1\u64cd\u4f5c\u7cfb\u7edf\u3002 DJYOS \uff1a \u90fd\u6c5f\u5830\u64cd\u4f5c\u7cfb\u7edf\u3002 klite \uff1a \u7b80\u6d01\u6613\u7528\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 lmosem \uff1a \u4e00\u4e2a\u5b8c\u5168\u4ece\u7b2c\u4e00\u884c\u5f15\u5bfc\u4ee3\u7801\u5f00\u59cb\u7f16\u5199\uff0c\u57fa\u4e8e ARM \u5e73\u53f0\uff0c\u652f\u6301\u591a\u8fdb\u7a0b\u3001\u591a CPU\u3001\u5185\u5b58\u7ba1\u7406\u3001\u6587\u4ef6\u4e0e\u8bbe\u5907\u7ba1\u7406\u7684\u5168 32 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 freenos \uff1aFreeNOS \u5fae\u5185\u6838\u64cd\u4f5c\u7cfb\u7edf\u3002 ros \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\u3002 openwrt \uff1aopenwrt \u6587\u6863\u3002 cola_os \uff1a300 \u884c\u4ee3\u7801\u5b9e\u73b0\u591a\u4efb\u52a1\u7ba1\u7406\u7684 OS\u3002 MS-RTOS \uff1a Micro Safe RTOS \u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"1\u3001OS"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#2","text":"ametal \u6216 ametal \uff1aAMetal \u662f\u82af\u7247\u7ea7\u7684\u88f8\u673a\u8f6f\u4ef6\u5305\uff0c\u5b9a\u4e49\u4e86\u8de8\u5e73\u53f0\u7684\u901a\u7528\u63a5\u53e3\u3002 Melon \uff1a\u4e00\u4e2a\u7528\u4e8e\u7b80\u5316\u5f00\u53d1\u7684 C \u6846\u67b6\u5e93\u3002 zlog \uff1a\u4e00\u4e2a\u9ad8\u53ef\u9760\u6027\u3001\u9ad8\u6027\u80fd\u3001\u7eaf C \u65e5\u5fd7\u51fd\u6570\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 Smartlink \uff1aLinux \u4e0a\u5b9e\u73b0\u7684 smartconfig\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 CodeBrick \uff1a\u4e00\u79cd\u65e0 OS \u7684 MCU \u5b9e\u7528\u8f6f\u4ef6\u7ba1\u7406\u7cfb\u7edf\u3002 RIL \uff1a\u4e00\u6b3e\u4e13\u95e8\u4e3a\u5d4c\u5165\u5f0f\u5e73\u53f0\u5f00\u53d1\u7684\u65e0\u7ebf\u901a\u4fe1\u6a21\u5757 (GSM/GPRS/CatM1/NB) \u7ba1\u7406\u6846\u67b6\u3002 cJSON \uff1a\u4e00\u4e2a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8f7b\u91cf\u7ea7\u7684 JSON \u89e3\u6790\u5e93\u3002 jsmn \uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u57fa\u4e8e C \u8bed\u8a00\u7684 JSON \u89e3\u6790\u5e93\u3002 inih \uff1a C \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 MultiTimer \uff1a \u4e00\u4e2a\u8f6f\u4ef6\u5b9a\u65f6\u5668\u6269\u5c55\u6a21\u5757\u3002 MultiButton \uff1a \u4e00\u4e2a\u5c0f\u5de7\u7b80\u5355\u6613\u7528\u7684\u4e8b\u4ef6\u9a71\u52a8\u578b\u6309\u952e\u9a71\u52a8\u6a21\u5757\u3002 SmartTimer \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u57fa\u4e8e STM32 \u7684\u5b9a\u65f6\u5668\u8c03\u5ea6\u5668 \u3002 FlexibleButton \uff1a\u4e00\u4e2a\u57fa\u4e8e\u6807\u51c6 C \u8bed\u8a00\u7684\u5c0f\u5de7\u7075\u6d3b\u7684\u6309\u952e\u5904\u7406\u5e93\u3002 CmBacktrace \uff1a \u4e00\u6b3e\u9488\u5bf9 ARM Cortex-M \u7cfb\u5217 MCU \u7684\u9519\u8bef\u4ee3\u7801\u81ea\u52a8\u8ffd\u8e2a\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 limlog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 NanoLog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 EasyFlash \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f Flash \u5b58\u50a8\u5668\u5e93 \u3002 SFUD \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u4e32\u884c SPI Flash \u901a\u7528\u9a71\u52a8\u5e93\u3002 lw_oopc \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u6846\u67b6\u3002 PLOOC \uff1a\u53d7\u4fdd\u62a4\u7684\u4f4e\u5f00\u9500\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3002 cmd-parser \uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u597d\u7528\u7684\u547d\u4ee4\u89e3\u6790\u5668\u3002 mqttclient \uff1a\u4e00\u4e2a\u7701\u8d44\u6e90\u3001\u9ad8\u7a33\u5b9a\u7684 MQTT \u5ba2\u6237\u7aef\u3002 NorthFrame \uff1a\u4e00\u4e2a\u5355\u7247\u673a\u6781\u7b80\u56fe\u5f62\u5316\u72b6\u6001\u673a\u6846\u67b6 \u3002 letter-shell \uff1a\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u5d4c\u5165\u5f0f shell\u3002 nr_micro_shell \uff1a shell for MCU\uff0c\u5355\u7247\u673a\u547d\u4ee4\u884c\u4ea4\u4e92\u3002 pigweed \uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u76ee\u6807\u5e93\uff08\u6a21\u5757\uff09\u96c6\u5408\u3002 lwrb \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u901a\u7528\u73af\u7f13\u51b2\u533a\u7ba1\u7406\u5668\u5e93\u3002 cQueue \uff1a\u4f7f\u7528 ANSI C \u7f16\u5199\u7684\u6d88\u606f\u961f\u5217\u529f\u80fd\u51fd\u6570\u3002 Unity \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u3001\u9002\u5408\u5d4c\u5165\u5f0f\u7684\u6d4b\u8bd5\u6846\u67b6\u3002 Embedded Unit \uff1a \u662f\u4e2a\u7eaf\u6807\u51c6 c \u6784\u5efa\u7684\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 CuTest \uff1a\u4e00\u6b3e\u5fae\u5c0f\u7684 C \u8bed\u8a00\u5355\u5143\u6d4b\u8bd5\u6846\uff0c \u5168\u90e8\u4ee3\u7801\u52a0\u8d77\u6765\u4e0d\u5230\u4e00\u5343\u884c\u3002 cmockery \uff1a \u8c37\u6b4c C \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6\u3002 znfat \uff1a\u632f\u5357 fat\uff0c\u56fd\u4ea7\u5d4c\u5165\u5f0f\u6587\u4ef6\u7cfb\u7edf\u65b9\u6848 \u3002 libu \uff1a\u4e00\u4e2a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 toolkit \uff1aToolKit \u662f\u4e00\u5957\u5e94\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u7684\u901a\u7528\u5de5\u5177\u5305\u3002 LWIP \uff1a \u4e00\u4e2a\u5c0f\u578b\u5f00\u6e90\u7684 TCP/IP \u534f\u8bae\u6808 \u3002 SQLite \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u5173\u7cfb\u6570\u636e\u5e93\u3002 OpenBLT \uff1a\u4e00\u79cd\u5f00\u6e90\u5f15\u5bfc\u52a0\u8f7d\u7a0b\u5e8f\u3002 Linux Lab \uff1a Linux \u5185\u6838\u5b9e\u9a8c\u5ba4\uff0c\u57fa\u4e8e Docker/Qemu \u7684\u6781\u901f Linux \u5185\u6838\u5b66\u4e60\u3001\u5f00\u53d1\u548c\u6d4b\u8bd5\u73af\u5883\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 mbedtls \uff1a\u4e00\u4e2a\u5f00\u6e90\u3001\u4fbf\u643a, \u6613\u4e8e\u4f7f\u7528, \u53ef\u8bfb\u7684\u548c\u7075\u6d3b\u7684 SSL \u5e93\u3002 mosquitto \u6216 mosquitto(\u4e0b\u8f7d\u901f\u5ea6\u5feb) \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684 MQTT \u4ee3\u7406\u3002 inih \uff1aC \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 QP \uff1aQP \u5b9e\u65f6\u5d4c\u5165\u5f0f\u6846\u67b6\u3002 MS-RTOS \uff1aMicro Safe RTOS \u3002 protobuf-c \uff1aprotobuf-c\u3002 eepromfs \uff1a \u57fa\u4e8e EEPROM \u7684\u7b80\u6613\u7c7b\u6587\u4ef6\u7684\u6570\u636e\u8bfb\u5199\u5e93 \u3002 gear-lib \uff1a \u9002\u7528\u4e8e IOT / \u5d4c\u5165\u5f0f / \u7f51\u7edc\u670d\u52a1\u5f00\u53d1\u7684 C \u5e93 \u3002 mult_timer \uff1a \u4e00\u4e2a Linux \u4e0b\u7684\u8d85\u7ea7\u7cbe\u7b80\u7684\u591a\u91cd\u5b9a\u65f6\u5668 \u3002 EFSM \uff1a \u662f\u4e00\u4e2a\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684\u6709\u9650\u72b6\u6001\u673a \u3002 EasyX \uff1a\u4e00\u4e2a\u514d\u8d39\u7684\u56fe\u5f62\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 sys/queue.h \uff1a\u7528\u5b8f\u5b9e\u73b0\u7684\u5e38\u7528\u6570\u636e\u7ed3\u6784\u3002 nanomsg \uff1a\u4e00\u4e2a\u5b9e\u73b0\u4e86\u51e0\u79cd \u201c\u53ef\u6269\u5c55\u534f\u8bae\u201d \u7684\u9ad8\u6027\u80fd\u901a\u4fe1\u5e93\u3002 thttpd \uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u5c0f\u578b\uff0c\u53ef\u79fb\u690d\uff0c\u5feb\u901f\u4e14\u5b89\u5168\u7684 HTTP \u670d\u52a1\u5668\u3002 boa \uff1a\u4e00\u4e2a\u5c0f\u5de7\u9ad8\u6548\u7684 web \u670d\u52a1\u5668\u3002 FreeTpye \uff1a\u5b57\u4f53\u6e32\u67d3\u5e93\u3002 qpc \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u72b6\u6001\u673a\u5b9e\u73b0\u3002 Quantum Leaps \uff1a\u72b6\u6001\u673a\u7ec4\u7ec7\u3002 ZBar \uff1a\u4e8c\u7ef4\u7801\u626b\u63cf\u5de5\u5177\u548c\u5f00\u53d1\u5305. FFmpeg \uff1a\u591a\u5a92\u4f53\u5904\u7406\u5de5\u5177\u5e93. libnabo \uff1a\u662f\u4e00\u4e2a\u5feb\u901f\u4e3a\u4f4e\u7ef4\u5ea6\u7a7a\u95f4\u63d0\u4f9b K \u6700\u8fd1\u90bb\u5c45\u7b97\u6cd5\u5e93\u3002 DSAL \uff1a\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u5e93\u3002 FLINT \uff1a\u662f\u4e00\u4e2a\u6570\u8bba\u5e93\uff0c\u7528 C \u8bed\u8a00\u7f16\u5199\uff0c\u5b83\u5305\u62ec\u4e00\u4e2a\u975e\u5e38\u5feb\u7684\u591a\u9879\u5f0f\u7b97\u6cd5\u5e93\u3002 LibMMSeg \uff1a\u4e2d\u6587\u5206\u8bcd\u8f6f\u4ef6\u5305 \u3002 CDS \uff1aCDS \u662f\u4e00\u4e2a C++ \u6a21\u677f\u5e93\uff0c\u5305\u542b lock-free and fine-grained \u7b97\u6cd5\u3002 hashlib++ \uff1a\u662f\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u7528\u6765\u751f\u6210 checksum \u7b97\u6cd5\u3002 libcstl \uff1aC \u8bed\u8a00\u7f16\u5199\u7684\u4e00\u4e2a\u901a\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u5e38\u7528\u7684\u7b97\u6cd5\u5e93\u3002 Botan \uff1aBotan \u662f\u4e00\u4e2a C++ \u7684\u52a0\u5bc6\u7b97\u6cd5\u5e93\u3002 CGAL \uff1a\u8ba1\u7b97\u51e0\u4f55\u7b97\u6cd5\u5e93\u3002 MyMediaLite \uff1a\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u591a\u7528\u9014\u7684\u63a8\u8350\u7cfb\u7edf\u7684\u7b97\u6cd5\u5e93\u3002 cblas \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 blas \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002f2c \u5b98\u7f51\u3002 clapack \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 lapack \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002 scalapack \uff1a\u63d0\u4f9b\u5e76\u884c\u8fd0\u7b97\u7684 lapack \u5e93\uff0c\u6e90\u7801\u7528 fortran \u7f16\u5199\u3002 armadillo \uff1a\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\uff0c\u6e90\u7801\u7528 c++ \u7f16\u5199\u3002 openblas \uff1a\u9488\u5bf9 intel cpu \u4f18\u5316\u7684 blas \u5e93\u3002 mkl \uff1a\u6269\u5c55\u7684\u4e14\u9488\u5bf9 intel cpu \u4f18\u5316\u7684\u5e93\uff0c\u5305\u62ec\u5feb\u901f\u5085\u7acb\u53f6\u53d8\u6362\uff08FFT\uff09\u3001\u77e2\u91cf\u6570\u5b66\u5e93\u3002 eigen \uff1aC++ \u5199\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\u3002 libjpeg \uff1a\u7528 libjpeg \u5e93\u5728 LCD \u4e0a\u663e\u793a\u56fe\u7247\u3002 x264 \uff1ax264 \u5f00\u6e90\u7684\u89e3\u7801\u7f16\u7801\u5e93\u3002 ws2812 \uff1aws2812 \u9a71\u52a8\u5e93\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"2\u3001\u5b9e\u7528\u5e93 / \u6846\u67b6"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#3gui","text":"GuiLite \uff1a\u5927\u9053\u81f3\u7b80 - 5 \u5343\u884c / \u4ec5\u5934\u6587\u4ef6 / \u5168\u5e73\u53f0 GUI \u5e93 \u3002 yoxios \uff1a \u57fa\u4e8e Linux \u5f00\u53d1\u7684\u8f7b\u91cf\u7ea7\u7269\u8054\u7f51\u7cfb\u7edf\u548c\u786c\u4ef6\u5e73\u53f0\u3002 ToughGFX \uff1a \u4e00\u4e2a C++ \u7f16\u5199\u7684 GUI \u8f6f\u4ef6\u6846\u67b6 \u3002 emwin \uff1a\u4e00\u4e2a\u8001\u724c GUI \u5e93\u3002 littlevGL \uff1a \u4e00\u4e2a\u514d\u8d39\u7684\u5f00\u6e90\u56fe\u5f62\u5e93\u3002 \u91ce\u725b LittlevGL demo \uff1a\u57fa\u4e8e\u91ce\u725b\u5f00\u53d1\u677f\u7684 LittlevGL demo \u7a0b\u5e8f \u3002 MonoGUI \uff1a\u4e00\u4e2a\u9ed1\u767d\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7cfb\u7edf \u3002 MiniGUI \uff1a \u4e00\u4e2a\u5feb\u901f\u3001\u7a33\u5b9a\u3001\u8de8\u64cd\u4f5c\u7cfb\u7edf\u7684 GUI\u3002 QT \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6\u3002 QT_Creator \uff1aQT_Creator \u4e0b\u8f7d\u94fe\u63a5\u3002 Gtk \uff1a \u4e00\u4e2a\u7528\u4e8e\u521b\u9020\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7684\u56fe\u5f62\u5e93\u3002 AWTK \uff1a\u662f ZLG \u503e\u5fc3\u6253\u9020\u7684\u4e00\u5957\u57fa\u4e8e C \u8bed\u8a00\u5f00\u53d1\u7684 GUI \u6846\u67b6 \u3002 \u73b2\u73d1 GUI \uff1a\u73b2\u73d1 GUI \u6559\u7a0b\u9875\u3002 std \uff1a\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5c0f\u578b\u56fe\u5f62\u5e93\u3002 CUGUI \uff1a\u4e3a\u5355\u7247\u673a\u5199\u7684 GUI \uff0c\u652f\u6301\u5b57\u4f53\uff0c\u6309\u952e\uff0c\u56fe\u7247\uff0c\u6ed1\u52a8\u6761\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"3\u3001GUI \u76f8\u5173"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#4","text":"ElectronBot \uff1a\u4e00\u4e2a\u684c\u9762\u7ea7\u5c0f\u673a\u5668\u4eba\u3002 Planck-Pi \uff1a\u8d85\u8ff7\u4f60 Linux \u5f00\u53d1\u677f\u3002 qt_2019_ncov \uff1a\u57fa\u4e8e Qt/C++ \u5b9e\u73b0\u7684\u65b0\u51a0\u80ba\u708e\u75ab\u60c5\u76d1\u63a7\u5e73\u53f0\u3002 H7-TOOL_STM32H7_App \uff1a\u5b89\u5bcc\u83b1 H7-TOOL \u591a\u529f\u80fd\u5f00\u53d1\u5de5\u5177\u3002 the-little-bili-tv \uff1a\u57fa\u4e8e esp32+lvgl8.0 \u7684\u54d4\u54e9\u54d4\u54e9\u5c0f\u7535\u89c6\u3002 DAPLink/CMSIS DAP \uff1a\u4e00\u4e2a\u8c03\u8bd5\u5668\uff0c \u96c6\u6210\u4e0b\u8f7d\u3001\u8c03\u8bd5\u548c USB \u865a\u62df\u4e32\u53e3\u3002 Crazepony \uff1aCrazepony \u5f00\u6e90\u56db\u8f74\u98de\u884c\u5668\u3002 MiniQ \uff1a\u4e00\u4e2a\u8ff7\u4f60\u56db\u8f74\u98de\u884c\u5668\u3002 LiPow-Firmware \uff1a\u57fa\u4e8e STM32G0 \u91c7\u7528 USB type-C \u4f9b\u7535\u7684\u5f00\u6e90\u9502\u7535\u6c60\u5145\u7535\u5668\u3002 Avem \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u3002 esp8266-lattice-clock \uff1aEsp8266 \u591a\u529f\u80fd\u70b9\u9635\u65f6\u949f\u3002 SoftWareSerial \uff1a\u4e00\u4e2a STM32 IO \u53e3\u6a21\u62df\u5b9e\u73b0\u8f6f\u4ef6\u4e32\u53e3\u7a0b\u5e8f\u3002 \u4e32\u53e3 ISP \u7a0b\u5e8f \uff1a\u4e00\u4e2a stm32 \u4e32\u53e3 ISP \u7a0b\u5e8f\u3002 DSO_Nano \uff1a\u4e00\u4e2a\u624b\u6301\u793a\u6ce2\u5668\u3002 DSView \uff1a \u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u903b\u8f91\u5206\u6790\u4eea\u3002 MCU-Development \uff1a \u57fa\u4e8e 51\u3001430\u3001STM32F10X\u3001STM32F407X\u3001T4MC123G \u5e73\u53f0\u7684\u5404\u5e38\u89c1\u786c\u4ef6\u6a21\u5757 demo\u3002 Arduino \uff1a \u5f00\u6e90\u7535\u5b50\u539f\u578b\u5e73\u53f0\u3002 EWAHBoolArray \uff1a bitmap \u7b97\u6cd5\u3002 mcush \uff1aMCU shell\u3002 DoST \uff1a Linux \u4e0b\u5f00\u53d1 STM32 \u3002 Avem : \u8fd9\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u9879\u76ee\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"4\u3001\u9879\u76ee / \u8f6f\u786c\u7ed3\u5408"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#5","text":"100ask download \uff1a\u767e\u6587\u7f51\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 armfly \uff1a\u5b89\u5bcc\u83b1 / \u786c\u6c49\u5d4c\u5165\u5f0f\u8bba\u575b\u3002 fire download \uff1a\u91ce\u706b\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 openedv download \uff1a\u6b63\u70b9\u539f\u5b50\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 \u91ce\u706b \uff1a\u91ce\u706b\u7535\u5b50\u8bba\u575b\u3002 \u6b63\u70b9 \uff1a\u6b63\u70b9\u539f\u5b50\u8bba\u575b\u3002 \u5c0f\u718a\u732b C++ IDE \uff1a\u8de8\u5e73\u53f0\u3001\u8f7b\u91cf\u6613\u7528\u7684\u5f00\u6e90 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 ST \uff1aST \u4e2d\u6587\u793e\u533a\u3002 \u8baf\u4e3a\u5f00\u53d1\u793e\u533a \uff1a\u5317\u4eac\u8baf\u4e3a ARM \u5f00\u53d1\u793e\u533a\u3002 \u8baf\u4e3a\u5b98\u7f51 \uff1a\u8baf\u4e3a\u5b98\u7f51\u3002 NXP \u793e\u533a \uff1a\u6069\u667a\u6d66\u8bba\u575b\u3002 Linux \uff1aLinux \u5185\u6838\u5b98\u7f51\u3002 Linux \u6e90\u7801 \uff1a\u53ef\u5728\u7ebf\u9605\u8bfb Linux \u5185\u6838\u6e90\u7801\u3002 Buildroot \uff1abuildroot \u6e90\u7801\u3002 Debian \uff1aDebian \u5b98\u7f51\u3002 Ubuntu \uff1aUbuntu \u5b98\u7f51\u3002 BOA \u5b98\u7f51 \uff1a\u4e00\u4e2a\u5355\u4efb\u52a1 web \u670d\u52a1\u5668 \uff0c\u53ef\u4ee5\u79fb\u690d\u5230\u5d4c\u5165\u5f0f\u5e73\u53f0\u3002 \u8354\u679d\u6d3e \uff1a\u8354\u679d\u6d3e\u6307\u5357\u3002 \u6e05\u534e\u955c\u50cf\u7ad9 \uff1a\u6e05\u534e\u5927\u5b66\u5f00\u6e90\u8f6f\u4ef6\u955c\u50cf\u7ad9\u3002 \u4e2d\u79d1\u5927\u955c\u50cf\u7ad9 \uff1a\u4e2d\u56fd\u79d1\u6280\u5927\u5b66\u955c\u50cf\u7ad9\u3002 u-boot \uff1au-boot \u6e90\u7801\u4e0b\u8f7d\u9875\u9762\u3002 bear-pi \uff1a\u5c0f\u718a\u6d3e demo\u3002 \u5b85\u5b66\u90e8\u843d \uff1a\u4e00\u4e2a Linux\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u5185\u6838\u3001\u9a71\u52a8\u5f00\u53d1\u5b66\u4e60\u7f51\u7ad9\u3002 \u5355\u7247\u673a\u6559\u7a0b\u7f51 \uff1a\u5355\u7247\u673a\u57fa\u7840\u3001\u8bbe\u8ba1\u5b9e\u4f8b\u3001\u8bba\u575b\u3002 GNU \uff1aGNU \u5b98\u7f51\u3002 ChinaUnix \uff1aLinux/Unix \u76f8\u5173\u3002 PyQt5 \uff1aPyQt5 \u6559\u7a0b\u3002 qter \uff1aQT \u5f00\u6e90\u793e\u533a\u3002 git \u624b\u518c \uff1agit \u5b66\u4e60\u624b\u518c\u3002 \u5f00\u6e90\u9879\u76ee\u98ce\u683c \uff1aGoogle \u5f00\u6e90\u9879\u76ee\u98ce\u683c\u6307\u5357 (\u4e2d\u6587\u7248)\u3002 \u7535\u5b50\u4e16\u5bb6 \uff1a\u4e00\u4e2a\u7535\u5b50\u7c7b\u5bfc\u822a\u7f51\u7ad9\u3002 21ic \uff1a21IC \u4e2d\u56fd\u7535\u5b50\u7f51\u3002 \u82af\u8def\u6052\u7535\u5b50 \uff1a\u5c0f\u6885\u54e5\u535a\u5ba2\u3001FPGA \u8bba\u575b\u3002 \u5d4c\u5165\u5f0f\u5f00\u53d1\u8005\u793e\u533a \uff1a\u521b\u9f99\u8bba\u575b\u3002 micropython \uff1amicropython \u4e2d\u6587\u7f51\u3002 \u6cf0\u6653\u79d1\u6280 \uff1aLinux \u76f8\u5173\u3002 \u7535\u5802\u79d1\u6280 \uff1aSTM32 \u76f8\u5173\u3002 \u6e90\u4ee3\u7801\u4f7f\u7528\u793a\u4f8b\u805a\u5408\u5668 \uff1a \u4ece\u8d85\u8fc7 100 \u4e07\u4e2a\u5f00\u6e90\u9879\u76ee\u641c\u7d22 CPP \u4ee3\u7801\u793a\u4f8b\u3002 KST-51 \uff1a\u300a\u624b\u628a\u624b\u6559\u4f60\u5b66 51 \u5355\u7247\u673a\u300b \u3002 \u539f\u5b50\u54e5 \uff1a\u4e13\u6ce8\u7535\u5b50\u6280\u672f\u6559\u5b66\u3002\u3002 digoboy \uff1a\u5730\u74dc\u6d3e\u89c6\u9891\u7f51\u3002 c.biancheng \uff1aC \u8bed\u8a00\u4e2d\u6587\u7f51\u3002 open-c-book \uff1a\u300aC \u8bed\u8a00\u7f16\u7a0b\u900f\u89c6\u300b\u3002 PyQt5 \uff1aPyQt5 \u5728\u7ebf\u6559\u7a0b\u3002 open-shell-book \uff1a\u300aShell \u7f16\u7a0b\u8303\u4f8b\u300b \u3002 software_unit_test \uff1a \u300a\u8f6f\u4ef6\u5355\u5143\u6d4b\u8bd5\u5165\u95e8\u4e0e\u5b9e\u8df5\u300b\u3002 kerneltravel \uff1aLinux \u5185\u6838\u4e4b\u65c5\u3002 \u8717\u7a9d\u79d1\u6280 \uff1a\u6162\u4e0b\u6765\uff0c\u4eab\u53d7\u6280\u672f\u3002 bookstack \uff1a\u4e66\u6808\u7f51\u3002 wireshark \uff1a\u6293\u5305\u5de5\u5177\u4e0b\u8f7d\u94fe\u63a5\u3002 MobaXterm \uff1a\u4e00\u4e2a\u597d\u7528\u7684\u7ec8\u7aef\u8f6f\u4ef6\u3002 Stduino \uff1a \u4e00\u6b3e\u9762\u5411 32 \u4f4d\u5904\u7406\u5668\u5feb\u901f\u5165\u95e8\u5b66\u4e60\u7684\u96c6\u6210\u5f00\u53d1\u5e73\u53f0 \u3002 easyicon \uff1a\u4e00\u4e2a\u514d\u8d39\u56fe\u6807\u4e0b\u8f7d\u7f51\u7ad9\u3002 codingdict \uff1a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u83dc\u9e1f\u6559\u7a0b\u7684\u7f16\u7a0b\u7c7b\u6559\u7a0b\u7f51\u7ad9\u3002 codingdict \u5f00\u6e90\u8f6f\u4ef6 \uff1acodingdict \u7f51\u7ad9\u6536\u96c6\u7684\u5404\u7c7b\u5f00\u6e90\u8f6f\u4ef6\u96c6\u5408\u3002 C \u7ecf\u5178\u793a\u4f8b \uff1a\u4e00\u4e9b C \u8bed\u8a00\u7684\u5b9e\u4f8b\u3002 xmake \uff1a\u8f7b\u91cf\u7ea7\u8de8\u5e73\u53f0 C/C++ \u6784\u5efa\u5de5\u5177\u3002 spacevim \uff1a\u4e00\u4e2a\u6a21\u5757\u5316\u7684 Vim IDE\u3002 vofa+ \uff1a\u4e00\u4e2a\u63d2\u4ef6\u9a71\u52a8\u7684\u9ad8\u81ea\u7531\u5ea6\u4e0a\u4f4d\u673a\u3002 \u8054\u5408\u5f00\u53d1\u7f51 \uff1a356 \u4e07\u4e2a\u7f16\u7a0b\u6e90\u7801\u8d44\u6599 \u89c5\u601d\u6587\u6863 \uff1a\u79c1\u6709\u4e91\u7b14\u8bb0\u3001\u4e91\u6587\u6863\u548c\u77e5\u8bc6\u5e93\u7cfb\u7edf\u3002 aardio \uff1a\u6613\u7528\u6027\u6781\u5f3a\u7684\u52a8\u6001\u8bed\u8a00\u3002 OneNET SDK \uff1aOneNET SDK \u4ed3\u5e93\u3002 ros \u624b\u518c \uff1aros \u7684\u5b98\u65b9\u624b\u518c\u3002 gnu \u7684\u5f00\u6e90\u8f6f\u4ef6 \uff1agnu \u7684\u5f00\u6e90\u8f6f\u4ef6 soft-and-hard \uff1a\u8fd9\u662f\u4e00\u4e2a\u4ee5\u7269\u8054\u7f51\u9879\u76ee\u4e3a\u4e3b\u65b9\u5411\u5206\u4eab web \u5f00\u53d1\u6559\u7a0b\u3002 FireflyTeam \uff1a\u4e00\u4e2a\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u4ed3\u5e93\u3002 python \u811a\u672c \uff1a\u4e00\u4e9b\u597d\u7528\u7684 python \u811a\u672c\u3002 C++ libraries \uff1aA list of open source C++ libraries. Lindenis \uff1aAn open source software for Lindenis SBC\u3002 fast-line-following \uff1a\u4e00\u4e2a\u5feb\u901f\u5bfb\u7ebf\u673a\u5668\u4eba\u7684\u7b97\u6cd5\u3002 \u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177 \uff1a\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177\u3002 Awesome-Embedded \uff1a\u6c47\u805a\u4e86\u5404\u79cd\u5d4c\u5165\u5f0f\u76f8\u5173\u7684\u8d44\u6e90\u3002 FreeModbus : FreeModbus \u662f\u4e00\u6b3e\u5f00\u6e90\u7684 Modbus \u534f\u8bae\u6808\uff0c\u4f46\u662f\u53ea\u6709\u4ece\u673a\u5f00\u6e90\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"5\u3001\u8d44\u6e90 / \u5de5\u5177 / \u7f51\u7ad9 / \u8bba\u575b"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#6","text":"STMicroelectronics \uff1a\u610f\u6cd5\u534a\u5bfc\u4f53\uff08ST\uff09\u3002 TI \uff1a\u5fb7\u5dde\u4eea\u5668\uff08TI\uff09\u3002 NXP \uff1a\u6069\u667a\u6d66\uff08NXP\uff09\u3002 Freescale \uff1a\u98de\u601d\u5361\u5c14\u534a\u5bfc\u4f53\uff08Freescale\uff09\u3002 hisilicon \uff1a\u6d77\u601d\u3002 rockchip \uff1a\u745e\u82af\u5fae\u3002 Samsung \uff1a\u4e09\u661f\u3002 Infineon \uff1a\u82f1\u98de\u51cc\u3002 analogdevicesinc \uff1a\u4e9a\u5fb7\u8bfa\u534a\u5bfc\u4f53\uff08ADI\uff09\u3002 MicrochipTech \uff1a\u5fae\u82af\u534a\u5bfc\u4f53\uff08Microchip \uff09\u3002 NordicSemiconductor \uff1a\u5317\u6b27\u96c6\u6210\u7535\u8def\uff08Nordic\uff09\u3002 cypress-io \uff1a\u8d5b\u666e\u62c9\u65af\u534a\u5bfc\u4f53\uff08Cypress\uff09\u3002 GD32 \uff1a\u6613\u5146\u521b\u65b0 (GD)\u3002 GD32 \u7f51\u76d8 \uff1a\uff1a\u6613\u5146\u521b\u65b0 (GD) \u7f51\u76d8\u8d44\u6599\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"6\u3001\u4e00\u4e9b\u82af\u7247\u539f\u5382\u4ee3\u7801\u4ed3\u5e93"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#7","text":"Domoticz \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u667a\u80fd\u5bb6\u5c45\u7cfb\u7edf \u3002 Kaa IoT Platform \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5f00\u653e\u548c\u9ad8\u6548\u7684\u7269\u8054\u7f51\u4e91\u5e73\u53f0\u3002 RT-Thread IoT SDK \uff1a\u57fa\u4e8e RT-Thread IOT \u5f00\u53d1\u677f\u7684\u5404\u7c7b\u4f8b\u7a0b\u3002 \u4ece\u96f6\u6253\u9020\u7269\u8054\u7f51 \uff1a\u4e00\u4efd\u9002\u5408\u5d4c\u5165\u5f0f\u5f00\u53d1\u4eba\u5458\u5b66\u4e60\u7684 web \u5f00\u53d1\u6559\u7a0b\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"7\u3001\u7269\u8054\u7f51\u3001\u667a\u80fd\u5bb6\u5c45"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#8","text":"RoboCar \uff1a\u673a\u5668\u4eba\u81ea\u52a8\u5bfb\u7ebf\u3001\u907f\u969c\u3001\u5efa\u56fe\u3001\u5bfc\u822a\u3001\u9065\u63a7\u7248\u672c / \u8f66\u8f7d\u7535\u8111\u7248\u672c\u8def\u9762\u5206\u6790\uff0c\u53ca\u4ea4\u901a\u8def\u51b5\u8bc6\u522b\u7684\u8f66\u8f86\u8f85\u52a9\u9a7e\u9a76\u7cfb\u7edf ROS \u6559\u7a0b \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf slam \uff1a\u601d\u5c9a\u79d1\u6280\u3002","title":"8\u3001\u673a\u5668\u4eba\u76f8\u5173 / \u5b9a\u4f4d / \u89c6\u89c9"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#9","text":"\u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 11 \u671f aardio \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 10 \u671f inih \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 9 \u671f nanopb \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 8 \u671f AMetal \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 7 \u671f zlog \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 6 \u671f FlexibleButton \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 5 \u671f smartlink \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 4 \u671f cola_os \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 3 \u671f sys/queue.h \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 2 \u671f llgui \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 1 \u671f gear-lib \u535a\u6587\u2014\u2014Tslib \u79fb\u690d\u4e0e\u5206\u6790 \u535a\u4e3b\u2014\u2014ychy \u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9 \uff0c\u67e5\u770b\u66f4\u591a\u8d44\u6e90\u3002 \u4e0b\u9762\u8ba1\u7b97\u673a\u8d44\u6e90\u4e3a\u7f51\u53cb dianjixz \u8d21\u732e\uff0c\u611f\u8c22\u8fd9\u4f4d\u670b\u53cb\u3002","title":"9\u3001\u63a8\u8350\u535a\u5ba2 / \u535a\u6587"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#-","text":"","title":"\u8ba1\u7b97\u673a\u76f8\u5173\u8d44\u6e90 ------ \u6301\u7eed\u66f4\u65b0\u4e2d"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#1","text":"C++ \u6807\u51c6\u5e93\uff0c\u5305\u62ec\u4e86 STL \u5bb9\u5668\uff0c\u7b97\u6cd5\u548c\u51fd\u6570\u7b49\u3002 C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7c7b\u548c\u51fd\u6570\u7684\u96c6\u5408\uff0c\u4f7f\u7528\u6838\u5fc3\u8bed\u8a00\u7f16\u5199\uff0c\u4e5f\u662f C++ISO \u81ea\u8eab\u6807\u51c6\u7684\u4e00\u90e8\u5206\u3002 Standard Template Library \uff1a\u6807\u51c6\u6a21\u677f\u5e93 C POSIX library \uff1a POSIX \u7cfb\u7edf\u7684 C \u6807\u51c6\u5e93\u89c4\u8303 ISO C++ Standards Committee \uff1aC++ \u6807\u51c6\u59d4\u5458\u4f1a","title":"1\u3001 \u6807\u51c6\u5e93"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#2_1","text":"C++ \u901a\u7528\u6846\u67b6\u548c\u5e93 Apache C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7b97\u6cd5\uff0c\u5bb9\u5668\uff0c\u8fed\u4ee3\u5668\u548c\u5176\u4ed6\u57fa\u672c\u7ec4\u4ef6\u7684\u96c6\u5408 ASL \uff1aAdobe \u6e90\u4ee3\u7801\u5e93\u63d0\u4f9b\u4e86\u540c\u884c\u7684\u8bc4\u5ba1\u548c\u53ef\u79fb\u690d\u7684 C++ \u6e90\u4ee3\u7801\u5e93\u3002 Boost \uff1a\u5927\u91cf\u901a\u7528 C++ \u5e93\u7684\u96c6\u5408\u3002 BDE \uff1a\u6765\u81ea\u4e8e\u5f6d\u535a\u8d44\u8baf\u5b9e\u9a8c\u5ba4\u7684\u5f00\u53d1\u73af\u5883\u3002 Cinder \uff1a\u63d0\u4f9b\u4e13\u4e1a\u54c1\u8d28\u521b\u9020\u6027\u7f16\u7801\u7684\u5f00\u6e90\u5f00\u53d1\u793e\u533a\u3002 Cxxomfort \uff1a\u8f7b\u91cf\u7ea7\u7684\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\u7684\u5e93\uff0c\u5c06 C++ 11 \u7684\u4e00\u4e9b\u65b0\u7279\u6027\u79fb\u690d\u5230 C++03 \u4e2d\u3002 Dlib \uff1a\u4f7f\u7528\u5951\u7ea6\u5f0f\u7f16\u7a0b\u548c\u73b0\u4ee3 C++ \u79d1\u6280\u8bbe\u8ba1\u7684\u901a\u7528\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 EASTL \uff1aEA-STL \u516c\u5171\u90e8\u5206 ffead-cpp \uff1a\u4f01\u4e1a\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Folly \uff1a\u7531 Facebook \u5f00\u53d1\u548c\u4f7f\u7528\u7684\u5f00\u6e90 C++ \u5e93 JUCE \uff1a\u5305\u7f57\u4e07\u8c61\u7684 C++ \u7c7b\u5e93\uff0c\u7528\u4e8e\u5f00\u53d1\u8de8\u5e73\u53f0\u8f6f\u4ef6 libPhenom \uff1a\u7528\u4e8e\u6784\u5efa\u9ad8\u6027\u80fd\u548c\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7cfb\u7edf\u7684\u4e8b\u4ef6\u6846\u67b6\u3002 LibSourcey \uff1a\u7528\u4e8e\u5b9e\u65f6\u7684\u89c6\u9891\u6d41\u548c\u9ad8\u6027\u80fd\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u7684 C++11 evented IO LibU \uff1a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93 Loki \uff1aC++ \u5e93\u7684\u8bbe\u8ba1\uff0c\u5305\u62ec\u5e38\u89c1\u7684 \u8bbe\u8ba1\u6a21\u5f0f \u548c\u4e60\u8bed\u7684\u5b9e\u73b0\u3002 MiLi \uff1a\u53ea\u542b\u5934\u6587\u4ef6\u7684\u5c0f\u578b C++ \u5e93 openFrameworks \uff1a\u5f00\u53d1 C++ \u5de5\u5177\u5305\uff0c\u7528\u4e8e\u521b\u610f\u6027\u7f16\u7801\u3002 Qt \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6 Reason \uff1a\u8de8\u5e73\u53f0\u7684\u6846\u67b6\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u5bb9\u6613\u5730\u4f7f\u7528 Java\uff0c.Net \u548c Python\uff0c\u540c\u65f6\u4e5f\u6ee1\u8db3\u4e86\u4ed6\u4eec\u5bf9 C++ \u6027\u80fd\u548c\u4f18\u52bf\u7684\u9700\u6c42\u3002 ROOT \uff1a\u5177\u5907\u6240\u6709\u529f\u80fd\u7684\u4e00\u7cfb\u5217\u9762\u5411\u5bf9\u8c61\u7684\u6846\u67b6\uff0c\u80fd\u591f\u975e\u5e38\u9ad8\u6548\u5730\u5904\u7406\u548c\u5206\u6790\u5927\u91cf\u7684\u6570\u636e\uff0c\u4e3a\u6b27\u6d32\u539f\u5b50\u80fd\u7814\u7a76\u673a\u6784\u6240\u7528\u3002 STLport \uff1a\u662f STL \u5177\u6709\u4ee3\u8868\u6027\u7684\u7248\u672c STXXL \uff1a\u7528\u4e8e\u989d\u5916\u7684\u5927\u578b\u6570\u636e\u96c6\u7684\u6807\u51c6\u6a21\u677f\u5e93\u3002 Ultimate++ \uff1aC++ \u8de8\u5e73\u53f0\u5feb\u901f\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Windows Template Library \uff1a\u7528\u4e8e\u5f00\u53d1 Windows \u5e94\u7528\u7a0b\u5e8f\u548c UI \u7ec4\u4ef6\u7684 C++ \u5e93 Yomm11 \uff1aC++11 \u7684\u5f00\u653e multi-methods.","title":"2\u3001 \u6846\u67b6"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#3","text":"btsk \uff1a\u6e38\u620f\u884c\u4e3a\u6811\u542f\u52a8\u5668\u5de5\u5177 Evolving Objects \uff1a\u57fa\u4e8e\u6a21\u677f\u7684\uff0cANSI C++ \u6f14\u5316\u8ba1\u7b97\u5e93\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u975e\u5e38\u5feb\u901f\u5730\u7f16\u5199\u51fa\u81ea\u5df1\u7684\u968f\u673a\u4f18\u5316\u7b97\u6cd5\u3002 Neu \uff1aC++11 \u6846\u67b6\uff0c\u7f16\u7a0b\u8bed\u8a00\u96c6\uff0c\u7528\u4e8e\u521b\u5efa\u4eba\u5de5\u667a\u80fd\u5e94\u7528\u7a0b\u5e8f\u7684\u591a\u7528\u9014\u8f6f\u4ef6\u7cfb\u7edf\u3002","title":"3\u3001 \u4eba\u5de5\u667a\u80fd"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#4_1","text":"Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 libev \uff1a\u529f\u80fd\u9f50\u5168\uff0c\u9ad8\u6027\u80fd\u7684\u65f6\u95f4\u5faa\u73af\uff0c\u8f7b\u5fae\u5730\u4eff\u6548 libevent\uff0c\u4f46\u662f\u4e0d\u518d\u50cf libevent \u4e00\u6837\u6709\u5c40\u9650\u6027\uff0c\u4e5f\u4fee\u590d\u4e86\u5b83\u7684\u4e00\u4e9b bug\u3002 libevent \uff1a\u4e8b\u4ef6\u901a\u77e5\u5e93 libuv \uff1a\u8de8\u5e73\u53f0\u5f02\u6b65 I/O\u3002","title":"4\u3001 \u5f02\u6b65\u4e8b\u4ef6\u5faa\u73af"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#5_1","text":"\u97f3\u9891\uff0c\u58f0\u97f3\uff0c\u97f3\u4e50\uff0c\u6570\u5b57\u5316\u97f3\u4e50\u5e93 FMOD \uff1a\u6613\u4e8e\u4f7f\u7528\u7684\u8de8\u5e73\u53f0\u7684\u97f3\u9891\u5f15\u64ce\u548c\u97f3\u9891\u5185\u5bb9\u7684\u6e38\u620f\u521b\u4f5c\u5de5\u5177\u3002 Maximilian \uff1aC++ \u97f3\u9891\u548c\u97f3\u4e50\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5e93 OpenAL \uff1a\u5f00\u6e90\u97f3\u9891\u5e93\u2014\u8de8\u5e73\u53f0\u7684\u97f3\u9891 API Opus \uff1a\u4e00\u4e2a\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u514d\u7248\u7a0e\u7684\uff0c\u9ad8\u5ea6\u901a\u7528\u7684\u97f3\u9891\u7f16\u89e3\u7801\u5668 Speex \uff1a\u514d\u8d39\u7f16\u89e3\u7801\u5668\uff0c\u4e3a Opus \u6240\u5e9f\u5f03 Tonic \uff1a C++ \u6613\u7528\u548c\u9ad8\u6548\u7684\u97f3\u9891\u5408\u6210 Vorbis \uff1a Ogg Vorbis \u662f\u4e00\u79cd\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u975e\u4e13\u6709\u7684\uff0c\u514d\u7248\u7a0e\u7684\u901a\u7528\u538b\u7f29\u97f3\u9891\u683c\u5f0f\u3002","title":"5\u3001\u97f3\u9891"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#6_1","text":"\u751f\u7269\u4fe1\u606f\uff0c\u57fa\u56e0\u7ec4\u5b66\u548c\u751f\u7269\u6280\u672f libsequence \uff1a\u7528\u4e8e\u8868\u793a\u548c\u5206\u6790\u7fa4\u4f53\u9057\u4f20\u5b66\u6570\u636e\u7684 C++ \u5e93\u3002 SeqAn \uff1a\u4e13\u6ce8\u4e8e\u751f\u7269\u6570\u636e\u5e8f\u5217\u5206\u6790\u7684\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u3002 Vcflib \uff1a\u7528\u4e8e\u89e3\u6790\u548c\u5904\u7406 VCF \u6587\u4ef6\u7684 C++ \u5e93 Wham \uff1a\u76f4\u63a5\u628a\u8054\u60f3\u6d4b\u8bd5\u5e94\u7528\u5230 BAM \u6587\u4ef6\u7684\u57fa\u56e0\u7ed3\u6784\u53d8\u5f02\u3002","title":"6\u3001 \u751f\u6001\u5b66"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#7_1","text":"\u538b\u7f29\u548c\u5f52\u6863\u5e93 bzip2 \uff1a\u4e00\u4e2a\u5b8c\u5168\u514d\u8d39\uff0c\u514d\u8d39\u4e13\u5229\u548c\u9ad8\u8d28\u91cf\u7684\u6570\u636e\u538b\u7f29 doboz \uff1a\u80fd\u591f\u5feb\u901f\u89e3\u538b\u7f29\u7684\u538b\u7f29\u5e93 PhysicsFS \uff1a\u5bf9\u5404\u79cd\u5f52\u6863\u63d0\u4f9b\u62bd\u8c61\u8bbf\u95ee\u7684\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\u89c6\u9891\u6e38\u620f\uff0c\u8bbe\u8ba1\u7075\u611f\u90e8\u5206\u6765\u81ea\u4e8e Quake3 \u7684\u6587\u4ef6\u5b50\u7cfb\u7edf\u3002 KArchive \uff1a\u7528\u4e8e\u521b\u5efa\uff0c\u8bfb\u5199\u548c\u64cd\u4f5c\u6587\u4ef6\u6863\u6848\uff08\u4f8b\u5982 zip \u548c tar\uff09\u7684\u5e93\uff0c\u5b83\u901a\u8fc7 QIODevice \u7684\u4e00\u7cfb\u5217\u5b50\u7c7b\uff0c\u4f7f\u7528 gzip \u683c\u5f0f\uff0c\u63d0\u4f9b\u4e86\u900f\u660e\u7684\u538b\u7f29\u548c\u89e3\u538b\u7f29\u7684\u6570\u636e\u3002 LZ4 \uff1a\u975e\u5e38\u5feb\u901f\u7684\u538b\u7f29\u7b97\u6cd5 LZHAM \uff1a\u65e0\u635f\u538b\u7f29\u6570\u636e\u5e93\uff0c\u538b\u7f29\u6bd4\u7387\u8ddf LZMA \u63a5\u8fd1\uff0c\u4f46\u662f\u89e3\u538b\u7f29\u901f\u5ea6\u5374\u8981\u5feb\u5f97\u591a\u3002 LZMA \uff1a7z \u683c\u5f0f\u9ed8\u8ba4\u548c\u901a\u7528\u7684\u538b\u7f29\u65b9\u6cd5\u3002 LZMAT \uff1a\u53ca\u5176\u5feb\u901f\u7684\u5b9e\u65f6\u65e0\u635f\u6570\u636e\u538b\u7f29\u5e93 miniz \uff1a\u5355\u4e00\u7684 C \u6e90\u6587\u4ef6\uff0c\u7d27\u7f29 / \u81a8\u80c0\u538b\u7f29\u5e93\uff0c\u4f7f\u7528 zlib \u517c\u5bb9 API\uff0cZIP \u5f52\u6863\u8bfb\u5199\uff0cPNG \u5199\u65b9\u5f0f\u3002 Minizip \uff1aZlib \u6700\u65b0 bug \u4fee\u590d\uff0c\u652f\u6301 PKWARE \u78c1\u76d8\u8de8\u8d8a\uff0cAES \u52a0\u5bc6\u548c IO \u7f13\u51b2\u3002 Snappy \uff1a\u5feb\u901f\u538b\u7f29\u548c\u89e3\u538b\u7f29 ZLib \uff1a\u975e\u5e38\u7d27\u51d1\u7684\u6570\u636e\u6d41\u538b\u7f29\u5e93 ZZIPlib \uff1a\u63d0\u4f9b ZIP \u5f52\u6863\u7684\u8bfb\u6743\u9650\u3002","title":"7\u3001 \u538b\u7f29"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#8_1","text":"\u5e76\u53d1\u6267\u884c\u548c\u591a\u7ebf\u7a0b Boost.Compute \uff1a\u7528\u4e8e OpenCL \u7684 C++GPU \u8ba1\u7b97\u5e93 Bolt \uff1a\u9488\u5bf9 GPU \u8fdb\u884c\u4f18\u5316\u7684 C++ \u6a21\u677f\u5e93 C++React \uff1a\u7528\u4e8e C++11 \u7684\u53cd\u5e94\u6027\u7f16\u7a0b\u5e93 Intel TBB \uff1aIntel \u7ebf\u7a0b\u6784\u4ef6\u5757 Libclsph \uff1a\u57fa\u4e8e OpenCL \u7684 GPU \u52a0\u901f SPH \u6d41\u4f53\u4eff\u771f\u5e93 OpenCL \uff1a\u5e76\u884c\u7f16\u7a0b\u7684\u5f02\u6784\u7cfb\u7edf\u7684\u5f00\u653e\u6807\u51c6 OpenMP \uff1aOpenMP API Thrust \uff1a\u7c7b\u4f3c\u4e8e C++ \u6807\u51c6\u6a21\u677f\u5e93\u7684\u5e76\u884c\u7b97\u6cd5\u5e93 HPX \uff1a\u7528\u4e8e\u4efb\u4f55\u89c4\u6a21\u7684\u5e76\u884c\u548c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u7684\u901a\u7528 C++ \u8fd0\u884c\u65f6\u7cfb\u7edf VexCL \uff1a\u7528\u4e8e OpenCL/CUDA \u7684 C++ \u5411\u91cf\u8868\u8fbe\u5f0f\u6a21\u677f\u5e93\u3002","title":"8\u3001\u5e76\u53d1\u6027"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#9_1","text":"C++ B-tree \uff1a\u57fa\u4e8e B \u6811\u6570\u636e\u7ed3\u6784\uff0c\u5b9e\u73b0\u547d\u4ee4\u5185\u5b58\u5bb9\u5668\u7684\u6a21\u677f\u5e93 Hashmaps \uff1a C++ \u4e2d\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7b97\u6cd5\u7684\u5b9e\u73b0","title":"9\u3001 \u5bb9\u5668"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#10","text":"Bcrypt \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u6587\u4ef6\u52a0\u5bc6\u5de5\u5177\uff0c\u52a0\u5bc6\u6587\u4ef6\u53ef\u4ee5\u79fb\u690d\u5230\u6240\u6709\u53ef\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\u548c\u5904\u7406\u5668\u4e2d\u3002 BeeCrypt \uff1a Botan \uff1a C++ \u52a0\u5bc6\u5e93 Crypto++ \uff1a\u4e00\u4e2a\u6709\u5173\u52a0\u5bc6\u65b9\u6848\u7684\u514d\u8d39\u7684 C++ \u5e93 GnuPG \uff1a OpenPGP \u6807\u51c6\u7684\u5b8c\u6574\u5b9e\u73b0 GnuTLS \uff1a\u5b9e\u73b0\u4e86 SSL\uff0cTLS \u548c DTLS \u534f\u8bae\u7684\u5b89\u5168\u901a\u4fe1\u5e93 Libgcrypt libmcrypt LibreSSL \uff1a\u514d\u8d39\u7684 SSL/TLS \u534f\u8bae\uff0c\u5c5e\u4e8e 2014 OpenSSL \u7684\u4e00\u4e2a\u5206\u652f LibTomCrypt \uff1a\u4e00\u4e2a\u975e\u5e38\u5168\u9762\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u79fb\u690d\u7684\u52a0\u5bc6\u5de5\u5177 libsodium \uff1a\u57fa\u4e8e NaCI \u7684\u52a0\u5bc6\u5e93\uff0c\u56fa\u6267\u5df1\u89c1\uff0c\u5bb9\u6613\u4f7f\u7528 Nettle \u5e95\u5c42\u7684\u52a0\u5bc6\u5e93 OpenSSL \uff1a \u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u5546\u7528\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\uff0c\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u52a0\u5bc6\u5e93\u3002 Tiny AES128 in C \uff1a\u7528 C \u5b9e\u73b0\u7684\u4e00\u4e2a\u5c0f\u5de7\uff0c\u53ef\u79fb\u690d\u7684\u5b9e\u73b0\u4e86 AES128ESB \u7684\u52a0\u5bc6\u7b97\u6cd5","title":"10\u3001 \u5bc6\u7801\u5b66"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#11","text":"\u6570\u636e\u5e93\uff0cSQL \u670d\u52a1\u5668\uff0cODBC \u9a71\u52a8\u7a0b\u5e8f\u548c\u5de5\u5177 hiberlite \uff1a\u7528\u4e8e Sqlite3 \u7684 C++ \u5bf9\u8c61\u5173\u7cfb\u6620\u5c04 Hiredis \uff1a \u7528\u4e8e Redis \u6570\u636e\u5e93\u7684\u5f88\u7b80\u5355\u7684 C \u5ba2\u6237\u7aef\u5e93 LevelDB \uff1a \u5feb\u901f\u952e\u503c\u5b58\u50a8\u5e93 LMDB \uff1a\u7b26\u5408\u6570\u636e\u5e93\u56db\u5927\u57fa\u672c\u5143\u7d20\u7684\u5d4c\u5165\u952e\u503c\u5b58\u50a8 MySQL++ \uff1a\u5c01\u88c5\u4e86 MySql \u7684 C API \u7684 C++ \u5305\u88c5\u5668 RocksDB \uff1a\u6765\u81ea Facebook \u7684\u5d4c\u5165\u952e\u503c\u7684\u5feb\u901f\u5b58\u50a8 SQLite \uff1a\u4e00\u4e2a\u5b8c\u5168\u5d4c\u5165\u5f0f\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5173\u7cfb\u6570\u636e\u5e93\uff0c\u53ea\u6709\u51e0\u767e KB\uff0c\u53ef\u4ee5\u6b63\u786e\u5305\u542b\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u3002","title":"11\u3001 \u6570\u636e\u5e93"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#12","text":"\u8c03\u8bd5\u5e93\uff0c \u5185\u5b58\u548c\u8d44\u6e90\u6cc4\u9732\u68c0\u6d4b\uff0c\u5355\u5143\u6d4b\u8bd5 Boost.Test \uff1aBoost \u6d4b\u8bd5\u5e93 Catch \uff1a\u4e00\u4e2a\u5f88\u65f6\u5c1a\u7684\uff0cC++ \u539f\u751f\u7684\u6846\u67b6\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\uff0c\u7528\u4e8e\u5355\u5143\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\u548c\u884c\u4e3a\u9a71\u52a8\u5f00\u53d1\u3002 CppUnit \uff1a\u7531 JUnit \u79fb\u690d\u8fc7\u6765\u7684 C++ \u6d4b\u8bd5\u6846\u67b6 CTest \uff1aCMake \u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6 ig-debugheap \uff1a\u7528\u4e8e\u8ddf\u8e2a\u5185\u5b58\u9519\u8bef\u7684\u591a\u5e73\u53f0\u8c03\u8bd5\u5806 libtap \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u6d4b\u8bd5 MemTrack \u2014\u7528\u4e8e C++ \u8ddf\u8e2a\u5185\u5b58\u5206\u914d microprofile - \u8de8\u5e73\u53f0\u7684\u7f51\u7edc\u8bd5\u56fe\u5206\u6790\u5668 minUnit \uff1a\u4f7f\u7528 C \u5199\u7684\u8ff7\u4f60\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff0c\u53ea\u4f7f\u7528\u4e86\u4e24\u4e2a\u5b8f Remotery \uff1a\u7528\u4e8e web \u89c6\u56fe\u7684\u5355\u4e00 C \u6587\u4ef6\u5206\u6790\u5668 UnitTest++ \uff1a\u8f7b\u91cf\u7ea7\u7684 C++ \u5355\u5143\u6d4b\u8bd5\u6846\u67b6","title":"12\u3001 \u8c03\u8bd5"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#13","text":"Cocos2d-x \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u6846\u67b6\uff0c\u7528\u4e8e\u6784\u5efa 2D \u6e38\u620f\uff0c\u4e92\u52a8\u56fe\u4e66\uff0c\u6f14\u793a\u548c\u5176\u4ed6\u56fe\u5f62\u5e94\u7528\u7a0b\u5e8f\u3002 Grit \uff1a\u793e\u533a\u9879\u76ee\uff0c\u7528\u4e8e\u6784\u5efa\u4e00\u4e2a\u514d\u8d39\u7684\u6e38\u620f\u5f15\u64ce\uff0c\u5b9e\u73b0\u5f00\u653e\u7684\u4e16\u754c 3D \u6e38\u620f\u3002 Irrlicht \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u5f00\u6e90\u9ad8\u6027\u80fd\u7684\u5b9e\u65f6 #D \u5f15\u64ce Polycode \uff1aC++ \u5b9e\u73b0\u7684\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u5f00\u6e90\u6846\u67b6\uff08\u4e0e Lua \u7ed1\u5b9a\uff09\u3002","title":"13\u3001 \u6e38\u620f\u5f15\u64ce"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#14","text":"CEGUI \uff1a \u5f88\u7075\u6d3b\u7684\u8de8\u5e73\u53f0 GUI \u5e93 FLTK \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u8de8\u5e73\u53f0\u7684 C++GUI \u5de5\u5177\u5305\u3002 GTK+ \uff1a \u7528\u4e8e\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684\u8de8\u5e73\u53f0\u5de5\u5177\u5305 gtkmm \uff1a\u7528\u4e8e\u53d7\u6b22\u8fce\u7684 GUI \u5e93 GTK + \u7684\u5b98\u65b9 C++ \u63a5\u53e3\u3002 imgui \uff1a\u62e5\u6709\u6700\u5c0f\u4f9d\u8d56\u5173\u7cfb\u7684\u7acb\u5373\u6a21\u5f0f\u56fe\u5f62\u7528\u6237\u754c\u9762 libRocket \uff1a libRocket \u662f\u4e00\u4e2a C++ HTML/CSS \u6e38\u620f\u63a5\u53e3\u4e2d\u95f4\u4ef6 MyGUI \uff1a\u5feb\u901f\uff0c\u7075\u6d3b\uff0c\u7b80\u5355\u7684 GUI Ncurses \uff1a\u7ec8\u7aef\u7528\u6237\u754c\u9762 QCustomPlot \uff1a\u6ca1\u6709\u66f4\u591a\u4f9d\u8d56\u5173\u7cfb\u7684 Qt \u7ed8\u56fe\u63a7\u4ef6 Qwt \uff1a\u7528\u6237\u4e0e\u6280\u672f\u5e94\u7528\u7684 Qt \u63a7\u4ef6 QwtPlot3D \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u57fa\u4e8e Qt/OpenGL \u7684 C++ \u7f16\u7a0b\u5e93\uff0c\u672c\u8d28\u4e0a\u63d0\u4f9b\u4e86\u4e00\u7fa4 3D \u63a7\u4ef6 OtterUI \uff1a OtterUI \u662f\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u548c\u4e92\u52a8\u5a31\u4e50\u8f6f\u4ef6\u7684\u7528\u6237\u754c\u9762\u5f00\u53d1\u89e3\u51b3\u65b9\u6848 PDCurses \u5305\u542b\u6e90\u4ee3\u7801\u548c\u9884\u7f16\u8bd1\u5e93\u7684\u516c\u5171\u56fe\u5f62\u51fd\u6570\u5e93 wxWidgets C++ \u5e93\uff0c\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u4f7f\u7528\u4e00\u4e2a\u4ee3\u7801\u5e93\u53ef\u4ee5\u4e3a widows\uff0c Mac OS X\uff0cLinux \u548c\u5176\u4ed6\u5e73\u53f0\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f","title":"14\u3001 \u56fe\u5f62\u7528\u6237\u754c\u9762"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#15","text":"bgfx \uff1a\u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u5e93 Cairo \uff1a\u652f\u6301\u591a\u79cd\u8f93\u51fa\u8bbe\u5907\u7684 2D \u56fe\u5f62\u5e93 Horde3D \u4e00\u4e2a\u5c0f\u578b\u7684 3D \u6e32\u67d3\u548c\u52a8\u753b\u5f15\u64ce magnum C++11 \u548c OpenGL 2D/3D \u56fe\u5f62\u5f15\u64ce Ogre 3D \u7528 C++ \u7f16\u5199\u7684\u4e00\u4e2a\u9762\u5411\u573a\u666f\uff0c\u5b9e\u65f6\uff0c\u7075\u6d3b\u7684 3D \u6e32\u67d3\u5f15\u64ce\uff08\u5e76\u975e\u6e38\u620f\u5f15\u64ce\uff09 OpenSceneGraph \u5177\u6709\u9ad8\u6027\u80fd\u7684\u5f00\u6e90 3D \u56fe\u5f62\u5de5\u5177\u5305 Panda3D \u7528\u4e8e 3D \u6e32\u67d3\u548c\u6e38\u620f\u5f00\u53d1\u7684\u6846\u67b6\uff0c\u7528 Python \u548c C++ \u7f16\u5199\u3002 Skia \u7528\u4e8e\u7ed8\u5236\u6587\u5b57\uff0c\u56fe\u5f62\u548c\u56fe\u50cf\u7684\u5b8c\u6574\u7684 2D \u56fe\u5f62\u5e93 urho3d \u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u548c\u6e38\u620f\u5f15\u64ce\u3002","title":"15\u3001 \u56fe\u5f62"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#16","text":"Boost.GIL \uff1a\u901a\u7528\u56fe\u50cf\u5e93 CImg \uff1a\u7528\u4e8e\u56fe\u50cf\u5904\u7406\u7684\u5c0f\u578b\u5f00\u6e90 C++ \u5de5\u5177\u5305 CxImage \uff1a\u7528\u4e8e\u52a0\u8f7d\uff0c\u4fdd\u5b58\uff0c\u663e\u793a\u548c\u8f6c\u6362\u7684\u56fe\u50cf\u5904\u7406\u548c\u8f6c\u6362\u5e93\uff0c\u53ef\u4ee5\u5904\u7406\u7684\u56fe\u7247\u683c\u5f0f\u5305\u62ec BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K\u3002 FreeImage \uff1a\u5f00\u6e90\u5e93\uff0c\u652f\u6301\u73b0\u5728\u591a\u5a92\u4f53\u5e94\u7528\u6240\u9700\u7684\u901a\u7528\u56fe\u7247\u683c\u5f0f\u548c\u5176\u4ed6\u683c\u5f0f\u3002 GDCM \uff1aGrassroots DICOM \u5e93 ITK \uff1a\u8de8\u5e73\u53f0\u7684\u5f00\u6e90\u56fe\u50cf\u5206\u6790\u7cfb\u7edf Magick++ \uff1aImage Magic k \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 MagickWnd \uff1aImageMagick \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 OpenCV \uff1a \u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u7c7b\u5e93 tesseract-ocr \uff1aOCR \u5f15\u64ce VIGRA \uff1a\u7528\u4e8e\u56fe\u50cf\u5206\u6790\u901a\u7528 C++ \u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 VTK \uff1a\u7528\u4e8e 3D \u8ba1\u7b97\u673a\u56fe\u5f62\u5b66\uff0c\u56fe\u50cf\u5904\u7406\u548c\u53ef\u89c6\u5316\u7684\u5f00\u6e90\u514d\u8d39\u8f6f\u4ef6\u7cfb\u7edf\u3002","title":"16\u3001 \u56fe\u50cf\u5904\u7406"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#17","text":"gettext \uff1aGNU `gettext\u2019 IBM ICU \uff1a\u63d0\u4f9b Unicode \u548c\u5168\u7403\u5316\u652f\u6301\u7684 C\u3001C++ \u548c Java \u5e93 libiconv \uff1a\u7528\u4e8e\u4e0d\u540c\u5b57\u7b26\u7f16\u7801\u4e4b\u95f4\u7684\u7f16\u7801\u8f6c\u6362\u5e93","title":"17\u3001 \u56fd\u9645\u5316"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#18-jason","text":"frozen \uff1a C/C++ \u7684 Jason \u89e3\u6790\u751f\u6210\u5668 Jansson \uff1a\u8fdb\u884c\u7f16\u89e3\u7801\u548c\u5904\u7406 Jason \u6570\u636e\u7684 C \u8bed\u8a00\u5e93 jbson \uff1aC++14 \u4e2d\u6784\u5efa\u548c\u8fed\u4ee3 BSON data, \u548c Json \u6587\u6863\u7684\u5e93 JeayeSON \uff1a\u975e\u5e38\u5065\u5168\u7684 C++ JSON \u5e93\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 JSON++ \uff1a C++ JSON \u89e3\u6790\u5668 json-parser \uff1a\u7528\u53ef\u79fb\u690d\u7684 ANSI C \u7f16\u5199\u7684 JSON \u89e3\u6790\u5668\uff0c\u5360\u7528\u5185\u5b58\u975e\u5e38\u5c11 json11 \uff1a\u4e00\u4e2a\u8ff7\u4f60\u7684 C++11 JSON \u5e93 jute \uff1a\u975e\u5e38\u7b80\u5355\u7684 C++ JSON \u89e3\u6790\u5668 ibjson \uff1aC \u8bed\u8a00\u4e2d\u7684 JSON \u89e3\u6790\u548c\u6253\u5370\u5e93\uff0c\u5f88\u5bb9\u6613\u548c\u4efb\u4f55\u6a21\u578b\u96c6\u6210\u3002 libjson \uff1a\u8f7b\u91cf\u7ea7\u7684 JSON \u5e93 PicoJSON \uff1aC++ \u4e2d JSON \u89e3\u6790\u5e8f\u5217\u5316\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 qt-json \uff1a\u7528\u4e8e JSON \u6570\u636e\u548c QVariant \u5c42\u6b21\u95f4\u7684\u76f8\u4e92\u89e3\u6790\u7684\u7b80\u5355\u7c7b QJson \uff1a\u5c06 JSON \u6570\u636e\u6620\u5c04\u5230 QVariant \u5bf9\u8c61\u7684\u57fa\u4e8e Qt \u7684\u5e93 RapidJSON \uff1a \u7528\u4e8e C++ \u7684\u5feb\u901f JSON \u89e3\u6790\u751f\u6210\u5668\uff0c\u5305\u542b SAX \u548c DOM \u4e24\u79cd\u98ce\u683c\u7684 API YAJL \uff1aC \u8bed\u8a00\u4e2d\u5feb\u901f\u6d41 JSON \u89e3\u6790\u5e93","title":"18\u3001 Jason"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#19","text":"Boost.Log \uff1a\u8bbe\u8ba1\u975e\u5e38\u6a21\u5757\u5316\uff0c\u5e76\u4e14\u5177\u6709\u6269\u5c55\u6027 easyloggingpp \uff1aC++ \u65e5\u5fd7\u5e93\uff0c\u53ea\u5305\u542b\u5355\u4e00\u7684\u5934\u6587\u4ef6\u3002 Log4cpp \uff1a\u4e00\u7cfb\u5217 C++ \u7c7b\u5e93\uff0c\u7075\u6d3b\u6dfb\u52a0\u65e5\u5fd7\u5230\u6587\u4ef6\uff0c\u7cfb\u7edf\u65e5\u5fd7\uff0cIDSA \u548c\u5176\u4ed6\u5730\u65b9\u3002 templog \uff1a\u8f7b\u91cf\u7ea7 C++ \u5e93\uff0c\u53ef\u4ee5\u6dfb\u52a0\u65e5\u5fd7\u5230\u4f60\u7684 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d","title":"19\u3001 \u65e5\u5fd7"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#20","text":"Caffe \uff1a\u5feb\u901f\u7684\u795e\u7ecf\u7f51\u7edc\u6846\u67b6 CCV \uff1a\u4ee5 C \u8bed\u8a00\u4e3a\u6838\u5fc3\u7684\u73b0\u4ee3\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 mlpack \uff1a\u53ef\u6269\u5c55\u7684 C++ \u673a\u5668\u5b66\u4e60\u5e93 OpenCV \uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 Recommender \uff1a\u4f7f\u7528\u534f\u540c\u8fc7\u6ee4\u8fdb\u884c\u4ea7\u54c1\u63a8\u8350 / \u5efa\u8bae\u7684 C \u8bed\u8a00\u5e93\u3002 SHOGUN \uff1aShogun \u673a\u5668\u5b66\u4e60\u5de5\u5177 sofia-ml \uff1a\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684\u5feb\u901f\u589e\u91cf\u7b97\u6cd5\u5957\u4ef6","title":"20\u3001 \u673a\u5668\u5b66\u4e60"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#21","text":"Armadillo \uff1a\u9ad8\u8d28\u91cf\u7684 C++ \u7ebf\u6027\u4ee3\u6570\u5e93\uff0c\u901f\u5ea6\u548c\u6613\u7528\u6027\u505a\u5230\u4e86\u5f88\u597d\u7684\u5e73\u8861\u3002\u8bed\u6cd5\u548c MatlAB \u5f88\u76f8\u4f3c blaze \uff1a\u9ad8\u6027\u80fd\u7684 C++ \u6570\u5b66\u5e93\uff0c\u7528\u4e8e\u5bc6\u96c6\u548c\u7a00\u758f\u7b97\u6cd5\u3002 ceres-solver \uff1a\u6765\u81ea\u8c37\u6b4c\u7684 C++ \u5e93\uff0c\u7528\u4e8e\u5efa\u6a21\u548c\u89e3\u51b3\u5927\u578b\u590d\u6742\u975e\u7ebf\u6027\u6700\u5c0f\u5e73\u65b9\u95ee\u9898\u3002 CGal \uff1a \u9ad8\u6548\uff0c\u53ef\u9760\u7684\u96c6\u5408\u7b97\u6cd5\u96c6\u5408 cml \uff1a\u7528\u4e8e\u6e38\u620f\u548c\u56fe\u5f62\u7684\u514d\u8d39 C++ \u6570\u5b66\u5e93 Eigen \uff1a\u9ad8\u7ea7 C++ \u6a21\u677f\u5934\u6587\u4ef6\u5e93\uff0c\u5305\u62ec\u7ebf\u6027\u4ee3\u6570\uff0c\u77e9\u9635\uff0c\u5411\u91cf\u64cd\u4f5c\uff0c\u6570\u503c\u89e3\u51b3\u548c\u5176\u4ed6\u76f8\u5173\u7684\u7b97\u6cd5\u3002 GMTL \uff1a\u6570\u5b66\u56fe\u5f62\u6a21\u677f\u5e93\u662f\u4e00\u7ec4\u5e7f\u6cdb\u5b9e\u73b0\u57fa\u672c\u56fe\u5f62\u7684\u5de5\u5177\u3002 GMP \uff1a\u7528\u4e8e\u4e2a\u9ad8\u7cbe\u5ea6\u8ba1\u7b97\u7684 C/C++ \u5e93\uff0c\u5904\u7406\u6709\u7b26\u53f7\u6574\u6570\uff0c\u6709\u7406\u6570\u548c \u6d6e\u70b9\u6570 \u3002","title":"21\u3001 \u6570\u5b66"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#22","text":"GStreamer \uff1a\u6784\u5efa\u5a92\u4f53\u5904\u7406\u7ec4\u4ef6\u56fe\u5f62\u7684\u5e93 LIVE555 Streaming Media \uff1a\u4f7f\u7528\u5f00\u653e\u6807\u51c6\u534f\u8bae (RTP/RTCP, RTSP, SIP) \u7684\u591a\u5a92\u4f53\u6d41\u5e93 libVLC \uff1alibVLC (VLC SDK) \u5a92\u4f53\u6846\u67b6 QtAv \uff1a\u57fa\u4e8e Qt \u548c FFmpeg \u7684\u591a\u5a92\u4f53\u64ad\u653e\u6846\u67b6\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u8f7b\u800c\u6613\u4e3e\u5730\u7f16\u5199\u51fa\u4e00\u4e2a\u64ad\u653e\u5668 SDL \uff1a\u7b80\u5355\u76f4\u63a7\u5a92\u4f53\u5c42 SFML \uff1a\u5feb\u901f\uff0c\u7b80\u5355\u7684\u591a\u5a92\u4f53\u5e93","title":"22\u3001 \u591a\u5a92\u4f53"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#23","text":"ACE \uff1aC++ \u9762\u5411\u5bf9\u8c61\u7f51\u7edc\u53d8\u6210\u5de5\u5177\u5305 Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93 Casablanca \uff1aC++ REST SDK cpp-netlib \uff1a\u9ad8\u7ea7\u7f51\u7edc\u7f16\u7a0b\u7684\u5f00\u6e90\u5e93\u96c6\u5408 Dyad.c \uff1aC \u8bed\u8a00\u7684\u5f02\u6b65\u7f51\u7edc libcurl : \u591a\u534f\u8bae\u6587\u4ef6\u4f20\u8f93\u5e93 Mongoose \uff1a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7f51\u7edc\u670d\u52a1\u5668 Muduo \uff1a\u7528\u4e8e Linux \u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u7684 C++ \u975e\u963b\u585e\u7f51\u7edc\u5e93 net_skeleton \uff1aC/C++ \u7684 TCP \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 nope.c \uff1a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8d85\u8f7b\u578b\u8f6f\u4ef6\u5e73\u53f0\uff0c\u7528\u4e8e\u53ef\u6269\u5c55\u7684\u670d\u52a1\u5668\u7aef\u548c\u7f51\u7edc\u5e94\u7528\u3002 \u5bf9\u4e8e C \u7f16\u7a0b\u4eba\u5458\uff0c\u53ef\u4ee5\u8003\u8651 node.js Onion :C \u8bed\u8a00 HTTP \u670d\u52a1\u5668\u5e93\uff0c\u5176\u8bbe\u8ba1\u4e3a\u8f7b\u91cf\u7ea7\uff0c\u6613\u4f7f\u7528\u3002 POCO \uff1a\u7528\u4e8e\u6784\u5efa\u7f51\u7edc\u548c\u57fa\u4e8e\u4e92\u8054\u7f51\u5e94\u7528\u7a0b\u5e8f\u7684 C++ \u7c7b\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728\u684c\u9762\uff0c\u670d\u52a1\u5668\uff0c\u79fb\u52a8\u548c\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3002 RakNet \uff1a\u4e3a\u6e38\u620f\u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u7684\u8de8\u5e73\u53f0\u7684\u5f00\u6e90 C++ \u7f51\u7edc\u5f15\u64ce\u3002 Tuf o \uff1a\u7528\u4e8e Qt \u4e4b\u4e0a\u7684 C++ \u6784\u5efa\u7684\u5f02\u6b65 Web \u6846\u67b6\u3002 WebSocket++ \uff1a\u57fa\u4e8e C++/Boost Aiso \u7684 websocket \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 ZeroMQ \uff1a\u9ad8\u901f\uff0c\u6a21\u5757\u5316\u7684\u5f02\u6b65\u901a\u4fe1\u5e93","title":"23\u3001 \u7f51\u7edc"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#24","text":"\u52a8\u529b\u5b66\u4eff\u771f\u5f15\u64ce Box2D \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Bullet \uff1a3D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Chipmunk \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684 2D \u6e38\u620f\u7269\u7406\u5e93 LiquidFun \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce ODE \uff1a\u5f00\u653e\u52a8\u529b\u5b66\u5f15\u64ce - \u5f00\u6e90\uff0c\u9ad8\u6027\u80fd\u5e93\uff0c\u6a21\u62df\u521a\u4f53\u52a8\u529b\u5b66\u3002 ofxBox2d \uff1aBox2D \u5f00\u6e90\u6846\u67b6\u5305\u88c5\u5668\u3002 Simbody \uff1a\u9ad8\u6027\u80fd C++ \u591a\u4f53\u52a8\u529b\u5b66 / \u7269\u7406\u5e93\uff0c\u6a21\u62df\u5173\u8282\u751f\u7269\u529b\u5b66\u548c\u673a\u68b0\u7cfb\u7edf\uff0c\u50cf\u8f66\u8f86\uff0c\u673a\u5668\u4eba\u548c\u4eba\u4f53\u9aa8\u9abc\u3002","title":"24\u3001 \u7269\u7406\u5b66"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#25","text":"MOOS-IvP \uff1a\u4e00\u7ec4\u5f00\u6e90 C++ \u6a21\u5757\uff0c\u63d0\u4f9b\u673a\u5668\u4eba\u5e73\u53f0\u7684\u81ea\u4e3b\u6743\uff0c\u5c24\u5176\u662f\u81ea\u4e3b\u7684\u6d77\u6d0b\u8f66\u8f86\u3002 MRPT \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u7f16\u7a0b\u5de5\u5177\u5305 PCL \uff1a\u70b9\u4e91\u5e93\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\uff0c\u5927\u89c4\u6a21\u7684\u5f00\u653e\u9879\u76ee\uff0c\u7528\u4e8e 2D/3D \u56fe\u50cf\u548c\u70b9\u4e91\u5904\u7406\u3002 Robotics Library (RL) \uff1a \u4e00\u4e2a\u72ec\u7acb\u7684 C++ \u5e93\uff0c\u5305\u62ec\u673a\u5668\u4eba\u52a8\u529b\u5b66\uff0c\u8fd0\u52a8\u89c4\u5212\u548c\u63a7\u5236\u3002 RobWork \uff1a\u4e00\u7ec4 C++ \u5e93\u7684\u96c6\u5408\uff0c\u7528\u4e8e\u673a\u5668\u4eba\u7cfb\u7edf\u7684\u4eff\u771f\u548c\u63a7\u5236\u3002 ROS \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b\u5e93\u548c\u5de5\u5177\u5e2e\u52a9\u8f6f\u4ef6\u5f00\u53d1\u4eba\u5458\u521b\u5efa\u673a\u5668\u4eba\u5e94\u7528\u7a0b\u5e8f\u3002","title":"25\u3001 \u673a\u5668\u4eba\u5b66"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#26","text":"FFTW : \u7528\u4e00\u7ef4\u6216\u8005\u591a\u7ef4\u8ba1\u7b97 DFT \u7684 C \u8bed\u8a00\u5e93\u3002 GSL \uff1aGNU \u79d1\u5b66\u5e93\u3002","title":"26\u3001 \u79d1\u5b66\u8ba1\u7b97"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#27","text":"ChaiScript \uff1a\u7528\u4e8e C++ \u7684\u6613\u4e8e\u4f7f\u7528\u7684\u5d4c\u5165\u5f0f\u811a\u672c\u8bed\u8a00\u3002 Lua \uff1a\u7528\u4e8e\u914d\u7f6e\u6587\u4ef6\u548c\u57fa\u672c\u5e94\u7528\u7a0b\u5e8f\u811a\u672c\u7684\u5c0f\u578b\u5feb\u901f\u811a\u672c\u5f15\u64ce\u3002 luacxx \uff1a\u7528\u4e8e\u521b\u5efa Lua \u7ed1\u5b9a\u7684 C++ 11 API SWIG \uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u7684 C++ \u4ee3\u7801\u94fe\u63a5\u5230 JavaScript\uff0cPerl\uff0cPHP\uff0cPython\uff0cTcl \u548c Ruby \u7684\u5305\u88c5\u5668 / \u63a5\u53e3\u751f\u6210\u5668 V7 \uff1a\u5d4c\u5165\u5f0f\u7684 JavaScript \u5f15\u64ce\u3002 V8 \uff1a\u8c37\u6b4c\u7684\u5feb\u901f JavaScript \u5f15\u64ce\uff0c\u53ef\u4ee5\u88ab\u5d4c\u5165\u5230\u4efb\u4f55 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002","title":"27\u3001 \u811a\u672c"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#28","text":"Cap\u2019n Proto \uff1a\u5feb\u901f\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u548c RPC \u7cfb\u7edf\u3002 cereal \uff1aC++11 \u5e8f\u5217\u5316\u5e93 FlatBuffers \uff1a\u5185\u5b58\u9ad8\u6548\u7684\u5e8f\u5217\u5316\u5e93 MessagePack \uff1aC/C++ \u7684\u9ad8\u6548\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u5e93\uff0c\u4f8b\u5982 JSON protobuf \uff1a\u534f\u8bae\u7f13\u51b2\uff0c\u8c37\u6b4c\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u3002 protobuf-c \uff1aC \u8bed\u8a00\u7684\u534f\u8bae\u7f13\u51b2\u5b9e\u73b0 SimpleBinaryEncoding \uff1a\u7528\u4e8e\u4f4e\u5ef6\u8fdf\u5e94\u7528\u7a0b\u5e8f\u7684\u5bf9\u4e8c\u8fdb\u5236\u683c\u5f0f\u7684\u5e94\u7528\u7a0b\u5e8f\u4fe1\u606f\u7684\u7f16\u7801\u548c\u89e3\u7801\u3002 Thrift \uff1a\u9ad8\u6548\u7684\u8de8\u8bed\u8a00 IPC/RPC\uff0c\u7528\u4e8e C++\uff0cJava\uff0cPython\uff0cPHP\uff0cC# \u548c\u5176\u5b83\u591a\u79cd\u8bed\u8a00\u4e2d\uff0c\u6700\u521d\u7531 Twitter \u5f00\u53d1\u3002","title":"28\u3001 \u5e8f\u5217\u5316"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#29","text":"libvpx \uff1aVP8/VP9 \u7f16\u7801\u89e3\u7801 SDK FFmpeg \uff1a\u4e00\u4e2a\u5b8c\u6574\u7684\uff0c\u8de8\u5e73\u53f0\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u7528\u4e8e\u8bb0\u5f55\uff0c\u8f6c\u6362\u89c6\u9891\u548c\u97f3\u9891\u6d41\u3002 libde265 \uff1a\u5f00\u653e\u7684 h.265 \u89c6\u9891\u7f16\u89e3\u7801\u5668\u7684\u5b9e\u73b0\u3002 OpenH264 \uff1a\u5f00\u6e90 H.364 \u7f16\u89e3\u7801\u5668\u3002 Theora \uff1a\u514d\u8d39\u5f00\u6e90\u7684\u89c6\u9891\u538b\u7f29\u683c\u5f0f\u3002","title":"29\u3001 \u89c6\u9891"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#30","text":"CarpVM \uff1aC \u4e2d\u6709\u8da3\u7684 VM\uff0c\u8ba9\u6211\u4eec\u4e00\u8d77\u6765\u770b\u770b\u8fd9\u4e2a\u3002 MicroPython \uff1a\u65e8\u5728\u5b9e\u73b0\u5355\u7247\u673a\u4e0a Python3.x \u7684\u5b9e\u73b0 TinyVM \uff1a\u7528\u7eaf\u7cb9\u7684 ANSI C \u7f16\u5199\u7684\u5c0f\u578b\uff0c\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u865a\u62df\u673a\u3002","title":"30\u3001 \u865a\u62df\u673a"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#31-web","text":"Civetweb \uff1a\u63d0\u4f9b\u6613\u4e8e\u4f7f\u7528\uff0c\u5f3a\u5927\u7684\uff0cC/C++ \u5d4c\u5165\u5f0f Web \u670d\u52a1\u5668\uff0c\u5e26\u6709\u53ef\u9009\u7684 CGI\uff0cSSL \u548c Lua \u652f\u6301\u3002 CppCMS \uff1a\u514d\u8d39\u9ad8\u6027\u80fd\u7684 Web \u5f00\u53d1\u6846\u67b6\uff08\u4e0d\u662f CMS\uff09. Crow \uff1a\u4e00\u4e2a C++ \u5fae\u578b web \u6846\u67b6\uff08\u7075\u611f\u6765\u81ea\u4e8e Python Flask\uff09 Kore : \u4f7f\u7528 C \u8bed\u8a00\u5f00\u53d1\u7684\u7528\u4e8e web \u5e94\u7528\u7a0b\u5e8f\u7684\u8d85\u5feb\u901f\u548c\u7075\u6d3b\u7684 web \u670d\u52a1\u5668 / \u6846\u67b6\u3002 libOnion \uff1a\u8f7b\u91cf\u7ea7\u7684\u5e93\uff0c\u5e2e\u52a9\u4f60\u4f7f\u7528 C \u7f16\u7a0b\u8bed\u8a00\u521b\u5efa web \u670d\u52a1\u5668\u3002 QDjango \uff1a\u4f7f\u7528 C++ \u7f16\u5199\u7684\uff0c\u57fa\u4e8e Qt \u5e93\u7684 web \u6846\u67b6\uff0c\u8bd5\u56fe\u6548\u4eff Django API\uff0c\u56e0\u6b64\u5f97\u6b64\u540d\u3002 Wt \uff1a\u5f00\u53d1 Web \u5e94\u7528\u7684 C++ \u5e93\u3002","title":"31\u3001 Web \u5e94\u7528\u6846\u67b6"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#32-xml","text":"XML \u5c31\u662f\u4e2a\u5783\u573e\uff0cxml \u7684\u89e3\u6790\u5f88\u70e6\u4eba\uff0c\u5bf9\u4e8e\u8ba1\u7b97\u673a\u5b83\u4e5f\u662f\u4e2a\u707e\u96be\u3002\u8fd9\u79cd\u7cdf\u7cd5\u7684\u4e1c\u897f\u5b8c\u5168\u6ca1\u6709\u5b58\u5728\u7684\u7406\u7531\u4e86\u3002-Linus Torvalds Expat \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u7684 xml \u89e3\u6790\u5e93 Libxml2 \uff1aGnome \u7684 xml C \u89e3\u6790\u5668\u548c\u5de5\u5177\u5305 libxml++ \uff1aC++ \u7684 xml \u89e3\u6790\u5668 PugiXML \uff1a\u7528\u4e8e C++ \u7684\uff0c\u652f\u6301 XPath \u7684\u8f7b\u91cf\u7ea7\uff0c\u7b80\u5355\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\u3002 RapidXml \uff1a\u8bd5\u56fe\u521b\u5efa\u6700\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\uff0c\u540c\u65f6\u4fdd\u6301\u6613\u7528\u6027\uff0c\u53ef\u79fb\u690d\u6027\u548c\u5408\u7406\u7684 W3C \u517c\u5bb9\u6027\u3002 TinyXML \uff1a\u7b80\u5355\u5c0f\u578b\u7684 C++XML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML2 \uff1a\u7b80\u5355\u5feb\u901f\u7684 C++CML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML++ \uff1aTinyXML \u7684\u4e00\u4e2a\u5168\u65b0\u7684\u63a5\u53e3\uff0c\u4f7f\u7528\u4e86 C++ \u7684\u8bb8\u591a\u8bb8\u591a\u4f18\u52bf\uff0c\u6a21\u677f\uff0c\u5f02\u5e38\u548c\u66f4\u597d\u7684\u5f02\u5e38\u5904\u7406\u3002 Xerces-C++ \uff1a\u7528\u53ef\u79fb\u690d\u7684 C++ \u7684\u5b50\u96c6\u7f16\u5199\u7684 XML \u9a8c\u8bc1\u89e3\u6790\u5668\u3002","title":"32\u3001 XML"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#33","text":"\u4e00\u4e9b\u6709\u7528\u7684\u5e93\u6216\u8005\u5de5\u5177\uff0c\u4f46\u662f\u4e0d\u9002\u5408\u4e0a\u9762\u7684\u5206\u7c7b\uff0c\u6216\u8005\u8fd8\u6ca1\u6709\u5206\u7c7b\u3002 C++ Format \uff1aC++ \u7684\u5c0f\u578b\uff0c\u5b89\u5168\u548c\u5feb\u901f\u683c\u5f0f\u5316\u5e93 casacore \uff1a\u4ece aips++ \u6d3e\u751f\u7684\u4e00\u7cfb\u5217 C++ \u6838\u5fc3\u5e93 cxx-prettyprint \uff1a\u7528\u4e8e C++ \u5bb9\u5668\u7684\u6253\u5370\u5e93 DynaPDF \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 PDF \u751f\u6210\u5e93 gcc-poison \uff1a\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u7981\u6b62\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e0d\u5b89\u5168\u7684 C/C++ \u51fd\u6570\u7684\u7b80\u5355\u7684\u5934\u6587\u4ef6\u3002 googlemock \uff1a\u7f16\u5199\u548c\u4f7f\u7528 C++ \u6a21\u62df\u7c7b\u7684\u5e93 HTTP Parser \uff1aC \u7684 http \u8bf7\u6c42 / \u54cd\u5e94\u89e3\u6790\u5668 libcpuid \uff1a\u7528\u4e8e x86 CPU \u68c0\u6d4b\u76d2\u7279\u5f81\u63d0\u53d6\u7684\u5c0f\u578b C \u5e93 libevil \uff1a\u8bb8\u53ef\u8bc1\u7ba1\u7406\u5668 libusb \uff1a\u5141\u8bb8\u79fb\u52a8\u8bbf\u95ee USB \u8bbe\u5907\u7684\u901a\u7528 USB \u5e93 PCRE \uff1a\u6b63\u5219\u8868\u8fbe\u5f0f C \u5e93\uff0c\u7075\u611f\u6765\u81ea\u4e8e Perl \u4e2d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u529f\u80fd\u3002 Remote Call Framework \uff1aC++ \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u6846\u67b6\u3002 Scintilla \uff1a\u5f00\u6e90\u7684\u4ee3\u7801\u7f16\u8f91\u63a7\u4ef6 Serial Communication Library \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u8de8\u5e73\u53f0\uff0c\u4e32\u53e3\u5e93\u3002 SDS \uff1aC \u7684\u7b80\u5355\u52a8\u6001\u5b57\u7b26\u4e32\u5e93 SLDR \uff1a\u8d85\u8f7b\u7684 DNS \u89e3\u6790\u5668 SLRE \uff1a \u8d85\u8f7b\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5e93 Stage \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u6a21\u62df\u5668 VarTypes \uff1aC++/Qt4 \u529f\u80fd\u4e30\u5bcc\uff0c\u9762\u5411\u5bf9\u8c61\u7684\u7ba1\u7406\u53d8\u91cf\u7684\u6846\u67b6\u3002 ZBar \uff1a\u2018\u6761\u5f62\u7801\u626b\u63cf\u5668\u2019\u5e93\uff0c\u53ef\u4ee5\u626b\u63cf\u7167\u7247\uff0c\u56fe\u7247\u548c\u89c6\u9891\u6d41\u4e2d\u7684\u6761\u5f62\u7801\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\u3002 CppVerbalExpressions \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 C++ \u6b63\u5219\u8868\u8fbe\u5f0f QtVerbalExpressions \uff1a\u57fa\u4e8e C++ VerbalExpressions \u5e93\u7684 Qt \u5e93 PHP-CPP \uff1a\u4f7f\u7528 C++ \u6765\u6784\u5efa PHP \u6269\u5c55\u7684\u5e93 Better String \uff1aC \u7684\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e93\uff0c\u529f\u80fd\u66f4\u4e30\u5bcc\uff0c\u4f46\u662f\u6ca1\u6709\u7f13\u51b2\u6ea2\u51fa\u95ee\u9898\uff0c\u8fd8\u5305\u542b\u4e86\u4e00\u4e2a C++ \u5305\u88c5\u5668\u3002","title":"33\u3001 \u591a\u9879\u6df7\u6742"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#34","text":"\u7528\u4e8e\u521b\u5efa\u5f00\u53d1\u73af\u5883\u7684\u8f6f\u4ef6 aardio : arrdio \u662f\u4e00\u4e2a\u80fd\u5728 windows \u7cfb\u7edf\u4e2d\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u4e00\u95e8\u8bed\u8a00\uff0c\u4e5f\u662f\u4e00\u4e2a\u8d85\u7ea7\u80f6\u6c34\u5de5\u5177\u3002\u4f60\u53ef\u4ee5\u7528 python\u3001java\u3001C\u3001C#\u3001javastrip\u3001PHP \u7b49\u6570\u503c\u7684\u7f16\u7a0b\u8bed\u8a00\u7ed3\u5408 arrdio \u51e0\u5206\u949f\u5c31\u53ef\u4ee5\u5f00\u53d1\u4e00\u6b3e\u5e26\u754c\u9762\u7684\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u4f60\u53ef\u4ee5\u7528 html \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6216\u8005\u7528\u5176\u4ed6\u754c\u9762\u5e93\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u3002\u4e00\u5207\u90fd\u662f\u4f60\u8bf4\u4e86\u7b97\uff01\u8d85\u5c0f\u7684\u8f6f\u4ef6\u4f53\u79ef\uff0c\u8d85\u5feb\u7684\u521b\u5efa\u901f\u5ea6\uff01 cmder : cmder \u662f\u4e00\u4e2a\u589e\u5f3a\u578b\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u4e0d\u4ec5\u53ef\u4ee5\u4f7f\u7528 windows \u4e0b\u7684\u6240\u6709\u547d\u4ee4\uff0c\u66f4\u723d\u7684\u662f\u53ef\u4ee5\u4f7f\u7528 linux \u7684\u547d\u4ee4, shell \u547d\u4ee4\u3002windows \u4e0b\u7684\u8f6f\u4ef6.","title":"34\u3001 \u8f6f\u4ef6"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#35","text":"C/C++ \u7f16\u8bd1\u5668\u5217\u8868 Clang : \u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1\u7684 GCC \uff1aGNU \u7f16\u8bd1\u5668\u96c6\u5408 Intel C++ Compiler \uff1a\u7531\u82f1\u7279\u5c14\u516c\u53f8\u5f00\u53d1 LLVM \uff1a\u6a21\u5757\u5316\u548c\u53ef\u91cd\u7528\u7f16\u8bd1\u5668\u548c\u5de5\u5177\u94fe\u6280\u672f\u7684\u96c6\u5408 Microsoft Visual C++ \uff1aMSVC\uff0c\u7531\u5fae\u8f6f\u516c\u53f8\u5f00\u53d1 Open WatCom \uff1aWatcom\uff0cC\uff0cC++ \u548c Fortran \u4ea4\u53c9\u7f16\u8bd1\u5668\u548c\u5de5\u5177 TCC \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u7f16\u8bd1\u5668","title":"35\u3001 \u7f16\u8bd1\u5668"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#36","text":"\u5728\u7ebf C/C++ \u7f16\u8bd1\u5668\u5217\u8868 codepad \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u534f\u4f5c\u5de5\u5177 CodeTwist \uff1a\u4e00\u4e2a\u7b80\u5355\u7684\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4f60\u53ef\u4ee5\u7c98\u8d34\u7684 C,C++ \u6216\u8005 Java \u4ee3\u7801\uff0c\u5728\u7ebf\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c coliru \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / shell\uff0c \u652f\u6301\u5404\u79cd C++ \u7f16\u8bd1\u5668 Compiler Explorer \uff1a\u4ea4\u4e92\u5f0f\u7f16\u8bd1\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u6c47\u7f16\u8f93\u51fa CompileOnline \uff1aLinux \u4e0a\u5728\u7ebf\u7f16\u8bd1\u548c\u6267\u884c C++ \u7a0b\u5e8f Ideone \uff1a\u4e00\u4e2a\u5728\u7ebf\u7f16\u8bd1\u5668\u548c\u8c03\u8bd5\u5de5\u5177\uff0c\u5141\u8bb8\u4f60\u5728\u7ebf\u7f16\u8bd1\u6e90\u4ee3\u7801\u5e76\u6267\u884c\uff0c\u652f\u6301 60 \u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u3002","title":"36\u3001 \u5728\u7ebf\u7f16\u8bd1\u5668"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#37","text":"C/C++ \u8c03\u8bd5\u5668\u5217\u8868 Comparison of debuggers \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u8c03\u8bd5\u5668\u5217\u8868 GDB \uff1aGNU \u8c03\u8bd5\u5668 Valgrind \uff1a\u5185\u5b58\u8c03\u8bd5\uff0c\u5185\u5b58\u6cc4\u9732\u68c0\u6d4b\uff0c\u6027\u80fd\u5206\u6790\u5de5\u5177\u3002","title":"37\u3001 \u8c03\u8bd5\u5668"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#38-ide","text":"C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u5217\u8868 AppCode \uff1a\u6784\u5efa\u4e0e JetBrains\u2019 IntelliJ IDEA \u5e73\u53f0\u4e0a\u7684\u7528\u4e8e Objective-C\uff0cC,C++\uff0cJava \u548c Java \u5f00\u53d1\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CLion \uff1a\u6765\u81ea JetBrains \u7684\u8de8\u5e73\u53f0\u7684 C/C++ \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 Code::Blocks \uff1a\u514d\u8d39 C\uff0cC++ \u548c Fortran \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CodeLite \uff1a\u53e6\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u514d\u8d39\u7684 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Dev-C++ \uff1a\u53ef\u79fb\u690d\u7684 C/C++/C++11 \u96c6\u6210\u5f00\u53d1\u73af\u5883 Eclipse CDT \uff1a\u57fa\u4e8e Eclipse \u5e73\u53f0\u7684\u529f\u80fd\u9f50\u5168\u7684 C \u548c C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Geany \uff1a\u8f7b\u91cf\u7ea7\u7684\u5feb\u901f\uff0c\u8de8\u5e73\u53f0\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 IBM VisualAge \uff1a\u6765\u81ea IBM \u7684\u5bb6\u5ead\u8ba1\u7b97\u673a\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 Irony-mode \uff1a\u7531 libclang \u9a71\u52a8\u7684\u7528\u4e8e Emacs \u7684 C/C++ \u5fae\u6a21\u5f0f KDevelop \uff1a\u514d\u8d39\u5f00\u6e90\u96c6\u6210\u5f00\u53d1\u73af\u5883 Microsoft Visual Studio \uff1a\u6765\u81ea\u5fae\u8f6f\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 NetBeans \uff1a\u4e3b\u8981\u7528\u4e8e Java \u5f00\u53d1\u7684\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u652f\u6301\u5176\u4ed6\u8bed\u8a00\uff0c\u5c24\u5176\u662f PHP\uff0cC/C++ \u548c HTML5\u3002 Qt Creator \uff1a\u8de8\u5e73\u53f0\u7684 C++\uff0cJavascript \u548c QML \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u662f Qt SDK \u7684\u4e00\u90e8\u5206\u3002 rtags \uff1aC/C++ \u7684\u5ba2\u6237\u7aef\u670d\u52a1\u5668\u7d22\u5f15\uff0c\u7528\u4e8e \u8ddf\u57fa\u4e8e clang \u7684 emacs \u7684\u96c6\u6210 Xcode \uff1a\u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1 YouCompleteMe \uff1a\u4e00\u4e2a\u7528\u4e8e Vim \u7684\u6839\u636e\u4f60\u6572\u7684\u4ee3\u7801\u5feb\u901f\u6a21\u7cca\u641c\u7d22\u5e76\u8fdb\u884c\u4ee3\u7801\u8865\u5168\u7684\u5f15\u64ce\u3002","title":"38\u3001 \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#39","text":"Bear \uff1a\u7528\u4e8e\u4e3a clang \u5de5\u5177\u751f\u6210\u7f16\u8bd1\u6570\u636e\u5e93\u7684\u5de5\u5177 Biicode \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u7b80\u5355\u4f9d\u8d56\u7ba1\u7406\u5668\u3002 CMake \uff1a\u8de8\u5e73\u53f0\u7684\u514d\u8d39 \u5f00\u6e90\u8f6f\u4ef6 \u7528\u4e8e\u7ba1\u7406\u8f6f\u4ef6\u4f7f\u7528\u72ec\u7acb\u7f16\u8bd1\u7684\u65b9\u6cd5\u8fdb\u884c\u6784\u5efa\u7684\u8fc7\u7a0b\u3002 CPM \uff1a\u57fa\u4e8e CMake \u548c Git \u7684 C++ \u5305\u7ba1\u7406\u5668 FASTBuild \uff1a\u9ad8\u6027\u80fd\uff0c\u5f00\u6e90\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u652f\u6301\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7684\u7f16\u8bd1\uff0c\u7f13\u51b2\u548c\u7f51\u7edc\u5206\u5e03\u3002 Ninja \uff1a\u4e13\u6ce8\u4e8e\u901f\u5ea6\u7684\u5c0f\u578b\u6784\u5efa\u7cfb\u7edf Scons \uff1a\u4f7f\u7528 Python scipt \u914d\u7f6e\u7684\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177 tundra \uff1a\u9ad8\u6027\u80fd\u7684\u4ee3\u7801\u6784\u5efa\u7cfb\u7edf\uff0c\u751a\u81f3\u5bf9\u4e8e\u975e\u5e38\u5927\u578b\u7684\u8f6f\u4ef6\u9879\u76ee\uff0c\u4e5f\u80fd\u63d0\u4f9b\u6700\u597d\u7684\u589e\u91cf\u6784\u5efa\u6b21\u6570\u3002 tup \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u7528\u4e8e\u540e\u53f0\u76d1\u63a7\u53d8\u5316\u7684\u6587\u4ef6\u3002","title":"39\u3001 \u6784\u5efa\u7cfb\u7edf"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#40","text":"\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u7684\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 Cppcheck \uff1a\u9759\u6001 C/C++ \u4ee3\u7801\u5206\u6790\u5de5\u5177 include-what-you-use \uff1a\u4f7f\u7528 clang \u8fdb\u884c\u4ee3\u7801\u5206\u6790\u7684\u5de5\u5177\uff0c\u53ef\u4ee5 #include \u5728 C \u548c C++ \u6587\u4ef6\u4e2d\u3002 OCLint \uff1a\u7528\u4e8e C\uff0cC++ \u548c Objective-C \u7684\u9759\u6001\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177\uff0c\u7528\u4e8e\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u3002 Clang Static Analyzer \uff1a\u67e5\u627e C\uff0cC++ \u548c Objective-C \u7a0b\u5e8f bug \u7684\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177 List of tools for static code analysis \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u9759\u6001\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868","title":"40\u3001 \u9759\u6001\u4ee3\u7801\u5206\u6790"},{"location":"collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#41-linux","text":"picocom : linux \u4e0b\u7684\u4e00\u4e2a\u597d\u7528\u7684\u4e32\u53e3\u7ec8\u7aef. w3m : \u7ec8\u7aef\u6d4f\u89c8\u5668, \u771f\u6b63\u7684\u7a0b\u5e8f\u5458\u5c31\u8be5\u4f7f\u7528\u547d\u4ee4\u884c\u6765\u6d4f\u89c8\u7f51\u9875\u3002 The Fuck : \u5728\u7ec8\u7aef\u4e0b\u662f\u4e0d\u662f\u7ecf\u5e38\u8f93\u9519\u547d\u4ee4\uff0c\u641e\u5f97\u81ea\u5df1\u5fc3\u70e6\u610f\u4e71\uff0cThe Fuck \u662f\u4e00\u6b3e\u4e86\u4e0d\u8d77\u7684\u5de5\u5177\uff0c\u5e2e\u4f60\u5f7b\u5e95\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5f53\u4f60\u8f93\u9519\u547d\u4ee4\u540e\uff0c\u53ea\u8981\u8f93\u5165 fuck \u547d\u4ee4\uff0c\u5b83\u4f1a\u5e2e\u4f60\u81ea\u52a8\u7ea0\u6b63\u9519\u8bef\uff0c\u7cbe\u5f69\u4e4b\u6781\uff01 tldr : tldr \u662f Too long, Don't read \u7684\u7f29\u5199\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u67e5\u770b\u5e38\u7528\u547d\u4ee4\u7684\u4f7f\u7528\u5b9e\u4f8b\uff0c\u6bd4\u5982 tar \u547d\u4ee4\uff0c\u90a3\u540e\u9762\u4e00\u957f\u4e32\u53c2\u6570\u8c01\u8bb0\u5f97\u6e05\u5462\uff1f\u5f53\u7136\uff0clinux \u5927\u4f6c\u9664\u5916\u3002 fzf : fzf \u662f\u4e00\u6b3e\u652f\u6301\u6a21\u7cca\u641c\u7d22\u7684\u4ea4\u4e92\u5f0f\u5de5\u5177\uff0c\u53ef\u4ee5\u7528\u6765\u67e5\u627e\u4efb\u4f55\u5217\u8868\u5185\u5bb9\uff0c\u5305\u62ec\u6587\u4ef6\u3001Git \u5206\u652f\u3001\u8fdb\u7a0b\u7b49\u3002 fd : \u7b80\u5355\u3001\u5feb\u901f\u3001\u597d\u7528\uff0c\u7528\u4e8e\u66ff\u6362 find \u7684\u641c\u7d22\u5de5\u5177\u3002 exa : \u7528\u6765\u66ff\u6362 ls \u547d\u4ee4\u7684\u73b0\u4ee3\u5316\u5de5\u5177\u3002 nnn : nnn (n\u00b3) \u662f\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u7ec8\u7aef\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u901f\u5ea6\u975e\u5e38\u5feb\u4e14\u51e0\u4e4e 0 \u914d\u7f6e\uff0c\u4e5f\u662f\u4e00\u4e2a\u975e\u5e38\u4e0d\u9519\u7684\u9009\u62e9\u3002 powerline : \u7ec8\u7aef\u672c\u8eab\u662f\u9ad8\u6548\u7684\uff0c\u4f46\u6709\u65f6\u4e5f\u7565\u663e\u4e4f\u5473\uff0c\u4f7f\u7528 powerline \u53ef\u4ee5\u4e3a\u7ec8\u7aef\u52a0\u4e0a\u5f3a\u5927\u7684 \u72b6\u6001\u680f\uff0c\u6bd4\u5982\u5728 vim \u4e2d\u663e\u793a\u5f53\u524d\u72b6\u6001\uff0c\u5728\u6253\u5f00 git \u76ee\u5f55\u65f6\u663e\u793a\u5f53\u524d\u5206\u652f\u7b49\u7b49\u3002 dtrx \u6709\u4e86\u8fd9\u4e2a\u5de5\u5177\u4f60\u57fa\u672c\u518d\u4e5f\u4e0d\u7528\u8bb0\u4f4f\u5982\u4f55\u5728 linux \u4e0a\u9762\u89e3\u538b\u5404\u79cd\u540e\u7f00\u7684\u6587\u4ef6\u4e86\uff0c\u4ec0\u4e48 tar.gz,tgz,xz,bz2,zip.rar \u7b49\u901a\u901a\u641e\u5b9a\uff0c\u8fd9\u662f\u4e00\u4e2a python \u5de5\u5177. autojump : \u8bb0\u5fc6\u8fdb\u8fc7\u7684\u6587\u4ef6\u5939\uff0c\u4e0b\u6b21\u53ef\u7528 j + \u6587\u4ef6\u5939\u540d \u76f4\u63a5\u8df3\u8fdb\uff0c \u5f88\u65b9\u4fbf. \u8f6f\u4ef6\u5b89\u88c5\u5b8c\u540e\u8f93\u5165\u4e0b\u9762\u547d\u4ee4\u751f\u6548\u7ec8\u7aef (echo \"\"# autojump\\nsource /usr/share/autojump/autojump.bash\">> ~/.bashrc) rebash : \u811a\u672c\u5e93 / \u6846\u67b6\u3002\u7279\u70b9\uff1a\u8fdb\u53e3\uff0c\u4f8b\u5916\uff0c\u6587\u4ef6\u6d4b\u8bd5... shutit : \u57fa\u4e8e bash \u548c pexpect \u7684\u81ea\u52a8\u5316\u6846\u67b6 dispatch : 50 \u884c\u53ef\u79fb\u690d shell \u811a\u672c\u4e2d\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002 bashful : \u4e00\u4e2a\u5e93\u7684\u96c6\u5408\uff0c\u4ee5\u7b80\u5316\u7f16\u5199 Bash \u811a\u672c ansi : \u5728\u7eaf bash \u4e2d\u7684 ANSI \u8f6c\u4e49\u7801 - \u66f4\u6539\u6587\u672c\u989c\u8272\uff0c\u5b9a\u4f4d\u5149\u6807\uff0c\u7b49\u7b49 history : \u975e\u5e38\u7b80\u5355\uff0c\u5c24\u5176\u662f\u5728\u4f60\u4f9d\u8d56\u4e8e\u590d\u5236\u4f7f\u7528\u8fc7\u7684\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e2a\u547d\u4ee4\u7279\u522b\u6709\u7528\u3002 sort, uniq\uff1a\u6392\u5e8f\u53bb\u91cd\u3002 awk, grep, sed\uff1a\u6587\u672c\u5904\u7406\u795e\u5668\u3002 jq \uff0c\u547d\u4ee4\u884c\u7684 json \u67e5\u8be2\u548c\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u9002\u5408\u67e5\u770b rest \u63a5\u53e3\u7684\u8f93\u51fa strace\uff0c\u6253\u5370\u51fa\u8fdb\u7a0b\u8c03\u7528\u4e86\u54ea\u4e9b\u7cfb\u7edf\u8c03\u7528\u3002 objdump\uff0c\u6253\u5370\u76ee\u6807\u7801\u548c\u53cd\u6c47\u7f16\u7ed3\u679c transfer.sh : \u53ef\u901a\u8fc7\u7b80\u5355\u7684\u547d\u4ee4\u884c\u6765\u5feb\u901f\u5b8c\u6210\u6587\u4ef6\u5171\u4eab\u64cd\u4f5c stegify : \u4e00\u6b3e\u795e\u5947\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u80fd\u5c06\u4efb\u610f\u6587\u4ef6\u9690\u85cf\u5230\u56fe\u7247\u91cc\u9762\u3002 Httpie \u4e00\u4e2a HTTP \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u4f7f\u7528\u8d77\u6765\u6bd4 curl \u66f4\u4e3a\u53cb\u597d\uff0c\u5e76\u652f\u6301\u8f93\u51fa JSON\u3001\u8bed\u6cd5\u9ad8\u4eae\u7b49\u7279\u6027\uff0c\u4e3a\u5f00\u53d1\u8005\u5448\u73b0\u66f4\u4e3a\u76f4\u89c2\u7684 UI\uff0c\u4e0e\u670d\u52a1\u5668\u95f4\u7684\u8c03\u8bd5\u4f53\u9a8c\u4e5f\u66f4\u4e3a\u4eba\u6027\u5316\u3002 PM2 : \u7528\u4ee5\u5728\u540e\u53f0\u8fd0\u884c\u548c\u7ba1\u7406\u8fdb\u7a0b SpaceVim \uff1a\u8fd9\u662f\u4e00\u4e2a vim \u63d2\u4ef6\uff0c\u4f7f\u4f60\u7684 Vim \u53d8\u6210\u5e26\u4ee3\u7801\u81ea\u52a8\u8865\u5168\u7b49\u529f\u80fd\u7684\u66f4\u52a0\u5f3a\u5927\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff01 axel\uff1a\u591a\u7ebf\u7a0b\u65ad\u70b9\u4e0b\u8f7d\u5de5\u5177\uff0c\u975e\u5e38\u597d\u7528\u3002\u4f8b\u5982\u4e0b\u56fe\u4e2d\u8fd9\u6837\uff0c\u6307\u5b9a\u4e86 8 \u4e2a\u7ebf\u7a0b\u540c\u65f6\u4e0b\u8f7d\u3002 nmon\uff1a\u5b83\u80fd\u591f\u5e2e\u4f60\u8fdb\u884c\u7535\u8111\u7684\u6027\u80fd\u76d1\u63a7\uff0c\u5305\u62ec CPU\uff0c\u5185\u5b58\uff0c\u78c1\u76d8 IO\uff0c\u7f51\u7edc IO\uff0c\u5e76\u4e14\u754c\u9762\u5f88\u70ab\u9177\uff0c\u662f\u4e0d\u662f\u5f88\u50cf\u9ed1\u5ba2\uff0c\u5feb\u53bb\u8bd5\u8bd5\u5427 nmon for Linux | Main Alex \uff1a\u5b83\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u5f88\u6709\u7528\u7684\u5c0f\u5de5\u5177\u3002\u9002\u7528\u4e8e\u660e\u6587\u6587\u672c\u6216\u8005\u683c\u5f0f\u4e3a Markdown \u6216 HTML \u7684\u6587\u6863\u3002Alex \u4f1a\u5bf9 \u201c\u6027\u522b\u504f\u597d\u3001\u6781\u7aef\u4e3b\u4e49\u3001\u79cd\u65cf\u76f8\u5173\u3001\u5b97\u6559\uff0c\u6216\u8005\u6587\u7ae0\u4e2d\u5176\u4ed6\u4e0d\u5e73\u7b49\u7684\u63aa\u8f9e\u201d \u4ea7\u751f\u8b66\u544a\u3002\u5982\u679c\u4f60\u60f3\u8981\u8bd5\u8bd5\u770b Alex\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u5728\u7ebf demo \uff1b GNU Aspell \uff1a\u5b83\u80fd\u591f\u4ea4\u4e92\u5f0f\u5730\u68c0\u6d4b\u6587\u672c\u6587\u6863\uff0c\u80fd\u9ad8\u4eae\u663e\u793a\u62fc\u5199\u9519\u8bef\uff0c\u8fd8\u80fd\u5728\u62fc\u5199\u9519\u8bef\u7684\u4e0a\u65b9\u63d0\u4f9b\u6b63\u786e\u7684\u62fc\u5199\u5efa\u8bae\u3002Aspell \u5728\u8fdb\u884c\u62fc\u5199\u68c0\u67e5\u7684\u65f6\u5019\uff0c\u540c\u6837\u80fd\u591f\u5ffd\u7565\u8bb8\u591a\u8bed\u6cd5\u6807\u8bb0\uff1b Proselint \uff1a\u5b83\u662f\u4e00\u6b3e\u5168\u80fd\u7684\u5b9e\u65f6\u68c0\u67e5\u5de5\u5177\u3002\u5b83\u4f1a\u627e\u51fa\u884c\u8bdd\u3001\u5927\u8bdd\u3001\u4e0d\u6b63\u786e\u65e5\u671f\u548c\u65f6\u95f4\u683c\u5f0f\u3001\u6ee5\u7528\u7684\u672f\u8bed \u7b49\u7b49 \u3002\u5b83\u4e5f\u5f88\u5bb9\u6613\u8fd0\u884c\u5e76\u5ffd\u7565\u6587\u672c\u4e2d\u7684\u6807\u8bb0\uff1b WordGrinder \uff1a\u5b83\u662f\u4e00\u6b3e\u4f7f\u7528\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u62e5\u6709\u8db3\u591f\u7684\u7f16\u5199\u548c\u53d1\u5e03\u529f\u80fd\u7684\u6587\u5b57\u7f16\u8f91\u5668\u3002\u5b83\u652f\u6301\u57fa\u672c\u7684\u683c\u5f0f\u548c\u6837\u5f0f\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u5c06\u4f60\u7684\u6587\u5b57\u4ee5 Markdown\u3001ODT\u3001LaTeX \u6216\u8005 HTML \u7b49\u683c\u5f0f\u5bfc\u51fa\uff1b cloc : \u7528\u6765\u7edf\u8ba1\u4ee3\u7801\u884c\u6570\uff0c\u7edf\u8ba1\u7ed3\u679c\u6bd4\u8f83\u5206\u7c7b\u6bd4\u8f83\u8be6\u7ec6\uff0c\u652f\u6301\u5927\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u3002 tldr : \u5982\u679c\u4f60\u7ecf\u5e38\u4e0d\u60f3\u8be6\u8bfb man \u6587\u6863\uff0c\u90a3\u4e48\u4f60\u5e94\u8be5\u8bd5\u8bd5\u8fd9\u4e2a\u5c0f\u5de5\u5177\u3002 cppman \uff1aC++ 98/11/14 \u624b\u518c\u67e5\u8be2 for Linux/MacOS icdiff \uff1a\u5206\u5c4f\u663e\u793a diff mcedit \uff1a\u7ec8\u7aef\u4e0b\u9762\u7684 NotePad++ owncloud \uff1aDropBox \u7684\u5f00\u6e90\u66ff\u4ee3\u54c1\uff0c\u63d0\u4f9b\u547d\u4ee4\u884c\u5ba2\u6237\u7aef owncloudcmd pm \uff1a\u5728 bash / zsh \u4e2d\u8fc5\u901f\u5207\u6362\u9879\u76ee\u76ee\u5f55 ncdu \uff1a\u53ef\u89c6\u5316\u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f, \u4f60\u53d1\u73b0\u6709\u4eba\u628a /home \u7a7a\u95f4\u6491\u7206\u4e86\uff0c\u5f71\u54cd\u4e86\u5927\u5bb6\u7684\u5de5\u4f5c\uff0c\u4f60\u6124\u6012\u4e86\u4e00\u5c42\u5c42\u7684 du\uff0c\u4e00\u5c42\u5c42\u7684 cd\uff0c\u6574\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u5228\u5783\u573e\u5806\u4e00\u6837\u7684\u6076\u5fc3\uff0c\u540e\u6765\u53d1\u73b0\u4e86 ncdu \u8fd9\u4e2a\u57fa\u4e8e ncurses \u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f\uff1a glances \uff1a\u66f4\u5f3a\u5927\u7684 htop / top \u4ee3\u66ff\u8005 htop \u4ee3\u66ff top\uff0cglances \u4ee3\u66ff htop\uff1a mc \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8 ranger \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8\u53e6\u4e00\u6b3e\u5185\u5bb9\u9884\u89c8\u8f6f\u4ef6\uff0c\u754c\u9762\u6ca1\u6709 mc \u90a3\u4e48\u6f02\u4eae\uff0c\u6807\u8bb0\u62f7\u8d1d\u4e5f\u6ca1\u5b83\u5f3a\uff0c\u4f46\u662f\u9884\u89c8\u529f\u80fd\u505a\u7684\u5f88\u4e0d\u9519\uff0c\u5982\u679c\u4f60\u4e60\u60ef vim \u952e\u4f4d\u7684\u8bdd\uff0c\u4f60\u4f1a\u53d1\u73b0 ranger \u6709\u4e9b\u5730\u65b9\u6bd4 mc \u505a\u7684\u597d\u4e0d\u5c11\uff1a dstat \uff1avmstat \u4ee3\u66ff\u8005, \u53ef\u80fd\u4e0d\u5c11\u4eba\u90fd\u7528\u8fc7\uff0c\u4f46\u662f\u672c\u95ee\u9898\u4e0b\u597d\u50cf\u6ca1\u4eba\u63d0\uff1f cheat \uff1a\u547d\u4ee4\u884c\u7b14\u8bb0, \u5c31\u662f\u5404\u79cd cheat sheet \uff0c\u6bd4\u5982\u7ecf\u5e38\u641e\u5fd8 redis \u547d\u4ee4\u7684\u8bdd\uff0c\u4f60\u53ef\u4ee5\u65b0\u5efa ~/.cheat/redis \u8fd9\u4e2a\u6587\u4ef6\uff0c\u5199\u4e00\u4e9b\u5185\u5bb9\uff0c\u6bd4\u5982\uff1a multitail \uff1a\u591a\u91cd tail, \u901a\u5e38\u4f60\u4e0d\u6b62\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\u8981\u76d1\u63a7\uff0c\u600e\u4e48\u529e\uff1f\u7ec8\u7aef\u8f6f\u4ef6\u91cc\u5f00\u591a\u4e2a tab \u592a\u5360\u5730\u65b9\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u8fd9\u4e2a\u5de5\u5177\uff1a bro \uff1a\u4ee5\u7528\u4f8b\u4e3a\u4e3b\u7684\u5e2e\u52a9\u7cfb\u7edf, \u7c7b\u4f3c\u4e8e man, \u4f46\u662f\u5bf9\u65b0\u624b\u53cb\u597d. http.server : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u4f46\u6ca1\u6709\u4e0a\u4f20\u529f\u80fd. SimpleHTTPServerWithUpload.py : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u6709\u4e0a\u4f20\u529f\u80fd. \u6709 python2 \u548c python3 \u4e24\u4e2a\u7248\u672c. \u53c2\u8003\u8fde\u63a5: \u5e72\u8d27 | C++ \u8d44\u6e90\u3001\u6846\u67b6\u5927\u5168\uff0c\u63a8\u8350\u6536\u85cf https://www.zhihu.com/question/59227720/answer/286665684 https://www.zhihu.com/question/59227720/answer/578875058 https://www.zhihu.com/question/59227720/answer/163933473 https://www.zhihu.com/question/59227720/answer/163966430","title":"41\u3001 linux \u5b9e\u7528\u5de5\u5177"},{"location":"collect/%E7%9B%AE%E5%BD%95/","text":"\u76ee\u5f55 \u6570\u636e\u6765\u6e90 01_\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b","title":"\u7b80\u60a6"},{"location":"collect/%E7%9B%AE%E5%BD%95/#_1","text":"\u6570\u636e\u6765\u6e90 01_\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b","title":"\u76ee\u5f55"},{"location":"cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/","text":"\u597d\u4e66\u63a8\u8350","title":"\u597d\u4e66\u63a8\u8350"},{"location":"cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/#_1","text":"","title":"\u597d\u4e66\u63a8\u8350"},{"location":"cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/","text":"\u5fc5\u5b66\u5de5\u5177","title":"\u5fc5\u5b66\u5de5\u5177"},{"location":"cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/#_1","text":"","title":"\u5fc5\u5b66\u5de5\u5177"},{"location":"cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/","text":"\u6570\u5b66\u57fa\u7840","title":"\u6570\u5b66\u57fa\u7840"},{"location":"cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/#_1","text":"","title":"\u6570\u5b66\u57fa\u7840"},{"location":"cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/","text":"\u6570\u5b66\u8fdb\u9636","title":"\u6570\u5b66\u8fdb\u9636"},{"location":"cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/#_1","text":"","title":"\u6570\u5b66\u8fdb\u9636"},{"location":"cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/","text":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5","title":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5"},{"location":"cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/#_1","text":"","title":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5"},{"location":"cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/","text":"\u7535\u5b50\u57fa\u7840","title":"\u7535\u5b50\u57fa\u7840"},{"location":"cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/#_1","text":"","title":"\u7535\u5b50\u57fa\u7840"},{"location":"cs/%E7%9B%AE%E5%BD%95/","text":"\u76ee\u5f55 \u6570\u636e\u6765\u6e90 csdiy","title":"\u76ee\u5f55"},{"location":"cs/%E7%9B%AE%E5%BD%95/#_1","text":"\u6570\u636e\u6765\u6e90 csdiy","title":"\u76ee\u5f55"},{"location":"cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/","text":"\u7f16\u7a0b\u5165\u95e8","title":"\u7f16\u7a0b\u5165\u95e8"},{"location":"cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/#_1","text":"","title":"\u7f16\u7a0b\u5165\u95e8"},{"location":"dev-guide/","text":"Developer Guide Extending MkDocs The MkDocs Developer Guide provides documentation for developers of third party themes and plugins. Please see the Contributing Guide for information on contributing to MkDocs itself. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Themes Translations Plugins API Reference","title":"README"},{"location":"dev-guide/#developer-guide","text":"Extending MkDocs The MkDocs Developer Guide provides documentation for developers of third party themes and plugins. Please see the Contributing Guide for information on contributing to MkDocs itself. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Themes Translations Plugins API Reference","title":"Developer Guide"},{"location":"dev-guide/api/","text":"API reference Note The main entry point to the API is through Events that are received by plugins. These events' descriptions link back to this page. ::: mkdocs.structure.files.Files options: show_root_heading: true ::: mkdocs.structure.files.File options: show_root_heading: true ::: mkdocs.config.base.Config options: show_root_heading: true ::: mkdocs.livereload.LiveReloadServer options: show_root_heading: true","title":"API"},{"location":"dev-guide/api/#api-reference","text":"Note The main entry point to the API is through Events that are received by plugins. These events' descriptions link back to this page. ::: mkdocs.structure.files.Files options: show_root_heading: true ::: mkdocs.structure.files.File options: show_root_heading: true ::: mkdocs.config.base.Config options: show_root_heading: true ::: mkdocs.livereload.LiveReloadServer options: show_root_heading: true","title":"API reference"},{"location":"dev-guide/plugins/","text":"MkDocs Plugins A Guide to installing, using and creating MkDocs Plugins Installing Plugins Before a plugin can be used, it must be installed on the system. If you are using a plugin which comes with MkDocs, then it was installed when you installed MkDocs. However, to install third party plugins, you need to determine the appropriate package name and install it using pip : pip install mkdocs-foo-plugin Once a plugin has been successfully installed, it is ready to use. It just needs to be enabled in the configuration file. The Best-of-MkDocs page has a large list of plugins that you can install and use. Using Plugins The plugins configuration option should contain a list of plugins to use when building the site. Each \"plugin\" must be a string name assigned to the plugin (see the documentation for a given plugin to determine its \"name\"). A plugin listed here must already be installed . plugins: - search Some plugins may provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given plugin supports. Note that a colon ( : ) must follow the plugin name and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single plugin, each option must be defined on a separate line. plugins: - search: lang: en foo: bar For information regarding the configuration options available for a given plugin, see that plugin's documentation. For a list of default plugins and how to override them, see the configuration documentation. Developing Plugins Like MkDocs, plugins must be written in Python. It is generally expected that each plugin would be distributed as a separate Python module, although it is possible to define multiple plugins in the same module. At a minimum, a MkDocs Plugin must consist of a BasePlugin subclass and an entry point which points to it. BasePlugin A subclass of mkdocs.plugins.BasePlugin should define the behavior of the plugin. The class generally consists of actions to perform on specific events in the build process as well as a configuration scheme for the plugin. All BasePlugin subclasses contain the following attributes: config_scheme A tuple of configuration validation instances. Each item must consist of a two item tuple in which the first item is the string name of the configuration option and the second item is an instance of mkdocs.config.config_options.BaseConfigOption or any of its subclasses. For example, the following config_scheme defines three configuration options: foo , which accepts a string; bar , which accepts an integer; and baz , which accepts a boolean value. class MyPlugin(mkdocs.plugins.BasePlugin): config_scheme = ( ('foo', mkdocs.config.config_options.Type(str, default='a default value')), ('bar', mkdocs.config.config_options.Type(int, default=0)), ('baz', mkdocs.config.config_options.Type(bool, default=True)) ) New in version 1.4 Subclassing Config to specify the config schema To get type safety benefits, if you're targeting only MkDocs 1.4+, define the config schema as a class instead: class MyPluginConfig(mkdocs.config.base.Config): foo = mkdocs.config.config_options.Type(str, default='a default value') bar = mkdocs.config.config_options.Type(int, default=0) baz = mkdocs.config.config_options.Type(bool, default=True) class MyPlugin(mkdocs.plugins.BasePlugin[MyPluginConfig]): ... Examples of config definitions Example from mkdocs.config import base, config_options as c class _ValidationOptions(base.Config): enable = c.Type(bool, default=True) verbose = c.Type(bool, default=False) skip_checks = c.ListOfItems(c.Choice(('foo', 'bar', 'baz')), default=[]) class MyPluginConfig(base.Config): definition_file = c.File(exists=True) # required checksum_file = c.Optional(c.File(exists=True)) # can be None but must exist if specified validation = c.SubConfig(_ValidationOptions) From the user's point of view SubConfig is similar to Type(dict) , it's just that it also retains full ability for validation: you define all valid keys and what each value should adhere to. And ListOfItems is similar to Type(list) , but again, we define the constraint that each value must adhere to. This accepts a config as follows: my_plugin: definition_file: configs/test.ini # relative to mkdocs.yml validation: enable: !ENV [CI, false] verbose: true skip_checks: - foo - baz Example import numbers from mkdocs.config import base, config_options as c class _Rectangle(base.Config): width = c.Type(numbers.Real) # required height = c.Type(numbers.Real) # required class MyPluginConfig(base.Config): add_rectangles = c.ListOfItems(c.SubConfig(_Rectangle)) # required In this example we define a list of complex items, and that's achieved by passing a concrete SubConfig to ListOfItems . This accepts a config as follows: my_plugin: add_rectangles: - width: 5 height: 7 - width: 12 height: 2 When the user's configuration is loaded, the above scheme will be used to validate the configuration and fill in any defaults for settings not provided by the user. The validation classes may be any of the classes provided in mkdocs.config.config_options or a third party subclass defined in the plugin. Any settings provided by the user which fail validation or are not defined in the config_scheme will raise a mkdocs.config.base.ValidationError . config A dictionary of configuration options for the plugin, which is populated by the load_config method after configuration validation has completed. Use this attribute to access options provided by the user. def on_pre_build(self, config, **kwargs): if self.config['baz']: # implement \"baz\" functionality here... New in version 1.4 Safe attribute-based access To get type safety benefits, if you're targeting only MkDocs 1.4+, access options as attributes instead: def on_pre_build(self, config, **kwargs): if self.config.baz: print(self.config.bar ** 2) # OK, `int ** 2` is valid. All BasePlugin subclasses contain the following method(s): load_config(options) Loads configuration from a dictionary of options. Returns a tuple of (errors, warnings) . This method is called by MkDocs during configuration validation and should not need to be called by the plugin. on_() Optional methods which define the behavior for specific events . The plugin should define its behavior within these methods. Replace with the actual name of the event. For example, the pre_build event would be defined in the on_pre_build method. Most events accept one positional argument and various keyword arguments. It is generally expected that the positional argument would be modified (or replaced) by the plugin and returned. If nothing is returned (the method returns None ), then the original, unmodified object is used. The keyword arguments are simply provided to give context and/or supply data which may be used to determine how the positional argument should be modified. It is good practice to accept keyword arguments as **kwargs . In the event that additional keywords are provided to an event in a future version of MkDocs, there will be no need to alter your plugin. For example, the following event would add an additional static_template to the theme config: class MyPlugin(BasePlugin): def on_config(self, config, **kwargs): config['theme'].static_templates.add('my_template.html') return config New in version 1.4 To get type safety benefits, if you're targeting only MkDocs 1.4+, access config options as attributes instead: def on_config(self, config: MkDocsConfig): config.theme.static_templates.add('my_template.html') return config Events There are three kinds of events: Global Events , Page Events and Template Events . See a diagram with relations between all the plugin events The events themselves are shown in yellow, with their parameters. Arrows show the flow of arguments and outputs of each event. Sometimes they're omitted. The events are chronologically ordered from top to bottom. Dotted lines appear at splits from global events to per-page events. Click the events' titles to jump to their description. MkDocs cluster_on_startup on_startup cluster_build build cluster_on_config on_config cluster_on_pre_build on_pre_build cluster_on_files on_files cluster_on_nav on_nav cluster_populate_page populate_page cluster_on_pre_page on_pre_page cluster_on_page_read_source on_page_read_source cluster_on_page_markdown on_page_markdown cluster_on_page_content on_page_content cluster_on_env on_env cluster_populate_page_2 populate_page cluster_populate_page_3 populate_page cluster_build_page build_page cluster_on_page_context on_page_context cluster_on_post_page on_post_page cluster_build_page_2 build_page cluster_build_page_3 build_page cluster_on_post_build on_post_build cluster_on_serve on_serve cluster_on_shutdown on_shutdown on_startup command dirty load_config load_config on_config config on_pre_build config on_config:s->on_pre_build:n get_files get_files on_config:s->get_files on_files files config on_nav nav config files on_files:s->on_nav:n get_nav get_nav on_files:s->get_nav render_p render pages_point_a on_nav:s->pages_point_a get_context get_context on_nav:s->get_context load_config->on_config:n get_files->on_files:n get_nav->on_nav:n on_pre_page page config files on_page_read_source page config on_pre_page:s->on_page_read_source:n on_page_markdown markdown page config files on_page_read_source:s->on_page_markdown:n on_page_markdown:s->render_p on_page_content html page config files pages_point_b on_page_content:s->pages_point_b on_env env config files render_p->on_page_content:n pages_point_a->on_pre_page:n pages_point_a->render_p placeholder_cluster_populate_page_2 ... pages_point_a->placeholder_cluster_populate_page_2:n placeholder_cluster_populate_page_3 ... pages_point_a->placeholder_cluster_populate_page_3:n placeholder_cluster_populate_page_2:s->pages_point_b pages_point_b->on_env:n pages_point_c pages_point_b->pages_point_c placeholder_cluster_populate_page_3:s->pages_point_b on_env:s->get_context on_page_context context page config nav pages_point_c->on_page_context:n placeholder_cluster_build_page_2 ... pages_point_c->placeholder_cluster_build_page_2:n placeholder_cluster_build_page_3 ... pages_point_c->placeholder_cluster_build_page_3:n render render on_page_context:s->render on_post_page output page config write_file write_file on_post_page:s->write_file get_context->on_page_context:n render->on_post_page:n get_template get_template get_template->render on_post_build config on_serve server config on_shutdown One-time Events One-time events run once per mkdocs invocation. The only case where these tangibly differ from global events is for mkdocs serve : global events, unlike these, will run multiple times -- once per build . on_startup ::: mkdocs.plugins.BasePlugin.on_startup options: show_root_heading: false show_root_toc_entry: false on_shutdown ::: mkdocs.plugins.BasePlugin.on_shutdown options: show_root_heading: false show_root_toc_entry: false on_serve ::: mkdocs.plugins.BasePlugin.on_serve options: show_root_heading: false show_root_toc_entry: false Global Events Global events are called once per build at either the beginning or end of the build process. Any changes made in these events will have a global effect on the entire site. on_config ::: mkdocs.plugins.BasePlugin.on_config options: show_root_heading: false show_root_toc_entry: false on_pre_build ::: mkdocs.plugins.BasePlugin.on_pre_build options: show_root_heading: false show_root_toc_entry: false on_files ::: mkdocs.plugins.BasePlugin.on_files options: show_root_heading: false show_root_toc_entry: false on_nav ::: mkdocs.plugins.BasePlugin.on_nav options: show_root_heading: false show_root_toc_entry: false on_env ::: mkdocs.plugins.BasePlugin.on_env options: show_root_heading: false show_root_toc_entry: false on_post_build ::: mkdocs.plugins.BasePlugin.on_post_build options: show_root_heading: false show_root_toc_entry: false on_build_error ::: mkdocs.plugins.BasePlugin.on_build_error options: show_root_heading: false show_root_toc_entry: false Template Events Template events are called once for each non-page template. Each template event will be called for each template defined in the extra_templates config setting as well as any static_templates defined in the theme. All template events are called after the env event and before any page events . on_pre_template ::: mkdocs.plugins.BasePlugin.on_pre_template options: show_root_heading: false show_root_toc_entry: false on_template_context ::: mkdocs.plugins.BasePlugin.on_template_context options: show_root_heading: false show_root_toc_entry: false on_post_template ::: mkdocs.plugins.BasePlugin.on_post_template options: show_root_heading: false show_root_toc_entry: false Page Events Page events are called once for each Markdown page included in the site. All page events are called after the post_template event and before the post_build event. on_pre_page ::: mkdocs.plugins.BasePlugin.on_pre_page options: show_root_heading: false show_root_toc_entry: false on_page_read_source ::: mkdocs.plugins.BasePlugin.on_page_read_source options: show_root_heading: false show_root_toc_entry: false on_page_markdown ::: mkdocs.plugins.BasePlugin.on_page_markdown options: show_root_heading: false show_root_toc_entry: false on_page_content ::: mkdocs.plugins.BasePlugin.on_page_content options: show_root_heading: false show_root_toc_entry: false on_page_context ::: mkdocs.plugins.BasePlugin.on_page_context options: show_root_heading: false show_root_toc_entry: false on_post_page ::: mkdocs.plugins.BasePlugin.on_post_page options: show_root_heading: false show_root_toc_entry: false Event Priorities For each event type, corresponding methods of plugins are called in the order that the plugins appear in the plugins config . Since MkDocs 1.4, plugins can choose to set a priority value for their events. Events with higher priority are called first. Events without a chosen priority get a default of 0. Events that have the same priority are ordered as they appear in the config. ::: mkdocs.plugins.event_priority Handling Errors MkDocs defines four error types: ::: mkdocs.exceptions.MkDocsException ::: mkdocs.exceptions.ConfigurationError ::: mkdocs.exceptions.BuildError ::: mkdocs.exceptions.PluginError Unexpected and uncaught exceptions will interrupt the build process and produce typical Python tracebacks, which are useful for debugging your code. However, users generally find tracebacks overwhelming and often miss the helpful error message. Therefore, MkDocs will catch any of the errors listed above, retrieve the error message, and exit immediately with only the helpful message displayed to the user. Therefore, you might want to catch any exceptions within your plugin and raise a PluginError , passing in your own custom-crafted message, so that the build process is aborted with a helpful message. The on_build_error event will be triggered for any exception. For example: from mkdocs.exceptions import PluginError from mkdocs.plugins import BasePlugin class MyPlugin(BasePlugin): def on_post_page(self, output, page, config, **kwargs): try: # some code that could throw a KeyError ... except KeyError as error: raise PluginError(str(error)) def on_build_error(self, error, **kwargs): # some code to clean things up ... Entry Point Plugins need to be packaged as Python libraries (distributed on PyPI separate from MkDocs) and each must register as a Plugin via a setuptools entry_points . Add the following to your setup.py script: entry_points={ 'mkdocs.plugins': [ 'pluginname = path.to.some_plugin:SomePluginClass', ] } The pluginname would be the name used by users (in the config file) and path.to.some_plugin:SomePluginClass would be the importable plugin itself ( from path.to.some_plugin import SomePluginClass ) where SomePluginClass is a subclass of BasePlugin which defines the plugin behavior. Naturally, multiple Plugin classes could exist in the same module. Simply define each as a separate entry point. entry_points={ 'mkdocs.plugins': [ 'featureA = path.to.my_plugins:PluginA', 'featureB = path.to.my_plugins:PluginB' ] } Note that registering a plugin does not activate it. The user still needs to tell MkDocs to use it via the config.","title":"Plugins"},{"location":"dev-guide/plugins/#mkdocs-plugins","text":"A Guide to installing, using and creating MkDocs Plugins","title":"MkDocs Plugins"},{"location":"dev-guide/plugins/#installing-plugins","text":"Before a plugin can be used, it must be installed on the system. If you are using a plugin which comes with MkDocs, then it was installed when you installed MkDocs. However, to install third party plugins, you need to determine the appropriate package name and install it using pip : pip install mkdocs-foo-plugin Once a plugin has been successfully installed, it is ready to use. It just needs to be enabled in the configuration file. The Best-of-MkDocs page has a large list of plugins that you can install and use.","title":"Installing Plugins"},{"location":"dev-guide/plugins/#using-plugins","text":"The plugins configuration option should contain a list of plugins to use when building the site. Each \"plugin\" must be a string name assigned to the plugin (see the documentation for a given plugin to determine its \"name\"). A plugin listed here must already be installed . plugins: - search Some plugins may provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given plugin supports. Note that a colon ( : ) must follow the plugin name and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single plugin, each option must be defined on a separate line. plugins: - search: lang: en foo: bar For information regarding the configuration options available for a given plugin, see that plugin's documentation. For a list of default plugins and how to override them, see the configuration documentation.","title":"Using Plugins"},{"location":"dev-guide/plugins/#developing-plugins","text":"Like MkDocs, plugins must be written in Python. It is generally expected that each plugin would be distributed as a separate Python module, although it is possible to define multiple plugins in the same module. At a minimum, a MkDocs Plugin must consist of a BasePlugin subclass and an entry point which points to it.","title":"Developing Plugins"},{"location":"dev-guide/plugins/#baseplugin","text":"A subclass of mkdocs.plugins.BasePlugin should define the behavior of the plugin. The class generally consists of actions to perform on specific events in the build process as well as a configuration scheme for the plugin. All BasePlugin subclasses contain the following attributes:","title":"BasePlugin"},{"location":"dev-guide/plugins/#config_scheme","text":"A tuple of configuration validation instances. Each item must consist of a two item tuple in which the first item is the string name of the configuration option and the second item is an instance of mkdocs.config.config_options.BaseConfigOption or any of its subclasses. For example, the following config_scheme defines three configuration options: foo , which accepts a string; bar , which accepts an integer; and baz , which accepts a boolean value. class MyPlugin(mkdocs.plugins.BasePlugin): config_scheme = ( ('foo', mkdocs.config.config_options.Type(str, default='a default value')), ('bar', mkdocs.config.config_options.Type(int, default=0)), ('baz', mkdocs.config.config_options.Type(bool, default=True)) ) New in version 1.4","title":"config_scheme"},{"location":"dev-guide/plugins/#subclassing-config-to-specify-the-config-schema","text":"To get type safety benefits, if you're targeting only MkDocs 1.4+, define the config schema as a class instead: class MyPluginConfig(mkdocs.config.base.Config): foo = mkdocs.config.config_options.Type(str, default='a default value') bar = mkdocs.config.config_options.Type(int, default=0) baz = mkdocs.config.config_options.Type(bool, default=True) class MyPlugin(mkdocs.plugins.BasePlugin[MyPluginConfig]): ...","title":"Subclassing Config to specify the config schema"},{"location":"dev-guide/plugins/#examples-of-config-definitions","text":"Example from mkdocs.config import base, config_options as c class _ValidationOptions(base.Config): enable = c.Type(bool, default=True) verbose = c.Type(bool, default=False) skip_checks = c.ListOfItems(c.Choice(('foo', 'bar', 'baz')), default=[]) class MyPluginConfig(base.Config): definition_file = c.File(exists=True) # required checksum_file = c.Optional(c.File(exists=True)) # can be None but must exist if specified validation = c.SubConfig(_ValidationOptions) From the user's point of view SubConfig is similar to Type(dict) , it's just that it also retains full ability for validation: you define all valid keys and what each value should adhere to. And ListOfItems is similar to Type(list) , but again, we define the constraint that each value must adhere to. This accepts a config as follows: my_plugin: definition_file: configs/test.ini # relative to mkdocs.yml validation: enable: !ENV [CI, false] verbose: true skip_checks: - foo - baz Example import numbers from mkdocs.config import base, config_options as c class _Rectangle(base.Config): width = c.Type(numbers.Real) # required height = c.Type(numbers.Real) # required class MyPluginConfig(base.Config): add_rectangles = c.ListOfItems(c.SubConfig(_Rectangle)) # required In this example we define a list of complex items, and that's achieved by passing a concrete SubConfig to ListOfItems . This accepts a config as follows: my_plugin: add_rectangles: - width: 5 height: 7 - width: 12 height: 2 When the user's configuration is loaded, the above scheme will be used to validate the configuration and fill in any defaults for settings not provided by the user. The validation classes may be any of the classes provided in mkdocs.config.config_options or a third party subclass defined in the plugin. Any settings provided by the user which fail validation or are not defined in the config_scheme will raise a mkdocs.config.base.ValidationError .","title":"Examples of config definitions"},{"location":"dev-guide/plugins/#config","text":"A dictionary of configuration options for the plugin, which is populated by the load_config method after configuration validation has completed. Use this attribute to access options provided by the user. def on_pre_build(self, config, **kwargs): if self.config['baz']: # implement \"baz\" functionality here... New in version 1.4","title":"config"},{"location":"dev-guide/plugins/#safe-attribute-based-access","text":"To get type safety benefits, if you're targeting only MkDocs 1.4+, access options as attributes instead: def on_pre_build(self, config, **kwargs): if self.config.baz: print(self.config.bar ** 2) # OK, `int ** 2` is valid. All BasePlugin subclasses contain the following method(s):","title":"Safe attribute-based access"},{"location":"dev-guide/plugins/#load_configoptions","text":"Loads configuration from a dictionary of options. Returns a tuple of (errors, warnings) . This method is called by MkDocs during configuration validation and should not need to be called by the plugin.","title":"load_config(options)"},{"location":"dev-guide/plugins/#on_event_name","text":"Optional methods which define the behavior for specific events . The plugin should define its behavior within these methods. Replace with the actual name of the event. For example, the pre_build event would be defined in the on_pre_build method. Most events accept one positional argument and various keyword arguments. It is generally expected that the positional argument would be modified (or replaced) by the plugin and returned. If nothing is returned (the method returns None ), then the original, unmodified object is used. The keyword arguments are simply provided to give context and/or supply data which may be used to determine how the positional argument should be modified. It is good practice to accept keyword arguments as **kwargs . In the event that additional keywords are provided to an event in a future version of MkDocs, there will be no need to alter your plugin. For example, the following event would add an additional static_template to the theme config: class MyPlugin(BasePlugin): def on_config(self, config, **kwargs): config['theme'].static_templates.add('my_template.html') return config New in version 1.4 To get type safety benefits, if you're targeting only MkDocs 1.4+, access config options as attributes instead: def on_config(self, config: MkDocsConfig): config.theme.static_templates.add('my_template.html') return config","title":"on_<event_name>()"},{"location":"dev-guide/plugins/#events","text":"There are three kinds of events: Global Events , Page Events and Template Events . See a diagram with relations between all the plugin events The events themselves are shown in yellow, with their parameters. Arrows show the flow of arguments and outputs of each event. Sometimes they're omitted. The events are chronologically ordered from top to bottom. Dotted lines appear at splits from global events to per-page events. Click the events' titles to jump to their description. MkDocs cluster_on_startup on_startup cluster_build build cluster_on_config on_config cluster_on_pre_build on_pre_build cluster_on_files on_files cluster_on_nav on_nav cluster_populate_page populate_page cluster_on_pre_page on_pre_page cluster_on_page_read_source on_page_read_source cluster_on_page_markdown on_page_markdown cluster_on_page_content on_page_content cluster_on_env on_env cluster_populate_page_2 populate_page cluster_populate_page_3 populate_page cluster_build_page build_page cluster_on_page_context on_page_context cluster_on_post_page on_post_page cluster_build_page_2 build_page cluster_build_page_3 build_page cluster_on_post_build on_post_build cluster_on_serve on_serve cluster_on_shutdown on_shutdown on_startup command dirty load_config load_config on_config config on_pre_build config on_config:s->on_pre_build:n get_files get_files on_config:s->get_files on_files files config on_nav nav config files on_files:s->on_nav:n get_nav get_nav on_files:s->get_nav render_p render pages_point_a on_nav:s->pages_point_a get_context get_context on_nav:s->get_context load_config->on_config:n get_files->on_files:n get_nav->on_nav:n on_pre_page page config files on_page_read_source page config on_pre_page:s->on_page_read_source:n on_page_markdown markdown page config files on_page_read_source:s->on_page_markdown:n on_page_markdown:s->render_p on_page_content html page config files pages_point_b on_page_content:s->pages_point_b on_env env config files render_p->on_page_content:n pages_point_a->on_pre_page:n pages_point_a->render_p placeholder_cluster_populate_page_2 ... pages_point_a->placeholder_cluster_populate_page_2:n placeholder_cluster_populate_page_3 ... pages_point_a->placeholder_cluster_populate_page_3:n placeholder_cluster_populate_page_2:s->pages_point_b pages_point_b->on_env:n pages_point_c pages_point_b->pages_point_c placeholder_cluster_populate_page_3:s->pages_point_b on_env:s->get_context on_page_context context page config nav pages_point_c->on_page_context:n placeholder_cluster_build_page_2 ... pages_point_c->placeholder_cluster_build_page_2:n placeholder_cluster_build_page_3 ... pages_point_c->placeholder_cluster_build_page_3:n render render on_page_context:s->render on_post_page output page config write_file write_file on_post_page:s->write_file get_context->on_page_context:n render->on_post_page:n get_template get_template get_template->render on_post_build config on_serve server config on_shutdown","title":"Events"},{"location":"dev-guide/plugins/#one-time-events","text":"One-time events run once per mkdocs invocation. The only case where these tangibly differ from global events is for mkdocs serve : global events, unlike these, will run multiple times -- once per build .","title":"One-time Events"},{"location":"dev-guide/plugins/#on_startup","text":"::: mkdocs.plugins.BasePlugin.on_startup options: show_root_heading: false show_root_toc_entry: false","title":"on_startup"},{"location":"dev-guide/plugins/#on_shutdown","text":"::: mkdocs.plugins.BasePlugin.on_shutdown options: show_root_heading: false show_root_toc_entry: false","title":"on_shutdown"},{"location":"dev-guide/plugins/#on_serve","text":"::: mkdocs.plugins.BasePlugin.on_serve options: show_root_heading: false show_root_toc_entry: false","title":"on_serve"},{"location":"dev-guide/plugins/#global-events","text":"Global events are called once per build at either the beginning or end of the build process. Any changes made in these events will have a global effect on the entire site.","title":"Global Events"},{"location":"dev-guide/plugins/#on_config","text":"::: mkdocs.plugins.BasePlugin.on_config options: show_root_heading: false show_root_toc_entry: false","title":"on_config"},{"location":"dev-guide/plugins/#on_pre_build","text":"::: mkdocs.plugins.BasePlugin.on_pre_build options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_build"},{"location":"dev-guide/plugins/#on_files","text":"::: mkdocs.plugins.BasePlugin.on_files options: show_root_heading: false show_root_toc_entry: false","title":"on_files"},{"location":"dev-guide/plugins/#on_nav","text":"::: mkdocs.plugins.BasePlugin.on_nav options: show_root_heading: false show_root_toc_entry: false","title":"on_nav"},{"location":"dev-guide/plugins/#on_env","text":"::: mkdocs.plugins.BasePlugin.on_env options: show_root_heading: false show_root_toc_entry: false","title":"on_env"},{"location":"dev-guide/plugins/#on_post_build","text":"::: mkdocs.plugins.BasePlugin.on_post_build options: show_root_heading: false show_root_toc_entry: false","title":"on_post_build"},{"location":"dev-guide/plugins/#on_build_error","text":"::: mkdocs.plugins.BasePlugin.on_build_error options: show_root_heading: false show_root_toc_entry: false","title":"on_build_error"},{"location":"dev-guide/plugins/#template-events","text":"Template events are called once for each non-page template. Each template event will be called for each template defined in the extra_templates config setting as well as any static_templates defined in the theme. All template events are called after the env event and before any page events .","title":"Template Events"},{"location":"dev-guide/plugins/#on_pre_template","text":"::: mkdocs.plugins.BasePlugin.on_pre_template options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_template"},{"location":"dev-guide/plugins/#on_template_context","text":"::: mkdocs.plugins.BasePlugin.on_template_context options: show_root_heading: false show_root_toc_entry: false","title":"on_template_context"},{"location":"dev-guide/plugins/#on_post_template","text":"::: mkdocs.plugins.BasePlugin.on_post_template options: show_root_heading: false show_root_toc_entry: false","title":"on_post_template"},{"location":"dev-guide/plugins/#page-events","text":"Page events are called once for each Markdown page included in the site. All page events are called after the post_template event and before the post_build event.","title":"Page Events"},{"location":"dev-guide/plugins/#on_pre_page","text":"::: mkdocs.plugins.BasePlugin.on_pre_page options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_page"},{"location":"dev-guide/plugins/#on_page_read_source","text":"::: mkdocs.plugins.BasePlugin.on_page_read_source options: show_root_heading: false show_root_toc_entry: false","title":"on_page_read_source"},{"location":"dev-guide/plugins/#on_page_markdown","text":"::: mkdocs.plugins.BasePlugin.on_page_markdown options: show_root_heading: false show_root_toc_entry: false","title":"on_page_markdown"},{"location":"dev-guide/plugins/#on_page_content","text":"::: mkdocs.plugins.BasePlugin.on_page_content options: show_root_heading: false show_root_toc_entry: false","title":"on_page_content"},{"location":"dev-guide/plugins/#on_page_context","text":"::: mkdocs.plugins.BasePlugin.on_page_context options: show_root_heading: false show_root_toc_entry: false","title":"on_page_context"},{"location":"dev-guide/plugins/#on_post_page","text":"::: mkdocs.plugins.BasePlugin.on_post_page options: show_root_heading: false show_root_toc_entry: false","title":"on_post_page"},{"location":"dev-guide/plugins/#event-priorities","text":"For each event type, corresponding methods of plugins are called in the order that the plugins appear in the plugins config . Since MkDocs 1.4, plugins can choose to set a priority value for their events. Events with higher priority are called first. Events without a chosen priority get a default of 0. Events that have the same priority are ordered as they appear in the config.","title":"Event Priorities"},{"location":"dev-guide/plugins/#mkdocspluginsevent_priority","text":"","title":"::: mkdocs.plugins.event_priority"},{"location":"dev-guide/plugins/#handling-errors","text":"MkDocs defines four error types:","title":"Handling Errors"},{"location":"dev-guide/plugins/#mkdocsexceptionsmkdocsexception","text":"","title":"::: mkdocs.exceptions.MkDocsException"},{"location":"dev-guide/plugins/#mkdocsexceptionsconfigurationerror","text":"","title":"::: mkdocs.exceptions.ConfigurationError"},{"location":"dev-guide/plugins/#mkdocsexceptionsbuilderror","text":"","title":"::: mkdocs.exceptions.BuildError"},{"location":"dev-guide/plugins/#mkdocsexceptionspluginerror","text":"Unexpected and uncaught exceptions will interrupt the build process and produce typical Python tracebacks, which are useful for debugging your code. However, users generally find tracebacks overwhelming and often miss the helpful error message. Therefore, MkDocs will catch any of the errors listed above, retrieve the error message, and exit immediately with only the helpful message displayed to the user. Therefore, you might want to catch any exceptions within your plugin and raise a PluginError , passing in your own custom-crafted message, so that the build process is aborted with a helpful message. The on_build_error event will be triggered for any exception. For example: from mkdocs.exceptions import PluginError from mkdocs.plugins import BasePlugin class MyPlugin(BasePlugin): def on_post_page(self, output, page, config, **kwargs): try: # some code that could throw a KeyError ... except KeyError as error: raise PluginError(str(error)) def on_build_error(self, error, **kwargs): # some code to clean things up ...","title":"::: mkdocs.exceptions.PluginError"},{"location":"dev-guide/plugins/#entry-point","text":"Plugins need to be packaged as Python libraries (distributed on PyPI separate from MkDocs) and each must register as a Plugin via a setuptools entry_points . Add the following to your setup.py script: entry_points={ 'mkdocs.plugins': [ 'pluginname = path.to.some_plugin:SomePluginClass', ] } The pluginname would be the name used by users (in the config file) and path.to.some_plugin:SomePluginClass would be the importable plugin itself ( from path.to.some_plugin import SomePluginClass ) where SomePluginClass is a subclass of BasePlugin which defines the plugin behavior. Naturally, multiple Plugin classes could exist in the same module. Simply define each as a separate entry point. entry_points={ 'mkdocs.plugins': [ 'featureA = path.to.my_plugins:PluginA', 'featureB = path.to.my_plugins:PluginB' ] } Note that registering a plugin does not activate it. The user still needs to tell MkDocs to use it via the config.","title":"Entry Point"},{"location":"dev-guide/themes/","text":"Developing Themes A guide to creating and distributing custom themes. Note If you are looking for existing third party themes, they are listed in the community wiki page and Best-of-MkDocs . If you want to share a theme you create, you should list it there. When creating a new theme, you can either follow the steps in this guide to create one from scratch or you can download the mkdocs-basic-theme as a basic, yet complete, theme with all the boilerplate required. You can find this base theme on GitHub . It contains detailed comments in the code to describe the different features and their usage. Creating a custom theme The bare minimum required for a custom theme is a main.html Jinja2 template file which is placed in a directory that is not a child of the docs_dir . Within mkdocs.yml , set the theme.custom_dir option to the path of the directory containing main.html . The path should be relative to the configuration file. For example, given this example project layout: mkdocs.yml docs/ index.md about.md custom_theme/ main.html ... ... you would include the following settings in mkdocs.yml to use the custom theme directory: theme: name: null custom_dir: 'custom_theme/' Note Generally, when building your own custom theme, the theme. name configuration setting would be set to null . However, if the theme. custom_dir configuration value is used in combination with an existing theme, the theme. custom_dir can be used to replace only specific parts of a built-in theme. For example, with the above layout and if you set name: \"mkdocs\" then the main.html file in the theme. custom_dir would replace the file of the same name in the mkdocs theme but otherwise the mkdocs theme would remain unchanged. This is useful if you want to make small adjustments to an existing theme. For more specific information, see Customizing Your Theme . Warning A theme's configuration defined in a mkdocs_theme.yml file is not loaded from theme.custom_dir . When an entire theme exists in theme.custom_dir and theme.name is set to null , then the entire theme configuration must be defined in the theme configuration option in the mkdocs.yml file. However, when a theme is packaged up for distribution, and loaded using the theme.name configuration option, then a mkdocs_theme.yml file is required for the theme. Basic theme The simplest main.html file is the following: {% if page.title %}{{ page.title }} - {% endif %}{{ config.site_name }} {{ page.content }} The body content from each page specified in mkdocs.yml is inserted using the {{ page.content }} tag. Style-sheets and scripts can be brought into this theme as with a normal HTML file. Navbars and tables of contents can also be generated and included automatically, through the nav and toc objects, respectively. If you wish to write your own theme, it is recommended to start with one of the built-in themes and modify it accordingly. Note As MkDocs uses Jinja as its template engine, you have access to all the power of Jinja, including template inheritance . You may notice that the themes included with MkDocs make extensive use of template inheritance and blocks, allowing users to easily override small bits and pieces of the templates from the theme custom_dir . Therefore, the built-in themes are implemented in a base.html file, which main.html extends. Although not required, third party template authors are encouraged to follow a similar pattern and may want to define the same blocks as are used in the built-in themes for consistency. Theme Files There are various files which a theme treats special in some way. Any other files are simply copied from the theme directory to the same path in the site_dir when the site it built. For example image and CSS files have no special significance and are copied as-is. Note, however, that if the user provides a file with the same path in their docs_dir , then the user's file will replace the theme file. Template Files Any files with the .html extension are considered to be template files and are not copied from the theme directory or any subdirectories. Also, any files listed in static_templates are treated as templates regardless of their file extension. Theme Meta Files The various files required for packaging a theme are also ignored. Specifically, the mkdocs_theme.yml configuration file and any Python files. Dot Files Theme authors can explicitly force MkDocs to ignore files by starting a file or directory name with a dot. Any of the following files would be ignored: .ignored.txt .ignored/file.txt foo/.ignored.txt foo/.ignored/file.txt Documentation Files All documentation files are ignored. Specifically, any Markdown files (using any of the file extensions supported by MKDocs). Additionally, any README files which may exist in the theme directories are ignored. Template Variables Each template in a theme is built with a template context. These are the variables that are available to themes. The context varies depending on the template that is being built. At the moment templates are either built with the global context or with a page specific context. The global context is used for HTML pages that don't represent an individual Markdown document, for example a 404.html page or search.html. Global Context The following variables are available globally on any template. config The config variable is an instance of MkDocs' config object generated from the mkdocs.yml config file. While you can use any config option, some commonly used options include: config.site_name config.site_url config.site_author config.site_description config.theme.locale (See also Theme Configuration below) config.extra_javascript config.extra_css config.repo_url config.repo_name config.copyright config.google_analytics nav The nav variable is used to create the navigation for the documentation. The nav object is an iterable of navigation objects as defined by the nav configuration setting. ::: mkdocs.structure.nav.Navigation options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 In addition to the iterable of navigation objects , the nav object contains the following attributes: ::: mkdocs.structure.nav.Navigation.homepage options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Navigation.pages options: show_root_full_path: false heading_level: 5 This list is not necessarily a complete list of all site pages as it does not contain pages which are not included in the navigation. This list does match the list and order of pages used for all \"next page\" and \"previous page\" links. For a list of all pages, use the pages template variable. Nav Example Following is a basic usage example which outputs the first and second level navigation as a nested list. {% if nav|length>1 %}{% for nav_item in nav %} {% if nav_item.children %}
{% endif %} base_url The base_url provides a relative path to the root of the MkDocs project. While this can be used directly by prepending it to a local relative URL, it is best to use the url template filter, which is smarter about how it applies base_url . mkdocs_version Contains the current MkDocs version. build_date_utc A Python datetime object that represents the date and time the documentation was built in UTC. This is useful for showing how recently the documentation was updated. pages A flat list of File objects for all pages in the project. This list can contain pages not included in the global navigation and may not match the order of pages within that navigation. The page object for each File can be accessed from file.page . page In templates which are not rendered from a Markdown source file, the page variable is None . In templates which are rendered from a Markdown source file, the page variable contains a page object. The same page objects are used as page navigation objects in the global navigation and in the pages template variable. ::: mkdocs.structure.pages.Page options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 All page objects contain the following attributes: ::: mkdocs.structure.pages.Page.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.content options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.toc options: show_root_full_path: false heading_level: 5 The following example would display the top two levels of the Table of Contents for a page.- {{ nav_item.title }}
{% else %}{% for nav_item in nav_item.children %}
- {{ nav_item.title }}
{% endfor %}- {{ nav_item.title }}
{% endif %} {% endfor %}{% for toc_item in page.toc %}
::: mkdocs.structure.pages.Page.meta options: show_root_full_path: false heading_level: 5 In this example we define a source property above the page title: source: generics.py mixins.py # Page title Content... A template can access this metadata for the page with the meta.source variable. This could then be used to link to source files related to the documentation page. {% for filename in page.meta.source %} {{ filename }} {% endfor %} ::: mkdocs.structure.pages.Page.url options: show_root_full_path: false heading_level: 5 It is expected that this be used with the url filter to ensure the URL is relative to the current page. {{ page.title }} ::: mkdocs.structure.pages.Page.file options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.abs_url options: show_root_full_path: false heading_level: 5 For example, if site_url: https://example.com/ , then the value of page.abs_url for the page foo.md would be /foo/ . However, if site_url: https://example.com/bar/ , then the value of page.abs_url for the page foo.md would be /bar/foo/ . ::: mkdocs.structure.pages.Page.canonical_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.edit_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_homepage options: show_root_full_path: false heading_level: 5 This can be used in conjunction with other attributes of the page object to alter the behavior. For example, to display a different title on the homepage: {% if not page.is_homepage %}{{ page.title }} - {% endif %}{{ site_name }} ::: mkdocs.structure.pages.Page.previous_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.next_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_link options: show_root_full_path: false heading_level: 5 AnchorLink ::: mkdocs.structure.toc.AnchorLink options: show_root_heading: false show_root_toc_entry: true heading_level: 5 Navigation Objects Navigation objects contained in the nav template variable may be one of section objects, page objects, and link objects. While section objects may contain nested navigation objects, pages and links do not. Page objects are the full page object as used for the current page with all of the same attributes available. Section and Link objects contain a subset of those attributes as defined below: Section A section navigation object defines a named section in the navigation and contains a list of child navigation objects. Note that sections do not contain URLs and are not links of any kind. However, by default, MkDocs sorts index pages to the top and the first child might be used as the URL for a section if a theme chooses to do so. ::: mkdocs.structure.nav.Section options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on section objects: ::: mkdocs.structure.nav.Section.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_link options: show_root_full_path: false heading_level: 5 Link A link navigation object contains a link which does not point to an internal MkDocs page. ::: mkdocs.structure.nav.Link options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on link objects: ::: mkdocs.structure.nav.Link.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_link options: show_root_full_path: false heading_level: 5 Extra Context Additional variables can be passed to the template with the extra configuration option. This is a set of key value pairs that can make custom templates far more flexible. For example, this could be used to include the project version of all pages and a list of links related to the project. This can be achieved with the following extra configuration: extra: version: 0.13.0 links: - https://github.com/mkdocs - https://docs.readthedocs.org/en/latest/builds.html#mkdocs - https://www.mkdocs.org/ And then displayed with this HTML in the custom theme. {{ config.extra.version }} {% if config.extra.links %}- {{ toc_item.title }}
{% for toc_item in toc_item.children %}- {{ toc_item.title }}
{% endfor %} {% endfor %}{% for link in config.extra.links %}
{% endif %} Template Filters In addition to Jinja's default filters , the following custom filters are available to use in MkDocs templates: url Normalizes a URL. Absolute URLs are passed through unaltered. If the URL is relative and the template context includes a page object, then the URL is returned relative to the page object. Otherwise, the URL is returned with base_url prepended. {{ page.title }} tojson Safety convert a Python object to a value in a JavaScript script. Search and themes As of MkDocs version 0.17 client side search support has been added to MkDocs via the search plugin. A theme needs to provide a few things for the plugin to work with the theme. While the search plugin is activated by default, users can disable the plugin and themes should account for this. It is recommended that theme templates wrap search specific markup with a check for the plugin: {% if 'search' in config['plugins'] %} search stuff here... {% endif %} At its most basic functionality, the search plugin will simply provide an index file which is no more than a JSON file containing the content of all pages. The theme would need to implement its own search functionality client-side. However, with a few settings and the necessary templates, the plugin can provide a complete functioning client-side search tool based on lunr.js . The following HTML needs to be added to the theme so that the provided JavaScript is able to properly load the search scripts and make relative links to the search results from the current page. With properly configured settings, the following HTML in a template will add a full search implementation to your theme.- {{ link }}
{% endfor %}Search Results
Sorry, page not found.The JavaScript in the plugin works by looking for the specific ID's used in the above HTML. The form input for the user to type the search query must be identified with id=\"mkdocs-search-query\" and the div where the results will be placed must be identified with id=\"mkdocs-search-results\" . The plugin supports the following options being set in the theme's configuration file , mkdocs_theme.yml : include_search_page Determines whether the search plugin expects the theme to provide a dedicated search page via a template located at search/search.html . When include_search_page is set to true , the search template will be built and available at search/search.html . This method is used by the readthedocs theme. When include_search_page is set to false or not defined, it is expected that the theme provide some other mechanisms for displaying search results. For example, the mkdocs theme displays results on any page via a modal. search_index_only Determines whether the search plugin should only generate a search index or a complete search solution. When search_index_only is set to false , then the search plugin modifies the Jinja environment by adding its own templates directory (with a lower precedence than the theme) and adds its scripts to the extra_javascript config setting. When search_index_only is set to true or not defined, the search plugin makes no modifications to the Jinja environment. A complete solution using the provided index file is the responsibility of the theme. The search index is written to a JSON file at search/search_index.json in the site_dir . The JSON object contained within the file may contain up to three objects. { config: {...}, docs: [...], index: {...} } If present, the config object contains the key/value pairs of config options defined for the plugin in the user's mkdocs.yml config file under plugings.search . The config object was new in MkDocs version 1.0 . The docs object contains a list of document objects. Each document object is made up of a location (URL), a title , and text which can be used to create a search index and/or display search results. If present, the index object contains a pre-built index which offers performance improvements for larger sites. Note that the pre-built index is only created if the user explicitly enables the prebuild_index config option. Themes should expect the index to not be present, but can choose to use the index when it is available. The index object was new in MkDocs version 1.0 . Packaging Themes MkDocs makes use of Python packaging to distribute themes. This comes with a few requirements. To see an example of a package containing one theme, see the MkDocs Bootstrap theme and to see a package that contains many themes, see the MkDocs Bootswatch theme . Note It is not strictly necessary to package a theme, as the entire theme can be contained in the custom_dir . If you have created a \"one-off theme,\" that should be sufficient. However, if you intend to distribute your theme for others to use, packaging the theme has some advantages. By packaging your theme, your users can more easily install it, they can rely on a default configuration being defined, and they can then take advantage of the custom_dir to make tweaks to your theme to better suit their needs. Package Layout The following layout is recommended for themes. Two files at the top level directory called MANIFEST.in and setup.py beside the theme directory which contains an empty __init__.py file, a theme configuration file ( mkdocs_theme.yml ), and your template and media files. . |-- MANIFEST.in |-- theme_name | |-- __init__.py | |-- mkdocs_theme.yml | |-- main.html | |-- styles.css `-- setup.py The MANIFEST.in file should contain the following contents but with theme_name updated and any extra file extensions added to the include. recursive-include theme_name *.ico *.js *.css *.png *.html *.eot *.svg *.ttf *.woff recursive-exclude * __pycache__ recursive-exclude * *.py[co] The setup.py should include the following text with the modifications described below. from setuptools import setup, find_packages VERSION = '0.0.1' setup( name=\"mkdocs-themename\", version=VERSION, url='', license='', description='', author='', author_email='', packages=find_packages(), include_package_data=True, entry_points={ 'mkdocs.themes': [ 'themename = theme_name', ] }, zip_safe=False ) Fill in the URL, license, description, author and author email address. The name should follow the convention mkdocs-themename (like mkdocs-bootstrap and mkdocs-bootswatch ), starting with MkDocs, using hyphens to separate words and including the name of your theme. Most of the rest of the file can be left unedited. The last section we need to change is the entry_points. This is how MkDocs finds the theme(s) you are including in the package. The name on the left is the one that users will use in their mkdocs.yml and the one on the right is the directory containing your theme files. The directory you created at the start of this section with the main.html file should contain all of the other theme files. The minimum requirement is that it includes a main.html for the theme. It must also include a __init__.py file which should be empty, this file tells Python that the directory is a package. Theme Configuration A packaged theme is required to include a configuration file named mkdocs_theme.yml which is placed in the root of your template files. The file should contain default configuration options for the theme. However, if the theme offers no configuration options, the file is still required and can be left blank. A theme which is not packaged does not need a mkdocs_theme.yml file as that file is not loaded from theme.custom_dir . The theme author is free to define any arbitrary options deemed necessary and those options will be made available in the templates to control behavior. For example, a theme might want to make a sidebar optional and include the following in the mkdocs_theme.yml file: show_sidebar: true Then in a template, that config option could be referenced: {% if config.theme.show_sidebar %} {% endif %} And the user could override the default in their project's mkdocs.yml config file: theme: name: themename show_sidebar: false In addition to arbitrary options defined by the theme, MkDocs defines a few special options which alters its behavior: Block locale This option mirrors the theme config option of the same name. If this value is not defined in the mkdocs_theme.yml file and the user does not set it in mkdocs.yml then it will default to en (English). The value is expected to match the language used in the text provided by the theme (such a \"next\" and \"previous\" links) and should be used as the value of the tag's lang attribute. See Supporting theme localization/ translation for more information. Note that during configuration validation, the provided string is converted to a Locale object. The object contains Locale.language and Locale.territory attributes and will resolve as a string from within a template. Therefore, the following will work fine: If the locale was set to fr_CA (Canadian French), then the above template would render as: If you did not want the territory attribute to be included, then reference the language attribute directly: That would render as: static_templates This option mirrors the theme config option of the same name and allows some defaults to be set by the theme. Note that while the user can add templates to this list, the user cannot remove templates included in the theme's config. extends Defines a parent theme that this theme inherits from. The value should be the string name of the parent theme. Normal Jinja inheritance rules apply. Plugins may also define some options which allow the theme to inform a plugin about which set of plugin options it expects. See the documentation for any plugins you may wish to support in your theme. Distributing Themes With the above changes, your theme should now be ready to install. This can be done with pip, using pip install . if you are still in the same directory as the setup.py. Most Python packages, including MkDocs, are distributed on PyPI. To do this, you should run the following command. python setup.py register If you don't have an account setup, you should be prompted to create one. For a much more detailed guide, see the official Python packaging documentation for Packaging and Distributing Projects . Supporting theme Localization/Translation While the built-in themes provide support for localization/translation of templates, custom themes and third-party themes may choose not to. Regardless, the locale setting of the theme configuration option is always present and is relied upon by other parts of the system. Therefore, it is recommended that all third-party themes use the same setting for designating a language regardless of the system they use for translation. In that way, users will experience consistent behavior regardless of the theme they may choose. The method for managing translations is up to the developers of a theme. However, if a theme developer chooses to use the same mechanisms used by the built-in themes, the sections below outline how to enable and make use of the same commands utilized by MkDocs. Using the Localization/Translation commands Warning As pybabel is not installed by default and most users will not have pybabel installed, theme developers and/or translators should make sure to have installed the necessary dependencies (using pip install mkdocs[i18n] ) in order for the commands to be available for use. The translation commands should be called from the root of your theme's working tree. For an overview of the workflow used by MkDocs to translate the built-in themes, see the appropriate section of the Contributing Guide and the Translation Guide . Example custom theme Localization/Translation workflow Note If your theme inherits from an existing theme which already provides translation catalogs, your theme's translations will be merged with the parent theme's translations during a MkDocs build. This means that you only need to concentrate on the added translations. Yet, you will still benefit from the translations of the parent theme. At the same time, you may override any of parent theme's translations! Let's suppose that you're working on your own fork of the mkdocs-basic-theme and want to add translations to it. Edit the templates by wrapping text in your HTML sources with {% trans %} and {% endtrans %} as follows: --- a/basic_theme/base.html +++ b/basic_theme/base.html @@ -88,7 +88,7 @@ -This is an example theme for MkDocs.
+{% trans %}This is an example theme for MkDocs.{% endtrans %}
It is designed to be read by looking at the theme HTML which is heavily Then you would follow the Translation Guide as usual to get your translations running. Packaging Translations with your theme While the Portable Object Template ( pot ) file created by the extract_messages command and the Portable Object ( po ) files created by the init_catalog and update_catalog commands are useful for creating and editing translations, they are not used by MkDocs directly and do not need to be included in a packaged release of a theme. When MkDocs builds a site with translations, it only makes use of the binary mo files(s) for the specified locale. Therefore, when packaging a theme , make sure to include it in the \"wheels\", using a MANIFEST.in file or otherwise. Then, before building your Python package, you will want to ensure that the binary mo file for each locale is up-to-date by running the compile_catalog command for each locale. MkDocs expects the binary mo files to be located at locales/
/LC_MESSAGES/messages.mo , which the compile_catalog command automatically does for you. See Testing theme translations for details. Note As outlined in our Translation Guide , the MkDocs project has chosen to include the pot and po files in our code repository, but not the mo files. This requires us to always run compile_catalog before packaging a new release regardless of whether any changes were made to a translation or not. However, you may chose an alternate workflow for your theme. At a minimum, you need to ensure that up-to-date mo files are included at the correct location in each release. However, you may use a different process for generating those mo files if you chose to do so.","title":"Themes"},{"location":"dev-guide/themes/#developing-themes","text":"A guide to creating and distributing custom themes. Note If you are looking for existing third party themes, they are listed in the community wiki page and Best-of-MkDocs . If you want to share a theme you create, you should list it there. When creating a new theme, you can either follow the steps in this guide to create one from scratch or you can download the mkdocs-basic-theme as a basic, yet complete, theme with all the boilerplate required. You can find this base theme on GitHub . It contains detailed comments in the code to describe the different features and their usage.","title":"Developing Themes"},{"location":"dev-guide/themes/#creating-a-custom-theme","text":"The bare minimum required for a custom theme is a main.html Jinja2 template file which is placed in a directory that is not a child of the docs_dir . Within mkdocs.yml , set the theme.custom_dir option to the path of the directory containing main.html . The path should be relative to the configuration file. For example, given this example project layout: mkdocs.yml docs/ index.md about.md custom_theme/ main.html ... ... you would include the following settings in mkdocs.yml to use the custom theme directory: theme: name: null custom_dir: 'custom_theme/' Note Generally, when building your own custom theme, the theme. name configuration setting would be set to null . However, if the theme. custom_dir configuration value is used in combination with an existing theme, the theme. custom_dir can be used to replace only specific parts of a built-in theme. For example, with the above layout and if you set name: \"mkdocs\" then the main.html file in the theme. custom_dir would replace the file of the same name in the mkdocs theme but otherwise the mkdocs theme would remain unchanged. This is useful if you want to make small adjustments to an existing theme. For more specific information, see Customizing Your Theme . Warning A theme's configuration defined in a mkdocs_theme.yml file is not loaded from theme.custom_dir . When an entire theme exists in theme.custom_dir and theme.name is set to null , then the entire theme configuration must be defined in the theme configuration option in the mkdocs.yml file. However, when a theme is packaged up for distribution, and loaded using the theme.name configuration option, then a mkdocs_theme.yml file is required for the theme.","title":"Creating a custom theme"},{"location":"dev-guide/themes/#basic-theme","text":"The simplest main.html file is the following: {% if page.title %}{{ page.title }} - {% endif %}{{ config.site_name }} {{ page.content }} The body content from each page specified in mkdocs.yml is inserted using the {{ page.content }} tag. Style-sheets and scripts can be brought into this theme as with a normal HTML file. Navbars and tables of contents can also be generated and included automatically, through the nav and toc objects, respectively. If you wish to write your own theme, it is recommended to start with one of the built-in themes and modify it accordingly. Note As MkDocs uses Jinja as its template engine, you have access to all the power of Jinja, including template inheritance . You may notice that the themes included with MkDocs make extensive use of template inheritance and blocks, allowing users to easily override small bits and pieces of the templates from the theme custom_dir . Therefore, the built-in themes are implemented in a base.html file, which main.html extends. Although not required, third party template authors are encouraged to follow a similar pattern and may want to define the same blocks as are used in the built-in themes for consistency.","title":"Basic theme"},{"location":"dev-guide/themes/#theme-files","text":"There are various files which a theme treats special in some way. Any other files are simply copied from the theme directory to the same path in the site_dir when the site it built. For example image and CSS files have no special significance and are copied as-is. Note, however, that if the user provides a file with the same path in their docs_dir , then the user's file will replace the theme file.","title":"Theme Files"},{"location":"dev-guide/themes/#template-files","text":"Any files with the .html extension are considered to be template files and are not copied from the theme directory or any subdirectories. Also, any files listed in static_templates are treated as templates regardless of their file extension.","title":"Template Files"},{"location":"dev-guide/themes/#theme-meta-files","text":"The various files required for packaging a theme are also ignored. Specifically, the mkdocs_theme.yml configuration file and any Python files.","title":"Theme Meta Files"},{"location":"dev-guide/themes/#dot-files","text":"Theme authors can explicitly force MkDocs to ignore files by starting a file or directory name with a dot. Any of the following files would be ignored: .ignored.txt .ignored/file.txt foo/.ignored.txt foo/.ignored/file.txt","title":"Dot Files"},{"location":"dev-guide/themes/#documentation-files","text":"All documentation files are ignored. Specifically, any Markdown files (using any of the file extensions supported by MKDocs). Additionally, any README files which may exist in the theme directories are ignored.","title":"Documentation Files"},{"location":"dev-guide/themes/#template-variables","text":"Each template in a theme is built with a template context. These are the variables that are available to themes. The context varies depending on the template that is being built. At the moment templates are either built with the global context or with a page specific context. The global context is used for HTML pages that don't represent an individual Markdown document, for example a 404.html page or search.html.","title":"Template Variables"},{"location":"dev-guide/themes/#global-context","text":"The following variables are available globally on any template.","title":"Global Context"},{"location":"dev-guide/themes/#config","text":"The config variable is an instance of MkDocs' config object generated from the mkdocs.yml config file. While you can use any config option, some commonly used options include: config.site_name config.site_url config.site_author config.site_description config.theme.locale (See also Theme Configuration below) config.extra_javascript config.extra_css config.repo_url config.repo_name config.copyright config.google_analytics","title":"config"},{"location":"dev-guide/themes/#nav","text":"The nav variable is used to create the navigation for the documentation. The nav object is an iterable of navigation objects as defined by the nav configuration setting. ::: mkdocs.structure.nav.Navigation options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 In addition to the iterable of navigation objects , the nav object contains the following attributes: ::: mkdocs.structure.nav.Navigation.homepage options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Navigation.pages options: show_root_full_path: false heading_level: 5 This list is not necessarily a complete list of all site pages as it does not contain pages which are not included in the navigation. This list does match the list and order of pages used for all \"next page\" and \"previous page\" links. For a list of all pages, use the pages template variable.","title":"nav"},{"location":"dev-guide/themes/#nav-example","text":"Following is a basic usage example which outputs the first and second level navigation as a nested list. {% if nav|length>1 %}{% for nav_item in nav %} {% if nav_item.children %}
{% endif %}","title":"Nav Example"},{"location":"dev-guide/themes/#base_url","text":"The base_url provides a relative path to the root of the MkDocs project. While this can be used directly by prepending it to a local relative URL, it is best to use the url template filter, which is smarter about how it applies base_url .","title":"base_url"},{"location":"dev-guide/themes/#mkdocs_version","text":"Contains the current MkDocs version.","title":"mkdocs_version"},{"location":"dev-guide/themes/#build_date_utc","text":"A Python datetime object that represents the date and time the documentation was built in UTC. This is useful for showing how recently the documentation was updated.","title":"build_date_utc"},{"location":"dev-guide/themes/#pages","text":"A flat list of File objects for all pages in the project. This list can contain pages not included in the global navigation and may not match the order of pages within that navigation. The page object for each File can be accessed from file.page .","title":"pages"},{"location":"dev-guide/themes/#page","text":"In templates which are not rendered from a Markdown source file, the page variable is None . In templates which are rendered from a Markdown source file, the page variable contains a page object. The same page objects are used as page navigation objects in the global navigation and in the pages template variable. ::: mkdocs.structure.pages.Page options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 All page objects contain the following attributes: ::: mkdocs.structure.pages.Page.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.content options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.toc options: show_root_full_path: false heading_level: 5 The following example would display the top two levels of the Table of Contents for a page.- {{ nav_item.title }}
{% else %}{% for nav_item in nav_item.children %}
- {{ nav_item.title }}
{% endfor %}- {{ nav_item.title }}
{% endif %} {% endfor %}{% for toc_item in page.toc %}
::: mkdocs.structure.pages.Page.meta options: show_root_full_path: false heading_level: 5 In this example we define a source property above the page title: source: generics.py mixins.py # Page title Content... A template can access this metadata for the page with the meta.source variable. This could then be used to link to source files related to the documentation page. {% for filename in page.meta.source %} {{ filename }} {% endfor %} ::: mkdocs.structure.pages.Page.url options: show_root_full_path: false heading_level: 5 It is expected that this be used with the url filter to ensure the URL is relative to the current page. {{ page.title }} ::: mkdocs.structure.pages.Page.file options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.abs_url options: show_root_full_path: false heading_level: 5 For example, if site_url: https://example.com/ , then the value of page.abs_url for the page foo.md would be /foo/ . However, if site_url: https://example.com/bar/ , then the value of page.abs_url for the page foo.md would be /bar/foo/ . ::: mkdocs.structure.pages.Page.canonical_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.edit_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_homepage options: show_root_full_path: false heading_level: 5 This can be used in conjunction with other attributes of the page object to alter the behavior. For example, to display a different title on the homepage: {% if not page.is_homepage %}{{ page.title }} - {% endif %}{{ site_name }} ::: mkdocs.structure.pages.Page.previous_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.next_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_link options: show_root_full_path: false heading_level: 5","title":"page"},{"location":"dev-guide/themes/#anchorlink","text":"::: mkdocs.structure.toc.AnchorLink options: show_root_heading: false show_root_toc_entry: true heading_level: 5","title":"AnchorLink"},{"location":"dev-guide/themes/#navigation-objects","text":"Navigation objects contained in the nav template variable may be one of section objects, page objects, and link objects. While section objects may contain nested navigation objects, pages and links do not. Page objects are the full page object as used for the current page with all of the same attributes available. Section and Link objects contain a subset of those attributes as defined below:","title":"Navigation Objects"},{"location":"dev-guide/themes/#section","text":"A section navigation object defines a named section in the navigation and contains a list of child navigation objects. Note that sections do not contain URLs and are not links of any kind. However, by default, MkDocs sorts index pages to the top and the first child might be used as the URL for a section if a theme chooses to do so. ::: mkdocs.structure.nav.Section options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on section objects: ::: mkdocs.structure.nav.Section.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_link options: show_root_full_path: false heading_level: 5","title":"Section"},{"location":"dev-guide/themes/#link","text":"A link navigation object contains a link which does not point to an internal MkDocs page. ::: mkdocs.structure.nav.Link options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on link objects: ::: mkdocs.structure.nav.Link.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_link options: show_root_full_path: false heading_level: 5","title":"Link"},{"location":"dev-guide/themes/#extra-context","text":"Additional variables can be passed to the template with the extra configuration option. This is a set of key value pairs that can make custom templates far more flexible. For example, this could be used to include the project version of all pages and a list of links related to the project. This can be achieved with the following extra configuration: extra: version: 0.13.0 links: - https://github.com/mkdocs - https://docs.readthedocs.org/en/latest/builds.html#mkdocs - https://www.mkdocs.org/ And then displayed with this HTML in the custom theme. {{ config.extra.version }} {% if config.extra.links %}- {{ toc_item.title }}
{% for toc_item in toc_item.children %}- {{ toc_item.title }}
{% endfor %} {% endfor %}{% for link in config.extra.links %}
{% endif %}","title":"Extra Context"},{"location":"dev-guide/themes/#template-filters","text":"In addition to Jinja's default filters , the following custom filters are available to use in MkDocs templates:","title":"Template Filters"},{"location":"dev-guide/themes/#url","text":"Normalizes a URL. Absolute URLs are passed through unaltered. If the URL is relative and the template context includes a page object, then the URL is returned relative to the page object. Otherwise, the URL is returned with base_url prepended. {{ page.title }}","title":"url"},{"location":"dev-guide/themes/#tojson","text":"Safety convert a Python object to a value in a JavaScript script. ","title":"tojson"},{"location":"dev-guide/themes/#search-and-themes","text":"As of MkDocs version 0.17 client side search support has been added to MkDocs via the search plugin. A theme needs to provide a few things for the plugin to work with the theme. While the search plugin is activated by default, users can disable the plugin and themes should account for this. It is recommended that theme templates wrap search specific markup with a check for the plugin: {% if 'search' in config['plugins'] %} search stuff here... {% endif %} At its most basic functionality, the search plugin will simply provide an index file which is no more than a JSON file containing the content of all pages. The theme would need to implement its own search functionality client-side. However, with a few settings and the necessary templates, the plugin can provide a complete functioning client-side search tool based on lunr.js . The following HTML needs to be added to the theme so that the provided JavaScript is able to properly load the search scripts and make relative links to the search results from the current page. With properly configured settings, the following HTML in a template will add a full search implementation to your theme.- {{ link }}
{% endfor %}Search Results
Sorry, page not found.The JavaScript in the plugin works by looking for the specific ID's used in the above HTML. The form input for the user to type the search query must be identified with id=\"mkdocs-search-query\" and the div where the results will be placed must be identified with id=\"mkdocs-search-results\" . The plugin supports the following options being set in the theme's configuration file , mkdocs_theme.yml :","title":"Search and themes"},{"location":"dev-guide/themes/#include_search_page","text":"Determines whether the search plugin expects the theme to provide a dedicated search page via a template located at search/search.html . When include_search_page is set to true , the search template will be built and available at search/search.html . This method is used by the readthedocs theme. When include_search_page is set to false or not defined, it is expected that the theme provide some other mechanisms for displaying search results. For example, the mkdocs theme displays results on any page via a modal.","title":"include_search_page"},{"location":"dev-guide/themes/#search_index_only","text":"Determines whether the search plugin should only generate a search index or a complete search solution. When search_index_only is set to false , then the search plugin modifies the Jinja environment by adding its own templates directory (with a lower precedence than the theme) and adds its scripts to the extra_javascript config setting. When search_index_only is set to true or not defined, the search plugin makes no modifications to the Jinja environment. A complete solution using the provided index file is the responsibility of the theme. The search index is written to a JSON file at search/search_index.json in the site_dir . The JSON object contained within the file may contain up to three objects. { config: {...}, docs: [...], index: {...} } If present, the config object contains the key/value pairs of config options defined for the plugin in the user's mkdocs.yml config file under plugings.search . The config object was new in MkDocs version 1.0 . The docs object contains a list of document objects. Each document object is made up of a location (URL), a title , and text which can be used to create a search index and/or display search results. If present, the index object contains a pre-built index which offers performance improvements for larger sites. Note that the pre-built index is only created if the user explicitly enables the prebuild_index config option. Themes should expect the index to not be present, but can choose to use the index when it is available. The index object was new in MkDocs version 1.0 .","title":"search_index_only"},{"location":"dev-guide/themes/#packaging-themes","text":"MkDocs makes use of Python packaging to distribute themes. This comes with a few requirements. To see an example of a package containing one theme, see the MkDocs Bootstrap theme and to see a package that contains many themes, see the MkDocs Bootswatch theme . Note It is not strictly necessary to package a theme, as the entire theme can be contained in the custom_dir . If you have created a \"one-off theme,\" that should be sufficient. However, if you intend to distribute your theme for others to use, packaging the theme has some advantages. By packaging your theme, your users can more easily install it, they can rely on a default configuration being defined, and they can then take advantage of the custom_dir to make tweaks to your theme to better suit their needs.","title":"Packaging Themes"},{"location":"dev-guide/themes/#package-layout","text":"The following layout is recommended for themes. Two files at the top level directory called MANIFEST.in and setup.py beside the theme directory which contains an empty __init__.py file, a theme configuration file ( mkdocs_theme.yml ), and your template and media files. . |-- MANIFEST.in |-- theme_name | |-- __init__.py | |-- mkdocs_theme.yml | |-- main.html | |-- styles.css `-- setup.py The MANIFEST.in file should contain the following contents but with theme_name updated and any extra file extensions added to the include. recursive-include theme_name *.ico *.js *.css *.png *.html *.eot *.svg *.ttf *.woff recursive-exclude * __pycache__ recursive-exclude * *.py[co] The setup.py should include the following text with the modifications described below. from setuptools import setup, find_packages VERSION = '0.0.1' setup( name=\"mkdocs-themename\", version=VERSION, url='', license='', description='', author='', author_email='', packages=find_packages(), include_package_data=True, entry_points={ 'mkdocs.themes': [ 'themename = theme_name', ] }, zip_safe=False ) Fill in the URL, license, description, author and author email address. The name should follow the convention mkdocs-themename (like mkdocs-bootstrap and mkdocs-bootswatch ), starting with MkDocs, using hyphens to separate words and including the name of your theme. Most of the rest of the file can be left unedited. The last section we need to change is the entry_points. This is how MkDocs finds the theme(s) you are including in the package. The name on the left is the one that users will use in their mkdocs.yml and the one on the right is the directory containing your theme files. The directory you created at the start of this section with the main.html file should contain all of the other theme files. The minimum requirement is that it includes a main.html for the theme. It must also include a __init__.py file which should be empty, this file tells Python that the directory is a package.","title":"Package Layout"},{"location":"dev-guide/themes/#theme-configuration","text":"A packaged theme is required to include a configuration file named mkdocs_theme.yml which is placed in the root of your template files. The file should contain default configuration options for the theme. However, if the theme offers no configuration options, the file is still required and can be left blank. A theme which is not packaged does not need a mkdocs_theme.yml file as that file is not loaded from theme.custom_dir . The theme author is free to define any arbitrary options deemed necessary and those options will be made available in the templates to control behavior. For example, a theme might want to make a sidebar optional and include the following in the mkdocs_theme.yml file: show_sidebar: true Then in a template, that config option could be referenced: {% if config.theme.show_sidebar %} {% endif %} And the user could override the default in their project's mkdocs.yml config file: theme: name: themename show_sidebar: false In addition to arbitrary options defined by the theme, MkDocs defines a few special options which alters its behavior: Block","title":"Theme Configuration"},{"location":"dev-guide/themes/#locale","text":"This option mirrors the theme config option of the same name. If this value is not defined in the mkdocs_theme.yml file and the user does not set it in mkdocs.yml then it will default to en (English). The value is expected to match the language used in the text provided by the theme (such a \"next\" and \"previous\" links) and should be used as the value of the tag's lang attribute. See Supporting theme localization/ translation for more information. Note that during configuration validation, the provided string is converted to a Locale object. The object contains Locale.language and Locale.territory attributes and will resolve as a string from within a template. Therefore, the following will work fine: If the locale was set to fr_CA (Canadian French), then the above template would render as: If you did not want the territory attribute to be included, then reference the language attribute directly: That would render as: ","title":"locale"},{"location":"dev-guide/themes/#static_templates","text":"This option mirrors the theme config option of the same name and allows some defaults to be set by the theme. Note that while the user can add templates to this list, the user cannot remove templates included in the theme's config.","title":"static_templates"},{"location":"dev-guide/themes/#extends","text":"Defines a parent theme that this theme inherits from. The value should be the string name of the parent theme. Normal Jinja inheritance rules apply. Plugins may also define some options which allow the theme to inform a plugin about which set of plugin options it expects. See the documentation for any plugins you may wish to support in your theme.","title":"extends"},{"location":"dev-guide/themes/#distributing-themes","text":"With the above changes, your theme should now be ready to install. This can be done with pip, using pip install . if you are still in the same directory as the setup.py. Most Python packages, including MkDocs, are distributed on PyPI. To do this, you should run the following command. python setup.py register If you don't have an account setup, you should be prompted to create one. For a much more detailed guide, see the official Python packaging documentation for Packaging and Distributing Projects .","title":"Distributing Themes"},{"location":"dev-guide/themes/#supporting-theme-localizationtranslation","text":"While the built-in themes provide support for localization/translation of templates, custom themes and third-party themes may choose not to. Regardless, the locale setting of the theme configuration option is always present and is relied upon by other parts of the system. Therefore, it is recommended that all third-party themes use the same setting for designating a language regardless of the system they use for translation. In that way, users will experience consistent behavior regardless of the theme they may choose. The method for managing translations is up to the developers of a theme. However, if a theme developer chooses to use the same mechanisms used by the built-in themes, the sections below outline how to enable and make use of the same commands utilized by MkDocs.","title":"Supporting theme Localization/Translation"},{"location":"dev-guide/themes/#using-the-localizationtranslation-commands","text":"Warning As pybabel is not installed by default and most users will not have pybabel installed, theme developers and/or translators should make sure to have installed the necessary dependencies (using pip install mkdocs[i18n] ) in order for the commands to be available for use. The translation commands should be called from the root of your theme's working tree. For an overview of the workflow used by MkDocs to translate the built-in themes, see the appropriate section of the Contributing Guide and the Translation Guide .","title":"Using the Localization/Translation commands"},{"location":"dev-guide/themes/#example-custom-theme-localizationtranslation-workflow","text":"Note If your theme inherits from an existing theme which already provides translation catalogs, your theme's translations will be merged with the parent theme's translations during a MkDocs build. This means that you only need to concentrate on the added translations. Yet, you will still benefit from the translations of the parent theme. At the same time, you may override any of parent theme's translations! Let's suppose that you're working on your own fork of the mkdocs-basic-theme and want to add translations to it. Edit the templates by wrapping text in your HTML sources with {% trans %} and {% endtrans %} as follows: --- a/basic_theme/base.html +++ b/basic_theme/base.html @@ -88,7 +88,7 @@ -This is an example theme for MkDocs.
+{% trans %}This is an example theme for MkDocs.{% endtrans %}
It is designed to be read by looking at the theme HTML which is heavily Then you would follow the Translation Guide as usual to get your translations running.","title":"Example custom theme Localization/Translation workflow"},{"location":"dev-guide/themes/#packaging-translations-with-your-theme","text":"While the Portable Object Template ( pot ) file created by the extract_messages command and the Portable Object ( po ) files created by the init_catalog and update_catalog commands are useful for creating and editing translations, they are not used by MkDocs directly and do not need to be included in a packaged release of a theme. When MkDocs builds a site with translations, it only makes use of the binary mo files(s) for the specified locale. Therefore, when packaging a theme , make sure to include it in the \"wheels\", using a MANIFEST.in file or otherwise. Then, before building your Python package, you will want to ensure that the binary mo file for each locale is up-to-date by running the compile_catalog command for each locale. MkDocs expects the binary mo files to be located at locales/
/LC_MESSAGES/messages.mo , which the compile_catalog command automatically does for you. See Testing theme translations for details. Note As outlined in our Translation Guide , the MkDocs project has chosen to include the pot and po files in our code repository, but not the mo files. This requires us to always run compile_catalog before packaging a new release regardless of whether any changes were made to a translation or not. However, you may chose an alternate workflow for your theme. At a minimum, you need to ensure that up-to-date mo files are included at the correct location in each release. However, you may use a different process for generating those mo files if you chose to do so.","title":"Packaging Translations with your theme"},{"location":"dev-guide/translations/","text":"about/contributing.md# Translations Theme localization guide. The built-in themes that are included with MkDocs provide support for translations. This is a guide for translators, which documents the process for contributing new translations and/or updating existing translations. For guidance on modifying the existing themes, see the Contributing Guide . To enable a specific translation see the documentation about the specific theme you are using in the User Guide . For translations of third-party themes, please see the documentation for those themes. For a third-party theme to make use of MkDocs' translation tools and methods, that theme must be properly configured to make use of those tools. Note Translations only apply to text contained within a theme's template, such as \"next\" and \"previous\" links. The Markdown content of a page is not translated. If you wish to create multilingual documentation, you need to combine theme localization with a third-party internationalization/localization plugin. Localization tooling prerequisites Theme localization makes use of the babel project for generation and compilation of localization files. You will need to be working from the git working tree on your local machine to make use of the translation commands. See the Contributing Guide for direction on how to Install for Development and Submit a Pull Request . The instructions in this document assume that you are working from a properly configured development environment. Make sure translation requirements are installed in your environment: pip install mkdocs[i18n] Adding language translations to themes If your favorite language locale is not yet supported on one (or both) of the built-in themes ( mkdocs and readthedocs ), you can easily contribute a translation by following the steps below. Here is a quick summary of what you'll need to do: Fork and clone the MkDocs repository and then install MkDocs for development for adding and testing translations. Initialize new localization catalogs for your language (if a translation for your locale already exists, follow the instructions for updating theme localization files instead). Add a translation for every text placeholder in the localized catalogs. Locally serve and test the translated themes for your language. Update the documentation about supported translations for each translated theme. Contribute your translation through a Pull Request. Note Translation locales are usually identified using the ISO-639-1 (2-letter) language codes. While territory/region/county codes are also supported, location specific translations should only be added after the general language translation has been completed and the regional dialect requires use of a term which differs from the general language translation. Fork and clone the MkDocs repository In the following steps you'll work with a fork of the MkDocs repository. Follow the instructions for forking and cloning the MkDocs repository . To test the translations you also need to install MkDocs for development from your fork. Initializing the localization catalogs The templates for each theme contain text placeholders that have been extracted into a Portable Object Template ( messages.pot ) file, which is present in each theme's folder. Initializing a catalog consists of running a command which will create a directory structure for your desired language and prepare a Portable Object ( messages.po ) file derived from the pot file of the theme. Use the init_catalog command on each theme's directory and provide the appropriate language code ( -l ). The language code is almost always just two lowercase letters, such as sv , but in some cases it needs to be further disambiguated. See: Already translated languages for built-in themes ISO 639 Language List Language subtag registry In particular, the way to know that the pt language should be disambiguated as pt_PT and pt_BR is that the Language subtag registry page contains pt- if you search for it. Whereas sv should remain just sv , because that page does not contain sv- . So, if we pick es (Spanish) as our example language code, to add a translation for it to both built-in themes, run these commands: pybabel init --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l es pybabel init --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l es The above command will create a file structure as follows: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u2514\u2500\u2500 messages.po You can now move on to the next step and add a translation for every text placeholder in the localized catalog. Updating a theme translation If a theme's messages.pot template file has been updated since the messages.po was last updated for your locale, follow the steps below to update the theme's messages.po file: Update the theme's translation catalog to refresh the translatable text placeholders of each theme. Translate the newly added translatable text placeholders on every messages.po catalog file language you can. Locally serve and test the translated themes for your language. Contribute your translation through a Pull Request. Updating the translation catalogs This step should be completed after a theme template have been updated for each language that you are comfortable contributing a translation for. To update the fr translation catalog of both built-in themes, use the following commands: pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l fr pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l fr You can now move on to the next step and add a translation for every updated text placeholder in the localized catalog. Translating the MkDocs themes Now that your localized messages.po files are ready, all you need to do is add a translation in each msgstr item for each msgid item in the file. msgid \"Next\" msgstr \"Siguiente\" Warning Do not modify the msgid as it is common to all translations. Just add its translation in the msgstr item. Once you have finished translating all of the terms listed in the po file, you'll want to test your localized theme . Testing theme translations To test a theme with translations, you need to first compile the messages.po files of your theme into messages.mo files. The following commands will compile the es translation for both built-in themes: pybabel compile --statistics --directory mkdocs/themes/mkdocs/locales -l es pybabel compile --statistics --directory mkdocs/themes/readthedocs/locales -l es The above command results in the following file structure: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u251c\u2500\u2500 messages.mo \u2502 \u2514\u2500\u2500 messages.po Note that the compiled messages.mo file was generated based on the messages.po file that you just edited. Then modify the mkdocs.yml file at the root of the project to test the new and/or updated locale: theme: name: mkdocs locale: es Finally, run mkdocs serve to check out your new localized version of the theme. Note The build and release process takes care of compiling and distributing all locales to end users so you only have to worry about contributing the actual text translation messages.po files (the rest is ignored by git). After you have finished testing your work, be sure to undo the change to the locale setting in the mkdocs.yml file before submitting your changes. Updating theme documentation Update the lists of supported translations for each translated theme located at Choosing your theme ( docs/user-guide/choosing-your-theme.md ), in their locale options. Contributing translations It is now time for you to contribute your nice work to the project. Thank you!","title":"Translations"},{"location":"dev-guide/translations/#localization-tooling-prerequisites","text":"Theme localization makes use of the babel project for generation and compilation of localization files. You will need to be working from the git working tree on your local machine to make use of the translation commands. See the Contributing Guide for direction on how to Install for Development and Submit a Pull Request . The instructions in this document assume that you are working from a properly configured development environment. Make sure translation requirements are installed in your environment: pip install mkdocs[i18n]","title":"Localization tooling prerequisites"},{"location":"dev-guide/translations/#adding-language-translations-to-themes","text":"If your favorite language locale is not yet supported on one (or both) of the built-in themes ( mkdocs and readthedocs ), you can easily contribute a translation by following the steps below. Here is a quick summary of what you'll need to do: Fork and clone the MkDocs repository and then install MkDocs for development for adding and testing translations. Initialize new localization catalogs for your language (if a translation for your locale already exists, follow the instructions for updating theme localization files instead). Add a translation for every text placeholder in the localized catalogs. Locally serve and test the translated themes for your language. Update the documentation about supported translations for each translated theme. Contribute your translation through a Pull Request. Note Translation locales are usually identified using the ISO-639-1 (2-letter) language codes. While territory/region/county codes are also supported, location specific translations should only be added after the general language translation has been completed and the regional dialect requires use of a term which differs from the general language translation.","title":"Adding language translations to themes"},{"location":"dev-guide/translations/#fork-and-clone-the-mkdocs-repository","text":"In the following steps you'll work with a fork of the MkDocs repository. Follow the instructions for forking and cloning the MkDocs repository . To test the translations you also need to install MkDocs for development from your fork.","title":"Fork and clone the MkDocs repository"},{"location":"dev-guide/translations/#initializing-the-localization-catalogs","text":"The templates for each theme contain text placeholders that have been extracted into a Portable Object Template ( messages.pot ) file, which is present in each theme's folder. Initializing a catalog consists of running a command which will create a directory structure for your desired language and prepare a Portable Object ( messages.po ) file derived from the pot file of the theme. Use the init_catalog command on each theme's directory and provide the appropriate language code ( -l ). The language code is almost always just two lowercase letters, such as sv , but in some cases it needs to be further disambiguated. See: Already translated languages for built-in themes ISO 639 Language List Language subtag registry In particular, the way to know that the pt language should be disambiguated as pt_PT and pt_BR is that the Language subtag registry page contains pt- if you search for it. Whereas sv should remain just sv , because that page does not contain sv- . So, if we pick es (Spanish) as our example language code, to add a translation for it to both built-in themes, run these commands: pybabel init --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l es pybabel init --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l es The above command will create a file structure as follows: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u2514\u2500\u2500 messages.po You can now move on to the next step and add a translation for every text placeholder in the localized catalog.","title":"Initializing the localization catalogs"},{"location":"dev-guide/translations/#updating-a-theme-translation","text":"If a theme's messages.pot template file has been updated since the messages.po was last updated for your locale, follow the steps below to update the theme's messages.po file: Update the theme's translation catalog to refresh the translatable text placeholders of each theme. Translate the newly added translatable text placeholders on every messages.po catalog file language you can. Locally serve and test the translated themes for your language. Contribute your translation through a Pull Request.","title":"Updating a theme translation"},{"location":"dev-guide/translations/#updating-the-translation-catalogs","text":"This step should be completed after a theme template have been updated for each language that you are comfortable contributing a translation for. To update the fr translation catalog of both built-in themes, use the following commands: pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l fr pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l fr You can now move on to the next step and add a translation for every updated text placeholder in the localized catalog.","title":"Updating the translation catalogs"},{"location":"dev-guide/translations/#translating-the-mkdocs-themes","text":"Now that your localized messages.po files are ready, all you need to do is add a translation in each msgstr item for each msgid item in the file. msgid \"Next\" msgstr \"Siguiente\" Warning Do not modify the msgid as it is common to all translations. Just add its translation in the msgstr item. Once you have finished translating all of the terms listed in the po file, you'll want to test your localized theme .","title":"Translating the MkDocs themes"},{"location":"dev-guide/translations/#testing-theme-translations","text":"To test a theme with translations, you need to first compile the messages.po files of your theme into messages.mo files. The following commands will compile the es translation for both built-in themes: pybabel compile --statistics --directory mkdocs/themes/mkdocs/locales -l es pybabel compile --statistics --directory mkdocs/themes/readthedocs/locales -l es The above command results in the following file structure: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u251c\u2500\u2500 messages.mo \u2502 \u2514\u2500\u2500 messages.po Note that the compiled messages.mo file was generated based on the messages.po file that you just edited. Then modify the mkdocs.yml file at the root of the project to test the new and/or updated locale: theme: name: mkdocs locale: es Finally, run mkdocs serve to check out your new localized version of the theme. Note The build and release process takes care of compiling and distributing all locales to end users so you only have to worry about contributing the actual text translation messages.po files (the rest is ignored by git). After you have finished testing your work, be sure to undo the change to the locale setting in the mkdocs.yml file before submitting your changes.","title":"Testing theme translations"},{"location":"dev-guide/translations/#updating-theme-documentation","text":"Update the lists of supported translations for each translated theme located at Choosing your theme ( docs/user-guide/choosing-your-theme.md ), in their locale options.","title":"Updating theme documentation"},{"location":"dev-guide/translations/#contributing-translations","text":"It is now time for you to contribute your nice work to the project. Thank you!","title":"Contributing translations"},{"location":"ppt/matlab/","text":"Matlab","title":"ppt"},{"location":"ppt/matlab/#matlab","text":"","title":"Matlab"},{"location":"read/Books/","text":"Books","title":"Books"},{"location":"read/Books/#books","text":"","title":"Books"},{"location":"read/Reading/","text":"Reading \u8c46\u74e3\u9605\u8bfb \u56fe\u4e66\u5c01\u9762 \u4e66\u540d \u9605\u8bfb\u72b6\u6001 \u300a\u6211\u5728\u5317\u4eac\u9001\u5feb\u9012\u300b","title":"Reading"},{"location":"read/Reading/#reading","text":"","title":"Reading"},{"location":"read/Reading/#_1","text":"\u56fe\u4e66\u5c01\u9762 \u4e66\u540d \u9605\u8bfb\u72b6\u6001 \u300a\u6211\u5728\u5317\u4eac\u9001\u5feb\u9012\u300b","title":"\u8c46\u74e3\u9605\u8bfb"},{"location":"user-guide/","text":"User Guide Building Documentation with MkDocs The MkDocs Developer Guide provides documentation for users of MkDocs. See Getting Started for an introductory tutorial. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Installation Writing Your Docs Choosing Your Theme Customizing Your Theme Localizing Your Theme Configuration Command Line Interface Deploying Your Docs","title":"README"},{"location":"user-guide/#user-guide","text":"Building Documentation with MkDocs The MkDocs Developer Guide provides documentation for users of MkDocs. See Getting Started for an introductory tutorial. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Installation Writing Your Docs Choosing Your Theme Customizing Your Theme Localizing Your Theme Configuration Command Line Interface Deploying Your Docs","title":"User Guide"},{"location":"user-guide/choosing-your-theme/","text":"Choosing your Theme Selecting and configuring a theme. MkDocs includes two built-in themes ( mkdocs and readthedocs ), as documented below. However, many third party themes are available to choose from as well. To choose a theme, set the theme configuration option in your mkdocs.yml config file. theme: name: readthedocs mkdocs The default theme, which was built as a custom Bootstrap theme, supports most every feature of MkDocs. In addition to the default theme configuration options , the mkdocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_style : The highlight.js library provides 79 different styles (color variations) for highlighting source code in code blocks. Set this to the name of the desired style. Default: github . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: mkdocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. Currently, only Google Analytics v4 is supported via the gtag option. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: mkdocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the site. shortcuts : Defines keyboard shortcut keys. theme: name: mkdocs shortcuts: help: 191 # ? next: 78 # n previous: 80 # p search: 83 # s All values must be numeric key codes. It is best to use keys which are available on all keyboards. You may use https://keycode.info/ to determine the key code for a given key. help : Display a help modal which lists the keyboard shortcuts. Default: 191 (?) next : Navigate to the \"next\" page. Default: 78 (n) previous : Navigate to the \"previous\" page. Default: 80 (p) search : Display the search modal. Default: 83 (s) navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 2 . nav_style : This adjusts the visual style for the top navigation bar; by default, this is set to primary (the default), but it can also be set to dark or light . theme: name: mkdocs nav_style: dark locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese nb : Norwegian Bokm\u00e5l nn : Norwegian Nynorsk pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. readthedocs A clone of the default theme used by the Read the Docs service, which offers the same restricted feature-set as its parent theme. Like its parent theme, only two levels of navigation are supported. In addition to the default theme configuration options , the readthedocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: readthedocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: readthedocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the anonymize_ip : To enable anonymous IP address for Google Analytics, set this to True . Default: False . include_homepage_in_sidebar : Lists the homepage in the sidebar menu. As MkDocs requires that the homepage be listed in the nav configuration option, this setting allows the homepage to be included or excluded from the sidebar. Note that the site name/logo always links to the homepage. Default: True . prev_next_buttons_location : One of bottom , top , both , or none . Displays the \u201cNext\u201d and \u201cPrevious\u201d buttons accordingly. Default: bottom . navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 4 . collapse_navigation : Only include the page section headers in the sidebar for the current page. Default: True . titles_only : Only include page titles in the sidebar, excluding all section headers for all pages. Default: False . sticky_navigation : If True, causes the sidebar to scroll with the main page content as you scroll the page. Default: True . locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. logo : To set a logo on your project instead of the plain text site_name , set this variable to be the location of your image. Default: null . Third Party Themes A list of third party themes can be found at the community wiki page and Best-of-MkDocs . If you have created your own, please add them there.","title":"Theme"},{"location":"user-guide/choosing-your-theme/#choosing-your-theme","text":"Selecting and configuring a theme. MkDocs includes two built-in themes ( mkdocs and readthedocs ), as documented below. However, many third party themes are available to choose from as well. To choose a theme, set the theme configuration option in your mkdocs.yml config file. theme: name: readthedocs","title":"Choosing your Theme"},{"location":"user-guide/choosing-your-theme/#mkdocs","text":"The default theme, which was built as a custom Bootstrap theme, supports most every feature of MkDocs. In addition to the default theme configuration options , the mkdocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_style : The highlight.js library provides 79 different styles (color variations) for highlighting source code in code blocks. Set this to the name of the desired style. Default: github . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: mkdocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. Currently, only Google Analytics v4 is supported via the gtag option. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: mkdocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the site. shortcuts : Defines keyboard shortcut keys. theme: name: mkdocs shortcuts: help: 191 # ? next: 78 # n previous: 80 # p search: 83 # s All values must be numeric key codes. It is best to use keys which are available on all keyboards. You may use https://keycode.info/ to determine the key code for a given key. help : Display a help modal which lists the keyboard shortcuts. Default: 191 (?) next : Navigate to the \"next\" page. Default: 78 (n) previous : Navigate to the \"previous\" page. Default: 80 (p) search : Display the search modal. Default: 83 (s) navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 2 . nav_style : This adjusts the visual style for the top navigation bar; by default, this is set to primary (the default), but it can also be set to dark or light . theme: name: mkdocs nav_style: dark locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese nb : Norwegian Bokm\u00e5l nn : Norwegian Nynorsk pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information.","title":"mkdocs"},{"location":"user-guide/choosing-your-theme/#readthedocs","text":"A clone of the default theme used by the Read the Docs service, which offers the same restricted feature-set as its parent theme. Like its parent theme, only two levels of navigation are supported. In addition to the default theme configuration options , the readthedocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: readthedocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: readthedocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the anonymize_ip : To enable anonymous IP address for Google Analytics, set this to True . Default: False . include_homepage_in_sidebar : Lists the homepage in the sidebar menu. As MkDocs requires that the homepage be listed in the nav configuration option, this setting allows the homepage to be included or excluded from the sidebar. Note that the site name/logo always links to the homepage. Default: True . prev_next_buttons_location : One of bottom , top , both , or none . Displays the \u201cNext\u201d and \u201cPrevious\u201d buttons accordingly. Default: bottom . navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 4 . collapse_navigation : Only include the page section headers in the sidebar for the current page. Default: True . titles_only : Only include page titles in the sidebar, excluding all section headers for all pages. Default: False . sticky_navigation : If True, causes the sidebar to scroll with the main page content as you scroll the page. Default: True . locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. logo : To set a logo on your project instead of the plain text site_name , set this variable to be the location of your image. Default: null .","title":"readthedocs"},{"location":"user-guide/choosing-your-theme/#third-party-themes","text":"A list of third party themes can be found at the community wiki page and Best-of-MkDocs . If you have created your own, please add them there.","title":"Third Party Themes"},{"location":"user-guide/cli/","text":"Command Line Interface mkdocs MkDocs - Project documentation with Markdown. Usage: mkdocs [OPTIONS] COMMAND [ARGS]... Options: Name Type Description Default -V , --version boolean Show the version and exit. False -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False Subcommands build : Build the MkDocs documentation gh-deploy : Deploy your documentation to GitHub Pages new : Create a new MkDocs project serve : Run the builtin development server mkdocs build Build the MkDocs documentation Usage: mkdocs build [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs gh-deploy Deploy your documentation to GitHub Pages Usage: mkdocs gh-deploy [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -m , --message text A commit message to use when committing to the GitHub Pages remote branch. Commit {sha} and MkDocs {version} are available as expansions None -b , --remote-branch text The remote branch to commit to for GitHub Pages. This overrides the value specified in config None -r , --remote-name text The remote name to commit to for GitHub Pages. This overrides the value specified in config None --force boolean Force the push to the repository. False --no-history boolean Replace the whole Git history with one new commit. False --ignore-version boolean Ignore check that build is not being deployed with an older version of MkDocs. False --shell boolean Use the shell when invoking Git. False -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs new Create a new MkDocs project Usage: mkdocs new [OPTIONS] PROJECT_DIRECTORY Options: Name Type Description Default -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs serve Run the builtin development server Usage: mkdocs serve [OPTIONS] Options: Name Type Description Default -a , --dev-addr text IP address and port to serve documentation locally (default: localhost:8000) None --livereload text Enable the live reloading in the development server (this is the default) True --no-livereload text Disable the live reloading in the development server. False --dirtyreload text Enable the live reloading in the development server, but only re-build files that have changed False --watch-theme boolean Include the theme in list of files to watch for live reloading. Ignored when live reload is not used. False -w , --watch path A directory or file to watch for live reloading. Can be supplied multiple times. [] -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"Cli"},{"location":"user-guide/cli/#command-line-interface","text":"","title":"Command Line Interface"},{"location":"user-guide/cli/#mkdocs","text":"MkDocs - Project documentation with Markdown. Usage: mkdocs [OPTIONS] COMMAND [ARGS]... Options: Name Type Description Default -V , --version boolean Show the version and exit. False -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False Subcommands build : Build the MkDocs documentation gh-deploy : Deploy your documentation to GitHub Pages new : Create a new MkDocs project serve : Run the builtin development server","title":"mkdocs"},{"location":"user-guide/cli/#mkdocs-build","text":"Build the MkDocs documentation Usage: mkdocs build [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"build"},{"location":"user-guide/cli/#mkdocs-gh-deploy","text":"Deploy your documentation to GitHub Pages Usage: mkdocs gh-deploy [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -m , --message text A commit message to use when committing to the GitHub Pages remote branch. Commit {sha} and MkDocs {version} are available as expansions None -b , --remote-branch text The remote branch to commit to for GitHub Pages. This overrides the value specified in config None -r , --remote-name text The remote name to commit to for GitHub Pages. This overrides the value specified in config None --force boolean Force the push to the repository. False --no-history boolean Replace the whole Git history with one new commit. False --ignore-version boolean Ignore check that build is not being deployed with an older version of MkDocs. False --shell boolean Use the shell when invoking Git. False -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"gh-deploy"},{"location":"user-guide/cli/#mkdocs-new","text":"Create a new MkDocs project Usage: mkdocs new [OPTIONS] PROJECT_DIRECTORY Options: Name Type Description Default -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"new"},{"location":"user-guide/cli/#mkdocs-serve","text":"Run the builtin development server Usage: mkdocs serve [OPTIONS] Options: Name Type Description Default -a , --dev-addr text IP address and port to serve documentation locally (default: localhost:8000) None --livereload text Enable the live reloading in the development server (this is the default) True --no-livereload text Disable the live reloading in the development server. False --dirtyreload text Enable the live reloading in the development server, but only re-build files that have changed False --watch-theme boolean Include the theme in list of files to watch for live reloading. Ignored when live reload is not used. False -w , --watch path A directory or file to watch for live reloading. Can be supplied multiple times. [] -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"serve"},{"location":"user-guide/configuration/","text":"Configuration Guide to all available configuration settings. Introduction Project settings are configured by default using a YAML configuration file in the project directory named mkdocs.yml . You can specify another path for it by using the -f / --config-file option (see mkdocs build --help ). As a minimum, this configuration file must contain the site_name . All other settings are optional. Project information site_name This is a required setting , and should be a string that is used as the main title for the project documentation. For example: site_name: Marshmallow Generator When rendering the theme this setting will be passed as the site_name context variable. site_url Set the canonical URL of the site. This will add a link tag with the canonical URL to the head section of each HTML page. If the 'root' of the MkDocs site will be within a subdirectory of a domain, be sure to include that subdirectory in the setting ( https://example.com/foo/ ). This setting is also used for mkdocs serve : the server will be mounted onto a path taken from the path component of the URL, e.g. some/page.md will be served from http://127.0.0.1:8000/foo/some/page/ to mimic the expected remote layout. default : null repo_url When set, provides a link to your repository (GitHub, Bitbucket, GitLab, ...) on each page. repo_url: https://github.com/example/repository/ default : null repo_name When set, provides the name for the link to your repository on each page. default : 'GitHub' , 'Bitbucket' or 'GitLab' if the repo_url matches those domains, otherwise the hostname from the repo_url . edit_uri The path from the base repo_url to the docs directory when directly viewing a page, accounting for specifics of the repository host (e.g. GitHub, Bitbucket, etc), the branch, and the docs directory itself. MkDocs concatenates repo_url and edit_uri , and appends the input path of the page. When set, and if your theme supports it, provides a link directly to the page in your source repository. This makes it easier to find and edit the source for the page. If repo_url is not set, this option is ignored. On some themes, setting this option may cause an edit link to be used in place of a repository link. Other themes may show both links. The edit_uri supports query ('?') and fragment ('#') characters. For repository hosts that use a query or a fragment to access the files, the edit_uri might be set as follows. (Note the ? and # in the URI...) # Query string example edit_uri: '?query=root/path/docs/' # Hash fragment example edit_uri: '#root/path/docs/' For other repository hosts, simply specify the relative path to the docs directory. # Query string example edit_uri: root/path/docs/ For example, having this config: repo_url: https://example.com/project/repo edit_uri: blob/main/docs/ means that a page named 'foo/bar.md' will have its edit link lead to: https://example.com/project/repo/blob/main/docs/foo/bar.md edit_uri can actually be just an absolute URL, not necessarily relative to repo_url , so this can achieve the same result: edit_uri: https://example.com/project/repo/blob/main/docs/ For more flexibility, see edit_uri_template below. Note On a few known hosts (specifically GitHub, Bitbucket and GitLab), the edit_uri is derived from the 'repo_url' and does not need to be set manually. Simply defining a repo_url will automatically populate the edit_uri configs setting. For example, for a GitHub- or GitLab-hosted repository, the edit_uri would be automatically set as edit/master/docs/ (Note the edit path and master branch). For a Bitbucket-hosted repository, the equivalent edit_uri would be automatically set as src/default/docs/ (note the src path and default branch). To use a different URI than the default (for example a different branch), simply set the edit_uri to your desired string. If you do not want any \"edit URL link\" displayed on your pages, then set edit_uri to an empty string to disable the automatic setting. Warning On GitHub and GitLab, the default \"edit\" path ( edit/master/docs/ ) opens the page in the online editor. This functionality requires that the user have and be logged in to a GitHub/GitLab account. Otherwise, the user will be redirected to a login/signup page. Alternatively, use the \"blob\" path ( blob/master/docs/ ) to open a read-only view, which supports anonymous access. default : edit/master/docs/ for GitHub and GitLab repos or src/default/docs/ for a Bitbucket repo, if repo_url matches those domains, otherwise null edit_uri_template The more flexible variant of edit_uri . These two are equivalent: edit_uri: 'blob/main/docs/' edit_uri_template: 'blob/main/docs/{path}' (they are also mutually exclusive -- don't specify both). Starting from here, you can change the positioning or formatting of the path, in case the default behavior of appending the path isn't enough. The contents of edit_uri_template are normal Python format strings , with only these fields available: {path} , e.g. foo/bar.md {path_noext} , e.g. foo/bar And the conversion flag !q is available, to percent-encode the field: {path!q} , e.g. foo%2Fbar.md Suggested useful configurations: GitHub Wiki: (e.g. https://github.com/project/repo/wiki/foo/bar/_edit ) repo_url: 'https://github.com/project/repo/wiki' edit_uri_template: '{path_noext}/_edit' BitBucket editor: (e.g. https://bitbucket.org/project/repo/src/master/docs/foo/bar.md?mode=edit ) repo_url: 'https://bitbucket.org/project/repo/' edit_uri_template: 'src/master/docs/{path}?mode=edit' GitLab Static Site Editor: (e.g. https://gitlab.com/project/repo/-/sse/master/docs%2Ffoo%2bar.md ) repo_url: 'https://gitlab.com/project/repo' edit_uri_template: '-/sse/master/docs%2F{path!q}' GitLab Web IDE: (e.g. https://gitlab.com/-/ide/project/repo/edit/master/-/docs/foo/bar.md ) edit_uri_template: 'https://gitlab.com/-/ide/project/repo/edit/master/-/docs/{path}' default : null site_description Set the site description. This will add a meta tag to the generated HTML header. default : null site_author Set the name of the author. This will add a meta tag to the generated HTML header. default : null copyright Set the copyright information to be included in the documentation by the theme. default : null remote_branch Set the remote branch to commit to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : gh-pages remote_name Set the remote name to push to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : origin Documentation layout nav This setting is used to determine the format and layout of the global navigation for the site. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. See the section on configuring pages and navigation for a more detailed breakdown, including how to create sub-sections. Navigation items may also include links to external sites. While titles are optional for internal links, they are required for external links. An external link may be a full URL or a relative URL. Any path which is not found in the files is assumed to be an external link. See the section about [Meta-Data] on how MkDocs determines the page title of a document. nav: - Introduction: 'index.md' - 'about.md' - 'Issue Tracker': 'https://example.com/' In the above example, the first two items point to local files while the third points to an external site. However, sometimes the MkDocs site is hosted in a subdirectory of a project's site and you may want to link to other parts of the same site without including the full domain. In that case, you may use an appropriate relative URL. site_url: https://example.com/foo/ nav: - Home: '../' - 'User Guide': 'user-guide.md' - 'Bug Tracker': '/bugs/' In the above example, two different styles of external links are used. First, note that the site_url indicates that the MkDocs site is hosted in the /foo/ subdirectory of the domain. Therefore, the Home navigation item is a relative link that steps up one level to the server root and effectively points to https://example.com/ . The Bug Tracker item uses an absolute path from the server root and effectively points to https://example.com/bugs/ . Of course, the User Guide points to a local MkDocs page. default : By default nav will contain an alphanumerically sorted, nested list of all the Markdown files found within the docs_dir and its sub-directories. Index files will always be listed first within a sub-section. Build directories theme Sets the theme and theme specific configuration of your documentation site. May be either a string or a set of key/value pairs. If a string, it must be the string name of a known installed theme. For a list of available themes visit Choosing Your Theme . An example set of key/value pairs might look something like this: theme: name: mkdocs locale: en custom_dir: my_theme_customizations/ static_templates: - sitemap.html include_sidebar: false If a set of key/value pairs, the following nested keys can be defined: Block name The string name of a known installed theme. For a list of available themes visit Choosing Your Theme . locale A code representing the language of your site. See Localizing your theme for details. custom_dir A directory containing a custom theme. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file or it can be an absolute directory path from the root of your local file system. See Customizing Your Theme for details if you would like to tweak an existing theme. See the Theme Developer Guide if you would like to build your own theme from the ground up. static_templates A list of templates to render as static pages. The templates must be located in either the theme's template directory or in the custom_dir defined in the theme configuration. (theme specific keywords) Any additional keywords supported by the theme can also be defined. See the documentation for the theme you are using for details. default : 'mkdocs' docs_dir The directory containing the documentation source markdown files. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'docs' site_dir The directory where the output HTML and other files are created. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'site' Note If you are using source code control you will normally want to ensure that your build output files are not committed into the repository, and only keep the source files under version control. For example, if using git you might add the following line to your .gitignore file: site/ If you're using another source code control tool, you'll want to check its documentation on how to ignore specific directories. extra_css Set a list of CSS files in your docs_dir to be included by the theme. For example, the following example will include the extra.css file within the css subdirectory in your docs_dir . extra_css: - css/extra.css - css/second_extra.css default : [] (an empty list). extra_javascript Set a list of JavaScript files in your docs_dir to be included by the theme. See the example in extra_css for usage. default : [] (an empty list). extra_templates Set a list of templates in your docs_dir to be built by MkDocs. To see more about writing templates for MkDocs read the documentation about [custom themes] and specifically the section about the [available variables] to templates. See the example in extra_css for usage. default : [] (an empty list). extra A set of key-value pairs, where the values can be any valid YAML construct, that will be passed to the template. This allows for great flexibility when creating custom themes. For example, if you are using a theme that supports displaying the project version, you can pass it to the theme like this: extra: version: 1.0 default : By default extra will be an empty key-value mapping. Preview controls Live Reloading watch Determines additional directories to watch when running mkdocs serve . Configuration is a YAML list. watch: - directory_a - directory_b Allows a custom default to be set without the need to pass it through the -w / --watch option every time the mkdocs serve command is called. Note The paths provided via the configuration file are relative to the configuration file. The paths provided via the -w / --watch CLI parameters are not. use_directory_urls This setting controls the style used for linking to pages within the documentation. The following table demonstrates how the URLs used on the site differ when setting use_directory_urls to true or false . Source file use_directory_urls: true use_directory_urls: false index.md / /index.html api-guide.md /api-guide/ /api-guide.html about/license.md /about/license/ /about/license.html The default style of use_directory_urls: true creates more user friendly URLs, and is usually what you'll want to use. The alternate style can be useful if you want your documentation to remain properly linked when opening pages directly from the file system, because it creates links that point directly to the target file rather than the target directory . default : true strict Determines how warnings are handled. Set to true to halt processing when a warning is raised. Set to false to print a warning and continue processing. This is also available as a command line flag: --strict . default : false dev_addr Determines the address used when running mkdocs serve . Must be of the format IP:PORT . Allows a custom default to be set without the need to pass it through the --dev-addr option every time the mkdocs serve command is called. default : '127.0.0.1:8000' See also: site_url . Formatting options markdown_extensions MkDocs uses the Python Markdown library to translate Markdown files into HTML. Python Markdown supports a variety of extensions that customize how pages are formatted. This setting lets you enable a list of extensions beyond the ones that MkDocs uses by default ( meta , toc , tables , and fenced_code ). For example, to enable the SmartyPants typography extension , use: markdown_extensions: - smarty Some extensions provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given extension supports. See the documentation for the extension you are using to determine what options they support. For example, to enable permalinks in the (included) toc extension, use: markdown_extensions: - toc: permalink: True Note that a colon ( : ) must follow the extension name ( toc ) and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single extension, each option must be defined on a separate line: markdown_extensions: - toc: permalink: True separator: \"_\" Add an additional item to the list for each extension. If you have no configuration options to set for a specific extension, then simply omit options for that extension: markdown_extensions: - smarty - toc: permalink: True - sane_lists In the above examples, each extension is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for extensions for which no options are defined. Therefore, the last example above could also be defined as follows: markdown_extensions: smarty: {} toc: permalink: True sane_lists: {} This alternative syntax is required if you intend to override some options via inheritance . See Also: The Python-Markdown documentation provides a list of extensions which are available out-of-the-box. For a list of configuration options available for a given extension, see the documentation for that extension. You may also install and use various third party extensions ( Python-Markdown wiki , Best-of-MkDocs ). Consult the documentation provided by those extensions for installation instructions and available configuration options. default : [] (an empty list). hooks New in version 1.4 A list of paths to Python scripts (relative to mkdocs.yml ) that are loaded and used as plugin instances. For example: hooks: - my_hooks.py Then the file my_hooks.py can contain any plugin event handlers (without self ), e.g.: def on_page_markdown(markdown, **kwargs): return markdown.replace('a', 'z') Advanced example: This produces warnings based on the Markdown content (and warnings are fatal in strict mode): import logging, re import mkdocs.plugins log = logging.getLogger('mkdocs') @mkdocs.plugins.event_priority(-50) def on_page_markdown(markdown, page, **kwargs): path = page.file.src_uri for m in re.finditer(r'\\bhttp://[^) ]+', markdown): log.warning(f\"Documentation file '{path}' contains a non-HTTPS link: {m[0]}\") This does not enable any new abilities compared to plugins , it only simplifies one-off usages, as these don't need to be installed like plugins do. Note that for mkdocs serve the hook module will not be reloaded on each build. You might have seen this feature in the mkdocs-simple-hooks plugin . If using standard method names, it can be directly replaced, e.g.: -plugins: - - mkdocs-simple-hooks: - hooks: - on_page_markdown: 'my_hooks:on_page_markdown' +hooks: + - my_hooks.py plugins A list of plugins (with optional configuration settings) to use when building the site. See the Plugins documentation for full details. If the plugins config setting is defined in the mkdocs.yml config file, then any defaults (such as search ) are ignored and you need to explicitly re-enable the defaults if you would like to continue using them: plugins: - search - your_other_plugin To define options for a given plugin, use a nested set of key/value pairs: plugins: - search - your_other_plugin: option1: value option2: other value In the above examples, each plugin is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for plugins for which no options are defined. Therefore, the last example above could also be defined as follows: plugins: search: {} your_other_plugin: option1: value option2: other value This alternative syntax is required if you intend to override some options via inheritance . To completely disable all plugins, including any defaults, set the plugins setting to an empty list: plugins: [] default : ['search'] (the \"search\" plugin included with MkDocs). Search A search plugin is provided by default with MkDocs which uses lunr.js as a search engine. The following config options are available to alter the behavior of the search plugin: separator A regular expression which matches the characters used as word separators when building the index. By default whitespace and the hyphen ( - ) are used. To add the dot ( . ) as a word separator you might do this: plugins: - search: separator: '[\\s\\-\\.]+' default : '[\\s\\-]+' min_search_length An integer value that defines the minimum length for a search query. By default searches shorter than 3 chars in length are ignored as search result quality with short search terms are poor. However, for some use cases (such as documentation about Message Queues which might generate searches for 'MQ') it may be preferable to set a shorter limit. plugins: - search: min_search_length: 2 default : 3 lang A list of languages to use when building the search index as identified by their ISO 639-1 language codes. With Lunr Languages , the following languages are supported: ar : Arabic da : Danish nl : Dutch en : English fi : Finnish fr : French de : German hu : Hungarian it : Italian ja : Japanese no : Norwegian pt : Portuguese ro : Romanian ru : Russian es : Spanish sv : Swedish th : Thai tr : Turkish vi : Vietnamese You may contribute additional languages . Warning While search does support using multiple languages together, it is best not to add additional languages unless you really need them. Each additional language adds significant bandwidth requirements and uses more browser resources. Generally, it is best to keep each instance of MkDocs to a single language. Note Lunr Languages does not currently include support for Chinese or other Asian languages. However, some users have reported decent results using Japanese. default : The value of theme.locale if set, otherwise [en] . prebuild_index Optionally generates a pre-built index of all pages, which provides some performance improvements for larger sites. Before enabling, confirm that the theme you are using explicitly supports using a prebuilt index (the builtin themes do). Set to true to enable. Warning This option requires that Node.js be installed and the command node be on the system path. If the call to node fails for any reason, a warning is issued and the build continues uninterrupted. You may use the --strict flag when building to cause such a failure to raise an error instead. Note On smaller sites, using a pre-built index is not recommended as it creates a significant increase is bandwidth requirements with little to no noticeable improvement to your users. However, for larger sites (hundreds of pages), the bandwidth increase is relatively small and your users will notice a significant improvement in search performance. default : False indexing Configures what strategy the search indexer will use when building the index for your pages. This property is particularly useful if your project is large in scale, and the index takes up an enormous amount of disk space. plugins: - search: indexing: 'full' Options Option Description full Indexes the title, section headings, and full text of each page. sections Indexes the title and section headings of each page. titles Indexes only the title of each page. default : full Environment Variables In most cases, the value of a configuration option is set directly in the configuration file. However, as an option, the value of a configuration option may be set to the value of an environment variable using the !ENV tag. For example, to set the value of the site_name option to the value of the variable SITE_NAME the YAML file may contain the following: site_name: !ENV SITE_NAME If the environment variable is not defined, then the configuration setting would be assigned a null (or None in Python) value. A default value can be defined as the last value in a list. Like this: site_name: !ENV [SITE_NAME, 'My default site name'] Multiple fallback variables can be used as well. Note that the last value is not an environment variable, but must be a value to use as a default if none of the specified environment variables are defined. site_name: !ENV [SITE_NAME, OTHER_NAME, 'My default site name'] Simple types defined within an environment variable such as string, bool, integer, float, datestamp and null are parsed as if they were defined directly in the YAML file, which means that the value will be converted to the appropriate type. However, complex types such as lists and key/value pairs cannot be defined within a single environment variable. For more details, see the pyyaml_env_tag project. Configuration Inheritance Generally, a single file would hold the entire configuration for a site. However, some organizations may maintain multiple sites which all share a common configuration across them. Rather than maintaining separate configurations for each, the common configuration options can be defined in a parent configuration file which each site's primary configuration file inherits. To define the parent for a configuration file, set the INHERIT (all caps) key to the path of the parent file. The path must be relative to the location of the primary file. For configuration options to be merged with a parent configuration, those options must be defined as key/value pairs. Specifically, the markdown_extensions and plugins options must use the alternative syntax which does not use list items (lines which start with - ). For example, suppose the common (parent) configuration is defined in base.yml : theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Then, for the \"foo\" site, the primary configuration file would be defined at foo/mkdocs.yml : INHERIT: ../base.yml site_name: Foo Project site_url: https://example.com/foo When running mkdocs build , the file at foo/mkdocs.yml would be passed in as the configuration file. MkDocs will then parse that file, retrieve and parse the parent file base.yml and deep merge the two. This would result in MkDocs receiving the following merged configuration: site_name: Foo Project site_url: https://example.com/foo theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Deep merging allows you to add and/or override various values in your primary configuration file. For example, suppose for one site you wanted to add support for definition lists, use a different symbol for permalinks, and define a different separator. In that site's primary configuration file you could do: INHERIT: ../base.yml site_name: Bar Project site_url: https://example.com/bar markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" In that case, the above configuration would be deep merged with base.yml and result in the following configuration: site_name: Bar Project site_url: https://example.com/bar theme: name: mkdocs locale: en highlightjs: true markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" admonition: {} Notice that the admonition extension was retained from the parent configuration, the def_list extension was added, the value of toc.permalink was replaced, and the value of toc.separator was added. You can replace or merge the value of any key. However, any non-key is always replaced. Therefore, you cannot append items to a list. You must redefine the entire list. As the nav configuration is made up of nested lists, this means that you cannot merge navigation items. Of course, you can replace the entire nav configuration with a new one. However, it is generally expected that the entire navigation would be defined in the primary configuration file for a project. Warning As a reminder, all path based configuration options must be relative to the primary configuration file and MkDocs does not alter the paths when merging. Therefore, defining paths in a parent file which is inherited by multiple different sites may not work as expected. It is generally best to define path based options in the primary configuration file only.","title":"Configuration"},{"location":"user-guide/configuration/#configuration","text":"Guide to all available configuration settings.","title":"Configuration"},{"location":"user-guide/configuration/#introduction","text":"Project settings are configured by default using a YAML configuration file in the project directory named mkdocs.yml . You can specify another path for it by using the -f / --config-file option (see mkdocs build --help ). As a minimum, this configuration file must contain the site_name . All other settings are optional.","title":"Introduction"},{"location":"user-guide/configuration/#project-information","text":"","title":"Project information"},{"location":"user-guide/configuration/#site_name","text":"This is a required setting , and should be a string that is used as the main title for the project documentation. For example: site_name: Marshmallow Generator When rendering the theme this setting will be passed as the site_name context variable.","title":"site_name"},{"location":"user-guide/configuration/#site_url","text":"Set the canonical URL of the site. This will add a link tag with the canonical URL to the head section of each HTML page. If the 'root' of the MkDocs site will be within a subdirectory of a domain, be sure to include that subdirectory in the setting ( https://example.com/foo/ ). This setting is also used for mkdocs serve : the server will be mounted onto a path taken from the path component of the URL, e.g. some/page.md will be served from http://127.0.0.1:8000/foo/some/page/ to mimic the expected remote layout. default : null","title":"site_url"},{"location":"user-guide/configuration/#repo_url","text":"When set, provides a link to your repository (GitHub, Bitbucket, GitLab, ...) on each page. repo_url: https://github.com/example/repository/ default : null","title":"repo_url"},{"location":"user-guide/configuration/#repo_name","text":"When set, provides the name for the link to your repository on each page. default : 'GitHub' , 'Bitbucket' or 'GitLab' if the repo_url matches those domains, otherwise the hostname from the repo_url .","title":"repo_name"},{"location":"user-guide/configuration/#edit_uri","text":"The path from the base repo_url to the docs directory when directly viewing a page, accounting for specifics of the repository host (e.g. GitHub, Bitbucket, etc), the branch, and the docs directory itself. MkDocs concatenates repo_url and edit_uri , and appends the input path of the page. When set, and if your theme supports it, provides a link directly to the page in your source repository. This makes it easier to find and edit the source for the page. If repo_url is not set, this option is ignored. On some themes, setting this option may cause an edit link to be used in place of a repository link. Other themes may show both links. The edit_uri supports query ('?') and fragment ('#') characters. For repository hosts that use a query or a fragment to access the files, the edit_uri might be set as follows. (Note the ? and # in the URI...) # Query string example edit_uri: '?query=root/path/docs/' # Hash fragment example edit_uri: '#root/path/docs/' For other repository hosts, simply specify the relative path to the docs directory. # Query string example edit_uri: root/path/docs/ For example, having this config: repo_url: https://example.com/project/repo edit_uri: blob/main/docs/ means that a page named 'foo/bar.md' will have its edit link lead to: https://example.com/project/repo/blob/main/docs/foo/bar.md edit_uri can actually be just an absolute URL, not necessarily relative to repo_url , so this can achieve the same result: edit_uri: https://example.com/project/repo/blob/main/docs/ For more flexibility, see edit_uri_template below. Note On a few known hosts (specifically GitHub, Bitbucket and GitLab), the edit_uri is derived from the 'repo_url' and does not need to be set manually. Simply defining a repo_url will automatically populate the edit_uri configs setting. For example, for a GitHub- or GitLab-hosted repository, the edit_uri would be automatically set as edit/master/docs/ (Note the edit path and master branch). For a Bitbucket-hosted repository, the equivalent edit_uri would be automatically set as src/default/docs/ (note the src path and default branch). To use a different URI than the default (for example a different branch), simply set the edit_uri to your desired string. If you do not want any \"edit URL link\" displayed on your pages, then set edit_uri to an empty string to disable the automatic setting. Warning On GitHub and GitLab, the default \"edit\" path ( edit/master/docs/ ) opens the page in the online editor. This functionality requires that the user have and be logged in to a GitHub/GitLab account. Otherwise, the user will be redirected to a login/signup page. Alternatively, use the \"blob\" path ( blob/master/docs/ ) to open a read-only view, which supports anonymous access. default : edit/master/docs/ for GitHub and GitLab repos or src/default/docs/ for a Bitbucket repo, if repo_url matches those domains, otherwise null","title":"edit_uri"},{"location":"user-guide/configuration/#edit_uri_template","text":"The more flexible variant of edit_uri . These two are equivalent: edit_uri: 'blob/main/docs/' edit_uri_template: 'blob/main/docs/{path}' (they are also mutually exclusive -- don't specify both). Starting from here, you can change the positioning or formatting of the path, in case the default behavior of appending the path isn't enough. The contents of edit_uri_template are normal Python format strings , with only these fields available: {path} , e.g. foo/bar.md {path_noext} , e.g. foo/bar And the conversion flag !q is available, to percent-encode the field: {path!q} , e.g. foo%2Fbar.md Suggested useful configurations: GitHub Wiki: (e.g. https://github.com/project/repo/wiki/foo/bar/_edit ) repo_url: 'https://github.com/project/repo/wiki' edit_uri_template: '{path_noext}/_edit' BitBucket editor: (e.g. https://bitbucket.org/project/repo/src/master/docs/foo/bar.md?mode=edit ) repo_url: 'https://bitbucket.org/project/repo/' edit_uri_template: 'src/master/docs/{path}?mode=edit' GitLab Static Site Editor: (e.g. https://gitlab.com/project/repo/-/sse/master/docs%2Ffoo%2bar.md ) repo_url: 'https://gitlab.com/project/repo' edit_uri_template: '-/sse/master/docs%2F{path!q}' GitLab Web IDE: (e.g. https://gitlab.com/-/ide/project/repo/edit/master/-/docs/foo/bar.md ) edit_uri_template: 'https://gitlab.com/-/ide/project/repo/edit/master/-/docs/{path}' default : null","title":"edit_uri_template"},{"location":"user-guide/configuration/#site_description","text":"Set the site description. This will add a meta tag to the generated HTML header. default : null","title":"site_description"},{"location":"user-guide/configuration/#site_author","text":"Set the name of the author. This will add a meta tag to the generated HTML header. default : null","title":"site_author"},{"location":"user-guide/configuration/#copyright","text":"Set the copyright information to be included in the documentation by the theme. default : null","title":"copyright"},{"location":"user-guide/configuration/#remote_branch","text":"Set the remote branch to commit to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : gh-pages","title":"remote_branch"},{"location":"user-guide/configuration/#remote_name","text":"Set the remote name to push to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : origin","title":"remote_name"},{"location":"user-guide/configuration/#documentation-layout","text":"","title":"Documentation layout"},{"location":"user-guide/configuration/#nav","text":"This setting is used to determine the format and layout of the global navigation for the site. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. See the section on configuring pages and navigation for a more detailed breakdown, including how to create sub-sections. Navigation items may also include links to external sites. While titles are optional for internal links, they are required for external links. An external link may be a full URL or a relative URL. Any path which is not found in the files is assumed to be an external link. See the section about [Meta-Data] on how MkDocs determines the page title of a document. nav: - Introduction: 'index.md' - 'about.md' - 'Issue Tracker': 'https://example.com/' In the above example, the first two items point to local files while the third points to an external site. However, sometimes the MkDocs site is hosted in a subdirectory of a project's site and you may want to link to other parts of the same site without including the full domain. In that case, you may use an appropriate relative URL. site_url: https://example.com/foo/ nav: - Home: '../' - 'User Guide': 'user-guide.md' - 'Bug Tracker': '/bugs/' In the above example, two different styles of external links are used. First, note that the site_url indicates that the MkDocs site is hosted in the /foo/ subdirectory of the domain. Therefore, the Home navigation item is a relative link that steps up one level to the server root and effectively points to https://example.com/ . The Bug Tracker item uses an absolute path from the server root and effectively points to https://example.com/bugs/ . Of course, the User Guide points to a local MkDocs page. default : By default nav will contain an alphanumerically sorted, nested list of all the Markdown files found within the docs_dir and its sub-directories. Index files will always be listed first within a sub-section.","title":"nav"},{"location":"user-guide/configuration/#build-directories","text":"","title":"Build directories"},{"location":"user-guide/configuration/#theme","text":"Sets the theme and theme specific configuration of your documentation site. May be either a string or a set of key/value pairs. If a string, it must be the string name of a known installed theme. For a list of available themes visit Choosing Your Theme . An example set of key/value pairs might look something like this: theme: name: mkdocs locale: en custom_dir: my_theme_customizations/ static_templates: - sitemap.html include_sidebar: false If a set of key/value pairs, the following nested keys can be defined: Block","title":"theme"},{"location":"user-guide/configuration/#name","text":"The string name of a known installed theme. For a list of available themes visit Choosing Your Theme .","title":"name"},{"location":"user-guide/configuration/#locale","text":"A code representing the language of your site. See Localizing your theme for details.","title":"locale"},{"location":"user-guide/configuration/#custom_dir","text":"A directory containing a custom theme. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file or it can be an absolute directory path from the root of your local file system. See Customizing Your Theme for details if you would like to tweak an existing theme. See the Theme Developer Guide if you would like to build your own theme from the ground up.","title":"custom_dir"},{"location":"user-guide/configuration/#static_templates","text":"A list of templates to render as static pages. The templates must be located in either the theme's template directory or in the custom_dir defined in the theme configuration.","title":"static_templates"},{"location":"user-guide/configuration/#theme-specific-keywords","text":"Any additional keywords supported by the theme can also be defined. See the documentation for the theme you are using for details. default : 'mkdocs'","title":"(theme specific keywords)"},{"location":"user-guide/configuration/#docs_dir","text":"The directory containing the documentation source markdown files. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'docs'","title":"docs_dir"},{"location":"user-guide/configuration/#site_dir","text":"The directory where the output HTML and other files are created. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'site' Note If you are using source code control you will normally want to ensure that your build output files are not committed into the repository, and only keep the source files under version control. For example, if using git you might add the following line to your .gitignore file: site/ If you're using another source code control tool, you'll want to check its documentation on how to ignore specific directories.","title":"site_dir"},{"location":"user-guide/configuration/#extra_css","text":"Set a list of CSS files in your docs_dir to be included by the theme. For example, the following example will include the extra.css file within the css subdirectory in your docs_dir . extra_css: - css/extra.css - css/second_extra.css default : [] (an empty list).","title":"extra_css"},{"location":"user-guide/configuration/#extra_javascript","text":"Set a list of JavaScript files in your docs_dir to be included by the theme. See the example in extra_css for usage. default : [] (an empty list).","title":"extra_javascript"},{"location":"user-guide/configuration/#extra_templates","text":"Set a list of templates in your docs_dir to be built by MkDocs. To see more about writing templates for MkDocs read the documentation about [custom themes] and specifically the section about the [available variables] to templates. See the example in extra_css for usage. default : [] (an empty list).","title":"extra_templates"},{"location":"user-guide/configuration/#extra","text":"A set of key-value pairs, where the values can be any valid YAML construct, that will be passed to the template. This allows for great flexibility when creating custom themes. For example, if you are using a theme that supports displaying the project version, you can pass it to the theme like this: extra: version: 1.0 default : By default extra will be an empty key-value mapping.","title":"extra"},{"location":"user-guide/configuration/#preview-controls","text":"","title":"Preview controls"},{"location":"user-guide/configuration/#live-reloading","text":"","title":"Live Reloading"},{"location":"user-guide/configuration/#watch","text":"Determines additional directories to watch when running mkdocs serve . Configuration is a YAML list. watch: - directory_a - directory_b Allows a custom default to be set without the need to pass it through the -w / --watch option every time the mkdocs serve command is called. Note The paths provided via the configuration file are relative to the configuration file. The paths provided via the -w / --watch CLI parameters are not.","title":"watch"},{"location":"user-guide/configuration/#use_directory_urls","text":"This setting controls the style used for linking to pages within the documentation. The following table demonstrates how the URLs used on the site differ when setting use_directory_urls to true or false . Source file use_directory_urls: true use_directory_urls: false index.md / /index.html api-guide.md /api-guide/ /api-guide.html about/license.md /about/license/ /about/license.html The default style of use_directory_urls: true creates more user friendly URLs, and is usually what you'll want to use. The alternate style can be useful if you want your documentation to remain properly linked when opening pages directly from the file system, because it creates links that point directly to the target file rather than the target directory . default : true","title":"use_directory_urls"},{"location":"user-guide/configuration/#strict","text":"Determines how warnings are handled. Set to true to halt processing when a warning is raised. Set to false to print a warning and continue processing. This is also available as a command line flag: --strict . default : false","title":"strict"},{"location":"user-guide/configuration/#dev_addr","text":"Determines the address used when running mkdocs serve . Must be of the format IP:PORT . Allows a custom default to be set without the need to pass it through the --dev-addr option every time the mkdocs serve command is called. default : '127.0.0.1:8000' See also: site_url .","title":"dev_addr"},{"location":"user-guide/configuration/#formatting-options","text":"","title":"Formatting options"},{"location":"user-guide/configuration/#markdown_extensions","text":"MkDocs uses the Python Markdown library to translate Markdown files into HTML. Python Markdown supports a variety of extensions that customize how pages are formatted. This setting lets you enable a list of extensions beyond the ones that MkDocs uses by default ( meta , toc , tables , and fenced_code ). For example, to enable the SmartyPants typography extension , use: markdown_extensions: - smarty Some extensions provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given extension supports. See the documentation for the extension you are using to determine what options they support. For example, to enable permalinks in the (included) toc extension, use: markdown_extensions: - toc: permalink: True Note that a colon ( : ) must follow the extension name ( toc ) and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single extension, each option must be defined on a separate line: markdown_extensions: - toc: permalink: True separator: \"_\" Add an additional item to the list for each extension. If you have no configuration options to set for a specific extension, then simply omit options for that extension: markdown_extensions: - smarty - toc: permalink: True - sane_lists In the above examples, each extension is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for extensions for which no options are defined. Therefore, the last example above could also be defined as follows: markdown_extensions: smarty: {} toc: permalink: True sane_lists: {} This alternative syntax is required if you intend to override some options via inheritance . See Also: The Python-Markdown documentation provides a list of extensions which are available out-of-the-box. For a list of configuration options available for a given extension, see the documentation for that extension. You may also install and use various third party extensions ( Python-Markdown wiki , Best-of-MkDocs ). Consult the documentation provided by those extensions for installation instructions and available configuration options. default : [] (an empty list).","title":"markdown_extensions"},{"location":"user-guide/configuration/#hooks","text":"New in version 1.4 A list of paths to Python scripts (relative to mkdocs.yml ) that are loaded and used as plugin instances. For example: hooks: - my_hooks.py Then the file my_hooks.py can contain any plugin event handlers (without self ), e.g.: def on_page_markdown(markdown, **kwargs): return markdown.replace('a', 'z') Advanced example: This produces warnings based on the Markdown content (and warnings are fatal in strict mode): import logging, re import mkdocs.plugins log = logging.getLogger('mkdocs') @mkdocs.plugins.event_priority(-50) def on_page_markdown(markdown, page, **kwargs): path = page.file.src_uri for m in re.finditer(r'\\bhttp://[^) ]+', markdown): log.warning(f\"Documentation file '{path}' contains a non-HTTPS link: {m[0]}\") This does not enable any new abilities compared to plugins , it only simplifies one-off usages, as these don't need to be installed like plugins do. Note that for mkdocs serve the hook module will not be reloaded on each build. You might have seen this feature in the mkdocs-simple-hooks plugin . If using standard method names, it can be directly replaced, e.g.: -plugins: - - mkdocs-simple-hooks: - hooks: - on_page_markdown: 'my_hooks:on_page_markdown' +hooks: + - my_hooks.py","title":"hooks"},{"location":"user-guide/configuration/#plugins","text":"A list of plugins (with optional configuration settings) to use when building the site. See the Plugins documentation for full details. If the plugins config setting is defined in the mkdocs.yml config file, then any defaults (such as search ) are ignored and you need to explicitly re-enable the defaults if you would like to continue using them: plugins: - search - your_other_plugin To define options for a given plugin, use a nested set of key/value pairs: plugins: - search - your_other_plugin: option1: value option2: other value In the above examples, each plugin is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for plugins for which no options are defined. Therefore, the last example above could also be defined as follows: plugins: search: {} your_other_plugin: option1: value option2: other value This alternative syntax is required if you intend to override some options via inheritance . To completely disable all plugins, including any defaults, set the plugins setting to an empty list: plugins: [] default : ['search'] (the \"search\" plugin included with MkDocs).","title":"plugins"},{"location":"user-guide/configuration/#search","text":"A search plugin is provided by default with MkDocs which uses lunr.js as a search engine. The following config options are available to alter the behavior of the search plugin:","title":"Search"},{"location":"user-guide/configuration/#separator","text":"A regular expression which matches the characters used as word separators when building the index. By default whitespace and the hyphen ( - ) are used. To add the dot ( . ) as a word separator you might do this: plugins: - search: separator: '[\\s\\-\\.]+' default : '[\\s\\-]+'","title":"separator"},{"location":"user-guide/configuration/#min_search_length","text":"An integer value that defines the minimum length for a search query. By default searches shorter than 3 chars in length are ignored as search result quality with short search terms are poor. However, for some use cases (such as documentation about Message Queues which might generate searches for 'MQ') it may be preferable to set a shorter limit. plugins: - search: min_search_length: 2 default : 3","title":"min_search_length"},{"location":"user-guide/configuration/#lang","text":"A list of languages to use when building the search index as identified by their ISO 639-1 language codes. With Lunr Languages , the following languages are supported: ar : Arabic da : Danish nl : Dutch en : English fi : Finnish fr : French de : German hu : Hungarian it : Italian ja : Japanese no : Norwegian pt : Portuguese ro : Romanian ru : Russian es : Spanish sv : Swedish th : Thai tr : Turkish vi : Vietnamese You may contribute additional languages . Warning While search does support using multiple languages together, it is best not to add additional languages unless you really need them. Each additional language adds significant bandwidth requirements and uses more browser resources. Generally, it is best to keep each instance of MkDocs to a single language. Note Lunr Languages does not currently include support for Chinese or other Asian languages. However, some users have reported decent results using Japanese. default : The value of theme.locale if set, otherwise [en] .","title":"lang"},{"location":"user-guide/configuration/#prebuild_index","text":"Optionally generates a pre-built index of all pages, which provides some performance improvements for larger sites. Before enabling, confirm that the theme you are using explicitly supports using a prebuilt index (the builtin themes do). Set to true to enable. Warning This option requires that Node.js be installed and the command node be on the system path. If the call to node fails for any reason, a warning is issued and the build continues uninterrupted. You may use the --strict flag when building to cause such a failure to raise an error instead. Note On smaller sites, using a pre-built index is not recommended as it creates a significant increase is bandwidth requirements with little to no noticeable improvement to your users. However, for larger sites (hundreds of pages), the bandwidth increase is relatively small and your users will notice a significant improvement in search performance. default : False","title":"prebuild_index"},{"location":"user-guide/configuration/#indexing","text":"Configures what strategy the search indexer will use when building the index for your pages. This property is particularly useful if your project is large in scale, and the index takes up an enormous amount of disk space. plugins: - search: indexing: 'full'","title":"indexing"},{"location":"user-guide/configuration/#options","text":"Option Description full Indexes the title, section headings, and full text of each page. sections Indexes the title and section headings of each page. titles Indexes only the title of each page. default : full","title":"Options"},{"location":"user-guide/configuration/#environment-variables","text":"In most cases, the value of a configuration option is set directly in the configuration file. However, as an option, the value of a configuration option may be set to the value of an environment variable using the !ENV tag. For example, to set the value of the site_name option to the value of the variable SITE_NAME the YAML file may contain the following: site_name: !ENV SITE_NAME If the environment variable is not defined, then the configuration setting would be assigned a null (or None in Python) value. A default value can be defined as the last value in a list. Like this: site_name: !ENV [SITE_NAME, 'My default site name'] Multiple fallback variables can be used as well. Note that the last value is not an environment variable, but must be a value to use as a default if none of the specified environment variables are defined. site_name: !ENV [SITE_NAME, OTHER_NAME, 'My default site name'] Simple types defined within an environment variable such as string, bool, integer, float, datestamp and null are parsed as if they were defined directly in the YAML file, which means that the value will be converted to the appropriate type. However, complex types such as lists and key/value pairs cannot be defined within a single environment variable. For more details, see the pyyaml_env_tag project.","title":"Environment Variables"},{"location":"user-guide/configuration/#configuration-inheritance","text":"Generally, a single file would hold the entire configuration for a site. However, some organizations may maintain multiple sites which all share a common configuration across them. Rather than maintaining separate configurations for each, the common configuration options can be defined in a parent configuration file which each site's primary configuration file inherits. To define the parent for a configuration file, set the INHERIT (all caps) key to the path of the parent file. The path must be relative to the location of the primary file. For configuration options to be merged with a parent configuration, those options must be defined as key/value pairs. Specifically, the markdown_extensions and plugins options must use the alternative syntax which does not use list items (lines which start with - ). For example, suppose the common (parent) configuration is defined in base.yml : theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Then, for the \"foo\" site, the primary configuration file would be defined at foo/mkdocs.yml : INHERIT: ../base.yml site_name: Foo Project site_url: https://example.com/foo When running mkdocs build , the file at foo/mkdocs.yml would be passed in as the configuration file. MkDocs will then parse that file, retrieve and parse the parent file base.yml and deep merge the two. This would result in MkDocs receiving the following merged configuration: site_name: Foo Project site_url: https://example.com/foo theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Deep merging allows you to add and/or override various values in your primary configuration file. For example, suppose for one site you wanted to add support for definition lists, use a different symbol for permalinks, and define a different separator. In that site's primary configuration file you could do: INHERIT: ../base.yml site_name: Bar Project site_url: https://example.com/bar markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" In that case, the above configuration would be deep merged with base.yml and result in the following configuration: site_name: Bar Project site_url: https://example.com/bar theme: name: mkdocs locale: en highlightjs: true markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" admonition: {} Notice that the admonition extension was retained from the parent configuration, the def_list extension was added, the value of toc.permalink was replaced, and the value of toc.separator was added. You can replace or merge the value of any key. However, any non-key is always replaced. Therefore, you cannot append items to a list. You must redefine the entire list. As the nav configuration is made up of nested lists, this means that you cannot merge navigation items. Of course, you can replace the entire nav configuration with a new one. However, it is generally expected that the entire navigation would be defined in the primary configuration file for a project. Warning As a reminder, all path based configuration options must be relative to the primary configuration file and MkDocs does not alter the paths when merging. Therefore, defining paths in a parent file which is inherited by multiple different sites may not work as expected. It is generally best to define path based options in the primary configuration file only.","title":"Configuration Inheritance"},{"location":"user-guide/customizing-your-theme/","text":"Customizing Your Theme Altering a theme to suit your needs. If you would like to make a few tweaks to an existing theme, there is no need to create your own theme from scratch. For minor tweaks which only require some CSS and/or JavaScript, you can use the docs_dir . However, for more complex customizations, including overriding templates, you will need to use the theme custom_dir setting. Using the docs_dir The extra_css and extra_javascript configuration options can be used to make tweaks and customizations to existing themes. To use these, you simply need to include either CSS or JavaScript files within your documentation directory . For example, to change the color of the headers in your documentation, create a file called extra.css and place it next to the documentation Markdown. In that file add the following CSS. h1 { color: red; } Note If you are deploying your documentation with ReadTheDocs , you will need to explicitly list the CSS and JavaScript files you want to include in your config. To do this, add the following to your mkdocs.yml. extra_css: [extra.css] After making these changes, they should be visible when you run mkdocs serve - if you already had this running, you should see that the CSS changes were automatically picked up and the documentation will be updated. Note Any extra CSS or JavaScript files will be added to the generated HTML document after the page content. If you desire to include a JavaScript library, you may have better success including the library by using the theme custom_dir . Using the theme custom_dir The theme.custom_dir configuration option can be used to point to a directory of files which override the files in a parent theme. The parent theme would be the theme defined in the theme.name configuration option. Any file in the custom_dir with the same name as a file in the parent theme will replace the file of the same name in the parent theme. Any additional files in the custom_dir will be added to the parent theme. The contents of the custom_dir should mirror the directory structure of the parent theme. You may include templates, JavaScript files, CSS files, images, fonts, or any other media included in a theme. Note For this to work, the theme.name setting must be set to a known installed theme. If the name setting is instead set to null (or not defined), then there is no theme to override and the contents of the custom_dir must be a complete, standalone theme. See the Theme Developer Guide for more information. For example, the mkdocs theme ( browse source ), contains the following directory structure (in part): - css\\ - fonts\\ - img\\ - favicon.ico - grid.png - js\\ - 404.html - base.html - content.html - nav-sub.html - nav.html - toc.html To override any of the files contained in that theme, create a new directory next to your docs_dir : mkdir custom_theme And then point your mkdocs.yml configuration file at the new directory: theme: name: mkdocs custom_dir: custom_theme/ To override the 404 error page (\"file not found\"), add a new template file named 404.html to the custom_theme directory. For information on what can be included in a template, review the Theme Developer Guide . To override the favicon, you can add a new icon file at custom_theme/img/favicon.ico . To include a JavaScript library, copy the library to the custom_theme/js/ directory. Your directory structure should now look like this: - docs/ - index.html - custom_theme/ - img/ - favicon.ico - js/ - somelib.js - 404.html - config.yml Note Any files included in the parent theme (defined in name ) but not included in the custom_dir will still be utilized. The custom_dir will only override/replace files in the parent theme. If you want to remove files, or build a theme from scratch, then you should review the Theme Developer Guide . Overriding Template Blocks The built-in themes implement many of their parts inside template blocks which can be individually overridden in the main.html template. Simply create a main.html template file in your custom_dir and define replacement blocks within that file. Just make sure that the main.html extends base.html . For example, to alter the title of the MkDocs theme, your replacement main.html template would contain the following: {% extends \"base.html\" %} {% block htmltitle %} Custom title goes here {% endblock %} In the above example, the htmltitle block defined in your custom main.html file will be used in place of the default htmltitle block defined in the parent theme. You may re-define as many blocks as you desire, as long as those blocks are defined in the parent. For example, you could replace the Google Analytics script with one for a different service or replace the search feature with your own. You will need to consult the parent theme you are using to determine what blocks are available to override. The MkDocs and ReadTheDocs themes provide the following blocks: site_meta : Contains meta tags in the document head. htmltitle : Contains the page title in the document head. styles : Contains the link tags for stylesheets. libs : Contains the JavaScript libraries (jQuery, etc) included in the page header. scripts : Contains JavaScript scripts which should execute after a page loads. analytics : Contains the analytics script. extrahead : An empty block in the to insert custom tags/scripts/etc. site_name : Contains the site name in the navigation bar. site_nav : Contains the site navigation in the navigation bar. search_button : Contains the search box in the navigation bar. next_prev : Contains the next and previous buttons in the navigation bar. repo : Contains the repository link in the navigation bar. content : Contains the page content and table of contents for the page. footer : Contains the page footer. You may need to view the source template files to ensure your modifications will work with the structure of the site. See Template Variables for a list of variables you can use within your custom blocks. For a more complete explanation of blocks, consult the Jinja documentation . Combining the custom_dir and Template Blocks Adding a JavaScript library to the custom_dir will make it available, but won't include it in the pages generated by MkDocs. Therefore, a link needs to be added to the library from the HTML. Starting the with directory structure above (truncated): - docs/ - custom_theme/ - js/ - somelib.js - config.yml A link to the custom_theme/js/somelib.js file needs to be added to the template. As somelib.js is a JavaScript library, it would logically go in the libs block. However, a new libs block that only includes the new script will replace the block defined in the parent template and any links to libraries in the parent template will be removed. To avoid breaking the template, a super block can be used with a call to super from within the block: {% extends \"base.html\" %} {% block libs %} {{ super() }} {% endblock %} Note that the base_url template variable was used to ensure that the link is always relative to the current page. Now the generated pages will include links to the template provided libraries as well as the library included in the custom_dir . The same would be required for any additional CSS files included in the custom_dir .","title":"Customizing"},{"location":"user-guide/customizing-your-theme/#customizing-your-theme","text":"Altering a theme to suit your needs. If you would like to make a few tweaks to an existing theme, there is no need to create your own theme from scratch. For minor tweaks which only require some CSS and/or JavaScript, you can use the docs_dir . However, for more complex customizations, including overriding templates, you will need to use the theme custom_dir setting.","title":"Customizing Your Theme"},{"location":"user-guide/customizing-your-theme/#using-the-docs_dir","text":"The extra_css and extra_javascript configuration options can be used to make tweaks and customizations to existing themes. To use these, you simply need to include either CSS or JavaScript files within your documentation directory . For example, to change the color of the headers in your documentation, create a file called extra.css and place it next to the documentation Markdown. In that file add the following CSS. h1 { color: red; } Note If you are deploying your documentation with ReadTheDocs , you will need to explicitly list the CSS and JavaScript files you want to include in your config. To do this, add the following to your mkdocs.yml. extra_css: [extra.css] After making these changes, they should be visible when you run mkdocs serve - if you already had this running, you should see that the CSS changes were automatically picked up and the documentation will be updated. Note Any extra CSS or JavaScript files will be added to the generated HTML document after the page content. If you desire to include a JavaScript library, you may have better success including the library by using the theme custom_dir .","title":"Using the docs_dir"},{"location":"user-guide/customizing-your-theme/#using-the-theme-custom_dir","text":"The theme.custom_dir configuration option can be used to point to a directory of files which override the files in a parent theme. The parent theme would be the theme defined in the theme.name configuration option. Any file in the custom_dir with the same name as a file in the parent theme will replace the file of the same name in the parent theme. Any additional files in the custom_dir will be added to the parent theme. The contents of the custom_dir should mirror the directory structure of the parent theme. You may include templates, JavaScript files, CSS files, images, fonts, or any other media included in a theme. Note For this to work, the theme.name setting must be set to a known installed theme. If the name setting is instead set to null (or not defined), then there is no theme to override and the contents of the custom_dir must be a complete, standalone theme. See the Theme Developer Guide for more information. For example, the mkdocs theme ( browse source ), contains the following directory structure (in part): - css\\ - fonts\\ - img\\ - favicon.ico - grid.png - js\\ - 404.html - base.html - content.html - nav-sub.html - nav.html - toc.html To override any of the files contained in that theme, create a new directory next to your docs_dir : mkdir custom_theme And then point your mkdocs.yml configuration file at the new directory: theme: name: mkdocs custom_dir: custom_theme/ To override the 404 error page (\"file not found\"), add a new template file named 404.html to the custom_theme directory. For information on what can be included in a template, review the Theme Developer Guide . To override the favicon, you can add a new icon file at custom_theme/img/favicon.ico . To include a JavaScript library, copy the library to the custom_theme/js/ directory. Your directory structure should now look like this: - docs/ - index.html - custom_theme/ - img/ - favicon.ico - js/ - somelib.js - 404.html - config.yml Note Any files included in the parent theme (defined in name ) but not included in the custom_dir will still be utilized. The custom_dir will only override/replace files in the parent theme. If you want to remove files, or build a theme from scratch, then you should review the Theme Developer Guide .","title":"Using the theme custom_dir"},{"location":"user-guide/customizing-your-theme/#overriding-template-blocks","text":"The built-in themes implement many of their parts inside template blocks which can be individually overridden in the main.html template. Simply create a main.html template file in your custom_dir and define replacement blocks within that file. Just make sure that the main.html extends base.html . For example, to alter the title of the MkDocs theme, your replacement main.html template would contain the following: {% extends \"base.html\" %} {% block htmltitle %}Custom title goes here {% endblock %} In the above example, the htmltitle block defined in your custom main.html file will be used in place of the default htmltitle block defined in the parent theme. You may re-define as many blocks as you desire, as long as those blocks are defined in the parent. For example, you could replace the Google Analytics script with one for a different service or replace the search feature with your own. You will need to consult the parent theme you are using to determine what blocks are available to override. The MkDocs and ReadTheDocs themes provide the following blocks: site_meta : Contains meta tags in the document head. htmltitle : Contains the page title in the document head. styles : Contains the link tags for stylesheets. libs : Contains the JavaScript libraries (jQuery, etc) included in the page header. scripts : Contains JavaScript scripts which should execute after a page loads. analytics : Contains the analytics script. extrahead : An empty block in the to insert custom tags/scripts/etc. site_name : Contains the site name in the navigation bar. site_nav : Contains the site navigation in the navigation bar. search_button : Contains the search box in the navigation bar. next_prev : Contains the next and previous buttons in the navigation bar. repo : Contains the repository link in the navigation bar. content : Contains the page content and table of contents for the page. footer : Contains the page footer. You may need to view the source template files to ensure your modifications will work with the structure of the site. See Template Variables for a list of variables you can use within your custom blocks. For a more complete explanation of blocks, consult the Jinja documentation .","title":"Overriding Template Blocks"},{"location":"user-guide/customizing-your-theme/#combining-the-custom_dir-and-template-blocks","text":"Adding a JavaScript library to the custom_dir will make it available, but won't include it in the pages generated by MkDocs. Therefore, a link needs to be added to the library from the HTML. Starting the with directory structure above (truncated): - docs/ - custom_theme/ - js/ - somelib.js - config.yml A link to the custom_theme/js/somelib.js file needs to be added to the template. As somelib.js is a JavaScript library, it would logically go in the libs block. However, a new libs block that only includes the new script will replace the block defined in the parent template and any links to libraries in the parent template will be removed. To avoid breaking the template, a super block can be used with a call to super from within the block: {% extends \"base.html\" %} {% block libs %} {{ super() }} {% endblock %} Note that the base_url template variable was used to ensure that the link is always relative to the current page. Now the generated pages will include links to the template provided libraries as well as the library included in the custom_dir . The same would be required for any additional CSS files included in the custom_dir .","title":"Combining the custom_dir and Template Blocks"},{"location":"user-guide/deploying-your-docs/","text":"Deploying your docs A basic guide to deploying your docs to various hosting providers GitHub Pages If you host the source code for a project on GitHub , you can easily use GitHub Pages to host the documentation for your project. There are two basic types of GitHub Pages sites: Project Pages sites, and User and Organization Pages sites. They are nearly identical but have some important differences, which require a different work flow when deploying. Project Pages Project Pages sites are simpler as the site files get deployed to a branch within the project repository ( gh-pages by default). After you checkout the primary working branch (usually master ) of the git repository where you maintain the source documentation for your project, run the following command: mkdocs gh-deploy That's it! Behind the scenes, MkDocs will build your docs and use the ghp-import tool to commit them to the gh-pages branch and push the gh-pages branch to GitHub. Use mkdocs gh-deploy --help to get a full list of options available for the gh-deploy command. Be aware that you will not be able to review the built site before it is pushed to GitHub. Therefore, you may want to verify any changes you make to the docs beforehand by using the build or serve commands and reviewing the built files locally. Warning You should never edit files in your pages repository by hand if you're using the gh-deploy command because you will lose your work the next time you run the command. Warning If there are untracked files or uncommitted work in the local repository where mkdocs gh-deploy is run, these will be included in the pages that are deployed. Organization and User Pages User and Organization Pages sites are not tied to a specific project, and the site files are deployed to the master branch in a dedicated repository named with the GitHub account name. Therefore, you need working copies of two repositories on our local system. For example, consider the following file structure: my-project/ mkdocs.yml docs/ orgname.github.io/ After making and verifying updates to your project you need to change directories to the orgname.github.io repository and call the mkdocs gh-deploy command from there: cd ../orgname.github.io/ mkdocs gh-deploy --config-file ../my-project/mkdocs.yml --remote-branch master Note that you need to explicitly point to the mkdocs.yml configuration file as it is no longer in the current working directory. You also need to inform the deploy script to commit to the master branch. You may override the default with the remote_branch configuration setting, but if you forget to change directories before running the deploy script, it will commit to the master branch of your project, which you probably don't want. Custom Domains GitHub Pages includes support for using a Custom Domain for your site. In addition to the steps documented by GitHub, you need to take one additional step so that MkDocs will work with your custom domain. You need to add a CNAME file to the root of your docs_dir . The file must contain a single bare domain or subdomain on a single line (see MkDocs' own CNAME file as an example). You may create the file manually, or use GitHub's web interface to set up the custom domain (under Settings / Custom Domain). If you use the web interface, GitHub will create the CNAME file for you and save it to the root of your \"pages\" branch. So that the file does not get removed the next time you deploy, you need to copy the file to your docs_dir . With the file properly included in your docs_dir , MkDocs will include the file in your built site and push it to your \"pages\" branch each time you run the gh-deploy command. If you are having problems getting a custom domain to work, see GitHub's documentation on Troubleshooting custom domains . Read the Docs Read the Docs offers free documentation hosting. You can import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. Read the Docs supports MkDocs out-of-the-box. Follow the instructions on their site to arrange the files in your repository properly, create an account and point it at your publicly hosted repository. If properly configured, your documentation will update each time you push commits to your public repository. Note To benefit from all of the features offered by Read the Docs, you will need to use the Read the Docs theme which ships with MkDocs. The various themes which may be referenced in Read the Docs' documentation are Sphinx specific themes and will not work with MkDocs. Other Providers Any hosting provider which can serve static files can be used to serve documentation generated by MkDocs. While it would be impossible to document how to upload the docs to every hosting provider out there, the following guidelines should provide some general assistance. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory to the root directory of your hosting provider's server. Depending on your hosting provider's setup, you may need to use a graphical or command line ftp , ssh or scp client to transfer the files. For example, a typical set of commands from the command line might look something like this: mkdocs build scp -r ./site user@host:/path/to/server/root Of course, you will need to replace user with the username you have with your hosting provider and host with the appropriate domain name. Additionally, you will need to adjust the /path/to/server/root to match the configuration of your hosts' file system. See your host's documentation for specifics. You will likely want to search their documentation for \"ftp\" or \"uploading site\". Local Files Rather than hosting your documentation on a server, you may instead distribute the files directly, which can then be viewed in a browser using the file:// scheme. Note that, due to the security settings of all modern browsers, some things will not work the same and some features may not work at all. In fact, a few settings will need to be customized in very specific ways. site_url : The site_url must be set to an empty string, which instructs MkDocs to build your site so that it will work with the file:// scheme. site_url: \"\" use_directory_urls : Set use_directory_urls to false . Otherwise, internal links between pages will not work properly. use_directory_urls: false search : You will need to either disable the search plugin, or use a third-party search plugin which is specifically designed to work with the file:// scheme. To disable all plugins, set the plugins setting to an empty list. plugins: [] If you have other plugins enabled, simply ensure that search is not included in the list. When writing your documentation, it is imperative that all internal links use relative URLs as documented . Remember, each reader of your documentation will be using a different device and the files will likely be in a different location on that device. If you expect your documentation to be viewed off-line, you may also need to be careful about which themes you choose. Many themes make use of CDNs for various support files, which require a live Internet connection. You will need to choose a theme which includes all support files directly in the theme. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory and distribute it to your readers. Alternatively, you may choose to use a third party tool to convert the HTML files to some other documentation format. 404 Pages When MkDocs builds the documentation it will include a 404.html file in the build directory . This file will be automatically used when deploying to GitHub but only on a custom domain. Other web servers may be configured to use it but the feature won't always be available. See the documentation for your server of choice for more information.","title":"Deploying"},{"location":"user-guide/deploying-your-docs/#deploying-your-docs","text":"A basic guide to deploying your docs to various hosting providers","title":"Deploying your docs"},{"location":"user-guide/deploying-your-docs/#github-pages","text":"If you host the source code for a project on GitHub , you can easily use GitHub Pages to host the documentation for your project. There are two basic types of GitHub Pages sites: Project Pages sites, and User and Organization Pages sites. They are nearly identical but have some important differences, which require a different work flow when deploying.","title":"GitHub Pages"},{"location":"user-guide/deploying-your-docs/#project-pages","text":"Project Pages sites are simpler as the site files get deployed to a branch within the project repository ( gh-pages by default). After you checkout the primary working branch (usually master ) of the git repository where you maintain the source documentation for your project, run the following command: mkdocs gh-deploy That's it! Behind the scenes, MkDocs will build your docs and use the ghp-import tool to commit them to the gh-pages branch and push the gh-pages branch to GitHub. Use mkdocs gh-deploy --help to get a full list of options available for the gh-deploy command. Be aware that you will not be able to review the built site before it is pushed to GitHub. Therefore, you may want to verify any changes you make to the docs beforehand by using the build or serve commands and reviewing the built files locally. Warning You should never edit files in your pages repository by hand if you're using the gh-deploy command because you will lose your work the next time you run the command. Warning If there are untracked files or uncommitted work in the local repository where mkdocs gh-deploy is run, these will be included in the pages that are deployed.","title":"Project Pages"},{"location":"user-guide/deploying-your-docs/#organization-and-user-pages","text":"User and Organization Pages sites are not tied to a specific project, and the site files are deployed to the master branch in a dedicated repository named with the GitHub account name. Therefore, you need working copies of two repositories on our local system. For example, consider the following file structure: my-project/ mkdocs.yml docs/ orgname.github.io/ After making and verifying updates to your project you need to change directories to the orgname.github.io repository and call the mkdocs gh-deploy command from there: cd ../orgname.github.io/ mkdocs gh-deploy --config-file ../my-project/mkdocs.yml --remote-branch master Note that you need to explicitly point to the mkdocs.yml configuration file as it is no longer in the current working directory. You also need to inform the deploy script to commit to the master branch. You may override the default with the remote_branch configuration setting, but if you forget to change directories before running the deploy script, it will commit to the master branch of your project, which you probably don't want.","title":"Organization and User Pages"},{"location":"user-guide/deploying-your-docs/#custom-domains","text":"GitHub Pages includes support for using a Custom Domain for your site. In addition to the steps documented by GitHub, you need to take one additional step so that MkDocs will work with your custom domain. You need to add a CNAME file to the root of your docs_dir . The file must contain a single bare domain or subdomain on a single line (see MkDocs' own CNAME file as an example). You may create the file manually, or use GitHub's web interface to set up the custom domain (under Settings / Custom Domain). If you use the web interface, GitHub will create the CNAME file for you and save it to the root of your \"pages\" branch. So that the file does not get removed the next time you deploy, you need to copy the file to your docs_dir . With the file properly included in your docs_dir , MkDocs will include the file in your built site and push it to your \"pages\" branch each time you run the gh-deploy command. If you are having problems getting a custom domain to work, see GitHub's documentation on Troubleshooting custom domains .","title":"Custom Domains"},{"location":"user-guide/deploying-your-docs/#read-the-docs","text":"Read the Docs offers free documentation hosting. You can import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. Read the Docs supports MkDocs out-of-the-box. Follow the instructions on their site to arrange the files in your repository properly, create an account and point it at your publicly hosted repository. If properly configured, your documentation will update each time you push commits to your public repository. Note To benefit from all of the features offered by Read the Docs, you will need to use the Read the Docs theme which ships with MkDocs. The various themes which may be referenced in Read the Docs' documentation are Sphinx specific themes and will not work with MkDocs.","title":"Read the Docs"},{"location":"user-guide/deploying-your-docs/#other-providers","text":"Any hosting provider which can serve static files can be used to serve documentation generated by MkDocs. While it would be impossible to document how to upload the docs to every hosting provider out there, the following guidelines should provide some general assistance. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory to the root directory of your hosting provider's server. Depending on your hosting provider's setup, you may need to use a graphical or command line ftp , ssh or scp client to transfer the files. For example, a typical set of commands from the command line might look something like this: mkdocs build scp -r ./site user@host:/path/to/server/root Of course, you will need to replace user with the username you have with your hosting provider and host with the appropriate domain name. Additionally, you will need to adjust the /path/to/server/root to match the configuration of your hosts' file system. See your host's documentation for specifics. You will likely want to search their documentation for \"ftp\" or \"uploading site\".","title":"Other Providers"},{"location":"user-guide/deploying-your-docs/#local-files","text":"Rather than hosting your documentation on a server, you may instead distribute the files directly, which can then be viewed in a browser using the file:// scheme. Note that, due to the security settings of all modern browsers, some things will not work the same and some features may not work at all. In fact, a few settings will need to be customized in very specific ways. site_url : The site_url must be set to an empty string, which instructs MkDocs to build your site so that it will work with the file:// scheme. site_url: \"\" use_directory_urls : Set use_directory_urls to false . Otherwise, internal links between pages will not work properly. use_directory_urls: false search : You will need to either disable the search plugin, or use a third-party search plugin which is specifically designed to work with the file:// scheme. To disable all plugins, set the plugins setting to an empty list. plugins: [] If you have other plugins enabled, simply ensure that search is not included in the list. When writing your documentation, it is imperative that all internal links use relative URLs as documented . Remember, each reader of your documentation will be using a different device and the files will likely be in a different location on that device. If you expect your documentation to be viewed off-line, you may also need to be careful about which themes you choose. Many themes make use of CDNs for various support files, which require a live Internet connection. You will need to choose a theme which includes all support files directly in the theme. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory and distribute it to your readers. Alternatively, you may choose to use a third party tool to convert the HTML files to some other documentation format.","title":"Local Files"},{"location":"user-guide/deploying-your-docs/#404-pages","text":"When MkDocs builds the documentation it will include a 404.html file in the build directory . This file will be automatically used when deploying to GitHub but only on a custom domain. Other web servers may be configured to use it but the feature won't always be available. See the documentation for your server of choice for more information.","title":"404 Pages"},{"location":"user-guide/installation/","text":"MkDocs Installation A detailed guide. Requirements MkDocs requires a recent version of Python and the Python package manager, pip , to be installed on your system. You can check if you already have these installed from the command line: $ python --version Python 3.8.2 $ pip --version pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) If you already have those packages installed, you may skip down to Installing MkDocs . Installing Python Install Python using your package manager of choice, or by downloading an installer appropriate for your system from python.org and running it. Note If you are installing Python on Windows, be sure to check the box to have Python added to your PATH if the installer offers such an option (it's normally off by default). Installing pip If you're using a recent version of Python, the Python package manager, pip , is most likely installed by default. However, you may need to upgrade pip to the lasted version: pip install --upgrade pip If you need to install pip for the first time, download get-pip.py . Then run the following command to install it: python get-pip.py Installing MkDocs Install the mkdocs package using pip: pip install mkdocs You should now have the mkdocs command installed on your system. Run mkdocs --version to check that everything worked okay. $ mkdocs --version mkdocs, version 1.2.0 from /usr/local/lib/python3.8/site-packages/mkdocs (Python 3.8) Note If you would like manpages installed for MkDocs, the click-man tool can generate and install them for you. Simply run the following two commands: pip install click-man click-man --target path/to/man/pages mkdocs See the click-man documentation for an explanation of why manpages are not automatically generated and installed by pip. Note If you are using Windows, some of the above commands may not work out-of-the-box. A quick solution may be to preface every Python command with python -m like this: python -m pip install mkdocs python -m mkdocs For a more permanent solution, you may need to edit your PATH environment variable to include the Scripts directory of your Python installation. Recent versions of Python include a script to do this for you. Navigate to your Python installation directory (for example C:\\Python38\\ ), open the Tools , then Scripts folder, and run the win_add2path.py file by double clicking on it. Alternatively, you can download the script and run it ( python win_add2path.py ).","title":"Install"},{"location":"user-guide/installation/#mkdocs-installation","text":"A detailed guide.","title":"MkDocs Installation"},{"location":"user-guide/installation/#requirements","text":"MkDocs requires a recent version of Python and the Python package manager, pip , to be installed on your system. You can check if you already have these installed from the command line: $ python --version Python 3.8.2 $ pip --version pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) If you already have those packages installed, you may skip down to Installing MkDocs .","title":"Requirements"},{"location":"user-guide/installation/#installing-python","text":"Install Python using your package manager of choice, or by downloading an installer appropriate for your system from python.org and running it. Note If you are installing Python on Windows, be sure to check the box to have Python added to your PATH if the installer offers such an option (it's normally off by default).","title":"Installing Python"},{"location":"user-guide/installation/#installing-pip","text":"If you're using a recent version of Python, the Python package manager, pip , is most likely installed by default. However, you may need to upgrade pip to the lasted version: pip install --upgrade pip If you need to install pip for the first time, download get-pip.py . Then run the following command to install it: python get-pip.py","title":"Installing pip"},{"location":"user-guide/installation/#installing-mkdocs","text":"Install the mkdocs package using pip: pip install mkdocs You should now have the mkdocs command installed on your system. Run mkdocs --version to check that everything worked okay. $ mkdocs --version mkdocs, version 1.2.0 from /usr/local/lib/python3.8/site-packages/mkdocs (Python 3.8) Note If you would like manpages installed for MkDocs, the click-man tool can generate and install them for you. Simply run the following two commands: pip install click-man click-man --target path/to/man/pages mkdocs See the click-man documentation for an explanation of why manpages are not automatically generated and installed by pip. Note If you are using Windows, some of the above commands may not work out-of-the-box. A quick solution may be to preface every Python command with python -m like this: python -m pip install mkdocs python -m mkdocs For a more permanent solution, you may need to edit your PATH environment variable to include the Scripts directory of your Python installation. Recent versions of Python include a script to do this for you. Navigate to your Python installation directory (for example C:\\Python38\\ ), open the Tools , then Scripts folder, and run the win_add2path.py file by double clicking on it. Alternatively, you can download the script and run it ( python win_add2path.py ).","title":"Installing MkDocs"},{"location":"user-guide/localizing-your-theme/","text":"Localizing Your Theme Display your theme in your preferred language. Note Theme localization only translates the text elements of the theme itself (such as \"next\" and \"previous\" links), not the actual content of your documentation. If you wish to create multilingual documentation, you need to combine theme localization as described here with a third-party internationalization/localization plugin. Installation For theme localization to work, you must use a theme which supports it and enable i18n (internationalization) support by installing mkdocs[i18n] : pip install mkdocs[i18n] Supported locales In most cases a locale is designated by the ISO-639-1 (2-letter) abbreviation for your language. However, a locale may also include a territory (or region or county) code as well. The language and territory must be separated by an underscore. For example, some possible locales for English might include en , en_AU , en_GB , and en_US . For a list of locales supported by the theme you are using, see that theme's documentation. mkdocs readthedocs Warning If you configure a language locale which is not yet supported by the theme that you are using, MkDocs will fall back to the theme's default locale. Usage To specify the locale that MkDocs should use, set the locale parameter of the theme configuration option to the appropriate code. For example, to build the mkdocs theme in French you would use the following in your mkdocs.yml configuration file: theme: name: mkdocs locale: fr Contributing theme translations If a theme has not yet been translated into your language, feel free to contribute a translation using the Translation Guide .","title":"Localizing"},{"location":"user-guide/localizing-your-theme/#localizing-your-theme","text":"Display your theme in your preferred language. Note Theme localization only translates the text elements of the theme itself (such as \"next\" and \"previous\" links), not the actual content of your documentation. If you wish to create multilingual documentation, you need to combine theme localization as described here with a third-party internationalization/localization plugin.","title":"Localizing Your Theme"},{"location":"user-guide/localizing-your-theme/#installation","text":"For theme localization to work, you must use a theme which supports it and enable i18n (internationalization) support by installing mkdocs[i18n] : pip install mkdocs[i18n]","title":"Installation"},{"location":"user-guide/localizing-your-theme/#supported-locales","text":"In most cases a locale is designated by the ISO-639-1 (2-letter) abbreviation for your language. However, a locale may also include a territory (or region or county) code as well. The language and territory must be separated by an underscore. For example, some possible locales for English might include en , en_AU , en_GB , and en_US . For a list of locales supported by the theme you are using, see that theme's documentation. mkdocs readthedocs Warning If you configure a language locale which is not yet supported by the theme that you are using, MkDocs will fall back to the theme's default locale.","title":"Supported locales"},{"location":"user-guide/localizing-your-theme/#usage","text":"To specify the locale that MkDocs should use, set the locale parameter of the theme configuration option to the appropriate code. For example, to build the mkdocs theme in French you would use the following in your mkdocs.yml configuration file: theme: name: mkdocs locale: fr","title":"Usage"},{"location":"user-guide/localizing-your-theme/#contributing-theme-translations","text":"If a theme has not yet been translated into your language, feel free to contribute a translation using the Translation Guide .","title":"Contributing theme translations"},{"location":"user-guide/writing-your-docs/","text":"Writing your docs How to layout and write your Markdown source files. File layout Your documentation source should be written as regular Markdown files (see Writing with Markdown below), and placed in the documentation directory . By default, this directory will be named docs and will exist at the top level of your project, alongside the mkdocs.yml configuration file. The simplest project you can create will look something like this: mkdocs.yml docs/ index.md By convention your project homepage should be named index.md (see Index pages below for details). Any of the following file extensions may be used for your Markdown source files: markdown , mdown , mkdn , mkd , md . All Markdown files included in your documentation directory will be rendered in the built site regardless of any settings. Note Files and directories with names which begin with a dot (for example: .foo.md or .bar/baz.md ) are ignored by MkDocs, which matches the behavior of most web servers. There is no option to override this behavior. You can also create multi-page documentation, by creating several Markdown files: mkdocs.yml docs/ index.md about.md license.md The file layout you use determines the URLs that are used for the generated pages. Given the above layout, pages would be generated for the following URLs: / /about/ /license/ You can also include your Markdown files in nested directories if that better suits your documentation layout. docs/ index.md user-guide/getting-started.md user-guide/configuration-options.md license.md Source files inside nested directories will cause pages to be generated with nested URLs, like so: / /user-guide/getting-started/ /user-guide/configuration-options/ /license/ Any files which are not identified as Markdown files (by their file extension) within the documentation directory are copied by MkDocs to the built site unaltered. See how to link to images and media below for details. Index pages When a directory is requested, by default, most web servers will return an index file (usually named index.html ) contained within that directory if one exists. For that reason, the homepage in all of the examples above has been named index.md , which MkDocs will render to index.html when building the site. Many repository hosting sites provide special treatment for README files by displaying the contents of the README file when browsing the contents of a directory. Therefore, MkDocs will allow you to name your index pages as README.md instead of index.md . In that way, when users are browsing your source code, the repository host can display the index page of that directory as it is a README file. However, when MkDocs renders your site, the file will be renamed to index.html so that the server will serve it as a proper index file. If both an index.md file and a README.md file are found in the same directory, then the index.md file is used and the README.md file is ignored. Configure Pages and Navigation The nav configuration setting in your mkdocs.yml file defines which pages are included in the global site navigation menu as well as the structure of that menu. If not provided, the navigation will be automatically created by discovering all the Markdown files in the documentation directory . An automatically created navigation configuration will always be sorted alphanumerically by file name (except that index files will always be listed first within a sub-section). You will need to manually define your navigation configuration if you would like your navigation menu sorted differently. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. If that option is set to the default value, docs , the source files for the above configuration would be located at docs/index.md and docs/about.md . The above example will result in two navigation items being created at the top level and with their titles inferred from the contents of the Markdown file or, if no title is defined within the file, of the file name. To override the title in the nav setting add a title right before the filename. nav: - Home: 'index.md' - About: 'about.md' Note that if a title is defined for a page in the navigation, that title will be used throughout the site for that page and will override any title defined within the page itself. Navigation sub-sections can be created by listing related pages together under a section title. For example: nav: - Home: 'index.md' - 'User Guide': - 'Writing your docs': 'writing-your-docs.md' - 'Styling your docs': 'styling-your-docs.md' - About: - 'License': 'license.md' - 'Release Notes': 'release-notes.md' With the above configuration we have three top level items: \"Home\", \"User Guide\" and \"About.\" \"Home\" is a link to the homepage for the site. Under the \"User Guide\" section two pages are listed: \"Writing your docs\" and \"Styling your docs.\" Under the \"About\" section two more pages are listed: \"License\" and \"Release Notes.\" Note that a section cannot have a page assigned to it. Sections are only containers for child pages and sub-sections. You may nest sections as deeply as you like. However, be careful that you don't make it too difficult for your users to navigate through the site navigation by over-complicating the nesting. While sections may mirror your directory structure, they do not have to. Any pages not listed in your navigation configuration will still be rendered and included with the built site, however, they will not be linked from the global navigation and will not be included in the previous and next links. Such pages will be \"hidden\" unless linked to directly. Writing with Markdown MkDocs pages must be authored in Markdown , a lightweight markup language which results in easy-to-read, easy-to-write plain text documents that can be converted to valid HTML documents in a predictable manner. MkDocs uses the Python-Markdown library to render Markdown documents to HTML. Python-Markdown is almost completely compliant with the reference implementation , although there are a few very minor differences . In addition to the base Markdown syntax which is common across all Markdown implementations, MkDocs includes support for extending the Markdown syntax with Python-Markdown extensions . See the MkDocs' markdown_extensions configuration setting for details on how to enable extensions. MkDocs includes some extensions by default, which are highlighted below. Internal links MkDocs allows you to interlink your documentation by using regular Markdown links . However, there are a few additional benefits to formatting those links specifically for MkDocs as outlined below. Linking to pages When linking between pages in the documentation you can simply use the regular Markdown linking syntax, including the relative path to the Markdown document you wish to link to. Please see the [project license](license.md) for further details. When the MkDocs build runs, these Markdown links will automatically be transformed into an HTML hyperlink to the appropriate HTML page. Warning Using absolute paths with links is not officially supported. Relative paths are adjusted by MkDocs to ensure they are always relative to the page. Absolute paths are not modified at all. This means that your links using absolute paths might work fine in your local environment but they might break once you deploy them to your production server. If the target documentation file is in another directory you'll need to make sure to include any relative directory path in the link. Please see the [project license](../about/license.md) for further details. The toc extension is used by MkDocs to generate an ID for every header in your Markdown documents. You can use that ID to link to a section within a target document by using an anchor link. The generated HTML will correctly transform the path portion of the link, and leave the anchor portion intact. Please see the [project license](about.md#license) for further details. Note that IDs are created from the text of a header. All text is converted to lowercase and any disallowed characters, including white-space, are converted to dashes. Consecutive dashes are then reduced to a single dash. There are a few configuration settings provided by the toc extension which you can set in your mkdocs.yml configuration file to alter the default behavior: permalink Generate permanent links at the end of each header. Default: False . When set to True the paragraph symbol (\u00b6 or ¶ ) is used as the link text. When set to a string, the provided string is used as the link text. For example, to use the hash symbol ( # ) instead, do: markdown_extensions: - toc: permalink: \"#\" baselevel Base level for headers. Default: 1 . This setting allows the header levels to be automatically adjusted to fit within the hierarchy of your HTML templates. For example, if the Markdown text for a page should not contain any headers higher than level 2 (), do: markdown_extensions: - toc: baselevel: 2 Then any headers in your document would be increased by 1. For example, the header # Header would be rendered as a level 2 header (
) in the HTML output. separator Word separator. Default: - . Character which replaces white-space in generated IDs. If you prefer underscores, then do: markdown_extensions: - toc: separator: \"_\" Note that if you would like to define multiple of the above settings, you must do so under a single toc entry in the markdown_extensions configuration option. markdown_extensions: - toc: permalink: \"#\" baselevel: 2 separator: \"_\" Linking to images and media As well as the Markdown source files, you can also include other file types in your documentation, which will be copied across when generating your documentation site. These might include images and other media. For example, if your project documentation needed to include a GitHub Pages CNAME file and a PNG formatted screenshot image then your file layout might look as follows: mkdocs.yml docs/ CNAME index.md about.md license.md img/ screenshot.png To include images in your documentation source files, simply use any of the regular Markdown image syntaxes: Cupcake indexer is a snazzy new project for indexing small cakes. ![Screenshot](img/screenshot.png) *Above: Cupcake indexer in progress* Your image will now be embedded when you build the documentation, and should also be previewed if you're working on the documentation with a Markdown editor. Linking from raw HTML Markdown allows document authors to fall back to raw HTML when the Markdown syntax does not meets the author's needs. MkDocs does not limit Markdown in this regard. However, as all raw HTML is ignored by the Markdown parser, MkDocs is not able to validate or convert links contained in raw HTML. When including internal links within raw HTML, you will need to manually format the link appropriately for the rendered document. Meta-Data MkDocs includes support for both YAML and MultiMarkdown style meta-data (often called front-matter). Meta-data consists of a series of keywords and values defined at the beginning of a Markdown document, which are stripped from the document prior to it being processing by Python-Markdown. The key/value pairs are passed by MkDocs to the page template. Therefore, if a theme includes support, the values of any keys can be displayed on the page or used to control the page rendering. See your theme's documentation for information about which keys may be supported, if any. In addition to displaying information in a template, MkDocs includes support for a few predefined meta-data keys which can alter the behavior of MkDocs for that specific page. The following keys are supported: template The template to use with the current page. By default, MkDocs uses the main.html template of a theme to render Markdown pages. You can use the template meta-data key to define a different template file for that specific page. The template file must be available on the path(s) defined in the theme's environment. title The \"title\" to use for the document. MkDocs will attempt to determine the title of a document in the following ways, in order: A title defined in the nav configuration setting for a document. A title defined in the title meta-data key of a document. A level 1 Markdown header on the first line of the document body. Please note that Setext-style headers are not supported. The filename of a document. Upon finding a title for a page, MkDoc does not continue checking any additional sources in the above list. YAML Style Meta-Data YAML style meta-data consists of YAML key/value pairs wrapped in YAML style delimiters to mark the start and/or end of the meta-data. The first line of a document must be --- . The meta-data ends at the first line containing an end deliminator (either --- or ... ). The content between the delimiters is parsed as YAML . --- title: My Document summary: A brief description of my document. authors: - Waylan Limberg - Tom Christie date: 2018-07-10 some_url: https://example.com --- This is the first paragraph of the document. YAML is able to detect data types. Therefore, in the above example, the values of title , summary and some_url are strings, the value of authors is a list of strings and the value of date is a datetime.date object. Note that the YAML keys are case sensitive and MkDocs expects keys to be all lowercase. The top level of the YAML must be a collection of key/value pairs, which results in a Python dict being returned. If any other type is returned or the YAML parser encounters an error, then MkDocs does not recognize the section as meta-data, the page's meta attribute will be empty, and the section is not removed from the document. MultiMarkdown Style Meta-Data MultiMarkdown style meta-data uses a format first introduced by the MultiMarkdown project. The data consists of a series of keywords and values defined at the beginning of a Markdown document, like this: Title: My Document Summary: A brief description of my document. Authors: Waylan Limberg Tom Christie Date: January 23, 2018 blank-value: some_url: https://example.com This is the first paragraph of the document. The keywords are case-insensitive and may consist of letters, numbers, underscores and dashes and must end with a colon. The values consist of anything following the colon on the line and may even be blank. If a line is indented by 4 or more spaces, that line is assumed to be an additional line of the value for the previous keyword. A keyword may have as many lines as desired. All lines are joined into a single string. The first blank line ends all meta-data for the document. Therefore, the first line of a document must not be blank. Note MkDocs does not support YAML style delimiters ( --- or ... ) for MultiMarkdown style meta-data. In fact, MkDocs relies on the the presence or absence of the delimiters to determine whether YAML style meta-data or MultiMarkdown style meta-data is being used. If the delimiters are detected, but the content between the delimiters is not valid YAML meta-data, MkDocs does not attempt to parse the content as MultiMarkdown style meta-data. Tables The tables extension adds a basic table syntax to Markdown which is popular across multiple implementations. The syntax is rather simple and is generally only useful for simple tabular data. A simple table looks like this: First Header | Second Header | Third Header ------------ | ------------- | ------------ Content Cell | Content Cell | Content Cell Content Cell | Content Cell | Content Cell If you wish, you can add a leading and tailing pipe to each line of the table: | First Header | Second Header | Third Header | | ------------ | ------------- | ------------ | | Content Cell | Content Cell | Content Cell | | Content Cell | Content Cell | Content Cell | Specify alignment for each column by adding colons to separator lines: First Header | Second Header | Third Header :----------- |:-------------:| -----------: Left | Center | Right Left | Center | Right Note that table cells cannot contain any block level elements and cannot contain multiple lines of text. They can, however, include inline Markdown as defined in Markdown's syntax rules. Additionally, a table must be surrounded by blank lines. There must be a blank line before and after the table. Fenced code blocks The fenced code blocks extension adds an alternate method of defining code blocks without indentation. The first line should contain 3 or more backtick ( ` ) characters, and the last line should contain the same number of backtick characters ( ` ): ``` Fenced code blocks are like Standard Markdown\u2019s regular code blocks, except that they\u2019re not indented and instead rely on start and end fence lines to delimit the code block. ``` With this approach, the language can optionally be specified on the first line after the backticks which informs any syntax highlighters of the language used: ```python def fn(): pass ``` Note that fenced code blocks can not be indented. Therefore, they cannot be nested inside list items, blockquotes, etc.","title":"Writing"},{"location":"user-guide/writing-your-docs/#writing-your-docs","text":"How to layout and write your Markdown source files.","title":"Writing your docs"},{"location":"user-guide/writing-your-docs/#file-layout","text":"Your documentation source should be written as regular Markdown files (see Writing with Markdown below), and placed in the documentation directory . By default, this directory will be named docs and will exist at the top level of your project, alongside the mkdocs.yml configuration file. The simplest project you can create will look something like this: mkdocs.yml docs/ index.md By convention your project homepage should be named index.md (see Index pages below for details). Any of the following file extensions may be used for your Markdown source files: markdown , mdown , mkdn , mkd , md . All Markdown files included in your documentation directory will be rendered in the built site regardless of any settings. Note Files and directories with names which begin with a dot (for example: .foo.md or .bar/baz.md ) are ignored by MkDocs, which matches the behavior of most web servers. There is no option to override this behavior. You can also create multi-page documentation, by creating several Markdown files: mkdocs.yml docs/ index.md about.md license.md The file layout you use determines the URLs that are used for the generated pages. Given the above layout, pages would be generated for the following URLs: / /about/ /license/ You can also include your Markdown files in nested directories if that better suits your documentation layout. docs/ index.md user-guide/getting-started.md user-guide/configuration-options.md license.md Source files inside nested directories will cause pages to be generated with nested URLs, like so: / /user-guide/getting-started/ /user-guide/configuration-options/ /license/ Any files which are not identified as Markdown files (by their file extension) within the documentation directory are copied by MkDocs to the built site unaltered. See how to link to images and media below for details.","title":"File layout"},{"location":"user-guide/writing-your-docs/#index-pages","text":"When a directory is requested, by default, most web servers will return an index file (usually named index.html ) contained within that directory if one exists. For that reason, the homepage in all of the examples above has been named index.md , which MkDocs will render to index.html when building the site. Many repository hosting sites provide special treatment for README files by displaying the contents of the README file when browsing the contents of a directory. Therefore, MkDocs will allow you to name your index pages as README.md instead of index.md . In that way, when users are browsing your source code, the repository host can display the index page of that directory as it is a README file. However, when MkDocs renders your site, the file will be renamed to index.html so that the server will serve it as a proper index file. If both an index.md file and a README.md file are found in the same directory, then the index.md file is used and the README.md file is ignored.","title":"Index pages"},{"location":"user-guide/writing-your-docs/#configure-pages-and-navigation","text":"The nav configuration setting in your mkdocs.yml file defines which pages are included in the global site navigation menu as well as the structure of that menu. If not provided, the navigation will be automatically created by discovering all the Markdown files in the documentation directory . An automatically created navigation configuration will always be sorted alphanumerically by file name (except that index files will always be listed first within a sub-section). You will need to manually define your navigation configuration if you would like your navigation menu sorted differently. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. If that option is set to the default value, docs , the source files for the above configuration would be located at docs/index.md and docs/about.md . The above example will result in two navigation items being created at the top level and with their titles inferred from the contents of the Markdown file or, if no title is defined within the file, of the file name. To override the title in the nav setting add a title right before the filename. nav: - Home: 'index.md' - About: 'about.md' Note that if a title is defined for a page in the navigation, that title will be used throughout the site for that page and will override any title defined within the page itself. Navigation sub-sections can be created by listing related pages together under a section title. For example: nav: - Home: 'index.md' - 'User Guide': - 'Writing your docs': 'writing-your-docs.md' - 'Styling your docs': 'styling-your-docs.md' - About: - 'License': 'license.md' - 'Release Notes': 'release-notes.md' With the above configuration we have three top level items: \"Home\", \"User Guide\" and \"About.\" \"Home\" is a link to the homepage for the site. Under the \"User Guide\" section two pages are listed: \"Writing your docs\" and \"Styling your docs.\" Under the \"About\" section two more pages are listed: \"License\" and \"Release Notes.\" Note that a section cannot have a page assigned to it. Sections are only containers for child pages and sub-sections. You may nest sections as deeply as you like. However, be careful that you don't make it too difficult for your users to navigate through the site navigation by over-complicating the nesting. While sections may mirror your directory structure, they do not have to. Any pages not listed in your navigation configuration will still be rendered and included with the built site, however, they will not be linked from the global navigation and will not be included in the previous and next links. Such pages will be \"hidden\" unless linked to directly.","title":"Configure Pages and Navigation"},{"location":"user-guide/writing-your-docs/#writing-with-markdown","text":"MkDocs pages must be authored in Markdown , a lightweight markup language which results in easy-to-read, easy-to-write plain text documents that can be converted to valid HTML documents in a predictable manner. MkDocs uses the Python-Markdown library to render Markdown documents to HTML. Python-Markdown is almost completely compliant with the reference implementation , although there are a few very minor differences . In addition to the base Markdown syntax which is common across all Markdown implementations, MkDocs includes support for extending the Markdown syntax with Python-Markdown extensions . See the MkDocs' markdown_extensions configuration setting for details on how to enable extensions. MkDocs includes some extensions by default, which are highlighted below.","title":"Writing with Markdown"},{"location":"user-guide/writing-your-docs/#internal-links","text":"MkDocs allows you to interlink your documentation by using regular Markdown links . However, there are a few additional benefits to formatting those links specifically for MkDocs as outlined below.","title":"Internal links"},{"location":"user-guide/writing-your-docs/#linking-to-pages","text":"When linking between pages in the documentation you can simply use the regular Markdown linking syntax, including the relative path to the Markdown document you wish to link to. Please see the [project license](license.md) for further details. When the MkDocs build runs, these Markdown links will automatically be transformed into an HTML hyperlink to the appropriate HTML page. Warning Using absolute paths with links is not officially supported. Relative paths are adjusted by MkDocs to ensure they are always relative to the page. Absolute paths are not modified at all. This means that your links using absolute paths might work fine in your local environment but they might break once you deploy them to your production server. If the target documentation file is in another directory you'll need to make sure to include any relative directory path in the link. Please see the [project license](../about/license.md) for further details. The toc extension is used by MkDocs to generate an ID for every header in your Markdown documents. You can use that ID to link to a section within a target document by using an anchor link. The generated HTML will correctly transform the path portion of the link, and leave the anchor portion intact. Please see the [project license](about.md#license) for further details. Note that IDs are created from the text of a header. All text is converted to lowercase and any disallowed characters, including white-space, are converted to dashes. Consecutive dashes are then reduced to a single dash. There are a few configuration settings provided by the toc extension which you can set in your mkdocs.yml configuration file to alter the default behavior: permalink Generate permanent links at the end of each header. Default: False . When set to True the paragraph symbol (\u00b6 or ¶ ) is used as the link text. When set to a string, the provided string is used as the link text. For example, to use the hash symbol ( # ) instead, do: markdown_extensions: - toc: permalink: \"#\" baselevel Base level for headers. Default: 1 . This setting allows the header levels to be automatically adjusted to fit within the hierarchy of your HTML templates. For example, if the Markdown text for a page should not contain any headers higher than level 2 (
), do: markdown_extensions: - toc: baselevel: 2 Then any headers in your document would be increased by 1. For example, the header # Header would be rendered as a level 2 header (
) in the HTML output. separator Word separator. Default: - . Character which replaces white-space in generated IDs. If you prefer underscores, then do: markdown_extensions: - toc: separator: \"_\" Note that if you would like to define multiple of the above settings, you must do so under a single toc entry in the markdown_extensions configuration option. markdown_extensions: - toc: permalink: \"#\" baselevel: 2 separator: \"_\"","title":"Linking to pages"},{"location":"user-guide/writing-your-docs/#linking-to-images-and-media","text":"As well as the Markdown source files, you can also include other file types in your documentation, which will be copied across when generating your documentation site. These might include images and other media. For example, if your project documentation needed to include a GitHub Pages CNAME file and a PNG formatted screenshot image then your file layout might look as follows: mkdocs.yml docs/ CNAME index.md about.md license.md img/ screenshot.png To include images in your documentation source files, simply use any of the regular Markdown image syntaxes: Cupcake indexer is a snazzy new project for indexing small cakes. ![Screenshot](img/screenshot.png) *Above: Cupcake indexer in progress* Your image will now be embedded when you build the documentation, and should also be previewed if you're working on the documentation with a Markdown editor.","title":"Linking to images and media"},{"location":"user-guide/writing-your-docs/#linking-from-raw-html","text":"Markdown allows document authors to fall back to raw HTML when the Markdown syntax does not meets the author's needs. MkDocs does not limit Markdown in this regard. However, as all raw HTML is ignored by the Markdown parser, MkDocs is not able to validate or convert links contained in raw HTML. When including internal links within raw HTML, you will need to manually format the link appropriately for the rendered document.","title":"Linking from raw HTML"},{"location":"user-guide/writing-your-docs/#meta-data","text":"MkDocs includes support for both YAML and MultiMarkdown style meta-data (often called front-matter). Meta-data consists of a series of keywords and values defined at the beginning of a Markdown document, which are stripped from the document prior to it being processing by Python-Markdown. The key/value pairs are passed by MkDocs to the page template. Therefore, if a theme includes support, the values of any keys can be displayed on the page or used to control the page rendering. See your theme's documentation for information about which keys may be supported, if any. In addition to displaying information in a template, MkDocs includes support for a few predefined meta-data keys which can alter the behavior of MkDocs for that specific page. The following keys are supported: template The template to use with the current page. By default, MkDocs uses the main.html template of a theme to render Markdown pages. You can use the template meta-data key to define a different template file for that specific page. The template file must be available on the path(s) defined in the theme's environment. title The \"title\" to use for the document. MkDocs will attempt to determine the title of a document in the following ways, in order: A title defined in the nav configuration setting for a document. A title defined in the title meta-data key of a document. A level 1 Markdown header on the first line of the document body. Please note that Setext-style headers are not supported. The filename of a document. Upon finding a title for a page, MkDoc does not continue checking any additional sources in the above list.","title":"Meta-Data"},{"location":"user-guide/writing-your-docs/#yaml-style-meta-data","text":"YAML style meta-data consists of YAML key/value pairs wrapped in YAML style delimiters to mark the start and/or end of the meta-data. The first line of a document must be --- . The meta-data ends at the first line containing an end deliminator (either --- or ... ). The content between the delimiters is parsed as YAML . --- title: My Document summary: A brief description of my document. authors: - Waylan Limberg - Tom Christie date: 2018-07-10 some_url: https://example.com --- This is the first paragraph of the document. YAML is able to detect data types. Therefore, in the above example, the values of title , summary and some_url are strings, the value of authors is a list of strings and the value of date is a datetime.date object. Note that the YAML keys are case sensitive and MkDocs expects keys to be all lowercase. The top level of the YAML must be a collection of key/value pairs, which results in a Python dict being returned. If any other type is returned or the YAML parser encounters an error, then MkDocs does not recognize the section as meta-data, the page's meta attribute will be empty, and the section is not removed from the document.","title":"YAML Style Meta-Data"},{"location":"user-guide/writing-your-docs/#multimarkdown-style-meta-data","text":"MultiMarkdown style meta-data uses a format first introduced by the MultiMarkdown project. The data consists of a series of keywords and values defined at the beginning of a Markdown document, like this: Title: My Document Summary: A brief description of my document. Authors: Waylan Limberg Tom Christie Date: January 23, 2018 blank-value: some_url: https://example.com This is the first paragraph of the document. The keywords are case-insensitive and may consist of letters, numbers, underscores and dashes and must end with a colon. The values consist of anything following the colon on the line and may even be blank. If a line is indented by 4 or more spaces, that line is assumed to be an additional line of the value for the previous keyword. A keyword may have as many lines as desired. All lines are joined into a single string. The first blank line ends all meta-data for the document. Therefore, the first line of a document must not be blank. Note MkDocs does not support YAML style delimiters ( --- or ... ) for MultiMarkdown style meta-data. In fact, MkDocs relies on the the presence or absence of the delimiters to determine whether YAML style meta-data or MultiMarkdown style meta-data is being used. If the delimiters are detected, but the content between the delimiters is not valid YAML meta-data, MkDocs does not attempt to parse the content as MultiMarkdown style meta-data.","title":"MultiMarkdown Style Meta-Data"},{"location":"user-guide/writing-your-docs/#tables","text":"The tables extension adds a basic table syntax to Markdown which is popular across multiple implementations. The syntax is rather simple and is generally only useful for simple tabular data. A simple table looks like this: First Header | Second Header | Third Header ------------ | ------------- | ------------ Content Cell | Content Cell | Content Cell Content Cell | Content Cell | Content Cell If you wish, you can add a leading and tailing pipe to each line of the table: | First Header | Second Header | Third Header | | ------------ | ------------- | ------------ | | Content Cell | Content Cell | Content Cell | | Content Cell | Content Cell | Content Cell | Specify alignment for each column by adding colons to separator lines: First Header | Second Header | Third Header :----------- |:-------------:| -----------: Left | Center | Right Left | Center | Right Note that table cells cannot contain any block level elements and cannot contain multiple lines of text. They can, however, include inline Markdown as defined in Markdown's syntax rules. Additionally, a table must be surrounded by blank lines. There must be a blank line before and after the table.","title":"Tables"},{"location":"user-guide/writing-your-docs/#fenced-code-blocks","text":"The fenced code blocks extension adds an alternate method of defining code blocks without indentation. The first line should contain 3 or more backtick ( ` ) characters, and the last line should contain the same number of backtick characters ( ` ): ``` Fenced code blocks are like Standard Markdown\u2019s regular code blocks, except that they\u2019re not indented and instead rely on start and end fence lines to delimit the code block. ``` With this approach, the language can optionally be specified on the first line after the backticks which informs any syntax highlighters of the language used: ```python def fn(): pass ``` Note that fenced code blocks can not be indented. Therefore, they cannot be nested inside list items, blockquotes, etc.","title":"Fenced code blocks"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"\u77e5\u8bc6\u6587\u6863 Knowledge Document with Markdown. \u672c \u77e5\u8bc6\u6587\u6863 \u5de5\u5177\u65e8\u5728\u5206\u4eab\u76f8\u5173\u5b66\u4e60\u5185\u5bb9\uff0c\u901a\u8fc7 \u5171\u4eab\u534f\u8bae \u6765\u5206\u53d1\u548c\u6f14\u7ece\u672c\u7ad9\u5185\u5bb9\uff0c\u53ea\u9700\u4fdd\u7559\u672c\u7ad9\u7f72\u540d\u4e14\u975e\u5546\u4e1a\u4f7f\u7528\u3002 \u5f00\u59cb \u7528\u6237\u624b\u518c \u529f\u80fd \u4e3b\u9875 There's a stack of good looking themes available for MkDocs. Choose between the built in themes: mkdocs and readthedocs , select one of the third-party themes (on the MkDocs Themes wiki page as well as Best-of-MkDocs ), or build your own . \u5f00\u59cb Get your project documentation looking just the way you want it by customizing your theme and/or installing some plugins . Modify Markdown's behavior with Markdown extensions . Many configuration options are available. \u7528\u6237\u624b\u518c The built-in dev-server allows you to preview your documentation as you're writing it. It will even auto-reload and refresh your browser whenever you save your changes. \u5f00\u53d1\u6307\u5357 API Plugins Themes Translations README PPT The built-in dev-server allows you to preview your documentation as you're writing it. It will even auto-reload and refresh your browser whenever you save your changes. CS \u76ee\u5f55 \u5fc5\u5b66\u5de5\u5177 \u5fc5\u5b66\u5de5\u5177 \u597d\u4e66\u63a8\u8350 \u6570\u5b66\u57fa\u7840 \u6570\u5b66\u8fdb\u9636 \u9605\u8bfb \u9605\u8bfb \u4e66\u7c4d \u5173\u4e8e \u5173\u4e8e","title":"\u4e3b\u9875"},{"location":"#_1","text":"Knowledge Document with Markdown. \u672c \u77e5\u8bc6\u6587\u6863 \u5de5\u5177\u65e8\u5728\u5206\u4eab\u76f8\u5173\u5b66\u4e60\u5185\u5bb9\uff0c\u901a\u8fc7 \u5171\u4eab\u534f\u8bae \u6765\u5206\u53d1\u548c\u6f14\u7ece\u672c\u7ad9\u5185\u5bb9\uff0c\u53ea\u9700\u4fdd\u7559\u672c\u7ad9\u7f72\u540d\u4e14\u975e\u5546\u4e1a\u4f7f\u7528\u3002 \u5f00\u59cb \u7528\u6237\u624b\u518c","title":"\u77e5\u8bc6\u6587\u6863"},{"location":"getting-started/","text":"Getting Started with MkDocs An introductory tutorial! Installation To install MkDocs, run the following command from the command line: pip install mkdocs For more details, see the Installation Guide . Creating a new project Getting started is super easy. To create a new project, run the following command from the command line: mkdocs new my-project cd my-project Take a moment to review the initial project that has been created for you. There's a single configuration file named mkdocs.yml , and a folder named docs that will contain your documentation source files ( docs is the default value for the docs_dir configuration setting). Right now the docs folder just contains a single documentation page, named index.md . MkDocs comes with a built-in dev-server that lets you preview your documentation as you work on it. Make sure you're in the same directory as the mkdocs.yml configuration file, and then start the server by running the mkdocs serve command: $ mkdocs serve INFO - Building documentation... INFO - Cleaning site directory [I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000 [I 160402 15:50:43 handlers:58] Start watching changes [I 160402 15:50:43 handlers:60] Start detecting changes Open up http://127.0.0.1:8000/ in your browser, and you'll see the default home page being displayed: The dev-server also supports auto-reloading, and will rebuild your documentation whenever anything in the configuration file, documentation directory, or theme directory changes. Open the docs/index.md document in your text editor of choice, change the initial heading to MkLorum , and save your changes. Your browser will auto-reload and you should see your updated documentation immediately. Now try editing the configuration file: mkdocs.yml . Change the site_name setting to MkLorum and save the file. site_name: MkLorum site_url: https://example.com/ Your browser should immediately reload, and you'll see your new site name take effect. Note The site_name and site_url configuration options are the only two required options in your configuration file. When you create a new project, the site_url option is assigned the placeholder value: https://example.com . If the final location is known, you can change the setting now to point to it. Or you may choose to leave it alone for now. Just be sure to edit it before you deploy your site to a production server. Adding pages Now add a second page to your documentation: curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md As our documentation site will include some navigation headers, you may want to edit the configuration file and add some information about the order, title, and nesting of each page in the navigation header by adding a nav setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md Save your changes and you'll now see a navigation bar with Home and About items on the left as well as Search , Previous , and Next items on the right. Try the menu items and navigate back and forth between pages. Then click on Search . A search dialog will appear, allowing you to search for any text on any page. Notice that the search results include every occurrence of the search term on the site and links directly to the section of the page in which the search term appears. You get all of that with no effort or configuration on your part! Theming our documentation Now change the configuration file to alter how the documentation is displayed by changing the theme. Edit the mkdocs.yml file and add a theme setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md theme: readthedocs Save your changes, and you'll see the ReadTheDocs theme being used. Changing the Favicon Icon By default, MkDocs uses the MkDocs favicon icon. To use a different icon, create an img subdirectory in the docs directory and copy your custom favicon.ico file to that directory. MkDocs will automatically detect and use that file as your favicon icon. Building the site That's looking good. You're ready to deploy the first pass of your MkLorum documentation. First build the documentation: mkdocs build This will create a new directory, named site . Take a look inside the directory: $ ls site about fonts index.html license search.html css img js mkdocs sitemap.xml Notice that your source documentation has been output as two HTML files named index.html and about/index.html . You also have various other media that's been copied into the site directory as part of the documentation theme. You even have a sitemap.xml file and mkdocs/search_index.json . If you're using source code control such as git you probably don't want to check your documentation builds into the repository. Add a line containing site/ to your .gitignore file. echo \"site/\" >> .gitignore If you're using another source code control tool you'll want to check its documentation on how to ignore specific directories. Other Commands and Options There are various other commands and options available. For a complete list of commands, use the --help flag: mkdocs --help To view a list of options available on a given command, use the --help flag with that command. For example, to get a list of all options available for the build command run the following: mkdocs build --help Deploying The documentation site that you just built only uses static files so you'll be able to host it from pretty much anywhere. Simply upload the contents of the entire site directory to wherever you're hosting your website from and you're done. For specific instructions on a number of common hosts, see the Deploying your Docs page. Getting help See the User Guide for more complete documentation of all of MkDocs' features. To get help with MkDocs, please use the GitHub discussions or GitHub issues .","title":"\u5f00\u59cb"},{"location":"getting-started/#getting-started-with-mkdocs","text":"An introductory tutorial!","title":"Getting Started with MkDocs"},{"location":"getting-started/#installation","text":"To install MkDocs, run the following command from the command line: pip install mkdocs For more details, see the Installation Guide .","title":"Installation"},{"location":"getting-started/#creating-a-new-project","text":"Getting started is super easy. To create a new project, run the following command from the command line: mkdocs new my-project cd my-project Take a moment to review the initial project that has been created for you. There's a single configuration file named mkdocs.yml , and a folder named docs that will contain your documentation source files ( docs is the default value for the docs_dir configuration setting). Right now the docs folder just contains a single documentation page, named index.md . MkDocs comes with a built-in dev-server that lets you preview your documentation as you work on it. Make sure you're in the same directory as the mkdocs.yml configuration file, and then start the server by running the mkdocs serve command: $ mkdocs serve INFO - Building documentation... INFO - Cleaning site directory [I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000 [I 160402 15:50:43 handlers:58] Start watching changes [I 160402 15:50:43 handlers:60] Start detecting changes Open up http://127.0.0.1:8000/ in your browser, and you'll see the default home page being displayed: The dev-server also supports auto-reloading, and will rebuild your documentation whenever anything in the configuration file, documentation directory, or theme directory changes. Open the docs/index.md document in your text editor of choice, change the initial heading to MkLorum , and save your changes. Your browser will auto-reload and you should see your updated documentation immediately. Now try editing the configuration file: mkdocs.yml . Change the site_name setting to MkLorum and save the file. site_name: MkLorum site_url: https://example.com/ Your browser should immediately reload, and you'll see your new site name take effect. Note The site_name and site_url configuration options are the only two required options in your configuration file. When you create a new project, the site_url option is assigned the placeholder value: https://example.com . If the final location is known, you can change the setting now to point to it. Or you may choose to leave it alone for now. Just be sure to edit it before you deploy your site to a production server.","title":"Creating a new project"},{"location":"getting-started/#adding-pages","text":"Now add a second page to your documentation: curl 'https://jaspervdj.be/lorem-markdownum/markdown.txt' > docs/about.md As our documentation site will include some navigation headers, you may want to edit the configuration file and add some information about the order, title, and nesting of each page in the navigation header by adding a nav setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md Save your changes and you'll now see a navigation bar with Home and About items on the left as well as Search , Previous , and Next items on the right. Try the menu items and navigate back and forth between pages. Then click on Search . A search dialog will appear, allowing you to search for any text on any page. Notice that the search results include every occurrence of the search term on the site and links directly to the section of the page in which the search term appears. You get all of that with no effort or configuration on your part!","title":"Adding pages"},{"location":"getting-started/#theming-our-documentation","text":"Now change the configuration file to alter how the documentation is displayed by changing the theme. Edit the mkdocs.yml file and add a theme setting: site_name: MkLorum site_url: https://example.com/ nav: - Home: index.md - About: about.md theme: readthedocs Save your changes, and you'll see the ReadTheDocs theme being used.","title":"Theming our documentation"},{"location":"getting-started/#changing-the-favicon-icon","text":"By default, MkDocs uses the MkDocs favicon icon. To use a different icon, create an img subdirectory in the docs directory and copy your custom favicon.ico file to that directory. MkDocs will automatically detect and use that file as your favicon icon.","title":"Changing the Favicon Icon"},{"location":"getting-started/#building-the-site","text":"That's looking good. You're ready to deploy the first pass of your MkLorum documentation. First build the documentation: mkdocs build This will create a new directory, named site . Take a look inside the directory: $ ls site about fonts index.html license search.html css img js mkdocs sitemap.xml Notice that your source documentation has been output as two HTML files named index.html and about/index.html . You also have various other media that's been copied into the site directory as part of the documentation theme. You even have a sitemap.xml file and mkdocs/search_index.json . If you're using source code control such as git you probably don't want to check your documentation builds into the repository. Add a line containing site/ to your .gitignore file. echo \"site/\" >> .gitignore If you're using another source code control tool you'll want to check its documentation on how to ignore specific directories.","title":"Building the site"},{"location":"getting-started/#other-commands-and-options","text":"There are various other commands and options available. For a complete list of commands, use the --help flag: mkdocs --help To view a list of options available on a given command, use the --help flag with that command. For example, to get a list of all options available for the build command run the following: mkdocs build --help","title":"Other Commands and Options"},{"location":"getting-started/#deploying","text":"The documentation site that you just built only uses static files so you'll be able to host it from pretty much anywhere. Simply upload the contents of the entire site directory to wherever you're hosting your website from and you're done. For specific instructions on a number of common hosts, see the Deploying your Docs page.","title":"Deploying"},{"location":"getting-started/#getting-help","text":"See the User Guide for more complete documentation of all of MkDocs' features. To get help with MkDocs, please use the GitHub discussions or GitHub issues .","title":"Getting help"},{"location":"about/about/","text":"\u5173\u4e8e \u5173\u4e8e \u6587\u6863\u642d\u5efa \u4f7f\u7528\u7684\u6269\u5c55 \u6587\u6863\u642d\u5efa \u6587\u6863\u642d\u5efa\u73af\u5883 \u672c\u6587\u6863\u901a\u8fc7 mkdocs \u6784\u5efa \u4f7f\u7528\u7684\u6269\u5c55 \u6765\u6e90\u4e8e best-of-mkdocs \u540d\u79f0 \u4ed3\u5e93\u5730\u5740 \u8bf4\u660e click click \u901a\u8fc7\u547d\u4ee4\u884c\u751f\u6210\u6587\u6863 mermaid2 mermaid2 \u751f\u6210\u7ed3\u6784\u56fe plantuml plantuml UML\u56fe\u751f\u6210","title":"About"},{"location":"about/about/#_1","text":"\u5173\u4e8e \u6587\u6863\u642d\u5efa \u4f7f\u7528\u7684\u6269\u5c55","title":"\u5173\u4e8e"},{"location":"about/about/#_2","text":"\u6587\u6863\u642d\u5efa\u73af\u5883","title":"\u6587\u6863\u642d\u5efa"},{"location":"about/about/#mkdocs","text":"","title":"\u672c\u6587\u6863\u901a\u8fc7 mkdocs \u6784\u5efa"},{"location":"about/about/#_3","text":"\u6765\u6e90\u4e8e best-of-mkdocs \u540d\u79f0 \u4ed3\u5e93\u5730\u5740 \u8bf4\u660e click click \u901a\u8fc7\u547d\u4ee4\u884c\u751f\u6210\u6587\u6863 mermaid2 mermaid2 \u751f\u6210\u7ed3\u6784\u56fe plantuml plantuml UML\u56fe\u751f\u6210","title":"\u4f7f\u7528\u7684\u6269\u5c55"},{"location":"collect/%E7%9B%AE%E5%BD%95/","text":"\u76ee\u5f55 \u6570\u636e\u6765\u6e90 01_\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b","title":"\u7b80\u60a6"},{"location":"collect/%E7%9B%AE%E5%BD%95/#_1","text":"\u6570\u636e\u6765\u6e90 01_\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b","title":"\u76ee\u5f55"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/","text":"\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b \u672c\u6587\u7531 \u7b80\u60a6 SimpRead \u8f6c\u7801\uff0c \u539f\u6587\u5730\u5740 github.com \u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b. Contribute to zhengnianli/EmbedSummary development by creating an account on GitHub. ======================================================= \u5b66\u4e60\u521d\u671f\u6700\u96be\u627e\u7684\u5c31\u662f\u627e\u5b66\u4e60\u8d44\u6599\u4e86\uff0c\u672c\u8d34\u7cbe\u5fc3\u6c47\u603b\u4e86\u4e00\u4e9b\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u7f16\u7a0b\u8bed\u8a00\u3001\u5355\u7247\u673a\u3001\u5f00\u6e90\u9879\u76ee\u3001\u7269\u8054\u7f51\u3001\u64cd\u4f5c\u7cfb\u7edf\u3001Linux\u3001\u8ba1\u7b97\u673a\u7b49\u8d44\u6e90\uff0c\u5e76\u4e14\u5728\u4e0d\u65ad\u5730\u66f4\u65b0\u4e2d\uff0c\u81f4\u529b\u4e8e\u6253\u9020\u5168\u7f51\u6700\u5168\u7684\u5d4c\u5165\u5f0f\u8d44\u6599\u5e93\u3002\u6709\u597d\u7684\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\u7684\u670b\u53cb\u6b22\u8fce\u505a\u8d21\u732e\uff0c\u5229\u4eba\u5229\u5df1\u3002 \u6536\u5f55\u516c\u5f00\u8d44\u6599\u4ec5\u4e3a\u4e86\u65b9\u4fbf\u5927\u5bb6\u8fdb\u884c\u5b66\u4e60\u3002\u5982\u679c\u4f60\u8ba4\u4e3a\u672c\u4ed3\u5e93\u7684\u4e00\u4e9b\u6587\u4ef6\u4fb5\u72af\u4e86\u60a8\u7684\u6743\u76ca\uff0c\u8bf7 \u5411\u6211\u53cd\u9988 \u3002\u6211\u5c06\u4f1a\u4ece\u4ed3\u5e93\u4e2d\u5f7b\u5e95\u6e05\u9664\u8fd9\u4e9b\u6587\u4ef6\u3002 \u4ee5\u4e0b\u4e3a\u6700\u65b0\u8d44\u6599\u6c47\u603b\uff1a gitee\uff1a https://gitee.com/zhengnianli/EmbedSummary github\uff1a https://github.com/zhengnianli/EmbedSummary 1\u3001OS \u9e3f\u8499 OS \uff1a \u4e00\u6b3e\u9762\u5411\u5168\u573a\u666f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 RT-Thread \uff1a\u4e00\u6b3e\u5c0f\u800c\u7f8e\u7684\u7269\u8054\u7f51\u64cd\u4f5c\u7cfb\u7edf\u3002 TencentOS tiny \uff1a\u4e00\u6b3e\u9762\u5411\u7269\u8054\u7f51\u9886\u57df\u5f00\u53d1\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 freertos \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u64cd\u4f5c\u7cfb\u7edf\u3002 \u00b5C/OS \uff1a\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 Azure RTOS \uff1aAzure RTOS \u662f\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5f00\u53d1\u5957\u4ef6\u3002 eventos-nano \uff1a\u4e00\u4e2a\u8d85\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f\u5f00\u53d1\u6846\u67b6\uff0c\u4e8b\u4ef6\u9a71\u52a8\uff0c\u5360\u7528\u8d44\u6e90\u5c0f\uff0c\u53ef\u8fd0\u7528\u4e8e\u5404\u578b\u5355\u7247\u673a\u3002 zephyr \uff1aZephyr \u662f Linux \u57fa\u91d1\u4f1a\u63a8\u51fa\u7684\u4e00\u4e2a\u9002\u7528\u4e8e\u7269\u8054\u7f51\u7684\u5c0f\u578b\u53ef\u4f38\u7f29\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 mbed-os \uff1aARM \u81ea\u5df1\u6253\u9020\u3001\u4e3b\u6253 IoT \u7684\u4e00\u6574\u5957\u8f6f\u4ef6\u89e3\u51b3\u65b9\u6848 \u3002 BabyOS \uff1a \u4e13\u4e3a MCU \u9879\u76ee\u5f00\u53d1\u63d0\u901f\u7684\u4ee3\u7801\u6846\u67b6 \u3002 LuatOS \uff1a LuatOS \u662f\u8fd0\u884c\u5728\u5d4c\u5165\u5f0f\u786c\u4ef6\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\uff0c\u53ea\u9700\u8981\u5c11\u91cf\u5185\u5b58\u7684 flash \u7a7a\u95f4\u5c31\u80fd\u8fd0\u884c\uff0c\u7528\u6237\u7f16\u5199 lua \u4ee3\u7801\u5c31\u53ef\u5b8c\u6210\u5404\u79cd\u529f\u80fd\u3002 Contiki-OS \uff1a \u4e00\u4e2a\u5c0f\u578b\u7684\uff0c\u5f00\u6e90\u7684\uff0c\u6781\u6613\u79fb\u690d\u7684\u591a\u4efb\u52a1\u64cd\u4f5c\u7cfb\u7edf\u3002 DJYOS \uff1a \u90fd\u6c5f\u5830\u64cd\u4f5c\u7cfb\u7edf\u3002 klite \uff1a \u7b80\u6d01\u6613\u7528\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 lmosem \uff1a \u4e00\u4e2a\u5b8c\u5168\u4ece\u7b2c\u4e00\u884c\u5f15\u5bfc\u4ee3\u7801\u5f00\u59cb\u7f16\u5199\uff0c\u57fa\u4e8e ARM \u5e73\u53f0\uff0c\u652f\u6301\u591a\u8fdb\u7a0b\u3001\u591a CPU\u3001\u5185\u5b58\u7ba1\u7406\u3001\u6587\u4ef6\u4e0e\u8bbe\u5907\u7ba1\u7406\u7684\u5168 32 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 freenos \uff1aFreeNOS \u5fae\u5185\u6838\u64cd\u4f5c\u7cfb\u7edf\u3002 ros \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\u3002 openwrt \uff1aopenwrt \u6587\u6863\u3002 cola_os \uff1a300 \u884c\u4ee3\u7801\u5b9e\u73b0\u591a\u4efb\u52a1\u7ba1\u7406\u7684 OS\u3002 MS-RTOS \uff1a Micro Safe RTOS \u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 2\u3001\u5b9e\u7528\u5e93 / \u6846\u67b6 ametal \u6216 ametal \uff1aAMetal \u662f\u82af\u7247\u7ea7\u7684\u88f8\u673a\u8f6f\u4ef6\u5305\uff0c\u5b9a\u4e49\u4e86\u8de8\u5e73\u53f0\u7684\u901a\u7528\u63a5\u53e3\u3002 Melon \uff1a\u4e00\u4e2a\u7528\u4e8e\u7b80\u5316\u5f00\u53d1\u7684 C \u6846\u67b6\u5e93\u3002 zlog \uff1a\u4e00\u4e2a\u9ad8\u53ef\u9760\u6027\u3001\u9ad8\u6027\u80fd\u3001\u7eaf C \u65e5\u5fd7\u51fd\u6570\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 Smartlink \uff1aLinux \u4e0a\u5b9e\u73b0\u7684 smartconfig\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 CodeBrick \uff1a\u4e00\u79cd\u65e0 OS \u7684 MCU \u5b9e\u7528\u8f6f\u4ef6\u7ba1\u7406\u7cfb\u7edf\u3002 RIL \uff1a\u4e00\u6b3e\u4e13\u95e8\u4e3a\u5d4c\u5165\u5f0f\u5e73\u53f0\u5f00\u53d1\u7684\u65e0\u7ebf\u901a\u4fe1\u6a21\u5757 (GSM/GPRS/CatM1/NB) \u7ba1\u7406\u6846\u67b6\u3002 cJSON \uff1a\u4e00\u4e2a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8f7b\u91cf\u7ea7\u7684 JSON \u89e3\u6790\u5e93\u3002 jsmn \uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u57fa\u4e8e C \u8bed\u8a00\u7684 JSON \u89e3\u6790\u5e93\u3002 inih \uff1a C \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 MultiTimer \uff1a \u4e00\u4e2a\u8f6f\u4ef6\u5b9a\u65f6\u5668\u6269\u5c55\u6a21\u5757\u3002 MultiButton \uff1a \u4e00\u4e2a\u5c0f\u5de7\u7b80\u5355\u6613\u7528\u7684\u4e8b\u4ef6\u9a71\u52a8\u578b\u6309\u952e\u9a71\u52a8\u6a21\u5757\u3002 SmartTimer \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u57fa\u4e8e STM32 \u7684\u5b9a\u65f6\u5668\u8c03\u5ea6\u5668 \u3002 FlexibleButton \uff1a\u4e00\u4e2a\u57fa\u4e8e\u6807\u51c6 C \u8bed\u8a00\u7684\u5c0f\u5de7\u7075\u6d3b\u7684\u6309\u952e\u5904\u7406\u5e93\u3002 CmBacktrace \uff1a \u4e00\u6b3e\u9488\u5bf9 ARM Cortex-M \u7cfb\u5217 MCU \u7684\u9519\u8bef\u4ee3\u7801\u81ea\u52a8\u8ffd\u8e2a\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 limlog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 NanoLog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 EasyFlash \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f Flash \u5b58\u50a8\u5668\u5e93 \u3002 SFUD \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u4e32\u884c SPI Flash \u901a\u7528\u9a71\u52a8\u5e93\u3002 lw_oopc \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u6846\u67b6\u3002 PLOOC \uff1a\u53d7\u4fdd\u62a4\u7684\u4f4e\u5f00\u9500\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3002 cmd-parser \uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u597d\u7528\u7684\u547d\u4ee4\u89e3\u6790\u5668\u3002 mqttclient \uff1a\u4e00\u4e2a\u7701\u8d44\u6e90\u3001\u9ad8\u7a33\u5b9a\u7684 MQTT \u5ba2\u6237\u7aef\u3002 NorthFrame \uff1a\u4e00\u4e2a\u5355\u7247\u673a\u6781\u7b80\u56fe\u5f62\u5316\u72b6\u6001\u673a\u6846\u67b6 \u3002 letter-shell \uff1a\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u5d4c\u5165\u5f0f shell\u3002 nr_micro_shell \uff1a shell for MCU\uff0c\u5355\u7247\u673a\u547d\u4ee4\u884c\u4ea4\u4e92\u3002 pigweed \uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u76ee\u6807\u5e93\uff08\u6a21\u5757\uff09\u96c6\u5408\u3002 lwrb \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u901a\u7528\u73af\u7f13\u51b2\u533a\u7ba1\u7406\u5668\u5e93\u3002 cQueue \uff1a\u4f7f\u7528 ANSI C \u7f16\u5199\u7684\u6d88\u606f\u961f\u5217\u529f\u80fd\u51fd\u6570\u3002 Unity \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u3001\u9002\u5408\u5d4c\u5165\u5f0f\u7684\u6d4b\u8bd5\u6846\u67b6\u3002 Embedded Unit \uff1a \u662f\u4e2a\u7eaf\u6807\u51c6 c \u6784\u5efa\u7684\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 CuTest \uff1a\u4e00\u6b3e\u5fae\u5c0f\u7684 C \u8bed\u8a00\u5355\u5143\u6d4b\u8bd5\u6846\uff0c \u5168\u90e8\u4ee3\u7801\u52a0\u8d77\u6765\u4e0d\u5230\u4e00\u5343\u884c\u3002 cmockery \uff1a \u8c37\u6b4c C \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6\u3002 znfat \uff1a\u632f\u5357 fat\uff0c\u56fd\u4ea7\u5d4c\u5165\u5f0f\u6587\u4ef6\u7cfb\u7edf\u65b9\u6848 \u3002 libu \uff1a\u4e00\u4e2a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 toolkit \uff1aToolKit \u662f\u4e00\u5957\u5e94\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u7684\u901a\u7528\u5de5\u5177\u5305\u3002 LWIP \uff1a \u4e00\u4e2a\u5c0f\u578b\u5f00\u6e90\u7684 TCP/IP \u534f\u8bae\u6808 \u3002 SQLite \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u5173\u7cfb\u6570\u636e\u5e93\u3002 OpenBLT \uff1a\u4e00\u79cd\u5f00\u6e90\u5f15\u5bfc\u52a0\u8f7d\u7a0b\u5e8f\u3002 Linux Lab \uff1a Linux \u5185\u6838\u5b9e\u9a8c\u5ba4\uff0c\u57fa\u4e8e Docker/Qemu \u7684\u6781\u901f Linux \u5185\u6838\u5b66\u4e60\u3001\u5f00\u53d1\u548c\u6d4b\u8bd5\u73af\u5883\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 mbedtls \uff1a\u4e00\u4e2a\u5f00\u6e90\u3001\u4fbf\u643a, \u6613\u4e8e\u4f7f\u7528, \u53ef\u8bfb\u7684\u548c\u7075\u6d3b\u7684 SSL \u5e93\u3002 mosquitto \u6216 mosquitto(\u4e0b\u8f7d\u901f\u5ea6\u5feb) \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684 MQTT \u4ee3\u7406\u3002 inih \uff1aC \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 QP \uff1aQP \u5b9e\u65f6\u5d4c\u5165\u5f0f\u6846\u67b6\u3002 MS-RTOS \uff1aMicro Safe RTOS \u3002 protobuf-c \uff1aprotobuf-c\u3002 eepromfs \uff1a \u57fa\u4e8e EEPROM \u7684\u7b80\u6613\u7c7b\u6587\u4ef6\u7684\u6570\u636e\u8bfb\u5199\u5e93 \u3002 gear-lib \uff1a \u9002\u7528\u4e8e IOT / \u5d4c\u5165\u5f0f / \u7f51\u7edc\u670d\u52a1\u5f00\u53d1\u7684 C \u5e93 \u3002 mult_timer \uff1a \u4e00\u4e2a Linux \u4e0b\u7684\u8d85\u7ea7\u7cbe\u7b80\u7684\u591a\u91cd\u5b9a\u65f6\u5668 \u3002 EFSM \uff1a \u662f\u4e00\u4e2a\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684\u6709\u9650\u72b6\u6001\u673a \u3002 EasyX \uff1a\u4e00\u4e2a\u514d\u8d39\u7684\u56fe\u5f62\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 sys/queue.h \uff1a\u7528\u5b8f\u5b9e\u73b0\u7684\u5e38\u7528\u6570\u636e\u7ed3\u6784\u3002 nanomsg \uff1a\u4e00\u4e2a\u5b9e\u73b0\u4e86\u51e0\u79cd \u201c\u53ef\u6269\u5c55\u534f\u8bae\u201d \u7684\u9ad8\u6027\u80fd\u901a\u4fe1\u5e93\u3002 thttpd \uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u5c0f\u578b\uff0c\u53ef\u79fb\u690d\uff0c\u5feb\u901f\u4e14\u5b89\u5168\u7684 HTTP \u670d\u52a1\u5668\u3002 boa \uff1a\u4e00\u4e2a\u5c0f\u5de7\u9ad8\u6548\u7684 web \u670d\u52a1\u5668\u3002 FreeTpye \uff1a\u5b57\u4f53\u6e32\u67d3\u5e93\u3002 qpc \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u72b6\u6001\u673a\u5b9e\u73b0\u3002 Quantum Leaps \uff1a\u72b6\u6001\u673a\u7ec4\u7ec7\u3002 ZBar \uff1a\u4e8c\u7ef4\u7801\u626b\u63cf\u5de5\u5177\u548c\u5f00\u53d1\u5305. FFmpeg \uff1a\u591a\u5a92\u4f53\u5904\u7406\u5de5\u5177\u5e93. libnabo \uff1a\u662f\u4e00\u4e2a\u5feb\u901f\u4e3a\u4f4e\u7ef4\u5ea6\u7a7a\u95f4\u63d0\u4f9b K \u6700\u8fd1\u90bb\u5c45\u7b97\u6cd5\u5e93\u3002 DSAL \uff1a\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u5e93\u3002 FLINT \uff1a\u662f\u4e00\u4e2a\u6570\u8bba\u5e93\uff0c\u7528 C \u8bed\u8a00\u7f16\u5199\uff0c\u5b83\u5305\u62ec\u4e00\u4e2a\u975e\u5e38\u5feb\u7684\u591a\u9879\u5f0f\u7b97\u6cd5\u5e93\u3002 LibMMSeg \uff1a\u4e2d\u6587\u5206\u8bcd\u8f6f\u4ef6\u5305 \u3002 CDS \uff1aCDS \u662f\u4e00\u4e2a C++ \u6a21\u677f\u5e93\uff0c\u5305\u542b lock-free and fine-grained \u7b97\u6cd5\u3002 hashlib++ \uff1a\u662f\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u7528\u6765\u751f\u6210 checksum \u7b97\u6cd5\u3002 libcstl \uff1aC \u8bed\u8a00\u7f16\u5199\u7684\u4e00\u4e2a\u901a\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u5e38\u7528\u7684\u7b97\u6cd5\u5e93\u3002 Botan \uff1aBotan \u662f\u4e00\u4e2a C++ \u7684\u52a0\u5bc6\u7b97\u6cd5\u5e93\u3002 CGAL \uff1a\u8ba1\u7b97\u51e0\u4f55\u7b97\u6cd5\u5e93\u3002 MyMediaLite \uff1a\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u591a\u7528\u9014\u7684\u63a8\u8350\u7cfb\u7edf\u7684\u7b97\u6cd5\u5e93\u3002 cblas \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 blas \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002f2c \u5b98\u7f51\u3002 clapack \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 lapack \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002 scalapack \uff1a\u63d0\u4f9b\u5e76\u884c\u8fd0\u7b97\u7684 lapack \u5e93\uff0c\u6e90\u7801\u7528 fortran \u7f16\u5199\u3002 armadillo \uff1a\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\uff0c\u6e90\u7801\u7528 c++ \u7f16\u5199\u3002 openblas \uff1a\u9488\u5bf9 intel cpu \u4f18\u5316\u7684 blas \u5e93\u3002 mkl \uff1a\u6269\u5c55\u7684\u4e14\u9488\u5bf9 intel cpu \u4f18\u5316\u7684\u5e93\uff0c\u5305\u62ec\u5feb\u901f\u5085\u7acb\u53f6\u53d8\u6362\uff08FFT\uff09\u3001\u77e2\u91cf\u6570\u5b66\u5e93\u3002 eigen \uff1aC++ \u5199\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\u3002 libjpeg \uff1a\u7528 libjpeg \u5e93\u5728 LCD \u4e0a\u663e\u793a\u56fe\u7247\u3002 x264 \uff1ax264 \u5f00\u6e90\u7684\u89e3\u7801\u7f16\u7801\u5e93\u3002 ws2812 \uff1aws2812 \u9a71\u52a8\u5e93\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 3\u3001GUI \u76f8\u5173 GuiLite \uff1a\u5927\u9053\u81f3\u7b80 - 5 \u5343\u884c / \u4ec5\u5934\u6587\u4ef6 / \u5168\u5e73\u53f0 GUI \u5e93 \u3002 yoxios \uff1a \u57fa\u4e8e Linux \u5f00\u53d1\u7684\u8f7b\u91cf\u7ea7\u7269\u8054\u7f51\u7cfb\u7edf\u548c\u786c\u4ef6\u5e73\u53f0\u3002 ToughGFX \uff1a \u4e00\u4e2a C++ \u7f16\u5199\u7684 GUI \u8f6f\u4ef6\u6846\u67b6 \u3002 emwin \uff1a\u4e00\u4e2a\u8001\u724c GUI \u5e93\u3002 littlevGL \uff1a \u4e00\u4e2a\u514d\u8d39\u7684\u5f00\u6e90\u56fe\u5f62\u5e93\u3002 \u91ce\u725b LittlevGL demo \uff1a\u57fa\u4e8e\u91ce\u725b\u5f00\u53d1\u677f\u7684 LittlevGL demo \u7a0b\u5e8f \u3002 MonoGUI \uff1a\u4e00\u4e2a\u9ed1\u767d\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7cfb\u7edf \u3002 MiniGUI \uff1a \u4e00\u4e2a\u5feb\u901f\u3001\u7a33\u5b9a\u3001\u8de8\u64cd\u4f5c\u7cfb\u7edf\u7684 GUI\u3002 QT \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6\u3002 QT_Creator \uff1aQT_Creator \u4e0b\u8f7d\u94fe\u63a5\u3002 Gtk \uff1a \u4e00\u4e2a\u7528\u4e8e\u521b\u9020\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7684\u56fe\u5f62\u5e93\u3002 AWTK \uff1a\u662f ZLG \u503e\u5fc3\u6253\u9020\u7684\u4e00\u5957\u57fa\u4e8e C \u8bed\u8a00\u5f00\u53d1\u7684 GUI \u6846\u67b6 \u3002 \u73b2\u73d1 GUI \uff1a\u73b2\u73d1 GUI \u6559\u7a0b\u9875\u3002 std \uff1a\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5c0f\u578b\u56fe\u5f62\u5e93\u3002 CUGUI \uff1a\u4e3a\u5355\u7247\u673a\u5199\u7684 GUI \uff0c\u652f\u6301\u5b57\u4f53\uff0c\u6309\u952e\uff0c\u56fe\u7247\uff0c\u6ed1\u52a8\u6761\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 4\u3001\u9879\u76ee / \u8f6f\u786c\u7ed3\u5408 ElectronBot \uff1a\u4e00\u4e2a\u684c\u9762\u7ea7\u5c0f\u673a\u5668\u4eba\u3002 Planck-Pi \uff1a\u8d85\u8ff7\u4f60 Linux \u5f00\u53d1\u677f\u3002 qt_2019_ncov \uff1a\u57fa\u4e8e Qt/C++ \u5b9e\u73b0\u7684\u65b0\u51a0\u80ba\u708e\u75ab\u60c5\u76d1\u63a7\u5e73\u53f0\u3002 H7-TOOL_STM32H7_App \uff1a\u5b89\u5bcc\u83b1 H7-TOOL \u591a\u529f\u80fd\u5f00\u53d1\u5de5\u5177\u3002 the-little-bili-tv \uff1a\u57fa\u4e8e esp32+lvgl8.0 \u7684\u54d4\u54e9\u54d4\u54e9\u5c0f\u7535\u89c6\u3002 DAPLink/CMSIS DAP \uff1a\u4e00\u4e2a\u8c03\u8bd5\u5668\uff0c \u96c6\u6210\u4e0b\u8f7d\u3001\u8c03\u8bd5\u548c USB \u865a\u62df\u4e32\u53e3\u3002 Crazepony \uff1aCrazepony \u5f00\u6e90\u56db\u8f74\u98de\u884c\u5668\u3002 MiniQ \uff1a\u4e00\u4e2a\u8ff7\u4f60\u56db\u8f74\u98de\u884c\u5668\u3002 LiPow-Firmware \uff1a\u57fa\u4e8e STM32G0 \u91c7\u7528 USB type-C \u4f9b\u7535\u7684\u5f00\u6e90\u9502\u7535\u6c60\u5145\u7535\u5668\u3002 Avem \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u3002 esp8266-lattice-clock \uff1aEsp8266 \u591a\u529f\u80fd\u70b9\u9635\u65f6\u949f\u3002 SoftWareSerial \uff1a\u4e00\u4e2a STM32 IO \u53e3\u6a21\u62df\u5b9e\u73b0\u8f6f\u4ef6\u4e32\u53e3\u7a0b\u5e8f\u3002 \u4e32\u53e3 ISP \u7a0b\u5e8f \uff1a\u4e00\u4e2a stm32 \u4e32\u53e3 ISP \u7a0b\u5e8f\u3002 DSO_Nano \uff1a\u4e00\u4e2a\u624b\u6301\u793a\u6ce2\u5668\u3002 DSView \uff1a \u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u903b\u8f91\u5206\u6790\u4eea\u3002 MCU-Development \uff1a \u57fa\u4e8e 51\u3001430\u3001STM32F10X\u3001STM32F407X\u3001T4MC123G \u5e73\u53f0\u7684\u5404\u5e38\u89c1\u786c\u4ef6\u6a21\u5757 demo\u3002 Arduino \uff1a \u5f00\u6e90\u7535\u5b50\u539f\u578b\u5e73\u53f0\u3002 EWAHBoolArray \uff1a bitmap \u7b97\u6cd5\u3002 mcush \uff1aMCU shell\u3002 DoST \uff1a Linux \u4e0b\u5f00\u53d1 STM32 \u3002 Avem : \u8fd9\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u9879\u76ee\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 5\u3001\u8d44\u6e90 / \u5de5\u5177 / \u7f51\u7ad9 / \u8bba\u575b 100ask download \uff1a\u767e\u6587\u7f51\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 armfly \uff1a\u5b89\u5bcc\u83b1 / \u786c\u6c49\u5d4c\u5165\u5f0f\u8bba\u575b\u3002 fire download \uff1a\u91ce\u706b\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 openedv download \uff1a\u6b63\u70b9\u539f\u5b50\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 \u91ce\u706b \uff1a\u91ce\u706b\u7535\u5b50\u8bba\u575b\u3002 \u6b63\u70b9 \uff1a\u6b63\u70b9\u539f\u5b50\u8bba\u575b\u3002 \u5c0f\u718a\u732b C++ IDE \uff1a\u8de8\u5e73\u53f0\u3001\u8f7b\u91cf\u6613\u7528\u7684\u5f00\u6e90 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 ST \uff1aST \u4e2d\u6587\u793e\u533a\u3002 \u8baf\u4e3a\u5f00\u53d1\u793e\u533a \uff1a\u5317\u4eac\u8baf\u4e3a ARM \u5f00\u53d1\u793e\u533a\u3002 \u8baf\u4e3a\u5b98\u7f51 \uff1a\u8baf\u4e3a\u5b98\u7f51\u3002 NXP \u793e\u533a \uff1a\u6069\u667a\u6d66\u8bba\u575b\u3002 Linux \uff1aLinux \u5185\u6838\u5b98\u7f51\u3002 Linux \u6e90\u7801 \uff1a\u53ef\u5728\u7ebf\u9605\u8bfb Linux \u5185\u6838\u6e90\u7801\u3002 Buildroot \uff1abuildroot \u6e90\u7801\u3002 Debian \uff1aDebian \u5b98\u7f51\u3002 Ubuntu \uff1aUbuntu \u5b98\u7f51\u3002 BOA \u5b98\u7f51 \uff1a\u4e00\u4e2a\u5355\u4efb\u52a1 web \u670d\u52a1\u5668 \uff0c\u53ef\u4ee5\u79fb\u690d\u5230\u5d4c\u5165\u5f0f\u5e73\u53f0\u3002 \u8354\u679d\u6d3e \uff1a\u8354\u679d\u6d3e\u6307\u5357\u3002 \u6e05\u534e\u955c\u50cf\u7ad9 \uff1a\u6e05\u534e\u5927\u5b66\u5f00\u6e90\u8f6f\u4ef6\u955c\u50cf\u7ad9\u3002 \u4e2d\u79d1\u5927\u955c\u50cf\u7ad9 \uff1a\u4e2d\u56fd\u79d1\u6280\u5927\u5b66\u955c\u50cf\u7ad9\u3002 u-boot \uff1au-boot \u6e90\u7801\u4e0b\u8f7d\u9875\u9762\u3002 bear-pi \uff1a\u5c0f\u718a\u6d3e demo\u3002 \u5b85\u5b66\u90e8\u843d \uff1a\u4e00\u4e2a Linux\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u5185\u6838\u3001\u9a71\u52a8\u5f00\u53d1\u5b66\u4e60\u7f51\u7ad9\u3002 \u5355\u7247\u673a\u6559\u7a0b\u7f51 \uff1a\u5355\u7247\u673a\u57fa\u7840\u3001\u8bbe\u8ba1\u5b9e\u4f8b\u3001\u8bba\u575b\u3002 GNU \uff1aGNU \u5b98\u7f51\u3002 ChinaUnix \uff1aLinux/Unix \u76f8\u5173\u3002 PyQt5 \uff1aPyQt5 \u6559\u7a0b\u3002 qter \uff1aQT \u5f00\u6e90\u793e\u533a\u3002 git \u624b\u518c \uff1agit \u5b66\u4e60\u624b\u518c\u3002 \u5f00\u6e90\u9879\u76ee\u98ce\u683c \uff1aGoogle \u5f00\u6e90\u9879\u76ee\u98ce\u683c\u6307\u5357 (\u4e2d\u6587\u7248)\u3002 \u7535\u5b50\u4e16\u5bb6 \uff1a\u4e00\u4e2a\u7535\u5b50\u7c7b\u5bfc\u822a\u7f51\u7ad9\u3002 21ic \uff1a21IC \u4e2d\u56fd\u7535\u5b50\u7f51\u3002 \u82af\u8def\u6052\u7535\u5b50 \uff1a\u5c0f\u6885\u54e5\u535a\u5ba2\u3001FPGA \u8bba\u575b\u3002 \u5d4c\u5165\u5f0f\u5f00\u53d1\u8005\u793e\u533a \uff1a\u521b\u9f99\u8bba\u575b\u3002 micropython \uff1amicropython \u4e2d\u6587\u7f51\u3002 \u6cf0\u6653\u79d1\u6280 \uff1aLinux \u76f8\u5173\u3002 \u7535\u5802\u79d1\u6280 \uff1aSTM32 \u76f8\u5173\u3002 \u6e90\u4ee3\u7801\u4f7f\u7528\u793a\u4f8b\u805a\u5408\u5668 \uff1a \u4ece\u8d85\u8fc7 100 \u4e07\u4e2a\u5f00\u6e90\u9879\u76ee\u641c\u7d22 CPP \u4ee3\u7801\u793a\u4f8b\u3002 KST-51 \uff1a\u300a\u624b\u628a\u624b\u6559\u4f60\u5b66 51 \u5355\u7247\u673a\u300b \u3002 \u539f\u5b50\u54e5 \uff1a\u4e13\u6ce8\u7535\u5b50\u6280\u672f\u6559\u5b66\u3002\u3002 digoboy \uff1a\u5730\u74dc\u6d3e\u89c6\u9891\u7f51\u3002 c.biancheng \uff1aC \u8bed\u8a00\u4e2d\u6587\u7f51\u3002 open-c-book \uff1a\u300aC \u8bed\u8a00\u7f16\u7a0b\u900f\u89c6\u300b\u3002 PyQt5 \uff1aPyQt5 \u5728\u7ebf\u6559\u7a0b\u3002 open-shell-book \uff1a\u300aShell \u7f16\u7a0b\u8303\u4f8b\u300b \u3002 software_unit_test \uff1a \u300a\u8f6f\u4ef6\u5355\u5143\u6d4b\u8bd5\u5165\u95e8\u4e0e\u5b9e\u8df5\u300b\u3002 kerneltravel \uff1aLinux \u5185\u6838\u4e4b\u65c5\u3002 \u8717\u7a9d\u79d1\u6280 \uff1a\u6162\u4e0b\u6765\uff0c\u4eab\u53d7\u6280\u672f\u3002 bookstack \uff1a\u4e66\u6808\u7f51\u3002 wireshark \uff1a\u6293\u5305\u5de5\u5177\u4e0b\u8f7d\u94fe\u63a5\u3002 MobaXterm \uff1a\u4e00\u4e2a\u597d\u7528\u7684\u7ec8\u7aef\u8f6f\u4ef6\u3002 Stduino \uff1a \u4e00\u6b3e\u9762\u5411 32 \u4f4d\u5904\u7406\u5668\u5feb\u901f\u5165\u95e8\u5b66\u4e60\u7684\u96c6\u6210\u5f00\u53d1\u5e73\u53f0 \u3002 easyicon \uff1a\u4e00\u4e2a\u514d\u8d39\u56fe\u6807\u4e0b\u8f7d\u7f51\u7ad9\u3002 codingdict \uff1a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u83dc\u9e1f\u6559\u7a0b\u7684\u7f16\u7a0b\u7c7b\u6559\u7a0b\u7f51\u7ad9\u3002 codingdict \u5f00\u6e90\u8f6f\u4ef6 \uff1acodingdict \u7f51\u7ad9\u6536\u96c6\u7684\u5404\u7c7b\u5f00\u6e90\u8f6f\u4ef6\u96c6\u5408\u3002 C \u7ecf\u5178\u793a\u4f8b \uff1a\u4e00\u4e9b C \u8bed\u8a00\u7684\u5b9e\u4f8b\u3002 xmake \uff1a\u8f7b\u91cf\u7ea7\u8de8\u5e73\u53f0 C/C++ \u6784\u5efa\u5de5\u5177\u3002 spacevim \uff1a\u4e00\u4e2a\u6a21\u5757\u5316\u7684 Vim IDE\u3002 vofa+ \uff1a\u4e00\u4e2a\u63d2\u4ef6\u9a71\u52a8\u7684\u9ad8\u81ea\u7531\u5ea6\u4e0a\u4f4d\u673a\u3002 \u8054\u5408\u5f00\u53d1\u7f51 \uff1a356 \u4e07\u4e2a\u7f16\u7a0b\u6e90\u7801\u8d44\u6599 \u89c5\u601d\u6587\u6863 \uff1a\u79c1\u6709\u4e91\u7b14\u8bb0\u3001\u4e91\u6587\u6863\u548c\u77e5\u8bc6\u5e93\u7cfb\u7edf\u3002 aardio \uff1a\u6613\u7528\u6027\u6781\u5f3a\u7684\u52a8\u6001\u8bed\u8a00\u3002 OneNET SDK \uff1aOneNET SDK \u4ed3\u5e93\u3002 ros \u624b\u518c \uff1aros \u7684\u5b98\u65b9\u624b\u518c\u3002 gnu \u7684\u5f00\u6e90\u8f6f\u4ef6 \uff1agnu \u7684\u5f00\u6e90\u8f6f\u4ef6 soft-and-hard \uff1a\u8fd9\u662f\u4e00\u4e2a\u4ee5\u7269\u8054\u7f51\u9879\u76ee\u4e3a\u4e3b\u65b9\u5411\u5206\u4eab web \u5f00\u53d1\u6559\u7a0b\u3002 FireflyTeam \uff1a\u4e00\u4e2a\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u4ed3\u5e93\u3002 python \u811a\u672c \uff1a\u4e00\u4e9b\u597d\u7528\u7684 python \u811a\u672c\u3002 C++ libraries \uff1aA list of open source C++ libraries. Lindenis \uff1aAn open source software for Lindenis SBC\u3002 fast-line-following \uff1a\u4e00\u4e2a\u5feb\u901f\u5bfb\u7ebf\u673a\u5668\u4eba\u7684\u7b97\u6cd5\u3002 \u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177 \uff1a\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177\u3002 Awesome-Embedded \uff1a\u6c47\u805a\u4e86\u5404\u79cd\u5d4c\u5165\u5f0f\u76f8\u5173\u7684\u8d44\u6e90\u3002 FreeModbus : FreeModbus \u662f\u4e00\u6b3e\u5f00\u6e90\u7684 Modbus \u534f\u8bae\u6808\uff0c\u4f46\u662f\u53ea\u6709\u4ece\u673a\u5f00\u6e90\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 6\u3001\u4e00\u4e9b\u82af\u7247\u539f\u5382\u4ee3\u7801\u4ed3\u5e93 STMicroelectronics \uff1a\u610f\u6cd5\u534a\u5bfc\u4f53\uff08ST\uff09\u3002 TI \uff1a\u5fb7\u5dde\u4eea\u5668\uff08TI\uff09\u3002 NXP \uff1a\u6069\u667a\u6d66\uff08NXP\uff09\u3002 Freescale \uff1a\u98de\u601d\u5361\u5c14\u534a\u5bfc\u4f53\uff08Freescale\uff09\u3002 hisilicon \uff1a\u6d77\u601d\u3002 rockchip \uff1a\u745e\u82af\u5fae\u3002 Samsung \uff1a\u4e09\u661f\u3002 Infineon \uff1a\u82f1\u98de\u51cc\u3002 analogdevicesinc \uff1a\u4e9a\u5fb7\u8bfa\u534a\u5bfc\u4f53\uff08ADI\uff09\u3002 MicrochipTech \uff1a\u5fae\u82af\u534a\u5bfc\u4f53\uff08Microchip \uff09\u3002 NordicSemiconductor \uff1a\u5317\u6b27\u96c6\u6210\u7535\u8def\uff08Nordic\uff09\u3002 cypress-io \uff1a\u8d5b\u666e\u62c9\u65af\u534a\u5bfc\u4f53\uff08Cypress\uff09\u3002 GD32 \uff1a\u6613\u5146\u521b\u65b0 (GD)\u3002 GD32 \u7f51\u76d8 \uff1a\uff1a\u6613\u5146\u521b\u65b0 (GD) \u7f51\u76d8\u8d44\u6599\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 7\u3001\u7269\u8054\u7f51\u3001\u667a\u80fd\u5bb6\u5c45 Domoticz \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u667a\u80fd\u5bb6\u5c45\u7cfb\u7edf \u3002 Kaa IoT Platform \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5f00\u653e\u548c\u9ad8\u6548\u7684\u7269\u8054\u7f51\u4e91\u5e73\u53f0\u3002 RT-Thread IoT SDK \uff1a\u57fa\u4e8e RT-Thread IOT \u5f00\u53d1\u677f\u7684\u5404\u7c7b\u4f8b\u7a0b\u3002 \u4ece\u96f6\u6253\u9020\u7269\u8054\u7f51 \uff1a\u4e00\u4efd\u9002\u5408\u5d4c\u5165\u5f0f\u5f00\u53d1\u4eba\u5458\u5b66\u4e60\u7684 web \u5f00\u53d1\u6559\u7a0b\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85...... 8\u3001\u673a\u5668\u4eba\u76f8\u5173 / \u5b9a\u4f4d / \u89c6\u89c9 RoboCar \uff1a\u673a\u5668\u4eba\u81ea\u52a8\u5bfb\u7ebf\u3001\u907f\u969c\u3001\u5efa\u56fe\u3001\u5bfc\u822a\u3001\u9065\u63a7\u7248\u672c / \u8f66\u8f7d\u7535\u8111\u7248\u672c\u8def\u9762\u5206\u6790\uff0c\u53ca\u4ea4\u901a\u8def\u51b5\u8bc6\u522b\u7684\u8f66\u8f86\u8f85\u52a9\u9a7e\u9a76\u7cfb\u7edf ROS \u6559\u7a0b \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf slam \uff1a\u601d\u5c9a\u79d1\u6280\u3002 9\u3001\u63a8\u8350\u535a\u5ba2 / \u535a\u6587 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 11 \u671f aardio \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 10 \u671f inih \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 9 \u671f nanopb \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 8 \u671f AMetal \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 7 \u671f zlog \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 6 \u671f FlexibleButton \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 5 \u671f smartlink \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 4 \u671f cola_os \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 3 \u671f sys/queue.h \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 2 \u671f llgui \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 1 \u671f gear-lib \u535a\u6587\u2014\u2014Tslib \u79fb\u690d\u4e0e\u5206\u6790 \u535a\u4e3b\u2014\u2014ychy \u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9 \uff0c\u67e5\u770b\u66f4\u591a\u8d44\u6e90\u3002 \u4e0b\u9762\u8ba1\u7b97\u673a\u8d44\u6e90\u4e3a\u7f51\u53cb dianjixz \u8d21\u732e\uff0c\u611f\u8c22\u8fd9\u4f4d\u670b\u53cb\u3002 \u8ba1\u7b97\u673a\u76f8\u5173\u8d44\u6e90 ------ \u6301\u7eed\u66f4\u65b0\u4e2d 1\u3001 \u6807\u51c6\u5e93 C++ \u6807\u51c6\u5e93\uff0c\u5305\u62ec\u4e86 STL \u5bb9\u5668\uff0c\u7b97\u6cd5\u548c\u51fd\u6570\u7b49\u3002 C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7c7b\u548c\u51fd\u6570\u7684\u96c6\u5408\uff0c\u4f7f\u7528\u6838\u5fc3\u8bed\u8a00\u7f16\u5199\uff0c\u4e5f\u662f C++ISO \u81ea\u8eab\u6807\u51c6\u7684\u4e00\u90e8\u5206\u3002 Standard Template Library \uff1a\u6807\u51c6\u6a21\u677f\u5e93 C POSIX library \uff1a POSIX \u7cfb\u7edf\u7684 C \u6807\u51c6\u5e93\u89c4\u8303 ISO C++ Standards Committee \uff1aC++ \u6807\u51c6\u59d4\u5458\u4f1a 2\u3001 \u6846\u67b6 C++ \u901a\u7528\u6846\u67b6\u548c\u5e93 Apache C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7b97\u6cd5\uff0c\u5bb9\u5668\uff0c\u8fed\u4ee3\u5668\u548c\u5176\u4ed6\u57fa\u672c\u7ec4\u4ef6\u7684\u96c6\u5408 ASL \uff1aAdobe \u6e90\u4ee3\u7801\u5e93\u63d0\u4f9b\u4e86\u540c\u884c\u7684\u8bc4\u5ba1\u548c\u53ef\u79fb\u690d\u7684 C++ \u6e90\u4ee3\u7801\u5e93\u3002 Boost \uff1a\u5927\u91cf\u901a\u7528 C++ \u5e93\u7684\u96c6\u5408\u3002 BDE \uff1a\u6765\u81ea\u4e8e\u5f6d\u535a\u8d44\u8baf\u5b9e\u9a8c\u5ba4\u7684\u5f00\u53d1\u73af\u5883\u3002 Cinder \uff1a\u63d0\u4f9b\u4e13\u4e1a\u54c1\u8d28\u521b\u9020\u6027\u7f16\u7801\u7684\u5f00\u6e90\u5f00\u53d1\u793e\u533a\u3002 Cxxomfort \uff1a\u8f7b\u91cf\u7ea7\u7684\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\u7684\u5e93\uff0c\u5c06 C++ 11 \u7684\u4e00\u4e9b\u65b0\u7279\u6027\u79fb\u690d\u5230 C++03 \u4e2d\u3002 Dlib \uff1a\u4f7f\u7528\u5951\u7ea6\u5f0f\u7f16\u7a0b\u548c\u73b0\u4ee3 C++ \u79d1\u6280\u8bbe\u8ba1\u7684\u901a\u7528\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 EASTL \uff1aEA-STL \u516c\u5171\u90e8\u5206 ffead-cpp \uff1a\u4f01\u4e1a\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Folly \uff1a\u7531 Facebook \u5f00\u53d1\u548c\u4f7f\u7528\u7684\u5f00\u6e90 C++ \u5e93 JUCE \uff1a\u5305\u7f57\u4e07\u8c61\u7684 C++ \u7c7b\u5e93\uff0c\u7528\u4e8e\u5f00\u53d1\u8de8\u5e73\u53f0\u8f6f\u4ef6 libPhenom \uff1a\u7528\u4e8e\u6784\u5efa\u9ad8\u6027\u80fd\u548c\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7cfb\u7edf\u7684\u4e8b\u4ef6\u6846\u67b6\u3002 LibSourcey \uff1a\u7528\u4e8e\u5b9e\u65f6\u7684\u89c6\u9891\u6d41\u548c\u9ad8\u6027\u80fd\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u7684 C++11 evented IO LibU \uff1a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93 Loki \uff1aC++ \u5e93\u7684\u8bbe\u8ba1\uff0c\u5305\u62ec\u5e38\u89c1\u7684 \u8bbe\u8ba1\u6a21\u5f0f \u548c\u4e60\u8bed\u7684\u5b9e\u73b0\u3002 MiLi \uff1a\u53ea\u542b\u5934\u6587\u4ef6\u7684\u5c0f\u578b C++ \u5e93 openFrameworks \uff1a\u5f00\u53d1 C++ \u5de5\u5177\u5305\uff0c\u7528\u4e8e\u521b\u610f\u6027\u7f16\u7801\u3002 Qt \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6 Reason \uff1a\u8de8\u5e73\u53f0\u7684\u6846\u67b6\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u5bb9\u6613\u5730\u4f7f\u7528 Java\uff0c.Net \u548c Python\uff0c\u540c\u65f6\u4e5f\u6ee1\u8db3\u4e86\u4ed6\u4eec\u5bf9 C++ \u6027\u80fd\u548c\u4f18\u52bf\u7684\u9700\u6c42\u3002 ROOT \uff1a\u5177\u5907\u6240\u6709\u529f\u80fd\u7684\u4e00\u7cfb\u5217\u9762\u5411\u5bf9\u8c61\u7684\u6846\u67b6\uff0c\u80fd\u591f\u975e\u5e38\u9ad8\u6548\u5730\u5904\u7406\u548c\u5206\u6790\u5927\u91cf\u7684\u6570\u636e\uff0c\u4e3a\u6b27\u6d32\u539f\u5b50\u80fd\u7814\u7a76\u673a\u6784\u6240\u7528\u3002 STLport \uff1a\u662f STL \u5177\u6709\u4ee3\u8868\u6027\u7684\u7248\u672c STXXL \uff1a\u7528\u4e8e\u989d\u5916\u7684\u5927\u578b\u6570\u636e\u96c6\u7684\u6807\u51c6\u6a21\u677f\u5e93\u3002 Ultimate++ \uff1aC++ \u8de8\u5e73\u53f0\u5feb\u901f\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Windows Template Library \uff1a\u7528\u4e8e\u5f00\u53d1 Windows \u5e94\u7528\u7a0b\u5e8f\u548c UI \u7ec4\u4ef6\u7684 C++ \u5e93 Yomm11 \uff1aC++11 \u7684\u5f00\u653e multi-methods. 3\u3001 \u4eba\u5de5\u667a\u80fd btsk \uff1a\u6e38\u620f\u884c\u4e3a\u6811\u542f\u52a8\u5668\u5de5\u5177 Evolving Objects \uff1a\u57fa\u4e8e\u6a21\u677f\u7684\uff0cANSI C++ \u6f14\u5316\u8ba1\u7b97\u5e93\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u975e\u5e38\u5feb\u901f\u5730\u7f16\u5199\u51fa\u81ea\u5df1\u7684\u968f\u673a\u4f18\u5316\u7b97\u6cd5\u3002 Neu \uff1aC++11 \u6846\u67b6\uff0c\u7f16\u7a0b\u8bed\u8a00\u96c6\uff0c\u7528\u4e8e\u521b\u5efa\u4eba\u5de5\u667a\u80fd\u5e94\u7528\u7a0b\u5e8f\u7684\u591a\u7528\u9014\u8f6f\u4ef6\u7cfb\u7edf\u3002 4\u3001 \u5f02\u6b65\u4e8b\u4ef6\u5faa\u73af Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 libev \uff1a\u529f\u80fd\u9f50\u5168\uff0c\u9ad8\u6027\u80fd\u7684\u65f6\u95f4\u5faa\u73af\uff0c\u8f7b\u5fae\u5730\u4eff\u6548 libevent\uff0c\u4f46\u662f\u4e0d\u518d\u50cf libevent \u4e00\u6837\u6709\u5c40\u9650\u6027\uff0c\u4e5f\u4fee\u590d\u4e86\u5b83\u7684\u4e00\u4e9b bug\u3002 libevent \uff1a\u4e8b\u4ef6\u901a\u77e5\u5e93 libuv \uff1a\u8de8\u5e73\u53f0\u5f02\u6b65 I/O\u3002 5\u3001\u97f3\u9891 \u97f3\u9891\uff0c\u58f0\u97f3\uff0c\u97f3\u4e50\uff0c\u6570\u5b57\u5316\u97f3\u4e50\u5e93 FMOD \uff1a\u6613\u4e8e\u4f7f\u7528\u7684\u8de8\u5e73\u53f0\u7684\u97f3\u9891\u5f15\u64ce\u548c\u97f3\u9891\u5185\u5bb9\u7684\u6e38\u620f\u521b\u4f5c\u5de5\u5177\u3002 Maximilian \uff1aC++ \u97f3\u9891\u548c\u97f3\u4e50\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5e93 OpenAL \uff1a\u5f00\u6e90\u97f3\u9891\u5e93\u2014\u8de8\u5e73\u53f0\u7684\u97f3\u9891 API Opus \uff1a\u4e00\u4e2a\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u514d\u7248\u7a0e\u7684\uff0c\u9ad8\u5ea6\u901a\u7528\u7684\u97f3\u9891\u7f16\u89e3\u7801\u5668 Speex \uff1a\u514d\u8d39\u7f16\u89e3\u7801\u5668\uff0c\u4e3a Opus \u6240\u5e9f\u5f03 Tonic \uff1a C++ \u6613\u7528\u548c\u9ad8\u6548\u7684\u97f3\u9891\u5408\u6210 Vorbis \uff1a Ogg Vorbis \u662f\u4e00\u79cd\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u975e\u4e13\u6709\u7684\uff0c\u514d\u7248\u7a0e\u7684\u901a\u7528\u538b\u7f29\u97f3\u9891\u683c\u5f0f\u3002 6\u3001 \u751f\u6001\u5b66 \u751f\u7269\u4fe1\u606f\uff0c\u57fa\u56e0\u7ec4\u5b66\u548c\u751f\u7269\u6280\u672f libsequence \uff1a\u7528\u4e8e\u8868\u793a\u548c\u5206\u6790\u7fa4\u4f53\u9057\u4f20\u5b66\u6570\u636e\u7684 C++ \u5e93\u3002 SeqAn \uff1a\u4e13\u6ce8\u4e8e\u751f\u7269\u6570\u636e\u5e8f\u5217\u5206\u6790\u7684\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u3002 Vcflib \uff1a\u7528\u4e8e\u89e3\u6790\u548c\u5904\u7406 VCF \u6587\u4ef6\u7684 C++ \u5e93 Wham \uff1a\u76f4\u63a5\u628a\u8054\u60f3\u6d4b\u8bd5\u5e94\u7528\u5230 BAM \u6587\u4ef6\u7684\u57fa\u56e0\u7ed3\u6784\u53d8\u5f02\u3002 7\u3001 \u538b\u7f29 \u538b\u7f29\u548c\u5f52\u6863\u5e93 bzip2 \uff1a\u4e00\u4e2a\u5b8c\u5168\u514d\u8d39\uff0c\u514d\u8d39\u4e13\u5229\u548c\u9ad8\u8d28\u91cf\u7684\u6570\u636e\u538b\u7f29 doboz \uff1a\u80fd\u591f\u5feb\u901f\u89e3\u538b\u7f29\u7684\u538b\u7f29\u5e93 PhysicsFS \uff1a\u5bf9\u5404\u79cd\u5f52\u6863\u63d0\u4f9b\u62bd\u8c61\u8bbf\u95ee\u7684\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\u89c6\u9891\u6e38\u620f\uff0c\u8bbe\u8ba1\u7075\u611f\u90e8\u5206\u6765\u81ea\u4e8e Quake3 \u7684\u6587\u4ef6\u5b50\u7cfb\u7edf\u3002 KArchive \uff1a\u7528\u4e8e\u521b\u5efa\uff0c\u8bfb\u5199\u548c\u64cd\u4f5c\u6587\u4ef6\u6863\u6848\uff08\u4f8b\u5982 zip \u548c tar\uff09\u7684\u5e93\uff0c\u5b83\u901a\u8fc7 QIODevice \u7684\u4e00\u7cfb\u5217\u5b50\u7c7b\uff0c\u4f7f\u7528 gzip \u683c\u5f0f\uff0c\u63d0\u4f9b\u4e86\u900f\u660e\u7684\u538b\u7f29\u548c\u89e3\u538b\u7f29\u7684\u6570\u636e\u3002 LZ4 \uff1a\u975e\u5e38\u5feb\u901f\u7684\u538b\u7f29\u7b97\u6cd5 LZHAM \uff1a\u65e0\u635f\u538b\u7f29\u6570\u636e\u5e93\uff0c\u538b\u7f29\u6bd4\u7387\u8ddf LZMA \u63a5\u8fd1\uff0c\u4f46\u662f\u89e3\u538b\u7f29\u901f\u5ea6\u5374\u8981\u5feb\u5f97\u591a\u3002 LZMA \uff1a7z \u683c\u5f0f\u9ed8\u8ba4\u548c\u901a\u7528\u7684\u538b\u7f29\u65b9\u6cd5\u3002 LZMAT \uff1a\u53ca\u5176\u5feb\u901f\u7684\u5b9e\u65f6\u65e0\u635f\u6570\u636e\u538b\u7f29\u5e93 miniz \uff1a\u5355\u4e00\u7684 C \u6e90\u6587\u4ef6\uff0c\u7d27\u7f29 / \u81a8\u80c0\u538b\u7f29\u5e93\uff0c\u4f7f\u7528 zlib \u517c\u5bb9 API\uff0cZIP \u5f52\u6863\u8bfb\u5199\uff0cPNG \u5199\u65b9\u5f0f\u3002 Minizip \uff1aZlib \u6700\u65b0 bug \u4fee\u590d\uff0c\u652f\u6301 PKWARE \u78c1\u76d8\u8de8\u8d8a\uff0cAES \u52a0\u5bc6\u548c IO \u7f13\u51b2\u3002 Snappy \uff1a\u5feb\u901f\u538b\u7f29\u548c\u89e3\u538b\u7f29 ZLib \uff1a\u975e\u5e38\u7d27\u51d1\u7684\u6570\u636e\u6d41\u538b\u7f29\u5e93 ZZIPlib \uff1a\u63d0\u4f9b ZIP \u5f52\u6863\u7684\u8bfb\u6743\u9650\u3002 8\u3001\u5e76\u53d1\u6027 \u5e76\u53d1\u6267\u884c\u548c\u591a\u7ebf\u7a0b Boost.Compute \uff1a\u7528\u4e8e OpenCL \u7684 C++GPU \u8ba1\u7b97\u5e93 Bolt \uff1a\u9488\u5bf9 GPU \u8fdb\u884c\u4f18\u5316\u7684 C++ \u6a21\u677f\u5e93 C++React \uff1a\u7528\u4e8e C++11 \u7684\u53cd\u5e94\u6027\u7f16\u7a0b\u5e93 Intel TBB \uff1aIntel \u7ebf\u7a0b\u6784\u4ef6\u5757 Libclsph \uff1a\u57fa\u4e8e OpenCL \u7684 GPU \u52a0\u901f SPH \u6d41\u4f53\u4eff\u771f\u5e93 OpenCL \uff1a\u5e76\u884c\u7f16\u7a0b\u7684\u5f02\u6784\u7cfb\u7edf\u7684\u5f00\u653e\u6807\u51c6 OpenMP \uff1aOpenMP API Thrust \uff1a\u7c7b\u4f3c\u4e8e C++ \u6807\u51c6\u6a21\u677f\u5e93\u7684\u5e76\u884c\u7b97\u6cd5\u5e93 HPX \uff1a\u7528\u4e8e\u4efb\u4f55\u89c4\u6a21\u7684\u5e76\u884c\u548c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u7684\u901a\u7528 C++ \u8fd0\u884c\u65f6\u7cfb\u7edf VexCL \uff1a\u7528\u4e8e OpenCL/CUDA \u7684 C++ \u5411\u91cf\u8868\u8fbe\u5f0f\u6a21\u677f\u5e93\u3002 9\u3001 \u5bb9\u5668 C++ B-tree \uff1a\u57fa\u4e8e B \u6811\u6570\u636e\u7ed3\u6784\uff0c\u5b9e\u73b0\u547d\u4ee4\u5185\u5b58\u5bb9\u5668\u7684\u6a21\u677f\u5e93 Hashmaps \uff1a C++ \u4e2d\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7b97\u6cd5\u7684\u5b9e\u73b0 10\u3001 \u5bc6\u7801\u5b66 Bcrypt \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u6587\u4ef6\u52a0\u5bc6\u5de5\u5177\uff0c\u52a0\u5bc6\u6587\u4ef6\u53ef\u4ee5\u79fb\u690d\u5230\u6240\u6709\u53ef\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\u548c\u5904\u7406\u5668\u4e2d\u3002 BeeCrypt \uff1a Botan \uff1a C++ \u52a0\u5bc6\u5e93 Crypto++ \uff1a\u4e00\u4e2a\u6709\u5173\u52a0\u5bc6\u65b9\u6848\u7684\u514d\u8d39\u7684 C++ \u5e93 GnuPG \uff1a OpenPGP \u6807\u51c6\u7684\u5b8c\u6574\u5b9e\u73b0 GnuTLS \uff1a\u5b9e\u73b0\u4e86 SSL\uff0cTLS \u548c DTLS \u534f\u8bae\u7684\u5b89\u5168\u901a\u4fe1\u5e93 Libgcrypt libmcrypt LibreSSL \uff1a\u514d\u8d39\u7684 SSL/TLS \u534f\u8bae\uff0c\u5c5e\u4e8e 2014 OpenSSL \u7684\u4e00\u4e2a\u5206\u652f LibTomCrypt \uff1a\u4e00\u4e2a\u975e\u5e38\u5168\u9762\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u79fb\u690d\u7684\u52a0\u5bc6\u5de5\u5177 libsodium \uff1a\u57fa\u4e8e NaCI \u7684\u52a0\u5bc6\u5e93\uff0c\u56fa\u6267\u5df1\u89c1\uff0c\u5bb9\u6613\u4f7f\u7528 Nettle \u5e95\u5c42\u7684\u52a0\u5bc6\u5e93 OpenSSL \uff1a \u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u5546\u7528\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\uff0c\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u52a0\u5bc6\u5e93\u3002 Tiny AES128 in C \uff1a\u7528 C \u5b9e\u73b0\u7684\u4e00\u4e2a\u5c0f\u5de7\uff0c\u53ef\u79fb\u690d\u7684\u5b9e\u73b0\u4e86 AES128ESB \u7684\u52a0\u5bc6\u7b97\u6cd5 11\u3001 \u6570\u636e\u5e93 \u6570\u636e\u5e93\uff0cSQL \u670d\u52a1\u5668\uff0cODBC \u9a71\u52a8\u7a0b\u5e8f\u548c\u5de5\u5177 hiberlite \uff1a\u7528\u4e8e Sqlite3 \u7684 C++ \u5bf9\u8c61\u5173\u7cfb\u6620\u5c04 Hiredis \uff1a \u7528\u4e8e Redis \u6570\u636e\u5e93\u7684\u5f88\u7b80\u5355\u7684 C \u5ba2\u6237\u7aef\u5e93 LevelDB \uff1a \u5feb\u901f\u952e\u503c\u5b58\u50a8\u5e93 LMDB \uff1a\u7b26\u5408\u6570\u636e\u5e93\u56db\u5927\u57fa\u672c\u5143\u7d20\u7684\u5d4c\u5165\u952e\u503c\u5b58\u50a8 MySQL++ \uff1a\u5c01\u88c5\u4e86 MySql \u7684 C API \u7684 C++ \u5305\u88c5\u5668 RocksDB \uff1a\u6765\u81ea Facebook \u7684\u5d4c\u5165\u952e\u503c\u7684\u5feb\u901f\u5b58\u50a8 SQLite \uff1a\u4e00\u4e2a\u5b8c\u5168\u5d4c\u5165\u5f0f\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5173\u7cfb\u6570\u636e\u5e93\uff0c\u53ea\u6709\u51e0\u767e KB\uff0c\u53ef\u4ee5\u6b63\u786e\u5305\u542b\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u3002 12\u3001 \u8c03\u8bd5 \u8c03\u8bd5\u5e93\uff0c \u5185\u5b58\u548c\u8d44\u6e90\u6cc4\u9732\u68c0\u6d4b\uff0c\u5355\u5143\u6d4b\u8bd5 Boost.Test \uff1aBoost \u6d4b\u8bd5\u5e93 Catch \uff1a\u4e00\u4e2a\u5f88\u65f6\u5c1a\u7684\uff0cC++ \u539f\u751f\u7684\u6846\u67b6\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\uff0c\u7528\u4e8e\u5355\u5143\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\u548c\u884c\u4e3a\u9a71\u52a8\u5f00\u53d1\u3002 CppUnit \uff1a\u7531 JUnit \u79fb\u690d\u8fc7\u6765\u7684 C++ \u6d4b\u8bd5\u6846\u67b6 CTest \uff1aCMake \u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6 ig-debugheap \uff1a\u7528\u4e8e\u8ddf\u8e2a\u5185\u5b58\u9519\u8bef\u7684\u591a\u5e73\u53f0\u8c03\u8bd5\u5806 libtap \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u6d4b\u8bd5 MemTrack \u2014\u7528\u4e8e C++ \u8ddf\u8e2a\u5185\u5b58\u5206\u914d microprofile - \u8de8\u5e73\u53f0\u7684\u7f51\u7edc\u8bd5\u56fe\u5206\u6790\u5668 minUnit \uff1a\u4f7f\u7528 C \u5199\u7684\u8ff7\u4f60\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff0c\u53ea\u4f7f\u7528\u4e86\u4e24\u4e2a\u5b8f Remotery \uff1a\u7528\u4e8e web \u89c6\u56fe\u7684\u5355\u4e00 C \u6587\u4ef6\u5206\u6790\u5668 UnitTest++ \uff1a\u8f7b\u91cf\u7ea7\u7684 C++ \u5355\u5143\u6d4b\u8bd5\u6846\u67b6 13\u3001 \u6e38\u620f\u5f15\u64ce Cocos2d-x \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u6846\u67b6\uff0c\u7528\u4e8e\u6784\u5efa 2D \u6e38\u620f\uff0c\u4e92\u52a8\u56fe\u4e66\uff0c\u6f14\u793a\u548c\u5176\u4ed6\u56fe\u5f62\u5e94\u7528\u7a0b\u5e8f\u3002 Grit \uff1a\u793e\u533a\u9879\u76ee\uff0c\u7528\u4e8e\u6784\u5efa\u4e00\u4e2a\u514d\u8d39\u7684\u6e38\u620f\u5f15\u64ce\uff0c\u5b9e\u73b0\u5f00\u653e\u7684\u4e16\u754c 3D \u6e38\u620f\u3002 Irrlicht \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u5f00\u6e90\u9ad8\u6027\u80fd\u7684\u5b9e\u65f6 #D \u5f15\u64ce Polycode \uff1aC++ \u5b9e\u73b0\u7684\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u5f00\u6e90\u6846\u67b6\uff08\u4e0e Lua \u7ed1\u5b9a\uff09\u3002 14\u3001 \u56fe\u5f62\u7528\u6237\u754c\u9762 CEGUI \uff1a \u5f88\u7075\u6d3b\u7684\u8de8\u5e73\u53f0 GUI \u5e93 FLTK \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u8de8\u5e73\u53f0\u7684 C++GUI \u5de5\u5177\u5305\u3002 GTK+ \uff1a \u7528\u4e8e\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684\u8de8\u5e73\u53f0\u5de5\u5177\u5305 gtkmm \uff1a\u7528\u4e8e\u53d7\u6b22\u8fce\u7684 GUI \u5e93 GTK + \u7684\u5b98\u65b9 C++ \u63a5\u53e3\u3002 imgui \uff1a\u62e5\u6709\u6700\u5c0f\u4f9d\u8d56\u5173\u7cfb\u7684\u7acb\u5373\u6a21\u5f0f\u56fe\u5f62\u7528\u6237\u754c\u9762 libRocket \uff1a libRocket \u662f\u4e00\u4e2a C++ HTML/CSS \u6e38\u620f\u63a5\u53e3\u4e2d\u95f4\u4ef6 MyGUI \uff1a\u5feb\u901f\uff0c\u7075\u6d3b\uff0c\u7b80\u5355\u7684 GUI Ncurses \uff1a\u7ec8\u7aef\u7528\u6237\u754c\u9762 QCustomPlot \uff1a\u6ca1\u6709\u66f4\u591a\u4f9d\u8d56\u5173\u7cfb\u7684 Qt \u7ed8\u56fe\u63a7\u4ef6 Qwt \uff1a\u7528\u6237\u4e0e\u6280\u672f\u5e94\u7528\u7684 Qt \u63a7\u4ef6 QwtPlot3D \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u57fa\u4e8e Qt/OpenGL \u7684 C++ \u7f16\u7a0b\u5e93\uff0c\u672c\u8d28\u4e0a\u63d0\u4f9b\u4e86\u4e00\u7fa4 3D \u63a7\u4ef6 OtterUI \uff1a OtterUI \u662f\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u548c\u4e92\u52a8\u5a31\u4e50\u8f6f\u4ef6\u7684\u7528\u6237\u754c\u9762\u5f00\u53d1\u89e3\u51b3\u65b9\u6848 PDCurses \u5305\u542b\u6e90\u4ee3\u7801\u548c\u9884\u7f16\u8bd1\u5e93\u7684\u516c\u5171\u56fe\u5f62\u51fd\u6570\u5e93 wxWidgets C++ \u5e93\uff0c\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u4f7f\u7528\u4e00\u4e2a\u4ee3\u7801\u5e93\u53ef\u4ee5\u4e3a widows\uff0c Mac OS X\uff0cLinux \u548c\u5176\u4ed6\u5e73\u53f0\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f 15\u3001 \u56fe\u5f62 bgfx \uff1a\u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u5e93 Cairo \uff1a\u652f\u6301\u591a\u79cd\u8f93\u51fa\u8bbe\u5907\u7684 2D \u56fe\u5f62\u5e93 Horde3D \u4e00\u4e2a\u5c0f\u578b\u7684 3D \u6e32\u67d3\u548c\u52a8\u753b\u5f15\u64ce magnum C++11 \u548c OpenGL 2D/3D \u56fe\u5f62\u5f15\u64ce Ogre 3D \u7528 C++ \u7f16\u5199\u7684\u4e00\u4e2a\u9762\u5411\u573a\u666f\uff0c\u5b9e\u65f6\uff0c\u7075\u6d3b\u7684 3D \u6e32\u67d3\u5f15\u64ce\uff08\u5e76\u975e\u6e38\u620f\u5f15\u64ce\uff09 OpenSceneGraph \u5177\u6709\u9ad8\u6027\u80fd\u7684\u5f00\u6e90 3D \u56fe\u5f62\u5de5\u5177\u5305 Panda3D \u7528\u4e8e 3D \u6e32\u67d3\u548c\u6e38\u620f\u5f00\u53d1\u7684\u6846\u67b6\uff0c\u7528 Python \u548c C++ \u7f16\u5199\u3002 Skia \u7528\u4e8e\u7ed8\u5236\u6587\u5b57\uff0c\u56fe\u5f62\u548c\u56fe\u50cf\u7684\u5b8c\u6574\u7684 2D \u56fe\u5f62\u5e93 urho3d \u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u548c\u6e38\u620f\u5f15\u64ce\u3002 16\u3001 \u56fe\u50cf\u5904\u7406 Boost.GIL \uff1a\u901a\u7528\u56fe\u50cf\u5e93 CImg \uff1a\u7528\u4e8e\u56fe\u50cf\u5904\u7406\u7684\u5c0f\u578b\u5f00\u6e90 C++ \u5de5\u5177\u5305 CxImage \uff1a\u7528\u4e8e\u52a0\u8f7d\uff0c\u4fdd\u5b58\uff0c\u663e\u793a\u548c\u8f6c\u6362\u7684\u56fe\u50cf\u5904\u7406\u548c\u8f6c\u6362\u5e93\uff0c\u53ef\u4ee5\u5904\u7406\u7684\u56fe\u7247\u683c\u5f0f\u5305\u62ec BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K\u3002 FreeImage \uff1a\u5f00\u6e90\u5e93\uff0c\u652f\u6301\u73b0\u5728\u591a\u5a92\u4f53\u5e94\u7528\u6240\u9700\u7684\u901a\u7528\u56fe\u7247\u683c\u5f0f\u548c\u5176\u4ed6\u683c\u5f0f\u3002 GDCM \uff1aGrassroots DICOM \u5e93 ITK \uff1a\u8de8\u5e73\u53f0\u7684\u5f00\u6e90\u56fe\u50cf\u5206\u6790\u7cfb\u7edf Magick++ \uff1aImage Magic k \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 MagickWnd \uff1aImageMagick \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 OpenCV \uff1a \u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u7c7b\u5e93 tesseract-ocr \uff1aOCR \u5f15\u64ce VIGRA \uff1a\u7528\u4e8e\u56fe\u50cf\u5206\u6790\u901a\u7528 C++ \u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 VTK \uff1a\u7528\u4e8e 3D \u8ba1\u7b97\u673a\u56fe\u5f62\u5b66\uff0c\u56fe\u50cf\u5904\u7406\u548c\u53ef\u89c6\u5316\u7684\u5f00\u6e90\u514d\u8d39\u8f6f\u4ef6\u7cfb\u7edf\u3002 17\u3001 \u56fd\u9645\u5316 gettext \uff1aGNU `gettext\u2019 IBM ICU \uff1a\u63d0\u4f9b Unicode \u548c\u5168\u7403\u5316\u652f\u6301\u7684 C\u3001C++ \u548c Java \u5e93 libiconv \uff1a\u7528\u4e8e\u4e0d\u540c\u5b57\u7b26\u7f16\u7801\u4e4b\u95f4\u7684\u7f16\u7801\u8f6c\u6362\u5e93 18\u3001 Jason frozen \uff1a C/C++ \u7684 Jason \u89e3\u6790\u751f\u6210\u5668 Jansson \uff1a\u8fdb\u884c\u7f16\u89e3\u7801\u548c\u5904\u7406 Jason \u6570\u636e\u7684 C \u8bed\u8a00\u5e93 jbson \uff1aC++14 \u4e2d\u6784\u5efa\u548c\u8fed\u4ee3 BSON data, \u548c Json \u6587\u6863\u7684\u5e93 JeayeSON \uff1a\u975e\u5e38\u5065\u5168\u7684 C++ JSON \u5e93\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 JSON++ \uff1a C++ JSON \u89e3\u6790\u5668 json-parser \uff1a\u7528\u53ef\u79fb\u690d\u7684 ANSI C \u7f16\u5199\u7684 JSON \u89e3\u6790\u5668\uff0c\u5360\u7528\u5185\u5b58\u975e\u5e38\u5c11 json11 \uff1a\u4e00\u4e2a\u8ff7\u4f60\u7684 C++11 JSON \u5e93 jute \uff1a\u975e\u5e38\u7b80\u5355\u7684 C++ JSON \u89e3\u6790\u5668 ibjson \uff1aC \u8bed\u8a00\u4e2d\u7684 JSON \u89e3\u6790\u548c\u6253\u5370\u5e93\uff0c\u5f88\u5bb9\u6613\u548c\u4efb\u4f55\u6a21\u578b\u96c6\u6210\u3002 libjson \uff1a\u8f7b\u91cf\u7ea7\u7684 JSON \u5e93 PicoJSON \uff1aC++ \u4e2d JSON \u89e3\u6790\u5e8f\u5217\u5316\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 qt-json \uff1a\u7528\u4e8e JSON \u6570\u636e\u548c QVariant \u5c42\u6b21\u95f4\u7684\u76f8\u4e92\u89e3\u6790\u7684\u7b80\u5355\u7c7b QJson \uff1a\u5c06 JSON \u6570\u636e\u6620\u5c04\u5230 QVariant \u5bf9\u8c61\u7684\u57fa\u4e8e Qt \u7684\u5e93 RapidJSON \uff1a \u7528\u4e8e C++ \u7684\u5feb\u901f JSON \u89e3\u6790\u751f\u6210\u5668\uff0c\u5305\u542b SAX \u548c DOM \u4e24\u79cd\u98ce\u683c\u7684 API YAJL \uff1aC \u8bed\u8a00\u4e2d\u5feb\u901f\u6d41 JSON \u89e3\u6790\u5e93 19\u3001 \u65e5\u5fd7 Boost.Log \uff1a\u8bbe\u8ba1\u975e\u5e38\u6a21\u5757\u5316\uff0c\u5e76\u4e14\u5177\u6709\u6269\u5c55\u6027 easyloggingpp \uff1aC++ \u65e5\u5fd7\u5e93\uff0c\u53ea\u5305\u542b\u5355\u4e00\u7684\u5934\u6587\u4ef6\u3002 Log4cpp \uff1a\u4e00\u7cfb\u5217 C++ \u7c7b\u5e93\uff0c\u7075\u6d3b\u6dfb\u52a0\u65e5\u5fd7\u5230\u6587\u4ef6\uff0c\u7cfb\u7edf\u65e5\u5fd7\uff0cIDSA \u548c\u5176\u4ed6\u5730\u65b9\u3002 templog \uff1a\u8f7b\u91cf\u7ea7 C++ \u5e93\uff0c\u53ef\u4ee5\u6dfb\u52a0\u65e5\u5fd7\u5230\u4f60\u7684 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d 20\u3001 \u673a\u5668\u5b66\u4e60 Caffe \uff1a\u5feb\u901f\u7684\u795e\u7ecf\u7f51\u7edc\u6846\u67b6 CCV \uff1a\u4ee5 C \u8bed\u8a00\u4e3a\u6838\u5fc3\u7684\u73b0\u4ee3\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 mlpack \uff1a\u53ef\u6269\u5c55\u7684 C++ \u673a\u5668\u5b66\u4e60\u5e93 OpenCV \uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 Recommender \uff1a\u4f7f\u7528\u534f\u540c\u8fc7\u6ee4\u8fdb\u884c\u4ea7\u54c1\u63a8\u8350 / \u5efa\u8bae\u7684 C \u8bed\u8a00\u5e93\u3002 SHOGUN \uff1aShogun \u673a\u5668\u5b66\u4e60\u5de5\u5177 sofia-ml \uff1a\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684\u5feb\u901f\u589e\u91cf\u7b97\u6cd5\u5957\u4ef6 21\u3001 \u6570\u5b66 Armadillo \uff1a\u9ad8\u8d28\u91cf\u7684 C++ \u7ebf\u6027\u4ee3\u6570\u5e93\uff0c\u901f\u5ea6\u548c\u6613\u7528\u6027\u505a\u5230\u4e86\u5f88\u597d\u7684\u5e73\u8861\u3002\u8bed\u6cd5\u548c MatlAB \u5f88\u76f8\u4f3c blaze \uff1a\u9ad8\u6027\u80fd\u7684 C++ \u6570\u5b66\u5e93\uff0c\u7528\u4e8e\u5bc6\u96c6\u548c\u7a00\u758f\u7b97\u6cd5\u3002 ceres-solver \uff1a\u6765\u81ea\u8c37\u6b4c\u7684 C++ \u5e93\uff0c\u7528\u4e8e\u5efa\u6a21\u548c\u89e3\u51b3\u5927\u578b\u590d\u6742\u975e\u7ebf\u6027\u6700\u5c0f\u5e73\u65b9\u95ee\u9898\u3002 CGal \uff1a \u9ad8\u6548\uff0c\u53ef\u9760\u7684\u96c6\u5408\u7b97\u6cd5\u96c6\u5408 cml \uff1a\u7528\u4e8e\u6e38\u620f\u548c\u56fe\u5f62\u7684\u514d\u8d39 C++ \u6570\u5b66\u5e93 Eigen \uff1a\u9ad8\u7ea7 C++ \u6a21\u677f\u5934\u6587\u4ef6\u5e93\uff0c\u5305\u62ec\u7ebf\u6027\u4ee3\u6570\uff0c\u77e9\u9635\uff0c\u5411\u91cf\u64cd\u4f5c\uff0c\u6570\u503c\u89e3\u51b3\u548c\u5176\u4ed6\u76f8\u5173\u7684\u7b97\u6cd5\u3002 GMTL \uff1a\u6570\u5b66\u56fe\u5f62\u6a21\u677f\u5e93\u662f\u4e00\u7ec4\u5e7f\u6cdb\u5b9e\u73b0\u57fa\u672c\u56fe\u5f62\u7684\u5de5\u5177\u3002 GMP \uff1a\u7528\u4e8e\u4e2a\u9ad8\u7cbe\u5ea6\u8ba1\u7b97\u7684 C/C++ \u5e93\uff0c\u5904\u7406\u6709\u7b26\u53f7\u6574\u6570\uff0c\u6709\u7406\u6570\u548c \u6d6e\u70b9\u6570 \u3002 22\u3001 \u591a\u5a92\u4f53 GStreamer \uff1a\u6784\u5efa\u5a92\u4f53\u5904\u7406\u7ec4\u4ef6\u56fe\u5f62\u7684\u5e93 LIVE555 Streaming Media \uff1a\u4f7f\u7528\u5f00\u653e\u6807\u51c6\u534f\u8bae (RTP/RTCP, RTSP, SIP) \u7684\u591a\u5a92\u4f53\u6d41\u5e93 libVLC \uff1alibVLC (VLC SDK) \u5a92\u4f53\u6846\u67b6 QtAv \uff1a\u57fa\u4e8e Qt \u548c FFmpeg \u7684\u591a\u5a92\u4f53\u64ad\u653e\u6846\u67b6\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u8f7b\u800c\u6613\u4e3e\u5730\u7f16\u5199\u51fa\u4e00\u4e2a\u64ad\u653e\u5668 SDL \uff1a\u7b80\u5355\u76f4\u63a7\u5a92\u4f53\u5c42 SFML \uff1a\u5feb\u901f\uff0c\u7b80\u5355\u7684\u591a\u5a92\u4f53\u5e93 23\u3001 \u7f51\u7edc ACE \uff1aC++ \u9762\u5411\u5bf9\u8c61\u7f51\u7edc\u53d8\u6210\u5de5\u5177\u5305 Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93 Casablanca \uff1aC++ REST SDK cpp-netlib \uff1a\u9ad8\u7ea7\u7f51\u7edc\u7f16\u7a0b\u7684\u5f00\u6e90\u5e93\u96c6\u5408 Dyad.c \uff1aC \u8bed\u8a00\u7684\u5f02\u6b65\u7f51\u7edc libcurl : \u591a\u534f\u8bae\u6587\u4ef6\u4f20\u8f93\u5e93 Mongoose \uff1a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7f51\u7edc\u670d\u52a1\u5668 Muduo \uff1a\u7528\u4e8e Linux \u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u7684 C++ \u975e\u963b\u585e\u7f51\u7edc\u5e93 net_skeleton \uff1aC/C++ \u7684 TCP \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 nope.c \uff1a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8d85\u8f7b\u578b\u8f6f\u4ef6\u5e73\u53f0\uff0c\u7528\u4e8e\u53ef\u6269\u5c55\u7684\u670d\u52a1\u5668\u7aef\u548c\u7f51\u7edc\u5e94\u7528\u3002 \u5bf9\u4e8e C \u7f16\u7a0b\u4eba\u5458\uff0c\u53ef\u4ee5\u8003\u8651 node.js Onion :C \u8bed\u8a00 HTTP \u670d\u52a1\u5668\u5e93\uff0c\u5176\u8bbe\u8ba1\u4e3a\u8f7b\u91cf\u7ea7\uff0c\u6613\u4f7f\u7528\u3002 POCO \uff1a\u7528\u4e8e\u6784\u5efa\u7f51\u7edc\u548c\u57fa\u4e8e\u4e92\u8054\u7f51\u5e94\u7528\u7a0b\u5e8f\u7684 C++ \u7c7b\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728\u684c\u9762\uff0c\u670d\u52a1\u5668\uff0c\u79fb\u52a8\u548c\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3002 RakNet \uff1a\u4e3a\u6e38\u620f\u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u7684\u8de8\u5e73\u53f0\u7684\u5f00\u6e90 C++ \u7f51\u7edc\u5f15\u64ce\u3002 Tuf o \uff1a\u7528\u4e8e Qt \u4e4b\u4e0a\u7684 C++ \u6784\u5efa\u7684\u5f02\u6b65 Web \u6846\u67b6\u3002 WebSocket++ \uff1a\u57fa\u4e8e C++/Boost Aiso \u7684 websocket \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 ZeroMQ \uff1a\u9ad8\u901f\uff0c\u6a21\u5757\u5316\u7684\u5f02\u6b65\u901a\u4fe1\u5e93 24\u3001 \u7269\u7406\u5b66 \u52a8\u529b\u5b66\u4eff\u771f\u5f15\u64ce Box2D \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Bullet \uff1a3D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Chipmunk \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684 2D \u6e38\u620f\u7269\u7406\u5e93 LiquidFun \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce ODE \uff1a\u5f00\u653e\u52a8\u529b\u5b66\u5f15\u64ce - \u5f00\u6e90\uff0c\u9ad8\u6027\u80fd\u5e93\uff0c\u6a21\u62df\u521a\u4f53\u52a8\u529b\u5b66\u3002 ofxBox2d \uff1aBox2D \u5f00\u6e90\u6846\u67b6\u5305\u88c5\u5668\u3002 Simbody \uff1a\u9ad8\u6027\u80fd C++ \u591a\u4f53\u52a8\u529b\u5b66 / \u7269\u7406\u5e93\uff0c\u6a21\u62df\u5173\u8282\u751f\u7269\u529b\u5b66\u548c\u673a\u68b0\u7cfb\u7edf\uff0c\u50cf\u8f66\u8f86\uff0c\u673a\u5668\u4eba\u548c\u4eba\u4f53\u9aa8\u9abc\u3002 25\u3001 \u673a\u5668\u4eba\u5b66 MOOS-IvP \uff1a\u4e00\u7ec4\u5f00\u6e90 C++ \u6a21\u5757\uff0c\u63d0\u4f9b\u673a\u5668\u4eba\u5e73\u53f0\u7684\u81ea\u4e3b\u6743\uff0c\u5c24\u5176\u662f\u81ea\u4e3b\u7684\u6d77\u6d0b\u8f66\u8f86\u3002 MRPT \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u7f16\u7a0b\u5de5\u5177\u5305 PCL \uff1a\u70b9\u4e91\u5e93\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\uff0c\u5927\u89c4\u6a21\u7684\u5f00\u653e\u9879\u76ee\uff0c\u7528\u4e8e 2D/3D \u56fe\u50cf\u548c\u70b9\u4e91\u5904\u7406\u3002 Robotics Library (RL) \uff1a \u4e00\u4e2a\u72ec\u7acb\u7684 C++ \u5e93\uff0c\u5305\u62ec\u673a\u5668\u4eba\u52a8\u529b\u5b66\uff0c\u8fd0\u52a8\u89c4\u5212\u548c\u63a7\u5236\u3002 RobWork \uff1a\u4e00\u7ec4 C++ \u5e93\u7684\u96c6\u5408\uff0c\u7528\u4e8e\u673a\u5668\u4eba\u7cfb\u7edf\u7684\u4eff\u771f\u548c\u63a7\u5236\u3002 ROS \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b\u5e93\u548c\u5de5\u5177\u5e2e\u52a9\u8f6f\u4ef6\u5f00\u53d1\u4eba\u5458\u521b\u5efa\u673a\u5668\u4eba\u5e94\u7528\u7a0b\u5e8f\u3002 26\u3001 \u79d1\u5b66\u8ba1\u7b97 FFTW : \u7528\u4e00\u7ef4\u6216\u8005\u591a\u7ef4\u8ba1\u7b97 DFT \u7684 C \u8bed\u8a00\u5e93\u3002 GSL \uff1aGNU \u79d1\u5b66\u5e93\u3002 27\u3001 \u811a\u672c ChaiScript \uff1a\u7528\u4e8e C++ \u7684\u6613\u4e8e\u4f7f\u7528\u7684\u5d4c\u5165\u5f0f\u811a\u672c\u8bed\u8a00\u3002 Lua \uff1a\u7528\u4e8e\u914d\u7f6e\u6587\u4ef6\u548c\u57fa\u672c\u5e94\u7528\u7a0b\u5e8f\u811a\u672c\u7684\u5c0f\u578b\u5feb\u901f\u811a\u672c\u5f15\u64ce\u3002 luacxx \uff1a\u7528\u4e8e\u521b\u5efa Lua \u7ed1\u5b9a\u7684 C++ 11 API SWIG \uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u7684 C++ \u4ee3\u7801\u94fe\u63a5\u5230 JavaScript\uff0cPerl\uff0cPHP\uff0cPython\uff0cTcl \u548c Ruby \u7684\u5305\u88c5\u5668 / \u63a5\u53e3\u751f\u6210\u5668 V7 \uff1a\u5d4c\u5165\u5f0f\u7684 JavaScript \u5f15\u64ce\u3002 V8 \uff1a\u8c37\u6b4c\u7684\u5feb\u901f JavaScript \u5f15\u64ce\uff0c\u53ef\u4ee5\u88ab\u5d4c\u5165\u5230\u4efb\u4f55 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002 28\u3001 \u5e8f\u5217\u5316 Cap\u2019n Proto \uff1a\u5feb\u901f\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u548c RPC \u7cfb\u7edf\u3002 cereal \uff1aC++11 \u5e8f\u5217\u5316\u5e93 FlatBuffers \uff1a\u5185\u5b58\u9ad8\u6548\u7684\u5e8f\u5217\u5316\u5e93 MessagePack \uff1aC/C++ \u7684\u9ad8\u6548\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u5e93\uff0c\u4f8b\u5982 JSON protobuf \uff1a\u534f\u8bae\u7f13\u51b2\uff0c\u8c37\u6b4c\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u3002 protobuf-c \uff1aC \u8bed\u8a00\u7684\u534f\u8bae\u7f13\u51b2\u5b9e\u73b0 SimpleBinaryEncoding \uff1a\u7528\u4e8e\u4f4e\u5ef6\u8fdf\u5e94\u7528\u7a0b\u5e8f\u7684\u5bf9\u4e8c\u8fdb\u5236\u683c\u5f0f\u7684\u5e94\u7528\u7a0b\u5e8f\u4fe1\u606f\u7684\u7f16\u7801\u548c\u89e3\u7801\u3002 Thrift \uff1a\u9ad8\u6548\u7684\u8de8\u8bed\u8a00 IPC/RPC\uff0c\u7528\u4e8e C++\uff0cJava\uff0cPython\uff0cPHP\uff0cC# \u548c\u5176\u5b83\u591a\u79cd\u8bed\u8a00\u4e2d\uff0c\u6700\u521d\u7531 Twitter \u5f00\u53d1\u3002 29\u3001 \u89c6\u9891 libvpx \uff1aVP8/VP9 \u7f16\u7801\u89e3\u7801 SDK FFmpeg \uff1a\u4e00\u4e2a\u5b8c\u6574\u7684\uff0c\u8de8\u5e73\u53f0\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u7528\u4e8e\u8bb0\u5f55\uff0c\u8f6c\u6362\u89c6\u9891\u548c\u97f3\u9891\u6d41\u3002 libde265 \uff1a\u5f00\u653e\u7684 h.265 \u89c6\u9891\u7f16\u89e3\u7801\u5668\u7684\u5b9e\u73b0\u3002 OpenH264 \uff1a\u5f00\u6e90 H.364 \u7f16\u89e3\u7801\u5668\u3002 Theora \uff1a\u514d\u8d39\u5f00\u6e90\u7684\u89c6\u9891\u538b\u7f29\u683c\u5f0f\u3002 30\u3001 \u865a\u62df\u673a CarpVM \uff1aC \u4e2d\u6709\u8da3\u7684 VM\uff0c\u8ba9\u6211\u4eec\u4e00\u8d77\u6765\u770b\u770b\u8fd9\u4e2a\u3002 MicroPython \uff1a\u65e8\u5728\u5b9e\u73b0\u5355\u7247\u673a\u4e0a Python3.x \u7684\u5b9e\u73b0 TinyVM \uff1a\u7528\u7eaf\u7cb9\u7684 ANSI C \u7f16\u5199\u7684\u5c0f\u578b\uff0c\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u865a\u62df\u673a\u3002 31\u3001 Web \u5e94\u7528\u6846\u67b6 Civetweb \uff1a\u63d0\u4f9b\u6613\u4e8e\u4f7f\u7528\uff0c\u5f3a\u5927\u7684\uff0cC/C++ \u5d4c\u5165\u5f0f Web \u670d\u52a1\u5668\uff0c\u5e26\u6709\u53ef\u9009\u7684 CGI\uff0cSSL \u548c Lua \u652f\u6301\u3002 CppCMS \uff1a\u514d\u8d39\u9ad8\u6027\u80fd\u7684 Web \u5f00\u53d1\u6846\u67b6\uff08\u4e0d\u662f CMS\uff09. Crow \uff1a\u4e00\u4e2a C++ \u5fae\u578b web \u6846\u67b6\uff08\u7075\u611f\u6765\u81ea\u4e8e Python Flask\uff09 Kore : \u4f7f\u7528 C \u8bed\u8a00\u5f00\u53d1\u7684\u7528\u4e8e web \u5e94\u7528\u7a0b\u5e8f\u7684\u8d85\u5feb\u901f\u548c\u7075\u6d3b\u7684 web \u670d\u52a1\u5668 / \u6846\u67b6\u3002 libOnion \uff1a\u8f7b\u91cf\u7ea7\u7684\u5e93\uff0c\u5e2e\u52a9\u4f60\u4f7f\u7528 C \u7f16\u7a0b\u8bed\u8a00\u521b\u5efa web \u670d\u52a1\u5668\u3002 QDjango \uff1a\u4f7f\u7528 C++ \u7f16\u5199\u7684\uff0c\u57fa\u4e8e Qt \u5e93\u7684 web \u6846\u67b6\uff0c\u8bd5\u56fe\u6548\u4eff Django API\uff0c\u56e0\u6b64\u5f97\u6b64\u540d\u3002 Wt \uff1a\u5f00\u53d1 Web \u5e94\u7528\u7684 C++ \u5e93\u3002 32\u3001 XML XML \u5c31\u662f\u4e2a\u5783\u573e\uff0cxml \u7684\u89e3\u6790\u5f88\u70e6\u4eba\uff0c\u5bf9\u4e8e\u8ba1\u7b97\u673a\u5b83\u4e5f\u662f\u4e2a\u707e\u96be\u3002\u8fd9\u79cd\u7cdf\u7cd5\u7684\u4e1c\u897f\u5b8c\u5168\u6ca1\u6709\u5b58\u5728\u7684\u7406\u7531\u4e86\u3002-Linus Torvalds Expat \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u7684 xml \u89e3\u6790\u5e93 Libxml2 \uff1aGnome \u7684 xml C \u89e3\u6790\u5668\u548c\u5de5\u5177\u5305 libxml++ \uff1aC++ \u7684 xml \u89e3\u6790\u5668 PugiXML \uff1a\u7528\u4e8e C++ \u7684\uff0c\u652f\u6301 XPath \u7684\u8f7b\u91cf\u7ea7\uff0c\u7b80\u5355\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\u3002 RapidXml \uff1a\u8bd5\u56fe\u521b\u5efa\u6700\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\uff0c\u540c\u65f6\u4fdd\u6301\u6613\u7528\u6027\uff0c\u53ef\u79fb\u690d\u6027\u548c\u5408\u7406\u7684 W3C \u517c\u5bb9\u6027\u3002 TinyXML \uff1a\u7b80\u5355\u5c0f\u578b\u7684 C++XML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML2 \uff1a\u7b80\u5355\u5feb\u901f\u7684 C++CML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML++ \uff1aTinyXML \u7684\u4e00\u4e2a\u5168\u65b0\u7684\u63a5\u53e3\uff0c\u4f7f\u7528\u4e86 C++ \u7684\u8bb8\u591a\u8bb8\u591a\u4f18\u52bf\uff0c\u6a21\u677f\uff0c\u5f02\u5e38\u548c\u66f4\u597d\u7684\u5f02\u5e38\u5904\u7406\u3002 Xerces-C++ \uff1a\u7528\u53ef\u79fb\u690d\u7684 C++ \u7684\u5b50\u96c6\u7f16\u5199\u7684 XML \u9a8c\u8bc1\u89e3\u6790\u5668\u3002 33\u3001 \u591a\u9879\u6df7\u6742 \u4e00\u4e9b\u6709\u7528\u7684\u5e93\u6216\u8005\u5de5\u5177\uff0c\u4f46\u662f\u4e0d\u9002\u5408\u4e0a\u9762\u7684\u5206\u7c7b\uff0c\u6216\u8005\u8fd8\u6ca1\u6709\u5206\u7c7b\u3002 C++ Format \uff1aC++ \u7684\u5c0f\u578b\uff0c\u5b89\u5168\u548c\u5feb\u901f\u683c\u5f0f\u5316\u5e93 casacore \uff1a\u4ece aips++ \u6d3e\u751f\u7684\u4e00\u7cfb\u5217 C++ \u6838\u5fc3\u5e93 cxx-prettyprint \uff1a\u7528\u4e8e C++ \u5bb9\u5668\u7684\u6253\u5370\u5e93 DynaPDF \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 PDF \u751f\u6210\u5e93 gcc-poison \uff1a\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u7981\u6b62\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e0d\u5b89\u5168\u7684 C/C++ \u51fd\u6570\u7684\u7b80\u5355\u7684\u5934\u6587\u4ef6\u3002 googlemock \uff1a\u7f16\u5199\u548c\u4f7f\u7528 C++ \u6a21\u62df\u7c7b\u7684\u5e93 HTTP Parser \uff1aC \u7684 http \u8bf7\u6c42 / \u54cd\u5e94\u89e3\u6790\u5668 libcpuid \uff1a\u7528\u4e8e x86 CPU \u68c0\u6d4b\u76d2\u7279\u5f81\u63d0\u53d6\u7684\u5c0f\u578b C \u5e93 libevil \uff1a\u8bb8\u53ef\u8bc1\u7ba1\u7406\u5668 libusb \uff1a\u5141\u8bb8\u79fb\u52a8\u8bbf\u95ee USB \u8bbe\u5907\u7684\u901a\u7528 USB \u5e93 PCRE \uff1a\u6b63\u5219\u8868\u8fbe\u5f0f C \u5e93\uff0c\u7075\u611f\u6765\u81ea\u4e8e Perl \u4e2d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u529f\u80fd\u3002 Remote Call Framework \uff1aC++ \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u6846\u67b6\u3002 Scintilla \uff1a\u5f00\u6e90\u7684\u4ee3\u7801\u7f16\u8f91\u63a7\u4ef6 Serial Communication Library \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u8de8\u5e73\u53f0\uff0c\u4e32\u53e3\u5e93\u3002 SDS \uff1aC \u7684\u7b80\u5355\u52a8\u6001\u5b57\u7b26\u4e32\u5e93 SLDR \uff1a\u8d85\u8f7b\u7684 DNS \u89e3\u6790\u5668 SLRE \uff1a \u8d85\u8f7b\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5e93 Stage \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u6a21\u62df\u5668 VarTypes \uff1aC++/Qt4 \u529f\u80fd\u4e30\u5bcc\uff0c\u9762\u5411\u5bf9\u8c61\u7684\u7ba1\u7406\u53d8\u91cf\u7684\u6846\u67b6\u3002 ZBar \uff1a\u2018\u6761\u5f62\u7801\u626b\u63cf\u5668\u2019\u5e93\uff0c\u53ef\u4ee5\u626b\u63cf\u7167\u7247\uff0c\u56fe\u7247\u548c\u89c6\u9891\u6d41\u4e2d\u7684\u6761\u5f62\u7801\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\u3002 CppVerbalExpressions \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 C++ \u6b63\u5219\u8868\u8fbe\u5f0f QtVerbalExpressions \uff1a\u57fa\u4e8e C++ VerbalExpressions \u5e93\u7684 Qt \u5e93 PHP-CPP \uff1a\u4f7f\u7528 C++ \u6765\u6784\u5efa PHP \u6269\u5c55\u7684\u5e93 Better String \uff1aC \u7684\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e93\uff0c\u529f\u80fd\u66f4\u4e30\u5bcc\uff0c\u4f46\u662f\u6ca1\u6709\u7f13\u51b2\u6ea2\u51fa\u95ee\u9898\uff0c\u8fd8\u5305\u542b\u4e86\u4e00\u4e2a C++ \u5305\u88c5\u5668\u3002 34\u3001 \u8f6f\u4ef6 \u7528\u4e8e\u521b\u5efa\u5f00\u53d1\u73af\u5883\u7684\u8f6f\u4ef6 aardio : arrdio \u662f\u4e00\u4e2a\u80fd\u5728 windows \u7cfb\u7edf\u4e2d\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u4e00\u95e8\u8bed\u8a00\uff0c\u4e5f\u662f\u4e00\u4e2a\u8d85\u7ea7\u80f6\u6c34\u5de5\u5177\u3002\u4f60\u53ef\u4ee5\u7528 python\u3001java\u3001C\u3001C#\u3001javastrip\u3001PHP \u7b49\u6570\u503c\u7684\u7f16\u7a0b\u8bed\u8a00\u7ed3\u5408 arrdio \u51e0\u5206\u949f\u5c31\u53ef\u4ee5\u5f00\u53d1\u4e00\u6b3e\u5e26\u754c\u9762\u7684\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u4f60\u53ef\u4ee5\u7528 html \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6216\u8005\u7528\u5176\u4ed6\u754c\u9762\u5e93\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u3002\u4e00\u5207\u90fd\u662f\u4f60\u8bf4\u4e86\u7b97\uff01\u8d85\u5c0f\u7684\u8f6f\u4ef6\u4f53\u79ef\uff0c\u8d85\u5feb\u7684\u521b\u5efa\u901f\u5ea6\uff01 cmder : cmder \u662f\u4e00\u4e2a\u589e\u5f3a\u578b\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u4e0d\u4ec5\u53ef\u4ee5\u4f7f\u7528 windows \u4e0b\u7684\u6240\u6709\u547d\u4ee4\uff0c\u66f4\u723d\u7684\u662f\u53ef\u4ee5\u4f7f\u7528 linux \u7684\u547d\u4ee4, shell \u547d\u4ee4\u3002windows \u4e0b\u7684\u8f6f\u4ef6. 35\u3001 \u7f16\u8bd1\u5668 C/C++ \u7f16\u8bd1\u5668\u5217\u8868 Clang : \u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1\u7684 GCC \uff1aGNU \u7f16\u8bd1\u5668\u96c6\u5408 Intel C++ Compiler \uff1a\u7531\u82f1\u7279\u5c14\u516c\u53f8\u5f00\u53d1 LLVM \uff1a\u6a21\u5757\u5316\u548c\u53ef\u91cd\u7528\u7f16\u8bd1\u5668\u548c\u5de5\u5177\u94fe\u6280\u672f\u7684\u96c6\u5408 Microsoft Visual C++ \uff1aMSVC\uff0c\u7531\u5fae\u8f6f\u516c\u53f8\u5f00\u53d1 Open WatCom \uff1aWatcom\uff0cC\uff0cC++ \u548c Fortran \u4ea4\u53c9\u7f16\u8bd1\u5668\u548c\u5de5\u5177 TCC \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u7f16\u8bd1\u5668 36\u3001 \u5728\u7ebf\u7f16\u8bd1\u5668 \u5728\u7ebf C/C++ \u7f16\u8bd1\u5668\u5217\u8868 codepad \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u534f\u4f5c\u5de5\u5177 CodeTwist \uff1a\u4e00\u4e2a\u7b80\u5355\u7684\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4f60\u53ef\u4ee5\u7c98\u8d34\u7684 C,C++ \u6216\u8005 Java \u4ee3\u7801\uff0c\u5728\u7ebf\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c coliru \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / shell\uff0c \u652f\u6301\u5404\u79cd C++ \u7f16\u8bd1\u5668 Compiler Explorer \uff1a\u4ea4\u4e92\u5f0f\u7f16\u8bd1\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u6c47\u7f16\u8f93\u51fa CompileOnline \uff1aLinux \u4e0a\u5728\u7ebf\u7f16\u8bd1\u548c\u6267\u884c C++ \u7a0b\u5e8f Ideone \uff1a\u4e00\u4e2a\u5728\u7ebf\u7f16\u8bd1\u5668\u548c\u8c03\u8bd5\u5de5\u5177\uff0c\u5141\u8bb8\u4f60\u5728\u7ebf\u7f16\u8bd1\u6e90\u4ee3\u7801\u5e76\u6267\u884c\uff0c\u652f\u6301 60 \u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u3002 37\u3001 \u8c03\u8bd5\u5668 C/C++ \u8c03\u8bd5\u5668\u5217\u8868 Comparison of debuggers \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u8c03\u8bd5\u5668\u5217\u8868 GDB \uff1aGNU \u8c03\u8bd5\u5668 Valgrind \uff1a\u5185\u5b58\u8c03\u8bd5\uff0c\u5185\u5b58\u6cc4\u9732\u68c0\u6d4b\uff0c\u6027\u80fd\u5206\u6790\u5de5\u5177\u3002 38\u3001 \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u5217\u8868 AppCode \uff1a\u6784\u5efa\u4e0e JetBrains\u2019 IntelliJ IDEA \u5e73\u53f0\u4e0a\u7684\u7528\u4e8e Objective-C\uff0cC,C++\uff0cJava \u548c Java \u5f00\u53d1\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CLion \uff1a\u6765\u81ea JetBrains \u7684\u8de8\u5e73\u53f0\u7684 C/C++ \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 Code::Blocks \uff1a\u514d\u8d39 C\uff0cC++ \u548c Fortran \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CodeLite \uff1a\u53e6\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u514d\u8d39\u7684 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Dev-C++ \uff1a\u53ef\u79fb\u690d\u7684 C/C++/C++11 \u96c6\u6210\u5f00\u53d1\u73af\u5883 Eclipse CDT \uff1a\u57fa\u4e8e Eclipse \u5e73\u53f0\u7684\u529f\u80fd\u9f50\u5168\u7684 C \u548c C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Geany \uff1a\u8f7b\u91cf\u7ea7\u7684\u5feb\u901f\uff0c\u8de8\u5e73\u53f0\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 IBM VisualAge \uff1a\u6765\u81ea IBM \u7684\u5bb6\u5ead\u8ba1\u7b97\u673a\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 Irony-mode \uff1a\u7531 libclang \u9a71\u52a8\u7684\u7528\u4e8e Emacs \u7684 C/C++ \u5fae\u6a21\u5f0f KDevelop \uff1a\u514d\u8d39\u5f00\u6e90\u96c6\u6210\u5f00\u53d1\u73af\u5883 Microsoft Visual Studio \uff1a\u6765\u81ea\u5fae\u8f6f\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 NetBeans \uff1a\u4e3b\u8981\u7528\u4e8e Java \u5f00\u53d1\u7684\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u652f\u6301\u5176\u4ed6\u8bed\u8a00\uff0c\u5c24\u5176\u662f PHP\uff0cC/C++ \u548c HTML5\u3002 Qt Creator \uff1a\u8de8\u5e73\u53f0\u7684 C++\uff0cJavascript \u548c QML \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u662f Qt SDK \u7684\u4e00\u90e8\u5206\u3002 rtags \uff1aC/C++ \u7684\u5ba2\u6237\u7aef\u670d\u52a1\u5668\u7d22\u5f15\uff0c\u7528\u4e8e \u8ddf\u57fa\u4e8e clang \u7684 emacs \u7684\u96c6\u6210 Xcode \uff1a\u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1 YouCompleteMe \uff1a\u4e00\u4e2a\u7528\u4e8e Vim \u7684\u6839\u636e\u4f60\u6572\u7684\u4ee3\u7801\u5feb\u901f\u6a21\u7cca\u641c\u7d22\u5e76\u8fdb\u884c\u4ee3\u7801\u8865\u5168\u7684\u5f15\u64ce\u3002 39\u3001 \u6784\u5efa\u7cfb\u7edf Bear \uff1a\u7528\u4e8e\u4e3a clang \u5de5\u5177\u751f\u6210\u7f16\u8bd1\u6570\u636e\u5e93\u7684\u5de5\u5177 Biicode \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u7b80\u5355\u4f9d\u8d56\u7ba1\u7406\u5668\u3002 CMake \uff1a\u8de8\u5e73\u53f0\u7684\u514d\u8d39 \u5f00\u6e90\u8f6f\u4ef6 \u7528\u4e8e\u7ba1\u7406\u8f6f\u4ef6\u4f7f\u7528\u72ec\u7acb\u7f16\u8bd1\u7684\u65b9\u6cd5\u8fdb\u884c\u6784\u5efa\u7684\u8fc7\u7a0b\u3002 CPM \uff1a\u57fa\u4e8e CMake \u548c Git \u7684 C++ \u5305\u7ba1\u7406\u5668 FASTBuild \uff1a\u9ad8\u6027\u80fd\uff0c\u5f00\u6e90\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u652f\u6301\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7684\u7f16\u8bd1\uff0c\u7f13\u51b2\u548c\u7f51\u7edc\u5206\u5e03\u3002 Ninja \uff1a\u4e13\u6ce8\u4e8e\u901f\u5ea6\u7684\u5c0f\u578b\u6784\u5efa\u7cfb\u7edf Scons \uff1a\u4f7f\u7528 Python scipt \u914d\u7f6e\u7684\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177 tundra \uff1a\u9ad8\u6027\u80fd\u7684\u4ee3\u7801\u6784\u5efa\u7cfb\u7edf\uff0c\u751a\u81f3\u5bf9\u4e8e\u975e\u5e38\u5927\u578b\u7684\u8f6f\u4ef6\u9879\u76ee\uff0c\u4e5f\u80fd\u63d0\u4f9b\u6700\u597d\u7684\u589e\u91cf\u6784\u5efa\u6b21\u6570\u3002 tup \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u7528\u4e8e\u540e\u53f0\u76d1\u63a7\u53d8\u5316\u7684\u6587\u4ef6\u3002 40\u3001 \u9759\u6001\u4ee3\u7801\u5206\u6790 \u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u7684\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 Cppcheck \uff1a\u9759\u6001 C/C++ \u4ee3\u7801\u5206\u6790\u5de5\u5177 include-what-you-use \uff1a\u4f7f\u7528 clang \u8fdb\u884c\u4ee3\u7801\u5206\u6790\u7684\u5de5\u5177\uff0c\u53ef\u4ee5 #include \u5728 C \u548c C++ \u6587\u4ef6\u4e2d\u3002 OCLint \uff1a\u7528\u4e8e C\uff0cC++ \u548c Objective-C \u7684\u9759\u6001\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177\uff0c\u7528\u4e8e\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u3002 Clang Static Analyzer \uff1a\u67e5\u627e C\uff0cC++ \u548c Objective-C \u7a0b\u5e8f bug \u7684\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177 List of tools for static code analysis \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u9759\u6001\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 41\u3001 linux \u5b9e\u7528\u5de5\u5177 picocom : linux \u4e0b\u7684\u4e00\u4e2a\u597d\u7528\u7684\u4e32\u53e3\u7ec8\u7aef. w3m : \u7ec8\u7aef\u6d4f\u89c8\u5668, \u771f\u6b63\u7684\u7a0b\u5e8f\u5458\u5c31\u8be5\u4f7f\u7528\u547d\u4ee4\u884c\u6765\u6d4f\u89c8\u7f51\u9875\u3002 The Fuck : \u5728\u7ec8\u7aef\u4e0b\u662f\u4e0d\u662f\u7ecf\u5e38\u8f93\u9519\u547d\u4ee4\uff0c\u641e\u5f97\u81ea\u5df1\u5fc3\u70e6\u610f\u4e71\uff0cThe Fuck \u662f\u4e00\u6b3e\u4e86\u4e0d\u8d77\u7684\u5de5\u5177\uff0c\u5e2e\u4f60\u5f7b\u5e95\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5f53\u4f60\u8f93\u9519\u547d\u4ee4\u540e\uff0c\u53ea\u8981\u8f93\u5165 fuck \u547d\u4ee4\uff0c\u5b83\u4f1a\u5e2e\u4f60\u81ea\u52a8\u7ea0\u6b63\u9519\u8bef\uff0c\u7cbe\u5f69\u4e4b\u6781\uff01 tldr : tldr \u662f Too long, Don't read \u7684\u7f29\u5199\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u67e5\u770b\u5e38\u7528\u547d\u4ee4\u7684\u4f7f\u7528\u5b9e\u4f8b\uff0c\u6bd4\u5982 tar \u547d\u4ee4\uff0c\u90a3\u540e\u9762\u4e00\u957f\u4e32\u53c2\u6570\u8c01\u8bb0\u5f97\u6e05\u5462\uff1f\u5f53\u7136\uff0clinux \u5927\u4f6c\u9664\u5916\u3002 fzf : fzf \u662f\u4e00\u6b3e\u652f\u6301\u6a21\u7cca\u641c\u7d22\u7684\u4ea4\u4e92\u5f0f\u5de5\u5177\uff0c\u53ef\u4ee5\u7528\u6765\u67e5\u627e\u4efb\u4f55\u5217\u8868\u5185\u5bb9\uff0c\u5305\u62ec\u6587\u4ef6\u3001Git \u5206\u652f\u3001\u8fdb\u7a0b\u7b49\u3002 fd : \u7b80\u5355\u3001\u5feb\u901f\u3001\u597d\u7528\uff0c\u7528\u4e8e\u66ff\u6362 find \u7684\u641c\u7d22\u5de5\u5177\u3002 exa : \u7528\u6765\u66ff\u6362 ls \u547d\u4ee4\u7684\u73b0\u4ee3\u5316\u5de5\u5177\u3002 nnn : nnn (n\u00b3) \u662f\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u7ec8\u7aef\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u901f\u5ea6\u975e\u5e38\u5feb\u4e14\u51e0\u4e4e 0 \u914d\u7f6e\uff0c\u4e5f\u662f\u4e00\u4e2a\u975e\u5e38\u4e0d\u9519\u7684\u9009\u62e9\u3002 powerline : \u7ec8\u7aef\u672c\u8eab\u662f\u9ad8\u6548\u7684\uff0c\u4f46\u6709\u65f6\u4e5f\u7565\u663e\u4e4f\u5473\uff0c\u4f7f\u7528 powerline \u53ef\u4ee5\u4e3a\u7ec8\u7aef\u52a0\u4e0a\u5f3a\u5927\u7684 \u72b6\u6001\u680f\uff0c\u6bd4\u5982\u5728 vim \u4e2d\u663e\u793a\u5f53\u524d\u72b6\u6001\uff0c\u5728\u6253\u5f00 git \u76ee\u5f55\u65f6\u663e\u793a\u5f53\u524d\u5206\u652f\u7b49\u7b49\u3002 dtrx \u6709\u4e86\u8fd9\u4e2a\u5de5\u5177\u4f60\u57fa\u672c\u518d\u4e5f\u4e0d\u7528\u8bb0\u4f4f\u5982\u4f55\u5728 linux \u4e0a\u9762\u89e3\u538b\u5404\u79cd\u540e\u7f00\u7684\u6587\u4ef6\u4e86\uff0c\u4ec0\u4e48 tar.gz,tgz,xz,bz2,zip.rar \u7b49\u901a\u901a\u641e\u5b9a\uff0c\u8fd9\u662f\u4e00\u4e2a python \u5de5\u5177. autojump : \u8bb0\u5fc6\u8fdb\u8fc7\u7684\u6587\u4ef6\u5939\uff0c\u4e0b\u6b21\u53ef\u7528 j + \u6587\u4ef6\u5939\u540d \u76f4\u63a5\u8df3\u8fdb\uff0c \u5f88\u65b9\u4fbf. \u8f6f\u4ef6\u5b89\u88c5\u5b8c\u540e\u8f93\u5165\u4e0b\u9762\u547d\u4ee4\u751f\u6548\u7ec8\u7aef (echo \"\"# autojump\\nsource /usr/share/autojump/autojump.bash\">> ~/.bashrc) rebash : \u811a\u672c\u5e93 / \u6846\u67b6\u3002\u7279\u70b9\uff1a\u8fdb\u53e3\uff0c\u4f8b\u5916\uff0c\u6587\u4ef6\u6d4b\u8bd5... shutit : \u57fa\u4e8e bash \u548c pexpect \u7684\u81ea\u52a8\u5316\u6846\u67b6 dispatch : 50 \u884c\u53ef\u79fb\u690d shell \u811a\u672c\u4e2d\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002 bashful : \u4e00\u4e2a\u5e93\u7684\u96c6\u5408\uff0c\u4ee5\u7b80\u5316\u7f16\u5199 Bash \u811a\u672c ansi : \u5728\u7eaf bash \u4e2d\u7684 ANSI \u8f6c\u4e49\u7801 - \u66f4\u6539\u6587\u672c\u989c\u8272\uff0c\u5b9a\u4f4d\u5149\u6807\uff0c\u7b49\u7b49 history : \u975e\u5e38\u7b80\u5355\uff0c\u5c24\u5176\u662f\u5728\u4f60\u4f9d\u8d56\u4e8e\u590d\u5236\u4f7f\u7528\u8fc7\u7684\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e2a\u547d\u4ee4\u7279\u522b\u6709\u7528\u3002 sort, uniq\uff1a\u6392\u5e8f\u53bb\u91cd\u3002 awk, grep, sed\uff1a\u6587\u672c\u5904\u7406\u795e\u5668\u3002 jq \uff0c\u547d\u4ee4\u884c\u7684 json \u67e5\u8be2\u548c\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u9002\u5408\u67e5\u770b rest \u63a5\u53e3\u7684\u8f93\u51fa strace\uff0c\u6253\u5370\u51fa\u8fdb\u7a0b\u8c03\u7528\u4e86\u54ea\u4e9b\u7cfb\u7edf\u8c03\u7528\u3002 objdump\uff0c\u6253\u5370\u76ee\u6807\u7801\u548c\u53cd\u6c47\u7f16\u7ed3\u679c transfer.sh : \u53ef\u901a\u8fc7\u7b80\u5355\u7684\u547d\u4ee4\u884c\u6765\u5feb\u901f\u5b8c\u6210\u6587\u4ef6\u5171\u4eab\u64cd\u4f5c stegify : \u4e00\u6b3e\u795e\u5947\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u80fd\u5c06\u4efb\u610f\u6587\u4ef6\u9690\u85cf\u5230\u56fe\u7247\u91cc\u9762\u3002 Httpie \u4e00\u4e2a HTTP \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u4f7f\u7528\u8d77\u6765\u6bd4 curl \u66f4\u4e3a\u53cb\u597d\uff0c\u5e76\u652f\u6301\u8f93\u51fa JSON\u3001\u8bed\u6cd5\u9ad8\u4eae\u7b49\u7279\u6027\uff0c\u4e3a\u5f00\u53d1\u8005\u5448\u73b0\u66f4\u4e3a\u76f4\u89c2\u7684 UI\uff0c\u4e0e\u670d\u52a1\u5668\u95f4\u7684\u8c03\u8bd5\u4f53\u9a8c\u4e5f\u66f4\u4e3a\u4eba\u6027\u5316\u3002 PM2 : \u7528\u4ee5\u5728\u540e\u53f0\u8fd0\u884c\u548c\u7ba1\u7406\u8fdb\u7a0b SpaceVim \uff1a\u8fd9\u662f\u4e00\u4e2a vim \u63d2\u4ef6\uff0c\u4f7f\u4f60\u7684 Vim \u53d8\u6210\u5e26\u4ee3\u7801\u81ea\u52a8\u8865\u5168\u7b49\u529f\u80fd\u7684\u66f4\u52a0\u5f3a\u5927\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff01 axel\uff1a\u591a\u7ebf\u7a0b\u65ad\u70b9\u4e0b\u8f7d\u5de5\u5177\uff0c\u975e\u5e38\u597d\u7528\u3002\u4f8b\u5982\u4e0b\u56fe\u4e2d\u8fd9\u6837\uff0c\u6307\u5b9a\u4e86 8 \u4e2a\u7ebf\u7a0b\u540c\u65f6\u4e0b\u8f7d\u3002 nmon\uff1a\u5b83\u80fd\u591f\u5e2e\u4f60\u8fdb\u884c\u7535\u8111\u7684\u6027\u80fd\u76d1\u63a7\uff0c\u5305\u62ec CPU\uff0c\u5185\u5b58\uff0c\u78c1\u76d8 IO\uff0c\u7f51\u7edc IO\uff0c\u5e76\u4e14\u754c\u9762\u5f88\u70ab\u9177\uff0c\u662f\u4e0d\u662f\u5f88\u50cf\u9ed1\u5ba2\uff0c\u5feb\u53bb\u8bd5\u8bd5\u5427 nmon for Linux | Main Alex \uff1a\u5b83\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u5f88\u6709\u7528\u7684\u5c0f\u5de5\u5177\u3002\u9002\u7528\u4e8e\u660e\u6587\u6587\u672c\u6216\u8005\u683c\u5f0f\u4e3a Markdown \u6216 HTML \u7684\u6587\u6863\u3002Alex \u4f1a\u5bf9 \u201c\u6027\u522b\u504f\u597d\u3001\u6781\u7aef\u4e3b\u4e49\u3001\u79cd\u65cf\u76f8\u5173\u3001\u5b97\u6559\uff0c\u6216\u8005\u6587\u7ae0\u4e2d\u5176\u4ed6\u4e0d\u5e73\u7b49\u7684\u63aa\u8f9e\u201d \u4ea7\u751f\u8b66\u544a\u3002\u5982\u679c\u4f60\u60f3\u8981\u8bd5\u8bd5\u770b Alex\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u5728\u7ebf demo \uff1b GNU Aspell \uff1a\u5b83\u80fd\u591f\u4ea4\u4e92\u5f0f\u5730\u68c0\u6d4b\u6587\u672c\u6587\u6863\uff0c\u80fd\u9ad8\u4eae\u663e\u793a\u62fc\u5199\u9519\u8bef\uff0c\u8fd8\u80fd\u5728\u62fc\u5199\u9519\u8bef\u7684\u4e0a\u65b9\u63d0\u4f9b\u6b63\u786e\u7684\u62fc\u5199\u5efa\u8bae\u3002Aspell \u5728\u8fdb\u884c\u62fc\u5199\u68c0\u67e5\u7684\u65f6\u5019\uff0c\u540c\u6837\u80fd\u591f\u5ffd\u7565\u8bb8\u591a\u8bed\u6cd5\u6807\u8bb0\uff1b Proselint \uff1a\u5b83\u662f\u4e00\u6b3e\u5168\u80fd\u7684\u5b9e\u65f6\u68c0\u67e5\u5de5\u5177\u3002\u5b83\u4f1a\u627e\u51fa\u884c\u8bdd\u3001\u5927\u8bdd\u3001\u4e0d\u6b63\u786e\u65e5\u671f\u548c\u65f6\u95f4\u683c\u5f0f\u3001\u6ee5\u7528\u7684\u672f\u8bed \u7b49\u7b49 \u3002\u5b83\u4e5f\u5f88\u5bb9\u6613\u8fd0\u884c\u5e76\u5ffd\u7565\u6587\u672c\u4e2d\u7684\u6807\u8bb0\uff1b WordGrinder \uff1a\u5b83\u662f\u4e00\u6b3e\u4f7f\u7528\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u62e5\u6709\u8db3\u591f\u7684\u7f16\u5199\u548c\u53d1\u5e03\u529f\u80fd\u7684\u6587\u5b57\u7f16\u8f91\u5668\u3002\u5b83\u652f\u6301\u57fa\u672c\u7684\u683c\u5f0f\u548c\u6837\u5f0f\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u5c06\u4f60\u7684\u6587\u5b57\u4ee5 Markdown\u3001ODT\u3001LaTeX \u6216\u8005 HTML \u7b49\u683c\u5f0f\u5bfc\u51fa\uff1b cloc : \u7528\u6765\u7edf\u8ba1\u4ee3\u7801\u884c\u6570\uff0c\u7edf\u8ba1\u7ed3\u679c\u6bd4\u8f83\u5206\u7c7b\u6bd4\u8f83\u8be6\u7ec6\uff0c\u652f\u6301\u5927\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u3002 tldr : \u5982\u679c\u4f60\u7ecf\u5e38\u4e0d\u60f3\u8be6\u8bfb man \u6587\u6863\uff0c\u90a3\u4e48\u4f60\u5e94\u8be5\u8bd5\u8bd5\u8fd9\u4e2a\u5c0f\u5de5\u5177\u3002 cppman \uff1aC++ 98/11/14 \u624b\u518c\u67e5\u8be2 for Linux/MacOS icdiff \uff1a\u5206\u5c4f\u663e\u793a diff mcedit \uff1a\u7ec8\u7aef\u4e0b\u9762\u7684 NotePad++ owncloud \uff1aDropBox \u7684\u5f00\u6e90\u66ff\u4ee3\u54c1\uff0c\u63d0\u4f9b\u547d\u4ee4\u884c\u5ba2\u6237\u7aef owncloudcmd pm \uff1a\u5728 bash / zsh \u4e2d\u8fc5\u901f\u5207\u6362\u9879\u76ee\u76ee\u5f55 ncdu \uff1a\u53ef\u89c6\u5316\u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f, \u4f60\u53d1\u73b0\u6709\u4eba\u628a /home \u7a7a\u95f4\u6491\u7206\u4e86\uff0c\u5f71\u54cd\u4e86\u5927\u5bb6\u7684\u5de5\u4f5c\uff0c\u4f60\u6124\u6012\u4e86\u4e00\u5c42\u5c42\u7684 du\uff0c\u4e00\u5c42\u5c42\u7684 cd\uff0c\u6574\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u5228\u5783\u573e\u5806\u4e00\u6837\u7684\u6076\u5fc3\uff0c\u540e\u6765\u53d1\u73b0\u4e86 ncdu \u8fd9\u4e2a\u57fa\u4e8e ncurses \u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f\uff1a glances \uff1a\u66f4\u5f3a\u5927\u7684 htop / top \u4ee3\u66ff\u8005 htop \u4ee3\u66ff top\uff0cglances \u4ee3\u66ff htop\uff1a mc \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8 ranger \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8\u53e6\u4e00\u6b3e\u5185\u5bb9\u9884\u89c8\u8f6f\u4ef6\uff0c\u754c\u9762\u6ca1\u6709 mc \u90a3\u4e48\u6f02\u4eae\uff0c\u6807\u8bb0\u62f7\u8d1d\u4e5f\u6ca1\u5b83\u5f3a\uff0c\u4f46\u662f\u9884\u89c8\u529f\u80fd\u505a\u7684\u5f88\u4e0d\u9519\uff0c\u5982\u679c\u4f60\u4e60\u60ef vim \u952e\u4f4d\u7684\u8bdd\uff0c\u4f60\u4f1a\u53d1\u73b0 ranger \u6709\u4e9b\u5730\u65b9\u6bd4 mc \u505a\u7684\u597d\u4e0d\u5c11\uff1a dstat \uff1avmstat \u4ee3\u66ff\u8005, \u53ef\u80fd\u4e0d\u5c11\u4eba\u90fd\u7528\u8fc7\uff0c\u4f46\u662f\u672c\u95ee\u9898\u4e0b\u597d\u50cf\u6ca1\u4eba\u63d0\uff1f cheat \uff1a\u547d\u4ee4\u884c\u7b14\u8bb0, \u5c31\u662f\u5404\u79cd cheat sheet \uff0c\u6bd4\u5982\u7ecf\u5e38\u641e\u5fd8 redis \u547d\u4ee4\u7684\u8bdd\uff0c\u4f60\u53ef\u4ee5\u65b0\u5efa ~/.cheat/redis \u8fd9\u4e2a\u6587\u4ef6\uff0c\u5199\u4e00\u4e9b\u5185\u5bb9\uff0c\u6bd4\u5982\uff1a multitail \uff1a\u591a\u91cd tail, \u901a\u5e38\u4f60\u4e0d\u6b62\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\u8981\u76d1\u63a7\uff0c\u600e\u4e48\u529e\uff1f\u7ec8\u7aef\u8f6f\u4ef6\u91cc\u5f00\u591a\u4e2a tab \u592a\u5360\u5730\u65b9\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u8fd9\u4e2a\u5de5\u5177\uff1a bro \uff1a\u4ee5\u7528\u4f8b\u4e3a\u4e3b\u7684\u5e2e\u52a9\u7cfb\u7edf, \u7c7b\u4f3c\u4e8e man, \u4f46\u662f\u5bf9\u65b0\u624b\u53cb\u597d. http.server : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u4f46\u6ca1\u6709\u4e0a\u4f20\u529f\u80fd. SimpleHTTPServerWithUpload.py : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u6709\u4e0a\u4f20\u529f\u80fd. \u6709 python2 \u548c python3 \u4e24\u4e2a\u7248\u672c. \u53c2\u8003\u8fde\u63a5: \u5e72\u8d27 | C++ \u8d44\u6e90\u3001\u6846\u67b6\u5927\u5168\uff0c\u63a8\u8350\u6536\u85cf https://www.zhihu.com/question/59227720/answer/286665684 https://www.zhihu.com/question/59227720/answer/578875058 https://www.zhihu.com/question/59227720/answer/163933473 https://www.zhihu.com/question/59227720/answer/163966430","title":"\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#_1","text":"\u672c\u6587\u7531 \u7b80\u60a6 SimpRead \u8f6c\u7801\uff0c \u539f\u6587\u5730\u5740 github.com \u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b. Contribute to zhengnianli/EmbedSummary development by creating an account on GitHub. ======================================================= \u5b66\u4e60\u521d\u671f\u6700\u96be\u627e\u7684\u5c31\u662f\u627e\u5b66\u4e60\u8d44\u6599\u4e86\uff0c\u672c\u8d34\u7cbe\u5fc3\u6c47\u603b\u4e86\u4e00\u4e9b\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u7f16\u7a0b\u8bed\u8a00\u3001\u5355\u7247\u673a\u3001\u5f00\u6e90\u9879\u76ee\u3001\u7269\u8054\u7f51\u3001\u64cd\u4f5c\u7cfb\u7edf\u3001Linux\u3001\u8ba1\u7b97\u673a\u7b49\u8d44\u6e90\uff0c\u5e76\u4e14\u5728\u4e0d\u65ad\u5730\u66f4\u65b0\u4e2d\uff0c\u81f4\u529b\u4e8e\u6253\u9020\u5168\u7f51\u6700\u5168\u7684\u5d4c\u5165\u5f0f\u8d44\u6599\u5e93\u3002\u6709\u597d\u7684\u5d4c\u5165\u5f0f\u76f8\u5173\u8d44\u6e90\u7684\u670b\u53cb\u6b22\u8fce\u505a\u8d21\u732e\uff0c\u5229\u4eba\u5229\u5df1\u3002 \u6536\u5f55\u516c\u5f00\u8d44\u6599\u4ec5\u4e3a\u4e86\u65b9\u4fbf\u5927\u5bb6\u8fdb\u884c\u5b66\u4e60\u3002\u5982\u679c\u4f60\u8ba4\u4e3a\u672c\u4ed3\u5e93\u7684\u4e00\u4e9b\u6587\u4ef6\u4fb5\u72af\u4e86\u60a8\u7684\u6743\u76ca\uff0c\u8bf7 \u5411\u6211\u53cd\u9988 \u3002\u6211\u5c06\u4f1a\u4ece\u4ed3\u5e93\u4e2d\u5f7b\u5e95\u6e05\u9664\u8fd9\u4e9b\u6587\u4ef6\u3002 \u4ee5\u4e0b\u4e3a\u6700\u65b0\u8d44\u6599\u6c47\u603b\uff1a gitee\uff1a https://gitee.com/zhengnianli/EmbedSummary github\uff1a https://github.com/zhengnianli/EmbedSummary","title":"\u7cbe\u54c1\u5d4c\u5165\u5f0f\u8d44\u6e90\u6c47\u603b"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#1os","text":"\u9e3f\u8499 OS \uff1a \u4e00\u6b3e\u9762\u5411\u5168\u573a\u666f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 RT-Thread \uff1a\u4e00\u6b3e\u5c0f\u800c\u7f8e\u7684\u7269\u8054\u7f51\u64cd\u4f5c\u7cfb\u7edf\u3002 TencentOS tiny \uff1a\u4e00\u6b3e\u9762\u5411\u7269\u8054\u7f51\u9886\u57df\u5f00\u53d1\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 freertos \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u64cd\u4f5c\u7cfb\u7edf\u3002 \u00b5C/OS \uff1a\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u3002 Azure RTOS \uff1aAzure RTOS \u662f\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5f00\u53d1\u5957\u4ef6\u3002 eventos-nano \uff1a\u4e00\u4e2a\u8d85\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f\u5f00\u53d1\u6846\u67b6\uff0c\u4e8b\u4ef6\u9a71\u52a8\uff0c\u5360\u7528\u8d44\u6e90\u5c0f\uff0c\u53ef\u8fd0\u7528\u4e8e\u5404\u578b\u5355\u7247\u673a\u3002 zephyr \uff1aZephyr \u662f Linux \u57fa\u91d1\u4f1a\u63a8\u51fa\u7684\u4e00\u4e2a\u9002\u7528\u4e8e\u7269\u8054\u7f51\u7684\u5c0f\u578b\u53ef\u4f38\u7f29\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u3002 mbed-os \uff1aARM \u81ea\u5df1\u6253\u9020\u3001\u4e3b\u6253 IoT \u7684\u4e00\u6574\u5957\u8f6f\u4ef6\u89e3\u51b3\u65b9\u6848 \u3002 BabyOS \uff1a \u4e13\u4e3a MCU \u9879\u76ee\u5f00\u53d1\u63d0\u901f\u7684\u4ee3\u7801\u6846\u67b6 \u3002 LuatOS \uff1a LuatOS \u662f\u8fd0\u884c\u5728\u5d4c\u5165\u5f0f\u786c\u4ef6\u7684\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\uff0c\u53ea\u9700\u8981\u5c11\u91cf\u5185\u5b58\u7684 flash \u7a7a\u95f4\u5c31\u80fd\u8fd0\u884c\uff0c\u7528\u6237\u7f16\u5199 lua \u4ee3\u7801\u5c31\u53ef\u5b8c\u6210\u5404\u79cd\u529f\u80fd\u3002 Contiki-OS \uff1a \u4e00\u4e2a\u5c0f\u578b\u7684\uff0c\u5f00\u6e90\u7684\uff0c\u6781\u6613\u79fb\u690d\u7684\u591a\u4efb\u52a1\u64cd\u4f5c\u7cfb\u7edf\u3002 DJYOS \uff1a \u90fd\u6c5f\u5830\u64cd\u4f5c\u7cfb\u7edf\u3002 klite \uff1a \u7b80\u6d01\u6613\u7528\u7684\u5d4c\u5165\u5f0f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 lmosem \uff1a \u4e00\u4e2a\u5b8c\u5168\u4ece\u7b2c\u4e00\u884c\u5f15\u5bfc\u4ee3\u7801\u5f00\u59cb\u7f16\u5199\uff0c\u57fa\u4e8e ARM \u5e73\u53f0\uff0c\u652f\u6301\u591a\u8fdb\u7a0b\u3001\u591a CPU\u3001\u5185\u5b58\u7ba1\u7406\u3001\u6587\u4ef6\u4e0e\u8bbe\u5907\u7ba1\u7406\u7684\u5168 32 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u3002 freenos \uff1aFreeNOS \u5fae\u5185\u6838\u64cd\u4f5c\u7cfb\u7edf\u3002 ros \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\u3002 openwrt \uff1aopenwrt \u6587\u6863\u3002 cola_os \uff1a300 \u884c\u4ee3\u7801\u5b9e\u73b0\u591a\u4efb\u52a1\u7ba1\u7406\u7684 OS\u3002 MS-RTOS \uff1a Micro Safe RTOS \u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"1\u3001OS"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#2","text":"ametal \u6216 ametal \uff1aAMetal \u662f\u82af\u7247\u7ea7\u7684\u88f8\u673a\u8f6f\u4ef6\u5305\uff0c\u5b9a\u4e49\u4e86\u8de8\u5e73\u53f0\u7684\u901a\u7528\u63a5\u53e3\u3002 Melon \uff1a\u4e00\u4e2a\u7528\u4e8e\u7b80\u5316\u5f00\u53d1\u7684 C \u6846\u67b6\u5e93\u3002 zlog \uff1a\u4e00\u4e2a\u9ad8\u53ef\u9760\u6027\u3001\u9ad8\u6027\u80fd\u3001\u7eaf C \u65e5\u5fd7\u51fd\u6570\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 Smartlink \uff1aLinux \u4e0a\u5b9e\u73b0\u7684 smartconfig\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 CodeBrick \uff1a\u4e00\u79cd\u65e0 OS \u7684 MCU \u5b9e\u7528\u8f6f\u4ef6\u7ba1\u7406\u7cfb\u7edf\u3002 RIL \uff1a\u4e00\u6b3e\u4e13\u95e8\u4e3a\u5d4c\u5165\u5f0f\u5e73\u53f0\u5f00\u53d1\u7684\u65e0\u7ebf\u901a\u4fe1\u6a21\u5757 (GSM/GPRS/CatM1/NB) \u7ba1\u7406\u6846\u67b6\u3002 cJSON \uff1a\u4e00\u4e2a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8f7b\u91cf\u7ea7\u7684 JSON \u89e3\u6790\u5e93\u3002 jsmn \uff1a\u4e00\u4e2a\u5c0f\u5de7\u7684\u57fa\u4e8e C \u8bed\u8a00\u7684 JSON \u89e3\u6790\u5e93\u3002 inih \uff1a C \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 MultiTimer \uff1a \u4e00\u4e2a\u8f6f\u4ef6\u5b9a\u65f6\u5668\u6269\u5c55\u6a21\u5757\u3002 MultiButton \uff1a \u4e00\u4e2a\u5c0f\u5de7\u7b80\u5355\u6613\u7528\u7684\u4e8b\u4ef6\u9a71\u52a8\u578b\u6309\u952e\u9a71\u52a8\u6a21\u5757\u3002 SmartTimer \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u57fa\u4e8e STM32 \u7684\u5b9a\u65f6\u5668\u8c03\u5ea6\u5668 \u3002 FlexibleButton \uff1a\u4e00\u4e2a\u57fa\u4e8e\u6807\u51c6 C \u8bed\u8a00\u7684\u5c0f\u5de7\u7075\u6d3b\u7684\u6309\u952e\u5904\u7406\u5e93\u3002 CmBacktrace \uff1a \u4e00\u6b3e\u9488\u5bf9 ARM Cortex-M \u7cfb\u5217 MCU \u7684\u9519\u8bef\u4ee3\u7801\u81ea\u52a8\u8ffd\u8e2a\u5e93\u3002 EasyLogger \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 limlog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 NanoLog \uff1a\u4e00\u6b3e\u8d85\u8f7b\u91cf\u7ea7\u3001\u9ad8\u6027\u80fd\u7684 C/C++ \u65e5\u5fd7\u5e93\u3002 EasyFlash \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u8f7b\u91cf\u7ea7\u5d4c\u5165\u5f0f Flash \u5b58\u50a8\u5668\u5e93 \u3002 SFUD \uff1a\u4e00\u6b3e\u5f00\u6e90\u7684\u4e32\u884c SPI Flash \u901a\u7528\u9a71\u52a8\u5e93\u3002 lw_oopc \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u6846\u67b6\u3002 PLOOC \uff1a\u53d7\u4fdd\u62a4\u7684\u4f4e\u5f00\u9500\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3002 cmd-parser \uff1a\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u597d\u7528\u7684\u547d\u4ee4\u89e3\u6790\u5668\u3002 mqttclient \uff1a\u4e00\u4e2a\u7701\u8d44\u6e90\u3001\u9ad8\u7a33\u5b9a\u7684 MQTT \u5ba2\u6237\u7aef\u3002 NorthFrame \uff1a\u4e00\u4e2a\u5355\u7247\u673a\u6781\u7b80\u56fe\u5f62\u5316\u72b6\u6001\u673a\u6846\u67b6 \u3002 letter-shell \uff1a\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u5d4c\u5165\u5f0f shell\u3002 nr_micro_shell \uff1a shell for MCU\uff0c\u5355\u7247\u673a\u547d\u4ee4\u884c\u4ea4\u4e92\u3002 pigweed \uff1a\u8c37\u6b4c\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u76ee\u6807\u5e93\uff08\u6a21\u5757\uff09\u96c6\u5408\u3002 lwrb \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u901a\u7528\u73af\u7f13\u51b2\u533a\u7ba1\u7406\u5668\u5e93\u3002 cQueue \uff1a\u4f7f\u7528 ANSI C \u7f16\u5199\u7684\u6d88\u606f\u961f\u5217\u529f\u80fd\u51fd\u6570\u3002 Unity \uff1a\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u3001\u9002\u5408\u5d4c\u5165\u5f0f\u7684\u6d4b\u8bd5\u6846\u67b6\u3002 Embedded Unit \uff1a \u662f\u4e2a\u7eaf\u6807\u51c6 c \u6784\u5efa\u7684\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 CuTest \uff1a\u4e00\u6b3e\u5fae\u5c0f\u7684 C \u8bed\u8a00\u5355\u5143\u6d4b\u8bd5\u6846\uff0c \u5168\u90e8\u4ee3\u7801\u52a0\u8d77\u6765\u4e0d\u5230\u4e00\u5343\u884c\u3002 cmockery \uff1a \u8c37\u6b4c C \u5355\u5143\u6d4b\u8bd5\u6846\u67b6\u3002 googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6\u3002 znfat \uff1a\u632f\u5357 fat\uff0c\u56fd\u4ea7\u5d4c\u5165\u5f0f\u6587\u4ef6\u7cfb\u7edf\u65b9\u6848 \u3002 libu \uff1a\u4e00\u4e2a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 toolkit \uff1aToolKit \u662f\u4e00\u5957\u5e94\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u7684\u901a\u7528\u5de5\u5177\u5305\u3002 LWIP \uff1a \u4e00\u4e2a\u5c0f\u578b\u5f00\u6e90\u7684 TCP/IP \u534f\u8bae\u6808 \u3002 SQLite \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u5d4c\u5165\u5f0f\u5173\u7cfb\u6570\u636e\u5e93\u3002 OpenBLT \uff1a\u4e00\u79cd\u5f00\u6e90\u5f15\u5bfc\u52a0\u8f7d\u7a0b\u5e8f\u3002 Linux Lab \uff1a Linux \u5185\u6838\u5b9e\u9a8c\u5ba4\uff0c\u57fa\u4e8e Docker/Qemu \u7684\u6781\u901f Linux \u5185\u6838\u5b66\u4e60\u3001\u5f00\u53d1\u548c\u6d4b\u8bd5\u73af\u5883\u3002 airkissOpen \uff1a\u817e\u8baf airkiss \u534f\u8bae\u89e3\u6790\u5e93 \u3002 mbedtls \uff1a\u4e00\u4e2a\u5f00\u6e90\u3001\u4fbf\u643a, \u6613\u4e8e\u4f7f\u7528, \u53ef\u8bfb\u7684\u548c\u7075\u6d3b\u7684 SSL \u5e93\u3002 mosquitto \u6216 mosquitto(\u4e0b\u8f7d\u901f\u5ea6\u5feb) \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684 MQTT \u4ee3\u7406\u3002 inih \uff1aC \u8bed\u8a00\u7f16\u5199\u7684 INI \u6587\u4ef6\u89e3\u6790\u5668\u3002 QP \uff1aQP \u5b9e\u65f6\u5d4c\u5165\u5f0f\u6846\u67b6\u3002 MS-RTOS \uff1aMicro Safe RTOS \u3002 protobuf-c \uff1aprotobuf-c\u3002 eepromfs \uff1a \u57fa\u4e8e EEPROM \u7684\u7b80\u6613\u7c7b\u6587\u4ef6\u7684\u6570\u636e\u8bfb\u5199\u5e93 \u3002 gear-lib \uff1a \u9002\u7528\u4e8e IOT / \u5d4c\u5165\u5f0f / \u7f51\u7edc\u670d\u52a1\u5f00\u53d1\u7684 C \u5e93 \u3002 mult_timer \uff1a \u4e00\u4e2a Linux \u4e0b\u7684\u8d85\u7ea7\u7cbe\u7b80\u7684\u591a\u91cd\u5b9a\u65f6\u5668 \u3002 EFSM \uff1a \u662f\u4e00\u4e2a\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684\u6709\u9650\u72b6\u6001\u673a \u3002 EasyX \uff1a\u4e00\u4e2a\u514d\u8d39\u7684\u56fe\u5f62\u5e93\u3002 tbox \uff1a\u4e00\u4e2a\u7528 c \u8bed\u8a00\u5b9e\u73b0\u7684\u8de8\u5e73\u53f0\u5f00\u53d1\u5e93\u3002 sys/queue.h \uff1a\u7528\u5b8f\u5b9e\u73b0\u7684\u5e38\u7528\u6570\u636e\u7ed3\u6784\u3002 nanomsg \uff1a\u4e00\u4e2a\u5b9e\u73b0\u4e86\u51e0\u79cd \u201c\u53ef\u6269\u5c55\u534f\u8bae\u201d \u7684\u9ad8\u6027\u80fd\u901a\u4fe1\u5e93\u3002 thttpd \uff1a\u4e00\u4e2a\u7b80\u5355\uff0c\u5c0f\u578b\uff0c\u53ef\u79fb\u690d\uff0c\u5feb\u901f\u4e14\u5b89\u5168\u7684 HTTP \u670d\u52a1\u5668\u3002 boa \uff1a\u4e00\u4e2a\u5c0f\u5de7\u9ad8\u6548\u7684 web \u670d\u52a1\u5668\u3002 FreeTpye \uff1a\u5b57\u4f53\u6e32\u67d3\u5e93\u3002 qpc \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u72b6\u6001\u673a\u5b9e\u73b0\u3002 Quantum Leaps \uff1a\u72b6\u6001\u673a\u7ec4\u7ec7\u3002 ZBar \uff1a\u4e8c\u7ef4\u7801\u626b\u63cf\u5de5\u5177\u548c\u5f00\u53d1\u5305. FFmpeg \uff1a\u591a\u5a92\u4f53\u5904\u7406\u5de5\u5177\u5e93. libnabo \uff1a\u662f\u4e00\u4e2a\u5feb\u901f\u4e3a\u4f4e\u7ef4\u5ea6\u7a7a\u95f4\u63d0\u4f9b K \u6700\u8fd1\u90bb\u5c45\u7b97\u6cd5\u5e93\u3002 DSAL \uff1a\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u5e93\u3002 FLINT \uff1a\u662f\u4e00\u4e2a\u6570\u8bba\u5e93\uff0c\u7528 C \u8bed\u8a00\u7f16\u5199\uff0c\u5b83\u5305\u62ec\u4e00\u4e2a\u975e\u5e38\u5feb\u7684\u591a\u9879\u5f0f\u7b97\u6cd5\u5e93\u3002 LibMMSeg \uff1a\u4e2d\u6587\u5206\u8bcd\u8f6f\u4ef6\u5305 \u3002 CDS \uff1aCDS \u662f\u4e00\u4e2a C++ \u6a21\u677f\u5e93\uff0c\u5305\u542b lock-free and fine-grained \u7b97\u6cd5\u3002 hashlib++ \uff1a\u662f\u4e00\u4e2a\u7b80\u5355\u6613\u7528\u7684\u7528\u6765\u751f\u6210 checksum \u7b97\u6cd5\u3002 libcstl \uff1aC \u8bed\u8a00\u7f16\u5199\u7684\u4e00\u4e2a\u901a\u7528\u7684\u6570\u636e\u7ed3\u6784\u548c\u5e38\u7528\u7684\u7b97\u6cd5\u5e93\u3002 Botan \uff1aBotan \u662f\u4e00\u4e2a C++ \u7684\u52a0\u5bc6\u7b97\u6cd5\u5e93\u3002 CGAL \uff1a\u8ba1\u7b97\u51e0\u4f55\u7b97\u6cd5\u5e93\u3002 MyMediaLite \uff1a\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u591a\u7528\u9014\u7684\u63a8\u8350\u7cfb\u7edf\u7684\u7b97\u6cd5\u5e93\u3002 cblas \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 blas \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002f2c \u5b98\u7f51\u3002 clapack \uff1a\u63d0\u4f9b c \u63a5\u53e3\u7684 lapack \u5e93\uff0c\u6e90\u7801\u901a\u8fc7 f2c \u8f6c\u6362\u4e3a C \u8bed\u8a00\u3002 scalapack \uff1a\u63d0\u4f9b\u5e76\u884c\u8fd0\u7b97\u7684 lapack \u5e93\uff0c\u6e90\u7801\u7528 fortran \u7f16\u5199\u3002 armadillo \uff1a\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\uff0c\u6e90\u7801\u7528 c++ \u7f16\u5199\u3002 openblas \uff1a\u9488\u5bf9 intel cpu \u4f18\u5316\u7684 blas \u5e93\u3002 mkl \uff1a\u6269\u5c55\u7684\u4e14\u9488\u5bf9 intel cpu \u4f18\u5316\u7684\u5e93\uff0c\u5305\u62ec\u5feb\u901f\u5085\u7acb\u53f6\u53d8\u6362\uff08FFT\uff09\u3001\u77e2\u91cf\u6570\u5b66\u5e93\u3002 eigen \uff1aC++ \u5199\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\u5e93\u3002 libjpeg \uff1a\u7528 libjpeg \u5e93\u5728 LCD \u4e0a\u663e\u793a\u56fe\u7247\u3002 x264 \uff1ax264 \u5f00\u6e90\u7684\u89e3\u7801\u7f16\u7801\u5e93\u3002 ws2812 \uff1aws2812 \u9a71\u52a8\u5e93\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"2\u3001\u5b9e\u7528\u5e93 / \u6846\u67b6"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#3gui","text":"GuiLite \uff1a\u5927\u9053\u81f3\u7b80 - 5 \u5343\u884c / \u4ec5\u5934\u6587\u4ef6 / \u5168\u5e73\u53f0 GUI \u5e93 \u3002 yoxios \uff1a \u57fa\u4e8e Linux \u5f00\u53d1\u7684\u8f7b\u91cf\u7ea7\u7269\u8054\u7f51\u7cfb\u7edf\u548c\u786c\u4ef6\u5e73\u53f0\u3002 ToughGFX \uff1a \u4e00\u4e2a C++ \u7f16\u5199\u7684 GUI \u8f6f\u4ef6\u6846\u67b6 \u3002 emwin \uff1a\u4e00\u4e2a\u8001\u724c GUI \u5e93\u3002 littlevGL \uff1a \u4e00\u4e2a\u514d\u8d39\u7684\u5f00\u6e90\u56fe\u5f62\u5e93\u3002 \u91ce\u725b LittlevGL demo \uff1a\u57fa\u4e8e\u91ce\u725b\u5f00\u53d1\u677f\u7684 LittlevGL demo \u7a0b\u5e8f \u3002 MonoGUI \uff1a\u4e00\u4e2a\u9ed1\u767d\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7cfb\u7edf \u3002 MiniGUI \uff1a \u4e00\u4e2a\u5feb\u901f\u3001\u7a33\u5b9a\u3001\u8de8\u64cd\u4f5c\u7cfb\u7edf\u7684 GUI\u3002 QT \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6\u3002 QT_Creator \uff1aQT_Creator \u4e0b\u8f7d\u94fe\u63a5\u3002 Gtk \uff1a \u4e00\u4e2a\u7528\u4e8e\u521b\u9020\u56fe\u5f62\u7528\u6237\u63a5\u53e3\u7684\u56fe\u5f62\u5e93\u3002 AWTK \uff1a\u662f ZLG \u503e\u5fc3\u6253\u9020\u7684\u4e00\u5957\u57fa\u4e8e C \u8bed\u8a00\u5f00\u53d1\u7684 GUI \u6846\u67b6 \u3002 \u73b2\u73d1 GUI \uff1a\u73b2\u73d1 GUI \u6559\u7a0b\u9875\u3002 std \uff1a\u4e00\u4e2a\u5d4c\u5165\u5f0f\u5c0f\u578b\u56fe\u5f62\u5e93\u3002 CUGUI \uff1a\u4e3a\u5355\u7247\u673a\u5199\u7684 GUI \uff0c\u652f\u6301\u5b57\u4f53\uff0c\u6309\u952e\uff0c\u56fe\u7247\uff0c\u6ed1\u52a8\u6761\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"3\u3001GUI \u76f8\u5173"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#4","text":"ElectronBot \uff1a\u4e00\u4e2a\u684c\u9762\u7ea7\u5c0f\u673a\u5668\u4eba\u3002 Planck-Pi \uff1a\u8d85\u8ff7\u4f60 Linux \u5f00\u53d1\u677f\u3002 qt_2019_ncov \uff1a\u57fa\u4e8e Qt/C++ \u5b9e\u73b0\u7684\u65b0\u51a0\u80ba\u708e\u75ab\u60c5\u76d1\u63a7\u5e73\u53f0\u3002 H7-TOOL_STM32H7_App \uff1a\u5b89\u5bcc\u83b1 H7-TOOL \u591a\u529f\u80fd\u5f00\u53d1\u5de5\u5177\u3002 the-little-bili-tv \uff1a\u57fa\u4e8e esp32+lvgl8.0 \u7684\u54d4\u54e9\u54d4\u54e9\u5c0f\u7535\u89c6\u3002 DAPLink/CMSIS DAP \uff1a\u4e00\u4e2a\u8c03\u8bd5\u5668\uff0c \u96c6\u6210\u4e0b\u8f7d\u3001\u8c03\u8bd5\u548c USB \u865a\u62df\u4e32\u53e3\u3002 Crazepony \uff1aCrazepony \u5f00\u6e90\u56db\u8f74\u98de\u884c\u5668\u3002 MiniQ \uff1a\u4e00\u4e2a\u8ff7\u4f60\u56db\u8f74\u98de\u884c\u5668\u3002 LiPow-Firmware \uff1a\u57fa\u4e8e STM32G0 \u91c7\u7528 USB type-C \u4f9b\u7535\u7684\u5f00\u6e90\u9502\u7535\u6c60\u5145\u7535\u5668\u3002 Avem \uff1a \u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u3002 esp8266-lattice-clock \uff1aEsp8266 \u591a\u529f\u80fd\u70b9\u9635\u65f6\u949f\u3002 SoftWareSerial \uff1a\u4e00\u4e2a STM32 IO \u53e3\u6a21\u62df\u5b9e\u73b0\u8f6f\u4ef6\u4e32\u53e3\u7a0b\u5e8f\u3002 \u4e32\u53e3 ISP \u7a0b\u5e8f \uff1a\u4e00\u4e2a stm32 \u4e32\u53e3 ISP \u7a0b\u5e8f\u3002 DSO_Nano \uff1a\u4e00\u4e2a\u624b\u6301\u793a\u6ce2\u5668\u3002 DSView \uff1a \u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u903b\u8f91\u5206\u6790\u4eea\u3002 MCU-Development \uff1a \u57fa\u4e8e 51\u3001430\u3001STM32F10X\u3001STM32F407X\u3001T4MC123G \u5e73\u53f0\u7684\u5404\u5e38\u89c1\u786c\u4ef6\u6a21\u5757 demo\u3002 Arduino \uff1a \u5f00\u6e90\u7535\u5b50\u539f\u578b\u5e73\u53f0\u3002 EWAHBoolArray \uff1a bitmap \u7b97\u6cd5\u3002 mcush \uff1aMCU shell\u3002 DoST \uff1a Linux \u4e0b\u5f00\u53d1 STM32 \u3002 Avem : \u8fd9\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u65e0\u4eba\u673a\u98de\u63a7\u9879\u76ee\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"4\u3001\u9879\u76ee / \u8f6f\u786c\u7ed3\u5408"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#5","text":"100ask download \uff1a\u767e\u6587\u7f51\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 armfly \uff1a\u5b89\u5bcc\u83b1 / \u786c\u6c49\u5d4c\u5165\u5f0f\u8bba\u575b\u3002 fire download \uff1a\u91ce\u706b\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 openedv download \uff1a\u6b63\u70b9\u539f\u5b50\u8d44\u6599\u4e0b\u8f7d\u4e2d\u5fc3\u3002 \u91ce\u706b \uff1a\u91ce\u706b\u7535\u5b50\u8bba\u575b\u3002 \u6b63\u70b9 \uff1a\u6b63\u70b9\u539f\u5b50\u8bba\u575b\u3002 \u5c0f\u718a\u732b C++ IDE \uff1a\u8de8\u5e73\u53f0\u3001\u8f7b\u91cf\u6613\u7528\u7684\u5f00\u6e90 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 ST \uff1aST \u4e2d\u6587\u793e\u533a\u3002 \u8baf\u4e3a\u5f00\u53d1\u793e\u533a \uff1a\u5317\u4eac\u8baf\u4e3a ARM \u5f00\u53d1\u793e\u533a\u3002 \u8baf\u4e3a\u5b98\u7f51 \uff1a\u8baf\u4e3a\u5b98\u7f51\u3002 NXP \u793e\u533a \uff1a\u6069\u667a\u6d66\u8bba\u575b\u3002 Linux \uff1aLinux \u5185\u6838\u5b98\u7f51\u3002 Linux \u6e90\u7801 \uff1a\u53ef\u5728\u7ebf\u9605\u8bfb Linux \u5185\u6838\u6e90\u7801\u3002 Buildroot \uff1abuildroot \u6e90\u7801\u3002 Debian \uff1aDebian \u5b98\u7f51\u3002 Ubuntu \uff1aUbuntu \u5b98\u7f51\u3002 BOA \u5b98\u7f51 \uff1a\u4e00\u4e2a\u5355\u4efb\u52a1 web \u670d\u52a1\u5668 \uff0c\u53ef\u4ee5\u79fb\u690d\u5230\u5d4c\u5165\u5f0f\u5e73\u53f0\u3002 \u8354\u679d\u6d3e \uff1a\u8354\u679d\u6d3e\u6307\u5357\u3002 \u6e05\u534e\u955c\u50cf\u7ad9 \uff1a\u6e05\u534e\u5927\u5b66\u5f00\u6e90\u8f6f\u4ef6\u955c\u50cf\u7ad9\u3002 \u4e2d\u79d1\u5927\u955c\u50cf\u7ad9 \uff1a\u4e2d\u56fd\u79d1\u6280\u5927\u5b66\u955c\u50cf\u7ad9\u3002 u-boot \uff1au-boot \u6e90\u7801\u4e0b\u8f7d\u9875\u9762\u3002 bear-pi \uff1a\u5c0f\u718a\u6d3e demo\u3002 \u5b85\u5b66\u90e8\u843d \uff1a\u4e00\u4e2a Linux\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u5185\u6838\u3001\u9a71\u52a8\u5f00\u53d1\u5b66\u4e60\u7f51\u7ad9\u3002 \u5355\u7247\u673a\u6559\u7a0b\u7f51 \uff1a\u5355\u7247\u673a\u57fa\u7840\u3001\u8bbe\u8ba1\u5b9e\u4f8b\u3001\u8bba\u575b\u3002 GNU \uff1aGNU \u5b98\u7f51\u3002 ChinaUnix \uff1aLinux/Unix \u76f8\u5173\u3002 PyQt5 \uff1aPyQt5 \u6559\u7a0b\u3002 qter \uff1aQT \u5f00\u6e90\u793e\u533a\u3002 git \u624b\u518c \uff1agit \u5b66\u4e60\u624b\u518c\u3002 \u5f00\u6e90\u9879\u76ee\u98ce\u683c \uff1aGoogle \u5f00\u6e90\u9879\u76ee\u98ce\u683c\u6307\u5357 (\u4e2d\u6587\u7248)\u3002 \u7535\u5b50\u4e16\u5bb6 \uff1a\u4e00\u4e2a\u7535\u5b50\u7c7b\u5bfc\u822a\u7f51\u7ad9\u3002 21ic \uff1a21IC \u4e2d\u56fd\u7535\u5b50\u7f51\u3002 \u82af\u8def\u6052\u7535\u5b50 \uff1a\u5c0f\u6885\u54e5\u535a\u5ba2\u3001FPGA \u8bba\u575b\u3002 \u5d4c\u5165\u5f0f\u5f00\u53d1\u8005\u793e\u533a \uff1a\u521b\u9f99\u8bba\u575b\u3002 micropython \uff1amicropython \u4e2d\u6587\u7f51\u3002 \u6cf0\u6653\u79d1\u6280 \uff1aLinux \u76f8\u5173\u3002 \u7535\u5802\u79d1\u6280 \uff1aSTM32 \u76f8\u5173\u3002 \u6e90\u4ee3\u7801\u4f7f\u7528\u793a\u4f8b\u805a\u5408\u5668 \uff1a \u4ece\u8d85\u8fc7 100 \u4e07\u4e2a\u5f00\u6e90\u9879\u76ee\u641c\u7d22 CPP \u4ee3\u7801\u793a\u4f8b\u3002 KST-51 \uff1a\u300a\u624b\u628a\u624b\u6559\u4f60\u5b66 51 \u5355\u7247\u673a\u300b \u3002 \u539f\u5b50\u54e5 \uff1a\u4e13\u6ce8\u7535\u5b50\u6280\u672f\u6559\u5b66\u3002\u3002 digoboy \uff1a\u5730\u74dc\u6d3e\u89c6\u9891\u7f51\u3002 c.biancheng \uff1aC \u8bed\u8a00\u4e2d\u6587\u7f51\u3002 open-c-book \uff1a\u300aC \u8bed\u8a00\u7f16\u7a0b\u900f\u89c6\u300b\u3002 PyQt5 \uff1aPyQt5 \u5728\u7ebf\u6559\u7a0b\u3002 open-shell-book \uff1a\u300aShell \u7f16\u7a0b\u8303\u4f8b\u300b \u3002 software_unit_test \uff1a \u300a\u8f6f\u4ef6\u5355\u5143\u6d4b\u8bd5\u5165\u95e8\u4e0e\u5b9e\u8df5\u300b\u3002 kerneltravel \uff1aLinux \u5185\u6838\u4e4b\u65c5\u3002 \u8717\u7a9d\u79d1\u6280 \uff1a\u6162\u4e0b\u6765\uff0c\u4eab\u53d7\u6280\u672f\u3002 bookstack \uff1a\u4e66\u6808\u7f51\u3002 wireshark \uff1a\u6293\u5305\u5de5\u5177\u4e0b\u8f7d\u94fe\u63a5\u3002 MobaXterm \uff1a\u4e00\u4e2a\u597d\u7528\u7684\u7ec8\u7aef\u8f6f\u4ef6\u3002 Stduino \uff1a \u4e00\u6b3e\u9762\u5411 32 \u4f4d\u5904\u7406\u5668\u5feb\u901f\u5165\u95e8\u5b66\u4e60\u7684\u96c6\u6210\u5f00\u53d1\u5e73\u53f0 \u3002 easyicon \uff1a\u4e00\u4e2a\u514d\u8d39\u56fe\u6807\u4e0b\u8f7d\u7f51\u7ad9\u3002 codingdict \uff1a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u83dc\u9e1f\u6559\u7a0b\u7684\u7f16\u7a0b\u7c7b\u6559\u7a0b\u7f51\u7ad9\u3002 codingdict \u5f00\u6e90\u8f6f\u4ef6 \uff1acodingdict \u7f51\u7ad9\u6536\u96c6\u7684\u5404\u7c7b\u5f00\u6e90\u8f6f\u4ef6\u96c6\u5408\u3002 C \u7ecf\u5178\u793a\u4f8b \uff1a\u4e00\u4e9b C \u8bed\u8a00\u7684\u5b9e\u4f8b\u3002 xmake \uff1a\u8f7b\u91cf\u7ea7\u8de8\u5e73\u53f0 C/C++ \u6784\u5efa\u5de5\u5177\u3002 spacevim \uff1a\u4e00\u4e2a\u6a21\u5757\u5316\u7684 Vim IDE\u3002 vofa+ \uff1a\u4e00\u4e2a\u63d2\u4ef6\u9a71\u52a8\u7684\u9ad8\u81ea\u7531\u5ea6\u4e0a\u4f4d\u673a\u3002 \u8054\u5408\u5f00\u53d1\u7f51 \uff1a356 \u4e07\u4e2a\u7f16\u7a0b\u6e90\u7801\u8d44\u6599 \u89c5\u601d\u6587\u6863 \uff1a\u79c1\u6709\u4e91\u7b14\u8bb0\u3001\u4e91\u6587\u6863\u548c\u77e5\u8bc6\u5e93\u7cfb\u7edf\u3002 aardio \uff1a\u6613\u7528\u6027\u6781\u5f3a\u7684\u52a8\u6001\u8bed\u8a00\u3002 OneNET SDK \uff1aOneNET SDK \u4ed3\u5e93\u3002 ros \u624b\u518c \uff1aros \u7684\u5b98\u65b9\u624b\u518c\u3002 gnu \u7684\u5f00\u6e90\u8f6f\u4ef6 \uff1agnu \u7684\u5f00\u6e90\u8f6f\u4ef6 soft-and-hard \uff1a\u8fd9\u662f\u4e00\u4e2a\u4ee5\u7269\u8054\u7f51\u9879\u76ee\u4e3a\u4e3b\u65b9\u5411\u5206\u4eab web \u5f00\u53d1\u6559\u7a0b\u3002 FireflyTeam \uff1a\u4e00\u4e2a\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u4ed3\u5e93\u3002 python \u811a\u672c \uff1a\u4e00\u4e9b\u597d\u7528\u7684 python \u811a\u672c\u3002 C++ libraries \uff1aA list of open source C++ libraries. Lindenis \uff1aAn open source software for Lindenis SBC\u3002 fast-line-following \uff1a\u4e00\u4e2a\u5feb\u901f\u5bfb\u7ebf\u673a\u5668\u4eba\u7684\u7b97\u6cd5\u3002 \u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177 \uff1a\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u5de5\u5177\u3002 Awesome-Embedded \uff1a\u6c47\u805a\u4e86\u5404\u79cd\u5d4c\u5165\u5f0f\u76f8\u5173\u7684\u8d44\u6e90\u3002 FreeModbus : FreeModbus \u662f\u4e00\u6b3e\u5f00\u6e90\u7684 Modbus \u534f\u8bae\u6808\uff0c\u4f46\u662f\u53ea\u6709\u4ece\u673a\u5f00\u6e90\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"5\u3001\u8d44\u6e90 / \u5de5\u5177 / \u7f51\u7ad9 / \u8bba\u575b"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#6","text":"STMicroelectronics \uff1a\u610f\u6cd5\u534a\u5bfc\u4f53\uff08ST\uff09\u3002 TI \uff1a\u5fb7\u5dde\u4eea\u5668\uff08TI\uff09\u3002 NXP \uff1a\u6069\u667a\u6d66\uff08NXP\uff09\u3002 Freescale \uff1a\u98de\u601d\u5361\u5c14\u534a\u5bfc\u4f53\uff08Freescale\uff09\u3002 hisilicon \uff1a\u6d77\u601d\u3002 rockchip \uff1a\u745e\u82af\u5fae\u3002 Samsung \uff1a\u4e09\u661f\u3002 Infineon \uff1a\u82f1\u98de\u51cc\u3002 analogdevicesinc \uff1a\u4e9a\u5fb7\u8bfa\u534a\u5bfc\u4f53\uff08ADI\uff09\u3002 MicrochipTech \uff1a\u5fae\u82af\u534a\u5bfc\u4f53\uff08Microchip \uff09\u3002 NordicSemiconductor \uff1a\u5317\u6b27\u96c6\u6210\u7535\u8def\uff08Nordic\uff09\u3002 cypress-io \uff1a\u8d5b\u666e\u62c9\u65af\u534a\u5bfc\u4f53\uff08Cypress\uff09\u3002 GD32 \uff1a\u6613\u5146\u521b\u65b0 (GD)\u3002 GD32 \u7f51\u76d8 \uff1a\uff1a\u6613\u5146\u521b\u65b0 (GD) \u7f51\u76d8\u8d44\u6599\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"6\u3001\u4e00\u4e9b\u82af\u7247\u539f\u5382\u4ee3\u7801\u4ed3\u5e93"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#7","text":"Domoticz \uff1a\u4e00\u4e2a\u5f00\u6e90\u7684\u667a\u80fd\u5bb6\u5c45\u7cfb\u7edf \u3002 Kaa IoT Platform \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u5f00\u653e\u548c\u9ad8\u6548\u7684\u7269\u8054\u7f51\u4e91\u5e73\u53f0\u3002 RT-Thread IoT SDK \uff1a\u57fa\u4e8e RT-Thread IOT \u5f00\u53d1\u677f\u7684\u5404\u7c7b\u4f8b\u7a0b\u3002 \u4ece\u96f6\u6253\u9020\u7269\u8054\u7f51 \uff1a\u4e00\u4efd\u9002\u5408\u5d4c\u5165\u5f0f\u5f00\u53d1\u4eba\u5458\u5b66\u4e60\u7684 web \u5f00\u53d1\u6559\u7a0b\u3002 \u66f4\u591a\u8d44\u6e90\u656c\u8bf7\u671f\u5f85......","title":"7\u3001\u7269\u8054\u7f51\u3001\u667a\u80fd\u5bb6\u5c45"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#8","text":"RoboCar \uff1a\u673a\u5668\u4eba\u81ea\u52a8\u5bfb\u7ebf\u3001\u907f\u969c\u3001\u5efa\u56fe\u3001\u5bfc\u822a\u3001\u9065\u63a7\u7248\u672c / \u8f66\u8f7d\u7535\u8111\u7248\u672c\u8def\u9762\u5206\u6790\uff0c\u53ca\u4ea4\u901a\u8def\u51b5\u8bc6\u522b\u7684\u8f66\u8f86\u8f85\u52a9\u9a7e\u9a76\u7cfb\u7edf ROS \u6559\u7a0b \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf slam \uff1a\u601d\u5c9a\u79d1\u6280\u3002","title":"8\u3001\u673a\u5668\u4eba\u76f8\u5173 / \u5b9a\u4f4d / \u89c6\u89c9"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#9","text":"\u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 11 \u671f aardio \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 10 \u671f inih \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 9 \u671f nanopb \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 8 \u671f AMetal \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 7 \u671f zlog \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 6 \u671f FlexibleButton \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 5 \u671f smartlink \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 4 \u671f cola_os \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 3 \u671f sys/queue.h \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 2 \u671f llgui \u5d4c\u5165\u5f0f\u5927\u6742\u70e9\u5468\u8bb0 | \u7b2c 1 \u671f gear-lib \u535a\u6587\u2014\u2014Tslib \u79fb\u690d\u4e0e\u5206\u6790 \u535a\u4e3b\u2014\u2014ychy \u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7 \u5d4c\u5165\u5f0f\u5927\u6742\u70e9 \uff0c\u67e5\u770b\u66f4\u591a\u8d44\u6e90\u3002 \u4e0b\u9762\u8ba1\u7b97\u673a\u8d44\u6e90\u4e3a\u7f51\u53cb dianjixz \u8d21\u732e\uff0c\u611f\u8c22\u8fd9\u4f4d\u670b\u53cb\u3002","title":"9\u3001\u63a8\u8350\u535a\u5ba2 / \u535a\u6587"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#-","text":"","title":"\u8ba1\u7b97\u673a\u76f8\u5173\u8d44\u6e90 ------ \u6301\u7eed\u66f4\u65b0\u4e2d"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#1","text":"C++ \u6807\u51c6\u5e93\uff0c\u5305\u62ec\u4e86 STL \u5bb9\u5668\uff0c\u7b97\u6cd5\u548c\u51fd\u6570\u7b49\u3002 C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7c7b\u548c\u51fd\u6570\u7684\u96c6\u5408\uff0c\u4f7f\u7528\u6838\u5fc3\u8bed\u8a00\u7f16\u5199\uff0c\u4e5f\u662f C++ISO \u81ea\u8eab\u6807\u51c6\u7684\u4e00\u90e8\u5206\u3002 Standard Template Library \uff1a\u6807\u51c6\u6a21\u677f\u5e93 C POSIX library \uff1a POSIX \u7cfb\u7edf\u7684 C \u6807\u51c6\u5e93\u89c4\u8303 ISO C++ Standards Committee \uff1aC++ \u6807\u51c6\u59d4\u5458\u4f1a","title":"1\u3001 \u6807\u51c6\u5e93"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#2_1","text":"C++ \u901a\u7528\u6846\u67b6\u548c\u5e93 Apache C++ Standard Library \uff1a\u662f\u4e00\u7cfb\u5217\u7b97\u6cd5\uff0c\u5bb9\u5668\uff0c\u8fed\u4ee3\u5668\u548c\u5176\u4ed6\u57fa\u672c\u7ec4\u4ef6\u7684\u96c6\u5408 ASL \uff1aAdobe \u6e90\u4ee3\u7801\u5e93\u63d0\u4f9b\u4e86\u540c\u884c\u7684\u8bc4\u5ba1\u548c\u53ef\u79fb\u690d\u7684 C++ \u6e90\u4ee3\u7801\u5e93\u3002 Boost \uff1a\u5927\u91cf\u901a\u7528 C++ \u5e93\u7684\u96c6\u5408\u3002 BDE \uff1a\u6765\u81ea\u4e8e\u5f6d\u535a\u8d44\u8baf\u5b9e\u9a8c\u5ba4\u7684\u5f00\u53d1\u73af\u5883\u3002 Cinder \uff1a\u63d0\u4f9b\u4e13\u4e1a\u54c1\u8d28\u521b\u9020\u6027\u7f16\u7801\u7684\u5f00\u6e90\u5f00\u53d1\u793e\u533a\u3002 Cxxomfort \uff1a\u8f7b\u91cf\u7ea7\u7684\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\u7684\u5e93\uff0c\u5c06 C++ 11 \u7684\u4e00\u4e9b\u65b0\u7279\u6027\u79fb\u690d\u5230 C++03 \u4e2d\u3002 Dlib \uff1a\u4f7f\u7528\u5951\u7ea6\u5f0f\u7f16\u7a0b\u548c\u73b0\u4ee3 C++ \u79d1\u6280\u8bbe\u8ba1\u7684\u901a\u7528\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 EASTL \uff1aEA-STL \u516c\u5171\u90e8\u5206 ffead-cpp \uff1a\u4f01\u4e1a\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Folly \uff1a\u7531 Facebook \u5f00\u53d1\u548c\u4f7f\u7528\u7684\u5f00\u6e90 C++ \u5e93 JUCE \uff1a\u5305\u7f57\u4e07\u8c61\u7684 C++ \u7c7b\u5e93\uff0c\u7528\u4e8e\u5f00\u53d1\u8de8\u5e73\u53f0\u8f6f\u4ef6 libPhenom \uff1a\u7528\u4e8e\u6784\u5efa\u9ad8\u6027\u80fd\u548c\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7cfb\u7edf\u7684\u4e8b\u4ef6\u6846\u67b6\u3002 LibSourcey \uff1a\u7528\u4e8e\u5b9e\u65f6\u7684\u89c6\u9891\u6d41\u548c\u9ad8\u6027\u80fd\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u7684 C++11 evented IO LibU \uff1a C \u8bed\u8a00\u5199\u7684\u591a\u5e73\u53f0\u5de5\u5177\u5e93 Loki \uff1aC++ \u5e93\u7684\u8bbe\u8ba1\uff0c\u5305\u62ec\u5e38\u89c1\u7684 \u8bbe\u8ba1\u6a21\u5f0f \u548c\u4e60\u8bed\u7684\u5b9e\u73b0\u3002 MiLi \uff1a\u53ea\u542b\u5934\u6587\u4ef6\u7684\u5c0f\u578b C++ \u5e93 openFrameworks \uff1a\u5f00\u53d1 C++ \u5de5\u5177\u5305\uff0c\u7528\u4e8e\u521b\u610f\u6027\u7f16\u7801\u3002 Qt \uff1a\u8de8\u5e73\u53f0\u7684\u5e94\u7528\u7a0b\u5e8f\u548c\u7528\u6237\u754c\u9762\u6846\u67b6 Reason \uff1a\u8de8\u5e73\u53f0\u7684\u6846\u67b6\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u5bb9\u6613\u5730\u4f7f\u7528 Java\uff0c.Net \u548c Python\uff0c\u540c\u65f6\u4e5f\u6ee1\u8db3\u4e86\u4ed6\u4eec\u5bf9 C++ \u6027\u80fd\u548c\u4f18\u52bf\u7684\u9700\u6c42\u3002 ROOT \uff1a\u5177\u5907\u6240\u6709\u529f\u80fd\u7684\u4e00\u7cfb\u5217\u9762\u5411\u5bf9\u8c61\u7684\u6846\u67b6\uff0c\u80fd\u591f\u975e\u5e38\u9ad8\u6548\u5730\u5904\u7406\u548c\u5206\u6790\u5927\u91cf\u7684\u6570\u636e\uff0c\u4e3a\u6b27\u6d32\u539f\u5b50\u80fd\u7814\u7a76\u673a\u6784\u6240\u7528\u3002 STLport \uff1a\u662f STL \u5177\u6709\u4ee3\u8868\u6027\u7684\u7248\u672c STXXL \uff1a\u7528\u4e8e\u989d\u5916\u7684\u5927\u578b\u6570\u636e\u96c6\u7684\u6807\u51c6\u6a21\u677f\u5e93\u3002 Ultimate++ \uff1aC++ \u8de8\u5e73\u53f0\u5feb\u901f\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u6846\u67b6 Windows Template Library \uff1a\u7528\u4e8e\u5f00\u53d1 Windows \u5e94\u7528\u7a0b\u5e8f\u548c UI \u7ec4\u4ef6\u7684 C++ \u5e93 Yomm11 \uff1aC++11 \u7684\u5f00\u653e multi-methods.","title":"2\u3001 \u6846\u67b6"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#3","text":"btsk \uff1a\u6e38\u620f\u884c\u4e3a\u6811\u542f\u52a8\u5668\u5de5\u5177 Evolving Objects \uff1a\u57fa\u4e8e\u6a21\u677f\u7684\uff0cANSI C++ \u6f14\u5316\u8ba1\u7b97\u5e93\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u975e\u5e38\u5feb\u901f\u5730\u7f16\u5199\u51fa\u81ea\u5df1\u7684\u968f\u673a\u4f18\u5316\u7b97\u6cd5\u3002 Neu \uff1aC++11 \u6846\u67b6\uff0c\u7f16\u7a0b\u8bed\u8a00\u96c6\uff0c\u7528\u4e8e\u521b\u5efa\u4eba\u5de5\u667a\u80fd\u5e94\u7528\u7a0b\u5e8f\u7684\u591a\u7528\u9014\u8f6f\u4ef6\u7cfb\u7edf\u3002","title":"3\u3001 \u4eba\u5de5\u667a\u80fd"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#4_1","text":"Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93\u3002 libev \uff1a\u529f\u80fd\u9f50\u5168\uff0c\u9ad8\u6027\u80fd\u7684\u65f6\u95f4\u5faa\u73af\uff0c\u8f7b\u5fae\u5730\u4eff\u6548 libevent\uff0c\u4f46\u662f\u4e0d\u518d\u50cf libevent \u4e00\u6837\u6709\u5c40\u9650\u6027\uff0c\u4e5f\u4fee\u590d\u4e86\u5b83\u7684\u4e00\u4e9b bug\u3002 libevent \uff1a\u4e8b\u4ef6\u901a\u77e5\u5e93 libuv \uff1a\u8de8\u5e73\u53f0\u5f02\u6b65 I/O\u3002","title":"4\u3001 \u5f02\u6b65\u4e8b\u4ef6\u5faa\u73af"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#5_1","text":"\u97f3\u9891\uff0c\u58f0\u97f3\uff0c\u97f3\u4e50\uff0c\u6570\u5b57\u5316\u97f3\u4e50\u5e93 FMOD \uff1a\u6613\u4e8e\u4f7f\u7528\u7684\u8de8\u5e73\u53f0\u7684\u97f3\u9891\u5f15\u64ce\u548c\u97f3\u9891\u5185\u5bb9\u7684\u6e38\u620f\u521b\u4f5c\u5de5\u5177\u3002 Maximilian \uff1aC++ \u97f3\u9891\u548c\u97f3\u4e50\u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5e93 OpenAL \uff1a\u5f00\u6e90\u97f3\u9891\u5e93\u2014\u8de8\u5e73\u53f0\u7684\u97f3\u9891 API Opus \uff1a\u4e00\u4e2a\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u514d\u7248\u7a0e\u7684\uff0c\u9ad8\u5ea6\u901a\u7528\u7684\u97f3\u9891\u7f16\u89e3\u7801\u5668 Speex \uff1a\u514d\u8d39\u7f16\u89e3\u7801\u5668\uff0c\u4e3a Opus \u6240\u5e9f\u5f03 Tonic \uff1a C++ \u6613\u7528\u548c\u9ad8\u6548\u7684\u97f3\u9891\u5408\u6210 Vorbis \uff1a Ogg Vorbis \u662f\u4e00\u79cd\u5b8c\u5168\u5f00\u653e\u7684\uff0c\u975e\u4e13\u6709\u7684\uff0c\u514d\u7248\u7a0e\u7684\u901a\u7528\u538b\u7f29\u97f3\u9891\u683c\u5f0f\u3002","title":"5\u3001\u97f3\u9891"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#6_1","text":"\u751f\u7269\u4fe1\u606f\uff0c\u57fa\u56e0\u7ec4\u5b66\u548c\u751f\u7269\u6280\u672f libsequence \uff1a\u7528\u4e8e\u8868\u793a\u548c\u5206\u6790\u7fa4\u4f53\u9057\u4f20\u5b66\u6570\u636e\u7684 C++ \u5e93\u3002 SeqAn \uff1a\u4e13\u6ce8\u4e8e\u751f\u7269\u6570\u636e\u5e8f\u5217\u5206\u6790\u7684\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u3002 Vcflib \uff1a\u7528\u4e8e\u89e3\u6790\u548c\u5904\u7406 VCF \u6587\u4ef6\u7684 C++ \u5e93 Wham \uff1a\u76f4\u63a5\u628a\u8054\u60f3\u6d4b\u8bd5\u5e94\u7528\u5230 BAM \u6587\u4ef6\u7684\u57fa\u56e0\u7ed3\u6784\u53d8\u5f02\u3002","title":"6\u3001 \u751f\u6001\u5b66"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#7_1","text":"\u538b\u7f29\u548c\u5f52\u6863\u5e93 bzip2 \uff1a\u4e00\u4e2a\u5b8c\u5168\u514d\u8d39\uff0c\u514d\u8d39\u4e13\u5229\u548c\u9ad8\u8d28\u91cf\u7684\u6570\u636e\u538b\u7f29 doboz \uff1a\u80fd\u591f\u5feb\u901f\u89e3\u538b\u7f29\u7684\u538b\u7f29\u5e93 PhysicsFS \uff1a\u5bf9\u5404\u79cd\u5f52\u6863\u63d0\u4f9b\u62bd\u8c61\u8bbf\u95ee\u7684\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\u89c6\u9891\u6e38\u620f\uff0c\u8bbe\u8ba1\u7075\u611f\u90e8\u5206\u6765\u81ea\u4e8e Quake3 \u7684\u6587\u4ef6\u5b50\u7cfb\u7edf\u3002 KArchive \uff1a\u7528\u4e8e\u521b\u5efa\uff0c\u8bfb\u5199\u548c\u64cd\u4f5c\u6587\u4ef6\u6863\u6848\uff08\u4f8b\u5982 zip \u548c tar\uff09\u7684\u5e93\uff0c\u5b83\u901a\u8fc7 QIODevice \u7684\u4e00\u7cfb\u5217\u5b50\u7c7b\uff0c\u4f7f\u7528 gzip \u683c\u5f0f\uff0c\u63d0\u4f9b\u4e86\u900f\u660e\u7684\u538b\u7f29\u548c\u89e3\u538b\u7f29\u7684\u6570\u636e\u3002 LZ4 \uff1a\u975e\u5e38\u5feb\u901f\u7684\u538b\u7f29\u7b97\u6cd5 LZHAM \uff1a\u65e0\u635f\u538b\u7f29\u6570\u636e\u5e93\uff0c\u538b\u7f29\u6bd4\u7387\u8ddf LZMA \u63a5\u8fd1\uff0c\u4f46\u662f\u89e3\u538b\u7f29\u901f\u5ea6\u5374\u8981\u5feb\u5f97\u591a\u3002 LZMA \uff1a7z \u683c\u5f0f\u9ed8\u8ba4\u548c\u901a\u7528\u7684\u538b\u7f29\u65b9\u6cd5\u3002 LZMAT \uff1a\u53ca\u5176\u5feb\u901f\u7684\u5b9e\u65f6\u65e0\u635f\u6570\u636e\u538b\u7f29\u5e93 miniz \uff1a\u5355\u4e00\u7684 C \u6e90\u6587\u4ef6\uff0c\u7d27\u7f29 / \u81a8\u80c0\u538b\u7f29\u5e93\uff0c\u4f7f\u7528 zlib \u517c\u5bb9 API\uff0cZIP \u5f52\u6863\u8bfb\u5199\uff0cPNG \u5199\u65b9\u5f0f\u3002 Minizip \uff1aZlib \u6700\u65b0 bug \u4fee\u590d\uff0c\u652f\u6301 PKWARE \u78c1\u76d8\u8de8\u8d8a\uff0cAES \u52a0\u5bc6\u548c IO \u7f13\u51b2\u3002 Snappy \uff1a\u5feb\u901f\u538b\u7f29\u548c\u89e3\u538b\u7f29 ZLib \uff1a\u975e\u5e38\u7d27\u51d1\u7684\u6570\u636e\u6d41\u538b\u7f29\u5e93 ZZIPlib \uff1a\u63d0\u4f9b ZIP \u5f52\u6863\u7684\u8bfb\u6743\u9650\u3002","title":"7\u3001 \u538b\u7f29"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#8_1","text":"\u5e76\u53d1\u6267\u884c\u548c\u591a\u7ebf\u7a0b Boost.Compute \uff1a\u7528\u4e8e OpenCL \u7684 C++GPU \u8ba1\u7b97\u5e93 Bolt \uff1a\u9488\u5bf9 GPU \u8fdb\u884c\u4f18\u5316\u7684 C++ \u6a21\u677f\u5e93 C++React \uff1a\u7528\u4e8e C++11 \u7684\u53cd\u5e94\u6027\u7f16\u7a0b\u5e93 Intel TBB \uff1aIntel \u7ebf\u7a0b\u6784\u4ef6\u5757 Libclsph \uff1a\u57fa\u4e8e OpenCL \u7684 GPU \u52a0\u901f SPH \u6d41\u4f53\u4eff\u771f\u5e93 OpenCL \uff1a\u5e76\u884c\u7f16\u7a0b\u7684\u5f02\u6784\u7cfb\u7edf\u7684\u5f00\u653e\u6807\u51c6 OpenMP \uff1aOpenMP API Thrust \uff1a\u7c7b\u4f3c\u4e8e C++ \u6807\u51c6\u6a21\u677f\u5e93\u7684\u5e76\u884c\u7b97\u6cd5\u5e93 HPX \uff1a\u7528\u4e8e\u4efb\u4f55\u89c4\u6a21\u7684\u5e76\u884c\u548c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u7684\u901a\u7528 C++ \u8fd0\u884c\u65f6\u7cfb\u7edf VexCL \uff1a\u7528\u4e8e OpenCL/CUDA \u7684 C++ \u5411\u91cf\u8868\u8fbe\u5f0f\u6a21\u677f\u5e93\u3002","title":"8\u3001\u5e76\u53d1\u6027"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#9_1","text":"C++ B-tree \uff1a\u57fa\u4e8e B \u6811\u6570\u636e\u7ed3\u6784\uff0c\u5b9e\u73b0\u547d\u4ee4\u5185\u5b58\u5bb9\u5668\u7684\u6a21\u677f\u5e93 Hashmaps \uff1a C++ \u4e2d\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7b97\u6cd5\u7684\u5b9e\u73b0","title":"9\u3001 \u5bb9\u5668"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#10","text":"Bcrypt \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u6587\u4ef6\u52a0\u5bc6\u5de5\u5177\uff0c\u52a0\u5bc6\u6587\u4ef6\u53ef\u4ee5\u79fb\u690d\u5230\u6240\u6709\u53ef\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\u548c\u5904\u7406\u5668\u4e2d\u3002 BeeCrypt \uff1a Botan \uff1a C++ \u52a0\u5bc6\u5e93 Crypto++ \uff1a\u4e00\u4e2a\u6709\u5173\u52a0\u5bc6\u65b9\u6848\u7684\u514d\u8d39\u7684 C++ \u5e93 GnuPG \uff1a OpenPGP \u6807\u51c6\u7684\u5b8c\u6574\u5b9e\u73b0 GnuTLS \uff1a\u5b9e\u73b0\u4e86 SSL\uff0cTLS \u548c DTLS \u534f\u8bae\u7684\u5b89\u5168\u901a\u4fe1\u5e93 Libgcrypt libmcrypt LibreSSL \uff1a\u514d\u8d39\u7684 SSL/TLS \u534f\u8bae\uff0c\u5c5e\u4e8e 2014 OpenSSL \u7684\u4e00\u4e2a\u5206\u652f LibTomCrypt \uff1a\u4e00\u4e2a\u975e\u5e38\u5168\u9762\u7684\uff0c\u6a21\u5757\u5316\u7684\uff0c\u53ef\u79fb\u690d\u7684\u52a0\u5bc6\u5de5\u5177 libsodium \uff1a\u57fa\u4e8e NaCI \u7684\u52a0\u5bc6\u5e93\uff0c\u56fa\u6267\u5df1\u89c1\uff0c\u5bb9\u6613\u4f7f\u7528 Nettle \u5e95\u5c42\u7684\u52a0\u5bc6\u5e93 OpenSSL \uff1a \u4e00\u4e2a\u5f3a\u5927\u7684\uff0c\u5546\u7528\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\uff0c\u5f00\u653e\u6e90\u4ee3\u7801\u7684\u52a0\u5bc6\u5e93\u3002 Tiny AES128 in C \uff1a\u7528 C \u5b9e\u73b0\u7684\u4e00\u4e2a\u5c0f\u5de7\uff0c\u53ef\u79fb\u690d\u7684\u5b9e\u73b0\u4e86 AES128ESB \u7684\u52a0\u5bc6\u7b97\u6cd5","title":"10\u3001 \u5bc6\u7801\u5b66"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#11","text":"\u6570\u636e\u5e93\uff0cSQL \u670d\u52a1\u5668\uff0cODBC \u9a71\u52a8\u7a0b\u5e8f\u548c\u5de5\u5177 hiberlite \uff1a\u7528\u4e8e Sqlite3 \u7684 C++ \u5bf9\u8c61\u5173\u7cfb\u6620\u5c04 Hiredis \uff1a \u7528\u4e8e Redis \u6570\u636e\u5e93\u7684\u5f88\u7b80\u5355\u7684 C \u5ba2\u6237\u7aef\u5e93 LevelDB \uff1a \u5feb\u901f\u952e\u503c\u5b58\u50a8\u5e93 LMDB \uff1a\u7b26\u5408\u6570\u636e\u5e93\u56db\u5927\u57fa\u672c\u5143\u7d20\u7684\u5d4c\u5165\u952e\u503c\u5b58\u50a8 MySQL++ \uff1a\u5c01\u88c5\u4e86 MySql \u7684 C API \u7684 C++ \u5305\u88c5\u5668 RocksDB \uff1a\u6765\u81ea Facebook \u7684\u5d4c\u5165\u952e\u503c\u7684\u5feb\u901f\u5b58\u50a8 SQLite \uff1a\u4e00\u4e2a\u5b8c\u5168\u5d4c\u5165\u5f0f\u7684\uff0c\u529f\u80fd\u9f50\u5168\u7684\u5173\u7cfb\u6570\u636e\u5e93\uff0c\u53ea\u6709\u51e0\u767e KB\uff0c\u53ef\u4ee5\u6b63\u786e\u5305\u542b\u5230\u4f60\u7684\u9879\u76ee\u4e2d\u3002","title":"11\u3001 \u6570\u636e\u5e93"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#12","text":"\u8c03\u8bd5\u5e93\uff0c \u5185\u5b58\u548c\u8d44\u6e90\u6cc4\u9732\u68c0\u6d4b\uff0c\u5355\u5143\u6d4b\u8bd5 Boost.Test \uff1aBoost \u6d4b\u8bd5\u5e93 Catch \uff1a\u4e00\u4e2a\u5f88\u65f6\u5c1a\u7684\uff0cC++ \u539f\u751f\u7684\u6846\u67b6\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6\uff0c\u7528\u4e8e\u5355\u5143\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\u548c\u884c\u4e3a\u9a71\u52a8\u5f00\u53d1\u3002 CppUnit \uff1a\u7531 JUnit \u79fb\u690d\u8fc7\u6765\u7684 C++ \u6d4b\u8bd5\u6846\u67b6 CTest \uff1aCMake \u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f googletest \uff1a\u8c37\u6b4c C++ \u6d4b\u8bd5\u6846\u67b6 ig-debugheap \uff1a\u7528\u4e8e\u8ddf\u8e2a\u5185\u5b58\u9519\u8bef\u7684\u591a\u5e73\u53f0\u8c03\u8bd5\u5806 libtap \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u6d4b\u8bd5 MemTrack \u2014\u7528\u4e8e C++ \u8ddf\u8e2a\u5185\u5b58\u5206\u914d microprofile - \u8de8\u5e73\u53f0\u7684\u7f51\u7edc\u8bd5\u56fe\u5206\u6790\u5668 minUnit \uff1a\u4f7f\u7528 C \u5199\u7684\u8ff7\u4f60\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff0c\u53ea\u4f7f\u7528\u4e86\u4e24\u4e2a\u5b8f Remotery \uff1a\u7528\u4e8e web \u89c6\u56fe\u7684\u5355\u4e00 C \u6587\u4ef6\u5206\u6790\u5668 UnitTest++ \uff1a\u8f7b\u91cf\u7ea7\u7684 C++ \u5355\u5143\u6d4b\u8bd5\u6846\u67b6","title":"12\u3001 \u8c03\u8bd5"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#13","text":"Cocos2d-x \uff1a\u4e00\u4e2a\u8de8\u5e73\u53f0\u6846\u67b6\uff0c\u7528\u4e8e\u6784\u5efa 2D \u6e38\u620f\uff0c\u4e92\u52a8\u56fe\u4e66\uff0c\u6f14\u793a\u548c\u5176\u4ed6\u56fe\u5f62\u5e94\u7528\u7a0b\u5e8f\u3002 Grit \uff1a\u793e\u533a\u9879\u76ee\uff0c\u7528\u4e8e\u6784\u5efa\u4e00\u4e2a\u514d\u8d39\u7684\u6e38\u620f\u5f15\u64ce\uff0c\u5b9e\u73b0\u5f00\u653e\u7684\u4e16\u754c 3D \u6e38\u620f\u3002 Irrlicht \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u5f00\u6e90\u9ad8\u6027\u80fd\u7684\u5b9e\u65f6 #D \u5f15\u64ce Polycode \uff1aC++ \u5b9e\u73b0\u7684\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u5f00\u6e90\u6846\u67b6\uff08\u4e0e Lua \u7ed1\u5b9a\uff09\u3002","title":"13\u3001 \u6e38\u620f\u5f15\u64ce"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#14","text":"CEGUI \uff1a \u5f88\u7075\u6d3b\u7684\u8de8\u5e73\u53f0 GUI \u5e93 FLTK \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u8de8\u5e73\u53f0\u7684 C++GUI \u5de5\u5177\u5305\u3002 GTK+ \uff1a \u7528\u4e8e\u521b\u5efa\u56fe\u5f62\u7528\u6237\u754c\u9762\u7684\u8de8\u5e73\u53f0\u5de5\u5177\u5305 gtkmm \uff1a\u7528\u4e8e\u53d7\u6b22\u8fce\u7684 GUI \u5e93 GTK + \u7684\u5b98\u65b9 C++ \u63a5\u53e3\u3002 imgui \uff1a\u62e5\u6709\u6700\u5c0f\u4f9d\u8d56\u5173\u7cfb\u7684\u7acb\u5373\u6a21\u5f0f\u56fe\u5f62\u7528\u6237\u754c\u9762 libRocket \uff1a libRocket \u662f\u4e00\u4e2a C++ HTML/CSS \u6e38\u620f\u63a5\u53e3\u4e2d\u95f4\u4ef6 MyGUI \uff1a\u5feb\u901f\uff0c\u7075\u6d3b\uff0c\u7b80\u5355\u7684 GUI Ncurses \uff1a\u7ec8\u7aef\u7528\u6237\u754c\u9762 QCustomPlot \uff1a\u6ca1\u6709\u66f4\u591a\u4f9d\u8d56\u5173\u7cfb\u7684 Qt \u7ed8\u56fe\u63a7\u4ef6 Qwt \uff1a\u7528\u6237\u4e0e\u6280\u672f\u5e94\u7528\u7684 Qt \u63a7\u4ef6 QwtPlot3D \uff1a\u529f\u80fd\u4e30\u5bcc\u7684\u57fa\u4e8e Qt/OpenGL \u7684 C++ \u7f16\u7a0b\u5e93\uff0c\u672c\u8d28\u4e0a\u63d0\u4f9b\u4e86\u4e00\u7fa4 3D \u63a7\u4ef6 OtterUI \uff1a OtterUI \u662f\u7528\u4e8e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u548c\u4e92\u52a8\u5a31\u4e50\u8f6f\u4ef6\u7684\u7528\u6237\u754c\u9762\u5f00\u53d1\u89e3\u51b3\u65b9\u6848 PDCurses \u5305\u542b\u6e90\u4ee3\u7801\u548c\u9884\u7f16\u8bd1\u5e93\u7684\u516c\u5171\u56fe\u5f62\u51fd\u6570\u5e93 wxWidgets C++ \u5e93\uff0c\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u4f7f\u7528\u4e00\u4e2a\u4ee3\u7801\u5e93\u53ef\u4ee5\u4e3a widows\uff0c Mac OS X\uff0cLinux \u548c\u5176\u4ed6\u5e73\u53f0\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f","title":"14\u3001 \u56fe\u5f62\u7528\u6237\u754c\u9762"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#15","text":"bgfx \uff1a\u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u5e93 Cairo \uff1a\u652f\u6301\u591a\u79cd\u8f93\u51fa\u8bbe\u5907\u7684 2D \u56fe\u5f62\u5e93 Horde3D \u4e00\u4e2a\u5c0f\u578b\u7684 3D \u6e32\u67d3\u548c\u52a8\u753b\u5f15\u64ce magnum C++11 \u548c OpenGL 2D/3D \u56fe\u5f62\u5f15\u64ce Ogre 3D \u7528 C++ \u7f16\u5199\u7684\u4e00\u4e2a\u9762\u5411\u573a\u666f\uff0c\u5b9e\u65f6\uff0c\u7075\u6d3b\u7684 3D \u6e32\u67d3\u5f15\u64ce\uff08\u5e76\u975e\u6e38\u620f\u5f15\u64ce\uff09 OpenSceneGraph \u5177\u6709\u9ad8\u6027\u80fd\u7684\u5f00\u6e90 3D \u56fe\u5f62\u5de5\u5177\u5305 Panda3D \u7528\u4e8e 3D \u6e32\u67d3\u548c\u6e38\u620f\u5f00\u53d1\u7684\u6846\u67b6\uff0c\u7528 Python \u548c C++ \u7f16\u5199\u3002 Skia \u7528\u4e8e\u7ed8\u5236\u6587\u5b57\uff0c\u56fe\u5f62\u548c\u56fe\u50cf\u7684\u5b8c\u6574\u7684 2D \u56fe\u5f62\u5e93 urho3d \u8de8\u5e73\u53f0\u7684\u6e32\u67d3\u548c\u6e38\u620f\u5f15\u64ce\u3002","title":"15\u3001 \u56fe\u5f62"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#16","text":"Boost.GIL \uff1a\u901a\u7528\u56fe\u50cf\u5e93 CImg \uff1a\u7528\u4e8e\u56fe\u50cf\u5904\u7406\u7684\u5c0f\u578b\u5f00\u6e90 C++ \u5de5\u5177\u5305 CxImage \uff1a\u7528\u4e8e\u52a0\u8f7d\uff0c\u4fdd\u5b58\uff0c\u663e\u793a\u548c\u8f6c\u6362\u7684\u56fe\u50cf\u5904\u7406\u548c\u8f6c\u6362\u5e93\uff0c\u53ef\u4ee5\u5904\u7406\u7684\u56fe\u7247\u683c\u5f0f\u5305\u62ec BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K\u3002 FreeImage \uff1a\u5f00\u6e90\u5e93\uff0c\u652f\u6301\u73b0\u5728\u591a\u5a92\u4f53\u5e94\u7528\u6240\u9700\u7684\u901a\u7528\u56fe\u7247\u683c\u5f0f\u548c\u5176\u4ed6\u683c\u5f0f\u3002 GDCM \uff1aGrassroots DICOM \u5e93 ITK \uff1a\u8de8\u5e73\u53f0\u7684\u5f00\u6e90\u56fe\u50cf\u5206\u6790\u7cfb\u7edf Magick++ \uff1aImage Magic k \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 MagickWnd \uff1aImageMagick \u7a0b\u5e8f\u7684 C++ \u63a5\u53e3 OpenCV \uff1a \u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u7c7b\u5e93 tesseract-ocr \uff1aOCR \u5f15\u64ce VIGRA \uff1a\u7528\u4e8e\u56fe\u50cf\u5206\u6790\u901a\u7528 C++ \u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 VTK \uff1a\u7528\u4e8e 3D \u8ba1\u7b97\u673a\u56fe\u5f62\u5b66\uff0c\u56fe\u50cf\u5904\u7406\u548c\u53ef\u89c6\u5316\u7684\u5f00\u6e90\u514d\u8d39\u8f6f\u4ef6\u7cfb\u7edf\u3002","title":"16\u3001 \u56fe\u50cf\u5904\u7406"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#17","text":"gettext \uff1aGNU `gettext\u2019 IBM ICU \uff1a\u63d0\u4f9b Unicode \u548c\u5168\u7403\u5316\u652f\u6301\u7684 C\u3001C++ \u548c Java \u5e93 libiconv \uff1a\u7528\u4e8e\u4e0d\u540c\u5b57\u7b26\u7f16\u7801\u4e4b\u95f4\u7684\u7f16\u7801\u8f6c\u6362\u5e93","title":"17\u3001 \u56fd\u9645\u5316"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#18-jason","text":"frozen \uff1a C/C++ \u7684 Jason \u89e3\u6790\u751f\u6210\u5668 Jansson \uff1a\u8fdb\u884c\u7f16\u89e3\u7801\u548c\u5904\u7406 Jason \u6570\u636e\u7684 C \u8bed\u8a00\u5e93 jbson \uff1aC++14 \u4e2d\u6784\u5efa\u548c\u8fed\u4ee3 BSON data, \u548c Json \u6587\u6863\u7684\u5e93 JeayeSON \uff1a\u975e\u5e38\u5065\u5168\u7684 C++ JSON \u5e93\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 JSON++ \uff1a C++ JSON \u89e3\u6790\u5668 json-parser \uff1a\u7528\u53ef\u79fb\u690d\u7684 ANSI C \u7f16\u5199\u7684 JSON \u89e3\u6790\u5668\uff0c\u5360\u7528\u5185\u5b58\u975e\u5e38\u5c11 json11 \uff1a\u4e00\u4e2a\u8ff7\u4f60\u7684 C++11 JSON \u5e93 jute \uff1a\u975e\u5e38\u7b80\u5355\u7684 C++ JSON \u89e3\u6790\u5668 ibjson \uff1aC \u8bed\u8a00\u4e2d\u7684 JSON \u89e3\u6790\u548c\u6253\u5370\u5e93\uff0c\u5f88\u5bb9\u6613\u548c\u4efb\u4f55\u6a21\u578b\u96c6\u6210\u3002 libjson \uff1a\u8f7b\u91cf\u7ea7\u7684 JSON \u5e93 PicoJSON \uff1aC++ \u4e2d JSON \u89e3\u6790\u5e8f\u5217\u5316\uff0c\u53ea\u5305\u542b\u5934\u6587\u4ef6 qt-json \uff1a\u7528\u4e8e JSON \u6570\u636e\u548c QVariant \u5c42\u6b21\u95f4\u7684\u76f8\u4e92\u89e3\u6790\u7684\u7b80\u5355\u7c7b QJson \uff1a\u5c06 JSON \u6570\u636e\u6620\u5c04\u5230 QVariant \u5bf9\u8c61\u7684\u57fa\u4e8e Qt \u7684\u5e93 RapidJSON \uff1a \u7528\u4e8e C++ \u7684\u5feb\u901f JSON \u89e3\u6790\u751f\u6210\u5668\uff0c\u5305\u542b SAX \u548c DOM \u4e24\u79cd\u98ce\u683c\u7684 API YAJL \uff1aC \u8bed\u8a00\u4e2d\u5feb\u901f\u6d41 JSON \u89e3\u6790\u5e93","title":"18\u3001 Jason"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#19","text":"Boost.Log \uff1a\u8bbe\u8ba1\u975e\u5e38\u6a21\u5757\u5316\uff0c\u5e76\u4e14\u5177\u6709\u6269\u5c55\u6027 easyloggingpp \uff1aC++ \u65e5\u5fd7\u5e93\uff0c\u53ea\u5305\u542b\u5355\u4e00\u7684\u5934\u6587\u4ef6\u3002 Log4cpp \uff1a\u4e00\u7cfb\u5217 C++ \u7c7b\u5e93\uff0c\u7075\u6d3b\u6dfb\u52a0\u65e5\u5fd7\u5230\u6587\u4ef6\uff0c\u7cfb\u7edf\u65e5\u5fd7\uff0cIDSA \u548c\u5176\u4ed6\u5730\u65b9\u3002 templog \uff1a\u8f7b\u91cf\u7ea7 C++ \u5e93\uff0c\u53ef\u4ee5\u6dfb\u52a0\u65e5\u5fd7\u5230\u4f60\u7684 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d","title":"19\u3001 \u65e5\u5fd7"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#20","text":"Caffe \uff1a\u5feb\u901f\u7684\u795e\u7ecf\u7f51\u7edc\u6846\u67b6 CCV \uff1a\u4ee5 C \u8bed\u8a00\u4e3a\u6838\u5fc3\u7684\u73b0\u4ee3\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 mlpack \uff1a\u53ef\u6269\u5c55\u7684 C++ \u673a\u5668\u5b66\u4e60\u5e93 OpenCV \uff1a\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93 Recommender \uff1a\u4f7f\u7528\u534f\u540c\u8fc7\u6ee4\u8fdb\u884c\u4ea7\u54c1\u63a8\u8350 / \u5efa\u8bae\u7684 C \u8bed\u8a00\u5e93\u3002 SHOGUN \uff1aShogun \u673a\u5668\u5b66\u4e60\u5de5\u5177 sofia-ml \uff1a\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684\u5feb\u901f\u589e\u91cf\u7b97\u6cd5\u5957\u4ef6","title":"20\u3001 \u673a\u5668\u5b66\u4e60"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#21","text":"Armadillo \uff1a\u9ad8\u8d28\u91cf\u7684 C++ \u7ebf\u6027\u4ee3\u6570\u5e93\uff0c\u901f\u5ea6\u548c\u6613\u7528\u6027\u505a\u5230\u4e86\u5f88\u597d\u7684\u5e73\u8861\u3002\u8bed\u6cd5\u548c MatlAB \u5f88\u76f8\u4f3c blaze \uff1a\u9ad8\u6027\u80fd\u7684 C++ \u6570\u5b66\u5e93\uff0c\u7528\u4e8e\u5bc6\u96c6\u548c\u7a00\u758f\u7b97\u6cd5\u3002 ceres-solver \uff1a\u6765\u81ea\u8c37\u6b4c\u7684 C++ \u5e93\uff0c\u7528\u4e8e\u5efa\u6a21\u548c\u89e3\u51b3\u5927\u578b\u590d\u6742\u975e\u7ebf\u6027\u6700\u5c0f\u5e73\u65b9\u95ee\u9898\u3002 CGal \uff1a \u9ad8\u6548\uff0c\u53ef\u9760\u7684\u96c6\u5408\u7b97\u6cd5\u96c6\u5408 cml \uff1a\u7528\u4e8e\u6e38\u620f\u548c\u56fe\u5f62\u7684\u514d\u8d39 C++ \u6570\u5b66\u5e93 Eigen \uff1a\u9ad8\u7ea7 C++ \u6a21\u677f\u5934\u6587\u4ef6\u5e93\uff0c\u5305\u62ec\u7ebf\u6027\u4ee3\u6570\uff0c\u77e9\u9635\uff0c\u5411\u91cf\u64cd\u4f5c\uff0c\u6570\u503c\u89e3\u51b3\u548c\u5176\u4ed6\u76f8\u5173\u7684\u7b97\u6cd5\u3002 GMTL \uff1a\u6570\u5b66\u56fe\u5f62\u6a21\u677f\u5e93\u662f\u4e00\u7ec4\u5e7f\u6cdb\u5b9e\u73b0\u57fa\u672c\u56fe\u5f62\u7684\u5de5\u5177\u3002 GMP \uff1a\u7528\u4e8e\u4e2a\u9ad8\u7cbe\u5ea6\u8ba1\u7b97\u7684 C/C++ \u5e93\uff0c\u5904\u7406\u6709\u7b26\u53f7\u6574\u6570\uff0c\u6709\u7406\u6570\u548c \u6d6e\u70b9\u6570 \u3002","title":"21\u3001 \u6570\u5b66"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#22","text":"GStreamer \uff1a\u6784\u5efa\u5a92\u4f53\u5904\u7406\u7ec4\u4ef6\u56fe\u5f62\u7684\u5e93 LIVE555 Streaming Media \uff1a\u4f7f\u7528\u5f00\u653e\u6807\u51c6\u534f\u8bae (RTP/RTCP, RTSP, SIP) \u7684\u591a\u5a92\u4f53\u6d41\u5e93 libVLC \uff1alibVLC (VLC SDK) \u5a92\u4f53\u6846\u67b6 QtAv \uff1a\u57fa\u4e8e Qt \u548c FFmpeg \u7684\u591a\u5a92\u4f53\u64ad\u653e\u6846\u67b6\uff0c\u80fd\u591f\u5e2e\u52a9\u4f60\u8f7b\u800c\u6613\u4e3e\u5730\u7f16\u5199\u51fa\u4e00\u4e2a\u64ad\u653e\u5668 SDL \uff1a\u7b80\u5355\u76f4\u63a7\u5a92\u4f53\u5c42 SFML \uff1a\u5feb\u901f\uff0c\u7b80\u5355\u7684\u591a\u5a92\u4f53\u5e93","title":"22\u3001 \u591a\u5a92\u4f53"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#23","text":"ACE \uff1aC++ \u9762\u5411\u5bf9\u8c61\u7f51\u7edc\u53d8\u6210\u5de5\u5177\u5305 Boost.Asio \uff1a\u7528\u4e8e\u7f51\u7edc\u548c\u5e95\u5c42 I/O \u7f16\u7a0b\u7684\u8de8\u5e73\u53f0\u7684 C++ \u5e93 Casablanca \uff1aC++ REST SDK cpp-netlib \uff1a\u9ad8\u7ea7\u7f51\u7edc\u7f16\u7a0b\u7684\u5f00\u6e90\u5e93\u96c6\u5408 Dyad.c \uff1aC \u8bed\u8a00\u7684\u5f02\u6b65\u7f51\u7edc libcurl : \u591a\u534f\u8bae\u6587\u4ef6\u4f20\u8f93\u5e93 Mongoose \uff1a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7f51\u7edc\u670d\u52a1\u5668 Muduo \uff1a\u7528\u4e8e Linux \u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u7684 C++ \u975e\u963b\u585e\u7f51\u7edc\u5e93 net_skeleton \uff1aC/C++ \u7684 TCP \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 nope.c \uff1a\u57fa\u4e8e C \u8bed\u8a00\u7684\u8d85\u8f7b\u578b\u8f6f\u4ef6\u5e73\u53f0\uff0c\u7528\u4e8e\u53ef\u6269\u5c55\u7684\u670d\u52a1\u5668\u7aef\u548c\u7f51\u7edc\u5e94\u7528\u3002 \u5bf9\u4e8e C \u7f16\u7a0b\u4eba\u5458\uff0c\u53ef\u4ee5\u8003\u8651 node.js Onion :C \u8bed\u8a00 HTTP \u670d\u52a1\u5668\u5e93\uff0c\u5176\u8bbe\u8ba1\u4e3a\u8f7b\u91cf\u7ea7\uff0c\u6613\u4f7f\u7528\u3002 POCO \uff1a\u7528\u4e8e\u6784\u5efa\u7f51\u7edc\u548c\u57fa\u4e8e\u4e92\u8054\u7f51\u5e94\u7528\u7a0b\u5e8f\u7684 C++ \u7c7b\u5e93\uff0c\u53ef\u4ee5\u8fd0\u884c\u5728\u684c\u9762\uff0c\u670d\u52a1\u5668\uff0c\u79fb\u52a8\u548c\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3002 RakNet \uff1a\u4e3a\u6e38\u620f\u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u7684\u8de8\u5e73\u53f0\u7684\u5f00\u6e90 C++ \u7f51\u7edc\u5f15\u64ce\u3002 Tuf o \uff1a\u7528\u4e8e Qt \u4e4b\u4e0a\u7684 C++ \u6784\u5efa\u7684\u5f02\u6b65 Web \u6846\u67b6\u3002 WebSocket++ \uff1a\u57fa\u4e8e C++/Boost Aiso \u7684 websocket \u5ba2\u6237\u7aef / \u670d\u52a1\u5668\u5e93 ZeroMQ \uff1a\u9ad8\u901f\uff0c\u6a21\u5757\u5316\u7684\u5f02\u6b65\u901a\u4fe1\u5e93","title":"23\u3001 \u7f51\u7edc"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#24","text":"\u52a8\u529b\u5b66\u4eff\u771f\u5f15\u64ce Box2D \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Bullet \uff1a3D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce\u3002 Chipmunk \uff1a\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684 2D \u6e38\u620f\u7269\u7406\u5e93 LiquidFun \uff1a2D \u7684\u6e38\u620f\u7269\u7406\u5f15\u64ce ODE \uff1a\u5f00\u653e\u52a8\u529b\u5b66\u5f15\u64ce - \u5f00\u6e90\uff0c\u9ad8\u6027\u80fd\u5e93\uff0c\u6a21\u62df\u521a\u4f53\u52a8\u529b\u5b66\u3002 ofxBox2d \uff1aBox2D \u5f00\u6e90\u6846\u67b6\u5305\u88c5\u5668\u3002 Simbody \uff1a\u9ad8\u6027\u80fd C++ \u591a\u4f53\u52a8\u529b\u5b66 / \u7269\u7406\u5e93\uff0c\u6a21\u62df\u5173\u8282\u751f\u7269\u529b\u5b66\u548c\u673a\u68b0\u7cfb\u7edf\uff0c\u50cf\u8f66\u8f86\uff0c\u673a\u5668\u4eba\u548c\u4eba\u4f53\u9aa8\u9abc\u3002","title":"24\u3001 \u7269\u7406\u5b66"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#25","text":"MOOS-IvP \uff1a\u4e00\u7ec4\u5f00\u6e90 C++ \u6a21\u5757\uff0c\u63d0\u4f9b\u673a\u5668\u4eba\u5e73\u53f0\u7684\u81ea\u4e3b\u6743\uff0c\u5c24\u5176\u662f\u81ea\u4e3b\u7684\u6d77\u6d0b\u8f66\u8f86\u3002 MRPT \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u7f16\u7a0b\u5de5\u5177\u5305 PCL \uff1a\u70b9\u4e91\u5e93\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\uff0c\u5927\u89c4\u6a21\u7684\u5f00\u653e\u9879\u76ee\uff0c\u7528\u4e8e 2D/3D \u56fe\u50cf\u548c\u70b9\u4e91\u5904\u7406\u3002 Robotics Library (RL) \uff1a \u4e00\u4e2a\u72ec\u7acb\u7684 C++ \u5e93\uff0c\u5305\u62ec\u673a\u5668\u4eba\u52a8\u529b\u5b66\uff0c\u8fd0\u52a8\u89c4\u5212\u548c\u63a7\u5236\u3002 RobWork \uff1a\u4e00\u7ec4 C++ \u5e93\u7684\u96c6\u5408\uff0c\u7528\u4e8e\u673a\u5668\u4eba\u7cfb\u7edf\u7684\u4eff\u771f\u548c\u63a7\u5236\u3002 ROS \uff1a\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edf\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b\u5e93\u548c\u5de5\u5177\u5e2e\u52a9\u8f6f\u4ef6\u5f00\u53d1\u4eba\u5458\u521b\u5efa\u673a\u5668\u4eba\u5e94\u7528\u7a0b\u5e8f\u3002","title":"25\u3001 \u673a\u5668\u4eba\u5b66"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#26","text":"FFTW : \u7528\u4e00\u7ef4\u6216\u8005\u591a\u7ef4\u8ba1\u7b97 DFT \u7684 C \u8bed\u8a00\u5e93\u3002 GSL \uff1aGNU \u79d1\u5b66\u5e93\u3002","title":"26\u3001 \u79d1\u5b66\u8ba1\u7b97"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#27","text":"ChaiScript \uff1a\u7528\u4e8e C++ \u7684\u6613\u4e8e\u4f7f\u7528\u7684\u5d4c\u5165\u5f0f\u811a\u672c\u8bed\u8a00\u3002 Lua \uff1a\u7528\u4e8e\u914d\u7f6e\u6587\u4ef6\u548c\u57fa\u672c\u5e94\u7528\u7a0b\u5e8f\u811a\u672c\u7684\u5c0f\u578b\u5feb\u901f\u811a\u672c\u5f15\u64ce\u3002 luacxx \uff1a\u7528\u4e8e\u521b\u5efa Lua \u7ed1\u5b9a\u7684 C++ 11 API SWIG \uff1a\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u4f60\u7684 C++ \u4ee3\u7801\u94fe\u63a5\u5230 JavaScript\uff0cPerl\uff0cPHP\uff0cPython\uff0cTcl \u548c Ruby \u7684\u5305\u88c5\u5668 / \u63a5\u53e3\u751f\u6210\u5668 V7 \uff1a\u5d4c\u5165\u5f0f\u7684 JavaScript \u5f15\u64ce\u3002 V8 \uff1a\u8c37\u6b4c\u7684\u5feb\u901f JavaScript \u5f15\u64ce\uff0c\u53ef\u4ee5\u88ab\u5d4c\u5165\u5230\u4efb\u4f55 C++ \u5e94\u7528\u7a0b\u5e8f\u4e2d\u3002","title":"27\u3001 \u811a\u672c"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#28","text":"Cap\u2019n Proto \uff1a\u5feb\u901f\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u548c RPC \u7cfb\u7edf\u3002 cereal \uff1aC++11 \u5e8f\u5217\u5316\u5e93 FlatBuffers \uff1a\u5185\u5b58\u9ad8\u6548\u7684\u5e8f\u5217\u5316\u5e93 MessagePack \uff1aC/C++ \u7684\u9ad8\u6548\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u5e93\uff0c\u4f8b\u5982 JSON protobuf \uff1a\u534f\u8bae\u7f13\u51b2\uff0c\u8c37\u6b4c\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\u3002 protobuf-c \uff1aC \u8bed\u8a00\u7684\u534f\u8bae\u7f13\u51b2\u5b9e\u73b0 SimpleBinaryEncoding \uff1a\u7528\u4e8e\u4f4e\u5ef6\u8fdf\u5e94\u7528\u7a0b\u5e8f\u7684\u5bf9\u4e8c\u8fdb\u5236\u683c\u5f0f\u7684\u5e94\u7528\u7a0b\u5e8f\u4fe1\u606f\u7684\u7f16\u7801\u548c\u89e3\u7801\u3002 Thrift \uff1a\u9ad8\u6548\u7684\u8de8\u8bed\u8a00 IPC/RPC\uff0c\u7528\u4e8e C++\uff0cJava\uff0cPython\uff0cPHP\uff0cC# \u548c\u5176\u5b83\u591a\u79cd\u8bed\u8a00\u4e2d\uff0c\u6700\u521d\u7531 Twitter \u5f00\u53d1\u3002","title":"28\u3001 \u5e8f\u5217\u5316"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#29","text":"libvpx \uff1aVP8/VP9 \u7f16\u7801\u89e3\u7801 SDK FFmpeg \uff1a\u4e00\u4e2a\u5b8c\u6574\u7684\uff0c\u8de8\u5e73\u53f0\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u7528\u4e8e\u8bb0\u5f55\uff0c\u8f6c\u6362\u89c6\u9891\u548c\u97f3\u9891\u6d41\u3002 libde265 \uff1a\u5f00\u653e\u7684 h.265 \u89c6\u9891\u7f16\u89e3\u7801\u5668\u7684\u5b9e\u73b0\u3002 OpenH264 \uff1a\u5f00\u6e90 H.364 \u7f16\u89e3\u7801\u5668\u3002 Theora \uff1a\u514d\u8d39\u5f00\u6e90\u7684\u89c6\u9891\u538b\u7f29\u683c\u5f0f\u3002","title":"29\u3001 \u89c6\u9891"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#30","text":"CarpVM \uff1aC \u4e2d\u6709\u8da3\u7684 VM\uff0c\u8ba9\u6211\u4eec\u4e00\u8d77\u6765\u770b\u770b\u8fd9\u4e2a\u3002 MicroPython \uff1a\u65e8\u5728\u5b9e\u73b0\u5355\u7247\u673a\u4e0a Python3.x \u7684\u5b9e\u73b0 TinyVM \uff1a\u7528\u7eaf\u7cb9\u7684 ANSI C \u7f16\u5199\u7684\u5c0f\u578b\uff0c\u5feb\u901f\uff0c\u8f7b\u91cf\u7ea7\u7684\u865a\u62df\u673a\u3002","title":"30\u3001 \u865a\u62df\u673a"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#31-web","text":"Civetweb \uff1a\u63d0\u4f9b\u6613\u4e8e\u4f7f\u7528\uff0c\u5f3a\u5927\u7684\uff0cC/C++ \u5d4c\u5165\u5f0f Web \u670d\u52a1\u5668\uff0c\u5e26\u6709\u53ef\u9009\u7684 CGI\uff0cSSL \u548c Lua \u652f\u6301\u3002 CppCMS \uff1a\u514d\u8d39\u9ad8\u6027\u80fd\u7684 Web \u5f00\u53d1\u6846\u67b6\uff08\u4e0d\u662f CMS\uff09. Crow \uff1a\u4e00\u4e2a C++ \u5fae\u578b web \u6846\u67b6\uff08\u7075\u611f\u6765\u81ea\u4e8e Python Flask\uff09 Kore : \u4f7f\u7528 C \u8bed\u8a00\u5f00\u53d1\u7684\u7528\u4e8e web \u5e94\u7528\u7a0b\u5e8f\u7684\u8d85\u5feb\u901f\u548c\u7075\u6d3b\u7684 web \u670d\u52a1\u5668 / \u6846\u67b6\u3002 libOnion \uff1a\u8f7b\u91cf\u7ea7\u7684\u5e93\uff0c\u5e2e\u52a9\u4f60\u4f7f\u7528 C \u7f16\u7a0b\u8bed\u8a00\u521b\u5efa web \u670d\u52a1\u5668\u3002 QDjango \uff1a\u4f7f\u7528 C++ \u7f16\u5199\u7684\uff0c\u57fa\u4e8e Qt \u5e93\u7684 web \u6846\u67b6\uff0c\u8bd5\u56fe\u6548\u4eff Django API\uff0c\u56e0\u6b64\u5f97\u6b64\u540d\u3002 Wt \uff1a\u5f00\u53d1 Web \u5e94\u7528\u7684 C++ \u5e93\u3002","title":"31\u3001 Web \u5e94\u7528\u6846\u67b6"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#32-xml","text":"XML \u5c31\u662f\u4e2a\u5783\u573e\uff0cxml \u7684\u89e3\u6790\u5f88\u70e6\u4eba\uff0c\u5bf9\u4e8e\u8ba1\u7b97\u673a\u5b83\u4e5f\u662f\u4e2a\u707e\u96be\u3002\u8fd9\u79cd\u7cdf\u7cd5\u7684\u4e1c\u897f\u5b8c\u5168\u6ca1\u6709\u5b58\u5728\u7684\u7406\u7531\u4e86\u3002-Linus Torvalds Expat \uff1a\u7528 C \u8bed\u8a00\u7f16\u5199\u7684 xml \u89e3\u6790\u5e93 Libxml2 \uff1aGnome \u7684 xml C \u89e3\u6790\u5668\u548c\u5de5\u5177\u5305 libxml++ \uff1aC++ \u7684 xml \u89e3\u6790\u5668 PugiXML \uff1a\u7528\u4e8e C++ \u7684\uff0c\u652f\u6301 XPath \u7684\u8f7b\u91cf\u7ea7\uff0c\u7b80\u5355\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\u3002 RapidXml \uff1a\u8bd5\u56fe\u521b\u5efa\u6700\u5feb\u901f\u7684 XML \u89e3\u6790\u5668\uff0c\u540c\u65f6\u4fdd\u6301\u6613\u7528\u6027\uff0c\u53ef\u79fb\u690d\u6027\u548c\u5408\u7406\u7684 W3C \u517c\u5bb9\u6027\u3002 TinyXML \uff1a\u7b80\u5355\u5c0f\u578b\u7684 C++XML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML2 \uff1a\u7b80\u5355\u5feb\u901f\u7684 C++CML \u89e3\u6790\u5668\uff0c\u53ef\u4ee5\u5f88\u5bb9\u6613\u96c6\u6210\u5230\u5176\u5b83\u9879\u76ee\u4e2d\u3002 TinyXML++ \uff1aTinyXML \u7684\u4e00\u4e2a\u5168\u65b0\u7684\u63a5\u53e3\uff0c\u4f7f\u7528\u4e86 C++ \u7684\u8bb8\u591a\u8bb8\u591a\u4f18\u52bf\uff0c\u6a21\u677f\uff0c\u5f02\u5e38\u548c\u66f4\u597d\u7684\u5f02\u5e38\u5904\u7406\u3002 Xerces-C++ \uff1a\u7528\u53ef\u79fb\u690d\u7684 C++ \u7684\u5b50\u96c6\u7f16\u5199\u7684 XML \u9a8c\u8bc1\u89e3\u6790\u5668\u3002","title":"32\u3001 XML"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#33","text":"\u4e00\u4e9b\u6709\u7528\u7684\u5e93\u6216\u8005\u5de5\u5177\uff0c\u4f46\u662f\u4e0d\u9002\u5408\u4e0a\u9762\u7684\u5206\u7c7b\uff0c\u6216\u8005\u8fd8\u6ca1\u6709\u5206\u7c7b\u3002 C++ Format \uff1aC++ \u7684\u5c0f\u578b\uff0c\u5b89\u5168\u548c\u5feb\u901f\u683c\u5f0f\u5316\u5e93 casacore \uff1a\u4ece aips++ \u6d3e\u751f\u7684\u4e00\u7cfb\u5217 C++ \u6838\u5fc3\u5e93 cxx-prettyprint \uff1a\u7528\u4e8e C++ \u5bb9\u5668\u7684\u6253\u5370\u5e93 DynaPDF \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 PDF \u751f\u6210\u5e93 gcc-poison \uff1a\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u7981\u6b62\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e0d\u5b89\u5168\u7684 C/C++ \u51fd\u6570\u7684\u7b80\u5355\u7684\u5934\u6587\u4ef6\u3002 googlemock \uff1a\u7f16\u5199\u548c\u4f7f\u7528 C++ \u6a21\u62df\u7c7b\u7684\u5e93 HTTP Parser \uff1aC \u7684 http \u8bf7\u6c42 / \u54cd\u5e94\u89e3\u6790\u5668 libcpuid \uff1a\u7528\u4e8e x86 CPU \u68c0\u6d4b\u76d2\u7279\u5f81\u63d0\u53d6\u7684\u5c0f\u578b C \u5e93 libevil \uff1a\u8bb8\u53ef\u8bc1\u7ba1\u7406\u5668 libusb \uff1a\u5141\u8bb8\u79fb\u52a8\u8bbf\u95ee USB \u8bbe\u5907\u7684\u901a\u7528 USB \u5e93 PCRE \uff1a\u6b63\u5219\u8868\u8fbe\u5f0f C \u5e93\uff0c\u7075\u611f\u6765\u81ea\u4e8e Perl \u4e2d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u529f\u80fd\u3002 Remote Call Framework \uff1aC++ \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u6846\u67b6\u3002 Scintilla \uff1a\u5f00\u6e90\u7684\u4ee3\u7801\u7f16\u8f91\u63a7\u4ef6 Serial Communication Library \uff1aC++ \u8bed\u8a00\u7f16\u5199\u7684\u8de8\u5e73\u53f0\uff0c\u4e32\u53e3\u5e93\u3002 SDS \uff1aC \u7684\u7b80\u5355\u52a8\u6001\u5b57\u7b26\u4e32\u5e93 SLDR \uff1a\u8d85\u8f7b\u7684 DNS \u89e3\u6790\u5668 SLRE \uff1a \u8d85\u8f7b\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5e93 Stage \uff1a\u79fb\u52a8\u673a\u5668\u4eba\u6a21\u62df\u5668 VarTypes \uff1aC++/Qt4 \u529f\u80fd\u4e30\u5bcc\uff0c\u9762\u5411\u5bf9\u8c61\u7684\u7ba1\u7406\u53d8\u91cf\u7684\u6846\u67b6\u3002 ZBar \uff1a\u2018\u6761\u5f62\u7801\u626b\u63cf\u5668\u2019\u5e93\uff0c\u53ef\u4ee5\u626b\u63cf\u7167\u7247\uff0c\u56fe\u7247\u548c\u89c6\u9891\u6d41\u4e2d\u7684\u6761\u5f62\u7801\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\u3002 CppVerbalExpressions \uff1a\u6613\u4e8e\u4f7f\u7528\u7684 C++ \u6b63\u5219\u8868\u8fbe\u5f0f QtVerbalExpressions \uff1a\u57fa\u4e8e C++ VerbalExpressions \u5e93\u7684 Qt \u5e93 PHP-CPP \uff1a\u4f7f\u7528 C++ \u6765\u6784\u5efa PHP \u6269\u5c55\u7684\u5e93 Better String \uff1aC \u7684\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u5e93\uff0c\u529f\u80fd\u66f4\u4e30\u5bcc\uff0c\u4f46\u662f\u6ca1\u6709\u7f13\u51b2\u6ea2\u51fa\u95ee\u9898\uff0c\u8fd8\u5305\u542b\u4e86\u4e00\u4e2a C++ \u5305\u88c5\u5668\u3002","title":"33\u3001 \u591a\u9879\u6df7\u6742"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#34","text":"\u7528\u4e8e\u521b\u5efa\u5f00\u53d1\u73af\u5883\u7684\u8f6f\u4ef6 aardio : arrdio \u662f\u4e00\u4e2a\u80fd\u5728 windows \u7cfb\u7edf\u4e2d\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u4e00\u95e8\u8bed\u8a00\uff0c\u4e5f\u662f\u4e00\u4e2a\u8d85\u7ea7\u80f6\u6c34\u5de5\u5177\u3002\u4f60\u53ef\u4ee5\u7528 python\u3001java\u3001C\u3001C#\u3001javastrip\u3001PHP \u7b49\u6570\u503c\u7684\u7f16\u7a0b\u8bed\u8a00\u7ed3\u5408 arrdio \u51e0\u5206\u949f\u5c31\u53ef\u4ee5\u5f00\u53d1\u4e00\u6b3e\u5e26\u754c\u9762\u7684\u684c\u9762\u5e94\u7528\u7a0b\u5e8f\u3002\u4f60\u53ef\u4ee5\u7528 html \u7684\u65b9\u5f0f\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6216\u8005\u7528\u5176\u4ed6\u754c\u9762\u5e93\u6765\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u3002\u4e00\u5207\u90fd\u662f\u4f60\u8bf4\u4e86\u7b97\uff01\u8d85\u5c0f\u7684\u8f6f\u4ef6\u4f53\u79ef\uff0c\u8d85\u5feb\u7684\u521b\u5efa\u901f\u5ea6\uff01 cmder : cmder \u662f\u4e00\u4e2a\u589e\u5f3a\u578b\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u4e0d\u4ec5\u53ef\u4ee5\u4f7f\u7528 windows \u4e0b\u7684\u6240\u6709\u547d\u4ee4\uff0c\u66f4\u723d\u7684\u662f\u53ef\u4ee5\u4f7f\u7528 linux \u7684\u547d\u4ee4, shell \u547d\u4ee4\u3002windows \u4e0b\u7684\u8f6f\u4ef6.","title":"34\u3001 \u8f6f\u4ef6"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#35","text":"C/C++ \u7f16\u8bd1\u5668\u5217\u8868 Clang : \u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1\u7684 GCC \uff1aGNU \u7f16\u8bd1\u5668\u96c6\u5408 Intel C++ Compiler \uff1a\u7531\u82f1\u7279\u5c14\u516c\u53f8\u5f00\u53d1 LLVM \uff1a\u6a21\u5757\u5316\u548c\u53ef\u91cd\u7528\u7f16\u8bd1\u5668\u548c\u5de5\u5177\u94fe\u6280\u672f\u7684\u96c6\u5408 Microsoft Visual C++ \uff1aMSVC\uff0c\u7531\u5fae\u8f6f\u516c\u53f8\u5f00\u53d1 Open WatCom \uff1aWatcom\uff0cC\uff0cC++ \u548c Fortran \u4ea4\u53c9\u7f16\u8bd1\u5668\u548c\u5de5\u5177 TCC \uff1a\u8f7b\u91cf\u7ea7\u7684 C \u8bed\u8a00\u7f16\u8bd1\u5668","title":"35\u3001 \u7f16\u8bd1\u5668"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#36","text":"\u5728\u7ebf C/C++ \u7f16\u8bd1\u5668\u5217\u8868 codepad \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u534f\u4f5c\u5de5\u5177 CodeTwist \uff1a\u4e00\u4e2a\u7b80\u5355\u7684\u5728\u7ebf\u7f16\u8bd1\u5668 / \u89e3\u91ca\u5668\uff0c\u4f60\u53ef\u4ee5\u7c98\u8d34\u7684 C,C++ \u6216\u8005 Java \u4ee3\u7801\uff0c\u5728\u7ebf\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c coliru \uff1a\u5728\u7ebf\u7f16\u8bd1\u5668 / shell\uff0c \u652f\u6301\u5404\u79cd C++ \u7f16\u8bd1\u5668 Compiler Explorer \uff1a\u4ea4\u4e92\u5f0f\u7f16\u8bd1\u5668\uff0c\u53ef\u4ee5\u8fdb\u884c\u6c47\u7f16\u8f93\u51fa CompileOnline \uff1aLinux \u4e0a\u5728\u7ebf\u7f16\u8bd1\u548c\u6267\u884c C++ \u7a0b\u5e8f Ideone \uff1a\u4e00\u4e2a\u5728\u7ebf\u7f16\u8bd1\u5668\u548c\u8c03\u8bd5\u5de5\u5177\uff0c\u5141\u8bb8\u4f60\u5728\u7ebf\u7f16\u8bd1\u6e90\u4ee3\u7801\u5e76\u6267\u884c\uff0c\u652f\u6301 60 \u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u3002","title":"36\u3001 \u5728\u7ebf\u7f16\u8bd1\u5668"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#37","text":"C/C++ \u8c03\u8bd5\u5668\u5217\u8868 Comparison of debuggers \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u8c03\u8bd5\u5668\u5217\u8868 GDB \uff1aGNU \u8c03\u8bd5\u5668 Valgrind \uff1a\u5185\u5b58\u8c03\u8bd5\uff0c\u5185\u5b58\u6cc4\u9732\u68c0\u6d4b\uff0c\u6027\u80fd\u5206\u6790\u5de5\u5177\u3002","title":"37\u3001 \u8c03\u8bd5\u5668"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#38-ide","text":"C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883\u5217\u8868 AppCode \uff1a\u6784\u5efa\u4e0e JetBrains\u2019 IntelliJ IDEA \u5e73\u53f0\u4e0a\u7684\u7528\u4e8e Objective-C\uff0cC,C++\uff0cJava \u548c Java \u5f00\u53d1\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CLion \uff1a\u6765\u81ea JetBrains \u7684\u8de8\u5e73\u53f0\u7684 C/C++ \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 Code::Blocks \uff1a\u514d\u8d39 C\uff0cC++ \u548c Fortran \u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 CodeLite \uff1a\u53e6\u4e00\u4e2a\u8de8\u5e73\u53f0\u7684\u514d\u8d39\u7684 C/C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Dev-C++ \uff1a\u53ef\u79fb\u690d\u7684 C/C++/C++11 \u96c6\u6210\u5f00\u53d1\u73af\u5883 Eclipse CDT \uff1a\u57fa\u4e8e Eclipse \u5e73\u53f0\u7684\u529f\u80fd\u9f50\u5168\u7684 C \u548c C++ \u96c6\u6210\u5f00\u53d1\u73af\u5883 Geany \uff1a\u8f7b\u91cf\u7ea7\u7684\u5feb\u901f\uff0c\u8de8\u5e73\u53f0\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 IBM VisualAge \uff1a\u6765\u81ea IBM \u7684\u5bb6\u5ead\u8ba1\u7b97\u673a\u96c6\u6210\u5f00\u53d1\u73af\u5883\u3002 Irony-mode \uff1a\u7531 libclang \u9a71\u52a8\u7684\u7528\u4e8e Emacs \u7684 C/C++ \u5fae\u6a21\u5f0f KDevelop \uff1a\u514d\u8d39\u5f00\u6e90\u96c6\u6210\u5f00\u53d1\u73af\u5883 Microsoft Visual Studio \uff1a\u6765\u81ea\u5fae\u8f6f\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883 NetBeans \uff1a\u4e3b\u8981\u7528\u4e8e Java \u5f00\u53d1\u7684\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u652f\u6301\u5176\u4ed6\u8bed\u8a00\uff0c\u5c24\u5176\u662f PHP\uff0cC/C++ \u548c HTML5\u3002 Qt Creator \uff1a\u8de8\u5e73\u53f0\u7684 C++\uff0cJavascript \u548c QML \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u4e5f\u662f Qt SDK \u7684\u4e00\u90e8\u5206\u3002 rtags \uff1aC/C++ \u7684\u5ba2\u6237\u7aef\u670d\u52a1\u5668\u7d22\u5f15\uff0c\u7528\u4e8e \u8ddf\u57fa\u4e8e clang \u7684 emacs \u7684\u96c6\u6210 Xcode \uff1a\u7531\u82f9\u679c\u516c\u53f8\u5f00\u53d1 YouCompleteMe \uff1a\u4e00\u4e2a\u7528\u4e8e Vim \u7684\u6839\u636e\u4f60\u6572\u7684\u4ee3\u7801\u5feb\u901f\u6a21\u7cca\u641c\u7d22\u5e76\u8fdb\u884c\u4ee3\u7801\u8865\u5168\u7684\u5f15\u64ce\u3002","title":"38\u3001 \u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#39","text":"Bear \uff1a\u7528\u4e8e\u4e3a clang \u5de5\u5177\u751f\u6210\u7f16\u8bd1\u6570\u636e\u5e93\u7684\u5de5\u5177 Biicode \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u7b80\u5355\u4f9d\u8d56\u7ba1\u7406\u5668\u3002 CMake \uff1a\u8de8\u5e73\u53f0\u7684\u514d\u8d39 \u5f00\u6e90\u8f6f\u4ef6 \u7528\u4e8e\u7ba1\u7406\u8f6f\u4ef6\u4f7f\u7528\u72ec\u7acb\u7f16\u8bd1\u7684\u65b9\u6cd5\u8fdb\u884c\u6784\u5efa\u7684\u8fc7\u7a0b\u3002 CPM \uff1a\u57fa\u4e8e CMake \u548c Git \u7684 C++ \u5305\u7ba1\u7406\u5668 FASTBuild \uff1a\u9ad8\u6027\u80fd\uff0c\u5f00\u6e90\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u652f\u6301\u9ad8\u5ea6\u53ef\u6269\u5c55\u6027\u7684\u7f16\u8bd1\uff0c\u7f13\u51b2\u548c\u7f51\u7edc\u5206\u5e03\u3002 Ninja \uff1a\u4e13\u6ce8\u4e8e\u901f\u5ea6\u7684\u5c0f\u578b\u6784\u5efa\u7cfb\u7edf Scons \uff1a\u4f7f\u7528 Python scipt \u914d\u7f6e\u7684\u8f6f\u4ef6\u6784\u5efa\u5de5\u5177 tundra \uff1a\u9ad8\u6027\u80fd\u7684\u4ee3\u7801\u6784\u5efa\u7cfb\u7edf\uff0c\u751a\u81f3\u5bf9\u4e8e\u975e\u5e38\u5927\u578b\u7684\u8f6f\u4ef6\u9879\u76ee\uff0c\u4e5f\u80fd\u63d0\u4f9b\u6700\u597d\u7684\u589e\u91cf\u6784\u5efa\u6b21\u6570\u3002 tup \uff1a\u57fa\u4e8e\u6587\u4ef6\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u7528\u4e8e\u540e\u53f0\u76d1\u63a7\u53d8\u5316\u7684\u6587\u4ef6\u3002","title":"39\u3001 \u6784\u5efa\u7cfb\u7edf"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#40","text":"\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u7684\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868 Cppcheck \uff1a\u9759\u6001 C/C++ \u4ee3\u7801\u5206\u6790\u5de5\u5177 include-what-you-use \uff1a\u4f7f\u7528 clang \u8fdb\u884c\u4ee3\u7801\u5206\u6790\u7684\u5de5\u5177\uff0c\u53ef\u4ee5 #include \u5728 C \u548c C++ \u6587\u4ef6\u4e2d\u3002 OCLint \uff1a\u7528\u4e8e C\uff0cC++ \u548c Objective-C \u7684\u9759\u6001\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177\uff0c\u7528\u4e8e\u63d0\u9ad8\u8d28\u91cf\uff0c\u51cf\u5c11\u7455\u75b5\u3002 Clang Static Analyzer \uff1a\u67e5\u627e C\uff0cC++ \u548c Objective-C \u7a0b\u5e8f bug \u7684\u6e90\u4ee3\u7801\u5206\u6790\u5de5\u5177 List of tools for static code analysis \uff1a\u6765\u81ea\u7ef4\u57fa\u767e\u79d1\u7684\u9759\u6001\u4ee3\u7801\u5206\u6790\u5de5\u5177\u5217\u8868","title":"40\u3001 \u9759\u6001\u4ee3\u7801\u5206\u6790"},{"location":"collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/#41-linux","text":"picocom : linux \u4e0b\u7684\u4e00\u4e2a\u597d\u7528\u7684\u4e32\u53e3\u7ec8\u7aef. w3m : \u7ec8\u7aef\u6d4f\u89c8\u5668, \u771f\u6b63\u7684\u7a0b\u5e8f\u5458\u5c31\u8be5\u4f7f\u7528\u547d\u4ee4\u884c\u6765\u6d4f\u89c8\u7f51\u9875\u3002 The Fuck : \u5728\u7ec8\u7aef\u4e0b\u662f\u4e0d\u662f\u7ecf\u5e38\u8f93\u9519\u547d\u4ee4\uff0c\u641e\u5f97\u81ea\u5df1\u5fc3\u70e6\u610f\u4e71\uff0cThe Fuck \u662f\u4e00\u6b3e\u4e86\u4e0d\u8d77\u7684\u5de5\u5177\uff0c\u5e2e\u4f60\u5f7b\u5e95\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5f53\u4f60\u8f93\u9519\u547d\u4ee4\u540e\uff0c\u53ea\u8981\u8f93\u5165 fuck \u547d\u4ee4\uff0c\u5b83\u4f1a\u5e2e\u4f60\u81ea\u52a8\u7ea0\u6b63\u9519\u8bef\uff0c\u7cbe\u5f69\u4e4b\u6781\uff01 tldr : tldr \u662f Too long, Don't read \u7684\u7f29\u5199\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u67e5\u770b\u5e38\u7528\u547d\u4ee4\u7684\u4f7f\u7528\u5b9e\u4f8b\uff0c\u6bd4\u5982 tar \u547d\u4ee4\uff0c\u90a3\u540e\u9762\u4e00\u957f\u4e32\u53c2\u6570\u8c01\u8bb0\u5f97\u6e05\u5462\uff1f\u5f53\u7136\uff0clinux \u5927\u4f6c\u9664\u5916\u3002 fzf : fzf \u662f\u4e00\u6b3e\u652f\u6301\u6a21\u7cca\u641c\u7d22\u7684\u4ea4\u4e92\u5f0f\u5de5\u5177\uff0c\u53ef\u4ee5\u7528\u6765\u67e5\u627e\u4efb\u4f55\u5217\u8868\u5185\u5bb9\uff0c\u5305\u62ec\u6587\u4ef6\u3001Git \u5206\u652f\u3001\u8fdb\u7a0b\u7b49\u3002 fd : \u7b80\u5355\u3001\u5feb\u901f\u3001\u597d\u7528\uff0c\u7528\u4e8e\u66ff\u6362 find \u7684\u641c\u7d22\u5de5\u5177\u3002 exa : \u7528\u6765\u66ff\u6362 ls \u547d\u4ee4\u7684\u73b0\u4ee3\u5316\u5de5\u5177\u3002 nnn : nnn (n\u00b3) \u662f\u4e00\u4e2a\u529f\u80fd\u9f50\u5168\u7684\u7ec8\u7aef\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u901f\u5ea6\u975e\u5e38\u5feb\u4e14\u51e0\u4e4e 0 \u914d\u7f6e\uff0c\u4e5f\u662f\u4e00\u4e2a\u975e\u5e38\u4e0d\u9519\u7684\u9009\u62e9\u3002 powerline : \u7ec8\u7aef\u672c\u8eab\u662f\u9ad8\u6548\u7684\uff0c\u4f46\u6709\u65f6\u4e5f\u7565\u663e\u4e4f\u5473\uff0c\u4f7f\u7528 powerline \u53ef\u4ee5\u4e3a\u7ec8\u7aef\u52a0\u4e0a\u5f3a\u5927\u7684 \u72b6\u6001\u680f\uff0c\u6bd4\u5982\u5728 vim \u4e2d\u663e\u793a\u5f53\u524d\u72b6\u6001\uff0c\u5728\u6253\u5f00 git \u76ee\u5f55\u65f6\u663e\u793a\u5f53\u524d\u5206\u652f\u7b49\u7b49\u3002 dtrx \u6709\u4e86\u8fd9\u4e2a\u5de5\u5177\u4f60\u57fa\u672c\u518d\u4e5f\u4e0d\u7528\u8bb0\u4f4f\u5982\u4f55\u5728 linux \u4e0a\u9762\u89e3\u538b\u5404\u79cd\u540e\u7f00\u7684\u6587\u4ef6\u4e86\uff0c\u4ec0\u4e48 tar.gz,tgz,xz,bz2,zip.rar \u7b49\u901a\u901a\u641e\u5b9a\uff0c\u8fd9\u662f\u4e00\u4e2a python \u5de5\u5177. autojump : \u8bb0\u5fc6\u8fdb\u8fc7\u7684\u6587\u4ef6\u5939\uff0c\u4e0b\u6b21\u53ef\u7528 j + \u6587\u4ef6\u5939\u540d \u76f4\u63a5\u8df3\u8fdb\uff0c \u5f88\u65b9\u4fbf. \u8f6f\u4ef6\u5b89\u88c5\u5b8c\u540e\u8f93\u5165\u4e0b\u9762\u547d\u4ee4\u751f\u6548\u7ec8\u7aef (echo \"\"# autojump\\nsource /usr/share/autojump/autojump.bash\">> ~/.bashrc) rebash : \u811a\u672c\u5e93 / \u6846\u67b6\u3002\u7279\u70b9\uff1a\u8fdb\u53e3\uff0c\u4f8b\u5916\uff0c\u6587\u4ef6\u6d4b\u8bd5... shutit : \u57fa\u4e8e bash \u548c pexpect \u7684\u81ea\u52a8\u5316\u6846\u67b6 dispatch : 50 \u884c\u53ef\u79fb\u690d shell \u811a\u672c\u4e2d\u7684\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\u5668\u3002 bashful : \u4e00\u4e2a\u5e93\u7684\u96c6\u5408\uff0c\u4ee5\u7b80\u5316\u7f16\u5199 Bash \u811a\u672c ansi : \u5728\u7eaf bash \u4e2d\u7684 ANSI \u8f6c\u4e49\u7801 - \u66f4\u6539\u6587\u672c\u989c\u8272\uff0c\u5b9a\u4f4d\u5149\u6807\uff0c\u7b49\u7b49 history : \u975e\u5e38\u7b80\u5355\uff0c\u5c24\u5176\u662f\u5728\u4f60\u4f9d\u8d56\u4e8e\u590d\u5236\u4f7f\u7528\u8fc7\u7684\u547d\u4ee4\u65f6\uff0c\u8fd9\u4e2a\u547d\u4ee4\u7279\u522b\u6709\u7528\u3002 sort, uniq\uff1a\u6392\u5e8f\u53bb\u91cd\u3002 awk, grep, sed\uff1a\u6587\u672c\u5904\u7406\u795e\u5668\u3002 jq \uff0c\u547d\u4ee4\u884c\u7684 json \u67e5\u8be2\u548c\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u9002\u5408\u67e5\u770b rest \u63a5\u53e3\u7684\u8f93\u51fa strace\uff0c\u6253\u5370\u51fa\u8fdb\u7a0b\u8c03\u7528\u4e86\u54ea\u4e9b\u7cfb\u7edf\u8c03\u7528\u3002 objdump\uff0c\u6253\u5370\u76ee\u6807\u7801\u548c\u53cd\u6c47\u7f16\u7ed3\u679c transfer.sh : \u53ef\u901a\u8fc7\u7b80\u5355\u7684\u547d\u4ee4\u884c\u6765\u5feb\u901f\u5b8c\u6210\u6587\u4ef6\u5171\u4eab\u64cd\u4f5c stegify : \u4e00\u6b3e\u795e\u5947\u7684\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u80fd\u5c06\u4efb\u610f\u6587\u4ef6\u9690\u85cf\u5230\u56fe\u7247\u91cc\u9762\u3002 Httpie \u4e00\u4e2a HTTP \u547d\u4ee4\u884c\u5ba2\u6237\u7aef\uff0c\u4f7f\u7528\u8d77\u6765\u6bd4 curl \u66f4\u4e3a\u53cb\u597d\uff0c\u5e76\u652f\u6301\u8f93\u51fa JSON\u3001\u8bed\u6cd5\u9ad8\u4eae\u7b49\u7279\u6027\uff0c\u4e3a\u5f00\u53d1\u8005\u5448\u73b0\u66f4\u4e3a\u76f4\u89c2\u7684 UI\uff0c\u4e0e\u670d\u52a1\u5668\u95f4\u7684\u8c03\u8bd5\u4f53\u9a8c\u4e5f\u66f4\u4e3a\u4eba\u6027\u5316\u3002 PM2 : \u7528\u4ee5\u5728\u540e\u53f0\u8fd0\u884c\u548c\u7ba1\u7406\u8fdb\u7a0b SpaceVim \uff1a\u8fd9\u662f\u4e00\u4e2a vim \u63d2\u4ef6\uff0c\u4f7f\u4f60\u7684 Vim \u53d8\u6210\u5e26\u4ee3\u7801\u81ea\u52a8\u8865\u5168\u7b49\u529f\u80fd\u7684\u66f4\u52a0\u5f3a\u5927\u7684\u4ee3\u7801\u7f16\u8f91\u5668\uff01 axel\uff1a\u591a\u7ebf\u7a0b\u65ad\u70b9\u4e0b\u8f7d\u5de5\u5177\uff0c\u975e\u5e38\u597d\u7528\u3002\u4f8b\u5982\u4e0b\u56fe\u4e2d\u8fd9\u6837\uff0c\u6307\u5b9a\u4e86 8 \u4e2a\u7ebf\u7a0b\u540c\u65f6\u4e0b\u8f7d\u3002 nmon\uff1a\u5b83\u80fd\u591f\u5e2e\u4f60\u8fdb\u884c\u7535\u8111\u7684\u6027\u80fd\u76d1\u63a7\uff0c\u5305\u62ec CPU\uff0c\u5185\u5b58\uff0c\u78c1\u76d8 IO\uff0c\u7f51\u7edc IO\uff0c\u5e76\u4e14\u754c\u9762\u5f88\u70ab\u9177\uff0c\u662f\u4e0d\u662f\u5f88\u50cf\u9ed1\u5ba2\uff0c\u5feb\u53bb\u8bd5\u8bd5\u5427 nmon for Linux | Main Alex \uff1a\u5b83\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u5f88\u6709\u7528\u7684\u5c0f\u5de5\u5177\u3002\u9002\u7528\u4e8e\u660e\u6587\u6587\u672c\u6216\u8005\u683c\u5f0f\u4e3a Markdown \u6216 HTML \u7684\u6587\u6863\u3002Alex \u4f1a\u5bf9 \u201c\u6027\u522b\u504f\u597d\u3001\u6781\u7aef\u4e3b\u4e49\u3001\u79cd\u65cf\u76f8\u5173\u3001\u5b97\u6559\uff0c\u6216\u8005\u6587\u7ae0\u4e2d\u5176\u4ed6\u4e0d\u5e73\u7b49\u7684\u63aa\u8f9e\u201d \u4ea7\u751f\u8b66\u544a\u3002\u5982\u679c\u4f60\u60f3\u8981\u8bd5\u8bd5\u770b Alex\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u5728\u7ebf demo \uff1b GNU Aspell \uff1a\u5b83\u80fd\u591f\u4ea4\u4e92\u5f0f\u5730\u68c0\u6d4b\u6587\u672c\u6587\u6863\uff0c\u80fd\u9ad8\u4eae\u663e\u793a\u62fc\u5199\u9519\u8bef\uff0c\u8fd8\u80fd\u5728\u62fc\u5199\u9519\u8bef\u7684\u4e0a\u65b9\u63d0\u4f9b\u6b63\u786e\u7684\u62fc\u5199\u5efa\u8bae\u3002Aspell \u5728\u8fdb\u884c\u62fc\u5199\u68c0\u67e5\u7684\u65f6\u5019\uff0c\u540c\u6837\u80fd\u591f\u5ffd\u7565\u8bb8\u591a\u8bed\u6cd5\u6807\u8bb0\uff1b Proselint \uff1a\u5b83\u662f\u4e00\u6b3e\u5168\u80fd\u7684\u5b9e\u65f6\u68c0\u67e5\u5de5\u5177\u3002\u5b83\u4f1a\u627e\u51fa\u884c\u8bdd\u3001\u5927\u8bdd\u3001\u4e0d\u6b63\u786e\u65e5\u671f\u548c\u65f6\u95f4\u683c\u5f0f\u3001\u6ee5\u7528\u7684\u672f\u8bed \u7b49\u7b49 \u3002\u5b83\u4e5f\u5f88\u5bb9\u6613\u8fd0\u884c\u5e76\u5ffd\u7565\u6587\u672c\u4e2d\u7684\u6807\u8bb0\uff1b WordGrinder \uff1a\u5b83\u662f\u4e00\u6b3e\u4f7f\u7528\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u62e5\u6709\u8db3\u591f\u7684\u7f16\u5199\u548c\u53d1\u5e03\u529f\u80fd\u7684\u6587\u5b57\u7f16\u8f91\u5668\u3002\u5b83\u652f\u6301\u57fa\u672c\u7684\u683c\u5f0f\u548c\u6837\u5f0f\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u5c06\u4f60\u7684\u6587\u5b57\u4ee5 Markdown\u3001ODT\u3001LaTeX \u6216\u8005 HTML \u7b49\u683c\u5f0f\u5bfc\u51fa\uff1b cloc : \u7528\u6765\u7edf\u8ba1\u4ee3\u7801\u884c\u6570\uff0c\u7edf\u8ba1\u7ed3\u679c\u6bd4\u8f83\u5206\u7c7b\u6bd4\u8f83\u8be6\u7ec6\uff0c\u652f\u6301\u5927\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u3002 tldr : \u5982\u679c\u4f60\u7ecf\u5e38\u4e0d\u60f3\u8be6\u8bfb man \u6587\u6863\uff0c\u90a3\u4e48\u4f60\u5e94\u8be5\u8bd5\u8bd5\u8fd9\u4e2a\u5c0f\u5de5\u5177\u3002 cppman \uff1aC++ 98/11/14 \u624b\u518c\u67e5\u8be2 for Linux/MacOS icdiff \uff1a\u5206\u5c4f\u663e\u793a diff mcedit \uff1a\u7ec8\u7aef\u4e0b\u9762\u7684 NotePad++ owncloud \uff1aDropBox \u7684\u5f00\u6e90\u66ff\u4ee3\u54c1\uff0c\u63d0\u4f9b\u547d\u4ee4\u884c\u5ba2\u6237\u7aef owncloudcmd pm \uff1a\u5728 bash / zsh \u4e2d\u8fc5\u901f\u5207\u6362\u9879\u76ee\u76ee\u5f55 ncdu \uff1a\u53ef\u89c6\u5316\u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f, \u4f60\u53d1\u73b0\u6709\u4eba\u628a /home \u7a7a\u95f4\u6491\u7206\u4e86\uff0c\u5f71\u54cd\u4e86\u5927\u5bb6\u7684\u5de5\u4f5c\uff0c\u4f60\u6124\u6012\u4e86\u4e00\u5c42\u5c42\u7684 du\uff0c\u4e00\u5c42\u5c42\u7684 cd\uff0c\u6574\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u5228\u5783\u573e\u5806\u4e00\u6837\u7684\u6076\u5fc3\uff0c\u540e\u6765\u53d1\u73b0\u4e86 ncdu \u8fd9\u4e2a\u57fa\u4e8e ncurses \u7684\u7a7a\u95f4\u5206\u6790\u7a0b\u5e8f\uff1a glances \uff1a\u66f4\u5f3a\u5927\u7684 htop / top \u4ee3\u66ff\u8005 htop \u4ee3\u66ff top\uff0cglances \u4ee3\u66ff htop\uff1a mc \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8 ranger \uff1a\u5185\u5bb9\u6d4f\u89c8 / \u9884\u89c8\u53e6\u4e00\u6b3e\u5185\u5bb9\u9884\u89c8\u8f6f\u4ef6\uff0c\u754c\u9762\u6ca1\u6709 mc \u90a3\u4e48\u6f02\u4eae\uff0c\u6807\u8bb0\u62f7\u8d1d\u4e5f\u6ca1\u5b83\u5f3a\uff0c\u4f46\u662f\u9884\u89c8\u529f\u80fd\u505a\u7684\u5f88\u4e0d\u9519\uff0c\u5982\u679c\u4f60\u4e60\u60ef vim \u952e\u4f4d\u7684\u8bdd\uff0c\u4f60\u4f1a\u53d1\u73b0 ranger \u6709\u4e9b\u5730\u65b9\u6bd4 mc \u505a\u7684\u597d\u4e0d\u5c11\uff1a dstat \uff1avmstat \u4ee3\u66ff\u8005, \u53ef\u80fd\u4e0d\u5c11\u4eba\u90fd\u7528\u8fc7\uff0c\u4f46\u662f\u672c\u95ee\u9898\u4e0b\u597d\u50cf\u6ca1\u4eba\u63d0\uff1f cheat \uff1a\u547d\u4ee4\u884c\u7b14\u8bb0, \u5c31\u662f\u5404\u79cd cheat sheet \uff0c\u6bd4\u5982\u7ecf\u5e38\u641e\u5fd8 redis \u547d\u4ee4\u7684\u8bdd\uff0c\u4f60\u53ef\u4ee5\u65b0\u5efa ~/.cheat/redis \u8fd9\u4e2a\u6587\u4ef6\uff0c\u5199\u4e00\u4e9b\u5185\u5bb9\uff0c\u6bd4\u5982\uff1a multitail \uff1a\u591a\u91cd tail, \u901a\u5e38\u4f60\u4e0d\u6b62\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\u8981\u76d1\u63a7\uff0c\u600e\u4e48\u529e\uff1f\u7ec8\u7aef\u8f6f\u4ef6\u91cc\u5f00\u591a\u4e2a tab \u592a\u5360\u5730\u65b9\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u8fd9\u4e2a\u5de5\u5177\uff1a bro \uff1a\u4ee5\u7528\u4f8b\u4e3a\u4e3b\u7684\u5e2e\u52a9\u7cfb\u7edf, \u7c7b\u4f3c\u4e8e man, \u4f46\u662f\u5bf9\u65b0\u624b\u53cb\u597d. http.server : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u4f46\u6ca1\u6709\u4e0a\u4f20\u529f\u80fd. SimpleHTTPServerWithUpload.py : python \u4e2d\u7684\u4e00\u4e2a\u672c\u5730\u5c0f\u578b http \u670d\u52a1\u5668, \u53ef\u4ee5\u7528\u4e8e\u5c40\u57df\u7f51\u4f20\u8f93\u6587\u4ef6. \u6709\u4e0a\u4f20\u529f\u80fd. \u6709 python2 \u548c python3 \u4e24\u4e2a\u7248\u672c. \u53c2\u8003\u8fde\u63a5: \u5e72\u8d27 | C++ \u8d44\u6e90\u3001\u6846\u67b6\u5927\u5168\uff0c\u63a8\u8350\u6536\u85cf https://www.zhihu.com/question/59227720/answer/286665684 https://www.zhihu.com/question/59227720/answer/578875058 https://www.zhihu.com/question/59227720/answer/163933473 https://www.zhihu.com/question/59227720/answer/163966430","title":"41\u3001 linux \u5b9e\u7528\u5de5\u5177"},{"location":"cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/","text":"\u597d\u4e66\u63a8\u8350","title":"\u597d\u4e66\u63a8\u8350"},{"location":"cs/%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/#_1","text":"","title":"\u597d\u4e66\u63a8\u8350"},{"location":"cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/","text":"\u5fc5\u5b66\u5de5\u5177","title":"\u5fc5\u5b66\u5de5\u5177"},{"location":"cs/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/#_1","text":"","title":"\u5fc5\u5b66\u5de5\u5177"},{"location":"cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/","text":"\u6570\u5b66\u57fa\u7840","title":"\u6570\u5b66\u57fa\u7840"},{"location":"cs/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/#_1","text":"","title":"\u6570\u5b66\u57fa\u7840"},{"location":"cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/","text":"\u6570\u5b66\u8fdb\u9636","title":"\u6570\u5b66\u8fdb\u9636"},{"location":"cs/%E6%95%B0%E5%AD%A6%E8%BF%9B%E9%98%B6/#_1","text":"","title":"\u6570\u5b66\u8fdb\u9636"},{"location":"cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/","text":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5","title":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5"},{"location":"cs/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/#_1","text":"","title":"\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5"},{"location":"cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/","text":"\u7535\u5b50\u57fa\u7840","title":"\u7535\u5b50\u57fa\u7840"},{"location":"cs/%E7%94%B5%E5%AD%90%E5%9F%BA%E7%A1%80/#_1","text":"","title":"\u7535\u5b50\u57fa\u7840"},{"location":"cs/%E7%9B%AE%E5%BD%95/","text":"\u76ee\u5f55 \u6570\u636e\u6765\u6e90 csdiy","title":"\u76ee\u5f55"},{"location":"cs/%E7%9B%AE%E5%BD%95/#_1","text":"\u6570\u636e\u6765\u6e90 csdiy","title":"\u76ee\u5f55"},{"location":"cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/","text":"\u7f16\u7a0b\u5165\u95e8","title":"\u7f16\u7a0b\u5165\u95e8"},{"location":"cs/%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/#_1","text":"","title":"\u7f16\u7a0b\u5165\u95e8"},{"location":"dev-guide/","text":"Developer Guide Extending MkDocs The MkDocs Developer Guide provides documentation for developers of third party themes and plugins. Please see the Contributing Guide for information on contributing to MkDocs itself. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Themes Translations Plugins API Reference","title":"README"},{"location":"dev-guide/#developer-guide","text":"Extending MkDocs The MkDocs Developer Guide provides documentation for developers of third party themes and plugins. Please see the Contributing Guide for information on contributing to MkDocs itself. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Themes Translations Plugins API Reference","title":"Developer Guide"},{"location":"dev-guide/api/","text":"API reference Note The main entry point to the API is through Events that are received by plugins. These events' descriptions link back to this page. ::: mkdocs.structure.files.Files options: show_root_heading: true ::: mkdocs.structure.files.File options: show_root_heading: true ::: mkdocs.config.base.Config options: show_root_heading: true ::: mkdocs.livereload.LiveReloadServer options: show_root_heading: true","title":"API"},{"location":"dev-guide/api/#api-reference","text":"Note The main entry point to the API is through Events that are received by plugins. These events' descriptions link back to this page. ::: mkdocs.structure.files.Files options: show_root_heading: true ::: mkdocs.structure.files.File options: show_root_heading: true ::: mkdocs.config.base.Config options: show_root_heading: true ::: mkdocs.livereload.LiveReloadServer options: show_root_heading: true","title":"API reference"},{"location":"dev-guide/plugins/","text":"MkDocs Plugins A Guide to installing, using and creating MkDocs Plugins Installing Plugins Before a plugin can be used, it must be installed on the system. If you are using a plugin which comes with MkDocs, then it was installed when you installed MkDocs. However, to install third party plugins, you need to determine the appropriate package name and install it using pip : pip install mkdocs-foo-plugin Once a plugin has been successfully installed, it is ready to use. It just needs to be enabled in the configuration file. The Best-of-MkDocs page has a large list of plugins that you can install and use. Using Plugins The plugins configuration option should contain a list of plugins to use when building the site. Each \"plugin\" must be a string name assigned to the plugin (see the documentation for a given plugin to determine its \"name\"). A plugin listed here must already be installed . plugins: - search Some plugins may provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given plugin supports. Note that a colon ( : ) must follow the plugin name and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single plugin, each option must be defined on a separate line. plugins: - search: lang: en foo: bar For information regarding the configuration options available for a given plugin, see that plugin's documentation. For a list of default plugins and how to override them, see the configuration documentation. Developing Plugins Like MkDocs, plugins must be written in Python. It is generally expected that each plugin would be distributed as a separate Python module, although it is possible to define multiple plugins in the same module. At a minimum, a MkDocs Plugin must consist of a BasePlugin subclass and an entry point which points to it. BasePlugin A subclass of mkdocs.plugins.BasePlugin should define the behavior of the plugin. The class generally consists of actions to perform on specific events in the build process as well as a configuration scheme for the plugin. All BasePlugin subclasses contain the following attributes: config_scheme A tuple of configuration validation instances. Each item must consist of a two item tuple in which the first item is the string name of the configuration option and the second item is an instance of mkdocs.config.config_options.BaseConfigOption or any of its subclasses. For example, the following config_scheme defines three configuration options: foo , which accepts a string; bar , which accepts an integer; and baz , which accepts a boolean value. class MyPlugin(mkdocs.plugins.BasePlugin): config_scheme = ( ('foo', mkdocs.config.config_options.Type(str, default='a default value')), ('bar', mkdocs.config.config_options.Type(int, default=0)), ('baz', mkdocs.config.config_options.Type(bool, default=True)) ) New in version 1.4 Subclassing Config to specify the config schema To get type safety benefits, if you're targeting only MkDocs 1.4+, define the config schema as a class instead: class MyPluginConfig(mkdocs.config.base.Config): foo = mkdocs.config.config_options.Type(str, default='a default value') bar = mkdocs.config.config_options.Type(int, default=0) baz = mkdocs.config.config_options.Type(bool, default=True) class MyPlugin(mkdocs.plugins.BasePlugin[MyPluginConfig]): ... Examples of config definitions Example from mkdocs.config import base, config_options as c class _ValidationOptions(base.Config): enable = c.Type(bool, default=True) verbose = c.Type(bool, default=False) skip_checks = c.ListOfItems(c.Choice(('foo', 'bar', 'baz')), default=[]) class MyPluginConfig(base.Config): definition_file = c.File(exists=True) # required checksum_file = c.Optional(c.File(exists=True)) # can be None but must exist if specified validation = c.SubConfig(_ValidationOptions) From the user's point of view SubConfig is similar to Type(dict) , it's just that it also retains full ability for validation: you define all valid keys and what each value should adhere to. And ListOfItems is similar to Type(list) , but again, we define the constraint that each value must adhere to. This accepts a config as follows: my_plugin: definition_file: configs/test.ini # relative to mkdocs.yml validation: enable: !ENV [CI, false] verbose: true skip_checks: - foo - baz Example import numbers from mkdocs.config import base, config_options as c class _Rectangle(base.Config): width = c.Type(numbers.Real) # required height = c.Type(numbers.Real) # required class MyPluginConfig(base.Config): add_rectangles = c.ListOfItems(c.SubConfig(_Rectangle)) # required In this example we define a list of complex items, and that's achieved by passing a concrete SubConfig to ListOfItems . This accepts a config as follows: my_plugin: add_rectangles: - width: 5 height: 7 - width: 12 height: 2 When the user's configuration is loaded, the above scheme will be used to validate the configuration and fill in any defaults for settings not provided by the user. The validation classes may be any of the classes provided in mkdocs.config.config_options or a third party subclass defined in the plugin. Any settings provided by the user which fail validation or are not defined in the config_scheme will raise a mkdocs.config.base.ValidationError . config A dictionary of configuration options for the plugin, which is populated by the load_config method after configuration validation has completed. Use this attribute to access options provided by the user. def on_pre_build(self, config, **kwargs): if self.config['baz']: # implement \"baz\" functionality here... New in version 1.4 Safe attribute-based access To get type safety benefits, if you're targeting only MkDocs 1.4+, access options as attributes instead: def on_pre_build(self, config, **kwargs): if self.config.baz: print(self.config.bar ** 2) # OK, `int ** 2` is valid. All BasePlugin subclasses contain the following method(s): load_config(options) Loads configuration from a dictionary of options. Returns a tuple of (errors, warnings) . This method is called by MkDocs during configuration validation and should not need to be called by the plugin. on_
() Optional methods which define the behavior for specific events . The plugin should define its behavior within these methods. Replace with the actual name of the event. For example, the pre_build event would be defined in the on_pre_build method. Most events accept one positional argument and various keyword arguments. It is generally expected that the positional argument would be modified (or replaced) by the plugin and returned. If nothing is returned (the method returns None ), then the original, unmodified object is used. The keyword arguments are simply provided to give context and/or supply data which may be used to determine how the positional argument should be modified. It is good practice to accept keyword arguments as **kwargs . In the event that additional keywords are provided to an event in a future version of MkDocs, there will be no need to alter your plugin. For example, the following event would add an additional static_template to the theme config: class MyPlugin(BasePlugin): def on_config(self, config, **kwargs): config['theme'].static_templates.add('my_template.html') return config New in version 1.4 To get type safety benefits, if you're targeting only MkDocs 1.4+, access config options as attributes instead: def on_config(self, config: MkDocsConfig): config.theme.static_templates.add('my_template.html') return config Events There are three kinds of events: Global Events , Page Events and Template Events . See a diagram with relations between all the plugin events The events themselves are shown in yellow, with their parameters. Arrows show the flow of arguments and outputs of each event. Sometimes they're omitted. The events are chronologically ordered from top to bottom. Dotted lines appear at splits from global events to per-page events. Click the events' titles to jump to their description. MkDocs cluster_on_startup on_startup cluster_build build cluster_on_config on_config cluster_on_pre_build on_pre_build cluster_on_files on_files cluster_on_nav on_nav cluster_populate_page populate_page cluster_on_pre_page on_pre_page cluster_on_page_read_source on_page_read_source cluster_on_page_markdown on_page_markdown cluster_on_page_content on_page_content cluster_on_env on_env cluster_populate_page_2 populate_page cluster_populate_page_3 populate_page cluster_build_page build_page cluster_on_page_context on_page_context cluster_on_post_page on_post_page cluster_build_page_2 build_page cluster_build_page_3 build_page cluster_on_post_build on_post_build cluster_on_serve on_serve cluster_on_shutdown on_shutdown on_startup command dirty load_config load_config on_config config on_pre_build config on_config:s->on_pre_build:n get_files get_files on_config:s->get_files on_files files config on_nav nav config files on_files:s->on_nav:n get_nav get_nav on_files:s->get_nav render_p render pages_point_a on_nav:s->pages_point_a get_context get_context on_nav:s->get_context load_config->on_config:n get_files->on_files:n get_nav->on_nav:n on_pre_page page config files on_page_read_source page config on_pre_page:s->on_page_read_source:n on_page_markdown markdown page config files on_page_read_source:s->on_page_markdown:n on_page_markdown:s->render_p on_page_content html page config files pages_point_b on_page_content:s->pages_point_b on_env env config files render_p->on_page_content:n pages_point_a->on_pre_page:n pages_point_a->render_p placeholder_cluster_populate_page_2 ... pages_point_a->placeholder_cluster_populate_page_2:n placeholder_cluster_populate_page_3 ... pages_point_a->placeholder_cluster_populate_page_3:n placeholder_cluster_populate_page_2:s->pages_point_b pages_point_b->on_env:n pages_point_c pages_point_b->pages_point_c placeholder_cluster_populate_page_3:s->pages_point_b on_env:s->get_context on_page_context context page config nav pages_point_c->on_page_context:n placeholder_cluster_build_page_2 ... pages_point_c->placeholder_cluster_build_page_2:n placeholder_cluster_build_page_3 ... pages_point_c->placeholder_cluster_build_page_3:n render render on_page_context:s->render on_post_page output page config write_file write_file on_post_page:s->write_file get_context->on_page_context:n render->on_post_page:n get_template get_template get_template->render on_post_build config on_serve server config on_shutdown One-time Events One-time events run once per mkdocs invocation. The only case where these tangibly differ from global events is for mkdocs serve : global events, unlike these, will run multiple times -- once per build . on_startup ::: mkdocs.plugins.BasePlugin.on_startup options: show_root_heading: false show_root_toc_entry: false on_shutdown ::: mkdocs.plugins.BasePlugin.on_shutdown options: show_root_heading: false show_root_toc_entry: false on_serve ::: mkdocs.plugins.BasePlugin.on_serve options: show_root_heading: false show_root_toc_entry: false Global Events Global events are called once per build at either the beginning or end of the build process. Any changes made in these events will have a global effect on the entire site. on_config ::: mkdocs.plugins.BasePlugin.on_config options: show_root_heading: false show_root_toc_entry: false on_pre_build ::: mkdocs.plugins.BasePlugin.on_pre_build options: show_root_heading: false show_root_toc_entry: false on_files ::: mkdocs.plugins.BasePlugin.on_files options: show_root_heading: false show_root_toc_entry: false on_nav ::: mkdocs.plugins.BasePlugin.on_nav options: show_root_heading: false show_root_toc_entry: false on_env ::: mkdocs.plugins.BasePlugin.on_env options: show_root_heading: false show_root_toc_entry: false on_post_build ::: mkdocs.plugins.BasePlugin.on_post_build options: show_root_heading: false show_root_toc_entry: false on_build_error ::: mkdocs.plugins.BasePlugin.on_build_error options: show_root_heading: false show_root_toc_entry: false Template Events Template events are called once for each non-page template. Each template event will be called for each template defined in the extra_templates config setting as well as any static_templates defined in the theme. All template events are called after the env event and before any page events . on_pre_template ::: mkdocs.plugins.BasePlugin.on_pre_template options: show_root_heading: false show_root_toc_entry: false on_template_context ::: mkdocs.plugins.BasePlugin.on_template_context options: show_root_heading: false show_root_toc_entry: false on_post_template ::: mkdocs.plugins.BasePlugin.on_post_template options: show_root_heading: false show_root_toc_entry: false Page Events Page events are called once for each Markdown page included in the site. All page events are called after the post_template event and before the post_build event. on_pre_page ::: mkdocs.plugins.BasePlugin.on_pre_page options: show_root_heading: false show_root_toc_entry: false on_page_read_source ::: mkdocs.plugins.BasePlugin.on_page_read_source options: show_root_heading: false show_root_toc_entry: false on_page_markdown ::: mkdocs.plugins.BasePlugin.on_page_markdown options: show_root_heading: false show_root_toc_entry: false on_page_content ::: mkdocs.plugins.BasePlugin.on_page_content options: show_root_heading: false show_root_toc_entry: false on_page_context ::: mkdocs.plugins.BasePlugin.on_page_context options: show_root_heading: false show_root_toc_entry: false on_post_page ::: mkdocs.plugins.BasePlugin.on_post_page options: show_root_heading: false show_root_toc_entry: false Event Priorities For each event type, corresponding methods of plugins are called in the order that the plugins appear in the plugins config . Since MkDocs 1.4, plugins can choose to set a priority value for their events. Events with higher priority are called first. Events without a chosen priority get a default of 0. Events that have the same priority are ordered as they appear in the config. ::: mkdocs.plugins.event_priority Handling Errors MkDocs defines four error types: ::: mkdocs.exceptions.MkDocsException ::: mkdocs.exceptions.ConfigurationError ::: mkdocs.exceptions.BuildError ::: mkdocs.exceptions.PluginError Unexpected and uncaught exceptions will interrupt the build process and produce typical Python tracebacks, which are useful for debugging your code. However, users generally find tracebacks overwhelming and often miss the helpful error message. Therefore, MkDocs will catch any of the errors listed above, retrieve the error message, and exit immediately with only the helpful message displayed to the user. Therefore, you might want to catch any exceptions within your plugin and raise a PluginError , passing in your own custom-crafted message, so that the build process is aborted with a helpful message. The on_build_error event will be triggered for any exception. For example: from mkdocs.exceptions import PluginError from mkdocs.plugins import BasePlugin class MyPlugin(BasePlugin): def on_post_page(self, output, page, config, **kwargs): try: # some code that could throw a KeyError ... except KeyError as error: raise PluginError(str(error)) def on_build_error(self, error, **kwargs): # some code to clean things up ... Entry Point Plugins need to be packaged as Python libraries (distributed on PyPI separate from MkDocs) and each must register as a Plugin via a setuptools entry_points . Add the following to your setup.py script: entry_points={ 'mkdocs.plugins': [ 'pluginname = path.to.some_plugin:SomePluginClass', ] } The pluginname would be the name used by users (in the config file) and path.to.some_plugin:SomePluginClass would be the importable plugin itself ( from path.to.some_plugin import SomePluginClass ) where SomePluginClass is a subclass of BasePlugin which defines the plugin behavior. Naturally, multiple Plugin classes could exist in the same module. Simply define each as a separate entry point. entry_points={ 'mkdocs.plugins': [ 'featureA = path.to.my_plugins:PluginA', 'featureB = path.to.my_plugins:PluginB' ] } Note that registering a plugin does not activate it. The user still needs to tell MkDocs to use it via the config.","title":"Plugins"},{"location":"dev-guide/plugins/#mkdocs-plugins","text":"A Guide to installing, using and creating MkDocs Plugins","title":"MkDocs Plugins"},{"location":"dev-guide/plugins/#installing-plugins","text":"Before a plugin can be used, it must be installed on the system. If you are using a plugin which comes with MkDocs, then it was installed when you installed MkDocs. However, to install third party plugins, you need to determine the appropriate package name and install it using pip : pip install mkdocs-foo-plugin Once a plugin has been successfully installed, it is ready to use. It just needs to be enabled in the configuration file. The Best-of-MkDocs page has a large list of plugins that you can install and use.","title":"Installing Plugins"},{"location":"dev-guide/plugins/#using-plugins","text":"The plugins configuration option should contain a list of plugins to use when building the site. Each \"plugin\" must be a string name assigned to the plugin (see the documentation for a given plugin to determine its \"name\"). A plugin listed here must already be installed . plugins: - search Some plugins may provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given plugin supports. Note that a colon ( : ) must follow the plugin name and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single plugin, each option must be defined on a separate line. plugins: - search: lang: en foo: bar For information regarding the configuration options available for a given plugin, see that plugin's documentation. For a list of default plugins and how to override them, see the configuration documentation.","title":"Using Plugins"},{"location":"dev-guide/plugins/#developing-plugins","text":"Like MkDocs, plugins must be written in Python. It is generally expected that each plugin would be distributed as a separate Python module, although it is possible to define multiple plugins in the same module. At a minimum, a MkDocs Plugin must consist of a BasePlugin subclass and an entry point which points to it.","title":"Developing Plugins"},{"location":"dev-guide/plugins/#baseplugin","text":"A subclass of mkdocs.plugins.BasePlugin should define the behavior of the plugin. The class generally consists of actions to perform on specific events in the build process as well as a configuration scheme for the plugin. All BasePlugin subclasses contain the following attributes:","title":"BasePlugin"},{"location":"dev-guide/plugins/#config_scheme","text":"A tuple of configuration validation instances. Each item must consist of a two item tuple in which the first item is the string name of the configuration option and the second item is an instance of mkdocs.config.config_options.BaseConfigOption or any of its subclasses. For example, the following config_scheme defines three configuration options: foo , which accepts a string; bar , which accepts an integer; and baz , which accepts a boolean value. class MyPlugin(mkdocs.plugins.BasePlugin): config_scheme = ( ('foo', mkdocs.config.config_options.Type(str, default='a default value')), ('bar', mkdocs.config.config_options.Type(int, default=0)), ('baz', mkdocs.config.config_options.Type(bool, default=True)) ) New in version 1.4","title":"config_scheme"},{"location":"dev-guide/plugins/#subclassing-config-to-specify-the-config-schema","text":"To get type safety benefits, if you're targeting only MkDocs 1.4+, define the config schema as a class instead: class MyPluginConfig(mkdocs.config.base.Config): foo = mkdocs.config.config_options.Type(str, default='a default value') bar = mkdocs.config.config_options.Type(int, default=0) baz = mkdocs.config.config_options.Type(bool, default=True) class MyPlugin(mkdocs.plugins.BasePlugin[MyPluginConfig]): ...","title":"Subclassing Config to specify the config schema"},{"location":"dev-guide/plugins/#examples-of-config-definitions","text":"Example from mkdocs.config import base, config_options as c class _ValidationOptions(base.Config): enable = c.Type(bool, default=True) verbose = c.Type(bool, default=False) skip_checks = c.ListOfItems(c.Choice(('foo', 'bar', 'baz')), default=[]) class MyPluginConfig(base.Config): definition_file = c.File(exists=True) # required checksum_file = c.Optional(c.File(exists=True)) # can be None but must exist if specified validation = c.SubConfig(_ValidationOptions) From the user's point of view SubConfig is similar to Type(dict) , it's just that it also retains full ability for validation: you define all valid keys and what each value should adhere to. And ListOfItems is similar to Type(list) , but again, we define the constraint that each value must adhere to. This accepts a config as follows: my_plugin: definition_file: configs/test.ini # relative to mkdocs.yml validation: enable: !ENV [CI, false] verbose: true skip_checks: - foo - baz Example import numbers from mkdocs.config import base, config_options as c class _Rectangle(base.Config): width = c.Type(numbers.Real) # required height = c.Type(numbers.Real) # required class MyPluginConfig(base.Config): add_rectangles = c.ListOfItems(c.SubConfig(_Rectangle)) # required In this example we define a list of complex items, and that's achieved by passing a concrete SubConfig to ListOfItems . This accepts a config as follows: my_plugin: add_rectangles: - width: 5 height: 7 - width: 12 height: 2 When the user's configuration is loaded, the above scheme will be used to validate the configuration and fill in any defaults for settings not provided by the user. The validation classes may be any of the classes provided in mkdocs.config.config_options or a third party subclass defined in the plugin. Any settings provided by the user which fail validation or are not defined in the config_scheme will raise a mkdocs.config.base.ValidationError .","title":"Examples of config definitions"},{"location":"dev-guide/plugins/#config","text":"A dictionary of configuration options for the plugin, which is populated by the load_config method after configuration validation has completed. Use this attribute to access options provided by the user. def on_pre_build(self, config, **kwargs): if self.config['baz']: # implement \"baz\" functionality here... New in version 1.4","title":"config"},{"location":"dev-guide/plugins/#safe-attribute-based-access","text":"To get type safety benefits, if you're targeting only MkDocs 1.4+, access options as attributes instead: def on_pre_build(self, config, **kwargs): if self.config.baz: print(self.config.bar ** 2) # OK, `int ** 2` is valid. All BasePlugin subclasses contain the following method(s):","title":"Safe attribute-based access"},{"location":"dev-guide/plugins/#load_configoptions","text":"Loads configuration from a dictionary of options. Returns a tuple of (errors, warnings) . This method is called by MkDocs during configuration validation and should not need to be called by the plugin.","title":"load_config(options)"},{"location":"dev-guide/plugins/#on_event_name","text":"Optional methods which define the behavior for specific events . The plugin should define its behavior within these methods. Replace with the actual name of the event. For example, the pre_build event would be defined in the on_pre_build method. Most events accept one positional argument and various keyword arguments. It is generally expected that the positional argument would be modified (or replaced) by the plugin and returned. If nothing is returned (the method returns None ), then the original, unmodified object is used. The keyword arguments are simply provided to give context and/or supply data which may be used to determine how the positional argument should be modified. It is good practice to accept keyword arguments as **kwargs . In the event that additional keywords are provided to an event in a future version of MkDocs, there will be no need to alter your plugin. For example, the following event would add an additional static_template to the theme config: class MyPlugin(BasePlugin): def on_config(self, config, **kwargs): config['theme'].static_templates.add('my_template.html') return config New in version 1.4 To get type safety benefits, if you're targeting only MkDocs 1.4+, access config options as attributes instead: def on_config(self, config: MkDocsConfig): config.theme.static_templates.add('my_template.html') return config","title":"on_<event_name>()"},{"location":"dev-guide/plugins/#events","text":"There are three kinds of events: Global Events , Page Events and Template Events . See a diagram with relations between all the plugin events The events themselves are shown in yellow, with their parameters. Arrows show the flow of arguments and outputs of each event. Sometimes they're omitted. The events are chronologically ordered from top to bottom. Dotted lines appear at splits from global events to per-page events. Click the events' titles to jump to their description. MkDocs cluster_on_startup on_startup cluster_build build cluster_on_config on_config cluster_on_pre_build on_pre_build cluster_on_files on_files cluster_on_nav on_nav cluster_populate_page populate_page cluster_on_pre_page on_pre_page cluster_on_page_read_source on_page_read_source cluster_on_page_markdown on_page_markdown cluster_on_page_content on_page_content cluster_on_env on_env cluster_populate_page_2 populate_page cluster_populate_page_3 populate_page cluster_build_page build_page cluster_on_page_context on_page_context cluster_on_post_page on_post_page cluster_build_page_2 build_page cluster_build_page_3 build_page cluster_on_post_build on_post_build cluster_on_serve on_serve cluster_on_shutdown on_shutdown on_startup command dirty load_config load_config on_config config on_pre_build config on_config:s->on_pre_build:n get_files get_files on_config:s->get_files on_files files config on_nav nav config files on_files:s->on_nav:n get_nav get_nav on_files:s->get_nav render_p render pages_point_a on_nav:s->pages_point_a get_context get_context on_nav:s->get_context load_config->on_config:n get_files->on_files:n get_nav->on_nav:n on_pre_page page config files on_page_read_source page config on_pre_page:s->on_page_read_source:n on_page_markdown markdown page config files on_page_read_source:s->on_page_markdown:n on_page_markdown:s->render_p on_page_content html page config files pages_point_b on_page_content:s->pages_point_b on_env env config files render_p->on_page_content:n pages_point_a->on_pre_page:n pages_point_a->render_p placeholder_cluster_populate_page_2 ... pages_point_a->placeholder_cluster_populate_page_2:n placeholder_cluster_populate_page_3 ... pages_point_a->placeholder_cluster_populate_page_3:n placeholder_cluster_populate_page_2:s->pages_point_b pages_point_b->on_env:n pages_point_c pages_point_b->pages_point_c placeholder_cluster_populate_page_3:s->pages_point_b on_env:s->get_context on_page_context context page config nav pages_point_c->on_page_context:n placeholder_cluster_build_page_2 ... pages_point_c->placeholder_cluster_build_page_2:n placeholder_cluster_build_page_3 ... pages_point_c->placeholder_cluster_build_page_3:n render render on_page_context:s->render on_post_page output page config write_file write_file on_post_page:s->write_file get_context->on_page_context:n render->on_post_page:n get_template get_template get_template->render on_post_build config on_serve server config on_shutdown","title":"Events"},{"location":"dev-guide/plugins/#one-time-events","text":"One-time events run once per mkdocs invocation. The only case where these tangibly differ from global events is for mkdocs serve : global events, unlike these, will run multiple times -- once per build .","title":"One-time Events"},{"location":"dev-guide/plugins/#on_startup","text":"::: mkdocs.plugins.BasePlugin.on_startup options: show_root_heading: false show_root_toc_entry: false","title":"on_startup"},{"location":"dev-guide/plugins/#on_shutdown","text":"::: mkdocs.plugins.BasePlugin.on_shutdown options: show_root_heading: false show_root_toc_entry: false","title":"on_shutdown"},{"location":"dev-guide/plugins/#on_serve","text":"::: mkdocs.plugins.BasePlugin.on_serve options: show_root_heading: false show_root_toc_entry: false","title":"on_serve"},{"location":"dev-guide/plugins/#global-events","text":"Global events are called once per build at either the beginning or end of the build process. Any changes made in these events will have a global effect on the entire site.","title":"Global Events"},{"location":"dev-guide/plugins/#on_config","text":"::: mkdocs.plugins.BasePlugin.on_config options: show_root_heading: false show_root_toc_entry: false","title":"on_config"},{"location":"dev-guide/plugins/#on_pre_build","text":"::: mkdocs.plugins.BasePlugin.on_pre_build options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_build"},{"location":"dev-guide/plugins/#on_files","text":"::: mkdocs.plugins.BasePlugin.on_files options: show_root_heading: false show_root_toc_entry: false","title":"on_files"},{"location":"dev-guide/plugins/#on_nav","text":"::: mkdocs.plugins.BasePlugin.on_nav options: show_root_heading: false show_root_toc_entry: false","title":"on_nav"},{"location":"dev-guide/plugins/#on_env","text":"::: mkdocs.plugins.BasePlugin.on_env options: show_root_heading: false show_root_toc_entry: false","title":"on_env"},{"location":"dev-guide/plugins/#on_post_build","text":"::: mkdocs.plugins.BasePlugin.on_post_build options: show_root_heading: false show_root_toc_entry: false","title":"on_post_build"},{"location":"dev-guide/plugins/#on_build_error","text":"::: mkdocs.plugins.BasePlugin.on_build_error options: show_root_heading: false show_root_toc_entry: false","title":"on_build_error"},{"location":"dev-guide/plugins/#template-events","text":"Template events are called once for each non-page template. Each template event will be called for each template defined in the extra_templates config setting as well as any static_templates defined in the theme. All template events are called after the env event and before any page events .","title":"Template Events"},{"location":"dev-guide/plugins/#on_pre_template","text":"::: mkdocs.plugins.BasePlugin.on_pre_template options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_template"},{"location":"dev-guide/plugins/#on_template_context","text":"::: mkdocs.plugins.BasePlugin.on_template_context options: show_root_heading: false show_root_toc_entry: false","title":"on_template_context"},{"location":"dev-guide/plugins/#on_post_template","text":"::: mkdocs.plugins.BasePlugin.on_post_template options: show_root_heading: false show_root_toc_entry: false","title":"on_post_template"},{"location":"dev-guide/plugins/#page-events","text":"Page events are called once for each Markdown page included in the site. All page events are called after the post_template event and before the post_build event.","title":"Page Events"},{"location":"dev-guide/plugins/#on_pre_page","text":"::: mkdocs.plugins.BasePlugin.on_pre_page options: show_root_heading: false show_root_toc_entry: false","title":"on_pre_page"},{"location":"dev-guide/plugins/#on_page_read_source","text":"::: mkdocs.plugins.BasePlugin.on_page_read_source options: show_root_heading: false show_root_toc_entry: false","title":"on_page_read_source"},{"location":"dev-guide/plugins/#on_page_markdown","text":"::: mkdocs.plugins.BasePlugin.on_page_markdown options: show_root_heading: false show_root_toc_entry: false","title":"on_page_markdown"},{"location":"dev-guide/plugins/#on_page_content","text":"::: mkdocs.plugins.BasePlugin.on_page_content options: show_root_heading: false show_root_toc_entry: false","title":"on_page_content"},{"location":"dev-guide/plugins/#on_page_context","text":"::: mkdocs.plugins.BasePlugin.on_page_context options: show_root_heading: false show_root_toc_entry: false","title":"on_page_context"},{"location":"dev-guide/plugins/#on_post_page","text":"::: mkdocs.plugins.BasePlugin.on_post_page options: show_root_heading: false show_root_toc_entry: false","title":"on_post_page"},{"location":"dev-guide/plugins/#event-priorities","text":"For each event type, corresponding methods of plugins are called in the order that the plugins appear in the plugins config . Since MkDocs 1.4, plugins can choose to set a priority value for their events. Events with higher priority are called first. Events without a chosen priority get a default of 0. Events that have the same priority are ordered as they appear in the config.","title":"Event Priorities"},{"location":"dev-guide/plugins/#mkdocspluginsevent_priority","text":"","title":"::: mkdocs.plugins.event_priority"},{"location":"dev-guide/plugins/#handling-errors","text":"MkDocs defines four error types:","title":"Handling Errors"},{"location":"dev-guide/plugins/#mkdocsexceptionsmkdocsexception","text":"","title":"::: mkdocs.exceptions.MkDocsException"},{"location":"dev-guide/plugins/#mkdocsexceptionsconfigurationerror","text":"","title":"::: mkdocs.exceptions.ConfigurationError"},{"location":"dev-guide/plugins/#mkdocsexceptionsbuilderror","text":"","title":"::: mkdocs.exceptions.BuildError"},{"location":"dev-guide/plugins/#mkdocsexceptionspluginerror","text":"Unexpected and uncaught exceptions will interrupt the build process and produce typical Python tracebacks, which are useful for debugging your code. However, users generally find tracebacks overwhelming and often miss the helpful error message. Therefore, MkDocs will catch any of the errors listed above, retrieve the error message, and exit immediately with only the helpful message displayed to the user. Therefore, you might want to catch any exceptions within your plugin and raise a PluginError , passing in your own custom-crafted message, so that the build process is aborted with a helpful message. The on_build_error event will be triggered for any exception. For example: from mkdocs.exceptions import PluginError from mkdocs.plugins import BasePlugin class MyPlugin(BasePlugin): def on_post_page(self, output, page, config, **kwargs): try: # some code that could throw a KeyError ... except KeyError as error: raise PluginError(str(error)) def on_build_error(self, error, **kwargs): # some code to clean things up ...","title":"::: mkdocs.exceptions.PluginError"},{"location":"dev-guide/plugins/#entry-point","text":"Plugins need to be packaged as Python libraries (distributed on PyPI separate from MkDocs) and each must register as a Plugin via a setuptools entry_points . Add the following to your setup.py script: entry_points={ 'mkdocs.plugins': [ 'pluginname = path.to.some_plugin:SomePluginClass', ] } The pluginname would be the name used by users (in the config file) and path.to.some_plugin:SomePluginClass would be the importable plugin itself ( from path.to.some_plugin import SomePluginClass ) where SomePluginClass is a subclass of BasePlugin which defines the plugin behavior. Naturally, multiple Plugin classes could exist in the same module. Simply define each as a separate entry point. entry_points={ 'mkdocs.plugins': [ 'featureA = path.to.my_plugins:PluginA', 'featureB = path.to.my_plugins:PluginB' ] } Note that registering a plugin does not activate it. The user still needs to tell MkDocs to use it via the config.","title":"Entry Point"},{"location":"dev-guide/themes/","text":"Developing Themes A guide to creating and distributing custom themes. Note If you are looking for existing third party themes, they are listed in the community wiki page and Best-of-MkDocs . If you want to share a theme you create, you should list it there. When creating a new theme, you can either follow the steps in this guide to create one from scratch or you can download the mkdocs-basic-theme as a basic, yet complete, theme with all the boilerplate required. You can find this base theme on GitHub . It contains detailed comments in the code to describe the different features and their usage. Creating a custom theme The bare minimum required for a custom theme is a main.html Jinja2 template file which is placed in a directory that is not a child of the docs_dir . Within mkdocs.yml , set the theme.custom_dir option to the path of the directory containing main.html . The path should be relative to the configuration file. For example, given this example project layout: mkdocs.yml docs/ index.md about.md custom_theme/ main.html ... ... you would include the following settings in mkdocs.yml to use the custom theme directory: theme: name: null custom_dir: 'custom_theme/' Note Generally, when building your own custom theme, the theme. name configuration setting would be set to null . However, if the theme. custom_dir configuration value is used in combination with an existing theme, the theme. custom_dir can be used to replace only specific parts of a built-in theme. For example, with the above layout and if you set name: \"mkdocs\" then the main.html file in the theme. custom_dir would replace the file of the same name in the mkdocs theme but otherwise the mkdocs theme would remain unchanged. This is useful if you want to make small adjustments to an existing theme. For more specific information, see Customizing Your Theme . Warning A theme's configuration defined in a mkdocs_theme.yml file is not loaded from theme.custom_dir . When an entire theme exists in theme.custom_dir and theme.name is set to null , then the entire theme configuration must be defined in the theme configuration option in the mkdocs.yml file. However, when a theme is packaged up for distribution, and loaded using the theme.name configuration option, then a mkdocs_theme.yml file is required for the theme. Basic theme The simplest main.html file is the following: {% if page.title %}{{ page.title }} - {% endif %}{{ config.site_name }} {{ page.content }} The body content from each page specified in mkdocs.yml is inserted using the {{ page.content }} tag. Style-sheets and scripts can be brought into this theme as with a normal HTML file. Navbars and tables of contents can also be generated and included automatically, through the nav and toc objects, respectively. If you wish to write your own theme, it is recommended to start with one of the built-in themes and modify it accordingly. Note As MkDocs uses Jinja as its template engine, you have access to all the power of Jinja, including template inheritance . You may notice that the themes included with MkDocs make extensive use of template inheritance and blocks, allowing users to easily override small bits and pieces of the templates from the theme custom_dir . Therefore, the built-in themes are implemented in a base.html file, which main.html extends. Although not required, third party template authors are encouraged to follow a similar pattern and may want to define the same blocks as are used in the built-in themes for consistency. Theme Files There are various files which a theme treats special in some way. Any other files are simply copied from the theme directory to the same path in the site_dir when the site it built. For example image and CSS files have no special significance and are copied as-is. Note, however, that if the user provides a file with the same path in their docs_dir , then the user's file will replace the theme file. Template Files Any files with the .html extension are considered to be template files and are not copied from the theme directory or any subdirectories. Also, any files listed in static_templates are treated as templates regardless of their file extension. Theme Meta Files The various files required for packaging a theme are also ignored. Specifically, the mkdocs_theme.yml configuration file and any Python files. Dot Files Theme authors can explicitly force MkDocs to ignore files by starting a file or directory name with a dot. Any of the following files would be ignored: .ignored.txt .ignored/file.txt foo/.ignored.txt foo/.ignored/file.txt Documentation Files All documentation files are ignored. Specifically, any Markdown files (using any of the file extensions supported by MKDocs). Additionally, any README files which may exist in the theme directories are ignored. Template Variables Each template in a theme is built with a template context. These are the variables that are available to themes. The context varies depending on the template that is being built. At the moment templates are either built with the global context or with a page specific context. The global context is used for HTML pages that don't represent an individual Markdown document, for example a 404.html page or search.html. Global Context The following variables are available globally on any template. config The config variable is an instance of MkDocs' config object generated from the mkdocs.yml config file. While you can use any config option, some commonly used options include: config.site_name config.site_url config.site_author config.site_description config.theme.locale (See also Theme Configuration below) config.extra_javascript config.extra_css config.repo_url config.repo_name config.copyright config.google_analytics nav The nav variable is used to create the navigation for the documentation. The nav object is an iterable of navigation objects as defined by the nav configuration setting. ::: mkdocs.structure.nav.Navigation options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 In addition to the iterable of navigation objects , the nav object contains the following attributes: ::: mkdocs.structure.nav.Navigation.homepage options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Navigation.pages options: show_root_full_path: false heading_level: 5 This list is not necessarily a complete list of all site pages as it does not contain pages which are not included in the navigation. This list does match the list and order of pages used for all \"next page\" and \"previous page\" links. For a list of all pages, use the pages template variable. Nav Example Following is a basic usage example which outputs the first and second level navigation as a nested list. {% if nav|length>1 %}{% for nav_item in nav %} {% if nav_item.children %}
{% endif %} base_url The base_url provides a relative path to the root of the MkDocs project. While this can be used directly by prepending it to a local relative URL, it is best to use the url template filter, which is smarter about how it applies base_url . mkdocs_version Contains the current MkDocs version. build_date_utc A Python datetime object that represents the date and time the documentation was built in UTC. This is useful for showing how recently the documentation was updated. pages A flat list of File objects for all pages in the project. This list can contain pages not included in the global navigation and may not match the order of pages within that navigation. The page object for each File can be accessed from file.page . page In templates which are not rendered from a Markdown source file, the page variable is None . In templates which are rendered from a Markdown source file, the page variable contains a page object. The same page objects are used as page navigation objects in the global navigation and in the pages template variable. ::: mkdocs.structure.pages.Page options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 All page objects contain the following attributes: ::: mkdocs.structure.pages.Page.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.content options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.toc options: show_root_full_path: false heading_level: 5 The following example would display the top two levels of the Table of Contents for a page.- {{ nav_item.title }}
{% else %}{% for nav_item in nav_item.children %}
- {{ nav_item.title }}
{% endfor %}- {{ nav_item.title }}
{% endif %} {% endfor %}{% for toc_item in page.toc %}
::: mkdocs.structure.pages.Page.meta options: show_root_full_path: false heading_level: 5 In this example we define a source property above the page title: source: generics.py mixins.py # Page title Content... A template can access this metadata for the page with the meta.source variable. This could then be used to link to source files related to the documentation page. {% for filename in page.meta.source %} {{ filename }} {% endfor %} ::: mkdocs.structure.pages.Page.url options: show_root_full_path: false heading_level: 5 It is expected that this be used with the url filter to ensure the URL is relative to the current page. {{ page.title }} ::: mkdocs.structure.pages.Page.file options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.abs_url options: show_root_full_path: false heading_level: 5 For example, if site_url: https://example.com/ , then the value of page.abs_url for the page foo.md would be /foo/ . However, if site_url: https://example.com/bar/ , then the value of page.abs_url for the page foo.md would be /bar/foo/ . ::: mkdocs.structure.pages.Page.canonical_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.edit_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_homepage options: show_root_full_path: false heading_level: 5 This can be used in conjunction with other attributes of the page object to alter the behavior. For example, to display a different title on the homepage: {% if not page.is_homepage %}{{ page.title }} - {% endif %}{{ site_name }} ::: mkdocs.structure.pages.Page.previous_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.next_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_link options: show_root_full_path: false heading_level: 5 AnchorLink ::: mkdocs.structure.toc.AnchorLink options: show_root_heading: false show_root_toc_entry: true heading_level: 5 Navigation Objects Navigation objects contained in the nav template variable may be one of section objects, page objects, and link objects. While section objects may contain nested navigation objects, pages and links do not. Page objects are the full page object as used for the current page with all of the same attributes available. Section and Link objects contain a subset of those attributes as defined below: Section A section navigation object defines a named section in the navigation and contains a list of child navigation objects. Note that sections do not contain URLs and are not links of any kind. However, by default, MkDocs sorts index pages to the top and the first child might be used as the URL for a section if a theme chooses to do so. ::: mkdocs.structure.nav.Section options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on section objects: ::: mkdocs.structure.nav.Section.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_link options: show_root_full_path: false heading_level: 5 Link A link navigation object contains a link which does not point to an internal MkDocs page. ::: mkdocs.structure.nav.Link options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on link objects: ::: mkdocs.structure.nav.Link.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_link options: show_root_full_path: false heading_level: 5 Extra Context Additional variables can be passed to the template with the extra configuration option. This is a set of key value pairs that can make custom templates far more flexible. For example, this could be used to include the project version of all pages and a list of links related to the project. This can be achieved with the following extra configuration: extra: version: 0.13.0 links: - https://github.com/mkdocs - https://docs.readthedocs.org/en/latest/builds.html#mkdocs - https://www.mkdocs.org/ And then displayed with this HTML in the custom theme. {{ config.extra.version }} {% if config.extra.links %}- {{ toc_item.title }}
{% for toc_item in toc_item.children %}- {{ toc_item.title }}
{% endfor %} {% endfor %}{% for link in config.extra.links %}
{% endif %} Template Filters In addition to Jinja's default filters , the following custom filters are available to use in MkDocs templates: url Normalizes a URL. Absolute URLs are passed through unaltered. If the URL is relative and the template context includes a page object, then the URL is returned relative to the page object. Otherwise, the URL is returned with base_url prepended. {{ page.title }} tojson Safety convert a Python object to a value in a JavaScript script. Search and themes As of MkDocs version 0.17 client side search support has been added to MkDocs via the search plugin. A theme needs to provide a few things for the plugin to work with the theme. While the search plugin is activated by default, users can disable the plugin and themes should account for this. It is recommended that theme templates wrap search specific markup with a check for the plugin: {% if 'search' in config['plugins'] %} search stuff here... {% endif %} At its most basic functionality, the search plugin will simply provide an index file which is no more than a JSON file containing the content of all pages. The theme would need to implement its own search functionality client-side. However, with a few settings and the necessary templates, the plugin can provide a complete functioning client-side search tool based on lunr.js . The following HTML needs to be added to the theme so that the provided JavaScript is able to properly load the search scripts and make relative links to the search results from the current page. With properly configured settings, the following HTML in a template will add a full search implementation to your theme.- {{ link }}
{% endfor %}Search Results
Sorry, page not found.The JavaScript in the plugin works by looking for the specific ID's used in the above HTML. The form input for the user to type the search query must be identified with id=\"mkdocs-search-query\" and the div where the results will be placed must be identified with id=\"mkdocs-search-results\" . The plugin supports the following options being set in the theme's configuration file , mkdocs_theme.yml : include_search_page Determines whether the search plugin expects the theme to provide a dedicated search page via a template located at search/search.html . When include_search_page is set to true , the search template will be built and available at search/search.html . This method is used by the readthedocs theme. When include_search_page is set to false or not defined, it is expected that the theme provide some other mechanisms for displaying search results. For example, the mkdocs theme displays results on any page via a modal. search_index_only Determines whether the search plugin should only generate a search index or a complete search solution. When search_index_only is set to false , then the search plugin modifies the Jinja environment by adding its own templates directory (with a lower precedence than the theme) and adds its scripts to the extra_javascript config setting. When search_index_only is set to true or not defined, the search plugin makes no modifications to the Jinja environment. A complete solution using the provided index file is the responsibility of the theme. The search index is written to a JSON file at search/search_index.json in the site_dir . The JSON object contained within the file may contain up to three objects. { config: {...}, docs: [...], index: {...} } If present, the config object contains the key/value pairs of config options defined for the plugin in the user's mkdocs.yml config file under plugings.search . The config object was new in MkDocs version 1.0 . The docs object contains a list of document objects. Each document object is made up of a location (URL), a title , and text which can be used to create a search index and/or display search results. If present, the index object contains a pre-built index which offers performance improvements for larger sites. Note that the pre-built index is only created if the user explicitly enables the prebuild_index config option. Themes should expect the index to not be present, but can choose to use the index when it is available. The index object was new in MkDocs version 1.0 . Packaging Themes MkDocs makes use of Python packaging to distribute themes. This comes with a few requirements. To see an example of a package containing one theme, see the MkDocs Bootstrap theme and to see a package that contains many themes, see the MkDocs Bootswatch theme . Note It is not strictly necessary to package a theme, as the entire theme can be contained in the custom_dir . If you have created a \"one-off theme,\" that should be sufficient. However, if you intend to distribute your theme for others to use, packaging the theme has some advantages. By packaging your theme, your users can more easily install it, they can rely on a default configuration being defined, and they can then take advantage of the custom_dir to make tweaks to your theme to better suit their needs. Package Layout The following layout is recommended for themes. Two files at the top level directory called MANIFEST.in and setup.py beside the theme directory which contains an empty __init__.py file, a theme configuration file ( mkdocs_theme.yml ), and your template and media files. . |-- MANIFEST.in |-- theme_name | |-- __init__.py | |-- mkdocs_theme.yml | |-- main.html | |-- styles.css `-- setup.py The MANIFEST.in file should contain the following contents but with theme_name updated and any extra file extensions added to the include. recursive-include theme_name *.ico *.js *.css *.png *.html *.eot *.svg *.ttf *.woff recursive-exclude * __pycache__ recursive-exclude * *.py[co] The setup.py should include the following text with the modifications described below. from setuptools import setup, find_packages VERSION = '0.0.1' setup( name=\"mkdocs-themename\", version=VERSION, url='', license='', description='', author='', author_email='', packages=find_packages(), include_package_data=True, entry_points={ 'mkdocs.themes': [ 'themename = theme_name', ] }, zip_safe=False ) Fill in the URL, license, description, author and author email address. The name should follow the convention mkdocs-themename (like mkdocs-bootstrap and mkdocs-bootswatch ), starting with MkDocs, using hyphens to separate words and including the name of your theme. Most of the rest of the file can be left unedited. The last section we need to change is the entry_points. This is how MkDocs finds the theme(s) you are including in the package. The name on the left is the one that users will use in their mkdocs.yml and the one on the right is the directory containing your theme files. The directory you created at the start of this section with the main.html file should contain all of the other theme files. The minimum requirement is that it includes a main.html for the theme. It must also include a __init__.py file which should be empty, this file tells Python that the directory is a package. Theme Configuration A packaged theme is required to include a configuration file named mkdocs_theme.yml which is placed in the root of your template files. The file should contain default configuration options for the theme. However, if the theme offers no configuration options, the file is still required and can be left blank. A theme which is not packaged does not need a mkdocs_theme.yml file as that file is not loaded from theme.custom_dir . The theme author is free to define any arbitrary options deemed necessary and those options will be made available in the templates to control behavior. For example, a theme might want to make a sidebar optional and include the following in the mkdocs_theme.yml file: show_sidebar: true Then in a template, that config option could be referenced: {% if config.theme.show_sidebar %} {% endif %} And the user could override the default in their project's mkdocs.yml config file: theme: name: themename show_sidebar: false In addition to arbitrary options defined by the theme, MkDocs defines a few special options which alters its behavior: Block locale This option mirrors the theme config option of the same name. If this value is not defined in the mkdocs_theme.yml file and the user does not set it in mkdocs.yml then it will default to en (English). The value is expected to match the language used in the text provided by the theme (such a \"next\" and \"previous\" links) and should be used as the value of the tag's lang attribute. See Supporting theme localization/ translation for more information. Note that during configuration validation, the provided string is converted to a Locale object. The object contains Locale.language and Locale.territory attributes and will resolve as a string from within a template. Therefore, the following will work fine: If the locale was set to fr_CA (Canadian French), then the above template would render as: If you did not want the territory attribute to be included, then reference the language attribute directly: That would render as: static_templates This option mirrors the theme config option of the same name and allows some defaults to be set by the theme. Note that while the user can add templates to this list, the user cannot remove templates included in the theme's config. extends Defines a parent theme that this theme inherits from. The value should be the string name of the parent theme. Normal Jinja inheritance rules apply. Plugins may also define some options which allow the theme to inform a plugin about which set of plugin options it expects. See the documentation for any plugins you may wish to support in your theme. Distributing Themes With the above changes, your theme should now be ready to install. This can be done with pip, using pip install . if you are still in the same directory as the setup.py. Most Python packages, including MkDocs, are distributed on PyPI. To do this, you should run the following command. python setup.py register If you don't have an account setup, you should be prompted to create one. For a much more detailed guide, see the official Python packaging documentation for Packaging and Distributing Projects . Supporting theme Localization/Translation While the built-in themes provide support for localization/translation of templates, custom themes and third-party themes may choose not to. Regardless, the locale setting of the theme configuration option is always present and is relied upon by other parts of the system. Therefore, it is recommended that all third-party themes use the same setting for designating a language regardless of the system they use for translation. In that way, users will experience consistent behavior regardless of the theme they may choose. The method for managing translations is up to the developers of a theme. However, if a theme developer chooses to use the same mechanisms used by the built-in themes, the sections below outline how to enable and make use of the same commands utilized by MkDocs. Using the Localization/Translation commands Warning As pybabel is not installed by default and most users will not have pybabel installed, theme developers and/or translators should make sure to have installed the necessary dependencies (using pip install mkdocs[i18n] ) in order for the commands to be available for use. The translation commands should be called from the root of your theme's working tree. For an overview of the workflow used by MkDocs to translate the built-in themes, see the appropriate section of the Contributing Guide and the Translation Guide . Example custom theme Localization/Translation workflow Note If your theme inherits from an existing theme which already provides translation catalogs, your theme's translations will be merged with the parent theme's translations during a MkDocs build. This means that you only need to concentrate on the added translations. Yet, you will still benefit from the translations of the parent theme. At the same time, you may override any of parent theme's translations! Let's suppose that you're working on your own fork of the mkdocs-basic-theme and want to add translations to it. Edit the templates by wrapping text in your HTML sources with {% trans %} and {% endtrans %} as follows: --- a/basic_theme/base.html +++ b/basic_theme/base.html @@ -88,7 +88,7 @@ -This is an example theme for MkDocs.
+{% trans %}This is an example theme for MkDocs.{% endtrans %}
It is designed to be read by looking at the theme HTML which is heavily Then you would follow the Translation Guide as usual to get your translations running. Packaging Translations with your theme While the Portable Object Template ( pot ) file created by the extract_messages command and the Portable Object ( po ) files created by the init_catalog and update_catalog commands are useful for creating and editing translations, they are not used by MkDocs directly and do not need to be included in a packaged release of a theme. When MkDocs builds a site with translations, it only makes use of the binary mo files(s) for the specified locale. Therefore, when packaging a theme , make sure to include it in the \"wheels\", using a MANIFEST.in file or otherwise. Then, before building your Python package, you will want to ensure that the binary mo file for each locale is up-to-date by running the compile_catalog command for each locale. MkDocs expects the binary mo files to be located at locales/
/LC_MESSAGES/messages.mo , which the compile_catalog command automatically does for you. See Testing theme translations for details. Note As outlined in our Translation Guide , the MkDocs project has chosen to include the pot and po files in our code repository, but not the mo files. This requires us to always run compile_catalog before packaging a new release regardless of whether any changes were made to a translation or not. However, you may chose an alternate workflow for your theme. At a minimum, you need to ensure that up-to-date mo files are included at the correct location in each release. However, you may use a different process for generating those mo files if you chose to do so.","title":"Themes"},{"location":"dev-guide/themes/#developing-themes","text":"A guide to creating and distributing custom themes. Note If you are looking for existing third party themes, they are listed in the community wiki page and Best-of-MkDocs . If you want to share a theme you create, you should list it there. When creating a new theme, you can either follow the steps in this guide to create one from scratch or you can download the mkdocs-basic-theme as a basic, yet complete, theme with all the boilerplate required. You can find this base theme on GitHub . It contains detailed comments in the code to describe the different features and their usage.","title":"Developing Themes"},{"location":"dev-guide/themes/#creating-a-custom-theme","text":"The bare minimum required for a custom theme is a main.html Jinja2 template file which is placed in a directory that is not a child of the docs_dir . Within mkdocs.yml , set the theme.custom_dir option to the path of the directory containing main.html . The path should be relative to the configuration file. For example, given this example project layout: mkdocs.yml docs/ index.md about.md custom_theme/ main.html ... ... you would include the following settings in mkdocs.yml to use the custom theme directory: theme: name: null custom_dir: 'custom_theme/' Note Generally, when building your own custom theme, the theme. name configuration setting would be set to null . However, if the theme. custom_dir configuration value is used in combination with an existing theme, the theme. custom_dir can be used to replace only specific parts of a built-in theme. For example, with the above layout and if you set name: \"mkdocs\" then the main.html file in the theme. custom_dir would replace the file of the same name in the mkdocs theme but otherwise the mkdocs theme would remain unchanged. This is useful if you want to make small adjustments to an existing theme. For more specific information, see Customizing Your Theme . Warning A theme's configuration defined in a mkdocs_theme.yml file is not loaded from theme.custom_dir . When an entire theme exists in theme.custom_dir and theme.name is set to null , then the entire theme configuration must be defined in the theme configuration option in the mkdocs.yml file. However, when a theme is packaged up for distribution, and loaded using the theme.name configuration option, then a mkdocs_theme.yml file is required for the theme.","title":"Creating a custom theme"},{"location":"dev-guide/themes/#basic-theme","text":"The simplest main.html file is the following: {% if page.title %}{{ page.title }} - {% endif %}{{ config.site_name }} {{ page.content }} The body content from each page specified in mkdocs.yml is inserted using the {{ page.content }} tag. Style-sheets and scripts can be brought into this theme as with a normal HTML file. Navbars and tables of contents can also be generated and included automatically, through the nav and toc objects, respectively. If you wish to write your own theme, it is recommended to start with one of the built-in themes and modify it accordingly. Note As MkDocs uses Jinja as its template engine, you have access to all the power of Jinja, including template inheritance . You may notice that the themes included with MkDocs make extensive use of template inheritance and blocks, allowing users to easily override small bits and pieces of the templates from the theme custom_dir . Therefore, the built-in themes are implemented in a base.html file, which main.html extends. Although not required, third party template authors are encouraged to follow a similar pattern and may want to define the same blocks as are used in the built-in themes for consistency.","title":"Basic theme"},{"location":"dev-guide/themes/#theme-files","text":"There are various files which a theme treats special in some way. Any other files are simply copied from the theme directory to the same path in the site_dir when the site it built. For example image and CSS files have no special significance and are copied as-is. Note, however, that if the user provides a file with the same path in their docs_dir , then the user's file will replace the theme file.","title":"Theme Files"},{"location":"dev-guide/themes/#template-files","text":"Any files with the .html extension are considered to be template files and are not copied from the theme directory or any subdirectories. Also, any files listed in static_templates are treated as templates regardless of their file extension.","title":"Template Files"},{"location":"dev-guide/themes/#theme-meta-files","text":"The various files required for packaging a theme are also ignored. Specifically, the mkdocs_theme.yml configuration file and any Python files.","title":"Theme Meta Files"},{"location":"dev-guide/themes/#dot-files","text":"Theme authors can explicitly force MkDocs to ignore files by starting a file or directory name with a dot. Any of the following files would be ignored: .ignored.txt .ignored/file.txt foo/.ignored.txt foo/.ignored/file.txt","title":"Dot Files"},{"location":"dev-guide/themes/#documentation-files","text":"All documentation files are ignored. Specifically, any Markdown files (using any of the file extensions supported by MKDocs). Additionally, any README files which may exist in the theme directories are ignored.","title":"Documentation Files"},{"location":"dev-guide/themes/#template-variables","text":"Each template in a theme is built with a template context. These are the variables that are available to themes. The context varies depending on the template that is being built. At the moment templates are either built with the global context or with a page specific context. The global context is used for HTML pages that don't represent an individual Markdown document, for example a 404.html page or search.html.","title":"Template Variables"},{"location":"dev-guide/themes/#global-context","text":"The following variables are available globally on any template.","title":"Global Context"},{"location":"dev-guide/themes/#config","text":"The config variable is an instance of MkDocs' config object generated from the mkdocs.yml config file. While you can use any config option, some commonly used options include: config.site_name config.site_url config.site_author config.site_description config.theme.locale (See also Theme Configuration below) config.extra_javascript config.extra_css config.repo_url config.repo_name config.copyright config.google_analytics","title":"config"},{"location":"dev-guide/themes/#nav","text":"The nav variable is used to create the navigation for the documentation. The nav object is an iterable of navigation objects as defined by the nav configuration setting. ::: mkdocs.structure.nav.Navigation options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 In addition to the iterable of navigation objects , the nav object contains the following attributes: ::: mkdocs.structure.nav.Navigation.homepage options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Navigation.pages options: show_root_full_path: false heading_level: 5 This list is not necessarily a complete list of all site pages as it does not contain pages which are not included in the navigation. This list does match the list and order of pages used for all \"next page\" and \"previous page\" links. For a list of all pages, use the pages template variable.","title":"nav"},{"location":"dev-guide/themes/#nav-example","text":"Following is a basic usage example which outputs the first and second level navigation as a nested list. {% if nav|length>1 %}{% for nav_item in nav %} {% if nav_item.children %}
{% endif %}","title":"Nav Example"},{"location":"dev-guide/themes/#base_url","text":"The base_url provides a relative path to the root of the MkDocs project. While this can be used directly by prepending it to a local relative URL, it is best to use the url template filter, which is smarter about how it applies base_url .","title":"base_url"},{"location":"dev-guide/themes/#mkdocs_version","text":"Contains the current MkDocs version.","title":"mkdocs_version"},{"location":"dev-guide/themes/#build_date_utc","text":"A Python datetime object that represents the date and time the documentation was built in UTC. This is useful for showing how recently the documentation was updated.","title":"build_date_utc"},{"location":"dev-guide/themes/#pages","text":"A flat list of File objects for all pages in the project. This list can contain pages not included in the global navigation and may not match the order of pages within that navigation. The page object for each File can be accessed from file.page .","title":"pages"},{"location":"dev-guide/themes/#page","text":"In templates which are not rendered from a Markdown source file, the page variable is None . In templates which are rendered from a Markdown source file, the page variable contains a page object. The same page objects are used as page navigation objects in the global navigation and in the pages template variable. ::: mkdocs.structure.pages.Page options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 All page objects contain the following attributes: ::: mkdocs.structure.pages.Page.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.content options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.toc options: show_root_full_path: false heading_level: 5 The following example would display the top two levels of the Table of Contents for a page.- {{ nav_item.title }}
{% else %}{% for nav_item in nav_item.children %}
- {{ nav_item.title }}
{% endfor %}- {{ nav_item.title }}
{% endif %} {% endfor %}{% for toc_item in page.toc %}
::: mkdocs.structure.pages.Page.meta options: show_root_full_path: false heading_level: 5 In this example we define a source property above the page title: source: generics.py mixins.py # Page title Content... A template can access this metadata for the page with the meta.source variable. This could then be used to link to source files related to the documentation page. {% for filename in page.meta.source %} {{ filename }} {% endfor %} ::: mkdocs.structure.pages.Page.url options: show_root_full_path: false heading_level: 5 It is expected that this be used with the url filter to ensure the URL is relative to the current page. {{ page.title }} ::: mkdocs.structure.pages.Page.file options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.abs_url options: show_root_full_path: false heading_level: 5 For example, if site_url: https://example.com/ , then the value of page.abs_url for the page foo.md would be /foo/ . However, if site_url: https://example.com/bar/ , then the value of page.abs_url for the page foo.md would be /bar/foo/ . ::: mkdocs.structure.pages.Page.canonical_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.edit_url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_homepage options: show_root_full_path: false heading_level: 5 This can be used in conjunction with other attributes of the page object to alter the behavior. For example, to display a different title on the homepage: {% if not page.is_homepage %}{{ page.title }} - {% endif %}{{ site_name }} ::: mkdocs.structure.pages.Page.previous_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.next_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.pages.Page.is_link options: show_root_full_path: false heading_level: 5","title":"page"},{"location":"dev-guide/themes/#anchorlink","text":"::: mkdocs.structure.toc.AnchorLink options: show_root_heading: false show_root_toc_entry: true heading_level: 5","title":"AnchorLink"},{"location":"dev-guide/themes/#navigation-objects","text":"Navigation objects contained in the nav template variable may be one of section objects, page objects, and link objects. While section objects may contain nested navigation objects, pages and links do not. Page objects are the full page object as used for the current page with all of the same attributes available. Section and Link objects contain a subset of those attributes as defined below:","title":"Navigation Objects"},{"location":"dev-guide/themes/#section","text":"A section navigation object defines a named section in the navigation and contains a list of child navigation objects. Note that sections do not contain URLs and are not links of any kind. However, by default, MkDocs sorts index pages to the top and the first child might be used as the URL for a section if a theme chooses to do so. ::: mkdocs.structure.nav.Section options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on section objects: ::: mkdocs.structure.nav.Section.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Section.is_link options: show_root_full_path: false heading_level: 5","title":"Section"},{"location":"dev-guide/themes/#link","text":"A link navigation object contains a link which does not point to an internal MkDocs page. ::: mkdocs.structure.nav.Link options: show_root_heading: false show_root_toc_entry: true members: [] heading_level: 4 The following attributes are available on link objects: ::: mkdocs.structure.nav.Link.title options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.url options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.parent options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.children options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.active options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_section options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_page options: show_root_full_path: false heading_level: 5 ::: mkdocs.structure.nav.Link.is_link options: show_root_full_path: false heading_level: 5","title":"Link"},{"location":"dev-guide/themes/#extra-context","text":"Additional variables can be passed to the template with the extra configuration option. This is a set of key value pairs that can make custom templates far more flexible. For example, this could be used to include the project version of all pages and a list of links related to the project. This can be achieved with the following extra configuration: extra: version: 0.13.0 links: - https://github.com/mkdocs - https://docs.readthedocs.org/en/latest/builds.html#mkdocs - https://www.mkdocs.org/ And then displayed with this HTML in the custom theme. {{ config.extra.version }} {% if config.extra.links %}- {{ toc_item.title }}
{% for toc_item in toc_item.children %}- {{ toc_item.title }}
{% endfor %} {% endfor %}{% for link in config.extra.links %}
{% endif %}","title":"Extra Context"},{"location":"dev-guide/themes/#template-filters","text":"In addition to Jinja's default filters , the following custom filters are available to use in MkDocs templates:","title":"Template Filters"},{"location":"dev-guide/themes/#url","text":"Normalizes a URL. Absolute URLs are passed through unaltered. If the URL is relative and the template context includes a page object, then the URL is returned relative to the page object. Otherwise, the URL is returned with base_url prepended. {{ page.title }}","title":"url"},{"location":"dev-guide/themes/#tojson","text":"Safety convert a Python object to a value in a JavaScript script. ","title":"tojson"},{"location":"dev-guide/themes/#search-and-themes","text":"As of MkDocs version 0.17 client side search support has been added to MkDocs via the search plugin. A theme needs to provide a few things for the plugin to work with the theme. While the search plugin is activated by default, users can disable the plugin and themes should account for this. It is recommended that theme templates wrap search specific markup with a check for the plugin: {% if 'search' in config['plugins'] %} search stuff here... {% endif %} At its most basic functionality, the search plugin will simply provide an index file which is no more than a JSON file containing the content of all pages. The theme would need to implement its own search functionality client-side. However, with a few settings and the necessary templates, the plugin can provide a complete functioning client-side search tool based on lunr.js . The following HTML needs to be added to the theme so that the provided JavaScript is able to properly load the search scripts and make relative links to the search results from the current page. With properly configured settings, the following HTML in a template will add a full search implementation to your theme.- {{ link }}
{% endfor %}Search Results
Sorry, page not found.The JavaScript in the plugin works by looking for the specific ID's used in the above HTML. The form input for the user to type the search query must be identified with id=\"mkdocs-search-query\" and the div where the results will be placed must be identified with id=\"mkdocs-search-results\" . The plugin supports the following options being set in the theme's configuration file , mkdocs_theme.yml :","title":"Search and themes"},{"location":"dev-guide/themes/#include_search_page","text":"Determines whether the search plugin expects the theme to provide a dedicated search page via a template located at search/search.html . When include_search_page is set to true , the search template will be built and available at search/search.html . This method is used by the readthedocs theme. When include_search_page is set to false or not defined, it is expected that the theme provide some other mechanisms for displaying search results. For example, the mkdocs theme displays results on any page via a modal.","title":"include_search_page"},{"location":"dev-guide/themes/#search_index_only","text":"Determines whether the search plugin should only generate a search index or a complete search solution. When search_index_only is set to false , then the search plugin modifies the Jinja environment by adding its own templates directory (with a lower precedence than the theme) and adds its scripts to the extra_javascript config setting. When search_index_only is set to true or not defined, the search plugin makes no modifications to the Jinja environment. A complete solution using the provided index file is the responsibility of the theme. The search index is written to a JSON file at search/search_index.json in the site_dir . The JSON object contained within the file may contain up to three objects. { config: {...}, docs: [...], index: {...} } If present, the config object contains the key/value pairs of config options defined for the plugin in the user's mkdocs.yml config file under plugings.search . The config object was new in MkDocs version 1.0 . The docs object contains a list of document objects. Each document object is made up of a location (URL), a title , and text which can be used to create a search index and/or display search results. If present, the index object contains a pre-built index which offers performance improvements for larger sites. Note that the pre-built index is only created if the user explicitly enables the prebuild_index config option. Themes should expect the index to not be present, but can choose to use the index when it is available. The index object was new in MkDocs version 1.0 .","title":"search_index_only"},{"location":"dev-guide/themes/#packaging-themes","text":"MkDocs makes use of Python packaging to distribute themes. This comes with a few requirements. To see an example of a package containing one theme, see the MkDocs Bootstrap theme and to see a package that contains many themes, see the MkDocs Bootswatch theme . Note It is not strictly necessary to package a theme, as the entire theme can be contained in the custom_dir . If you have created a \"one-off theme,\" that should be sufficient. However, if you intend to distribute your theme for others to use, packaging the theme has some advantages. By packaging your theme, your users can more easily install it, they can rely on a default configuration being defined, and they can then take advantage of the custom_dir to make tweaks to your theme to better suit their needs.","title":"Packaging Themes"},{"location":"dev-guide/themes/#package-layout","text":"The following layout is recommended for themes. Two files at the top level directory called MANIFEST.in and setup.py beside the theme directory which contains an empty __init__.py file, a theme configuration file ( mkdocs_theme.yml ), and your template and media files. . |-- MANIFEST.in |-- theme_name | |-- __init__.py | |-- mkdocs_theme.yml | |-- main.html | |-- styles.css `-- setup.py The MANIFEST.in file should contain the following contents but with theme_name updated and any extra file extensions added to the include. recursive-include theme_name *.ico *.js *.css *.png *.html *.eot *.svg *.ttf *.woff recursive-exclude * __pycache__ recursive-exclude * *.py[co] The setup.py should include the following text with the modifications described below. from setuptools import setup, find_packages VERSION = '0.0.1' setup( name=\"mkdocs-themename\", version=VERSION, url='', license='', description='', author='', author_email='', packages=find_packages(), include_package_data=True, entry_points={ 'mkdocs.themes': [ 'themename = theme_name', ] }, zip_safe=False ) Fill in the URL, license, description, author and author email address. The name should follow the convention mkdocs-themename (like mkdocs-bootstrap and mkdocs-bootswatch ), starting with MkDocs, using hyphens to separate words and including the name of your theme. Most of the rest of the file can be left unedited. The last section we need to change is the entry_points. This is how MkDocs finds the theme(s) you are including in the package. The name on the left is the one that users will use in their mkdocs.yml and the one on the right is the directory containing your theme files. The directory you created at the start of this section with the main.html file should contain all of the other theme files. The minimum requirement is that it includes a main.html for the theme. It must also include a __init__.py file which should be empty, this file tells Python that the directory is a package.","title":"Package Layout"},{"location":"dev-guide/themes/#theme-configuration","text":"A packaged theme is required to include a configuration file named mkdocs_theme.yml which is placed in the root of your template files. The file should contain default configuration options for the theme. However, if the theme offers no configuration options, the file is still required and can be left blank. A theme which is not packaged does not need a mkdocs_theme.yml file as that file is not loaded from theme.custom_dir . The theme author is free to define any arbitrary options deemed necessary and those options will be made available in the templates to control behavior. For example, a theme might want to make a sidebar optional and include the following in the mkdocs_theme.yml file: show_sidebar: true Then in a template, that config option could be referenced: {% if config.theme.show_sidebar %} {% endif %} And the user could override the default in their project's mkdocs.yml config file: theme: name: themename show_sidebar: false In addition to arbitrary options defined by the theme, MkDocs defines a few special options which alters its behavior: Block","title":"Theme Configuration"},{"location":"dev-guide/themes/#locale","text":"This option mirrors the theme config option of the same name. If this value is not defined in the mkdocs_theme.yml file and the user does not set it in mkdocs.yml then it will default to en (English). The value is expected to match the language used in the text provided by the theme (such a \"next\" and \"previous\" links) and should be used as the value of the tag's lang attribute. See Supporting theme localization/ translation for more information. Note that during configuration validation, the provided string is converted to a Locale object. The object contains Locale.language and Locale.territory attributes and will resolve as a string from within a template. Therefore, the following will work fine: If the locale was set to fr_CA (Canadian French), then the above template would render as: If you did not want the territory attribute to be included, then reference the language attribute directly: That would render as: ","title":"locale"},{"location":"dev-guide/themes/#static_templates","text":"This option mirrors the theme config option of the same name and allows some defaults to be set by the theme. Note that while the user can add templates to this list, the user cannot remove templates included in the theme's config.","title":"static_templates"},{"location":"dev-guide/themes/#extends","text":"Defines a parent theme that this theme inherits from. The value should be the string name of the parent theme. Normal Jinja inheritance rules apply. Plugins may also define some options which allow the theme to inform a plugin about which set of plugin options it expects. See the documentation for any plugins you may wish to support in your theme.","title":"extends"},{"location":"dev-guide/themes/#distributing-themes","text":"With the above changes, your theme should now be ready to install. This can be done with pip, using pip install . if you are still in the same directory as the setup.py. Most Python packages, including MkDocs, are distributed on PyPI. To do this, you should run the following command. python setup.py register If you don't have an account setup, you should be prompted to create one. For a much more detailed guide, see the official Python packaging documentation for Packaging and Distributing Projects .","title":"Distributing Themes"},{"location":"dev-guide/themes/#supporting-theme-localizationtranslation","text":"While the built-in themes provide support for localization/translation of templates, custom themes and third-party themes may choose not to. Regardless, the locale setting of the theme configuration option is always present and is relied upon by other parts of the system. Therefore, it is recommended that all third-party themes use the same setting for designating a language regardless of the system they use for translation. In that way, users will experience consistent behavior regardless of the theme they may choose. The method for managing translations is up to the developers of a theme. However, if a theme developer chooses to use the same mechanisms used by the built-in themes, the sections below outline how to enable and make use of the same commands utilized by MkDocs.","title":"Supporting theme Localization/Translation"},{"location":"dev-guide/themes/#using-the-localizationtranslation-commands","text":"Warning As pybabel is not installed by default and most users will not have pybabel installed, theme developers and/or translators should make sure to have installed the necessary dependencies (using pip install mkdocs[i18n] ) in order for the commands to be available for use. The translation commands should be called from the root of your theme's working tree. For an overview of the workflow used by MkDocs to translate the built-in themes, see the appropriate section of the Contributing Guide and the Translation Guide .","title":"Using the Localization/Translation commands"},{"location":"dev-guide/themes/#example-custom-theme-localizationtranslation-workflow","text":"Note If your theme inherits from an existing theme which already provides translation catalogs, your theme's translations will be merged with the parent theme's translations during a MkDocs build. This means that you only need to concentrate on the added translations. Yet, you will still benefit from the translations of the parent theme. At the same time, you may override any of parent theme's translations! Let's suppose that you're working on your own fork of the mkdocs-basic-theme and want to add translations to it. Edit the templates by wrapping text in your HTML sources with {% trans %} and {% endtrans %} as follows: --- a/basic_theme/base.html +++ b/basic_theme/base.html @@ -88,7 +88,7 @@ -This is an example theme for MkDocs.
+{% trans %}This is an example theme for MkDocs.{% endtrans %}
It is designed to be read by looking at the theme HTML which is heavily Then you would follow the Translation Guide as usual to get your translations running.","title":"Example custom theme Localization/Translation workflow"},{"location":"dev-guide/themes/#packaging-translations-with-your-theme","text":"While the Portable Object Template ( pot ) file created by the extract_messages command and the Portable Object ( po ) files created by the init_catalog and update_catalog commands are useful for creating and editing translations, they are not used by MkDocs directly and do not need to be included in a packaged release of a theme. When MkDocs builds a site with translations, it only makes use of the binary mo files(s) for the specified locale. Therefore, when packaging a theme , make sure to include it in the \"wheels\", using a MANIFEST.in file or otherwise. Then, before building your Python package, you will want to ensure that the binary mo file for each locale is up-to-date by running the compile_catalog command for each locale. MkDocs expects the binary mo files to be located at locales/
/LC_MESSAGES/messages.mo , which the compile_catalog command automatically does for you. See Testing theme translations for details. Note As outlined in our Translation Guide , the MkDocs project has chosen to include the pot and po files in our code repository, but not the mo files. This requires us to always run compile_catalog before packaging a new release regardless of whether any changes were made to a translation or not. However, you may chose an alternate workflow for your theme. At a minimum, you need to ensure that up-to-date mo files are included at the correct location in each release. However, you may use a different process for generating those mo files if you chose to do so.","title":"Packaging Translations with your theme"},{"location":"dev-guide/translations/","text":"about/contributing.md# Translations Theme localization guide. The built-in themes that are included with MkDocs provide support for translations. This is a guide for translators, which documents the process for contributing new translations and/or updating existing translations. For guidance on modifying the existing themes, see the Contributing Guide . To enable a specific translation see the documentation about the specific theme you are using in the User Guide . For translations of third-party themes, please see the documentation for those themes. For a third-party theme to make use of MkDocs' translation tools and methods, that theme must be properly configured to make use of those tools. Note Translations only apply to text contained within a theme's template, such as \"next\" and \"previous\" links. The Markdown content of a page is not translated. If you wish to create multilingual documentation, you need to combine theme localization with a third-party internationalization/localization plugin. Localization tooling prerequisites Theme localization makes use of the babel project for generation and compilation of localization files. You will need to be working from the git working tree on your local machine to make use of the translation commands. See the Contributing Guide for direction on how to Install for Development and Submit a Pull Request . The instructions in this document assume that you are working from a properly configured development environment. Make sure translation requirements are installed in your environment: pip install mkdocs[i18n] Adding language translations to themes If your favorite language locale is not yet supported on one (or both) of the built-in themes ( mkdocs and readthedocs ), you can easily contribute a translation by following the steps below. Here is a quick summary of what you'll need to do: Fork and clone the MkDocs repository and then install MkDocs for development for adding and testing translations. Initialize new localization catalogs for your language (if a translation for your locale already exists, follow the instructions for updating theme localization files instead). Add a translation for every text placeholder in the localized catalogs. Locally serve and test the translated themes for your language. Update the documentation about supported translations for each translated theme. Contribute your translation through a Pull Request. Note Translation locales are usually identified using the ISO-639-1 (2-letter) language codes. While territory/region/county codes are also supported, location specific translations should only be added after the general language translation has been completed and the regional dialect requires use of a term which differs from the general language translation. Fork and clone the MkDocs repository In the following steps you'll work with a fork of the MkDocs repository. Follow the instructions for forking and cloning the MkDocs repository . To test the translations you also need to install MkDocs for development from your fork. Initializing the localization catalogs The templates for each theme contain text placeholders that have been extracted into a Portable Object Template ( messages.pot ) file, which is present in each theme's folder. Initializing a catalog consists of running a command which will create a directory structure for your desired language and prepare a Portable Object ( messages.po ) file derived from the pot file of the theme. Use the init_catalog command on each theme's directory and provide the appropriate language code ( -l ). The language code is almost always just two lowercase letters, such as sv , but in some cases it needs to be further disambiguated. See: Already translated languages for built-in themes ISO 639 Language List Language subtag registry In particular, the way to know that the pt language should be disambiguated as pt_PT and pt_BR is that the Language subtag registry page contains pt- if you search for it. Whereas sv should remain just sv , because that page does not contain sv- . So, if we pick es (Spanish) as our example language code, to add a translation for it to both built-in themes, run these commands: pybabel init --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l es pybabel init --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l es The above command will create a file structure as follows: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u2514\u2500\u2500 messages.po You can now move on to the next step and add a translation for every text placeholder in the localized catalog. Updating a theme translation If a theme's messages.pot template file has been updated since the messages.po was last updated for your locale, follow the steps below to update the theme's messages.po file: Update the theme's translation catalog to refresh the translatable text placeholders of each theme. Translate the newly added translatable text placeholders on every messages.po catalog file language you can. Locally serve and test the translated themes for your language. Contribute your translation through a Pull Request. Updating the translation catalogs This step should be completed after a theme template have been updated for each language that you are comfortable contributing a translation for. To update the fr translation catalog of both built-in themes, use the following commands: pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l fr pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l fr You can now move on to the next step and add a translation for every updated text placeholder in the localized catalog. Translating the MkDocs themes Now that your localized messages.po files are ready, all you need to do is add a translation in each msgstr item for each msgid item in the file. msgid \"Next\" msgstr \"Siguiente\" Warning Do not modify the msgid as it is common to all translations. Just add its translation in the msgstr item. Once you have finished translating all of the terms listed in the po file, you'll want to test your localized theme . Testing theme translations To test a theme with translations, you need to first compile the messages.po files of your theme into messages.mo files. The following commands will compile the es translation for both built-in themes: pybabel compile --statistics --directory mkdocs/themes/mkdocs/locales -l es pybabel compile --statistics --directory mkdocs/themes/readthedocs/locales -l es The above command results in the following file structure: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u251c\u2500\u2500 messages.mo \u2502 \u2514\u2500\u2500 messages.po Note that the compiled messages.mo file was generated based on the messages.po file that you just edited. Then modify the mkdocs.yml file at the root of the project to test the new and/or updated locale: theme: name: mkdocs locale: es Finally, run mkdocs serve to check out your new localized version of the theme. Note The build and release process takes care of compiling and distributing all locales to end users so you only have to worry about contributing the actual text translation messages.po files (the rest is ignored by git). After you have finished testing your work, be sure to undo the change to the locale setting in the mkdocs.yml file before submitting your changes. Updating theme documentation Update the lists of supported translations for each translated theme located at Choosing your theme ( docs/user-guide/choosing-your-theme.md ), in their locale options. Contributing translations It is now time for you to contribute your nice work to the project. Thank you!","title":"Translations"},{"location":"dev-guide/translations/#localization-tooling-prerequisites","text":"Theme localization makes use of the babel project for generation and compilation of localization files. You will need to be working from the git working tree on your local machine to make use of the translation commands. See the Contributing Guide for direction on how to Install for Development and Submit a Pull Request . The instructions in this document assume that you are working from a properly configured development environment. Make sure translation requirements are installed in your environment: pip install mkdocs[i18n]","title":"Localization tooling prerequisites"},{"location":"dev-guide/translations/#adding-language-translations-to-themes","text":"If your favorite language locale is not yet supported on one (or both) of the built-in themes ( mkdocs and readthedocs ), you can easily contribute a translation by following the steps below. Here is a quick summary of what you'll need to do: Fork and clone the MkDocs repository and then install MkDocs for development for adding and testing translations. Initialize new localization catalogs for your language (if a translation for your locale already exists, follow the instructions for updating theme localization files instead). Add a translation for every text placeholder in the localized catalogs. Locally serve and test the translated themes for your language. Update the documentation about supported translations for each translated theme. Contribute your translation through a Pull Request. Note Translation locales are usually identified using the ISO-639-1 (2-letter) language codes. While territory/region/county codes are also supported, location specific translations should only be added after the general language translation has been completed and the regional dialect requires use of a term which differs from the general language translation.","title":"Adding language translations to themes"},{"location":"dev-guide/translations/#fork-and-clone-the-mkdocs-repository","text":"In the following steps you'll work with a fork of the MkDocs repository. Follow the instructions for forking and cloning the MkDocs repository . To test the translations you also need to install MkDocs for development from your fork.","title":"Fork and clone the MkDocs repository"},{"location":"dev-guide/translations/#initializing-the-localization-catalogs","text":"The templates for each theme contain text placeholders that have been extracted into a Portable Object Template ( messages.pot ) file, which is present in each theme's folder. Initializing a catalog consists of running a command which will create a directory structure for your desired language and prepare a Portable Object ( messages.po ) file derived from the pot file of the theme. Use the init_catalog command on each theme's directory and provide the appropriate language code ( -l ). The language code is almost always just two lowercase letters, such as sv , but in some cases it needs to be further disambiguated. See: Already translated languages for built-in themes ISO 639 Language List Language subtag registry In particular, the way to know that the pt language should be disambiguated as pt_PT and pt_BR is that the Language subtag registry page contains pt- if you search for it. Whereas sv should remain just sv , because that page does not contain sv- . So, if we pick es (Spanish) as our example language code, to add a translation for it to both built-in themes, run these commands: pybabel init --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l es pybabel init --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l es The above command will create a file structure as follows: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u2514\u2500\u2500 messages.po You can now move on to the next step and add a translation for every text placeholder in the localized catalog.","title":"Initializing the localization catalogs"},{"location":"dev-guide/translations/#updating-a-theme-translation","text":"If a theme's messages.pot template file has been updated since the messages.po was last updated for your locale, follow the steps below to update the theme's messages.po file: Update the theme's translation catalog to refresh the translatable text placeholders of each theme. Translate the newly added translatable text placeholders on every messages.po catalog file language you can. Locally serve and test the translated themes for your language. Contribute your translation through a Pull Request.","title":"Updating a theme translation"},{"location":"dev-guide/translations/#updating-the-translation-catalogs","text":"This step should be completed after a theme template have been updated for each language that you are comfortable contributing a translation for. To update the fr translation catalog of both built-in themes, use the following commands: pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/mkdocs/messages.pot --output-dir mkdocs/themes/mkdocs/locales -l fr pybabel update --ignore-obsolete --update-header-comment --input-file mkdocs/themes/readthedocs/messages.pot --output-dir mkdocs/themes/readthedocs/locales -l fr You can now move on to the next step and add a translation for every updated text placeholder in the localized catalog.","title":"Updating the translation catalogs"},{"location":"dev-guide/translations/#translating-the-mkdocs-themes","text":"Now that your localized messages.po files are ready, all you need to do is add a translation in each msgstr item for each msgid item in the file. msgid \"Next\" msgstr \"Siguiente\" Warning Do not modify the msgid as it is common to all translations. Just add its translation in the msgstr item. Once you have finished translating all of the terms listed in the po file, you'll want to test your localized theme .","title":"Translating the MkDocs themes"},{"location":"dev-guide/translations/#testing-theme-translations","text":"To test a theme with translations, you need to first compile the messages.po files of your theme into messages.mo files. The following commands will compile the es translation for both built-in themes: pybabel compile --statistics --directory mkdocs/themes/mkdocs/locales -l es pybabel compile --statistics --directory mkdocs/themes/readthedocs/locales -l es The above command results in the following file structure: mkdocs/themes/mkdocs/locales \u251c\u2500\u2500 es \u2502 \u2514\u2500\u2500 LC_MESSAGES \u2502 \u251c\u2500\u2500 messages.mo \u2502 \u2514\u2500\u2500 messages.po Note that the compiled messages.mo file was generated based on the messages.po file that you just edited. Then modify the mkdocs.yml file at the root of the project to test the new and/or updated locale: theme: name: mkdocs locale: es Finally, run mkdocs serve to check out your new localized version of the theme. Note The build and release process takes care of compiling and distributing all locales to end users so you only have to worry about contributing the actual text translation messages.po files (the rest is ignored by git). After you have finished testing your work, be sure to undo the change to the locale setting in the mkdocs.yml file before submitting your changes.","title":"Testing theme translations"},{"location":"dev-guide/translations/#updating-theme-documentation","text":"Update the lists of supported translations for each translated theme located at Choosing your theme ( docs/user-guide/choosing-your-theme.md ), in their locale options.","title":"Updating theme documentation"},{"location":"dev-guide/translations/#contributing-translations","text":"It is now time for you to contribute your nice work to the project. Thank you!","title":"Contributing translations"},{"location":"ppt/matlab/","text":"Matlab","title":"ppt"},{"location":"ppt/matlab/#matlab","text":"","title":"Matlab"},{"location":"read/Books/","text":"Books","title":"Books"},{"location":"read/Books/#books","text":"","title":"Books"},{"location":"read/Reading/","text":"Reading \u8c46\u74e3\u9605\u8bfb \u56fe\u4e66\u5c01\u9762 \u4e66\u540d \u9605\u8bfb\u72b6\u6001 \u300a\u6211\u5728\u5317\u4eac\u9001\u5feb\u9012\u300b","title":"Reading"},{"location":"read/Reading/#reading","text":"","title":"Reading"},{"location":"read/Reading/#_1","text":"\u56fe\u4e66\u5c01\u9762 \u4e66\u540d \u9605\u8bfb\u72b6\u6001 \u300a\u6211\u5728\u5317\u4eac\u9001\u5feb\u9012\u300b","title":"\u8c46\u74e3\u9605\u8bfb"},{"location":"user-guide/","text":"User Guide Building Documentation with MkDocs The MkDocs Developer Guide provides documentation for users of MkDocs. See Getting Started for an introductory tutorial. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Installation Writing Your Docs Choosing Your Theme Customizing Your Theme Localizing Your Theme Configuration Command Line Interface Deploying Your Docs","title":"README"},{"location":"user-guide/#user-guide","text":"Building Documentation with MkDocs The MkDocs Developer Guide provides documentation for users of MkDocs. See Getting Started for an introductory tutorial. You can jump directly to a page listed below, or use the next and previous buttons in the navigation bar at the top of the page to move through the documentation in order. Installation Writing Your Docs Choosing Your Theme Customizing Your Theme Localizing Your Theme Configuration Command Line Interface Deploying Your Docs","title":"User Guide"},{"location":"user-guide/choosing-your-theme/","text":"Choosing your Theme Selecting and configuring a theme. MkDocs includes two built-in themes ( mkdocs and readthedocs ), as documented below. However, many third party themes are available to choose from as well. To choose a theme, set the theme configuration option in your mkdocs.yml config file. theme: name: readthedocs mkdocs The default theme, which was built as a custom Bootstrap theme, supports most every feature of MkDocs. In addition to the default theme configuration options , the mkdocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_style : The highlight.js library provides 79 different styles (color variations) for highlighting source code in code blocks. Set this to the name of the desired style. Default: github . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: mkdocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. Currently, only Google Analytics v4 is supported via the gtag option. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: mkdocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the site. shortcuts : Defines keyboard shortcut keys. theme: name: mkdocs shortcuts: help: 191 # ? next: 78 # n previous: 80 # p search: 83 # s All values must be numeric key codes. It is best to use keys which are available on all keyboards. You may use https://keycode.info/ to determine the key code for a given key. help : Display a help modal which lists the keyboard shortcuts. Default: 191 (?) next : Navigate to the \"next\" page. Default: 78 (n) previous : Navigate to the \"previous\" page. Default: 80 (p) search : Display the search modal. Default: 83 (s) navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 2 . nav_style : This adjusts the visual style for the top navigation bar; by default, this is set to primary (the default), but it can also be set to dark or light . theme: name: mkdocs nav_style: dark locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese nb : Norwegian Bokm\u00e5l nn : Norwegian Nynorsk pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. readthedocs A clone of the default theme used by the Read the Docs service, which offers the same restricted feature-set as its parent theme. Like its parent theme, only two levels of navigation are supported. In addition to the default theme configuration options , the readthedocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: readthedocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: readthedocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the anonymize_ip : To enable anonymous IP address for Google Analytics, set this to True . Default: False . include_homepage_in_sidebar : Lists the homepage in the sidebar menu. As MkDocs requires that the homepage be listed in the nav configuration option, this setting allows the homepage to be included or excluded from the sidebar. Note that the site name/logo always links to the homepage. Default: True . prev_next_buttons_location : One of bottom , top , both , or none . Displays the \u201cNext\u201d and \u201cPrevious\u201d buttons accordingly. Default: bottom . navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 4 . collapse_navigation : Only include the page section headers in the sidebar for the current page. Default: True . titles_only : Only include page titles in the sidebar, excluding all section headers for all pages. Default: False . sticky_navigation : If True, causes the sidebar to scroll with the main page content as you scroll the page. Default: True . locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. logo : To set a logo on your project instead of the plain text site_name , set this variable to be the location of your image. Default: null . Third Party Themes A list of third party themes can be found at the community wiki page and Best-of-MkDocs . If you have created your own, please add them there.","title":"Theme"},{"location":"user-guide/choosing-your-theme/#choosing-your-theme","text":"Selecting and configuring a theme. MkDocs includes two built-in themes ( mkdocs and readthedocs ), as documented below. However, many third party themes are available to choose from as well. To choose a theme, set the theme configuration option in your mkdocs.yml config file. theme: name: readthedocs","title":"Choosing your Theme"},{"location":"user-guide/choosing-your-theme/#mkdocs","text":"The default theme, which was built as a custom Bootstrap theme, supports most every feature of MkDocs. In addition to the default theme configuration options , the mkdocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_style : The highlight.js library provides 79 different styles (color variations) for highlighting source code in code blocks. Set this to the name of the desired style. Default: github . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: mkdocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. Currently, only Google Analytics v4 is supported via the gtag option. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: mkdocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the site. shortcuts : Defines keyboard shortcut keys. theme: name: mkdocs shortcuts: help: 191 # ? next: 78 # n previous: 80 # p search: 83 # s All values must be numeric key codes. It is best to use keys which are available on all keyboards. You may use https://keycode.info/ to determine the key code for a given key. help : Display a help modal which lists the keyboard shortcuts. Default: 191 (?) next : Navigate to the \"next\" page. Default: 78 (n) previous : Navigate to the \"previous\" page. Default: 80 (p) search : Display the search modal. Default: 83 (s) navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 2 . nav_style : This adjusts the visual style for the top navigation bar; by default, this is set to primary (the default), but it can also be set to dark or light . theme: name: mkdocs nav_style: dark locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese nb : Norwegian Bokm\u00e5l nn : Norwegian Nynorsk pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information.","title":"mkdocs"},{"location":"user-guide/choosing-your-theme/#readthedocs","text":"A clone of the default theme used by the Read the Docs service, which offers the same restricted feature-set as its parent theme. Like its parent theme, only two levels of navigation are supported. In addition to the default theme configuration options , the readthedocs theme supports the following options: highlightjs : Enables highlighting of source code in code blocks using the highlight.js JavaScript library. Default: True . hljs_languages : By default, highlight.js only supports 23 common languages. List additional languages here to include support for them. theme: name: readthedocs highlightjs: true hljs_languages: - yaml - rust analytics : Defines configuration options for an analytics service. gtag : To enable Google Analytics, set to a Google Analytics v4 tracking ID, which uses the G- format. See Google's documentation to Set up Analytics for a website and/or app (GA4) or to Upgrade to a Google Analytics 4 property . theme: name: readthedocs analytics: gtag: G-ABC123 When set to the default ( null ) Google Analytics is disabled for the anonymize_ip : To enable anonymous IP address for Google Analytics, set this to True . Default: False . include_homepage_in_sidebar : Lists the homepage in the sidebar menu. As MkDocs requires that the homepage be listed in the nav configuration option, this setting allows the homepage to be included or excluded from the sidebar. Note that the site name/logo always links to the homepage. Default: True . prev_next_buttons_location : One of bottom , top , both , or none . Displays the \u201cNext\u201d and \u201cPrevious\u201d buttons accordingly. Default: bottom . navigation_depth : The maximum depth of the navigation tree in the sidebar. Default: 4 . collapse_navigation : Only include the page section headers in the sidebar for the current page. Default: True . titles_only : Only include page titles in the sidebar, excluding all section headers for all pages. Default: False . sticky_navigation : If True, causes the sidebar to scroll with the main page content as you scroll the page. Default: True . locale : The locale (language/location) used to build the theme. If your locale is not yet supported, it will fall back to the default. The following locales are supported by this theme: en : English (default) de : German es : Spanish fa : Persian (Farsi) fr : French id : Indonesian it : Italian ja : Japanese pt_BR : Portuguese (Brazil) ru : Russian tr : Turkish uk : Ukrainian zh_CN : Simplified Chinese See the guide on localizing your theme for more information. logo : To set a logo on your project instead of the plain text site_name , set this variable to be the location of your image. Default: null .","title":"readthedocs"},{"location":"user-guide/choosing-your-theme/#third-party-themes","text":"A list of third party themes can be found at the community wiki page and Best-of-MkDocs . If you have created your own, please add them there.","title":"Third Party Themes"},{"location":"user-guide/cli/","text":"Command Line Interface mkdocs MkDocs - Project documentation with Markdown. Usage: mkdocs [OPTIONS] COMMAND [ARGS]... Options: Name Type Description Default -V , --version boolean Show the version and exit. False -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False Subcommands build : Build the MkDocs documentation gh-deploy : Deploy your documentation to GitHub Pages new : Create a new MkDocs project serve : Run the builtin development server mkdocs build Build the MkDocs documentation Usage: mkdocs build [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs gh-deploy Deploy your documentation to GitHub Pages Usage: mkdocs gh-deploy [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -m , --message text A commit message to use when committing to the GitHub Pages remote branch. Commit {sha} and MkDocs {version} are available as expansions None -b , --remote-branch text The remote branch to commit to for GitHub Pages. This overrides the value specified in config None -r , --remote-name text The remote name to commit to for GitHub Pages. This overrides the value specified in config None --force boolean Force the push to the repository. False --no-history boolean Replace the whole Git history with one new commit. False --ignore-version boolean Ignore check that build is not being deployed with an older version of MkDocs. False --shell boolean Use the shell when invoking Git. False -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs new Create a new MkDocs project Usage: mkdocs new [OPTIONS] PROJECT_DIRECTORY Options: Name Type Description Default -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False mkdocs serve Run the builtin development server Usage: mkdocs serve [OPTIONS] Options: Name Type Description Default -a , --dev-addr text IP address and port to serve documentation locally (default: localhost:8000) None --livereload text Enable the live reloading in the development server (this is the default) True --no-livereload text Disable the live reloading in the development server. False --dirtyreload text Enable the live reloading in the development server, but only re-build files that have changed False --watch-theme boolean Include the theme in list of files to watch for live reloading. Ignored when live reload is not used. False -w , --watch path A directory or file to watch for live reloading. Can be supplied multiple times. [] -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"Cli"},{"location":"user-guide/cli/#command-line-interface","text":"","title":"Command Line Interface"},{"location":"user-guide/cli/#mkdocs","text":"MkDocs - Project documentation with Markdown. Usage: mkdocs [OPTIONS] COMMAND [ARGS]... Options: Name Type Description Default -V , --version boolean Show the version and exit. False -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False Subcommands build : Build the MkDocs documentation gh-deploy : Deploy your documentation to GitHub Pages new : Create a new MkDocs project serve : Run the builtin development server","title":"mkdocs"},{"location":"user-guide/cli/#mkdocs-build","text":"Build the MkDocs documentation Usage: mkdocs build [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"build"},{"location":"user-guide/cli/#mkdocs-gh-deploy","text":"Deploy your documentation to GitHub Pages Usage: mkdocs gh-deploy [OPTIONS] Options: Name Type Description Default -c , --clean / --dirty boolean Remove old files from the site_dir before building (the default). True -m , --message text A commit message to use when committing to the GitHub Pages remote branch. Commit {sha} and MkDocs {version} are available as expansions None -b , --remote-branch text The remote branch to commit to for GitHub Pages. This overrides the value specified in config None -r , --remote-name text The remote name to commit to for GitHub Pages. This overrides the value specified in config None --force boolean Force the push to the repository. False --no-history boolean Replace the whole Git history with one new commit. False --ignore-version boolean Ignore check that build is not being deployed with an older version of MkDocs. False --shell boolean Use the shell when invoking Git. False -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -d , --site-dir path The directory to output the result of the documentation build. None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"gh-deploy"},{"location":"user-guide/cli/#mkdocs-new","text":"Create a new MkDocs project Usage: mkdocs new [OPTIONS] PROJECT_DIRECTORY Options: Name Type Description Default -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"new"},{"location":"user-guide/cli/#mkdocs-serve","text":"Run the builtin development server Usage: mkdocs serve [OPTIONS] Options: Name Type Description Default -a , --dev-addr text IP address and port to serve documentation locally (default: localhost:8000) None --livereload text Enable the live reloading in the development server (this is the default) True --no-livereload text Disable the live reloading in the development server. False --dirtyreload text Enable the live reloading in the development server, but only re-build files that have changed False --watch-theme boolean Include the theme in list of files to watch for live reloading. Ignored when live reload is not used. False -w , --watch path A directory or file to watch for live reloading. Can be supplied multiple times. [] -f , --config-file filename Provide a specific MkDocs config None -s , --strict boolean Enable strict mode. This will cause MkDocs to abort the build on any warnings. None -t , --theme choice ( material | mkdocs | readthedocs ) The theme to use when building your documentation. None --use-directory-urls / --no-directory-urls boolean Use directory URLs when building pages (the default). None -q , --quiet boolean Silence warnings False -v , --verbose boolean Enable verbose output False --help boolean Show this message and exit. False","title":"serve"},{"location":"user-guide/configuration/","text":"Configuration Guide to all available configuration settings. Introduction Project settings are configured by default using a YAML configuration file in the project directory named mkdocs.yml . You can specify another path for it by using the -f / --config-file option (see mkdocs build --help ). As a minimum, this configuration file must contain the site_name . All other settings are optional. Project information site_name This is a required setting , and should be a string that is used as the main title for the project documentation. For example: site_name: Marshmallow Generator When rendering the theme this setting will be passed as the site_name context variable. site_url Set the canonical URL of the site. This will add a link tag with the canonical URL to the head section of each HTML page. If the 'root' of the MkDocs site will be within a subdirectory of a domain, be sure to include that subdirectory in the setting ( https://example.com/foo/ ). This setting is also used for mkdocs serve : the server will be mounted onto a path taken from the path component of the URL, e.g. some/page.md will be served from http://127.0.0.1:8000/foo/some/page/ to mimic the expected remote layout. default : null repo_url When set, provides a link to your repository (GitHub, Bitbucket, GitLab, ...) on each page. repo_url: https://github.com/example/repository/ default : null repo_name When set, provides the name for the link to your repository on each page. default : 'GitHub' , 'Bitbucket' or 'GitLab' if the repo_url matches those domains, otherwise the hostname from the repo_url . edit_uri The path from the base repo_url to the docs directory when directly viewing a page, accounting for specifics of the repository host (e.g. GitHub, Bitbucket, etc), the branch, and the docs directory itself. MkDocs concatenates repo_url and edit_uri , and appends the input path of the page. When set, and if your theme supports it, provides a link directly to the page in your source repository. This makes it easier to find and edit the source for the page. If repo_url is not set, this option is ignored. On some themes, setting this option may cause an edit link to be used in place of a repository link. Other themes may show both links. The edit_uri supports query ('?') and fragment ('#') characters. For repository hosts that use a query or a fragment to access the files, the edit_uri might be set as follows. (Note the ? and # in the URI...) # Query string example edit_uri: '?query=root/path/docs/' # Hash fragment example edit_uri: '#root/path/docs/' For other repository hosts, simply specify the relative path to the docs directory. # Query string example edit_uri: root/path/docs/ For example, having this config: repo_url: https://example.com/project/repo edit_uri: blob/main/docs/ means that a page named 'foo/bar.md' will have its edit link lead to: https://example.com/project/repo/blob/main/docs/foo/bar.md edit_uri can actually be just an absolute URL, not necessarily relative to repo_url , so this can achieve the same result: edit_uri: https://example.com/project/repo/blob/main/docs/ For more flexibility, see edit_uri_template below. Note On a few known hosts (specifically GitHub, Bitbucket and GitLab), the edit_uri is derived from the 'repo_url' and does not need to be set manually. Simply defining a repo_url will automatically populate the edit_uri configs setting. For example, for a GitHub- or GitLab-hosted repository, the edit_uri would be automatically set as edit/master/docs/ (Note the edit path and master branch). For a Bitbucket-hosted repository, the equivalent edit_uri would be automatically set as src/default/docs/ (note the src path and default branch). To use a different URI than the default (for example a different branch), simply set the edit_uri to your desired string. If you do not want any \"edit URL link\" displayed on your pages, then set edit_uri to an empty string to disable the automatic setting. Warning On GitHub and GitLab, the default \"edit\" path ( edit/master/docs/ ) opens the page in the online editor. This functionality requires that the user have and be logged in to a GitHub/GitLab account. Otherwise, the user will be redirected to a login/signup page. Alternatively, use the \"blob\" path ( blob/master/docs/ ) to open a read-only view, which supports anonymous access. default : edit/master/docs/ for GitHub and GitLab repos or src/default/docs/ for a Bitbucket repo, if repo_url matches those domains, otherwise null edit_uri_template The more flexible variant of edit_uri . These two are equivalent: edit_uri: 'blob/main/docs/' edit_uri_template: 'blob/main/docs/{path}' (they are also mutually exclusive -- don't specify both). Starting from here, you can change the positioning or formatting of the path, in case the default behavior of appending the path isn't enough. The contents of edit_uri_template are normal Python format strings , with only these fields available: {path} , e.g. foo/bar.md {path_noext} , e.g. foo/bar And the conversion flag !q is available, to percent-encode the field: {path!q} , e.g. foo%2Fbar.md Suggested useful configurations: GitHub Wiki: (e.g. https://github.com/project/repo/wiki/foo/bar/_edit ) repo_url: 'https://github.com/project/repo/wiki' edit_uri_template: '{path_noext}/_edit' BitBucket editor: (e.g. https://bitbucket.org/project/repo/src/master/docs/foo/bar.md?mode=edit ) repo_url: 'https://bitbucket.org/project/repo/' edit_uri_template: 'src/master/docs/{path}?mode=edit' GitLab Static Site Editor: (e.g. https://gitlab.com/project/repo/-/sse/master/docs%2Ffoo%2bar.md ) repo_url: 'https://gitlab.com/project/repo' edit_uri_template: '-/sse/master/docs%2F{path!q}' GitLab Web IDE: (e.g. https://gitlab.com/-/ide/project/repo/edit/master/-/docs/foo/bar.md ) edit_uri_template: 'https://gitlab.com/-/ide/project/repo/edit/master/-/docs/{path}' default : null site_description Set the site description. This will add a meta tag to the generated HTML header. default : null site_author Set the name of the author. This will add a meta tag to the generated HTML header. default : null copyright Set the copyright information to be included in the documentation by the theme. default : null remote_branch Set the remote branch to commit to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : gh-pages remote_name Set the remote name to push to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : origin Documentation layout nav This setting is used to determine the format and layout of the global navigation for the site. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. See the section on configuring pages and navigation for a more detailed breakdown, including how to create sub-sections. Navigation items may also include links to external sites. While titles are optional for internal links, they are required for external links. An external link may be a full URL or a relative URL. Any path which is not found in the files is assumed to be an external link. See the section about [Meta-Data] on how MkDocs determines the page title of a document. nav: - Introduction: 'index.md' - 'about.md' - 'Issue Tracker': 'https://example.com/' In the above example, the first two items point to local files while the third points to an external site. However, sometimes the MkDocs site is hosted in a subdirectory of a project's site and you may want to link to other parts of the same site without including the full domain. In that case, you may use an appropriate relative URL. site_url: https://example.com/foo/ nav: - Home: '../' - 'User Guide': 'user-guide.md' - 'Bug Tracker': '/bugs/' In the above example, two different styles of external links are used. First, note that the site_url indicates that the MkDocs site is hosted in the /foo/ subdirectory of the domain. Therefore, the Home navigation item is a relative link that steps up one level to the server root and effectively points to https://example.com/ . The Bug Tracker item uses an absolute path from the server root and effectively points to https://example.com/bugs/ . Of course, the User Guide points to a local MkDocs page. default : By default nav will contain an alphanumerically sorted, nested list of all the Markdown files found within the docs_dir and its sub-directories. Index files will always be listed first within a sub-section. Build directories theme Sets the theme and theme specific configuration of your documentation site. May be either a string or a set of key/value pairs. If a string, it must be the string name of a known installed theme. For a list of available themes visit Choosing Your Theme . An example set of key/value pairs might look something like this: theme: name: mkdocs locale: en custom_dir: my_theme_customizations/ static_templates: - sitemap.html include_sidebar: false If a set of key/value pairs, the following nested keys can be defined: Block name The string name of a known installed theme. For a list of available themes visit Choosing Your Theme . locale A code representing the language of your site. See Localizing your theme for details. custom_dir A directory containing a custom theme. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file or it can be an absolute directory path from the root of your local file system. See Customizing Your Theme for details if you would like to tweak an existing theme. See the Theme Developer Guide if you would like to build your own theme from the ground up. static_templates A list of templates to render as static pages. The templates must be located in either the theme's template directory or in the custom_dir defined in the theme configuration. (theme specific keywords) Any additional keywords supported by the theme can also be defined. See the documentation for the theme you are using for details. default : 'mkdocs' docs_dir The directory containing the documentation source markdown files. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'docs' site_dir The directory where the output HTML and other files are created. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'site' Note If you are using source code control you will normally want to ensure that your build output files are not committed into the repository, and only keep the source files under version control. For example, if using git you might add the following line to your .gitignore file: site/ If you're using another source code control tool, you'll want to check its documentation on how to ignore specific directories. extra_css Set a list of CSS files in your docs_dir to be included by the theme. For example, the following example will include the extra.css file within the css subdirectory in your docs_dir . extra_css: - css/extra.css - css/second_extra.css default : [] (an empty list). extra_javascript Set a list of JavaScript files in your docs_dir to be included by the theme. See the example in extra_css for usage. default : [] (an empty list). extra_templates Set a list of templates in your docs_dir to be built by MkDocs. To see more about writing templates for MkDocs read the documentation about [custom themes] and specifically the section about the [available variables] to templates. See the example in extra_css for usage. default : [] (an empty list). extra A set of key-value pairs, where the values can be any valid YAML construct, that will be passed to the template. This allows for great flexibility when creating custom themes. For example, if you are using a theme that supports displaying the project version, you can pass it to the theme like this: extra: version: 1.0 default : By default extra will be an empty key-value mapping. Preview controls Live Reloading watch Determines additional directories to watch when running mkdocs serve . Configuration is a YAML list. watch: - directory_a - directory_b Allows a custom default to be set without the need to pass it through the -w / --watch option every time the mkdocs serve command is called. Note The paths provided via the configuration file are relative to the configuration file. The paths provided via the -w / --watch CLI parameters are not. use_directory_urls This setting controls the style used for linking to pages within the documentation. The following table demonstrates how the URLs used on the site differ when setting use_directory_urls to true or false . Source file use_directory_urls: true use_directory_urls: false index.md / /index.html api-guide.md /api-guide/ /api-guide.html about/license.md /about/license/ /about/license.html The default style of use_directory_urls: true creates more user friendly URLs, and is usually what you'll want to use. The alternate style can be useful if you want your documentation to remain properly linked when opening pages directly from the file system, because it creates links that point directly to the target file rather than the target directory . default : true strict Determines how warnings are handled. Set to true to halt processing when a warning is raised. Set to false to print a warning and continue processing. This is also available as a command line flag: --strict . default : false dev_addr Determines the address used when running mkdocs serve . Must be of the format IP:PORT . Allows a custom default to be set without the need to pass it through the --dev-addr option every time the mkdocs serve command is called. default : '127.0.0.1:8000' See also: site_url . Formatting options markdown_extensions MkDocs uses the Python Markdown library to translate Markdown files into HTML. Python Markdown supports a variety of extensions that customize how pages are formatted. This setting lets you enable a list of extensions beyond the ones that MkDocs uses by default ( meta , toc , tables , and fenced_code ). For example, to enable the SmartyPants typography extension , use: markdown_extensions: - smarty Some extensions provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given extension supports. See the documentation for the extension you are using to determine what options they support. For example, to enable permalinks in the (included) toc extension, use: markdown_extensions: - toc: permalink: True Note that a colon ( : ) must follow the extension name ( toc ) and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single extension, each option must be defined on a separate line: markdown_extensions: - toc: permalink: True separator: \"_\" Add an additional item to the list for each extension. If you have no configuration options to set for a specific extension, then simply omit options for that extension: markdown_extensions: - smarty - toc: permalink: True - sane_lists In the above examples, each extension is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for extensions for which no options are defined. Therefore, the last example above could also be defined as follows: markdown_extensions: smarty: {} toc: permalink: True sane_lists: {} This alternative syntax is required if you intend to override some options via inheritance . See Also: The Python-Markdown documentation provides a list of extensions which are available out-of-the-box. For a list of configuration options available for a given extension, see the documentation for that extension. You may also install and use various third party extensions ( Python-Markdown wiki , Best-of-MkDocs ). Consult the documentation provided by those extensions for installation instructions and available configuration options. default : [] (an empty list). hooks New in version 1.4 A list of paths to Python scripts (relative to mkdocs.yml ) that are loaded and used as plugin instances. For example: hooks: - my_hooks.py Then the file my_hooks.py can contain any plugin event handlers (without self ), e.g.: def on_page_markdown(markdown, **kwargs): return markdown.replace('a', 'z') Advanced example: This produces warnings based on the Markdown content (and warnings are fatal in strict mode): import logging, re import mkdocs.plugins log = logging.getLogger('mkdocs') @mkdocs.plugins.event_priority(-50) def on_page_markdown(markdown, page, **kwargs): path = page.file.src_uri for m in re.finditer(r'\\bhttp://[^) ]+', markdown): log.warning(f\"Documentation file '{path}' contains a non-HTTPS link: {m[0]}\") This does not enable any new abilities compared to plugins , it only simplifies one-off usages, as these don't need to be installed like plugins do. Note that for mkdocs serve the hook module will not be reloaded on each build. You might have seen this feature in the mkdocs-simple-hooks plugin . If using standard method names, it can be directly replaced, e.g.: -plugins: - - mkdocs-simple-hooks: - hooks: - on_page_markdown: 'my_hooks:on_page_markdown' +hooks: + - my_hooks.py plugins A list of plugins (with optional configuration settings) to use when building the site. See the Plugins documentation for full details. If the plugins config setting is defined in the mkdocs.yml config file, then any defaults (such as search ) are ignored and you need to explicitly re-enable the defaults if you would like to continue using them: plugins: - search - your_other_plugin To define options for a given plugin, use a nested set of key/value pairs: plugins: - search - your_other_plugin: option1: value option2: other value In the above examples, each plugin is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for plugins for which no options are defined. Therefore, the last example above could also be defined as follows: plugins: search: {} your_other_plugin: option1: value option2: other value This alternative syntax is required if you intend to override some options via inheritance . To completely disable all plugins, including any defaults, set the plugins setting to an empty list: plugins: [] default : ['search'] (the \"search\" plugin included with MkDocs). Search A search plugin is provided by default with MkDocs which uses lunr.js as a search engine. The following config options are available to alter the behavior of the search plugin: separator A regular expression which matches the characters used as word separators when building the index. By default whitespace and the hyphen ( - ) are used. To add the dot ( . ) as a word separator you might do this: plugins: - search: separator: '[\\s\\-\\.]+' default : '[\\s\\-]+' min_search_length An integer value that defines the minimum length for a search query. By default searches shorter than 3 chars in length are ignored as search result quality with short search terms are poor. However, for some use cases (such as documentation about Message Queues which might generate searches for 'MQ') it may be preferable to set a shorter limit. plugins: - search: min_search_length: 2 default : 3 lang A list of languages to use when building the search index as identified by their ISO 639-1 language codes. With Lunr Languages , the following languages are supported: ar : Arabic da : Danish nl : Dutch en : English fi : Finnish fr : French de : German hu : Hungarian it : Italian ja : Japanese no : Norwegian pt : Portuguese ro : Romanian ru : Russian es : Spanish sv : Swedish th : Thai tr : Turkish vi : Vietnamese You may contribute additional languages . Warning While search does support using multiple languages together, it is best not to add additional languages unless you really need them. Each additional language adds significant bandwidth requirements and uses more browser resources. Generally, it is best to keep each instance of MkDocs to a single language. Note Lunr Languages does not currently include support for Chinese or other Asian languages. However, some users have reported decent results using Japanese. default : The value of theme.locale if set, otherwise [en] . prebuild_index Optionally generates a pre-built index of all pages, which provides some performance improvements for larger sites. Before enabling, confirm that the theme you are using explicitly supports using a prebuilt index (the builtin themes do). Set to true to enable. Warning This option requires that Node.js be installed and the command node be on the system path. If the call to node fails for any reason, a warning is issued and the build continues uninterrupted. You may use the --strict flag when building to cause such a failure to raise an error instead. Note On smaller sites, using a pre-built index is not recommended as it creates a significant increase is bandwidth requirements with little to no noticeable improvement to your users. However, for larger sites (hundreds of pages), the bandwidth increase is relatively small and your users will notice a significant improvement in search performance. default : False indexing Configures what strategy the search indexer will use when building the index for your pages. This property is particularly useful if your project is large in scale, and the index takes up an enormous amount of disk space. plugins: - search: indexing: 'full' Options Option Description full Indexes the title, section headings, and full text of each page. sections Indexes the title and section headings of each page. titles Indexes only the title of each page. default : full Environment Variables In most cases, the value of a configuration option is set directly in the configuration file. However, as an option, the value of a configuration option may be set to the value of an environment variable using the !ENV tag. For example, to set the value of the site_name option to the value of the variable SITE_NAME the YAML file may contain the following: site_name: !ENV SITE_NAME If the environment variable is not defined, then the configuration setting would be assigned a null (or None in Python) value. A default value can be defined as the last value in a list. Like this: site_name: !ENV [SITE_NAME, 'My default site name'] Multiple fallback variables can be used as well. Note that the last value is not an environment variable, but must be a value to use as a default if none of the specified environment variables are defined. site_name: !ENV [SITE_NAME, OTHER_NAME, 'My default site name'] Simple types defined within an environment variable such as string, bool, integer, float, datestamp and null are parsed as if they were defined directly in the YAML file, which means that the value will be converted to the appropriate type. However, complex types such as lists and key/value pairs cannot be defined within a single environment variable. For more details, see the pyyaml_env_tag project. Configuration Inheritance Generally, a single file would hold the entire configuration for a site. However, some organizations may maintain multiple sites which all share a common configuration across them. Rather than maintaining separate configurations for each, the common configuration options can be defined in a parent configuration file which each site's primary configuration file inherits. To define the parent for a configuration file, set the INHERIT (all caps) key to the path of the parent file. The path must be relative to the location of the primary file. For configuration options to be merged with a parent configuration, those options must be defined as key/value pairs. Specifically, the markdown_extensions and plugins options must use the alternative syntax which does not use list items (lines which start with - ). For example, suppose the common (parent) configuration is defined in base.yml : theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Then, for the \"foo\" site, the primary configuration file would be defined at foo/mkdocs.yml : INHERIT: ../base.yml site_name: Foo Project site_url: https://example.com/foo When running mkdocs build , the file at foo/mkdocs.yml would be passed in as the configuration file. MkDocs will then parse that file, retrieve and parse the parent file base.yml and deep merge the two. This would result in MkDocs receiving the following merged configuration: site_name: Foo Project site_url: https://example.com/foo theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Deep merging allows you to add and/or override various values in your primary configuration file. For example, suppose for one site you wanted to add support for definition lists, use a different symbol for permalinks, and define a different separator. In that site's primary configuration file you could do: INHERIT: ../base.yml site_name: Bar Project site_url: https://example.com/bar markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" In that case, the above configuration would be deep merged with base.yml and result in the following configuration: site_name: Bar Project site_url: https://example.com/bar theme: name: mkdocs locale: en highlightjs: true markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" admonition: {} Notice that the admonition extension was retained from the parent configuration, the def_list extension was added, the value of toc.permalink was replaced, and the value of toc.separator was added. You can replace or merge the value of any key. However, any non-key is always replaced. Therefore, you cannot append items to a list. You must redefine the entire list. As the nav configuration is made up of nested lists, this means that you cannot merge navigation items. Of course, you can replace the entire nav configuration with a new one. However, it is generally expected that the entire navigation would be defined in the primary configuration file for a project. Warning As a reminder, all path based configuration options must be relative to the primary configuration file and MkDocs does not alter the paths when merging. Therefore, defining paths in a parent file which is inherited by multiple different sites may not work as expected. It is generally best to define path based options in the primary configuration file only.","title":"Configuration"},{"location":"user-guide/configuration/#configuration","text":"Guide to all available configuration settings.","title":"Configuration"},{"location":"user-guide/configuration/#introduction","text":"Project settings are configured by default using a YAML configuration file in the project directory named mkdocs.yml . You can specify another path for it by using the -f / --config-file option (see mkdocs build --help ). As a minimum, this configuration file must contain the site_name . All other settings are optional.","title":"Introduction"},{"location":"user-guide/configuration/#project-information","text":"","title":"Project information"},{"location":"user-guide/configuration/#site_name","text":"This is a required setting , and should be a string that is used as the main title for the project documentation. For example: site_name: Marshmallow Generator When rendering the theme this setting will be passed as the site_name context variable.","title":"site_name"},{"location":"user-guide/configuration/#site_url","text":"Set the canonical URL of the site. This will add a link tag with the canonical URL to the head section of each HTML page. If the 'root' of the MkDocs site will be within a subdirectory of a domain, be sure to include that subdirectory in the setting ( https://example.com/foo/ ). This setting is also used for mkdocs serve : the server will be mounted onto a path taken from the path component of the URL, e.g. some/page.md will be served from http://127.0.0.1:8000/foo/some/page/ to mimic the expected remote layout. default : null","title":"site_url"},{"location":"user-guide/configuration/#repo_url","text":"When set, provides a link to your repository (GitHub, Bitbucket, GitLab, ...) on each page. repo_url: https://github.com/example/repository/ default : null","title":"repo_url"},{"location":"user-guide/configuration/#repo_name","text":"When set, provides the name for the link to your repository on each page. default : 'GitHub' , 'Bitbucket' or 'GitLab' if the repo_url matches those domains, otherwise the hostname from the repo_url .","title":"repo_name"},{"location":"user-guide/configuration/#edit_uri","text":"The path from the base repo_url to the docs directory when directly viewing a page, accounting for specifics of the repository host (e.g. GitHub, Bitbucket, etc), the branch, and the docs directory itself. MkDocs concatenates repo_url and edit_uri , and appends the input path of the page. When set, and if your theme supports it, provides a link directly to the page in your source repository. This makes it easier to find and edit the source for the page. If repo_url is not set, this option is ignored. On some themes, setting this option may cause an edit link to be used in place of a repository link. Other themes may show both links. The edit_uri supports query ('?') and fragment ('#') characters. For repository hosts that use a query or a fragment to access the files, the edit_uri might be set as follows. (Note the ? and # in the URI...) # Query string example edit_uri: '?query=root/path/docs/' # Hash fragment example edit_uri: '#root/path/docs/' For other repository hosts, simply specify the relative path to the docs directory. # Query string example edit_uri: root/path/docs/ For example, having this config: repo_url: https://example.com/project/repo edit_uri: blob/main/docs/ means that a page named 'foo/bar.md' will have its edit link lead to: https://example.com/project/repo/blob/main/docs/foo/bar.md edit_uri can actually be just an absolute URL, not necessarily relative to repo_url , so this can achieve the same result: edit_uri: https://example.com/project/repo/blob/main/docs/ For more flexibility, see edit_uri_template below. Note On a few known hosts (specifically GitHub, Bitbucket and GitLab), the edit_uri is derived from the 'repo_url' and does not need to be set manually. Simply defining a repo_url will automatically populate the edit_uri configs setting. For example, for a GitHub- or GitLab-hosted repository, the edit_uri would be automatically set as edit/master/docs/ (Note the edit path and master branch). For a Bitbucket-hosted repository, the equivalent edit_uri would be automatically set as src/default/docs/ (note the src path and default branch). To use a different URI than the default (for example a different branch), simply set the edit_uri to your desired string. If you do not want any \"edit URL link\" displayed on your pages, then set edit_uri to an empty string to disable the automatic setting. Warning On GitHub and GitLab, the default \"edit\" path ( edit/master/docs/ ) opens the page in the online editor. This functionality requires that the user have and be logged in to a GitHub/GitLab account. Otherwise, the user will be redirected to a login/signup page. Alternatively, use the \"blob\" path ( blob/master/docs/ ) to open a read-only view, which supports anonymous access. default : edit/master/docs/ for GitHub and GitLab repos or src/default/docs/ for a Bitbucket repo, if repo_url matches those domains, otherwise null","title":"edit_uri"},{"location":"user-guide/configuration/#edit_uri_template","text":"The more flexible variant of edit_uri . These two are equivalent: edit_uri: 'blob/main/docs/' edit_uri_template: 'blob/main/docs/{path}' (they are also mutually exclusive -- don't specify both). Starting from here, you can change the positioning or formatting of the path, in case the default behavior of appending the path isn't enough. The contents of edit_uri_template are normal Python format strings , with only these fields available: {path} , e.g. foo/bar.md {path_noext} , e.g. foo/bar And the conversion flag !q is available, to percent-encode the field: {path!q} , e.g. foo%2Fbar.md Suggested useful configurations: GitHub Wiki: (e.g. https://github.com/project/repo/wiki/foo/bar/_edit ) repo_url: 'https://github.com/project/repo/wiki' edit_uri_template: '{path_noext}/_edit' BitBucket editor: (e.g. https://bitbucket.org/project/repo/src/master/docs/foo/bar.md?mode=edit ) repo_url: 'https://bitbucket.org/project/repo/' edit_uri_template: 'src/master/docs/{path}?mode=edit' GitLab Static Site Editor: (e.g. https://gitlab.com/project/repo/-/sse/master/docs%2Ffoo%2bar.md ) repo_url: 'https://gitlab.com/project/repo' edit_uri_template: '-/sse/master/docs%2F{path!q}' GitLab Web IDE: (e.g. https://gitlab.com/-/ide/project/repo/edit/master/-/docs/foo/bar.md ) edit_uri_template: 'https://gitlab.com/-/ide/project/repo/edit/master/-/docs/{path}' default : null","title":"edit_uri_template"},{"location":"user-guide/configuration/#site_description","text":"Set the site description. This will add a meta tag to the generated HTML header. default : null","title":"site_description"},{"location":"user-guide/configuration/#site_author","text":"Set the name of the author. This will add a meta tag to the generated HTML header. default : null","title":"site_author"},{"location":"user-guide/configuration/#copyright","text":"Set the copyright information to be included in the documentation by the theme. default : null","title":"copyright"},{"location":"user-guide/configuration/#remote_branch","text":"Set the remote branch to commit to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : gh-pages","title":"remote_branch"},{"location":"user-guide/configuration/#remote_name","text":"Set the remote name to push to when using gh-deploy to deploy to GitHub Pages. This option can be overridden by a command line option in gh-deploy . default : origin","title":"remote_name"},{"location":"user-guide/configuration/#documentation-layout","text":"","title":"Documentation layout"},{"location":"user-guide/configuration/#nav","text":"This setting is used to determine the format and layout of the global navigation for the site. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. See the section on configuring pages and navigation for a more detailed breakdown, including how to create sub-sections. Navigation items may also include links to external sites. While titles are optional for internal links, they are required for external links. An external link may be a full URL or a relative URL. Any path which is not found in the files is assumed to be an external link. See the section about [Meta-Data] on how MkDocs determines the page title of a document. nav: - Introduction: 'index.md' - 'about.md' - 'Issue Tracker': 'https://example.com/' In the above example, the first two items point to local files while the third points to an external site. However, sometimes the MkDocs site is hosted in a subdirectory of a project's site and you may want to link to other parts of the same site without including the full domain. In that case, you may use an appropriate relative URL. site_url: https://example.com/foo/ nav: - Home: '../' - 'User Guide': 'user-guide.md' - 'Bug Tracker': '/bugs/' In the above example, two different styles of external links are used. First, note that the site_url indicates that the MkDocs site is hosted in the /foo/ subdirectory of the domain. Therefore, the Home navigation item is a relative link that steps up one level to the server root and effectively points to https://example.com/ . The Bug Tracker item uses an absolute path from the server root and effectively points to https://example.com/bugs/ . Of course, the User Guide points to a local MkDocs page. default : By default nav will contain an alphanumerically sorted, nested list of all the Markdown files found within the docs_dir and its sub-directories. Index files will always be listed first within a sub-section.","title":"nav"},{"location":"user-guide/configuration/#build-directories","text":"","title":"Build directories"},{"location":"user-guide/configuration/#theme","text":"Sets the theme and theme specific configuration of your documentation site. May be either a string or a set of key/value pairs. If a string, it must be the string name of a known installed theme. For a list of available themes visit Choosing Your Theme . An example set of key/value pairs might look something like this: theme: name: mkdocs locale: en custom_dir: my_theme_customizations/ static_templates: - sitemap.html include_sidebar: false If a set of key/value pairs, the following nested keys can be defined: Block","title":"theme"},{"location":"user-guide/configuration/#name","text":"The string name of a known installed theme. For a list of available themes visit Choosing Your Theme .","title":"name"},{"location":"user-guide/configuration/#locale","text":"A code representing the language of your site. See Localizing your theme for details.","title":"locale"},{"location":"user-guide/configuration/#custom_dir","text":"A directory containing a custom theme. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file or it can be an absolute directory path from the root of your local file system. See Customizing Your Theme for details if you would like to tweak an existing theme. See the Theme Developer Guide if you would like to build your own theme from the ground up.","title":"custom_dir"},{"location":"user-guide/configuration/#static_templates","text":"A list of templates to render as static pages. The templates must be located in either the theme's template directory or in the custom_dir defined in the theme configuration.","title":"static_templates"},{"location":"user-guide/configuration/#theme-specific-keywords","text":"Any additional keywords supported by the theme can also be defined. See the documentation for the theme you are using for details. default : 'mkdocs'","title":"(theme specific keywords)"},{"location":"user-guide/configuration/#docs_dir","text":"The directory containing the documentation source markdown files. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'docs'","title":"docs_dir"},{"location":"user-guide/configuration/#site_dir","text":"The directory where the output HTML and other files are created. This can either be a relative directory, in which case it is resolved relative to the directory containing your configuration file, or it can be an absolute directory path from the root of your local file system. default : 'site' Note If you are using source code control you will normally want to ensure that your build output files are not committed into the repository, and only keep the source files under version control. For example, if using git you might add the following line to your .gitignore file: site/ If you're using another source code control tool, you'll want to check its documentation on how to ignore specific directories.","title":"site_dir"},{"location":"user-guide/configuration/#extra_css","text":"Set a list of CSS files in your docs_dir to be included by the theme. For example, the following example will include the extra.css file within the css subdirectory in your docs_dir . extra_css: - css/extra.css - css/second_extra.css default : [] (an empty list).","title":"extra_css"},{"location":"user-guide/configuration/#extra_javascript","text":"Set a list of JavaScript files in your docs_dir to be included by the theme. See the example in extra_css for usage. default : [] (an empty list).","title":"extra_javascript"},{"location":"user-guide/configuration/#extra_templates","text":"Set a list of templates in your docs_dir to be built by MkDocs. To see more about writing templates for MkDocs read the documentation about [custom themes] and specifically the section about the [available variables] to templates. See the example in extra_css for usage. default : [] (an empty list).","title":"extra_templates"},{"location":"user-guide/configuration/#extra","text":"A set of key-value pairs, where the values can be any valid YAML construct, that will be passed to the template. This allows for great flexibility when creating custom themes. For example, if you are using a theme that supports displaying the project version, you can pass it to the theme like this: extra: version: 1.0 default : By default extra will be an empty key-value mapping.","title":"extra"},{"location":"user-guide/configuration/#preview-controls","text":"","title":"Preview controls"},{"location":"user-guide/configuration/#live-reloading","text":"","title":"Live Reloading"},{"location":"user-guide/configuration/#watch","text":"Determines additional directories to watch when running mkdocs serve . Configuration is a YAML list. watch: - directory_a - directory_b Allows a custom default to be set without the need to pass it through the -w / --watch option every time the mkdocs serve command is called. Note The paths provided via the configuration file are relative to the configuration file. The paths provided via the -w / --watch CLI parameters are not.","title":"watch"},{"location":"user-guide/configuration/#use_directory_urls","text":"This setting controls the style used for linking to pages within the documentation. The following table demonstrates how the URLs used on the site differ when setting use_directory_urls to true or false . Source file use_directory_urls: true use_directory_urls: false index.md / /index.html api-guide.md /api-guide/ /api-guide.html about/license.md /about/license/ /about/license.html The default style of use_directory_urls: true creates more user friendly URLs, and is usually what you'll want to use. The alternate style can be useful if you want your documentation to remain properly linked when opening pages directly from the file system, because it creates links that point directly to the target file rather than the target directory . default : true","title":"use_directory_urls"},{"location":"user-guide/configuration/#strict","text":"Determines how warnings are handled. Set to true to halt processing when a warning is raised. Set to false to print a warning and continue processing. This is also available as a command line flag: --strict . default : false","title":"strict"},{"location":"user-guide/configuration/#dev_addr","text":"Determines the address used when running mkdocs serve . Must be of the format IP:PORT . Allows a custom default to be set without the need to pass it through the --dev-addr option every time the mkdocs serve command is called. default : '127.0.0.1:8000' See also: site_url .","title":"dev_addr"},{"location":"user-guide/configuration/#formatting-options","text":"","title":"Formatting options"},{"location":"user-guide/configuration/#markdown_extensions","text":"MkDocs uses the Python Markdown library to translate Markdown files into HTML. Python Markdown supports a variety of extensions that customize how pages are formatted. This setting lets you enable a list of extensions beyond the ones that MkDocs uses by default ( meta , toc , tables , and fenced_code ). For example, to enable the SmartyPants typography extension , use: markdown_extensions: - smarty Some extensions provide configuration options of their own. If you would like to set any configuration options, then you can nest a key/value mapping ( option_name: option value ) of any options that a given extension supports. See the documentation for the extension you are using to determine what options they support. For example, to enable permalinks in the (included) toc extension, use: markdown_extensions: - toc: permalink: True Note that a colon ( : ) must follow the extension name ( toc ) and then on a new line the option name and value must be indented and separated by a colon. If you would like to define multiple options for a single extension, each option must be defined on a separate line: markdown_extensions: - toc: permalink: True separator: \"_\" Add an additional item to the list for each extension. If you have no configuration options to set for a specific extension, then simply omit options for that extension: markdown_extensions: - smarty - toc: permalink: True - sane_lists In the above examples, each extension is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for extensions for which no options are defined. Therefore, the last example above could also be defined as follows: markdown_extensions: smarty: {} toc: permalink: True sane_lists: {} This alternative syntax is required if you intend to override some options via inheritance . See Also: The Python-Markdown documentation provides a list of extensions which are available out-of-the-box. For a list of configuration options available for a given extension, see the documentation for that extension. You may also install and use various third party extensions ( Python-Markdown wiki , Best-of-MkDocs ). Consult the documentation provided by those extensions for installation instructions and available configuration options. default : [] (an empty list).","title":"markdown_extensions"},{"location":"user-guide/configuration/#hooks","text":"New in version 1.4 A list of paths to Python scripts (relative to mkdocs.yml ) that are loaded and used as plugin instances. For example: hooks: - my_hooks.py Then the file my_hooks.py can contain any plugin event handlers (without self ), e.g.: def on_page_markdown(markdown, **kwargs): return markdown.replace('a', 'z') Advanced example: This produces warnings based on the Markdown content (and warnings are fatal in strict mode): import logging, re import mkdocs.plugins log = logging.getLogger('mkdocs') @mkdocs.plugins.event_priority(-50) def on_page_markdown(markdown, page, **kwargs): path = page.file.src_uri for m in re.finditer(r'\\bhttp://[^) ]+', markdown): log.warning(f\"Documentation file '{path}' contains a non-HTTPS link: {m[0]}\") This does not enable any new abilities compared to plugins , it only simplifies one-off usages, as these don't need to be installed like plugins do. Note that for mkdocs serve the hook module will not be reloaded on each build. You might have seen this feature in the mkdocs-simple-hooks plugin . If using standard method names, it can be directly replaced, e.g.: -plugins: - - mkdocs-simple-hooks: - hooks: - on_page_markdown: 'my_hooks:on_page_markdown' +hooks: + - my_hooks.py","title":"hooks"},{"location":"user-guide/configuration/#plugins","text":"A list of plugins (with optional configuration settings) to use when building the site. See the Plugins documentation for full details. If the plugins config setting is defined in the mkdocs.yml config file, then any defaults (such as search ) are ignored and you need to explicitly re-enable the defaults if you would like to continue using them: plugins: - search - your_other_plugin To define options for a given plugin, use a nested set of key/value pairs: plugins: - search - your_other_plugin: option1: value option2: other value In the above examples, each plugin is a list item (starts with a - ). As an alternative, key/value pairs can be used instead. However, in that case an empty value must be provided for plugins for which no options are defined. Therefore, the last example above could also be defined as follows: plugins: search: {} your_other_plugin: option1: value option2: other value This alternative syntax is required if you intend to override some options via inheritance . To completely disable all plugins, including any defaults, set the plugins setting to an empty list: plugins: [] default : ['search'] (the \"search\" plugin included with MkDocs).","title":"plugins"},{"location":"user-guide/configuration/#search","text":"A search plugin is provided by default with MkDocs which uses lunr.js as a search engine. The following config options are available to alter the behavior of the search plugin:","title":"Search"},{"location":"user-guide/configuration/#separator","text":"A regular expression which matches the characters used as word separators when building the index. By default whitespace and the hyphen ( - ) are used. To add the dot ( . ) as a word separator you might do this: plugins: - search: separator: '[\\s\\-\\.]+' default : '[\\s\\-]+'","title":"separator"},{"location":"user-guide/configuration/#min_search_length","text":"An integer value that defines the minimum length for a search query. By default searches shorter than 3 chars in length are ignored as search result quality with short search terms are poor. However, for some use cases (such as documentation about Message Queues which might generate searches for 'MQ') it may be preferable to set a shorter limit. plugins: - search: min_search_length: 2 default : 3","title":"min_search_length"},{"location":"user-guide/configuration/#lang","text":"A list of languages to use when building the search index as identified by their ISO 639-1 language codes. With Lunr Languages , the following languages are supported: ar : Arabic da : Danish nl : Dutch en : English fi : Finnish fr : French de : German hu : Hungarian it : Italian ja : Japanese no : Norwegian pt : Portuguese ro : Romanian ru : Russian es : Spanish sv : Swedish th : Thai tr : Turkish vi : Vietnamese You may contribute additional languages . Warning While search does support using multiple languages together, it is best not to add additional languages unless you really need them. Each additional language adds significant bandwidth requirements and uses more browser resources. Generally, it is best to keep each instance of MkDocs to a single language. Note Lunr Languages does not currently include support for Chinese or other Asian languages. However, some users have reported decent results using Japanese. default : The value of theme.locale if set, otherwise [en] .","title":"lang"},{"location":"user-guide/configuration/#prebuild_index","text":"Optionally generates a pre-built index of all pages, which provides some performance improvements for larger sites. Before enabling, confirm that the theme you are using explicitly supports using a prebuilt index (the builtin themes do). Set to true to enable. Warning This option requires that Node.js be installed and the command node be on the system path. If the call to node fails for any reason, a warning is issued and the build continues uninterrupted. You may use the --strict flag when building to cause such a failure to raise an error instead. Note On smaller sites, using a pre-built index is not recommended as it creates a significant increase is bandwidth requirements with little to no noticeable improvement to your users. However, for larger sites (hundreds of pages), the bandwidth increase is relatively small and your users will notice a significant improvement in search performance. default : False","title":"prebuild_index"},{"location":"user-guide/configuration/#indexing","text":"Configures what strategy the search indexer will use when building the index for your pages. This property is particularly useful if your project is large in scale, and the index takes up an enormous amount of disk space. plugins: - search: indexing: 'full'","title":"indexing"},{"location":"user-guide/configuration/#options","text":"Option Description full Indexes the title, section headings, and full text of each page. sections Indexes the title and section headings of each page. titles Indexes only the title of each page. default : full","title":"Options"},{"location":"user-guide/configuration/#environment-variables","text":"In most cases, the value of a configuration option is set directly in the configuration file. However, as an option, the value of a configuration option may be set to the value of an environment variable using the !ENV tag. For example, to set the value of the site_name option to the value of the variable SITE_NAME the YAML file may contain the following: site_name: !ENV SITE_NAME If the environment variable is not defined, then the configuration setting would be assigned a null (or None in Python) value. A default value can be defined as the last value in a list. Like this: site_name: !ENV [SITE_NAME, 'My default site name'] Multiple fallback variables can be used as well. Note that the last value is not an environment variable, but must be a value to use as a default if none of the specified environment variables are defined. site_name: !ENV [SITE_NAME, OTHER_NAME, 'My default site name'] Simple types defined within an environment variable such as string, bool, integer, float, datestamp and null are parsed as if they were defined directly in the YAML file, which means that the value will be converted to the appropriate type. However, complex types such as lists and key/value pairs cannot be defined within a single environment variable. For more details, see the pyyaml_env_tag project.","title":"Environment Variables"},{"location":"user-guide/configuration/#configuration-inheritance","text":"Generally, a single file would hold the entire configuration for a site. However, some organizations may maintain multiple sites which all share a common configuration across them. Rather than maintaining separate configurations for each, the common configuration options can be defined in a parent configuration file which each site's primary configuration file inherits. To define the parent for a configuration file, set the INHERIT (all caps) key to the path of the parent file. The path must be relative to the location of the primary file. For configuration options to be merged with a parent configuration, those options must be defined as key/value pairs. Specifically, the markdown_extensions and plugins options must use the alternative syntax which does not use list items (lines which start with - ). For example, suppose the common (parent) configuration is defined in base.yml : theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Then, for the \"foo\" site, the primary configuration file would be defined at foo/mkdocs.yml : INHERIT: ../base.yml site_name: Foo Project site_url: https://example.com/foo When running mkdocs build , the file at foo/mkdocs.yml would be passed in as the configuration file. MkDocs will then parse that file, retrieve and parse the parent file base.yml and deep merge the two. This would result in MkDocs receiving the following merged configuration: site_name: Foo Project site_url: https://example.com/foo theme: name: mkdocs locale: en highlightjs: true markdown_extensions: toc: permalink: true admonition: {} Deep merging allows you to add and/or override various values in your primary configuration file. For example, suppose for one site you wanted to add support for definition lists, use a different symbol for permalinks, and define a different separator. In that site's primary configuration file you could do: INHERIT: ../base.yml site_name: Bar Project site_url: https://example.com/bar markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" In that case, the above configuration would be deep merged with base.yml and result in the following configuration: site_name: Bar Project site_url: https://example.com/bar theme: name: mkdocs locale: en highlightjs: true markdown_extensions: def_list: {} toc: permalink: \uf0c1 separator: \"_\" admonition: {} Notice that the admonition extension was retained from the parent configuration, the def_list extension was added, the value of toc.permalink was replaced, and the value of toc.separator was added. You can replace or merge the value of any key. However, any non-key is always replaced. Therefore, you cannot append items to a list. You must redefine the entire list. As the nav configuration is made up of nested lists, this means that you cannot merge navigation items. Of course, you can replace the entire nav configuration with a new one. However, it is generally expected that the entire navigation would be defined in the primary configuration file for a project. Warning As a reminder, all path based configuration options must be relative to the primary configuration file and MkDocs does not alter the paths when merging. Therefore, defining paths in a parent file which is inherited by multiple different sites may not work as expected. It is generally best to define path based options in the primary configuration file only.","title":"Configuration Inheritance"},{"location":"user-guide/customizing-your-theme/","text":"Customizing Your Theme Altering a theme to suit your needs. If you would like to make a few tweaks to an existing theme, there is no need to create your own theme from scratch. For minor tweaks which only require some CSS and/or JavaScript, you can use the docs_dir . However, for more complex customizations, including overriding templates, you will need to use the theme custom_dir setting. Using the docs_dir The extra_css and extra_javascript configuration options can be used to make tweaks and customizations to existing themes. To use these, you simply need to include either CSS or JavaScript files within your documentation directory . For example, to change the color of the headers in your documentation, create a file called extra.css and place it next to the documentation Markdown. In that file add the following CSS. h1 { color: red; } Note If you are deploying your documentation with ReadTheDocs , you will need to explicitly list the CSS and JavaScript files you want to include in your config. To do this, add the following to your mkdocs.yml. extra_css: [extra.css] After making these changes, they should be visible when you run mkdocs serve - if you already had this running, you should see that the CSS changes were automatically picked up and the documentation will be updated. Note Any extra CSS or JavaScript files will be added to the generated HTML document after the page content. If you desire to include a JavaScript library, you may have better success including the library by using the theme custom_dir . Using the theme custom_dir The theme.custom_dir configuration option can be used to point to a directory of files which override the files in a parent theme. The parent theme would be the theme defined in the theme.name configuration option. Any file in the custom_dir with the same name as a file in the parent theme will replace the file of the same name in the parent theme. Any additional files in the custom_dir will be added to the parent theme. The contents of the custom_dir should mirror the directory structure of the parent theme. You may include templates, JavaScript files, CSS files, images, fonts, or any other media included in a theme. Note For this to work, the theme.name setting must be set to a known installed theme. If the name setting is instead set to null (or not defined), then there is no theme to override and the contents of the custom_dir must be a complete, standalone theme. See the Theme Developer Guide for more information. For example, the mkdocs theme ( browse source ), contains the following directory structure (in part): - css\\ - fonts\\ - img\\ - favicon.ico - grid.png - js\\ - 404.html - base.html - content.html - nav-sub.html - nav.html - toc.html To override any of the files contained in that theme, create a new directory next to your docs_dir : mkdir custom_theme And then point your mkdocs.yml configuration file at the new directory: theme: name: mkdocs custom_dir: custom_theme/ To override the 404 error page (\"file not found\"), add a new template file named 404.html to the custom_theme directory. For information on what can be included in a template, review the Theme Developer Guide . To override the favicon, you can add a new icon file at custom_theme/img/favicon.ico . To include a JavaScript library, copy the library to the custom_theme/js/ directory. Your directory structure should now look like this: - docs/ - index.html - custom_theme/ - img/ - favicon.ico - js/ - somelib.js - 404.html - config.yml Note Any files included in the parent theme (defined in name ) but not included in the custom_dir will still be utilized. The custom_dir will only override/replace files in the parent theme. If you want to remove files, or build a theme from scratch, then you should review the Theme Developer Guide . Overriding Template Blocks The built-in themes implement many of their parts inside template blocks which can be individually overridden in the main.html template. Simply create a main.html template file in your custom_dir and define replacement blocks within that file. Just make sure that the main.html extends base.html . For example, to alter the title of the MkDocs theme, your replacement main.html template would contain the following: {% extends \"base.html\" %} {% block htmltitle %} Custom title goes here {% endblock %} In the above example, the htmltitle block defined in your custom main.html file will be used in place of the default htmltitle block defined in the parent theme. You may re-define as many blocks as you desire, as long as those blocks are defined in the parent. For example, you could replace the Google Analytics script with one for a different service or replace the search feature with your own. You will need to consult the parent theme you are using to determine what blocks are available to override. The MkDocs and ReadTheDocs themes provide the following blocks: site_meta : Contains meta tags in the document head. htmltitle : Contains the page title in the document head. styles : Contains the link tags for stylesheets. libs : Contains the JavaScript libraries (jQuery, etc) included in the page header. scripts : Contains JavaScript scripts which should execute after a page loads. analytics : Contains the analytics script. extrahead : An empty block in the to insert custom tags/scripts/etc. site_name : Contains the site name in the navigation bar. site_nav : Contains the site navigation in the navigation bar. search_button : Contains the search box in the navigation bar. next_prev : Contains the next and previous buttons in the navigation bar. repo : Contains the repository link in the navigation bar. content : Contains the page content and table of contents for the page. footer : Contains the page footer. You may need to view the source template files to ensure your modifications will work with the structure of the site. See Template Variables for a list of variables you can use within your custom blocks. For a more complete explanation of blocks, consult the Jinja documentation . Combining the custom_dir and Template Blocks Adding a JavaScript library to the custom_dir will make it available, but won't include it in the pages generated by MkDocs. Therefore, a link needs to be added to the library from the HTML. Starting the with directory structure above (truncated): - docs/ - custom_theme/ - js/ - somelib.js - config.yml A link to the custom_theme/js/somelib.js file needs to be added to the template. As somelib.js is a JavaScript library, it would logically go in the libs block. However, a new libs block that only includes the new script will replace the block defined in the parent template and any links to libraries in the parent template will be removed. To avoid breaking the template, a super block can be used with a call to super from within the block: {% extends \"base.html\" %} {% block libs %} {{ super() }} {% endblock %} Note that the base_url template variable was used to ensure that the link is always relative to the current page. Now the generated pages will include links to the template provided libraries as well as the library included in the custom_dir . The same would be required for any additional CSS files included in the custom_dir .","title":"Customizing"},{"location":"user-guide/customizing-your-theme/#customizing-your-theme","text":"Altering a theme to suit your needs. If you would like to make a few tweaks to an existing theme, there is no need to create your own theme from scratch. For minor tweaks which only require some CSS and/or JavaScript, you can use the docs_dir . However, for more complex customizations, including overriding templates, you will need to use the theme custom_dir setting.","title":"Customizing Your Theme"},{"location":"user-guide/customizing-your-theme/#using-the-docs_dir","text":"The extra_css and extra_javascript configuration options can be used to make tweaks and customizations to existing themes. To use these, you simply need to include either CSS or JavaScript files within your documentation directory . For example, to change the color of the headers in your documentation, create a file called extra.css and place it next to the documentation Markdown. In that file add the following CSS. h1 { color: red; } Note If you are deploying your documentation with ReadTheDocs , you will need to explicitly list the CSS and JavaScript files you want to include in your config. To do this, add the following to your mkdocs.yml. extra_css: [extra.css] After making these changes, they should be visible when you run mkdocs serve - if you already had this running, you should see that the CSS changes were automatically picked up and the documentation will be updated. Note Any extra CSS or JavaScript files will be added to the generated HTML document after the page content. If you desire to include a JavaScript library, you may have better success including the library by using the theme custom_dir .","title":"Using the docs_dir"},{"location":"user-guide/customizing-your-theme/#using-the-theme-custom_dir","text":"The theme.custom_dir configuration option can be used to point to a directory of files which override the files in a parent theme. The parent theme would be the theme defined in the theme.name configuration option. Any file in the custom_dir with the same name as a file in the parent theme will replace the file of the same name in the parent theme. Any additional files in the custom_dir will be added to the parent theme. The contents of the custom_dir should mirror the directory structure of the parent theme. You may include templates, JavaScript files, CSS files, images, fonts, or any other media included in a theme. Note For this to work, the theme.name setting must be set to a known installed theme. If the name setting is instead set to null (or not defined), then there is no theme to override and the contents of the custom_dir must be a complete, standalone theme. See the Theme Developer Guide for more information. For example, the mkdocs theme ( browse source ), contains the following directory structure (in part): - css\\ - fonts\\ - img\\ - favicon.ico - grid.png - js\\ - 404.html - base.html - content.html - nav-sub.html - nav.html - toc.html To override any of the files contained in that theme, create a new directory next to your docs_dir : mkdir custom_theme And then point your mkdocs.yml configuration file at the new directory: theme: name: mkdocs custom_dir: custom_theme/ To override the 404 error page (\"file not found\"), add a new template file named 404.html to the custom_theme directory. For information on what can be included in a template, review the Theme Developer Guide . To override the favicon, you can add a new icon file at custom_theme/img/favicon.ico . To include a JavaScript library, copy the library to the custom_theme/js/ directory. Your directory structure should now look like this: - docs/ - index.html - custom_theme/ - img/ - favicon.ico - js/ - somelib.js - 404.html - config.yml Note Any files included in the parent theme (defined in name ) but not included in the custom_dir will still be utilized. The custom_dir will only override/replace files in the parent theme. If you want to remove files, or build a theme from scratch, then you should review the Theme Developer Guide .","title":"Using the theme custom_dir"},{"location":"user-guide/customizing-your-theme/#overriding-template-blocks","text":"The built-in themes implement many of their parts inside template blocks which can be individually overridden in the main.html template. Simply create a main.html template file in your custom_dir and define replacement blocks within that file. Just make sure that the main.html extends base.html . For example, to alter the title of the MkDocs theme, your replacement main.html template would contain the following: {% extends \"base.html\" %} {% block htmltitle %}Custom title goes here {% endblock %} In the above example, the htmltitle block defined in your custom main.html file will be used in place of the default htmltitle block defined in the parent theme. You may re-define as many blocks as you desire, as long as those blocks are defined in the parent. For example, you could replace the Google Analytics script with one for a different service or replace the search feature with your own. You will need to consult the parent theme you are using to determine what blocks are available to override. The MkDocs and ReadTheDocs themes provide the following blocks: site_meta : Contains meta tags in the document head. htmltitle : Contains the page title in the document head. styles : Contains the link tags for stylesheets. libs : Contains the JavaScript libraries (jQuery, etc) included in the page header. scripts : Contains JavaScript scripts which should execute after a page loads. analytics : Contains the analytics script. extrahead : An empty block in the to insert custom tags/scripts/etc. site_name : Contains the site name in the navigation bar. site_nav : Contains the site navigation in the navigation bar. search_button : Contains the search box in the navigation bar. next_prev : Contains the next and previous buttons in the navigation bar. repo : Contains the repository link in the navigation bar. content : Contains the page content and table of contents for the page. footer : Contains the page footer. You may need to view the source template files to ensure your modifications will work with the structure of the site. See Template Variables for a list of variables you can use within your custom blocks. For a more complete explanation of blocks, consult the Jinja documentation .","title":"Overriding Template Blocks"},{"location":"user-guide/customizing-your-theme/#combining-the-custom_dir-and-template-blocks","text":"Adding a JavaScript library to the custom_dir will make it available, but won't include it in the pages generated by MkDocs. Therefore, a link needs to be added to the library from the HTML. Starting the with directory structure above (truncated): - docs/ - custom_theme/ - js/ - somelib.js - config.yml A link to the custom_theme/js/somelib.js file needs to be added to the template. As somelib.js is a JavaScript library, it would logically go in the libs block. However, a new libs block that only includes the new script will replace the block defined in the parent template and any links to libraries in the parent template will be removed. To avoid breaking the template, a super block can be used with a call to super from within the block: {% extends \"base.html\" %} {% block libs %} {{ super() }} {% endblock %} Note that the base_url template variable was used to ensure that the link is always relative to the current page. Now the generated pages will include links to the template provided libraries as well as the library included in the custom_dir . The same would be required for any additional CSS files included in the custom_dir .","title":"Combining the custom_dir and Template Blocks"},{"location":"user-guide/deploying-your-docs/","text":"Deploying your docs A basic guide to deploying your docs to various hosting providers GitHub Pages If you host the source code for a project on GitHub , you can easily use GitHub Pages to host the documentation for your project. There are two basic types of GitHub Pages sites: Project Pages sites, and User and Organization Pages sites. They are nearly identical but have some important differences, which require a different work flow when deploying. Project Pages Project Pages sites are simpler as the site files get deployed to a branch within the project repository ( gh-pages by default). After you checkout the primary working branch (usually master ) of the git repository where you maintain the source documentation for your project, run the following command: mkdocs gh-deploy That's it! Behind the scenes, MkDocs will build your docs and use the ghp-import tool to commit them to the gh-pages branch and push the gh-pages branch to GitHub. Use mkdocs gh-deploy --help to get a full list of options available for the gh-deploy command. Be aware that you will not be able to review the built site before it is pushed to GitHub. Therefore, you may want to verify any changes you make to the docs beforehand by using the build or serve commands and reviewing the built files locally. Warning You should never edit files in your pages repository by hand if you're using the gh-deploy command because you will lose your work the next time you run the command. Warning If there are untracked files or uncommitted work in the local repository where mkdocs gh-deploy is run, these will be included in the pages that are deployed. Organization and User Pages User and Organization Pages sites are not tied to a specific project, and the site files are deployed to the master branch in a dedicated repository named with the GitHub account name. Therefore, you need working copies of two repositories on our local system. For example, consider the following file structure: my-project/ mkdocs.yml docs/ orgname.github.io/ After making and verifying updates to your project you need to change directories to the orgname.github.io repository and call the mkdocs gh-deploy command from there: cd ../orgname.github.io/ mkdocs gh-deploy --config-file ../my-project/mkdocs.yml --remote-branch master Note that you need to explicitly point to the mkdocs.yml configuration file as it is no longer in the current working directory. You also need to inform the deploy script to commit to the master branch. You may override the default with the remote_branch configuration setting, but if you forget to change directories before running the deploy script, it will commit to the master branch of your project, which you probably don't want. Custom Domains GitHub Pages includes support for using a Custom Domain for your site. In addition to the steps documented by GitHub, you need to take one additional step so that MkDocs will work with your custom domain. You need to add a CNAME file to the root of your docs_dir . The file must contain a single bare domain or subdomain on a single line (see MkDocs' own CNAME file as an example). You may create the file manually, or use GitHub's web interface to set up the custom domain (under Settings / Custom Domain). If you use the web interface, GitHub will create the CNAME file for you and save it to the root of your \"pages\" branch. So that the file does not get removed the next time you deploy, you need to copy the file to your docs_dir . With the file properly included in your docs_dir , MkDocs will include the file in your built site and push it to your \"pages\" branch each time you run the gh-deploy command. If you are having problems getting a custom domain to work, see GitHub's documentation on Troubleshooting custom domains . Read the Docs Read the Docs offers free documentation hosting. You can import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. Read the Docs supports MkDocs out-of-the-box. Follow the instructions on their site to arrange the files in your repository properly, create an account and point it at your publicly hosted repository. If properly configured, your documentation will update each time you push commits to your public repository. Note To benefit from all of the features offered by Read the Docs, you will need to use the Read the Docs theme which ships with MkDocs. The various themes which may be referenced in Read the Docs' documentation are Sphinx specific themes and will not work with MkDocs. Other Providers Any hosting provider which can serve static files can be used to serve documentation generated by MkDocs. While it would be impossible to document how to upload the docs to every hosting provider out there, the following guidelines should provide some general assistance. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory to the root directory of your hosting provider's server. Depending on your hosting provider's setup, you may need to use a graphical or command line ftp , ssh or scp client to transfer the files. For example, a typical set of commands from the command line might look something like this: mkdocs build scp -r ./site user@host:/path/to/server/root Of course, you will need to replace user with the username you have with your hosting provider and host with the appropriate domain name. Additionally, you will need to adjust the /path/to/server/root to match the configuration of your hosts' file system. See your host's documentation for specifics. You will likely want to search their documentation for \"ftp\" or \"uploading site\". Local Files Rather than hosting your documentation on a server, you may instead distribute the files directly, which can then be viewed in a browser using the file:// scheme. Note that, due to the security settings of all modern browsers, some things will not work the same and some features may not work at all. In fact, a few settings will need to be customized in very specific ways. site_url : The site_url must be set to an empty string, which instructs MkDocs to build your site so that it will work with the file:// scheme. site_url: \"\" use_directory_urls : Set use_directory_urls to false . Otherwise, internal links between pages will not work properly. use_directory_urls: false search : You will need to either disable the search plugin, or use a third-party search plugin which is specifically designed to work with the file:// scheme. To disable all plugins, set the plugins setting to an empty list. plugins: [] If you have other plugins enabled, simply ensure that search is not included in the list. When writing your documentation, it is imperative that all internal links use relative URLs as documented . Remember, each reader of your documentation will be using a different device and the files will likely be in a different location on that device. If you expect your documentation to be viewed off-line, you may also need to be careful about which themes you choose. Many themes make use of CDNs for various support files, which require a live Internet connection. You will need to choose a theme which includes all support files directly in the theme. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory and distribute it to your readers. Alternatively, you may choose to use a third party tool to convert the HTML files to some other documentation format. 404 Pages When MkDocs builds the documentation it will include a 404.html file in the build directory . This file will be automatically used when deploying to GitHub but only on a custom domain. Other web servers may be configured to use it but the feature won't always be available. See the documentation for your server of choice for more information.","title":"Deploying"},{"location":"user-guide/deploying-your-docs/#deploying-your-docs","text":"A basic guide to deploying your docs to various hosting providers","title":"Deploying your docs"},{"location":"user-guide/deploying-your-docs/#github-pages","text":"If you host the source code for a project on GitHub , you can easily use GitHub Pages to host the documentation for your project. There are two basic types of GitHub Pages sites: Project Pages sites, and User and Organization Pages sites. They are nearly identical but have some important differences, which require a different work flow when deploying.","title":"GitHub Pages"},{"location":"user-guide/deploying-your-docs/#project-pages","text":"Project Pages sites are simpler as the site files get deployed to a branch within the project repository ( gh-pages by default). After you checkout the primary working branch (usually master ) of the git repository where you maintain the source documentation for your project, run the following command: mkdocs gh-deploy That's it! Behind the scenes, MkDocs will build your docs and use the ghp-import tool to commit them to the gh-pages branch and push the gh-pages branch to GitHub. Use mkdocs gh-deploy --help to get a full list of options available for the gh-deploy command. Be aware that you will not be able to review the built site before it is pushed to GitHub. Therefore, you may want to verify any changes you make to the docs beforehand by using the build or serve commands and reviewing the built files locally. Warning You should never edit files in your pages repository by hand if you're using the gh-deploy command because you will lose your work the next time you run the command. Warning If there are untracked files or uncommitted work in the local repository where mkdocs gh-deploy is run, these will be included in the pages that are deployed.","title":"Project Pages"},{"location":"user-guide/deploying-your-docs/#organization-and-user-pages","text":"User and Organization Pages sites are not tied to a specific project, and the site files are deployed to the master branch in a dedicated repository named with the GitHub account name. Therefore, you need working copies of two repositories on our local system. For example, consider the following file structure: my-project/ mkdocs.yml docs/ orgname.github.io/ After making and verifying updates to your project you need to change directories to the orgname.github.io repository and call the mkdocs gh-deploy command from there: cd ../orgname.github.io/ mkdocs gh-deploy --config-file ../my-project/mkdocs.yml --remote-branch master Note that you need to explicitly point to the mkdocs.yml configuration file as it is no longer in the current working directory. You also need to inform the deploy script to commit to the master branch. You may override the default with the remote_branch configuration setting, but if you forget to change directories before running the deploy script, it will commit to the master branch of your project, which you probably don't want.","title":"Organization and User Pages"},{"location":"user-guide/deploying-your-docs/#custom-domains","text":"GitHub Pages includes support for using a Custom Domain for your site. In addition to the steps documented by GitHub, you need to take one additional step so that MkDocs will work with your custom domain. You need to add a CNAME file to the root of your docs_dir . The file must contain a single bare domain or subdomain on a single line (see MkDocs' own CNAME file as an example). You may create the file manually, or use GitHub's web interface to set up the custom domain (under Settings / Custom Domain). If you use the web interface, GitHub will create the CNAME file for you and save it to the root of your \"pages\" branch. So that the file does not get removed the next time you deploy, you need to copy the file to your docs_dir . With the file properly included in your docs_dir , MkDocs will include the file in your built site and push it to your \"pages\" branch each time you run the gh-deploy command. If you are having problems getting a custom domain to work, see GitHub's documentation on Troubleshooting custom domains .","title":"Custom Domains"},{"location":"user-guide/deploying-your-docs/#read-the-docs","text":"Read the Docs offers free documentation hosting. You can import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. Read the Docs supports MkDocs out-of-the-box. Follow the instructions on their site to arrange the files in your repository properly, create an account and point it at your publicly hosted repository. If properly configured, your documentation will update each time you push commits to your public repository. Note To benefit from all of the features offered by Read the Docs, you will need to use the Read the Docs theme which ships with MkDocs. The various themes which may be referenced in Read the Docs' documentation are Sphinx specific themes and will not work with MkDocs.","title":"Read the Docs"},{"location":"user-guide/deploying-your-docs/#other-providers","text":"Any hosting provider which can serve static files can be used to serve documentation generated by MkDocs. While it would be impossible to document how to upload the docs to every hosting provider out there, the following guidelines should provide some general assistance. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory to the root directory of your hosting provider's server. Depending on your hosting provider's setup, you may need to use a graphical or command line ftp , ssh or scp client to transfer the files. For example, a typical set of commands from the command line might look something like this: mkdocs build scp -r ./site user@host:/path/to/server/root Of course, you will need to replace user with the username you have with your hosting provider and host with the appropriate domain name. Additionally, you will need to adjust the /path/to/server/root to match the configuration of your hosts' file system. See your host's documentation for specifics. You will likely want to search their documentation for \"ftp\" or \"uploading site\".","title":"Other Providers"},{"location":"user-guide/deploying-your-docs/#local-files","text":"Rather than hosting your documentation on a server, you may instead distribute the files directly, which can then be viewed in a browser using the file:// scheme. Note that, due to the security settings of all modern browsers, some things will not work the same and some features may not work at all. In fact, a few settings will need to be customized in very specific ways. site_url : The site_url must be set to an empty string, which instructs MkDocs to build your site so that it will work with the file:// scheme. site_url: \"\" use_directory_urls : Set use_directory_urls to false . Otherwise, internal links between pages will not work properly. use_directory_urls: false search : You will need to either disable the search plugin, or use a third-party search plugin which is specifically designed to work with the file:// scheme. To disable all plugins, set the plugins setting to an empty list. plugins: [] If you have other plugins enabled, simply ensure that search is not included in the list. When writing your documentation, it is imperative that all internal links use relative URLs as documented . Remember, each reader of your documentation will be using a different device and the files will likely be in a different location on that device. If you expect your documentation to be viewed off-line, you may also need to be careful about which themes you choose. Many themes make use of CDNs for various support files, which require a live Internet connection. You will need to choose a theme which includes all support files directly in the theme. When you build your site (using the mkdocs build command), all of the files are written to the directory assigned to the site_dir configuration option (defaults to \"site\" ) in your mkdocs.yaml config file. Generally, you will simply need to copy the contents of that directory and distribute it to your readers. Alternatively, you may choose to use a third party tool to convert the HTML files to some other documentation format.","title":"Local Files"},{"location":"user-guide/deploying-your-docs/#404-pages","text":"When MkDocs builds the documentation it will include a 404.html file in the build directory . This file will be automatically used when deploying to GitHub but only on a custom domain. Other web servers may be configured to use it but the feature won't always be available. See the documentation for your server of choice for more information.","title":"404 Pages"},{"location":"user-guide/installation/","text":"MkDocs Installation A detailed guide. Requirements MkDocs requires a recent version of Python and the Python package manager, pip , to be installed on your system. You can check if you already have these installed from the command line: $ python --version Python 3.8.2 $ pip --version pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) If you already have those packages installed, you may skip down to Installing MkDocs . Installing Python Install Python using your package manager of choice, or by downloading an installer appropriate for your system from python.org and running it. Note If you are installing Python on Windows, be sure to check the box to have Python added to your PATH if the installer offers such an option (it's normally off by default). Installing pip If you're using a recent version of Python, the Python package manager, pip , is most likely installed by default. However, you may need to upgrade pip to the lasted version: pip install --upgrade pip If you need to install pip for the first time, download get-pip.py . Then run the following command to install it: python get-pip.py Installing MkDocs Install the mkdocs package using pip: pip install mkdocs You should now have the mkdocs command installed on your system. Run mkdocs --version to check that everything worked okay. $ mkdocs --version mkdocs, version 1.2.0 from /usr/local/lib/python3.8/site-packages/mkdocs (Python 3.8) Note If you would like manpages installed for MkDocs, the click-man tool can generate and install them for you. Simply run the following two commands: pip install click-man click-man --target path/to/man/pages mkdocs See the click-man documentation for an explanation of why manpages are not automatically generated and installed by pip. Note If you are using Windows, some of the above commands may not work out-of-the-box. A quick solution may be to preface every Python command with python -m like this: python -m pip install mkdocs python -m mkdocs For a more permanent solution, you may need to edit your PATH environment variable to include the Scripts directory of your Python installation. Recent versions of Python include a script to do this for you. Navigate to your Python installation directory (for example C:\\Python38\\ ), open the Tools , then Scripts folder, and run the win_add2path.py file by double clicking on it. Alternatively, you can download the script and run it ( python win_add2path.py ).","title":"Install"},{"location":"user-guide/installation/#mkdocs-installation","text":"A detailed guide.","title":"MkDocs Installation"},{"location":"user-guide/installation/#requirements","text":"MkDocs requires a recent version of Python and the Python package manager, pip , to be installed on your system. You can check if you already have these installed from the command line: $ python --version Python 3.8.2 $ pip --version pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) If you already have those packages installed, you may skip down to Installing MkDocs .","title":"Requirements"},{"location":"user-guide/installation/#installing-python","text":"Install Python using your package manager of choice, or by downloading an installer appropriate for your system from python.org and running it. Note If you are installing Python on Windows, be sure to check the box to have Python added to your PATH if the installer offers such an option (it's normally off by default).","title":"Installing Python"},{"location":"user-guide/installation/#installing-pip","text":"If you're using a recent version of Python, the Python package manager, pip , is most likely installed by default. However, you may need to upgrade pip to the lasted version: pip install --upgrade pip If you need to install pip for the first time, download get-pip.py . Then run the following command to install it: python get-pip.py","title":"Installing pip"},{"location":"user-guide/installation/#installing-mkdocs","text":"Install the mkdocs package using pip: pip install mkdocs You should now have the mkdocs command installed on your system. Run mkdocs --version to check that everything worked okay. $ mkdocs --version mkdocs, version 1.2.0 from /usr/local/lib/python3.8/site-packages/mkdocs (Python 3.8) Note If you would like manpages installed for MkDocs, the click-man tool can generate and install them for you. Simply run the following two commands: pip install click-man click-man --target path/to/man/pages mkdocs See the click-man documentation for an explanation of why manpages are not automatically generated and installed by pip. Note If you are using Windows, some of the above commands may not work out-of-the-box. A quick solution may be to preface every Python command with python -m like this: python -m pip install mkdocs python -m mkdocs For a more permanent solution, you may need to edit your PATH environment variable to include the Scripts directory of your Python installation. Recent versions of Python include a script to do this for you. Navigate to your Python installation directory (for example C:\\Python38\\ ), open the Tools , then Scripts folder, and run the win_add2path.py file by double clicking on it. Alternatively, you can download the script and run it ( python win_add2path.py ).","title":"Installing MkDocs"},{"location":"user-guide/localizing-your-theme/","text":"Localizing Your Theme Display your theme in your preferred language. Note Theme localization only translates the text elements of the theme itself (such as \"next\" and \"previous\" links), not the actual content of your documentation. If you wish to create multilingual documentation, you need to combine theme localization as described here with a third-party internationalization/localization plugin. Installation For theme localization to work, you must use a theme which supports it and enable i18n (internationalization) support by installing mkdocs[i18n] : pip install mkdocs[i18n] Supported locales In most cases a locale is designated by the ISO-639-1 (2-letter) abbreviation for your language. However, a locale may also include a territory (or region or county) code as well. The language and territory must be separated by an underscore. For example, some possible locales for English might include en , en_AU , en_GB , and en_US . For a list of locales supported by the theme you are using, see that theme's documentation. mkdocs readthedocs Warning If you configure a language locale which is not yet supported by the theme that you are using, MkDocs will fall back to the theme's default locale. Usage To specify the locale that MkDocs should use, set the locale parameter of the theme configuration option to the appropriate code. For example, to build the mkdocs theme in French you would use the following in your mkdocs.yml configuration file: theme: name: mkdocs locale: fr Contributing theme translations If a theme has not yet been translated into your language, feel free to contribute a translation using the Translation Guide .","title":"Localizing"},{"location":"user-guide/localizing-your-theme/#localizing-your-theme","text":"Display your theme in your preferred language. Note Theme localization only translates the text elements of the theme itself (such as \"next\" and \"previous\" links), not the actual content of your documentation. If you wish to create multilingual documentation, you need to combine theme localization as described here with a third-party internationalization/localization plugin.","title":"Localizing Your Theme"},{"location":"user-guide/localizing-your-theme/#installation","text":"For theme localization to work, you must use a theme which supports it and enable i18n (internationalization) support by installing mkdocs[i18n] : pip install mkdocs[i18n]","title":"Installation"},{"location":"user-guide/localizing-your-theme/#supported-locales","text":"In most cases a locale is designated by the ISO-639-1 (2-letter) abbreviation for your language. However, a locale may also include a territory (or region or county) code as well. The language and territory must be separated by an underscore. For example, some possible locales for English might include en , en_AU , en_GB , and en_US . For a list of locales supported by the theme you are using, see that theme's documentation. mkdocs readthedocs Warning If you configure a language locale which is not yet supported by the theme that you are using, MkDocs will fall back to the theme's default locale.","title":"Supported locales"},{"location":"user-guide/localizing-your-theme/#usage","text":"To specify the locale that MkDocs should use, set the locale parameter of the theme configuration option to the appropriate code. For example, to build the mkdocs theme in French you would use the following in your mkdocs.yml configuration file: theme: name: mkdocs locale: fr","title":"Usage"},{"location":"user-guide/localizing-your-theme/#contributing-theme-translations","text":"If a theme has not yet been translated into your language, feel free to contribute a translation using the Translation Guide .","title":"Contributing theme translations"},{"location":"user-guide/writing-your-docs/","text":"Writing your docs How to layout and write your Markdown source files. File layout Your documentation source should be written as regular Markdown files (see Writing with Markdown below), and placed in the documentation directory . By default, this directory will be named docs and will exist at the top level of your project, alongside the mkdocs.yml configuration file. The simplest project you can create will look something like this: mkdocs.yml docs/ index.md By convention your project homepage should be named index.md (see Index pages below for details). Any of the following file extensions may be used for your Markdown source files: markdown , mdown , mkdn , mkd , md . All Markdown files included in your documentation directory will be rendered in the built site regardless of any settings. Note Files and directories with names which begin with a dot (for example: .foo.md or .bar/baz.md ) are ignored by MkDocs, which matches the behavior of most web servers. There is no option to override this behavior. You can also create multi-page documentation, by creating several Markdown files: mkdocs.yml docs/ index.md about.md license.md The file layout you use determines the URLs that are used for the generated pages. Given the above layout, pages would be generated for the following URLs: / /about/ /license/ You can also include your Markdown files in nested directories if that better suits your documentation layout. docs/ index.md user-guide/getting-started.md user-guide/configuration-options.md license.md Source files inside nested directories will cause pages to be generated with nested URLs, like so: / /user-guide/getting-started/ /user-guide/configuration-options/ /license/ Any files which are not identified as Markdown files (by their file extension) within the documentation directory are copied by MkDocs to the built site unaltered. See how to link to images and media below for details. Index pages When a directory is requested, by default, most web servers will return an index file (usually named index.html ) contained within that directory if one exists. For that reason, the homepage in all of the examples above has been named index.md , which MkDocs will render to index.html when building the site. Many repository hosting sites provide special treatment for README files by displaying the contents of the README file when browsing the contents of a directory. Therefore, MkDocs will allow you to name your index pages as README.md instead of index.md . In that way, when users are browsing your source code, the repository host can display the index page of that directory as it is a README file. However, when MkDocs renders your site, the file will be renamed to index.html so that the server will serve it as a proper index file. If both an index.md file and a README.md file are found in the same directory, then the index.md file is used and the README.md file is ignored. Configure Pages and Navigation The nav configuration setting in your mkdocs.yml file defines which pages are included in the global site navigation menu as well as the structure of that menu. If not provided, the navigation will be automatically created by discovering all the Markdown files in the documentation directory . An automatically created navigation configuration will always be sorted alphanumerically by file name (except that index files will always be listed first within a sub-section). You will need to manually define your navigation configuration if you would like your navigation menu sorted differently. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. If that option is set to the default value, docs , the source files for the above configuration would be located at docs/index.md and docs/about.md . The above example will result in two navigation items being created at the top level and with their titles inferred from the contents of the Markdown file or, if no title is defined within the file, of the file name. To override the title in the nav setting add a title right before the filename. nav: - Home: 'index.md' - About: 'about.md' Note that if a title is defined for a page in the navigation, that title will be used throughout the site for that page and will override any title defined within the page itself. Navigation sub-sections can be created by listing related pages together under a section title. For example: nav: - Home: 'index.md' - 'User Guide': - 'Writing your docs': 'writing-your-docs.md' - 'Styling your docs': 'styling-your-docs.md' - About: - 'License': 'license.md' - 'Release Notes': 'release-notes.md' With the above configuration we have three top level items: \"Home\", \"User Guide\" and \"About.\" \"Home\" is a link to the homepage for the site. Under the \"User Guide\" section two pages are listed: \"Writing your docs\" and \"Styling your docs.\" Under the \"About\" section two more pages are listed: \"License\" and \"Release Notes.\" Note that a section cannot have a page assigned to it. Sections are only containers for child pages and sub-sections. You may nest sections as deeply as you like. However, be careful that you don't make it too difficult for your users to navigate through the site navigation by over-complicating the nesting. While sections may mirror your directory structure, they do not have to. Any pages not listed in your navigation configuration will still be rendered and included with the built site, however, they will not be linked from the global navigation and will not be included in the previous and next links. Such pages will be \"hidden\" unless linked to directly. Writing with Markdown MkDocs pages must be authored in Markdown , a lightweight markup language which results in easy-to-read, easy-to-write plain text documents that can be converted to valid HTML documents in a predictable manner. MkDocs uses the Python-Markdown library to render Markdown documents to HTML. Python-Markdown is almost completely compliant with the reference implementation , although there are a few very minor differences . In addition to the base Markdown syntax which is common across all Markdown implementations, MkDocs includes support for extending the Markdown syntax with Python-Markdown extensions . See the MkDocs' markdown_extensions configuration setting for details on how to enable extensions. MkDocs includes some extensions by default, which are highlighted below. Internal links MkDocs allows you to interlink your documentation by using regular Markdown links . However, there are a few additional benefits to formatting those links specifically for MkDocs as outlined below. Linking to pages When linking between pages in the documentation you can simply use the regular Markdown linking syntax, including the relative path to the Markdown document you wish to link to. Please see the [project license](license.md) for further details. When the MkDocs build runs, these Markdown links will automatically be transformed into an HTML hyperlink to the appropriate HTML page. Warning Using absolute paths with links is not officially supported. Relative paths are adjusted by MkDocs to ensure they are always relative to the page. Absolute paths are not modified at all. This means that your links using absolute paths might work fine in your local environment but they might break once you deploy them to your production server. If the target documentation file is in another directory you'll need to make sure to include any relative directory path in the link. Please see the [project license](../about/license.md) for further details. The toc extension is used by MkDocs to generate an ID for every header in your Markdown documents. You can use that ID to link to a section within a target document by using an anchor link. The generated HTML will correctly transform the path portion of the link, and leave the anchor portion intact. Please see the [project license](about.md#license) for further details. Note that IDs are created from the text of a header. All text is converted to lowercase and any disallowed characters, including white-space, are converted to dashes. Consecutive dashes are then reduced to a single dash. There are a few configuration settings provided by the toc extension which you can set in your mkdocs.yml configuration file to alter the default behavior: permalink Generate permanent links at the end of each header. Default: False . When set to True the paragraph symbol (\u00b6 or ¶ ) is used as the link text. When set to a string, the provided string is used as the link text. For example, to use the hash symbol ( # ) instead, do: markdown_extensions: - toc: permalink: \"#\" baselevel Base level for headers. Default: 1 . This setting allows the header levels to be automatically adjusted to fit within the hierarchy of your HTML templates. For example, if the Markdown text for a page should not contain any headers higher than level 2 (), do: markdown_extensions: - toc: baselevel: 2 Then any headers in your document would be increased by 1. For example, the header # Header would be rendered as a level 2 header (
) in the HTML output. separator Word separator. Default: - . Character which replaces white-space in generated IDs. If you prefer underscores, then do: markdown_extensions: - toc: separator: \"_\" Note that if you would like to define multiple of the above settings, you must do so under a single toc entry in the markdown_extensions configuration option. markdown_extensions: - toc: permalink: \"#\" baselevel: 2 separator: \"_\" Linking to images and media As well as the Markdown source files, you can also include other file types in your documentation, which will be copied across when generating your documentation site. These might include images and other media. For example, if your project documentation needed to include a GitHub Pages CNAME file and a PNG formatted screenshot image then your file layout might look as follows: mkdocs.yml docs/ CNAME index.md about.md license.md img/ screenshot.png To include images in your documentation source files, simply use any of the regular Markdown image syntaxes: Cupcake indexer is a snazzy new project for indexing small cakes. ![Screenshot](img/screenshot.png) *Above: Cupcake indexer in progress* Your image will now be embedded when you build the documentation, and should also be previewed if you're working on the documentation with a Markdown editor. Linking from raw HTML Markdown allows document authors to fall back to raw HTML when the Markdown syntax does not meets the author's needs. MkDocs does not limit Markdown in this regard. However, as all raw HTML is ignored by the Markdown parser, MkDocs is not able to validate or convert links contained in raw HTML. When including internal links within raw HTML, you will need to manually format the link appropriately for the rendered document. Meta-Data MkDocs includes support for both YAML and MultiMarkdown style meta-data (often called front-matter). Meta-data consists of a series of keywords and values defined at the beginning of a Markdown document, which are stripped from the document prior to it being processing by Python-Markdown. The key/value pairs are passed by MkDocs to the page template. Therefore, if a theme includes support, the values of any keys can be displayed on the page or used to control the page rendering. See your theme's documentation for information about which keys may be supported, if any. In addition to displaying information in a template, MkDocs includes support for a few predefined meta-data keys which can alter the behavior of MkDocs for that specific page. The following keys are supported: template The template to use with the current page. By default, MkDocs uses the main.html template of a theme to render Markdown pages. You can use the template meta-data key to define a different template file for that specific page. The template file must be available on the path(s) defined in the theme's environment. title The \"title\" to use for the document. MkDocs will attempt to determine the title of a document in the following ways, in order: A title defined in the nav configuration setting for a document. A title defined in the title meta-data key of a document. A level 1 Markdown header on the first line of the document body. Please note that Setext-style headers are not supported. The filename of a document. Upon finding a title for a page, MkDoc does not continue checking any additional sources in the above list. YAML Style Meta-Data YAML style meta-data consists of YAML key/value pairs wrapped in YAML style delimiters to mark the start and/or end of the meta-data. The first line of a document must be --- . The meta-data ends at the first line containing an end deliminator (either --- or ... ). The content between the delimiters is parsed as YAML . --- title: My Document summary: A brief description of my document. authors: - Waylan Limberg - Tom Christie date: 2018-07-10 some_url: https://example.com --- This is the first paragraph of the document. YAML is able to detect data types. Therefore, in the above example, the values of title , summary and some_url are strings, the value of authors is a list of strings and the value of date is a datetime.date object. Note that the YAML keys are case sensitive and MkDocs expects keys to be all lowercase. The top level of the YAML must be a collection of key/value pairs, which results in a Python dict being returned. If any other type is returned or the YAML parser encounters an error, then MkDocs does not recognize the section as meta-data, the page's meta attribute will be empty, and the section is not removed from the document. MultiMarkdown Style Meta-Data MultiMarkdown style meta-data uses a format first introduced by the MultiMarkdown project. The data consists of a series of keywords and values defined at the beginning of a Markdown document, like this: Title: My Document Summary: A brief description of my document. Authors: Waylan Limberg Tom Christie Date: January 23, 2018 blank-value: some_url: https://example.com This is the first paragraph of the document. The keywords are case-insensitive and may consist of letters, numbers, underscores and dashes and must end with a colon. The values consist of anything following the colon on the line and may even be blank. If a line is indented by 4 or more spaces, that line is assumed to be an additional line of the value for the previous keyword. A keyword may have as many lines as desired. All lines are joined into a single string. The first blank line ends all meta-data for the document. Therefore, the first line of a document must not be blank. Note MkDocs does not support YAML style delimiters ( --- or ... ) for MultiMarkdown style meta-data. In fact, MkDocs relies on the the presence or absence of the delimiters to determine whether YAML style meta-data or MultiMarkdown style meta-data is being used. If the delimiters are detected, but the content between the delimiters is not valid YAML meta-data, MkDocs does not attempt to parse the content as MultiMarkdown style meta-data. Tables The tables extension adds a basic table syntax to Markdown which is popular across multiple implementations. The syntax is rather simple and is generally only useful for simple tabular data. A simple table looks like this: First Header | Second Header | Third Header ------------ | ------------- | ------------ Content Cell | Content Cell | Content Cell Content Cell | Content Cell | Content Cell If you wish, you can add a leading and tailing pipe to each line of the table: | First Header | Second Header | Third Header | | ------------ | ------------- | ------------ | | Content Cell | Content Cell | Content Cell | | Content Cell | Content Cell | Content Cell | Specify alignment for each column by adding colons to separator lines: First Header | Second Header | Third Header :----------- |:-------------:| -----------: Left | Center | Right Left | Center | Right Note that table cells cannot contain any block level elements and cannot contain multiple lines of text. They can, however, include inline Markdown as defined in Markdown's syntax rules. Additionally, a table must be surrounded by blank lines. There must be a blank line before and after the table. Fenced code blocks The fenced code blocks extension adds an alternate method of defining code blocks without indentation. The first line should contain 3 or more backtick ( ` ) characters, and the last line should contain the same number of backtick characters ( ` ): ``` Fenced code blocks are like Standard Markdown\u2019s regular code blocks, except that they\u2019re not indented and instead rely on start and end fence lines to delimit the code block. ``` With this approach, the language can optionally be specified on the first line after the backticks which informs any syntax highlighters of the language used: ```python def fn(): pass ``` Note that fenced code blocks can not be indented. Therefore, they cannot be nested inside list items, blockquotes, etc.","title":"Writing"},{"location":"user-guide/writing-your-docs/#writing-your-docs","text":"How to layout and write your Markdown source files.","title":"Writing your docs"},{"location":"user-guide/writing-your-docs/#file-layout","text":"Your documentation source should be written as regular Markdown files (see Writing with Markdown below), and placed in the documentation directory . By default, this directory will be named docs and will exist at the top level of your project, alongside the mkdocs.yml configuration file. The simplest project you can create will look something like this: mkdocs.yml docs/ index.md By convention your project homepage should be named index.md (see Index pages below for details). Any of the following file extensions may be used for your Markdown source files: markdown , mdown , mkdn , mkd , md . All Markdown files included in your documentation directory will be rendered in the built site regardless of any settings. Note Files and directories with names which begin with a dot (for example: .foo.md or .bar/baz.md ) are ignored by MkDocs, which matches the behavior of most web servers. There is no option to override this behavior. You can also create multi-page documentation, by creating several Markdown files: mkdocs.yml docs/ index.md about.md license.md The file layout you use determines the URLs that are used for the generated pages. Given the above layout, pages would be generated for the following URLs: / /about/ /license/ You can also include your Markdown files in nested directories if that better suits your documentation layout. docs/ index.md user-guide/getting-started.md user-guide/configuration-options.md license.md Source files inside nested directories will cause pages to be generated with nested URLs, like so: / /user-guide/getting-started/ /user-guide/configuration-options/ /license/ Any files which are not identified as Markdown files (by their file extension) within the documentation directory are copied by MkDocs to the built site unaltered. See how to link to images and media below for details.","title":"File layout"},{"location":"user-guide/writing-your-docs/#index-pages","text":"When a directory is requested, by default, most web servers will return an index file (usually named index.html ) contained within that directory if one exists. For that reason, the homepage in all of the examples above has been named index.md , which MkDocs will render to index.html when building the site. Many repository hosting sites provide special treatment for README files by displaying the contents of the README file when browsing the contents of a directory. Therefore, MkDocs will allow you to name your index pages as README.md instead of index.md . In that way, when users are browsing your source code, the repository host can display the index page of that directory as it is a README file. However, when MkDocs renders your site, the file will be renamed to index.html so that the server will serve it as a proper index file. If both an index.md file and a README.md file are found in the same directory, then the index.md file is used and the README.md file is ignored.","title":"Index pages"},{"location":"user-guide/writing-your-docs/#configure-pages-and-navigation","text":"The nav configuration setting in your mkdocs.yml file defines which pages are included in the global site navigation menu as well as the structure of that menu. If not provided, the navigation will be automatically created by discovering all the Markdown files in the documentation directory . An automatically created navigation configuration will always be sorted alphanumerically by file name (except that index files will always be listed first within a sub-section). You will need to manually define your navigation configuration if you would like your navigation menu sorted differently. A minimal navigation configuration could look like this: nav: - 'index.md' - 'about.md' All paths in the navigation configuration must be relative to the docs_dir configuration option. If that option is set to the default value, docs , the source files for the above configuration would be located at docs/index.md and docs/about.md . The above example will result in two navigation items being created at the top level and with their titles inferred from the contents of the Markdown file or, if no title is defined within the file, of the file name. To override the title in the nav setting add a title right before the filename. nav: - Home: 'index.md' - About: 'about.md' Note that if a title is defined for a page in the navigation, that title will be used throughout the site for that page and will override any title defined within the page itself. Navigation sub-sections can be created by listing related pages together under a section title. For example: nav: - Home: 'index.md' - 'User Guide': - 'Writing your docs': 'writing-your-docs.md' - 'Styling your docs': 'styling-your-docs.md' - About: - 'License': 'license.md' - 'Release Notes': 'release-notes.md' With the above configuration we have three top level items: \"Home\", \"User Guide\" and \"About.\" \"Home\" is a link to the homepage for the site. Under the \"User Guide\" section two pages are listed: \"Writing your docs\" and \"Styling your docs.\" Under the \"About\" section two more pages are listed: \"License\" and \"Release Notes.\" Note that a section cannot have a page assigned to it. Sections are only containers for child pages and sub-sections. You may nest sections as deeply as you like. However, be careful that you don't make it too difficult for your users to navigate through the site navigation by over-complicating the nesting. While sections may mirror your directory structure, they do not have to. Any pages not listed in your navigation configuration will still be rendered and included with the built site, however, they will not be linked from the global navigation and will not be included in the previous and next links. Such pages will be \"hidden\" unless linked to directly.","title":"Configure Pages and Navigation"},{"location":"user-guide/writing-your-docs/#writing-with-markdown","text":"MkDocs pages must be authored in Markdown , a lightweight markup language which results in easy-to-read, easy-to-write plain text documents that can be converted to valid HTML documents in a predictable manner. MkDocs uses the Python-Markdown library to render Markdown documents to HTML. Python-Markdown is almost completely compliant with the reference implementation , although there are a few very minor differences . In addition to the base Markdown syntax which is common across all Markdown implementations, MkDocs includes support for extending the Markdown syntax with Python-Markdown extensions . See the MkDocs' markdown_extensions configuration setting for details on how to enable extensions. MkDocs includes some extensions by default, which are highlighted below.","title":"Writing with Markdown"},{"location":"user-guide/writing-your-docs/#internal-links","text":"MkDocs allows you to interlink your documentation by using regular Markdown links . However, there are a few additional benefits to formatting those links specifically for MkDocs as outlined below.","title":"Internal links"},{"location":"user-guide/writing-your-docs/#linking-to-pages","text":"When linking between pages in the documentation you can simply use the regular Markdown linking syntax, including the relative path to the Markdown document you wish to link to. Please see the [project license](license.md) for further details. When the MkDocs build runs, these Markdown links will automatically be transformed into an HTML hyperlink to the appropriate HTML page. Warning Using absolute paths with links is not officially supported. Relative paths are adjusted by MkDocs to ensure they are always relative to the page. Absolute paths are not modified at all. This means that your links using absolute paths might work fine in your local environment but they might break once you deploy them to your production server. If the target documentation file is in another directory you'll need to make sure to include any relative directory path in the link. Please see the [project license](../about/license.md) for further details. The toc extension is used by MkDocs to generate an ID for every header in your Markdown documents. You can use that ID to link to a section within a target document by using an anchor link. The generated HTML will correctly transform the path portion of the link, and leave the anchor portion intact. Please see the [project license](about.md#license) for further details. Note that IDs are created from the text of a header. All text is converted to lowercase and any disallowed characters, including white-space, are converted to dashes. Consecutive dashes are then reduced to a single dash. There are a few configuration settings provided by the toc extension which you can set in your mkdocs.yml configuration file to alter the default behavior: permalink Generate permanent links at the end of each header. Default: False . When set to True the paragraph symbol (\u00b6 or ¶ ) is used as the link text. When set to a string, the provided string is used as the link text. For example, to use the hash symbol ( # ) instead, do: markdown_extensions: - toc: permalink: \"#\" baselevel Base level for headers. Default: 1 . This setting allows the header levels to be automatically adjusted to fit within the hierarchy of your HTML templates. For example, if the Markdown text for a page should not contain any headers higher than level 2 (
), do: markdown_extensions: - toc: baselevel: 2 Then any headers in your document would be increased by 1. For example, the header # Header would be rendered as a level 2 header (
) in the HTML output. separator Word separator. Default: - . Character which replaces white-space in generated IDs. If you prefer underscores, then do: markdown_extensions: - toc: separator: \"_\" Note that if you would like to define multiple of the above settings, you must do so under a single toc entry in the markdown_extensions configuration option. markdown_extensions: - toc: permalink: \"#\" baselevel: 2 separator: \"_\"","title":"Linking to pages"},{"location":"user-guide/writing-your-docs/#linking-to-images-and-media","text":"As well as the Markdown source files, you can also include other file types in your documentation, which will be copied across when generating your documentation site. These might include images and other media. For example, if your project documentation needed to include a GitHub Pages CNAME file and a PNG formatted screenshot image then your file layout might look as follows: mkdocs.yml docs/ CNAME index.md about.md license.md img/ screenshot.png To include images in your documentation source files, simply use any of the regular Markdown image syntaxes: Cupcake indexer is a snazzy new project for indexing small cakes. ![Screenshot](img/screenshot.png) *Above: Cupcake indexer in progress* Your image will now be embedded when you build the documentation, and should also be previewed if you're working on the documentation with a Markdown editor.","title":"Linking to images and media"},{"location":"user-guide/writing-your-docs/#linking-from-raw-html","text":"Markdown allows document authors to fall back to raw HTML when the Markdown syntax does not meets the author's needs. MkDocs does not limit Markdown in this regard. However, as all raw HTML is ignored by the Markdown parser, MkDocs is not able to validate or convert links contained in raw HTML. When including internal links within raw HTML, you will need to manually format the link appropriately for the rendered document.","title":"Linking from raw HTML"},{"location":"user-guide/writing-your-docs/#meta-data","text":"MkDocs includes support for both YAML and MultiMarkdown style meta-data (often called front-matter). Meta-data consists of a series of keywords and values defined at the beginning of a Markdown document, which are stripped from the document prior to it being processing by Python-Markdown. The key/value pairs are passed by MkDocs to the page template. Therefore, if a theme includes support, the values of any keys can be displayed on the page or used to control the page rendering. See your theme's documentation for information about which keys may be supported, if any. In addition to displaying information in a template, MkDocs includes support for a few predefined meta-data keys which can alter the behavior of MkDocs for that specific page. The following keys are supported: template The template to use with the current page. By default, MkDocs uses the main.html template of a theme to render Markdown pages. You can use the template meta-data key to define a different template file for that specific page. The template file must be available on the path(s) defined in the theme's environment. title The \"title\" to use for the document. MkDocs will attempt to determine the title of a document in the following ways, in order: A title defined in the nav configuration setting for a document. A title defined in the title meta-data key of a document. A level 1 Markdown header on the first line of the document body. Please note that Setext-style headers are not supported. The filename of a document. Upon finding a title for a page, MkDoc does not continue checking any additional sources in the above list.","title":"Meta-Data"},{"location":"user-guide/writing-your-docs/#yaml-style-meta-data","text":"YAML style meta-data consists of YAML key/value pairs wrapped in YAML style delimiters to mark the start and/or end of the meta-data. The first line of a document must be --- . The meta-data ends at the first line containing an end deliminator (either --- or ... ). The content between the delimiters is parsed as YAML . --- title: My Document summary: A brief description of my document. authors: - Waylan Limberg - Tom Christie date: 2018-07-10 some_url: https://example.com --- This is the first paragraph of the document. YAML is able to detect data types. Therefore, in the above example, the values of title , summary and some_url are strings, the value of authors is a list of strings and the value of date is a datetime.date object. Note that the YAML keys are case sensitive and MkDocs expects keys to be all lowercase. The top level of the YAML must be a collection of key/value pairs, which results in a Python dict being returned. If any other type is returned or the YAML parser encounters an error, then MkDocs does not recognize the section as meta-data, the page's meta attribute will be empty, and the section is not removed from the document.","title":"YAML Style Meta-Data"},{"location":"user-guide/writing-your-docs/#multimarkdown-style-meta-data","text":"MultiMarkdown style meta-data uses a format first introduced by the MultiMarkdown project. The data consists of a series of keywords and values defined at the beginning of a Markdown document, like this: Title: My Document Summary: A brief description of my document. Authors: Waylan Limberg Tom Christie Date: January 23, 2018 blank-value: some_url: https://example.com This is the first paragraph of the document. The keywords are case-insensitive and may consist of letters, numbers, underscores and dashes and must end with a colon. The values consist of anything following the colon on the line and may even be blank. If a line is indented by 4 or more spaces, that line is assumed to be an additional line of the value for the previous keyword. A keyword may have as many lines as desired. All lines are joined into a single string. The first blank line ends all meta-data for the document. Therefore, the first line of a document must not be blank. Note MkDocs does not support YAML style delimiters ( --- or ... ) for MultiMarkdown style meta-data. In fact, MkDocs relies on the the presence or absence of the delimiters to determine whether YAML style meta-data or MultiMarkdown style meta-data is being used. If the delimiters are detected, but the content between the delimiters is not valid YAML meta-data, MkDocs does not attempt to parse the content as MultiMarkdown style meta-data.","title":"MultiMarkdown Style Meta-Data"},{"location":"user-guide/writing-your-docs/#tables","text":"The tables extension adds a basic table syntax to Markdown which is popular across multiple implementations. The syntax is rather simple and is generally only useful for simple tabular data. A simple table looks like this: First Header | Second Header | Third Header ------------ | ------------- | ------------ Content Cell | Content Cell | Content Cell Content Cell | Content Cell | Content Cell If you wish, you can add a leading and tailing pipe to each line of the table: | First Header | Second Header | Third Header | | ------------ | ------------- | ------------ | | Content Cell | Content Cell | Content Cell | | Content Cell | Content Cell | Content Cell | Specify alignment for each column by adding colons to separator lines: First Header | Second Header | Third Header :----------- |:-------------:| -----------: Left | Center | Right Left | Center | Right Note that table cells cannot contain any block level elements and cannot contain multiple lines of text. They can, however, include inline Markdown as defined in Markdown's syntax rules. Additionally, a table must be surrounded by blank lines. There must be a blank line before and after the table.","title":"Tables"},{"location":"user-guide/writing-your-docs/#fenced-code-blocks","text":"The fenced code blocks extension adds an alternate method of defining code blocks without indentation. The first line should contain 3 or more backtick ( ` ) characters, and the last line should contain the same number of backtick characters ( ` ): ``` Fenced code blocks are like Standard Markdown\u2019s regular code blocks, except that they\u2019re not indented and instead rely on start and end fence lines to delimit the code block. ``` With this approach, the language can optionally be specified on the first line after the backticks which informs any syntax highlighters of the language used: ```python def fn(): pass ``` Note that fenced code blocks can not be indented. Therefore, they cannot be nested inside list items, blockquotes, etc.","title":"Fenced code blocks"}]} \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml index e9cf7ed..0ad339f 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -16,12 +16,12 @@
daily - https://www.zmta.info/collect/01_%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ +https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ 2023-09-03 daily - diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz index a29ec02..4f0cb81 100644 Binary files a/site/sitemap.xml.gz and b/site/sitemap.xml.gz differ diff --git a/site/user-guide/choosing-your-theme/index.html b/site/user-guide/choosing-your-theme/index.html index 5a7964a..1f75d13 100644 --- a/site/user-guide/choosing-your-theme/index.html +++ b/site/user-guide/choosing-your-theme/index.html @@ -171,7 +171,7 @@https://www.zmta.info/collect/%E7%9B%AE%E5%BD%95/ +https://www.zmta.info/collect/%E7%B2%BE%E5%93%81%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB/ 2023-09-03 daily - 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/cli/index.html b/site/user-guide/cli/index.html index 0c9349a..adc1187 100644 --- a/site/user-guide/cli/index.html +++ b/site/user-guide/cli/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/configuration/index.html b/site/user-guide/configuration/index.html index 111f9f9..f3eaa4e 100644 --- a/site/user-guide/configuration/index.html +++ b/site/user-guide/configuration/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/customizing-your-theme/index.html b/site/user-guide/customizing-your-theme/index.html index 886fd92..cbdd851 100644 --- a/site/user-guide/customizing-your-theme/index.html +++ b/site/user-guide/customizing-your-theme/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/deploying-your-docs/index.html b/site/user-guide/deploying-your-docs/index.html index e8546e9..18a55ec 100644 --- a/site/user-guide/deploying-your-docs/index.html +++ b/site/user-guide/deploying-your-docs/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/index.html b/site/user-guide/index.html index 77954a9..1dea320 100644 --- a/site/user-guide/index.html +++ b/site/user-guide/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/installation/index.html b/site/user-guide/installation/index.html index 01cca4c..fb3b6f4 100644 --- a/site/user-guide/installation/index.html +++ b/site/user-guide/installation/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/localizing-your-theme/index.html b/site/user-guide/localizing-your-theme/index.html index 98047fc..a97377f 100644 --- a/site/user-guide/localizing-your-theme/index.html +++ b/site/user-guide/localizing-your-theme/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总 diff --git a/site/user-guide/writing-your-docs/index.html b/site/user-guide/writing-your-docs/index.html index 34c8b20..a5b4cb9 100644 --- a/site/user-guide/writing-your-docs/index.html +++ b/site/user-guide/writing-your-docs/index.html @@ -171,7 +171,7 @@- 精品嵌入式资源汇总 + 精品嵌入式资源汇总