美文网首页
(十二)IntelliJ 插件开发—— Document(文档)

(十二)IntelliJ 插件开发—— Document(文档)

作者: 秋水畏寒 | 来源:发表于2020-03-09 21:27 被阅读0次

    官方文档

    https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/documents.html

    Github

    https://github.com/kungyutucheng/my_gradle_plugin

    运行环境

    macOS 10.14.5
    IntelliJ idea 2019.2.4

    定义

    Document是一种可编辑的unicode字符序列,一般与virtual file的文本的内容是一致的,在Document中,换行符规范为\n

    获取方式

    • actione.getData(PlatformDateKeys.EDITOR).getDocument()
    • virtual fileFileDoucmentManager.getDocument(),如果文件未从硬盘加载过,则会被硬性加载,如果只对已打开的Document或者是修改过的Document感兴趣,则使用FileDocumentManager.getCachedDocument()
    • PSI filePsiDocumentManager.getInstance().getDocument() 或者PsiDocumentManager.getInstance().getCachedDocument()

    用处

    以纯文本格式访问或者修改文件内容

    Document来源

    当需要访问文件内容时,一个Document被创建,当然,不和任何virtual file关联的Document也可以被创建,比如,为了在对话框展示一个文本编辑器的内容

    Document生命周期

    Document实例和virtual file实例之间是弱引用关系,因此,一个未曾被修改的Document实例在不存在任何引用的情况是可以被垃圾回收的,而当文件内容在这之后再次被访问的时候,则又会创建一个新实例。插件中的长期数据结构的Document强引用会造成内存泄漏

    创建Document

    注意和上文的获取Document不同,此处是创建,一般来说,我们都不需要去创建,只需要获取,比如说通过PSI file获取Document,当然,我们也可以通过EditorFactory.createDocument来创建一个未和任何事物绑定的Document

    Docuemnt更新通知机制

    • Document.addDocumentListener:接收特定Document实例的改变通知
    • EditorFactory.getEventMulticaster().addDocumentListener:接收所有已打开的Document的改变通知
    • 监听AppTopics#FILE_DOCUMENT_SYNC消息,接收Document保存或者从硬盘加载的通知

    Document处理规则

    通用读写规则对Document是生效的,除此之外,任何对Document的修改操作都应该被包装在CommandProcessor.getInstance().executeCommand()命令中,该命令允许嵌套,并且最外层命令会被包含在撤销栈中

    另外,在修改Document之前,应该调用ReadonlyStatusHandler.getInstance(project).ensureFilesWritable()来确认Document是否可写,否则,对于只读文件,修改操作将会失败

    所有Document中的stirng相关的修改方法的换行符都必须使用\n

    官方工具类

    DocumentUtil

    相关文章

      网友评论

          本文标题:(十二)IntelliJ 插件开发—— Document(文档)

          本文链接:https://www.haomeiwen.com/subject/vdemdhtx.html