自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(264)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 关于我,一些联系方式

双鱼座单身程序员一枚邮箱:[email protected]: 654170359微信公众号 hello programer

2019-03-17 21:36:11 519

原创 PDF标准详解(二)——PDF 对象

上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的 “Hello World” 的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。

2024-03-03 16:08:16 702

原创 PDF标准详解(一)——PDF文档结构

PDF的全称是 Portable document format(可移植文档格式),是描述打印页面的世界领先语言。最早于1990年代由Adobe Systems创造。早期是Adobe专有格式,直到2008年作为开放标准发布。后续经过一系列的发展,目前已经发展到了2.0版本,由于PDF完全向后兼容,并且大部分都是向前兼容的,因此,这里不打算固定在某个具体的版本,而是介绍一些PDF通用的标准和规则。

2024-01-28 22:04:04 1494 2

原创 2023 年度回顾与2024 年展望

时间如白驹过隙,转眼已经2024年了,本来打算2024年元旦那天写写年度回顾的,但是因为一些琐事耽误了,平时上班路程远回来也就懒得动了,一直就拖到今天才开始着手这个每年的例行公事。

2024-01-13 17:01:56 962

原创 从0开始自制解释器——重构代码

在上一篇文章中,完成了对括号的支持,这样整个程序就可以解析普通的算术表达式了。但是在解析两个括号的过程中发现有大量的地方需要进行索引的回退操作,索引的操作应该保证能得到争取的token,这个步骤应该放在词法分析的阶段,如果在语法分析阶段还要考虑下层词法分析的过程,就显得有些复杂了。而且随着后续支持的符号越来越多,可能又得在大量的地方进行这种索引变更的操作,代码将难以理解和维护。因此这里先停下来进行一次代码的重构。

2023-04-08 18:49:44 511 1

原创 从0开始自制解释器——添加对括号的支持

在上一篇我们添加了对乘除法的支持,也介绍了BNF范式,并且针对当前的算术表达式写出了对应的范式,同时根据范式给出相应的代码实现。这篇我们将继续为算数表达式添加对括号的支持。

2023-03-24 17:50:48 350

原创 从0开始自制解释器——添加对乘除法的支持

在上一篇中,我们实现了对减法的支持,并且介绍了语法图。针对简单的语法进行描述,用语法图描述当然是没问题的。但是针对一些复杂的语法进行描述,如果每个部分都通过语法图来描述就显得有些繁琐了。这篇我们先介绍另一种描述语法的方式,并进一步介绍一些关于语法分析的知识。

2023-03-22 16:51:42 285

原创 从0开始自制解释器——实现多个整数的加减法

在上一篇我们实现了一个可以计算两个多位整数加减法的计算器。本章我们继续来给这个计算器添加功能,这次要给它添加可以连续计算多个整数相加减的功能。例如我们可以计算1 + 2 + 3这样的表达式。

2023-03-14 17:42:20 243

原创 从0开始自制解释器——实现多位整数的加减法计算器

最后来一个总结。本篇我们对上一次的加法计算器进行了简单的改造,支持加减法、能跳过空格并且能够计算多位整数。在上一篇文章中,我们提到了Token,并且说过,像这样给字符串每个部分打上Token的过程就是词法分析。这部分代码可以被称之为词法分析器。这篇我们再来介绍一下其他的概念。词位(lexeme):词位的中文解释是语言词汇的基本单位。例如汉语的词位是汉字,英语的词位是基本的英文字母。对于我们这个加法计算器来说基本的词位就是数字以及+\-这两个符号。

2023-03-08 13:13:30 432 2

原创 从0开始自制解释器——实现简单的加法计算器

程序我们已经写完了,你可能觉得这个程序太简单了,只能做这点事情。别着急,后面将会逐步的去完善这个程序。以便它能实现更加复杂的运算。我们将输入内容按照一定规则打上的标记被称之为Token上述get_next_token函数体现的将一段字符串分割并打上有意义的标签的过程被称为词法分析。解释器工作的第一步就是将输入的字符串按照一定的规则转换为一系列有意义的标记。完成这个工作的组件被称之为词法分析器,也可以被称为扫描器或者分词器。

