soplex.el
The snippet can be accessed without any authentication.
Authored by
Harikrishnan Mulackal
Edited
;; A emacs package to help with templating soplex
;; For making case replace as case sensitive
(customize-set-variable case-fold-search nil)
(defun hpp-rename (buff)
;; Rename the .cpp or .h file with hpp
(if (string-match-p (regexp-quote "\.h") buff) ;Check if it is a .h file or
;.cpp
(replace-regexp-in-string "\.h" ".hpp" buff)
(replace-regexp-in-string "\.cpp" ".hpp" buff)))
(defun soplex-replace (what with)
;; Helper function to do replacements in buffer
(beginning-of-buffer)
(while (search-forward what nil t)
(replace-match with nil t)))
(defun soplex-replace-regexp (what with)
;; Helper function to do replacements in buffer
(beginning-of-buffer)
(while (search-forward-regexp what nil t)
(replace-match with nil t)))
;; For making changes inside the cpp file
(defun soplex-transform-cpp ()
;;
(interactive)
(soplex-changes)
(save-buffer)
(do-rename)
)
;; A helper function
(defun soplex-changes ()
;; The changes that happens to the buffer
;; Basic changes
(soplex-replace "template <>" "template <class R>") ;Do find and replace
(soplex-replace "<Real>" "<R>")
;; todo: a better way is to use \_> and \_<
;; VectorClasses
(soplex-replace-regexp "\\bVectorReal\\b" "VectorBase<R>")
(soplex-replace-regexp "\\bVector\\b" "VectorBase<R>")
(soplex-replace-regexp "\\bDSVectorReal\\b" "DSVectorBase<R>")
(soplex-replace-regexp "\\bDSVector\\b" "DSVectorBase<R>")
(soplex-replace-regexp "\\bDVectorReal\\b" "DVectorBase<R>")
(soplex-replace-regexp "\\bDVector\\b" "DVectorBase<R>")
(soplex-replace-regexp "\\bSVectorReal\\b" "SVectorBase<R>")
(soplex-replace-regexp "\\bSVector\\b" "SVectorBase<R>")
(soplex-replace-regexp "\\bSSVector\\b" "SSVectorBase<R> ")
(soplex-replace-regexp "\\bSSVectorReal\\b" "SSVectorBase<R> ")
(soplex-replace-regexp "\\bSVSet\\b" "SVSetBase<R> ")
(soplex-replace-regexp "\\bSPxLPReal\\b" "SPxLPBase<R>")
(soplex-replace-regexp "\\bSPxLP\\b" "SPxLPBase<R>")
(soplex-replace-regexp "\\bLPRow\\b" "LPRowBase<R>")
(soplex-replace-regexp "\\bLPRowSet\\b" "LPRowSetBase<R>")
(soplex-replace-regexp "\\bLPCol\\b" "LPColSetBase<R>")
(soplex-replace-regexp "\\bLPColSet<R>\\b" "LPColSetBase<R>")
;; Real to R
(soplex-replace-regexp "\\bReal\\b" "R")
)
(defun do-rename ()
;; change the extension of the current buffer from .cpp to .hpp
(rename-file (buffer-name) (replace-regexp-in-string "\.cpp" ".hpp" (buffer-name)
)
)
)
;; Only one instance of the file should be open
(defun soplex-move-to-hpp (beg end)
;; Move the region to corresponding hpp file
(interactive "r")
(setq buffname (buffer-name))
(message buffname)
(kill-region beg end) ;Kill the region
(save-buffer)
(with-temp-buffer ;Do everything in the temp buffer now
(yank) ;Paste the killed region
(soplex-changes)
(setq cont (buffer-string))
;; Go to corresponding file and do the thing
(find-file (hpp-rename buffname))
(end-of-buffer)
(insert cont)
;; (spacemacs/indent-region-or-buffer) ;TODO instead of indenting the whole
;buffer, only indent the required lines.
;Would improve the performance well.
(save-buffer)
(kill-buffer)
))
;; Set keybinding for soplex-move-to-hpp and soplex-transform-cpp
(global-set-key (kbd "M-p") 'soplex-move-to-hpp)
(global-set-key (kbd "M-C-p") 'soplex-transform-cpp)
;; todo, implement the rename function in transform cpp part?