精华内容
下载资源
问答
  • JSPatchX 是 JSPatch Xcode 代码自动补全插件,目前在 github 开源,效果见图: 做完一个开源项目照例写篇文章说明下...写 JSPatch 脚本一个不爽的地方就是没有代码补全,而调用 OC 方法时方法名又死长,写起来很

    JSPatchX JSPatch Xcode 代码自动补全插件,目前在 github 开源,效果见图:

    做完一个开源项目照例写篇文章说明下实现原理,主要目的是让想对这个项目做贡献改进的人可以通过文章更容易地了解这个项目的由来,思路,核心原理和流程,降低参与这个项目开发的门槛。

    由来

    JSPatch 脚本一个不爽的地方就是没有代码补全,而调用 OC 方法时方法名又死长,写起来很不方便。

    对此之前做了 JSPatch Convertor,可以自动把 OC 代码转为 JSPatch 脚本,这个工具的使用场景是用 JSPatch 做 hotfix 时,需要重写原 OC 的整个方法,这时用工具把这个方法的 OC 代码直接转为 JS 再进行修改,可以很大地降低工作量,缓解了这个问题。但若要用 JSPatch 开发新功能模块,就不会有 OC 代码可以去转换,这时提高编码效率的唯一方式就是做代码补全插件。

    在寻找实现方案的时候得知公司内一牛人 louis 已经实现了 lua 的 XCode 代码补全插件,沟通后还很慷慨地给了源码,省去了很多研究 XCode 代码补全机制的功夫,于是参考他的编码,并且直接用了他 OC 头文件解析的代码,开发了 JSPatchX。所以这个项目算是我与 louis 联合开发的,在此感谢 louis~

    插件入门

    XCode 有个很坑爹的地方,就是它并不官方支持插件开发,官方没有文档,XCode 也没有开源,但由于 XCode 是 Objective-C 写的,OC 动态性太强大,导致在这么封闭的情况下民间还是可以做出各种插件,其核心开发方式就是:

    1. dump 出 Xcode 所有头文件,知道 Xcode 里有哪些类和接口。
    2. 通过头文件方法名猜测方法的作用,swizzle 这些方法,插入自己的代码实现插件逻辑。
    3. 通过 NSNotificationCenter 监听各种事件的发生。

    更详细的开发教程网上有不少文章,有兴趣的自行搜索吧。

    起步

    对于实现 JS 代码补全这个功能来说,主要分三步:

    1. 在编辑 JS 文件时开启代码补全功能。
    2. 找到用户输入代码时的回调,按 Xcode 要求组装代码补全对象数组返回。
    3. 根据已输入文字对补全对象数组进行过滤

    第一步是通过替换 DVTTextCompletionDataSource 类里的 -strategies 方法,在源文件是 JS 时生成一个 IDEIndexCompletionStrategy 对象返回,就可以针对 JS 文件走代码补全逻辑了。

    第二步是替换 IDEIndexCompletionStrategy- completionItemsForDocumentLocation:context:highlyLikelyCompletionItems:areDefinitive: 方法,这个方法会在用户输入时被调用,在这里组装好应该出现的补全对象(IDEIndexCompletionItem) 列表返回,Xcode 就会自动应用返回的 items 对输入进行补全。

    第三步是在 DVTTextCompletionSession-_setFilteringPrefix:forceFilter: 方法,针对第二步返回的 item 对象根据输入进行过滤。

    要让自动补全插件程序跑通,只需实现上述三步。显然核心在第二步如何组装合适的补全对象 completionItem。代码里我们新增了一个 IDEIndexCompletionItem 的子类 JPCompletionItem 去表示,下面统一把这个补全对象称为 completionItem。接下来的问题就是怎样组装这些 completionItem。

    实现

    先看看我们需要哪些自动补全,概括起来有几种:

    1. 可能会被调用到的 OC 方法名
    2. JS 上新增的方法名,以及出现的类名
    3. JSPatch 自身的一些关键字接口,如 defineClass, require 等
    4. 当前 JS 文件里出现过的关键字

    前三点应该没有异议,第四点要解释一下,实际上若要做得精细,应该加上 JS 语言本身自带的 API 和关键字(var / Math 函数 / String 函数等),以及JS 当前作用域上的变量的补全,但这样做一是 API 太多,二是实现复杂,所以用 “当前 JS 文件里出现过的关键字” 代替这两点,只要文件里出现过的单词就会有补全提示,也就是说一些关键字和变量第一次输入时没有提示,但在同个文件第二次输入就有补全提示了,sublime 默认就是这样的补全规则,实际使用效果很好,所以选择用这种简单的方式满足需求。

    具体实现上,分三步走,一是解析 OC 头文件,二是解析 JS 文件,三是对解析后的数据进行缓存和组装 completionItem。

    解析 OC 头文件

    JPObjcFile 负责解析 OC 头文件,因为这里可以认为外部可以调用的 OC 接口都在头文件里,所以只需要解析头文件,这样处理比较简单,解析效率也很高。louis写了个 OC 头文件解析器,把头文件里的 class / protocol / import 解析出来,最终每个头文件都会解析成对应的 JPObjcFile 对象,这个对象保存着文件里 class / protocol 对应的方法的 completionItems,可以按需求直接输出。

    解析 JS 文件

    JPJSFile 负责解析 JS 文件,这里的解析比较简单,没有用词法语法解析器,而是直接通过正则匹配取出需要的内容,这里通过正则提取了:

    1. require() 里的 className
    2. defineClass() 里的 className
    3. defineClass() 里所有的方法名
    4. 文件里所有 keyword

    同样每个 JS 文件都会生成一个 JPJSFile 对象,包含了上述提取的元素,并生成和保存了方法名和keyword对应的 completionItems列表。

    组装和缓存

    解决了单个 OC / JS 文件的解析,接着就是决定解析哪些文件,以什么样的形式缓存和组装返回给XCode。

    JPObjcIndex

    先看看 OC 的解析,JPObjcIndex 负责 OC 头文件的解析,JS 可能调用到的 OC 代码只存在于两个地方,一是系统framework,二是项目里的代码,对这些 OC 头文件要以什么样的方式解析呢?这里有两个选择:

    1. 只解析与当前编辑的 JS 文件相关的 OC 头文件
    2. 一次性把所有文件都解析好,再进行筛选

    若要用方案1,只解析与当前编辑的 JS 文件相关的文件,则需要知道 JS 文件引用到了哪些 OC 文件,需要像 OC 代码那样有 #import 其他文件的规则,而 JSPatch 的规则是调用 OC 代码时不需要 import OC 文件,只需要通过 require(‘className') 接口引入类,所以线索只有 require() 里的类名,而在还没解析时是不清楚类名和 OC 文件的对应关系的,无法知道当前 JS 文件依赖了哪些 OC 头文件,所以这里只能选择一次性把所有 OC 头文件都解析好。

    JPObjcIndex 默认扫描了 Foundation 和 UIKit 这两个 framework 里的所有头文件,以及当前项目里的所有 OC 头文件,在 JPObjcIndex 里以 className 为 key 进行缓存,对外提供通过 className 去取这些类相应 completionItem 的接口。

    JPJSIndex

    对于 JS 文件,为了简单起见,同样采用了一次性解析全部文件的方式。JPJSIndex 做了以下这些事:

    1. 解析所有 JS 文件,生成一个个对应的 JPJSFile 对象,缓存起来。
    2. 取出每个 JPJSFile 里解析的 require() 以及 defineClass() 的 className,去 JPObjcIndex 取这些 Class 对应的 completionItems。
    3. 取出每个 JPJSFile 解析好的 method completionItems。
    4. 取出每个 JPJSFile 解析好的 keyword completionItems。
    5. 本地 keyword.plist 定义了 JSPatch 常用的一些自动补全关键字,例如 defineClass, CGRect 等,在这里取出这些数据并生成 completionItems。
    6. 把 2-5 步里的 completionItems 分成两种类型,keyword 类型和 method 类型,缓存起来并返回给 XCode。
    7. 当有 JS 文件保存时,重新对这个文件生成 JPJSFile 对象,并重做 2-6 步。

    第6步分出来的两种类型应用于两种场景,method 类型会在 JS 输入 . 要进行方法调用时出现,这个类型里所有的 completionItem 都是方法,包括 OC 头文件定义的方法以及 JS 里解析的方法。keyword 类型则是其他的像类名/语句关键字等这些非方法,在平常输入中出现。

    在没有 JS 文件保存时,用户编辑 JS 代码每一次输入走到补全逻辑时,JPJSIndex 都是直接返回内存里已组装好的 completionItems 列表,没有其他操作,提高操作性能。第7步虽然在有文件保存时重新做了 2-6 步对数据进行重新组装,但这个过程不涉及文件解析,只需要取内存里解析好的数据进行组装,并且文件保存不会那么频繁,所以性能上没有太大问题。

    整个流程就是这样,实际上很简单,总结起来就是解析所有 OC 头文件,解析所有 JS 文件,组装并缓存好 completionItem 返回。

    不足

    做这个项目的想法是先用最简单的方式快速做出来,满足80%的需求,导致会有一些不足,例如

    1. 没有做 JS 语法解析,没有做细致的筛选规则,粗暴地全部提示。
    2. 没有补全 include 的其他 JS 文件里的全局变量。
    3. defineClass 里写定义方法时,若要覆盖 OC 原有方法,没有方法名补全(因为方法名只有在 . 后才有补全)
    4. 没有加上除了 Foundation 和 UIKit 以外的 framework。

    欢迎一起改进 JSPatchX,完善这些不足~


    转自bang

    展开全文
  • Xcode自动补全失效问题

    千次阅读 2018-01-15 11:28:25
    1. 退出 Xcode 2. 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData) 3. 删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode)
    1. 退出 Xcode
    2. 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData)
    3. 删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode)
    展开全文
  • Xcode自动补全失效问题[转]

    千次阅读 2019-01-03 09:30:42
    退出 Xcode 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData) 删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode) 作者:冰淇淋太烫 来源:CSDN ...
    1. 退出 Xcode
    2. 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData)
    3. 删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode)

    作者:冰淇淋太烫
    来源:CSDN
    原文:https://blog.csdn.net/sinat_29998157/article/details/79062596
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • YCM推荐选项由于C++语言的复杂性,根据语义对C++进行代码补全并非易事。最近浏览YouCompleteMe项目,发现它已经开始向用户推荐使用clangd作为C++ Completer。与libclang相比,YCM列举了不少clangd的优势(如下图所示...

    YCM推荐选项

    由于C++语言的复杂性,根据语义对C++进行代码补全并非易事。最近浏览YouCompleteMe项目,发现它已经开始向用户推荐使用clangd作为C++ Completer。与libclang相比,YCM列举了不少clangd的优势(如下图所示)。简单讲,clangd的好处有:全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等。

    082386da53bd203aa93d0361dac63006.png
    图1 YCM列举的clangd优势

    YCM的建议也呼应了2018年XCode团队将目光从libclang转向clangd的动作。尽管YCM的install.py脚本依旧将clang completer列为测试功能。但看过clangd的优点,让人不禁期待尝试一番。

    8177900c5aa03819fc86b42b213425e3.png
    图2 YCM依旧讲clangd-completer标注为测试功能

    谈到clangd,就不得不提及LSP(Language Server Protocol)。为了减少插件作者在不同编辑器上的重复工作,LSP协议定义了补全器前端和补全器后端的接口。这就使得插件作者只需要针对某款编辑器开发LSP前端插件,保证其能够跟类似clangd的补全器后端进程通信接口。一般情况下,当编辑器打开后,补全器后端进程便会被创建。当编辑器关闭后,补全器后端进程也会随着终止。clangd就是LLVM团队开发的C系语言补全器,可以为C、C++、Objective-C等语言提供代码补全、跳转等服务。

    作为知名C++ completer,可以与clangd配合工作的编辑器插件不在少数。在Vim编辑器上就有YCM、vim-lsp等插件,在VSCode上也有LLVM团队提供的clangd同名插件。下面,我将介绍在VSCode上使用clangd完成C++代码补全的过程。

    安装clangd

    由于clangd的工作原理与代码编译过程联系紧密,所以我建议大家在可以对项目进行编译的环境安装clangd程序。根据LLVM的官方说明,大部分Linux开发版都提供了clangd二进制包。在Ubuntu 19.10和Ubuntu 20.04上,只需要执行如下指令便可以安装clangd。

    sudo apt install clangd

    在安装好clangd后,还需要安装与clangd交互的LSP前端。我这里选择以VSCode Remote-SSH方式安装clangd插件。

    42a5128f4daa7993834f66e163cce2ca.png
    图3 VSCode插件clangd

    远程安装成功后,我们可以在~/.vscode-server/extensions/目录下看到插件llvm-vs-code-extensions

    配置Compilation Database

    接下来,就需要为目标项目配置Compilation Database。由于clangd依赖编译器前端提供索引和AST信息,这也注定了clangd在提供高准确跳转/补全的同时,也要用户配置好项目的“编译说明”,这个“编译说明”便被称为Compilation Database。

    在clangd看来,Compilation Database是一个名为compile_commands.json的JSON文件,它会记录每个.c/.cpp文件的编译依赖和编译选项(如图4所示)。如果一个项目源码文件较多,可以借助bear等工具在项目编译过程中记录相关编译选项。

    # 为使用GNU make的项目创建Compilation Database
    sudo apt install bear
    bear make

    ea1a901e6d39cbc3286fb6194815e2a4.png
    图4 Compilation Database中某.c文件的编译信息

    在Compilation Database创建成功后,便可以通过VSCode Remote-SSH打开某C/C++项目代码。启动后端clangd进程会主动寻找项目根目录下的compile_commands.json文件,并根据文件中记录的编译信息,在项目根目录下的.clangd文件夹中生成相关索引文件。下面是clangd前后端配合,为用户提供的类似Visual Studio IntelliSense功能。

    24f4ebbe32627832f6a6017e91cb767a.gif
    图5 clangd提供帮助信息、代码补全、引用查看等功能

    资源消耗

    目前看来,在配置好Compilation Database后,clangd的各项功能运转正常、反应灵敏,其能够实现跨Translation Unit(TU)的补全/跳转。但其资源占用也同样可观。对于一个32MB源码量的C语言项目,compile_commands.json文件达到了526KB(当然这个跟项目中源代码文件数有关),而后台clangd进程则占用了127MB物理内存。

    24bb8df9f1e867ae25b7ebccbbc206bd.png
    图6 top显示的clangd资源占用情况

    综合来看,通过clangd实现C++代码补全的方案还是值得尝试的。与VSCode提供的C/C++ Extension相比,clangd的优势应该是在开源可控,满足大家DIY的需求。

    展开全文
  • 以前好像很少碰到Xcode代码提示出问题的情况,即使碰到了大多也是后来自然的就好了,最近换用了Xcode4.3,经常遇到这个问题。 通过无所不能的谷歌大神,找到了苹果论坛上提供的一个解决方案...
  • xcode 不能自动代码补全解决方案

    千次阅读 2013-11-07 11:33:51
  • Mac 10.10.2 Xcode6 代码自动补全插件安装
  • 解决:finder --- 个人---资源库--Developer--Xcode -- DerivedData DerivedData底下你的项目 + ModuleCache 一起删掉 ,然后重启XCDOE 就可以了 经本人验证,确实可行。
  • iOS自定义代码补全

    2016-01-03 18:22:20
    我们在Xcode中编写代码的时候,有时只需敲出一个字母,Xcode就会根据需要自动帮我们补全代码,既方便又省事,既然这么方便,我们可不可以自己定义需要补全代码呢?当然是可以的, 1.把要设置的代码敲出来 2...
  • 今天遇到了这种情况,网上搜索了一下,记录如下: 1: 删除Derived Data . Window->Organizar->Projects, 然后点击Delete删除Derived Data,关闭Xcode重新打开工程. 2: 包含头文件问题,如果引用了buil
  • Xcode 中的Target Membership 选项是否未被选中? 如图所示 转载于:https://www.cnblogs.com/liqiwa/p/5551940.html
  • /Users/"UserName"/Library/Developer/Xcode 前往文件夹:~/Library/Developer/Xcode/DerivedData 解决:finder --- 个人---资源库--Developer--Xcode -- DerivedData DerivedData 底下你的项目 + ModuleCache 一起...
  • 删除source中的中文注释即可
  • 代码补全时可以不用从头开始敲,只要记得某个特定词汇就能匹配到。 并且对于项目中有好几种前缀的比如我们以前有的事MT前缀有的是MTB前缀,这种就算你前缀敲漏了只要后面对了也能匹配的到。当然也有弊端就是你敲一个...
  • 在广大程序员用 Vim 敲代码的过程中,代码补全功能能够大大提高生产力,尤其是对于从各种 IDE 转到 Vim 的程序员来说更是福音般地存在。本文将介绍一种推荐的代码补全工具 YouCompleteMe,并且一步步介绍它的安装...
  • 问题发生在改完文件名之后,然后在写代码的时候就不能联想了。重启Xcode就行了。 重启前(清一色的灰色): 重启后(五彩斑斓): (当然,大神可以忽略这类问题,对于我这样的小白,没有填充简直要命!!) ...
  • FuzzyAutocompletePlugin是一个Xcode 5兼容的插件,通过添加模糊匹配来提高Xcode代码自动补全功能。 开发者无需遵循从头匹配的原则,只要记得方法里某个关键字即可进行匹配,很好地提高了工作效率。 注意:该...
  • YouCompleteMe 是一个快速,即时,允许模糊搜索的 Vim 代码补全引擎。除了支持缓冲区关键字补全外,还支持 C/C++/Objective-C/Objective-C++,Python(Jedi-based),C#(OmniSharp-based),Go(Gocode-based)的...
  • TeaCode 是一个功能强大的应用程序,通过这个应用程序可以快速编写代码,通过扩充简短的、动态的代码样板转成真正的代码。 它附带了一个简单的基于变量的语言,支持子表达式(subexpressions)、可选模式和过滤器。 ...
  • XCode代码编辑技巧

    2015-10-26 15:26:00
    1.Esc,代码的自动提示和补全,项目停止运行状态下,也就是没有Run的时候,Command+.(点)也能够自动提示和代码补全。 2.Command+Shift+K,Clean项目,Clean的效果就像是一个人劳累了一整天,然后躺在温度适宜的...
  • Xcode代码不提示或提示慢

    千次阅读 2020-11-02 18:17:12
    Xcode代码不提示或提示慢 1.方法一:target -> Build Settings -> 搜索weak -> 切换WeakReferences in Manual Retain Release的值为No (No->Yes->No)。 2.方法二:如果方法一失败,进入Preferences…...
  • 1. 退出 Xcode2. 重启电脑3. 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData)4. 删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode)然后 再运行 ...
  • 使用 Xcode 代码

    2016-08-11 09:28:00
    打开编辑器右侧的工具面板,就能看到所有可用的代码块。在工具面板的下方,有 4 个水平分布的小图标。...为了让你能够对代码块的用途有个较直观的印象,下面是 Xcode 内置代码块的概览: Cenu...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,826
精华内容 1,930
关键字:

xcode代码补全