日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Emacs编写mybatis

發布時間:2023/11/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Emacs编写mybatis 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<?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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。