<?xml version="1.0" encoding="utf-8"?> 用Emacs编写mybatis

用Emacs编写mybatis

Table of Contents

  • 1. 效果图
  • 2. 配置

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

转载于:https://www.cnblogs.com/yangwen0228/p/8047805.html

用Emacs编写mybatis相关推荐

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

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

  2. linux emacs使用教程,在ubuntu下使用emacs编写C语言程序

    在学习Programming in C的第二遍,我在虚拟机中安装了ubuntu系统,在其中用文本编辑器emacs来写程序,这是我的开始. 在ubuntu中用emacs来写程序,首先我们得先一步一步来, ...

  3. Ubuntu下用Emacs编写D语言程序

    一个很简单的程序,Hello,world 1.下载d-mode.el http://prowiki.org/wiki4d/wiki.cgi?EditorSupport/EmacsDMode 2.放 ...

  4. MyBatis中编写sql语句小于号报错

    场景 在编写Mybatis的xml文件时使用>可以但是使用<报错. 解决 1.调换位置 比如a < b 改为b > a 2.使用代替符号

  5. MyBits学习总结(1)--- MyBits简介、编写一个MyBatis程序

    MyBits学习总结(1)- MyBits简介.编写一个MyBatis程序 1. MyBits简介 什么是mybits? 在哪里找? mybatis原来不叫mybatis ,而叫 ibatis1.2: ...

  6. MyBatis中编写sql语句小于(<)号报错

    应用场景 在编写Mybatis的xml文件时使用>可以但是使用<报错. 解决方法 1.调换位置 比如a < b 改为b > a 2.使用代替符号 我在这里使用的第二种方法

  7. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  8. 最新Spring整合MyBatis详解教程

    目录 1.导入相关jar包 1. junit 2. mybatis 3. mysql 4. spring相关 5. aop织入 6. mybatis-spring 7. lombok(选用) 2.回顾 ...

  9. 万事开头难!最新MyBatis程序配置教程(IDEA版)

    目录 1.搭建实验数据库 2.IDEA新建项目,连接数据库 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建表对应实体类 6.编写Mapper接口 7.编写Mapper.xm ...

最新文章

  1. 回归算法 - 线性回归求解 θ(最大似然估计求解)
  2. Java学习必不可少的网站,快收藏起来
  3. 秦川团队《科学》刊发研究:新冠感染恒河猴康复后不会再感染
  4. zk服务器系统,windows系统搭建zookeeper服务器的教程
  5. Django使用Mysql时数据库配置
  6. 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
  7. 工业计算机远程控制,基于SOCKET技术的计算机远程控制实现
  8. 机器学习 (一)------分类
  9. weex android 交互,weex项目接入到Android studio中
  10. python 组合求和_39. 组合总和(Python)
  11. 易语言钩子DLL注入源码及源码说明
  12. OpenRefine
  13. 微信头像css 3圆形,如何在手机端用PICSART制作微信圆形头像(图文教程)
  14. Math三点共线判断
  15. java matlab 遗传算法_简单遗传算法MATLAB实现
  16. 红日安全attck靶场7 内网靶场 WP
  17. 浅入浅出数据分析之Hello NumPy系列(四)
  18. 用MFC画一个美国队长的盾牌
  19. python 简单绘图
  20. 重新认识java(十一)---- java中的数组

热门文章

  1. 【BZOJ4653】[Noi2016]区间 双指针法+线段树
  2. Go语言实现HashSet
  3. 网页设计趋势:模糊背景在网站中的经典应用案例
  4. [导入]VB PE导出/输入表演示(读文件版)
  5. 网页中层或菜单被Flash挡住的解决办法
  6. InstallShield For .Net制作.Net项目安装包之完整代码
  7. SpringMVC学习记录--Validator验证分析
  8. DevOps时代,企业数字化转型需要强大的工具链
  9. 一步一步图文介绍SpriteKit使用TexturePacker导出的纹理集Altas
  10. office漏洞利用--获取shell