2023-03-07 11:42:30 444

原创 从0开始自制解释器——综述

当初看过《疯狂的程序员》这本书,书里说,真正能学会编译原理并不是靠看各种书然后通过相关考试,而是有一天你的领导找到你对你说:“小X啊,你是我们公司技术能力最强的人,咱们现在用的编译器性能有点跟不上,要不你看看能不能改进一下”。之前也看过类似的教你如何自制编译器,但是他们有一个共同的问题就是在很大程度上都借助第三方工具,隐藏了一些底层的细节。我希望的是每一行代码都是自己的完成的。而且根据我之前写的Vim专栏的经验来说,将它已专栏的形式发布出来之后鸽的可能性更小,更有动力来完成它。,我打算实用最纯粹的。

2023-03-04 11:10:35 391

原创 从零开始配置vim(32)——最后再说两句

很抱歉我决定结束这个系列的内容了。原本我打算介绍markdown、orgmode相关的配置,甚至还打算介绍如何在vim中使用emacs的org-agenda来进行日常的任务管理。但是出于一些原因我打算放弃了。首先如果将markdown 理解为另一种类似于HTML的标记语言的话,我们在介绍LSP的时候已经介绍过该如何新增新的编程语言的支持,再另外介绍Markdown的配置就显得多余了。而且本系列也并不打算事无巨细的带领大家从零开始配置一套完整的配置,我仅仅希望通过这一系列的内容介绍一下vimscript。

2023-02-04 11:31:46 629

原创 从零开始配置vim(31)——git 配置

很抱歉又拖更了这么久了,在这个新公司我想快速度过试用期,所以大部分的精力主要花在日常工作上面。但是这个系列还是得更新下去,平时只能抽有限的业余时间来准备。这就导致我写这些文章就慢了一些。废话不多说,咱们正式开始有关git相关的配置。这些配置都是根据我自身使用习惯来定义的,不一定符合各位的习惯,各位可以根据自身的习惯来调整。

2023-02-01 14:30:42 844

原创 从零开始配置vim(30)——DAP的其他配置

很抱歉这么久才来更新这一系列,主要是来新公司还在试用期,我希望在试用期干出点事来,所以摸鱼的时间就少了。加上前面自己阳了休息了一段时间。在想起来更新就过去一个多月了。废话不多说了,让我们开始进入正题。在前一章,我们谈论了如何在neovim中使用cpptools这个DAP的适配器对代码进行调试,目前针对编译型和解释型语言来说我们都有了对应的方法来配置调试器对其进行调试。本节将要介绍关于dap的其他一些功能,主要包括repl窗口和gdb的集成。

2022-12-30 16:57:31 1677 1

原创 换工作有感

最近很长一段时间没有更新博客,更新关于vim相关的操作,主要是最近在忙于换工作的事情。其实本来我也没打算换工作的,主要是最近公司的一些骚操作让我觉得心里很不爽,所以一怒之下提出离职。more。

2022-11-20 15:06:29 7063 24

原创 从零开始配置vim(29)——DAP 配置

首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接、背面试题准备面试。好在最终找到了工作,也顺利入职了。多的就不说了,我们正式进入vim的配置吧上一节通过配置python的调试环境,我们大概了解了配置dap的基本步骤。首先需要一个dap的客户端负责在编辑器上显示各种调试信息,并且与用户进行交互。然后需要一个服务端,与客户端通信并完成调试的实际步骤。然后需要配置两个东西,用来配置如何启动调试器,用来配置如何将当前项目加载到调试器上。本篇我们进一步配置dap。

2022-11-18 11:43:22 2560 1

原创 从零开始配置vim(28)——代码的编译、运行与调试

在前面几个章节,我们逐渐为Vim配置了语法高亮、代码的跳转和自动补全功能。现在的Vim已经可以作为代码编辑器来使用了。但是想将它作为日常发开的主力编辑器来用还需要很长一段路要走,其中一个就是要为它配置代码的一键编译与运行功能。这里我们仍然以C和Python为例。一个是需要编译运行的一个是直接就可以运行的,这两个语言应该能代表大多数语言的情况。

