这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

  • A+
所属分类:安全工具

来自:gitee,作者:厉华

链接:https://gitee.com/calvinwilliams/EditUltra

EditUltra - 中国人开发开源的性能卓越的文本/源码编辑器+数据库客户端+Redis客户端

1. 概述

EditUltra是中国人开发开源的性能卓越的文本/源码编辑器+数据库客户端+Redis客户端,她基于开源的富文本编辑控件Scintilla提供的基本文本编辑能力,实现了一个完整的文本/源码编辑器,还能直接提交SQL和Redis命令到数据库和Redis并以表格方式显示查询结果,整个软件只有10MB(不包含Oracle/MySQL客户端库,需单独安装)。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端
这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端
这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

EditUltra主要功能包含但不限于:

  • 多文件选项卡
  • WINDOWS资源管理器右键菜单打开文件/目录中所有文件
  • 检测文件变动实时重载
  • 文件打开期间自动设置为只读
  • 文件换行符和字符编码转换
  • 远程文件直接打开和保存
  • 高级的切剪、复制和粘贴
  • 查找和替换
  • 快捷键快速选择单词、行
  • 高级移动
  • 高级累积选择、多位置同步操作、多文本块选择、列选择
  • 选定文本后自动高亮上下文中相同文本
  • BASE64编解码、散列摘要计算和加解密
  • 书签
  • 导航
  • 白字符显示
  • 编程语言语法高亮、自动完成和方法浮动提示,语句块折叠展开
  • 连接Oracle/MySQL,获取全表字段列表,执行SQL,显示查询结果到表格
  • 连接Redis,执行命令,显示查询结果到树
  • 配置执行对文件、选择文本的命令

EditUltra完全使用C纯WIN32API编写而成(v1.0.0.3大约有近2万行代码),又加入了众多优化算法和数据结构,提供了极高的运行效率和较低的系统资源占用,秒开文件,键入时毫秒级弹出自动完成列表。

2、开发历程

作为一名IT人,总喜欢写些东西,无论是源代码还是文章,从Linux C开发,到写博客,从分析爬虫HTML,到存放SQL命令,从字符编码检测,到建立个人技术知识库,都离不开一款轻便的文本编辑器伴我左右。我认为一款好的文本/源码编辑器,必须要—————快,如果启动要花2秒以上基本可以弃用了。

从大学毕业以来尝试过很多文本编辑器,UltraEdit是我使用比较长的一款软件,最新版本的UltraEdit带来了很多新功能,但是知名品牌“烈火”却迟迟搞不定Hack,我想,从事软件开发积累多年经验的我难道就不能自己写一个吗,需要什么功能就自己加(真香?),并以开放源代码方式发布,于是拾起大学时代的VC撸起袖子直接开干,先取个名字,不就是对标UltraEdit吗,就反过来叫EditUltra

一开始以为基于开源的富文本编辑控件Scintilla可以让我的开发工作神速推进,但阅读完其网上贫瘠的中文资料和官网上也不算丰富的英文文档后,才发现它真的只能当作VC工具箱里的一个稍微高级点的控件而已,大量功能都得自己撸,像多文件选项卡的控制(WINDOWS TABS控件不提供鼠标调整位置,自己增强呗)、远程文件直接打开和保存(Linux C开发必需)、自动完成列表的内容管理(Scintilla只提供了调用者给定列表、弹出和关闭接口,而不负责列表的筛选、管理等)。

软件开发离不开和数据库等打交道,那么发挥一下想象力(软件开发很需要想象力),文本编辑器内嵌客户端SDK连接上数据库不就能直接执行SQL了吗,避免了大量复制粘贴到数据库客户端软件里的人工操作,而且这年头数据库客户端软件还不便宜,很多看似免费也只是纯个人开发免费,广大企业/公司中开发还是要买许可,那么既然客户端SDK是免费的,就差一个用户界面把她包装一下了。

经过两个半月,每天晚上儿子睡觉后写两个小时(周末也是,白天陪全家出去玩等同于上班),一路斩荆披棘,小步迭代而来,终于从v0.0.0.1到v0.0.43.0,很快跳到v1.0.0.0发布了,还请各位看官多多支持和使用,有问题提issue或发邮件给我,我也将努力保持后续的继续迭代,毕竟现在只实现了基本功能,很多低频功能以及markdown预览、HTML预览等有待于补上。

