用Emacs编写mybatis

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

用Emacs编写mybatis

Table of Contents

  • 1. 效果图
  • 2. 配置

1 效果图

screenshot_2017-12-16_22-01-27.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lambda显式声明返回值

10.21 编写一个lambda&#xff0c;捕获一个局部int变量&#xff0c;并递减变量值&#xff0c;直至它变为0.一旦变量变为0&#xff0c;再调用lambda应该不再递减变量。lambda应该返回一个bool值&#xff0c;指出捕获的变量是否为0. #include<iostream> #include<algori…

【Codeforces Round #452 (Div. 2) C】 Dividing the numbers

【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 n为偶数。 l 1, r n (l,r)放在一组 l,r-- 新的l,r放在另外一组 直到l1r 这个时候,判断两组的和,如果一样的话,分散在两组 差为1否则差为0n为奇数 l 2,r n (l,r)放在一组 l,r-- 新的l,r放在另外一组 直到l1r…

java中reject方法作用_Java BindingResult.rejectValue方法代碼示例

本文整理匯總了Java中org.springframework.validation.BindingResult.rejectValue方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java BindingResult.rejectValue方法的具體用法&#xff1f;Java BindingResult.rejectValue怎麽用&#xff1f;Java BindingResult.r…

java方法参数

Java程序设计语言总是采用值调用。也就是说&#xff0c;方法得到的是所有参数的一个拷贝&#xff0c;特别是方法不能修改传递给它的任何参数变量的内容。 基本类型参数 1&#xff09;X被初始化为percent值的一个拷贝&#xff1b; 2&#xff09;X被乘以3等于30。但是percent仍然…

SaltStack源码分析之:master端执行salt模块大致流程

2019独角兽企业重金招聘Python工程师标准>>> ##JOB执行流程 先看下官网对于master端的工作流程的介绍&#xff1a; The Salt master works by always publishing commands to all connected minions and the minions decide if the command is meant for them by ch…

myecplise新建Maven项目Filter选什么,使用myeclipse建立maven项目

myecplise新建Maven项目Filter选什么 使用myeclipse建立maven项目 1234567分步阅读maven是管理项目的&#xff0c;myeclipse是编写代码的。第一次写项目都要配置好多东西&#xff0c;很麻烦&#xff0c;now 来看看怎样新建一个maven项目。 工具/原料 myeclipsemaven方法/步骤 1…

python参数传递时不构造新数据对象_关于函数的参数传递(parameter passing),以下选项中描述错误的是_学小易找答案...

【单选题】下面代码的输出结果是: a [] for i in range(2,10): count 0 for x in range(2,i-1): if i % x 0: count 1 if count 0: a.append(i) print(a)【单选题】Python3.0正式发布的年份是【单选题】以下选项中,对于函数的定义错误的是【单选题】关于函数的参数传递(pa…

关于TCP/IP与数据传输

一、TCP/IP的具体含义&#xff1a; 从字面意思来讲&#xff0c;很多人会认为TCP/IP是指TCP与IP这两种协议。有时确实也可以说是这两种协议&#xff0c;但是大部分情况下所说的是利用IP进行通信时所必须用到的协议群的统称。具体来说IP,ICMP,TCP,UDP,FTP以及HTTP等都属于TCP/IP协…

geohash php_空间索引-geohash算法实现

算法简介geohash是实现空间索引的一种算法,其他实现空间索引的算法有:R树和其变种GIST树、四叉树、网格索引等算法基本原理geohash算法将地球理解为一个二维平面&#xff0c;将平面递归分解成更小的子块&#xff0c;每个子块在一定经纬度范围内拥有相同的编码&#xff0c;这种方…

ActiveReports 报表控件V12新特性 -- 新增JSON和CSV导出

ActiveReports 报表控件V12新特性 -- 新增JSON和CSV导出 ActiveReports 是一款专注于 .NET 平台的报表控件&#xff0c;全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求&#xff0c;作为专业的报表工具为全球超过 300,000 开发人员提…

Codeforces Round #112 (Div. 2)---A. Supercentral Point

Supercentral Pointtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputOne day Vasya painted a Cartesian coordinate system on a piece of paper and marked some set of points (x1, y1), (x2, y2), ..., (xn,…

php imap配置,怎么为PHP编译imap扩展?

为PHP编译imap扩展的方法&#xff1a;首先安装“imap-open2007e”&#xff1b;然后下载源代码&#xff1b;接着准备好系统的“imap-open”环境&#xff1b;最后进入“./ext/extension/imap/”文件夹下执行“make”命令即可。怎么为PHP编译imap扩展&#xff1f;最近为项目增加了…

加载指定路径下所有文件

工作中经常遇到加载某个文件夹下的所有文件&#xff0c;然后对文件遍历&#xff0c;今天写代码时遇到一个好的类ArrayDeque&#xff0c;整理一下&#xff0c;做一下笔记 下面写了一个测试类 package com.hpzx.test;import java.io.File; import java.util.ArrayDeque; import j…

每日站立会议个人博客二

事件昨天干了什么优化了商品详细信息界面的多个图片显示方式今天要做什么对商品搜索结果页面进行深度优化&#xff0c;增加搜索筛选功能遇到的问题多图片显示实现过程中&#xff0c;图片的排列方式出现了问题。转载于:https://www.cnblogs.com/mqlblog/p/8063718.html

vmware安装minimal centos报错/etc/rc5.d/s99local : line

2019独角兽企业重金招聘Python工程师标准>>> 有人用vmware安装minimal centos报错/etc/rc5.d/s99local : line:25 : eject : command not found 。我们看下完整报错内容&#xff1a; Installing VMware Tools, please wait...mount: special device /dev/hda does n…

php print div,JavaScrip实现PHP print_r的数功能(三种方法)

方法一function print_r(theObj) {var retStr ;if (typeof theObj object) {retStr ;for (var p in theObj) {if (typeof theObj[p] object) {retStr [p] > typeof(theObj) ;retStr print_r(theObj[p]) ;} else {retStr [p] > theObj[p] ;}}retStr ;}re…

Android源代码下载方法具体解释

作者&#xff1a;张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经&#xff0c;如今假设这么运行的话&#xff0c;会显演示样例如以下内容 Initialized empty Git repository in /home/star/w…

一些概念

1. 分布式锁&#xff1a;考虑利用redis的原子性特性&#xff0c;先确定redis中是否已处理过某个请求。如果没有&#xff0c;就创建&#xff0c;然后执行。执行完&#xff0c;清除redis里面的标记。因为redis是共享的&#xff0c;所以这种方式可以过滤掉重复请求引起的问题。 2.…

linux function

#!/bin/bashfunction sayHello() { #这里的{ 和它前面的)之间可以没有空格echo "Hello $1" }sayHello Neeky 转载于:https://www.cnblogs.com/JiangLe/p/5100271.html