自己动手写编辑器——Lumia Inspired by Atom

2023-11-29 13:50

本文主要是介绍自己动手写编辑器——Lumia Inspired by Atom,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

继上一篇 node webkit 用javascript打造web native之后,终于算是可以做出一个atom编辑器,只是这里是为了记念一下Nokia的Lumia手机,最后代码见https://github.com/gmszone/lumia


开始之前

需要配置好开发环境,也就是这个,下面是 Mac OS下的
https://github.com/rogerwang/node-webkit
找到对应的版本

将app复制到Application,接着把下面的alias添加到 ~/.bash_profile
    # alias to nw alias nw="/Applications/node-webkit.app/Contents/MacOS/node-webkit"
应用一下
    source ~/.bash_profile
启动应用的方式是
    nw app.nw  
启动之前需要
zip -r app.nw *

这样我们就有了一个基本的框架了


lumia 0.1

最初的版本是来自

https://github.com/zcbenz/nw-sample-apps

也就是node-webkit官网给的示例

只是这示例看上去一点都不友好,在写这篇文章时Lumia编辑器的截图
Lumia Editor

看上去和atom editor像极了,因为css就是参考atom编辑器的。

框架组成

目前主要是由下面两个构成基本的功能(转载保留: 自己动手写编辑器——Lumia Inspired by Atom)
  • Node.js
  • Node-webkit
  • CodeMirror
显然Node-Webkit发挥了主要的功能,但是CodeMirror也功不可没,作为一个在线编辑器的工具,其他目前的工作者。

  • Underscore JS扩展库
  • StringJS 让对String的处理更加简单

不过Package.json里面有更多的库,但是还没有发挥作用。

Lumia Editor 基本功能

暂时没有对Node-Webkit的示例做了太多的修改,修改主要基于下面几个部分
  • 去除了Save、Open、New三个button,直接改为了快捷键
  • 美化UI
  • 扩充了匹配,支持更多的语言
  • Sublime快捷键绑定
所以,他的基本功能就是
  • 打开、保存、新建文件
  • 和Sublime一样的快捷键
  • Atom一样的外观
  • 搜索

Javascript+HTML+Node-Webkit

HTML+CSS主要是对界面的美化
        <body style="background:#fff"><div class="workspace" background="#fff"><div class="horizontal"><div class="vertical"><div class="panes"><div class="pane" style="min-width:100%;"><ul tabindex="-1" class="list-inline tab-bar inset-panel"><li class="tab active"><div class="title" id="title">untitled</div><div class="close-icon"></div></li></ul><div class="editor"><div id="editor"></div></div></div></div><div class="status-bar tool-panel panel-bottom"><div class="flexbox-repaint-hack"><div class="status-bar-left"><div class="cursor-position inline-block" id="mode"></a><div class="status-image inline-block"><span class="image-size" style="display: none;"></span></div></div></div></div></div></div><input style="display:none;" id="newFile" type="file" /><input style="display:none;" id="openFile" type="file" /><input style="display:none;" id="saveFile" type="file" nwsaveas /></div><div style="display:none"><button style="display:none;" id="new">New</button><button style="display:none;" id="open">Open</button><button style="display:none;" id="save">Save</button></div></body>