3. 安装

3.1. 绿色安装

下载、解压绿色包

目前EditUltra只提供64位绿色版,免费下载和使用。

从以下网址可以查询最新版本更新信息

http://114.215.179.129/EditUltra/ChangeLog-CN

公众号江南一点雨后台回复中文编辑器,获取 EditUltra 绿色版下载链接。

把她放到软件目录中,我一般会放到专门放绿色软件的目录里

D:Program FilesEditUltra-latest.zip

把里面所有文件解压出来,解压出来只有10MB

D:Program FilesEditUltra

运行主程序

直接运行里面的editultra.exe即可启动。

注意:

  • 如需内嵌Oracle客户端功能,须自行安装Oracle,并将WINDOWS环境变量PATH中加入oci.dll的所在路径。
  • 如需内嵌MySQL客户端功能,须自行安装MySQL,并将WINDOWS环境变量PATH中加入libmysql.dll的所在路径。

注册WINDOWS右键文件/目录弹出菜单项

如果需要在WINDOWS资源管理器中右键菜单增加“打开文件”功能,执行菜单环境->文件右键弹出菜单

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

注册成功后就能在WINDOWS里右键打开文件了。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

如果需要在WINDOWS资源管理器中右键菜单增加“打开目录中所有文件”功能,执行菜单环境->目录右键弹出菜单

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

注册成功后就能在WINDOWS里右键打开目录中所有文件了。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

WINDOWS10操作系统可能会遇到“没有管理员权限”报错,解决方案是右键“以管理员身份运行”editultra.exe,再执行以上菜单即可。

3.2. 源码编译安装

如果喜欢折腾,全套源代码在

https://gitee.com/calvinwilliams/EditUltra

clone下来,用VS自行编译吧,我用的是Visual Studio 2019

编译前需要安装第三方依赖库:SciLexer、pcre、libcurl、iconv、openssl、MySQL、Oracle、hiredis。

4、功能导览

4.1. 一级菜单"文件"

4.1.1. 文件操作

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

一级菜单下面对文件的操作有新建打开...打开最近保存另存为...全部保存关闭关闭所有文件关闭除当前外所有文件

启用二级菜单文件变动检测可在每次文件选项卡选择该文件时自动检查文件是否变动,如果变动则重载文件。

启用二级菜单打开文件后设置为只读可在文件编辑期间临时对文件设置只读权限,防止别人打开修改。

4.1.2. 换行符风格

二级菜单新建文件换行符设置新建文件时使用的哪个操作系统风格的换行符。二级菜单全文转换换行符可在打开文件后调整文件中的换行符风格。换行符风格目前支持WINDOWS(CR+LF)MAC风格(CR)UNIX/Linux风格(LF)

4.1.3. 字符编码

二级菜单新建文件字符编码设置新建文件时使用的字符编码。二级菜单全文转换字符编码可在打开文件后调整文件中的字符编码。字符编码目前支持UTF-8GB18030BIG5

4.1.4. 远程文件管理器

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

远程文件管理器用于管理远程服务器地址簿。管理器对话框右边是远程服务器信息,填写完后点击测试远程文件服务器连接测试,如果测试通过的话,点击新建远程文件服务器连接加到左边列表中,注意连接名称中不能包含空格等白字符。更新远程文件服务器连接会把右边的信息修改到左边的列表中。左下角的删除远程文件管理器连接会删除左边列表中的当前选择项。

每个服务器连接信息对应一个配置文件confrfileser_(连接名称).conf

如果密码不填的话,会在每次启动后第一次展开文件资源管理器中该连接时要求输入密码,如果密码正确成功连接上,后续文件操作无需再输入密码。

4.2. 一级菜单"编辑"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.2.1. 剪切、复制、粘贴和删除

二级菜单高级剪切的三级菜单项剪切行用于剪切当前行到剪贴板,无需事前选择,剪切粘贴行把当前行移到下一行的下面,剪贴板里遗留一份当前行内容。

二级菜单高级复制的三级菜单项复制行用于复制当前行到剪贴板,无需事前选择,复制粘贴行把当前行向下复制一份,剪贴板里遗留一份当前行内容。

二级菜单高级粘贴的三级菜单项粘贴行用于把剪贴板里的内容粘贴作为当前行,往上粘贴行则是向上粘贴。

