新吴区住房和建设交通局网站,服装设计效果图,企业邮箱怎么注册格式,石家庄最新封闭消息确切地说#xff0c;你不需要在IDE里面编写或者阅读代码。
IDE用于Render资源文件比较合适#xff0c;但处理文本#xff0c;并不划算。 这的文本文件#xff0c;包括源代码#xff0c;配置文件#xff0c;文档等非二进制文件。
先说说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统计的结果
thinkDESKTOP-70MSAQ1 MINGW64 /f/AA-MyWork/QMK/keychron/qmk_firmware (mykeyboard-v1)
$ git ls-files | wc -l
37042从三万个文件中找出一个函数并不容易 搜索main, 得到7000多条记录 搜索.c以过滤非C文件: 搜索void int, 原因main函数的参数或返回值无非这两个 搜索全字匹配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*))