用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. Robot Framework 源码阅读 day2 TestSuitBuilder

    接上一篇 day1 run.py 发现build test suit还挺复杂的, 先从官网API找到了一些资料,可以看出这是robotframework进行组织 测试案例实现的重要步骤, 将传入的te ...

  2. 好玩的Linux命令-1

    Ag:比grep.ack更快的归递搜索文件内容 1:首先在linux创建个sh文件->ag.sh 2:在ag.sh里面输入如下内容并保存 #!/bin/bash set -x TEMP_DIR= ...

  3. 查询sql server占用内存的情况

    se master go select * from sysperfinfo where counter_name like '%Total Server Memory (KB)%' go

  4. 关于discuz论坛邮箱配置

    Discuz后台可以进行邮件设置,实现网站自动发送邮件给用户的邮箱. 在Discuz邮件设置,经常使用25端口普通发送邮件.为了数据安全,我们也可以使用SSL加密发送,设置方法很简单,只需按照下图进行 ...

  5. 树——binary-tree-postorder-traversal(树的前序遍历)

    问题: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...

  6. fastjson合并json数组中相同的某个元素

    /** * @param array JSON数组 * @param array 需合并后的某个元素名 */ private static JSONArray mgreArray(JSONArray ...

  7. 牛客ACM赛 B [小a的旅行计划 ]

    链接 B 小a的旅行计划 把\(n\)个数中选任意数分成\(a,b\)两个集合,集合无区别,要求不包含且有交,求方案数.\(n\leq 10^{13}\) 首先讨论\(a,b\)并集是否为全集: 若是 ...

  8. luogu4061 大吉大利,晚上吃鸡!

    链接 最短路径\(dag\),一道好题. 题目大意:求一张图中满足下列要求的点对\((i,j)\)数量: 所有最短路径必定会经过 \(i\) 点和 \(j\) 点中的任意一点. 不存在一条最短路同时经 ...

  9. spring boot 集成 websocket 实现消息主动推送

    spring boot 集成 websocket 实现消息主动 前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单 ...

  10. js获取(URL)地址栏参数

      //获取地址栏参数 //url为空时为调用当前url地址 //调用方法为 var params = getPatams(); function getParams(url) { var theRe ...