2022-10-24 17:05:29 3581

原创 从零开始配置vim(27)——代码片段

虽说这些插件预定义了大量的代码片段。但是他们都是通用型的代码片段,总有那么些时候无法满足我们的需求。一个明显的例子就是不同的公司有不同的代码和注释的风格。这个时候就需要我们自定义了。本篇也准备将重点放在如何自定义代码片段上。如果小伙伴们已经有了在vscode上自定义代码片段的经历,那么请跳过本篇以节省各位的时间。

2022-10-18 10:26:22 1216

原创 从零开始配置vim(26)——LSP UI 美化

之前我们通过几个实例演示如何配置其他语言的lsp服务,相信各位小伙伴碰到其他的编程语言也能熟练的配置它对应的lsp服务。本篇讲作为一个补充,我们来优化一下LSP 相关的显示。

2022-10-14 14:03:11 1883 3

原创 从零开始配置vim(25)——关于 c++ python 的配置

从9月份到国庆这段时间,因为得了女儿,于是回老家帮忙料理家事以及陪伴老婆和女儿。一时之间无暇顾及该系列教程的更新。等我回来的时候发现很多小伙伴私信我催更。言归正传,让我们开始吧之前我们根据lua语言配置了基于lsp的代码高亮、自动跳转、自动补全等等功能,那个时候我们安装了很多插件,像 nvim-lspconfig、nvim-lsp-installernvim-cmp等等,每个插件都在干嘛,虽然我们配置好了 lua相关的内容,但是可能仍然有小伙伴有疑问,碰到其他语言该如何配置,是不是要重新下载对应的插件呢。

2022-10-09 12:52:24 1870

原创 从零开始配置vim(24)——自动补全

neovim 自带的代码补全的效果并不好,而且它分为好多类,如果需要人为的去判断使用路径补全、使用当前buffer中的单词补全、亦或者使用include 来进行补全,那样使用起来就很不方便了。针对代码的补全我们可以基于 lsp的配置使用插件来完成,这里我推荐使用 nvim-cmp插件。

2022-09-08 09:32:02 3284 2

原创 从零开始配置vim(23)——lsp基础配置

上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色、自动格式化以及增量选中功能。算是初步体验了 lsp的相关功能。从这篇开始我们通过lsp的功能,进一步提升代码编辑、查阅等功能的体验。

2022-09-07 10:02:13 1915

原创 从零开始配置vim(22)——lsp简介与treesitter 配置

过去的编辑器包揽了诸如代码高亮、语法分析、跳转等功能,这样就导致了所有编辑器都有自己专有的一套显示、跳转等方案。而第三方编辑器想要达到完全相同的效果几乎是不可能的。但是微软提出的 lsp() 确改变了这一格局。lsp最重要的就是将语法分析、跳转、自动补全功能这些语言的核心功能和最终呈现效果分开。即server端主要提供了语法分析、补全、跳转的核心功能,而在客户端要做的就是调用服务端提供的这些功能来展示以及通过快捷键或者其他用户接口以便用户使用。而且语言服务器是以进程的方式单独运行,并不会影响客户端的运行。

2022-09-06 10:00:36 2269 1

原创 从零开始配置vim(21)——会话管理

很多代码编辑器都有这么一个功能,重新进入编辑器之后能恢复上次打开的所有文件,窗口布局,有的甚至是上次设置的一些配置。那么vim是否也可以实现这样的功能呢?答案是肯定的。使用vim自带的会话管理和viminfo可以实现恢复上次打开文件和布局以及重置上次的配置它们二者分别保存了不同的内容,一般会将它们联合起来使用。viminfo看起来很好像显的很杂一样,但是我觉得这些都不是需要记忆的,我们只需要知道使用使用viminfo和session可以恢复所有我们关心的内容即可,无需分辨哪些内容保存在哪个位置。

2022-09-05 13:46:16 788

原创 从零开始配置vim(20)——模糊查询

