用Emacs编写mybatis

*/-->

code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}

用Emacs编写mybatis

Table of Contents

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 25.3.1 (Org mode 8.2.10)

Validate

用Emacs编写mybatis的更多相关文章

  1. 如何使用emacs编写c语言程序,并编译运行

    vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...

  2. 天哪!手动编写mybatis雏形竟然这么简单

    前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...

  3. 阶段3 3.SpringMVC·_07.SSM整合案例_07.ssm整合之编写MyBatis框架测试保存的方法

    再写一个测试的方法,测试save保存的方法 需要提交事务才能保存到数据库

  4. 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架

    需要先搭建Mybits的环境. 用Mybits的注解的方式.把两个方法的sql语句写完 SqlMapConfig.xml resources下新建xml文档 把约束粘贴过来 两步操作 环境标签叫做en ...

  5. 移动商城第三篇【搭建Mybatis和Spring环境、编写Dao、Service在Core模块】

    Mybatis和Spring环境搭建 由于我们的所编写的dao层.service代码可能前台和后台都需要用到的,因此我们把环境搭建在core模块中 逆向工程 首先,我们要做的就是品牌管理,我们首先来看 ...

  6. mybatis动态注解sql编写注意事项

    最近在编写mybatis的动态注解sql遇到了不少的坑,在网上看到一篇讲的比较详细的文章,记录一下: https://mbd.baidu.com/newspage/data/landingshare? ...

  7. MyBatis Dao层的编写

    传统的dao层编写 以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao: public interface StudentDao { public void inser ...

  8. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  9. mybatis-generator-gui--一个mybatis代码自动生成界面工具

    mybatis-generator-gui是什么 介绍mybatis-generator-gui之前,有必要介绍一下什么是mybatis generator(熟悉的同学可以跳过这一节).我们都知道,通 ...

随机推荐

  1. glibc2.22

                 

  2. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

  3. linux命令之 repeat 重复执行命令

    $ vim ~/.bashrc function repeat() { number=$1 shift echo $@ for n in $(seq $number); do $@ done } $ ...

  4. tomcat启动报错:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener

    1.错误信息: 严重: Error configuring application listener of class org.springframework.web.context.ContextL ...

  5. 将postgresql中的数据实时同步到kafka中

    参考地址:https://blog.csdn.net/weixin_33985507/article/details/92460419 参考地址:https://mp.weixin.qq.com/s/ ...

  6. 对react的研究0

    对react的研究1.class HelloMessage extends React.Component { render() { return ( <div> Hello {this. ...

  7. tensorboard可视化(先写一点点)

    在tensorboard上显示运行图: import tensorflow as tf a = tf.constant(10,name="a") b = tf.constant(9 ...

  8. javaSE之运行时异常和编译时异常

    运行时异常继承自RuntimeException; package foundationEnhance; public class Person { private int age; public P ...

  9. Mac Pro 安装win10记录(不用优盘版)

    用启动转换助理 就可以了提前下好win10 iso系统镜像文件,然后Mac会自动安装.然后一直下一步就可以了. 我这次装好之后无法连接网络,发现是因为win网卡驱动没有,所以回到Mac系统下 把需要的 ...

  10. web应用,http协议简介,web框架

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...