二级菜单高级删除的三级菜单项删除行用于删除当前行,无需事前选择。

4.2.2. 合并行

二级菜单合并行把下一行拼接到当前行的末尾,无需事前选择。

4.2.3. 大小写转换

二级菜单大小写转换用于对选择文本一起转换为大写或小写。

4.2.4. 启用编辑辅助功能

二级菜单启用自动补全关闭符号当在编辑区输入([{'"时自动补全关闭符号,但光标还是定位在输入字符和关闭字符之间。

二级菜单启用自动缩进当在编辑区输入回车时,如果当前行左边有白字符(空格、TAB),下一行也会自动加入这些白字符,光标定位在自动补充的白字符后面。

4.2.5. BASE64编解码

EditUltra支持用户直接对编辑区选择的文本做BASE64编码,并自动替换原选择文本,编码和解码是可逆的。

4.2.6. 散列/消息摘要

EditUltra支持用户直接对编辑区选择的文本做散列/消息摘要,并自动替换原选择文本,摘要算法是不可逆的。目前支持的摘要算法有MD5SHA1SHA256

4.2.7. DES加解密

EditUltra支持用户直接对编辑区选择的文本做3DES加解密,弹出对话框输入密钥(24字符,非十六进制展开),加密后按十六进制展开自动替换原选择文本,解密过程同之。

4.3. 一级菜单"搜索"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.3.1. 查找和替换

二级菜单查找...弹出查找对话框

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

可用普通文本正则表达式作为源匹配编辑区的文本,可选项整词匹配大小写匹配匹配单词开始决定匹配方式,非模态对话框按钮查找上一个查找下一个在不关闭查找对话框时定位编辑区匹配字符串处。

二级菜单查找下一个(或快捷键F3)、查找上一个(或快捷键Ctrl+F3)在不打开查找对话框直接匹配定位编辑区查找结果。

二级菜单替换...弹出替换对话框

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

非模态对话框按钮替换上一个替换下一个全部替换在不关闭替换对话框时替换所有编辑区匹配字符串处。

4.3.2. 快速选择

二级菜单全选或快捷键Ctrl+A选择全文,选择单词组或快捷键Ctrl+W全选当前位置所在单词,选择行或快捷键Ctrl+L全选当前位置所在行。

4.3.3. 高级选择

二级菜单向右累积选择单词向右累积选择单词组累积选择到下一个语句块首行用于累加调整选择文本。

假如一个变量名由三个单词组成,单词首字母大小,向右累积选择单词自动选择从当前位置到单词最后一个字母,向右累积选择单词组自动选择从当前位置到变量名结束,累积选择到下一个语句块首行自动选择从当前位置到空行分割的下一个语句块首行。

向左累积选择*亦然。

EditUltra支持定位多个位置或选择多个文本块,联动操作:输入、退格键、删除、复制等,快捷键为Ctrl+MouseLButtonClick或Ctrl+MouseLButtonDown+MouseMove+MouseLButtonUp+...。

比如拼接复制

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

比如在HTML的TD中同时设置class

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

EditUltra支持列选择,联动操作:输入、退格键、删除、复制等,快捷键为Alt+MouseLButton+MouseMove或Alt+Shift+Left/Right/Up/Down。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

作为一个合格的文本/源码编辑器,也支持选定文本后,自动高亮上下中相同的文本

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.3.4. 高级移动光标

同上,但是是移动光标,而不是累积选择。

这些操作配备快捷键实现与vim同等的快速处理。

4.3.5. 书签管理

二级菜单书签提供了对任意打开文件的任意行做行标记,便于事后快速跳跃。

切换书签的快捷键是F9增加书签的快捷键是Alt+F9删除书签的快捷键是Ctrl+F9删除所有书签的快捷键是Ctrl+Shift+F9

跳到上一个书签(当前文件)的快捷键是Ctrl+F2跳到下一个书签(当前文件)的快捷键是F2跳到上一个书签(所有打开的文件)的快捷键是Ctrl+Shift+F2跳到下一个书签(所有打开的文件)的快捷键是Shift+F2

4.3.6. 导航操作

二级菜单导航提供了由于鼠标点击定位而产生的位置链的快速退回功能,比如临时到另外一个文件中去复制一个字符串,然后直接跳回来。

退回到上一个位置(当前文件)的快捷键是Ctrl+Back退回到上一个位置(所有打开的文件)的快捷键是Ctrl+Shift+Back

4.4. 一级菜单"视图"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.4.1. 显示/隐藏文件资源树

二级菜单文件资源树用于显示/隐藏主窗口左边的文件资源管理器区域。

4.4.2. 调整字体颜色方案

二级菜单字体颜色方案用于调整字体颜色方案。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

EditUltra支持编程语言语法高亮、键入时弹出自动完成框、浮动显示语法提示、快速定位到库函数名等符号定义处。字体颜色方案对话框左下角为无高亮的普通文本和当前活动行的字体颜色设置,对话框左边为编程语言(C++、Java、Python等)的字体颜色设置,对话框右边为标记语言(HTML、CSS等)的字体颜色设置。

4.4.3. 显示/隐藏行号/书签

二级菜单显示行号显示书签用于显示/隐藏编辑区靠左的辅助区域里的行号、书签等标记。

4.4.4. 显示/隐藏白字符

二级菜单显示白字符用于使用可见标记显示空格和TAB,显示换行符用于使用可见标记显示换行符,显示缩进线用于使用可见标记显示同一缩进行集的缩进竖线。

4.4.5. 缩放

二级菜单缩放里面的放大缩小用于调大字体显示大小,不影响打印大小,不受字体颜色方案影响。可用重置缩放恢复原大小。

4.5. 一级菜单"编程"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.5.1. 语句块折叠

二级菜单启用语句块折叠用于开启/禁用语句块折叠功能,折叠标记显示在编辑区靠左的辅助区域中。

二级菜单语句块合拢语句块展开用于合拢和展开当前层级的语句块,语句块折叠切换用于切换合拢和展开。

二级菜单全部语句块合拢全部语句块展开用于一键合拢和展开所有层级的语句块。

4.5.2. 源代码符号表

EditUltra预置了众多语言的符号提取正则表达式(位于配置文件conf/doctype_(语言名).conf中的symbol_reqular_exp配置值),匹配出来的符号显示成编辑区右边的符号列表框中,可鼠标左键双击符号直接跳到符号定义处。用户可根据需要,自行修改配置文件以调整匹配式。

二级菜单跳到符号定义或快捷键F11可直接选定光标所在位置的单词组,从符号列表中查询出编辑区行号,跳到该行。

4.5.3. 自动完成和语法提示

EditUltra预置了众多语言的关键字和库函数名,(位于配置文件conf/doctype_(语言名).conf中的autocomplete.setcalltip.add配置值),当用户键入前N个字符时EditUltra会根据优化过的算法和数据结构快速筛选出匹配前N个字符的所有autocomplete.set组合,弹出自动完成框提供用户选择,当用户键入(,EditUltra会根据匹配的calltip.add,显示语法提示。个别语言可能会有不同的用户操作差异性,比如HTML的属性名自动完成列表是在用户在标记名后键入空格就自动弹出。用户可根据需要,自行修改配置文件以扩展名字空间。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端
这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.5.4. 数据库SQL文件

EditUltra约定了.sql为存放数据库SQL的文本文件,额外的,如果发现文件内容以某一特定注释格式(数据库自动连接配置头)出现,则提取相关信息作为连接数据库的参数,在打开文件完成后自动连接数据库,并获取所有能访问的表名列表以及字段信息列表显示到编辑区右边的符号树框中,用户等待连接完成后可直接选择文件后面的SQL并执行,如果执行的是SELECT语句还会把查询结果显示在编辑区下面的表格中。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

Oracle的数据库自动连接配置头长这个样子:

-- EDITULTRA BEGIN DATABASE CONNECTION CONFIG--  DBTYPE : Oracle--  DBHOST : (SIG)--  DBPORT : 0--  DBUSER : (连接用户名)--  DBPASS : [连接用户密码]--  DBNAME : -- EDITULTRA END DATABASE CONNECTION CONFIG

以下为一个Oracle配置示例:

-- EDITULTRA BEGIN DATABASE CONNECTION CONFIG--  DBTYPE : Oracle--  DBHOST : CALVINDB--  DBPORT : 0--  DBUSER : calvin--  DBPASS : --  DBNAME : calvindb-- EDITULTRA END DATABASE CONNECTION CONFIG

MySQL的数据库自动连接配置头长这个样子:

-- EDITULTRA BEGIN DATABASE CONNECTION CONFIG--  DBTYPE : MySQL--  DBHOST : (ip)--  DBPORT : (port)--  DBUSER : (连接用户名)--  DBPASS : [连接用户密码]--  DBNAME : (库名)-- EDITULTRA END DATABASE CONNECTION CONFIG

以下为一个MySQL配置示例:

-- EDITULTRA BEGIN DATABASE CONNECTION CONFIG--  DBTYPE : MySQL--  DBHOST : 127.0.0.1--  DBPORT : 3306--  DBUSER : calvin--  DBPASS : calvin--  DBNAME : calvindb-- EDITULTRA END DATABASE CONNECTION CONFIG

注意:连接用户密码可不配置,在每次连接数据库时会提示输入,如果连接成功后面会记住密码,直到程序结束。

数据库自动连接配置头比较难记,二级菜单插入数据库自动连接配置头可直接插入配置模板到当前SQL文件中,所以不用刻意去记她,不过每个配置项的含义和用法还是要记忆的。

二级菜单执行选定SQL或快捷键F5用于执行选定的SQL语句。

4.5.5. REDIS文件

REDIS自动连接配置头以及一键执行同数据库。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.6. 一级菜单"环境"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.6.1. WINDOWS资源管理器右键菜单

二级菜单文件右键弹出菜单用于向WINDOWS资源管理器右键菜单注册/卸载用 EditUltra 打开文件菜单项。

二级菜单目录右键弹出菜单用于向WINDOWS资源管理器右键菜单注册/卸载用 EditUltra 打开目录中所有文件菜单项。

注意:在WINDOWS10操作系统中执行以上两个菜单项需要管理员权限,可重新以管理员身份启动EditUltra主程序。

4.6.2. 处理当前文件和当前选择文本的命令

EditUltra允许自定义格式命令用于一键处理当前文件或当前编辑区选择文本。

二级菜单配置处理文件的命令用于配置处理当前文件的格式命令,用%F占位文件名,执行处理文件的命令用于执行该命令。

二级菜单配置处理选定文本的命令用于配置处理当前选定文本的格式命令,用%T占位选定文本,执行处理选定文本的命令用于执行该命令,比如打开浏览器提交选定文本为关键字给搜索引擎。

4.7. 一级菜单"帮助"

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

执行二级菜单关于展示EditUltra软件版权和引用第三方库列表。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

4.8. 目前支持语法高亮的语言列表

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

目前已支持25种编程语言和标记语言,每种语言的配置文件为conf/doctype_(语言名).conf,一般keywords.set配置为语法高亮单词列表,keywords2.set配置为库函数等第三方符号列表,autocomplete.set配置为键入时弹出自动完成单词列表,calltip.add为浮动显示语法提示文本,symbol_reqular_exp为正则表达式匹配源代码出符号表放到编辑区右边列表框供鼠标左键双击后直接跳到定义处行。

今后还将继续完善已有语言未实现功能,也将增加更多语言,也欢迎大家把急需的语言告知我优先添加,更欢迎大家帮我添加后PR我,谢谢。

4.9. 启动速度评测

CPU : i5-7500 3.4GHz内存 : 16GB操作系统 : WINDOWS 10测试说明 : 操作系统启动后,右键测试文本文件弹出菜单中选择打开约28KB大小的文件。

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

5. 最后

EditUltra,中国人开发开源的小巧快速又功能丰富的文本/源码编辑器(内嵌数据库客户端、Redis客户端)。

源码托管地址 : https://gitee.com/calvinwilliams/EditUltra

关于作者:厉华,成长在杭州,求学在杭州,工作在杭州,左手C,右手JAVA,写过小到性能卓越方便快捷的日志库、HTTP解析器、日志采集器等,大到交易平台/中间件等,分布式系统实践者,容器技术专研者,2003年大学毕业后一直从事Linux中后台开发,目前在某城商行负责基础架构。


●输入m获取到文章目录

推荐↓↓↓

 

这个神器,以为是文本编辑器,其实它是 MySQL 客户端,以为是 MySQL 客户端,其实它是 Redis 客户端

Web开发

更多推荐25个技术类微信公众号

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: