做异端中的异端 -- Emacs裸奔之路4: 你不需要IDE

确切地说,你不需要在IDE里面编写或者阅读代码。

IDE用于Render资源文件比较合适,但处理文本,并不划算。
这的文本文件,包括源代码,配置文件,文档等非二进制文件。

先说说IDE带的便利:

  • 函数或者变量的自动补全
  • 函数或者类定义的跳转

但这些便利,是有代价的。
IDE需要不断地扫描项目中的源码,这是一个词法与语法分析的过程,与编译过程类似,只是不产生机器码而已。
这是一个非常耗时的过程,使用过Android Studio或者Eclipse的同学应该体验深刻,项目启动时实在太慢了。
启动之后,文件已经有修改,特别是Git分支切换或者版本回滚时,整个机器卡壳几十秒钟是时常的事。

而且IDE还要求文件是可以编译的,如果项目外文件或者项目文件不完整,还不能实现这两个功能。

插一个真事,有一次搞ROS开发,ROS包基本都是Cpp与Python,关键是ROS没有IDE,而且开源的项目文件非常多,有几个同事就瞎眼了。
经常找不到代码在哪里,时不时要问我,哪个功能在哪里,就算知道代码也找不到文件。这就是长期依赖IDE的后果。

所以,为这样两个功能,把机器搞得龟速,值得吗?

解决方案

这个问题,要权衡利弊,以退为进 – 放弃IDE,停止这种耗时扫描

对付文本文件,直接可以采用蛮力搜索。
具体地说,想找某个符号定义,直接在整个目录中搜索。对于库中的符号,第一次手输,之后使用字符串补全。
注意,这里对编程语言,项目能不能编译,是没有要求的。

看似暴力,但直接了当,逻辑简单,绿色无污染。

因为单个文本文件,很少会超过10M, 而整个项目的所有文本文件累计很少会超过50M。
grep整个目录通常就几秒的事情,而且大部分情况是一瞬间的事。

这样做的结果是:

  • 不再依赖于任何IDE
  • 不再依赖于项目管理
  • 不再受限于编程语言

这个思想不限于Emacs,我这前使用Vim也是这样干的。
不管Emacs还是Vim都是跨平台的,意味着你从Windows到Unix甚至Mac都是如履平地的。
有什么比这个更加有吸引力?

Vim可以使用Quickfix实现同样的功能。
这里只介绍Emacs的方案。

grep的关键一点是,可以反复地对结果进行筛选,这个非常非常重要。

想像一下grep一次给你1000条件记录,有多大意义?

但如果可以再次在这个1000中筛选,那就非常不一样。

简单反复筛选可以做到万里挑一!

举例

按这个思想,在QMK项目中,找程序入口,

这是一个相当规模的开源项目, 除去lib下的文件都有30000多个,这是wc统计的结果:

think@DESKTOP-70MSAQ1 MINGW64 /f/AA-MyWork/QMK/keychron/qmk_firmware (mykeyboard-v1)
$ git ls-files | wc -l
37042

从三万个文件中找出一个函数,并不容易:

  1. 搜索main, 得到7000多条记录
    在这里插入图片描述

  2. 搜索.c以过滤非C文件:
    在这里插入图片描述

  3. 搜索void int, 原因main函数的参数或返回值无非这两个
    在这里插入图片描述

  4. 搜索全字匹配main:
    在这里插入图片描述

至此,只有不到70项,可以肉眼找到程序入口了。

这个过程中的 所有buffer都是保留 ,意味着如果我第二步筛选的条件错了,还可以回到第一步结果中搜索,直到你满意。
这是包括Vim在内的很多软件无法做到的,但这个在试错过程中,又非常重要。

具体实现

代码非常简单,主要还是调用Emacs的grep与occur命令,再切换到结果窗口. 开头几行只为了保存历史。

