用Emacs编写mybatis
用Emacs编写mybatis
*/-->
code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}
用Emacs编写mybatis
1 效果图

2 配置
现在web开发,最流行的orm框架非mybatis莫属了,它功能强大,编写简单灵活,可以直接编写SQL,也可以添加条件控制。但是,正是因为mybatis采用xml作为结构语言,所以,难免会有大量的xml和sql混杂在一起的代码,对这些代码对语法高亮以及自动缩减就是一个问题。
在Emacs中对xml有web-mode对其提供了非常好的支持,无论是缩进、跳转、剪切、拷贝、折叠等等操作都非常简单高效,远超各种IDE。对SQL也有很好的支持。但是对于mybatis却没有任何支持,用web-mode则sql无法高亮和缩进,用sql则基础xml结构缩减有问题。网上关于Emacs中编写mybatis的也甚少有涉及的,说明用Emacs来进行java开发的还是很少的。于是,只能本人自己思考解决方案了。
我记得之前Purcell大神写了一个mmm-mode,说是可以把多个mode放到一起,不知是作何用,说不定可以让web-mode支持sql语句。于是就在package管理中安装了mmm-mode。然后,配置了web-mode中对sql-mode的支持:
(mmm-add-classes
'((web-sql-select :submode sql-mode
:front "<select[^>]*>[ \t]*\n" :back "[ \t]*</select>")
(web-sql-insert :submode sql-mode
:front "<insert[^>]*>[ \t]*\n" :back "[ \t]*</insert>")
(web-sql-update :submode sql-mode
:front "<update[^>]*>[ \t]*\n" :back "[ \t]*</update>")
(web-sql-delete :submode sql-mode
:front "<delete[^>]*>[ \t]*\n" :back "[ \t]*</delete>")
)) (mmm-add-mode-ext-class 'web-mode nil 'web-sql-select)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-insert)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-update)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-delete)
其实就是根据正则表达式来确定哪些代码是属于指定的submode的,对于mybatis中的sql语句而言,很简单就可以找出哪些是sql语句了。
然后,比较难的是对齐,因为两种语言混杂在一起,用其中任一一种都有问题。经过仔细的思考和试验之后,发现一种配置是相对合理,且实现简单的:
(defun mmm-indent-line-web-sql-submode ()
(web-mode-propertize)
(let (cur-type prev-type)
(save-excursion
(back-to-indentation)
(setq cur-type (get-text-property (point) 'tag-type)))
(save-excursion
(previous-line)
(back-to-indentation)
(setq prev-type (get-text-property (point) 'tag-type)))
(if (or
(not (or prev-type cur-type)) ; both lines sql
(and (not prev-type) (eq cur-type 'start)) ; sql -> xml
)
(sql-indent-line)
(web-mode-indent-line)))) (defun mmm-indent-line-web-sql ()
(interactive)
(funcall
(save-excursion
(back-to-indentation)
(mmm-update-submode-region)
(if (and mmm-current-overlay
(> (overlay-end mmm-current-overlay) (point)))
'mmm-indent-line-web-sql-submode
'web-mode-indent-line)))) (setq mmm-indent-line-function 'mmm-indent-line-web-sql)
如此,只使用mmm-mode用来支持mybatis的话,再加上一些其他的小配置,比如更新之后自动刷新语法高亮等,就很简单了:
(setq mmm-parse-when-idle t)
(setq mmm-global-classes nil)
(setq mmm-classes-alist nil)
(setq mmm-mode-ext-classes-alist nil)
总的配置,可以去我的github上查看,也可以直接拷贝下面的代码:
;;; init-mmm.el --- Summary
;;; Commentary:
;; comments ;;; Code:
(use-package mmm-mode
;; :hook ((web-mode . mmm-mode))
:commands mmm-mode
:config
(defun mmm-indent-line-web-sql-submode ()
(web-mode-propertize)
(let (cur-type prev-type)
(save-excursion
(back-to-indentation)
(setq cur-type (get-text-property (point) 'tag-type)))
(save-excursion
(previous-line)
(back-to-indentation)
(setq prev-type (get-text-property (point) 'tag-type)))
(if (or
(not (or prev-type cur-type)) ; both lines sql
(and (not prev-type) (eq cur-type 'start)) ; sql -> xml
)
(sql-indent-line)
(web-mode-indent-line)))) (defun mmm-indent-line-web-sql ()
(interactive)
(funcall
(save-excursion
(back-to-indentation)
(mmm-update-submode-region)
(if (and mmm-current-overlay
(> (overlay-end mmm-current-overlay) (point)))
'mmm-indent-line-web-sql-submode
'web-mode-indent-line)))) (setq mmm-parse-when-idle t)
(setq mmm-global-classes nil)
(setq mmm-classes-alist nil)
(setq mmm-mode-ext-classes-alist nil)
(setq mmm-indent-line-function 'mmm-indent-line-web-sql) (mmm-add-classes
'((web-sql-select :submode sql-mode
:front "<select[^>]*>[ \t]*\n" :back "[ \t]*</select>")
(web-sql-insert :submode sql-mode
:front "<insert[^>]*>[ \t]*\n" :back "[ \t]*</insert>")
(web-sql-update :submode sql-mode
:front "<update[^>]*>[ \t]*\n" :back "[ \t]*</update>")
(web-sql-delete :submode sql-mode
:front "<delete[^>]*>[ \t]*\n" :back "[ \t]*</delete>")
)) (mmm-add-mode-ext-class 'web-mode nil 'web-sql-select)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-insert)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-update)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-delete)
) (provide 'init-mmm)
;;; init-mmm.el ends here
Date: 2017-12-16 21:17
Author: WEN YANG
Created: 2017-12-16 Sat 22:02
用Emacs编写mybatis的更多相关文章
- 如何使用emacs编写c语言程序,并编译运行
vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...
- 天哪!手动编写mybatis雏形竟然这么简单
前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...
- 阶段3 3.SpringMVC·_07.SSM整合案例_07.ssm整合之编写MyBatis框架测试保存的方法
再写一个测试的方法,测试save保存的方法 需要提交事务才能保存到数据库
- 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
需要先搭建Mybits的环境. 用Mybits的注解的方式.把两个方法的sql语句写完 SqlMapConfig.xml resources下新建xml文档 把约束粘贴过来 两步操作 环境标签叫做en ...
- 移动商城第三篇【搭建Mybatis和Spring环境、编写Dao、Service在Core模块】
Mybatis和Spring环境搭建 由于我们的所编写的dao层.service代码可能前台和后台都需要用到的,因此我们把环境搭建在core模块中 逆向工程 首先,我们要做的就是品牌管理,我们首先来看 ...
- mybatis动态注解sql编写注意事项
最近在编写mybatis的动态注解sql遇到了不少的坑,在网上看到一篇讲的比较详细的文章,记录一下: https://mbd.baidu.com/newspage/data/landingshare? ...
- MyBatis Dao层的编写
传统的dao层编写 以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao: public interface StudentDao { public void inser ...
- 自己动手编写一个Mybatis插件:Mybatis脱敏插件
1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...
- mybatis-generator-gui--一个mybatis代码自动生成界面工具
mybatis-generator-gui是什么 介绍mybatis-generator-gui之前,有必要介绍一下什么是mybatis generator(熟悉的同学可以跳过这一节).我们都知道,通 ...
随机推荐
- 编辑器和IDE的区别以及WebStorm和PhpStorm的区别
编辑器和IDE的区别: 编辑器就是纯粹编辑文本的编辑器,识别级别在文字级,只显示你想写入和打开的文本内容,不管你写什么内容,只提供接收与显示功能,Windows自带的写字板就是最简单的编辑器.举个生活 ...
- CSS中如何设置父元素透明度不影响子元素透明度
原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...
- pg_resetxlog - 重置一个 PostgreSQL 数据库集群的预写日志以及其它控制内容
SYNOPSIS pg_resetxlog [ -f ] [ -n ] [ -o oid] [ -x xid] [ -l fileid,seg] datadir DESCRIPTION 描述 pg_r ...
- intel vtune 介绍、安装和使用
intel vtune 介绍 https://software.intel.com/en-us/vtune intel vtune 安装包下载地址 https://software.intel.com ...
- [Luogu1220]关路灯(区间dp)
[Luogu1220]关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏 ...
- 阿里云轻应用云服务器配置tomcat
#etc/profile export CATALINA_HOME=/wocloud/tomcat_cluster/tomcat1/apache-tomcat-7.0.57 #查看防火墙状态 fire ...
- pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
- Apache HttpClient之fluent API的使用
该方法为Apache HttpClient 4.5以上的版本支持,在官网有明确的说明. 对比以前的方式,其优点是代码更简洁,同时为线程安全的.仅举一个最简单的post栗子 JAR包信息: <de ...
- $nextTick
Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextT ...
- 卷积神经网络(Text--cnn)(知识点整理)
参考:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ 独热编码(one- ...