在讲解vim的基础功能的时候,介绍过了vim的各种查询技巧,在同一个文件中进行搜索的话,那些技巧很有用。在多个文件中我们介绍了使用vim自带的 :grep命令进行搜索,使用quickfix 列表进行跳转,但是比起其他代码编辑器来说,总归有那么一些繁琐光是输入参数都已经很麻烦了,我想要像其他代码编辑器那样直接输入内容它就能基于工程来进行匹配。本篇文章我们将要来对它进行优化,达到这一目的。本次我们要介绍的是神级插件telescope,一般只要介绍neovim。

2022-09-01 17:50:44 1784

原创 从零开始配置vim(19)——终端配置

在 packer 中我们使用如下语句来进行安装use {如果我们用的是 7.0及以上的neovim,可以使用它的 v2版本,否则版本这里应该写上 v1接着我们还是按照之前的惯例,新增一个配置文件并且在init.lua中引用})之后我们可以使用来打开一个新终端使用自定义终端可以让我们在某些时候快速打开一些有特定用途的终端,例如git命令、htop命令或者python、node等的交互式窗口。这里我们以python和htop为例来介绍如何自定义这些自己的终端窗口。...

2022-08-31 11:52:02 1352

原创 从零开始配置 vim(18)——终端模式

在进入下一个配置之前,先了解一下如何在neovim中使用它内置的终端。我们之前说过在命令模式中可以使用!来执行shell命令。但是终归来说,执行和使用上不是那么方便,特别是混合使用vim命令和shell命令的时候。两个揉在一起显得那么混乱。好在从早期的neovim和 8.0以后版本的vim已经内置了一个终端。...

2022-08-30 10:14:21 1414

原创 从零开始配置 vim(17)——快捷键提示

之前我们定义了各种各样的快捷键,有为了增强功能自定义的,有针对插件的。数量一多有的时候就不那么容易记忆了。要是每次要去配置文件找我定义了哪些快捷键肯定会影响使用的。本篇将要介绍一个插件,它是快捷键的一个词典,可以快速找到我们想要的快捷键。...

2022-08-19 10:19:33 885

原创 从零开始配置 vim(16)——启动界面配置

中间部分表示的是它显示为这块的内容。我们可以使用来定义是一个table。它的每个部分对应着一条显示。每条显示和功能我们可以使用如下字段来进行定制icon: 当前显示图标desc:某个功能的描述信息,后面会原样显示出来shortcut:快捷键action:在某项位置回车时执行的命令我们按照官方给出的截图上的功能进行定义{其他地方的功能我们先不管,暂时在action这个字段上填上空,我们先实现最后打开个人配置文件那个位置的代码,我们在action中填入。再次打开,我们发现它已经可以显示这些内容了。...

2022-08-18 10:04:26 2217 1

原创 从零开始配置 vim(15)——状态栏配置

vim下侧有一个状态栏,会显示当前打开的文件等一系列内容,只是我们很少去关注它。而且原生的vim也支持对状态栏进行自定义。这篇文章主要介绍如何自定义状态栏。

2022-08-17 09:53:48 1923 2

原创 从零开始配置 vim(14)——目录管理插件

我们在介绍vim目录管理的时候提到 vim自带一个 叫做 netrw的工具来管理目录。但是它自身的功能有限,而且样式也丑。今天我们将使用其他强大的插件来替代 netrw,增强目录管理功能。

2022-08-16 14:46:20 1243

原创 从零开始配置 vim(13)——标签页插件

原始的vim中标签页已经足够好用了。你完全可以使用原始 vim 提供的功能,但是使用插件可以让它更好看。这里我比较喜欢使用bufferline这个插件。

2022-08-12 10:51:05 770

原创 从零开始配置 vim(12)——主题配置

在我们进一步增强vim的功能之前,我们先为vim准备一个漂亮的主题,毕竟对着一个丑陋原始的界面多少有点提不起劲来进行编程。长时间对着丑陋的界面多多少少会产生抑郁情绪的。下面推荐几款我觉得还不错的主题插件。...

2022-08-11 10:11:37 2032

原创 从零开始配置 vim(11)——插件管理

之前我们介绍了基础配置部分和快捷键配置部分。如果你配置了这两个部分,vim已经算是比较好用了。但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心。vim比较强大的一点是它拥有丰富的插件系统。大量高手在上面为它开发各种形式的插件。今天我们将从插件管理开始,利用前人的成果丰富我们的vim功能。...

2022-08-10 09:29:52 1096

原创 从零开始配置 vim(10)——快捷键配置

之前我们对neovim进行了基础的配置,这篇主要介绍我比较常用的快捷键配置。到这篇开始我们的配置已经可以为两个大的模块——基础配置和快捷键配置。我们的目录也应该按照模块来进行组织。在正式配置之前让我们先规划一下目录结构。当前我打算采用如下的目录格式├── 📂 lua│ ├── 🌑 basic.lua # 用来存储基础配置│ ├── 🌑 keybindings.lua # 用来存储快捷键配置└── 🌑 init.lua # 配置文件入口,主要用来加载其他配置文件。...

2022-08-09 09:38:22 1461

原创 从零开始配置 vim(9)——初始配置

虽然本系列文章叫做从0开始配置vim,似乎我们从一开始就要写vimrc配置文件,但是我们并没有这么做。我们先经过几篇文章了解了下面的几个内容这些既有vimscript的东西,也有vim自身一些特性的描述。拥有这些基础知识之后,在阅读其他人写的配置或者自己配置将会变得更加容易。当然关于vim我们还有很多内容没有讲,例如该如何自定义命令,如何弹出一个窗口,以及到最后如何编写自己的插件。...

2022-08-08 13:19:53 963

原创 从零开始配置 vim(8)——文件类型检测

在vim中可以使用来打开文件类型检测,而在neovim中已经默认打开了这些属性,因此我们可以不设置这些。我们可以使用:filetype来查看打开的状态。它会返回如下的内容我们发现它包含了三个部分。它打开了三个东西,文件类型检测,针对文件类型相关的插件,针对文件类型相关的缩进和隐藏代码块的格式。下面我们依次来介绍这些东西vim可以根据文件后缀和文件内容来决定文件类型。如果无法决定也可以使用set ft来设置,或者在文件头部添加注释vim: ft=来知名类型。...

2022-08-05 10:15:14 909

原创 从零开始配置 vim(7)——自动命令

这篇我们来谈论vim一个相当重要的东西——自动命令。从编程的角度来看,自动命令有点类似于事件响应,或者回调函数之类。当外部发生某些事件的时候,自动执行事先定义好的一组命令。定义一个自动命令的格式如下autocmdjsfunctiontypepatterncmd说了这么多,我们以一个例子来说明:当我们使用vim打开一个不存在的文件,如果直接退出,我们会发现它并没有被保存。因为打开一个不存在的文件时vim并没有真的在磁盘中创建这么一个文件,它仅仅新开了一个缓冲区,当执行写命令的时候才真正会创建文件。...

2022-08-04 11:12:56 938

原创 从零开始配置 vim(6)——缩写

翻译成中文的意思大概是缩写。但是仅仅以缩写来描述这个特性,似乎是不够的,但是也找不到准确的中文来描述,暂时就采用这个名称吧。它的这个特性允许我们将输入的一段内容自动更新为新的内容我们先来体验一下它的基本用法。在命令中输入我们输入mian(后它会自动将内容替换为main(。这样即使我们手误将main写成了mian,vim能自动帮我们更新。再也不用怕编辑器报找不到main函数了我们发现了它的第一个用途——纠正笔误。但是基于这一特性,我们还可以使用几个简单的字符来快速展开成常用的长文本。例如通过输入。...

2022-08-03 10:22:17 336

原创 从零开始配置 vim(5)——本地设置与全局设置

在前面的一系列文章中,我们介绍了使用noremap进行键盘映射,使用set来设置选项和vim的变量。并且已经在配置文件中对他们进行了相关配置。在介绍设置那一篇文章中我们提到了,lua提供的函数有全局设置、窗口设置和缓冲区设置。当初有小伙伴在评论区问到相关问题,现在我们就来详细的解释这些之前被搁置的内容。.........

2022-08-02 11:09:17 488

MSHTMLDemo

一个在控制台下使用MShtml解析HTML文档的demo

2017-06-01

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除