关于editor:解决Editormd上传图片获取不到图片地址问题

Editor.md图片上传获取不到图片地址,Editor.md图片上传iframe存在跨域状况,几经调试都不好用,最初采取代替计划,还不存在跨域状况。最近我的项目中要反对markdown 编辑器,当初根本做技术的没有不晓得Markdown 的,因为切实是太强大了,只须要理解很简略的几个操作,即可编辑十分柔美的文章,包含TeX迷信公式(基于KaTeX)、流程图 Flowchart 和 时序图 ,不在让你浪费时间在格局的调整。背景是在PC端应用,间接引入JQuery和Markdown.md插件进行应用 editor.md目录介绍这边须要阐明一下 editor.md目录,本文介绍的版本为v1.5.0,在首页下载实现,解压editor.md-master.zip文件,能够看到如下图的目录构造: 图中红色框内是咱们要援用到我的项目的文件和目录。 css目录中可抉择editormd.min.css放在对应的我的项目css目录中;js可抉择editormd.min.js搁置在对应我的项目的js目录中,须要留神的是同时须要引入jQuery,这里应用jquery.min.js;examples文件夹中是一部分外围性能的demo,在应用的过程中用到对应的组件或性能可关上参考;fonts是须要用到字体,可一并引入我的项目;images是一些加载类的图片;lib是editor.md依赖的第三方js资源,比方流程图的js资源;plugins次要是编辑器下面的操作性能插件,比方图片上传等,可抉择应用的进行加载; 导入到web 我的项目中的目录如下: 页面中须要引入的文件,其余插件依据须要再减少<!-- 页面中增加css --><link rel="stylesheet" href="./css/style.css" /><link rel="stylesheet" href="./css/editormd.css" /> <!-- 页面中增加div --><div id="editormd"> <textarea style="display:none;">### Hello Editor.md !</textarea></div><!-- 页面中增加js --><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/jqueryform@4.3.0.min.js"></script><script type="text/javascript" src="js/editormd.min.js"></script><script type="text/javascript" src="js/showdown@1.9.1.min.js"></script><script>var testEditor = editormd("editormd", { width: "90%", height: 'calc(100vh - 85px)', path : './lib/', // theme : "dark", // previewTheme : "dark", // editorTheme : "pastel-on-dark", // markdown : content?content:'![](https://img1.446677.xyz/2021/07/04/81903e6c0536ef3a87783a6e7afc3093.jpg) ![](https://img1.446677.xyz/2021/07/08/889db52a8e84a58e9bf63970f3a01e92.jpg)', markdown : content, codeFold : true, //syncScrolling : false, saveHTMLToTextarea : true, // 保留 HTML 到 Textarea searchReplace : true, //watch : false, // 敞开实时预览 htmlDecode : "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启 //toolbar : false, //敞开工具栏 //previewCodeHighlight : false, // 敞开预览 HTML 的代码块高亮,默认开启 emoji : true, taskList : true, tocm : true, // Using [TOCM] tex : true, // 开启迷信公式TeX语言反对,默认敞开 flowChart : true, // 开启流程图反对,默认敞开 sequenceDiagram : true, // 开启时序/序列图反对,默认敞开, //dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为true //dialogShowMask : false, // 设置弹出层对话框显示通明遮罩层,全局通用,默认为true //dialogDraggable : false, // 设置弹出层对话框不可拖动,全局通用,默认为true //dialogMaskOpacity : 0.4, // 设置通明遮罩层的透明度,全局通用,默认值为0.1 //dialogMaskBgColor : "#000", // 设置通明遮罩层的背景色彩,全局通用,默认为#fff imageUpload : true, imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], imageUploadURL : "https://api.xxxx.com/api/v1/editorMdImgUpload", onload : function() { /*上传图片胜利后能够做一些本人的解决*/ console.log('onload', this); //this.fullscreen(); //this.unwatch(); //this.watch().fullscreen(); //this.setMarkdown("#PHP"); //this.width("100%"); //this.height(480); //this.resize("100%", 640); }});</script>复制代码id为editormd,前面的js代码中须要用到。而且源码外部也是通过这个作为前缀的。通过form表单提交时后盾可通过content-editormd-markdown-doc获取到对应的markdown文档内容。比方Java中可通过request.getParameter(“content-editormd-markdown-doc”)留神:此处须要留神的是,无论须要html格局的内容还是markdown格局的内容,都只须要写一个textarea。此处有一个很大的坑。不少其余教程中说须要两个textarea,那么会导致后一个textarea后盾取得的数据是一个数组,而不是单纯的HTML内容。编辑器中的编辑配置:path门路须要指定到我的项目中对应的lib的门路。如果设置不对markdown 无奈渲染进去。saveHTMLToTextarea设置为true示意,转化为html格局的内容也同样提交到后盾。好,到这边你就能够看到页面成果了。如下: ...

June 17, 2022 · 1 min · jiezi

关于editor:Twaver-HTML5中的-CloudEditor-进行Angular2-重写

