做异端中的异端 -- 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.mzph.cn/news/888267.shtml

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

相关文章

RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式

1、介绍 在软件开发领域&#xff0c;尤其是企业级应用开发中&#xff0c;灵活性、开放性、可扩展性往往是项目成功的关键因素。对于C/S项目&#xff0c;如何高效地与后端数据库进行交互&#xff0c;以及如何提供多样化的服务访问方式&#xff0c;是开发者需要深入考虑的问题。…

基于Pyside6开发一个通用的在线升级工具

UI main.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</class><widget class"QMainWindow" name"MainWindow"><property name"geometry"&…

Redis(配置文件属性解析)

一、tcp-backlog深度解析 tcp-backlog是一个TCP连接的队列&#xff0c;主要用于解决高并发场景下客户端慢连接问题。配置文件中的“511”就是队列的长度&#xff0c;对联与TCP的三次握手有关&#xff0c;不同的linux内核&#xff0c;backlog队列中存放的元素&#xff08;客户端…

24.12.02 Element

import { createApp } from vue // 引入elementPlus js库 css库 import ElementPlus from element-plus import element-plus/dist/index.css //中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn //图标库 import * as ElementPlusIconsVue from element-plus/i…

C++小问题

怎么分辨const修饰的是谁 是限定谁不能被改变的&#xff1f; 在C中&#xff0c;const关键字的用途和位置非常关键&#xff0c;它决定了谁不能被修改。const可以修饰变量、指针、引用等不同的对象&#xff0c;并且具体的作用取决于const的修饰位置。理解const的规则能够帮助我们…

在线家具商城基于 SpringBoot:设计模式与实现方法探究

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但是…

TongRDS分布式内存数据缓存中间件

命令 优势 支持高达10亿级的数据缓冲&#xff0c;内存优化管理&#xff0c;避免GC性能劣化。 高并发系统设计&#xff0c;可充分利用多CPU资源实现并行处理。 数据采用key-value多索引方式存储&#xff0c;字段类型和长度可配置。 支持多台服务并行运行&#xff0c;服务之间可互…

ambari metrics单机模式改成集群模式

最近碰到了ambari平台ambari metrics相关的lib较大&#xff0c;导致系统盘使用率较高。今天对这个组件进行转移到其他磁盘使用率低的服务器上&#xff0c;在安装好metrice collector组件后&#xff0c;发现启动时一直报如下错误。 通过报错可以定位到&#xff0c;该组件的模式是…

langchain实现基于sql的问答

1. 数据准备 import requestsurl "https://storage.googleapis.com/benchmarks-artifacts/chinook/Chinook.db"response requests.get(url)if response.status_code 200:# Open a local file in binary write modewith open("Chinook.db", "wb&qu…

安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析

在当今这个数据驱动的时代&#xff0c;数据库作为信息存储和检索的核心组件&#xff0c;其重要性不言而喻。然而&#xff0c;对于开发者而言&#xff0c;如何在保证数据安全的前提下&#xff0c;高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大&#xff0c;但存在诸…

VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法

问题描述 在VSCode中“Run Code”运行程序时&#xff0c;终端输出结果出现中文乱码现象&#xff1a; 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令&#xff1a; chcp输出结果是一段数字代码&#xff0c;如936&#xff0c;这说明当前的cmd编码方式…

【Python】ASCII-generator 将图像、文本或视频转换为 ASCII 艺术 生成字符图(测试代码)

目录 预览效果安装环境报错分析基本例程总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 欢迎关注 『Python』 系列&#xff0c;持续更新中 预览效果 原图 黑白图 彩色图 安装环境 拉取代码 https://github.com/vietnh1009/ASCII-generatorpython3.8 pip install…

Qt桌面应用开发 第十天(综合项目二 翻金币)

目录 1.主场景搭建 1.1重载绘制事件&#xff0c;绘制背景图和标题图片 1.2设置窗口标题&#xff0c;大小&#xff0c;图片 1.3退出按钮对应关闭窗口&#xff0c;连接信号 2.开始按钮创建 2.1封装MyPushButton类 2.2加载按钮上的图片 3.开始按钮跳跃效果 3.1按钮向上跳…

【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程

IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;是一款功能强大的集成开发环境&#xff0c;广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven&#xff0c;并创建一个 Maven Java 工程&#xff0c;快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …

利用Ubuntu批量下载modis图像(New)

由于最近modis原来批量下载的代码不再直接给出&#xff0c;因此&#xff0c;再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长&#xff0c;现在只给出一部分&#xff0c;需要自己再补充另一部分。之前的为&#xff1a; 感谢郭师兄的指导&#xff08;https://blo…

vue3图片报错转换为空白不显示的方法

vue3图片报错转换为空白不显示的方法 直接上代码&#xff1a; <el-table-column label"领料人" align"center"><template #default"scope"><el-imagev-if"scope.row.receiver":src"scope.row.receiver"style…

混沌工程/混沌测试/云原生测试/云平台测试

背景 私有云/公有云/混合云等具有复杂&#xff0c;分布式&#xff0c;环境多样性等特点&#xff0c;许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程&#xff0c;建立对系统抵御生产环境中失控条件的能力以及信心&#xff0c;提高系统面对未知风险得能力。 …

C++之 String 类的模拟实现

本文只简述string类模拟实现的重点&#xff0c;其余不再过多赘述 一、模拟实现string类的构造函数 本文主要实现下图两个构造函数&#xff0c;即string()和string(const string& str) 而关于string的底层&#xff0c;其实就是数组&#xff0c;在物理逻辑上是连续的空间&am…

数据结构基础之《(9)—归并排序》

一、什么是归并排序 1、整体是递归&#xff0c;左边排好序右边排好序merge让整体有序 2、让其整体有序的过程里用了排外序方法 3、利用master公式来求解时间复杂度 4、当然可以用非递归实现 二、归并排序说明 1、首先有一个f函数 void f(arr, L, R) 说明&#xff1a;在arr上…

UIE与ERNIE-Layout:智能视频问答任务初探

内容来自百度飞桨ai社区UIE与ERNIE-Layout&#xff1a;智能视频问答任务初探&#xff1a; 如有侵权&#xff0c;请联系删除 1 环境准备 In [2] # 安装依赖库 !pip install paddlenlp --upgrade !pip install paddleocr --upgrade !pip install paddlespeech --upgrade In …