如把title移到了最上面,变成了和title一样的位置,看上去像极了chrome浏览器的标签,这里主要是用了CSS的伪元素
        .tab-bar .tab:before {content:'';position: absolute;top: -1px;left: -16px;height: 26px;width: 30px;border-top-left-radius: 3px;border-left: 1px solid #b9b9b9;box-shadow: inset 1px -1px 1px rgba(0, 0, 0, 0.05);-webkit-transform: skewX(133deg);}.tab-bar:after {content:"";position: absolute;bottom: 0;height: 5px;left: 0px;width: 100%;background-color: #f0f0f0;border-bottom: 1px solid #dddddd;border-top: 1px solid #b9b9b9;}

这些主要就是表现在外见上的,大致上就是上面的作法。

editor.js里面做的主要就是判断和处理事件了
           onload = function() {newButton = document.getElementById("new");openButton = document.getElementById("open");saveButton = document.getElementById("save");newButton.addEventListener("click", handleNewButton);openButton.addEventListener("click", handleOpenButton);saveButton.addEventListener("click", handleSaveButton);$("#saveFile").change(function(evt) {onChosenFileToSave($(this).val());});$("#openFile").change(function(evt) {onChosenFileToOpen($(this).val());});    editor = CodeMirror(document.getElementById("editor"), {lineNumbers: true,keyMap: "sublime",autoCloseBrackets: true,matchBrackets: true,showCursorWhenSelecting: true,extraKeys: {"Cmd-N": function(instance) {handleNewButton()},"Ctrl-N": function(instance) {handleNewButton()},"Cmd-O": function(instance) {handleOpenButton()},"Ctrl-O": function(instance) {handleOpenButton()},"Cmd-S": function(instance) {handleSaveButton()},"Ctrl-S": function(instance) {handleSaveButton()},"Cmd-Shift-P": function(instance) {console.log("hello".green)}}});newFile();onresize();gui.Window.get().show();};

可以看到的是editor主要是由CodeMirror驱动的,还有就是对于语言的判断,这个是用于判断是哪种语言并给予高亮。
       function handleDocumentChange(title) {var mode = "javascript";var modeName = "JavaScript";if (title) {title = title.match(/[^/]+$/)[0];document.getElementById("title").innerHTML = title;document.title ="Lumia"+title;_.each(m.allmodes, function(modes) {if (S(title).contains(modes["filename"])) {mode = modes["mode"];modeName = modes["modeName"];console.log(mode);}});} else {document.getElementById("title").innerHTML = "[no document loaded]";}editor.setOption("mode", mode);document.getElementById("mode").innerHTML = modeName;}


主要的工作是 underscorestringjs做的,这里的m用的是外部文件。
     var m = require('./allmodes')

这篇关于自己动手写编辑器——Lumia Inspired by Atom的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/433072

相关文章

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片,再加一维就可以变成多张图片,再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右边的前一个元素(开区间),其中如果左边为空,那么表示从第一个开始,如果右边为空,那么表示访问到最后一个,如果两边都为空,则表示全部访问其中一行中我们指

Linux下vi编辑器命令

UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi。vi是一个创建、修改文本和数据对象的程序。他和字处理程序和桌面出版程序的区别是他只处理 plain ASCII 文本,没有格式信息。 vi 编辑器有三种处理文本的基本模式: ●一般模式:以vi处理文件时,一进入该文件就是一般模式了。在这个模式中,您可以使用上下左右按键来移动光标,可以使用“删除字符”或“删除整行”来处理文

pdf文件编辑器有哪些?分享适合新手用的5个PDF编辑器(解锁教程)

pdf是一种通用文件格式,也是一种夸操作系统平台的文件格式。 好用的PDF文件编辑器可以让您更改和添加文本、编辑图像、添加图形、签署签名、填写表单数据等。下面整理了关于pdf文件编辑方法介绍,以及一些好用的pdf编辑器,有需要的可以了解下。 一、pdf编辑软件 pdf编辑器1:金舟PDF编辑器——专业的pdf编辑 专业的pdf文件编辑工具,适用于Windows7以上的操作系统。能够完成

好用的 Markdown 编辑器组件

ByteMD bytedance/bytemd: ByteMD v1 repository (github.com) 这里由于我的项目是 Next,所以安装 @bytemd/react, 阅读官方文档,执行命令来安装编辑器主体、以及 gfm(表格支持)插件、highlight 代码高亮插件: npm i @bytemd/reactnpm i @bytemd/plugin-highlight

2-1 opencv实战进阶系列 阈值编辑器

目录 一、不说废话,先上现象  二、前言 三、方法详解 四、贴出完整代码 一、不说废话,先上现象  二、前言 对图像的处理中,设置合适的掩膜、寻找多边形、颜色追踪等方法都需要预先设置好颜色的上阈值和下阈值,来从原图中分割出我们需要的部分。 然而,opencv并没有像openmv那样方便的阈值编辑器对原图进行处理,所以本文提供一个方便的方法,可以同时处

vue2+ueditor集成秀米编辑器

一、百度富文本编辑器 1.首先下载 百度富文本编辑器    下载地址:GitHub - fex-team/ueditor: rich text 富文本编辑器 2.把下载好的文件整理好  放在图片目录下 3. 安装插件vue-ueditor-wrap npm install vue-ueditor-wrap 4.在你所需要展示的页面 引入vue-ueditor-wrap 此时

DevExpress WinForms v24.1新版亮点:功能区、数据编辑器全新升级

DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任! DevExpress WinForms控件2024年第一个重大版本——v24.1全新发布,此版本对功能区、状态栏

金山在线文档编辑器

官方文档地址:快速开始-WebOffice 知识库 首先按照文档写的方式将包引入项目了 util.js import WebOfficeSDK from "../../public/JSEditor/open-jssdk-v0.0.13.umd"export function WordSDK(url, isEdit, mountDom, isShowTopArea, isShowHeade