Twaver HTML5中的 CloudEditor 进行Angular2 重写 背景业务进度紧迫,于是破费俩天工夫对 twaver 的 CloudEditor 进行Angular2 重写革新以实现twaver初始视图构造的引入; 初识twavertwaver是一个商业闭源的绘图引擎工具, 相似的开源产品有 mxgraph, jointjs, raphael等; 重写起因长处 不减少引入三方件,manageone以后火车版本上曾经存在twaver,可间接应用;合乎业务场景, twaver官网提供了以后开发的利用场景样例且官网样例丰盛;性能稳定性已验证,公司有产品曾经应用其作出更简单场景的性能,沟通后首次判断二次开发问题不大;Angular2框架兼容, twaver的技术栈应用原生js实现与以后应用Angular2框架无缝集成;毛病 官网demo中大量应用jquery库操作dom,jqueryUI库实现UI组件和款式,首次引入须要对这些额定的三方件性能进行剥离和剔除;没有源码,不利于调试和排查问题;相熟度低,以后组内没人理解twaver;CloudEditor主体内容:|-- CloudEditor |-- CloudEditor.html |-- css | |-- bootstrap.min.css | |-- jquery-ui-1.10.4.custom.min.css | |-- jquery.ui.all.css | |-- images | |-- animated-overlay.gif |-- images | |-- cent32os_s.png | |-- zoomReset.png |-- js |-- AccordionPane.js |-- category.js |-- editor.js |-- GridNetwork.js |-- images.js |-- jquery-ui-1.10.4.custom.js |-- jquery.js重写的次要准则:输入文件均以Typescript语言实现,并减少类型申明文件;剥离间接操作dom的操作,即移除jquery库;改写twaver中过久的语法,ES6语法革新;左树菜单CloudEditor中左树菜单次要是一个手风琴成果的列表,其实现是应用AccordionPanel.js这个文件,其内容是应用动静拼接dom的形式动静生成右面板的内容;咱们应用Angular的模板个性,将其改写为Angular组件menu ,将原来JS操作dom的低效操作全副移除。 AccorditonPanel剖析// 这里申明了一个editor命名空间下的函数变量AccordionPaneeditor.AccordionPane = function() { this.init();};// 外部办法根本都是为了生成左树菜单构造,如下办法createView: function() { var rootView = $('<div id="accordion-resizer" class="ui-widget-content"></div>'); this.mainPane = $('<div id="accordion"></div>'); this.setCategories(categoryJson.categories); rootView.append(this.mainPane); return rootView[0];}, // 生成菜单题目 initCategoryTitle: function(title) { var titleDiv = $('<h3>' + title + '</h3>'); this.mainPane.append(titleDiv); }, // 生成菜单内容 initCategoryContent: function(datas) { var contentDiv = $('<ul class="mn-accordion"></ul>'); for (var i = 0; i < datas.length; i++) { var data = datas[i]; contentDiv.append(this.initItemDiv(data)); } this.mainPane.append(contentDiv); }, // 生成菜单项 initItemDiv: function(data) { var icon = data.icon; var itemDiv = $('<li class="item-li"></li>'); var img = $('<img src=' + icon + '></img>'); img.attr('title', data.tooltip); var label = $('<div class="item-label">' + data.label + '</div>'); itemDiv.append(img); itemDiv.append(label); this.setDragTarget(img[0], data); return itemDiv; },应用tiny组件重写构造<div id='left-tree-menu'> <tp-accordionlist [options]="menuData"> <!--自定义面板内容--> <ng-template #content let-menuGroup let-i=index> <div *ngFor="let item of menuGroup.contents" [id]="item.label" class="item" [attr.data-type]="item.type" [attr.data-width]="item.width" [attr.data-height]="item.height" [attr.data-os]="item.os" [attr.data-bit]="item.bit" [attr.data-version]="item.version" [title]="item.tooltip"> <img [src]="item.icon" (dragstart)="dragStartMenuItem($event, item)"/> <div class="item-label">{{item.label}}</div> </div> </ng-template> </tp-accordionlist></div>重写后组件逻辑次要是解决数据模型与UI组件模型的映射关系 ...

October 11, 2021 · 6 min · jiezi

关于editor:纹理的外部格式对其内存的影响

1)纹理的内部格局对其内存的影响2)更换Mac平台后我的项目中的局部DLL生效3)打Shader包的时候是否须要将cginc打进去4)内置Standard的代替计划 这是第264篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) TextureQ:原来一个Prefab用到的图是16MB,4096*4096像素,而后用PS压缩了一下变成600KB(分辨率不变)。打AssetBundle测试,除了AssetBundle的大小由27MB变成了20MB,在内存中的Texture 2D都是一样的。因为在Unity设置的压缩格局是一样的,所以在Unity外面看到的内存也是一样大的,难道Unity外面的图片大小跟原图大小没关系?原图大小用PS压缩/不压缩除了AssetBundle收益,在不改Unity中图片压缩格局的前提下,内存就没收益了吗? 我猜测是不是Unity读取的原图,在运行时都是依据原图,而后依据Unity外面设置的压缩格局本人在内存中是一份新的图,就跟原图没什么关系了? A1:图片导入Unity,就会按设置的格局和压缩变成Unity本人的格局,此时的内存大小就和图片原始大小无关了。这时要到Inspector里的下方看图片的压缩格局和内存大小。猜测是Unity把图片导入时,主动转换了一份本人的格局存储到了Library里,所以真正加载显示的就不是原始那张图片了。感激林健@UWA问答社区提供了答复 A2:首先咱们要明确一个概念,咱们在电脑上看到的png格局或者jpg格局的图片,png / jpg只是这张图片的容器,它们是通过绝对应的压缩算法将原图每个像素点信息转换为用另一种数据格式示意,以此达到压缩目标,缩小图片文件大小。 当Unity将这张图片加载进内存时,这些文件会被转换为特定的格局,调取速度更快,占据内存更少,比方ASTC_6X6等。 纹理加载进内存后,大小计算公式如下:纹理内存大小(字节)=纹理宽度 x 纹理高度 x 像素字节像素字节 = 像素通道数(R/G/B/A)x 通道大小(1字节/半字节) 感激马三小伙儿@UWA问答社区提供了答复 EditorQ:我的项目须要开发Mac OSX平台利用,换到苹果电脑之后sqlite3.dll和user32.dll生效了,在网上下了很多替换的都不行,其它的DLL都能够,请问如何兼容这两个DLL呢? A:你的sqlite3.dll应该是只能利用于Windows平台,Mac上须要对应平台的Sqlite库。user32.dll这个很显著是个Windows平台的动态链接库,Mac上无奈应用。 我又搜寻了一下材料,发现在iOS、Mac上如同不须要额定地去导入原生的Sqlite库,它们有自带预编译好的Sqlite库。你所须要做的是:将Mono.Data.Sqlite.dll这个文件从引擎目录拷贝进去,搁置在Plugins目录下。 具体能够参考这两篇教程:《Unity工具—Mono.Data.Sqlite 应用》 集成流程看这个:《Setup Database (SQLite) for Unity》 我依照下面的步骤做了一个Demo测试了一下,Windows和Mac上都能够失常的运行。 感激马三小伙儿@UWA问答社区提供了答复< ShaderQ:原本我的项目中用的是内置的Standard,为了缩小变体的起因,将Built in的Shader蕴含cginc文件的全副放到本地。打Shader的时候,须要把援用到的cginc文件也打进Shader包内吗?看到有说其实cginc的代码片段被编译到了Shader中,依照这种说法不就应该只有打Shader就行,对应的cginc是否还须要打进去? A1:不须要,打包时候Shader会编译成对应平台的Shader,曾经主动将cginc的代码合并进来了。感激范世青@UWA问答社区提供了答复 A2:不须要的,举个例子,如下一个简略的CG,其中定义了vert和frag函数,及2个uniform和一个常量: 同时创立一个“Shader1”应用这个CG的vert&frag实现: 在Shader的Inspector面板抉择对应平台编译,Shader的编译相似C++的编译,#include能够了解为将文件内容开展,编译完的后果如下,Vertex Program: Fragment Program: Shader打包就是编译的过程,所以不须要把CG/cginc等打包。 感激羽飞@UWA问答社区提供了答复 ShaderQ:应用内置的Standard,一方面有变体,另一方面应用一次7MB内存,有没有比拟不错的替换计划?也能够本人写一些漫反射、金属、高光等属性,想问一下有没有更好用的? A1:首先,内置Shader在理论我的项目中确实不被举荐应用,因其Keyword导致变体十分多,最终Shader本身或ShaderLab的内存占用会比拟高,这个统计受到Unity版本的影响。 该点可参考:《Shader内存统计与版本关系》 其实本人写Shader是最可控的形式了,能够依据本人的我的项目写一些有针对性的成果,如果只须要一些惯例的成果,能够参考Standard Shader的源码,用一些Unity封装好的基于PBR光照模型的办法。 感激翟孟飞@UWA问答社区提供了答复 A2:通过本地目录Editor\Data\CGIncludes中的cginc文件和官网下来的Built in Shader把你须要的成果都抽出来缩小Shader的变种数量。打包的Shader和对应的cginc是主动打在一起的。感激萧小俊@UWA问答社区提供了答复 A3:不倡议应用内置Shader,起因题主也写了。默认的Shader更多的是给到一个大而全的抉择,比拟适宜疾速做原型Demo。 理论我的项目开发中倡议还是依据美术的理论需要本人从头来写,局部性能能够参考内置Shader的代码,这样既能满足美术需要,又能满足性能的要求。 感激范君@UWA问答社区提供了答复 A4:这个Standard就是把以前的一些Built in的Shader交融在一起了,实现的成果的确是多了,然而也显得很臃肿,还是倡议本人拆分定制不同的Shader,或者下载Built in外面的Shader。感激Lim@UWA问答社区提供了答复 20210824更多精彩问题等你答复~ 1.Vulkan API的性能及兼容性2.Unity TMP字体计划如何抉择3.如何实现AAB包的增量更新 封面图来源于:ChromaPackChromaPack - Unity的有损纹理压缩插件。 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 ...