(global-set-key (kbd (concat custom-user-prefix-key "/")) 'ich/grep)
(global-set-key (kbd (concat custom-user-prefix-key "l")) 'ich/occur)(defun ich/grep ( pattern directory )(interactive(list(custom/select-a-pattern "Please input a pattern (grep): ")(custom/select-a-directory "Please select a directory (grep): ")) )(custom/search-history-add pattern)(custom/save-search-history)(setq old-directory default-directory)(cd directory)  (grep (concat "rg . -n -H --no-heading -i -e " pattern))(cd old-directory)  (setq find nil)(setq i 0)(while (and (not find) (< i (length (window-list))))(if (equal "*grep*" (buffer-name))(setq find t)(other-window 1))(setq i (1+ i)))(if find(quit-window))(switch-to-buffer "*grep*"))(defun ich/occur ( pattern )(interactive(list(custom/select-a-pattern "Please input a pattern (occur): ")))(custom/search-history-add pattern)(custom/save-search-history)(occur pattern)(setq find nil)(setq i 0)(while (and (not find) (< i (length (window-list))))(if (equal "*Occur*" (buffer-name))(setq find t)(other-window 1))(setq i (1+ i)))(if find(quit-window))(switch-to-buffer "*Occur*"))

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

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

相关文章

【C++】编程题目分析与实现回顾:从浮点数运算到整型转换的全面解读

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目一&#xff1a;计算成绩问题分析与优化实现优化后的实现优势 &#x1f4af;题目二&#xff1a;浮点数向零舍入不同实现方式的比较1. 使用强制类型转换 (int)2. 使用标准…

时间表格Java

输入&#xff1a;XXX XXX 小时 分钟 输出&#xff1a; XXX&#xff1a;XXX ~ XXX: XXX XXX&#xff1a;XXX ~ XXX: XXX XXX&#xff1a;XXX ~ XXX: XXX 处理&#xff1a;间隔五分钟、区间45分钟 14:15 ~ 15:0 15:5 ~ 15:50 15:55 ~ 16:40 16:45 ~ 17:30 17:35 ~ 18:20…

Spring AOP 的实现和切点表达式的介绍

1. 快速入手 AOP&#xff1a;就是面相切面编程&#xff0c;切面指的就是某一类特定的问题&#xff0c;也可以理解为面相特定方法编程&#xff0c;例如之前使用的拦截器&#xff0c;就是 AOP 思想的一种应用&#xff0c;统一数据返回格式和统一异常处理也是 AOP 思想的实现方式…

shell脚本30个案例(五)

前言&#xff1a; 通过一个多月的shell学习&#xff0c;总共写出30个案例&#xff0c;分批次进行发布&#xff0c;这次总共发布了5个案例&#xff0c;希望能够对大家的学习和使用有所帮助&#xff0c;更多案例会在下期进行发布。 案例二十一、系统内核优化 1.问题&#xff1…

一文解析Kettle开源ETL工具!

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于数据抽取、转换和加载的软件工具&#xff0c;用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么&#xff1f; Kettle 是一款开源的 ETL&#x…

IDEA使用HotSwapHelper进行热部署

目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目&#xff0c;用jrebel启动项目时一直报错&#xff0c;不用jrebel时又没问题&#xff0c;找不到原因&#xff0c;又不想放弃热部署功能 因此思考能否通过其他方式进行热部署&#xff0c;找…

使用无监督机器学习算法进行预测性维护

目录 一、说明 二、主成分分析&#xff08;PCA&#xff09; 三、 K-means方法 四、K-最近邻 (KNN) 五、密度的空间聚类 (DBSCAN) 六、更先进的预测性维护算法 6.1 独立成分分析 (ICA) 6.2 PCA 和 ICA 有什么区别&#xff1f; 6.3 OPTICS 聚类 6.4 自组织映射 (SOM) 6.5 局部敏…

Elasticsearch 进阶

核心概念 索引(Index) 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母)&#xff0c;并且当我们要对这个索…

107.【C语言】数据结构之二叉树求总节点和第K层节点的个数

目录 1.求二叉树总的节点的个数 1.容易想到的方法 代码 缺陷 思考:能否在TreeSize函数内定义静态变量解决size的问题呢? 其他写法 运行结果 2.最好的方法:分而治之 代码 运行结果 2.求二叉树第K层节点的个数 错误代码 运行结果 修正 运行结果 其他写法 1.求二…

vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)

虚拟 DOM 和 真实DOM&#xff08;概念、作用、Diff 算法&#xff09; 1.1 概念 真实 DOM&#xff08;Document Object Model&#xff09;&#xff1a;是浏览器中用于表示文档结构的树形结构。 <h2>你好</h2>虚拟DOM&#xff1a;用 JavaScript 对象来模拟真实 DOM…

Spring AI 框架介绍

Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则&#xff08;如可移植性和模块化设计&#xff09;应用于AI领域&#xff0c;并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024/12)已经支持语言&#xff0c;图像&#xf…

matlab 中的 bug

在matlab中绘图&#xff0c;设置 axe 的背景颜色 axes_in3.Color #00235B ;打印的时候 print(figure_handle1,-dpng,-r300,"merge_yt_ey") ;此时保存的图片无法识别背景颜色 原因在于 matlab 中的 InverseHardcopy 将 InvertHardcopy 设置成 off 则可以解决这个问…

【数据库系列】Liquibase 与 Flyway 的详细对比

在现代软件开发中&#xff0c;数据库版本控制是一个至关重要的环节。为了解决数据库迁移和变更管理的问题&#xff0c;开发者们通常会使用工具&#xff0c;如 Liquibase 和 Flyway。本文将对这两个流行的数据库迁移工具进行详细比较&#xff0c;从基础概念、原理、优缺点到使用…

DVWA靶场通关——DOM型XSS漏洞

一、DOM型XSS攻击概述 DOM型XSS&#xff08;DOM-based Cross-Site Scripting&#xff0c;DOM XSS&#xff09;是一种跨站脚本攻击&#xff08;XSS&#xff09;的变种&#xff0c;它与传统的反射型XSS&#xff08;Reflected XSS&#xff09;或存储型XSS&#xff08;Stored XSS&a…

flink学习(14)—— 双流join

概述 Join:内连接 CoGroup&#xff1a;内连接&#xff0c;左连接&#xff0c;右连接 Interval Join&#xff1a;点对面 Join 1、Join 将有相同 Key 并且位于同一窗口中的两条流的元素进行关联。 2、Join 可以支持处理时间&#xff08;processing time&#xff09;和事件时…

设计模式——Facade(门面)设计模式

摘要 本文介绍了外观设计模式&#xff0c;这是一种通过简单接口封装复杂系统的设计模式。它简化了客户端与子系统之间的交互&#xff0c;降低了耦合度&#xff0c;并提供了统一的调用接口。文章还探讨了该模式的优缺点&#xff0c;并提供了类图实现和使用场景。 1. 外观设计模…

泷羽sec-burp功能介绍(1) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会

11月27日&#xff0c;由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办的OpenHarmony人才生态大会2024在武汉隆重举办。软通动力子公司鸿湖万联作为OpenHarmony项目群A类捐赠人应邀出席。大会期间&#xff0c;鸿湖万联不仅深度参与了OpenHarmony人才生态年…

简单快速的上手python

前言 python是一门可以快速上手的语言&#xff0c;原因是它语法简单&#xff0c;api容易使用自由灵活 当我们需要安装任何的三方库时&#xff0c;只需要执行 pip install XX 之后在代码里面import xxx就可以使用python啦。 并且python的代码自由灵活&#xff0c;使用缩进区…

【算法刷题指南】优先级队列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…