用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相关推荐
- 如何使用emacs编写c语言程序,并编译运行
vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...
- linux emacs使用教程,在ubuntu下使用emacs编写C语言程序
在学习Programming in C的第二遍,我在虚拟机中安装了ubuntu系统,在其中用文本编辑器emacs来写程序,这是我的开始. 在ubuntu中用emacs来写程序,首先我们得先一步一步来, ...
- Ubuntu下用Emacs编写D语言程序
一个很简单的程序,Hello,world 1.下载d-mode.el http://prowiki.org/wiki4d/wiki.cgi?EditorSupport/EmacsDMode 2.放 ...
- MyBatis中编写sql语句小于号报错
场景 在编写Mybatis的xml文件时使用>可以但是使用<报错. 解决 1.调换位置 比如a < b 改为b > a 2.使用代替符号
- MyBits学习总结(1)--- MyBits简介、编写一个MyBatis程序
MyBits学习总结(1)- MyBits简介.编写一个MyBatis程序 1. MyBits简介 什么是mybits? 在哪里找? mybatis原来不叫mybatis ,而叫 ibatis1.2: ...
- MyBatis中编写sql语句小于(<)号报错
应用场景 在编写Mybatis的xml文件时使用>可以但是使用<报错. 解决方法 1.调换位置 比如a < b 改为b > a 2.使用代替符号 我在这里使用的第二种方法
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- 最新Spring整合MyBatis详解教程
目录 1.导入相关jar包 1. junit 2. mybatis 3. mysql 4. spring相关 5. aop织入 6. mybatis-spring 7. lombok(选用) 2.回顾 ...
- 万事开头难!最新MyBatis程序配置教程(IDEA版)
目录 1.搭建实验数据库 2.IDEA新建项目,连接数据库 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建表对应实体类 6.编写Mapper接口 7.编写Mapper.xm ...
最新文章
- 回归算法 - 线性回归求解 θ(最大似然估计求解)
- Java学习必不可少的网站,快收藏起来
- 秦川团队《科学》刊发研究:新冠感染恒河猴康复后不会再感染
- zk服务器系统,windows系统搭建zookeeper服务器的教程
- Django使用Mysql时数据库配置
- 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
- 工业计算机远程控制,基于SOCKET技术的计算机远程控制实现
- 机器学习 (一)------分类
- weex android 交互,weex项目接入到Android studio中
- python 组合求和_39. 组合总和(Python)
- 易语言钩子DLL注入源码及源码说明
- OpenRefine
- 微信头像css 3圆形,如何在手机端用PICSART制作微信圆形头像(图文教程)
- Math三点共线判断
- java matlab 遗传算法_简单遗传算法MATLAB实现
- 红日安全attck靶场7 内网靶场 WP
- 浅入浅出数据分析之Hello NumPy系列(四)
- 用MFC画一个美国队长的盾牌
- python 简单绘图
- 重新认识java(十一)---- java中的数组
热门文章
- 【BZOJ4653】[Noi2016]区间 双指针法+线段树
- Go语言实现HashSet
- 网页设计趋势:模糊背景在网站中的经典应用案例
- [导入]VB PE导出/输入表演示(读文件版)
- 网页中层或菜单被Flash挡住的解决办法
- InstallShield For .Net制作.Net项目安装包之完整代码
- SpringMVC学习记录--Validator验证分析
- DevOps时代,企业数字化转型需要强大的工具链
- 一步一步图文介绍SpriteKit使用TexturePacker导出的纹理集Altas
- office漏洞利用--获取shell