August 30, 2021 · 1 min · jiezi

关于editor:Addressable热更新资源类型的疑问

1)Addressable热更新资源类型的疑难2)本地删除FBX的DefaultMaterial在Unity重启后生效3)如何实现MeshRenderer的成果4)UGUI动静加载Item的DrawCall问题5)Loading.CheckConsistency [Editor Only]编辑器上的优化问题 这是第250篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AddressableQ:Addressable能够热更新Text/Xml等原始资源,不走AssetBundle吗?正在思考是否应用Addressable作为热更新计划,有一些资源不想走AssetBundle,想间接读取,不晓得Addressable是否反对? A:Addressable目前没有间接反对Raw资源,根本都是走AssetBundle的。 一个思路就是把这些资源独自打AssetBundle,以AssetBundle为载体,逻辑上还是当成独自的Text,Binary去读取;另外一个思路就是做扩大革新。 能够看到有TextDataProvider这个Provider类,外部用“File.ReadAllText(path);”获取资源,因而其实能够去实现一下AddressableAssetGroupSchema和BuildScriptBase,做一个RawAssetSchema和BuildScriptRawAsset的扩大来打包。 感激黄程@UWA问答社区提供了答复 EditorQ:用了Addressables零碎,打包AssetBundle有Default Material有冗余,在打包机上运行脚本把FBX的默认材质删除后变紫,然而从新关上工程后默认材质又回来了,导致冗余还在。(Unity版本2018.4.34) 删除材质的脚本: using System;using UnityEngine;using System.Collections;using System.IO;using UnityEditor;using Object = UnityEngine.Object;class DisableMaterialImport : AssetPostprocessor { [MenuItem("Tools/Reimport All Model")] public static void ReimportAllModel() { var assetPaths = AssetDatabase.GetAllAssetPaths(); Array.Sort(assetPaths); Debug.LogWarning(string.Format("Total assets count: {0}", assetPaths.Length)); int processedCount = 0; foreach (string assetPath in assetPaths) { string normalizedAssetPath = assetPath.ToLower(); if (!normalizedAssetPath.EndsWith(".fbx") && !normalizedAssetPath.EndsWith(".obj") && !normalizedAssetPath.EndsWith(".3ds")) { continue; } var modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter; if (modelImporter == null || modelImporter.importMaterials) { continue; } AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ImportRecursive | ImportAssetOptions.ForceUpdate); Debug.Log(assetPath, AssetDatabase.LoadMainAssetAtPath(assetPath)); processedCount++; } Debug.LogWarning(string.Format("Total processed model count: {0}", processedCount)); AssetDatabase.SaveAssets(); } private static void FixedModelImport(ModelImporter modelImporter, GameObject model) { //Debug.Log("FixedModelImport "+model); var renderers = model.GetComponentsInChildren<Renderer>(true); if (renderers == null) { return; } modelImporter.importMaterials = false; modelImporter.importBlendShapes = false; modelImporter.importAnimation = false; modelImporter.isReadable = false; modelImporter.optimizeMesh = true; foreach (var renderer in renderers) { if (renderer == null) { continue; } renderer.sharedMaterials = new Material[renderer.sharedMaterials.Length]; }/* var animator = model.GetComponent<Animator>(); if(animator!=null) Object.DestroyImmediate(animator);*/ }A1:我这边试验过,不会变回来啊,会不会是把工程回滚了。另外这个脚本的ReimportAllModel只对自身就没有勾选Import Materials的模型无效。感激Prin@UWA问答社区提供了答复 ...

May 26, 2021 · 2 min · jiezi

关于editor:年轻人的第一个VSCode扩展

序言入坑VS Code前,我曾经是一名久经考验的Emacs老用户了,因而开始正式应用VS Code后,我第一工夫启用了它的Emacs Keymap。但不久我便发现,这套键映射短少一个重要的快捷键——ctrl-l。 在Emacs中,ctrl-l对应的命令是recenter-top-bottom,它用于将光标所在的行轮替地滚动到可视区域(即Emacs中的window)的两头、顶部,以及底部(如下图所示) 这是我高频应用的一个性能,尤其是跳转到函数的定义的首行后,我习惯于连按两次,将其滚动到window的顶部以便在一屏中看到尽量多的内容。 为了防止反复创造轮子,我先搜寻了一番,找到了一个声称实现了该性能的扩大Recenter Top Bottom。惋惜的是,装置后并不失效。 难道只能冤屈本人用鼠标小心翼翼地将光标所在行滚到顶部了吗?当然不是。既然没有开箱即用的,那便本人写一个VS Code的扩大实现这个性能吧。 年轻人的第一个VS Code扩大创立VS Code扩大的我的项目要想入门VS Code扩大的开发,官网便提供了一份不错的教程。一个扩大有许多的“八股文”代码,能够用yo和generator-code来疾速生成 npm install -g yo generator-codeyo code到这里,便失去了一个名为helloworld的目录了。用VS Code关上它,接下来要在其中大展身手。 实现将光标所在行垂直居中的性能VS Code扩大的外围逻辑定义在文件src/extension.ts中。在yo生成的示例代码中,用registerCommand注册了一个名为helloworld.helloWorld的命令,其逻辑是简略地在右下角弹出一句Hello VS Code from HelloWorld!。这个回调函数,便是业务逻辑的落脚点。 要想实现将光标所在行滚动到两头的性能,首先要晓得VS Code为开发者提供了哪些反对。在摸索了一通从VS Code的API文档后,我有了以下的线索: 通过vscode.window.activeTextEditor能够获得以后聚焦的编辑器——其值可能为空(undefined);TextEditor实例的属性.selection.active能够获得以后光标的地位;TextEditor实例有一个办法revealRange能够滚动文原本扭转展现的范畴,它须要一个vscode.Range类的实例,以及一个vscode.TextEditorRevealType类型的枚举值;vscode.TextEditorRevealType.InCenter的成果是将所给定的范畴展现在两头,vscode.TextEditorRevealType.AtTop则是置顶。有了这些常识储备,实现这样的一个回调函数便是信手拈来的事件了 function recenterTop() { const editor = vscode.window.activeTextEditor; if (!editor) { return; } const cursorPosition = editor.selection.active; editor.revealRange(new vscode.Range(cursorPosition, cursorPosition), vscode.TextEditorRevealType.InCenter);}因为临时没有配置该命令的快捷键,只能用VS Code的命令面板来调用 实现将光标所在行置顶的性能接下来我将实现间断调用两次helloworld.helloWorld命令,把光标所在行滚动到顶部的成果。在Emacs中,能够很轻松地晓得一个命令是否被间断运行——Emacs有一个名为last-command的变量存储着上一个命令的名称,只须要查看其是否等于recenter-top-bottom即可。但VS Code没有裸露这么弱小的性能,只能另辟蹊径。 我的策略是,如果调用helloworld.helloWorld时光标的地位,与上一次调用该命令时的地位雷同,就认为是间断调用。为此,须要两个在函数recenterTop之外定义的变量: previousPosition负责记录上一次调用recenterTop时光标的地位,它的初始值为null;revealType存储着上一次调整展现范畴时传递给TextEditor实例的revealRange办法的第二个参数的值,它的初始值也为null。我的指标是尽量模仿Emacs中的recenter-top-bottom所具备的、交替应用居中、置顶成果的特点,因而: 如果revealType为null,意味着这是第一次调用recenterTop,那么成果便是居中。否则;如果这一次与上一次的光标地位不同,意味着在上一次调用recenterTop后调用过其它命令,成果仍然是居中。否则;如果revealType曾经是居中了,就改为置顶。否则;将revealType改为居中。Talk is cheap. Show me the code.let previousPosition: null|vscode.Position = null;let revealType: null|vscode.TextEditorRevealType = null;function recenterTop() { const editor = vscode.window.activeTextEditor; if (!editor) { return; } const cursorPosition = editor.selection.active; if (!revealType) { revealType = vscode.TextEditorRevealType.InCenter; } else if (previousPosition && !cursorPosition.isEqual(previousPosition)) { revealType = vscode.TextEditorRevealType.InCenter; } else if (revealType === vscode.TextEditorRevealType.InCenter) { revealType = vscode.TextEditorRevealType.AtTop; } else { revealType = vscode.TextEditorRevealType.InCenter; } previousPosition = cursorPosition; editor.revealRange(new vscode.Range(cursorPosition, cursorPosition), revealType);}定义快捷键通过命令面板来应用不是我的最终目标,通过快捷键才是。依据VS Code的文档能够晓得,只有在package.json的contributes对象中,新增名为keybindings的属性,并定义命令及按键序列即可。 ...

January 2, 2021 · 1 min · jiezi

关于editor:如何通过Timeline的形式实现技能编辑器

1)如何通过Timeline的模式实现技能编辑器2)Addressable如何通过Group Name取得Group下的Key3)Unity如何获取Sprite在Sprite Packer中的UV值4)AnimatorController在UnityEditor下,如何获取所有的状态名5)Unity为UGUI的Mask做了怎么的解决 这是第228篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) EditorQ:我的项目须要通过Timeline的模式实现做个技能编辑器,时间轴的模式是怎么实现的?整个的技能编辑器有没有相干的参考? A1:倡议学习Timeline的应用办法以及传统技能编辑器是怎么做的,而后再想想看如何联合。上面这篇文章能够先读一读: 《ACT技能编辑器的制作教训分享》该问答由UWA提供 A2:可参考官网的Timeline扩大,2017年Unite也有个相干的主题:https://assetstore.unity.com/packages/essentials/default-playables-95266感激羽飞@UWA问答社区提供了答复 A3:第一,时间轴的模式是怎么实现的? 你能够参考几个Unity 的插件:https://assetstore.unity.com/packages/tools/animation/cinematic-sequencer-slate-56558举荐SLATE,扩大起来比拟不便:https://assetstore.unity.com/packages/tools/animation/flux-18440 第二,技能编辑器思路。有了下面的时间轴框架之后就是基于时间轴去开发不同类型的帧,比方:播放特效帧、动画帧和打击点帧等等。 举个特效的例子: 技能特效不外乎几个参数:特效名、偏移信息和挂接点等等;而后须要去实现执行到这个关键帧的时候具体怎么执行的业务代码,比方依据帧下面的配置的特效名参数加载出这个特效,偏移信息和挂接点参数设置特效的Transform;帧的长度就是这个特效的生命周期,帧执行完退出时做下销毁工作。感激波波@UWA问答社区提供了答复 AddressableQ:Addressable能够通过Group Name取得这个Group下的Key吗? 我把热更新放在了游戏开始时对立做。更新流程大略是:创立一个加载界面(资源在Addressable中是独立的Group,暂且叫startGroup),接着查看Catalog是否有更新,而后拿到所有的Key值下载资源。 这个流程是没有问题的,问题出在:如果在更新时网络中断了,Addressable仿佛会把更新列表里的资源内存开释掉,应用了所有Key来进行下载的加载界面资源会失落(变黑)。经测试,手动把startGroup里的Key排除掉,就没有这个问题。所以通过Group Name如何取得这个Group下的Key?或者有好的更新计划分享吗? A1:有一个外部函数: internal bool GetResourceLocations(object key, Type type, out IList<IResourceLocation> locations) 能够参考一下具体实现,这也是相似GetDownloadSizeAsync这样的函数在外部调用的。至于资源失落问题信息不够不太好判断了。 感激黄程@UWA问答社区提供了答复 A2:能够把startGroup里的资源的Label都设置成了“start”,通过Lable能够拿到Location列表,而后把这个列表中的Key值从总列表外面排除: public static List<string> GetAllKeys(string labelName){ var t = Addressables.ResourceLocators; List<string> keys = new List<string>(); foreach (var location in t) { if (!(location is ResourceLocationMap)) continue; ResourceLocationMap locationMap = location as ResourceLocationMap; locationMap.Locate(labelName, typeof(object), out var startLocationList); foreach (var info in locationMap.Locations) { if(info.Value.Count == 0) continue; string str = info.Value[0].PrimaryKey; bool isHas = false; foreach (var startLocation in startLocationList) { if(startLocation.PrimaryKey == str) { isHas = true; break; } } if (isHas) continue; string key = info.Key.ToString(); if (int.TryParse(key, out var num)) { continue; } if (!keys.Contains(key)) { keys.Add(key); } } } /*foreach (var locator in t) { foreach (var key in locator.Keys) { int value = 0; string str = key.ToString(); if (!int.TryParse(str, out value)) { keys.Add(str); } } }*/ return keys;} 感激大侠陈二狗@UWA问答社区提供了答复 ...

December 15, 2020 · 1 min · jiezi

关于editor:Emacs的avy插件

用Emacs的时候,我习惯将它分成“四个局部” 怎么弄的呢?个别是先按C-x 3分出左右两个window,再到各个window中用C-x 2分出高低两个window——这不是我的笔误,在Emacs的术语中,用来显示一个buffer的区域就叫做一个window。而经常被人们冠名为window的、最外层的窗体,则叫做frame。 这样划分后,屡次按下C-Tab(我把这个快捷键绑定到了命令other-window上),便能够依照左上、左下、右上、右下的程序轮换以后聚焦的window了。 如果须要从其它window中复制内容到以后window中粘贴,操作会麻烦一点。以右上角须要左下角的内容为例: 按三次C-Tab换到左下角的window中——用快捷键是因为我不想去挪鼠标;按k或j高低挪动光标到指标行——用k和j是因为用了evil-mode插件(参见这篇文章);复制内容,再按一次C-Tab回到原来的window中粘贴。听起来可麻烦了。 好在Emacs有一个十分好用的插件,能够把第1和第2个步骤合在一起实现。 avy这个十分好用的插件就是avy,它提供的avy-goto-line函数能够一步到位地实现下面的第1和第2个步骤。 用Emacs的包管理器就能够装置它 M-x package-install RET avy RET接着要为命令avy-goto-line绑定一个喜爱的快捷键 (global-set-key (kbd "M-g f") 'avy-goto-line)至此便能够在Emacs中欢快地应用M-g f来疾速跳转到以后或其它window中的行了。百闻不如一见,我来演示一番。 avy-goto-line家喻户晓,我用org-mode来跟踪本人的学习打算,还会将摸索过程中的一些半成品代码保留到org-mode的条目中。例如,我想要将左下角的window中的三个函数的定义,复制到右上角的代码块中去 于是我先按下M-g f,让avy为每一行赋予一个标记 因为心愿切换到左下角的window的第一行,所以我先按下j 此时,在前一幅截图中不以字母j开始的标记通通隐没了,而以字母j开始的标记则只留下了从第二个字符开始的局部。 再按下字母l,就能够将焦点切换到左下角的window,并且将光标挪动到第一行的行首了。而后只须要选中内容、复制,并返回原来的window中粘贴即可。残缺的过程如下 后记如果在按下组合键M-g f后,接着按下的是数字键的话,avy-goto-line会认为使用者打算跳转到指定的行。它将在Emacs的minibuffer中持续期待输出更多的数字或按下回车。不过我不怎么用这个性能,因为我没有让Emacs显示行号,按行号来跳转对我并不不便。 浏览原文

October 11, 2020 · 1 min · jiezi

关于editor:手指疼写点代码缓解一下

我常常应用Emacs来干写字的活——有时候是写代码、有时候是用org-mode治理待办事项、有时候是用restclient-mode来测试HTTP API。Emacs丰盛的快捷键让我能够双手不离主键盘区就做到很多事件,不过这也带来了别样的懊恼:快捷键按多了,手容易累。 导致手累的第一个因素,是Emacs的不少快捷键须要按住ctrl来应用,而ctrl经常不容易按到。以我的键盘为例,ctrl键散布在主键盘区的最外侧 为了便于尾指按到两侧的ctrl键,我在macOS中替换了command和control键的成果 当须要按住两边的ctrl键(理论按下的是下面照片中的Windows图标键)时,手段须要往外拐过去。这个问题在应用VSCode时同样存在,因为我在VSCode中用的也是Emacs的键映射。 第二个因素是Emacs的一些快捷键太繁琐,导致应用时双手像在键盘上起舞个别到处按来按去,敲击次数过多。例如,让光标上下左右挪动的快捷键别离是ctrl-p、ctrl-n、ctrl-b,以及ctrl-f,这比间接用键盘上的方向键麻烦得多。有一些性能甚至要按三组快捷键,比方org-clock-out要先按ctrl-c,再按ctrl-x,最初按ctrl-o。 有没有方法既能够保留快捷键的高效,又尽量地缩小击键导致的手段和手指的疲劳呢? 当然有。 在Emacs中改用Vim的快捷键既然Emacs默认的快捷键不容易按,那么无妨换成Vim格调的快捷键。同样是上下左右挪动光标,在Vim中只须要单击k/j/h/l这四个按键即可,不仅可能单手操作,而且这四个键正好是右手”触手可及“的地位。其它的性能,例如在文件内搜寻、保留文件等,也只须要按/和:w即可,比起Emacs真是”finger-friendly“得多了。 那么如何能力在Emacs中用上Vim的快捷键呢?答案是用evil插件。先用包管理器装置它 M-x package-install RET evil RET而后在Emacs的启动配置文件中增加启用evil-mode的代码 (require 'evil)(evil-mode 1)当初便能够在Emacs中应用Vim格调的快捷键了 定制evil-mode只是简略地启用evil-mode还不足以将双手从频繁的按ctrl中解放出来,因为在Emacs中还有不少其它的高频快捷键依赖于ctrl,例如用ctrl-x b来切换到其它的buffer中、用ctrl-x ctrl-f来关上或新建一个文件,甚至是用ctrl-c ctrl-x ctrl-o来进行一个工作的计时器。 就像在数据压缩中,用较短的串来代替呈现频率较高的原始字符串一样,对于高频应用且快捷键较长的性能,能够为它们绑定较短的快捷键。在evil-mode中,g是一个前缀键并且也很好按,所以我把一些重度应用的性能都绑定了在了以它为前缀的快捷键上 ;;; evil-mode相干的键绑定(evil-global-set-key 'normal (kbd "g b") 'ido-switch-buffer)(evil-global-set-key 'normal (kbd "g f") 'ido-find-file)(evil-global-set-key 'normal (kbd "g o") 'org-clock-out)(evil-global-set-key 'normal (kbd "g s") 'cuckoo-org-schedule)(evil-global-set-key 'normal (kbd "g t") 'org-todo)(evil-global-set-key 'normal (kbd "s") 'save-buffer)在VSCode中改用Vim的快捷键搬砖的工具是VSCode,用来写Node.js的我的项目,次要是因VSCode在写Node.js代码这方面的确比Emacs的js-mode、js2-mode,以及tide-mode之流要好用那么一点。在VSCode中我也改用了Vim的键映射,只须要在插件市场中点击装置即可 VSCode的Vim键映射实际上是一个独立的插件Vim,它也反对进一步地自定义快捷键。出于集体爱好,我把s绑定为保留文件的性能 // VSCode的配置文件setting.json"vim.normalModeKeyBindings": [ { "before": ["s"], "commands": [ "workbench.action.files.save" ] }],用BetterTouchTools补充evil-mode的有余只管在Emacs中能够将罕用的性能绑定到一系列的、以g结尾的较短的快捷键上,但这一招并不能用来解决所有的快捷键,因为太多的自定义快捷键也会带来记忆上的累赘。但我不会就此止步。 ...

September 28, 2020 · 1 min · jiezi

Boostnote及对记笔记的思考

这篇文章就是在Boostnote 中写成的XD 来龙去脉有一阵子,我沉迷于“笔记软件狩猎”中——就是不停寻找各种各样的笔记软件,再一个个试用,企图从中选出一个最强大的。回想起来,我尝试过有道云笔记、印象笔记、Quiver、Boostnote、OneNote、Yu Writer、Leanote(在本地搭建),等等。大部分都是浅尝辄止,例如OneNote,当我发现它不支持代码块语法高亮时,就放弃了它。目前仍然在使用的是Boostnote,并且也是最令我满意的。 走马观花Boostnote自诩为“for developer”的笔记软件,除了书写Markdown以及实时预览之外,还支持绘图(UML、流程图、时序图)、制表,甚至可以添加LaTeX公式。 GitHub上可以找到官方对Boostnote绘图能力的简单示例,但我用得极少。不管是画UML、流程图,还是时序图,方法都是“写代码”。画UML用的是PlantUML的语法(你甚至可以在首选项中找到PlantUML服务器的地址),画流程图用的是flowchart.js的语法。我自己很喜欢这类语绘的方式,只需要熟悉一下语法,画起来图来比鼠标拖拖拉拉不知道要高到哪里去了。说到时序图,我更喜欢用sdedit。 制表只需要敲入竖线和横线即可。例如,下面的内容 |这|是|一||-|-|-||个|表|格|在Boostnote中预览时的效果是如下这样的 这是一个表格制表在Emacs的org-mode中有更风骚的表现。比如,按下tab键可以让光标跳至下一个单元格,同时会自动调整每一列的宽度;甚至,还可以在单元格中使用公式。 既然可以嵌入LaTeX,那么下列的内容 $$ \LaTeX $$就能够用来绘制酷炫版的LaTeX logo了,如下所示 $$ \LaTeX $$ 只可惜这玩意儿不是inline的。 Markdown这门标记语言原本也支持代码块,但稍微现代的编辑器都应当至少支持语法高亮才行。在Boostnote中即便不进行预览,代码块中的代码也是彩色的。 Boostnote自动保存笔记内容,这点上每个人的口味可能还是不太一样的。 槽点尽管可以将剪贴板中的图片粘贴到Boostnote的笔记中,却不能将图片复制到剪贴板中。唯一的办法,就是在粘贴了图片后,按照笔记中的文件路径,在Finder中找到这个文件,然后再复制。 不像Yu Writer和Typora,Boostnote既不支持目录也不支持大纲模式。如果用来写篇幅很长的文章,并且需要频繁在相距比较远的章节之间切换的话,会写得比较辛苦。但也可以认为,Markdown,或者说Boostnote这样的笔记软件,本来也不适合写作大型文档。遇到这种事情,还是应当出动字处理软件(比如Word)或者TeX。 Boostnote没有将笔记的内容以朴素的Markdown形式保存为一个.md文件,而是存储成后缀名为.cson的文件格式。这意味着,即便哪一天有一款完美的Markdown编辑器出现了,也无法在其中查看和编辑这些Boostnote生成的文档。 一些胡言乱语记笔记的目的是什么?我对笔记软件的要求是什么?Boostnote是最合适的吗?它又适合做什么呢?我不是从入手了Mac之后才开始记笔记的,在此之前,我用Emacs的org-mode来记笔记,但也许称其为FAQ更恰当。使用org-mode,写作方式、浏览方式,以及载体都是一致的——用org-mode的语法来写作,同时写下的也就是所看到的(org-mode没有预览一说),最后,存储的也是纯粹的、敲入的文本。但用org-mode来记笔记也有自己的缺陷: 在Emacs中浏览的体验不是非常好不方便使用行内的代码块其它编辑器对.org格式的支持不好不方便粘贴图片因此,才打算构筑新的笔记系统。但新的笔记系统应当不仅仅可以解决org-mode遇到的问题,而是应该贴合我的核心需求才行。我自己曾经总结过,笔记软件应该满足如下的要求: 支持Markdown,它是一门我所熟悉的、轻量级的标记语言,也被众多的软件支持支持编程语言的语法高亮,毕竟是软件开发方面的笔记,总会涉及到代码的以.md文件的形式存储。这个一会儿再聊聊支持树形的文件层级结构,因为我可能会给笔记划分比较多的层级,但这个也值得一会儿聊聊支持Emacs的keymap,这是我所熟悉的操作方式,减少手离开键盘的次数看下来更像是在物色一款好用的Markdown文件编辑器。但一款优秀的Markdown文件编辑器就会是一款优秀的笔记软件吗?我看未必。 实际上,对代码的语法高亮的要求,暴露了一个关键因素,就是:即便我写入的是Markdown代码,也希望能够以渲染后的效果展示出来。所以,为什么不直接使用富文本来书写笔记内容。如果是富文本的编辑器,那么一般便不会是以朴素的.md文件的格式来存储的了,但这并没有什么太值得在意的,毕竟谁也不会闲着没事就将笔记内容在各个软件间迁移着玩。 如果是一些可以公开的笔记,那么直接记录到博客中也不失为一个好办法——博客可以被搜索引擎索引,之后如果想要查找记录过的内容的话,也可以借助于搜索引擎强大的搜索能力来实现。不过,现阶段,我更喜欢这些笔记是私密的。 我的笔记也几乎不会与他人分享,因此不管是书写格式还是存储格式,都只需要我自己用着开心就足够了。大多数情况下,笔记的用途其实是代码片段,在需要的时候能够复制出来略作修改,用到其它地方——例如粘贴到shell中运行,解决一些临时的问题。如果不是因为我喜欢记下最终结果的来龙去脉的话,Boostnote的代码片段功能也许才是最适合我的选择。另外,由于大部分的代码都非常地短,即便没有语法高亮浏览器来也不是大问题,所以语法高亮的需要也就不那么迫切了。 现在看来,Boostnote并不是最合适的(打脸了)。Evernote和Leanote是我用过的笔记软件中比较强有力的两个竞争者。由于Leanote比Evernote支持更多的目录层级,并且还可以选择创建Markdown笔记(而不仅仅是富文本笔记),所以我大概会选择用Leanote来作为接下来的笔记软件的主力吧。 后记用Typora来写,用ElasticSearch来索引笔记,好像也不错?!

May 8, 2019 · 1 min · jiezi

XKNote-一个集各种神奇功能的云笔记

XK-Note一个集各种神奇功能的云笔记 前言博主是个计科的大学生,所以经常需要将一些不太理解的代码或者经验记录下来,纸质笔记对一些经验还好,一旦涉及代码。。。,所以博主的笔记都是电子的,在弄好这个笔记时使用的是Typora,确实非常好用,但是有个硬伤,同步不便,到机房上课的时候笔记就派不上用场,并且查看还要使用支持Markdown的编辑器。可谓苦不堪言,直到我在Github上看到了Editor.md这个项目,于是便开始了Coding。 简介 IntroductionXK-Note = Laravel . ZUI . Editor.md;一个由上方代码组成,集各种神奇功能的云笔记。 特性 Feature[云存储] 云端撰写笔记,随时保存,多端同步。[跨平台] 多平台支持,撰写查阅只需一个浏览器,无惧任何不兼容情况。[响应式] 所有页面均采用响应式设计,即使尺寸极小的设备也能保持良好的体验。[在线浏览] 拥有独立的浏览模式,查看笔记不再困扰。[Git同步支持] 独有的Git支持,支持版本控制,无惧误操作,随时从旧版本恢复笔记。[浏览器临时保存] 独有的浏览器端保存功能,即使断网了也能安心写作,无惧任何网络波动。[多用户] 笔记主要面向个人使用,但是也支持多人同时使用,每个用户的笔记互相隔离保存,无需担心笔记泄露。[导出笔记] 支持多种导出格式,保存为MD文件,html文件,由本地即时生成,无需繁琐的操作。[多种模式] 拥有多种模式,写作,预览,阅读,满足各种人的需求。还有多种神奇的功能等待你的发掘。演示 DemoXK-Note账号: demo@ixk.me密码: demo 安装 Install前往 Release 下载,然后上传至服务器,并解压到网站根目录安装依赖# Ubuntu/Debian 其他系统请自行查阅sudo apt-get install curl gitcurl -sS https://getcomposer.org/installer | phpsudo mv composer.phar /usr/local/bin/composer进入网站根目录,并执行以下命令composer installphp artisan storage:link将根目录下的xknote.sql文件导入到数据库中,并确认是否导入成功修改.env文件,将数据库信息填入.env文件中,并关闭调试模式APP_DEBUG=false修改网站的运行目录到public打开网站,注册一个账户,并确认账户id是否为1(账户id为1代表管理员)enjoy文档 Doc暂无 Githubhttps://github.com/syfxlin/xk... 求 star = ̄ ̄= 维护者 MaintainerXK-Note 由 Otstar Lin和下列贡献者的帮助下撰写和维护。 Otstar Lin - Personal Website · Blog · Github许可证 License 根据 Apache License 2.0 许可证开源。 ...

May 6, 2019 · 1 min · jiezi

vim-键位图解cheetsheet

vi/vim graphical cheat sheet为什么学vi/vim学习vi或vim并不容易。 但它也不一定非常困难。 无论如何,它比使用任何其他编辑器进行编辑更快,更强大,更高效,因此您可以非常好地投入时间和精力来学习它。 作为一个vi爱好者,我想出了为那些学习vi或vim提供图形备忘单的想法,我也发现这是一个非常好的方法来构建一个教程。 以下是您的学习乐趣(或您的同事)的结果。 顺便说一句,我最近发表了一篇权威文章,解释了为什么vi / vim编辑比常规编辑好得多。 如果你想自己阅读它,或者你想让你的持怀疑态度的朋友指出它有意义的原因,除了是一个有趣的读物之外,它应该证明是有用的.Why, oh WHY, do those #?@! nutheads use vi? basic editing basic operators & repetition yank/ paste search marks & macro various motions various commands

April 30, 2019 · 1 min · jiezi

用过的一些Markdown编辑器

开篇买了MacBook Pro之后的一段时间里,为了打造适合自己的知识管理体系,折腾起了笔记类软件(题外话,我还挺喜欢尝试新软件的,尤其在接触macOS后发现许多软件都长得很漂亮)。其实在入手Mac之前,我已经试用过不少笔记类软件和服务了,包括Evernote(还有印象笔记)、有道云笔记、为知笔记,等等。再后来,改用Emacs的org-mode来写笔记——主要是将一些常常搜索的内容或经验记录在了多个.org文件中,算是一份自己的FAQ。后来想看看在macOS的世界中有没有更好的工具,同时渐渐觉得Markdown是一个更好的笔记内容载体,便尝试了一些知名的笔记类软件暨Markdown编辑器。大致上尝试了下列这些:EmacsBoostnoteQuiverTyporaVisual Studio CodeYu Writer本文并不是一篇完整的、专业的软件评测报告,只是我兴趣使然的对各个软件的吐槽和赞美,各位权当打发时间吧。下面我按顺序说一下上面提及的各款软件。EmacsEmacs并不仅仅是一款Markdown编辑器,我用得最多的是用它来做计划(之前还用来写Node.js代码,不过现在交给VSCode了)。用Emacs来写Markdown,坏处是没有live preview的功能。在Emacs中打开了一个.md文件,只会原原本本地显示着井号、星号,三个反引号等Markdown语法的关键字——并且还是白底黑字的模样,而不带有丝毫不同的样式。为了让它们好看点,你还需要安装一个叫做markdown-mode的Emacs扩展。但几遍安装了markdown-mode,也无法实时预览。markdown-mode的菜单栏中有一个叫做“Preview”的功能,它依赖一个名为markdown的命令行工具(用brew install markdown可以安装)。当一切安装完毕点击“Preview”菜单项时,才发现是在网页浏览器中查看的方式——虽然有preview了,但并不live。Emacs在写Markdown方面也并非一无是处。对程序员而言,在一篇Markdown写就的文章中插入代码是再正常不过的事情了。在Emacs中将光标定位到Markdown语法的代码块内,按下control和c的组合键,再敲一下单引号键,Emacs便会另起一个相应模式的buffer,并将代码块中的内容复制到新buffer中供继续编辑。如下图所示在上面的GIF中,代码块以GitHub Flavored Markdown的语法在开头的三个反引号后附上了模式的名字,即lisp,Emacs便会打开lisp-mode的buffer。在这个buffer中可以继续使用Emacs的完整功能编辑对代码,包括语法高亮、自动补全,等等——如果启动了SLIME,甚至可以运行里面的Common Lisp代码。Emacs和VSCode用于在编写代码的同时写写项目的README.md文件应当是绰绰有余的了。BoostnoteBoostnote自诩为“程序员的笔记本”,它并不是我在Emacs之外寻找的第一款笔记软件,在它之前,我还尝试了Notion、Quiver来着。上手后发现,Boostnote简直就是Quiver的开源免费版本,相当的喜爱。Boostnote当然让我格外喜欢的有几点:首先,Boostnote可以实时预览键入的Markdown源文档。会有一列跟编辑区域差不多宽的区域被用来展示Markdown渲染后的效果。(刚刚发现,原来这个区域的宽度是可以拖动调节的)其次,它不仅支持Markdown、带语法高亮的代码块,甚至还支持表格和流程图的绘制!当然我以为,用竖线和连字符绘制表格的功能仅在Emacs的org-mode中存在(孤陋寡闻了汗颜),刚开始用Boostnote制作表格的时候可是相当兴奋。而text-based的绘制流程图的方式也是让我大开眼界(后来才知道原来有flowchart.js这样的工具)——尽管后来我渐渐发现,绘制流程图其实挺少用。然后Boostnote具备在多份笔记中搜索的功能,这对于一款笔记软件而言倒是真的非常重要,因为有时候只能想到一些只言片语,而并不能确定所要查阅的内容究竟在哪一份笔记中。但Boostnote也有一些缺点。首先,Boostnote是用自有的文件格式(而不是纯文本的.md文件)来存储输入的内容的——打开~/Boostnote/notes/可以看到这些后缀为.cson的文件。这样一来,假设我日后发现了一款更优秀的Markdown编辑器,那就不能无痛迁移了,还得先从Boostnote中将这些笔记逐一导出成.md文件才行。其次,Boostnote只支持三层的组织结构——最外层是storage,然后是folder,最后就是笔记本身。当初有道云笔记特别让我喜欢的,就是它支持非常多层级的目录结构。尽管目录不是越多越好,但有这种灵活性总是更好的。否则,笔记的使用者就只能在命名和标签上下功夫了最后一点,就是Boostnote在我的系统上非常容易崩溃。有时候一翻起盖子,看到的就是Boostnote崩溃的提示。不过Boostnote支持往其中粘贴图片,当我需要快速记录一些图文内容时,我还是很喜欢用它的。Yu Writer某一天偶然遇到了Yu Writer,它官网上的截图看着很吸引人,于是我便试用了一下。第一印象是,Yu Writer is awesome!首先它很人性化。它的预览区域是一个minimap——就是Sublime Text最右侧的那一列。在做到实时预览的时候,也不会占用太多的横向空间。其次,它支持大纲视图即上图左侧的目录。恰逢当时我在用Boostnote写一篇比较长的设计文档,深刻地体验到了一个大纲视图的重要意义——对在长文档内的多个标题间跳转非常有帮助。再次,Yu Writer还准备了工具栏,方便不懂得Markdown语法的用户;支持标签页,便于在多个文档间切换;甚至可以把一个Markdown文档作为幻灯片来播放。但Yu Writer也有它自己的劣势。第一,在Yu Writer内,原本在macOS系统中全局可用的Emacs风格快捷键——即control+b往左移动光标、control+f往右移动光标——居然不生效!这些快捷键对我个人还是非常重要的。第二,在Yu Writer中,不能直接插入磁盘上的图片文件的绝对地址,既没有在预览区域显示出来,也没有在文档列表显示成功。据说Yu Writer的作者的主业是厨师,感觉好强TyporaTypora is best。不同于前面提到的几款Markdown编辑器,Typora是“所见即所得”的编辑器。你敲入两个井号,加一个空格,再敲入你的标题内容,最后回车,那么标题内容就会被渲染为二级标题的形式,如下图所示这么一来,屏幕上的空间基本都可以被用来写作,不需要担心被预览用的列给占据了。然后,Typora没有自定义它的存储结构,它直接打开磁盘上的.md文件进行编辑,这些Markdown源文件可以随心所欲地放在任何喜欢的目录下,只要能打开就行。再加上它文件树视图,就实现了不受限制的笔记组织方式了,如下图不过一个可以想到的缺点,就是Typora不支持在所有的Markdown文件上搜索关键字——毕竟它也不知道要去哪个目录下寻找这些待搜索的源文件。尽管Typora外观很简洁,但Boostnote有的功能它一个也没有落下,就像它的官网所说的那样现在我的博客的文章基本都是用Typora来写的,冥冥中感受到了一股乐趣。但Typora毕竟没有搜索功能,所以我又开始摸索额外的搜索笔记的方式了(比如把记录在.org文件中的FAQ导入到ElasticSearch中再借助全文搜索的力量来找到自己要的内容)。后记没有最好的,只有最适合的,祝各位都能找到最适合自己的Markdown编辑器。

December 15, 2018 · 1 min · jiezi