packages feed

structured-haskell-mode-1.0.3: elisp/shm-edit-string.el

;;; shm-edit-string.el --- Editing strings

;; Copyright (c) 2014 Chris Done. All rights reserved.

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Code:

(require 'shm-insert-del)
(require 'shm-layout)

(defvar shm-string-buffer nil
  "The buffer of the string node that's currently being edited.")

(defvar shm-string-node nil
  "The string node that's currently being edited.")

(defun shm/edit-string ()
  "Edit the string at point."
  (interactive)
  (let ((current (shm-current-node))
        (buffer (current-buffer))
        (string (shm-kill-node 'buffer-substring-no-properties nil nil t)))
    (goto-char (shm-node-start current))
    (switch-to-buffer (get-buffer-create "*shm-string*"))
    (erase-buffer)
    (insert
     (replace-regexp-in-string
      "\\\\\"" "\""
      (replace-regexp-in-string
       "\\\\n" "\n"
       (replace-regexp-in-string
        "^\"\\(.*\\)\"$" "\\1"
        (replace-regexp-in-string
         "\\\\\n\\\\" ""
         string)))))
    (shm-edit-string-mode)
    (set (make-local-variable 'shm-string-node)
         current)
    (set (make-local-variable 'shm-string-buffer)
         buffer)
    (goto-char (point-min))))

(define-derived-mode shm-edit-string-mode
  text-mode "String"
  "Major mode for editing string content from a Haskell string.")

(define-key shm-edit-string-mode-map (kbd "C-c C-c") 'shm-finish-editing-string)

(defun shm-finish-editing-string ()
  "Take the contents of the buffer and insert it back into the
original node in the Haskell buffer, replacing the old one."
  (interactive)
  (let ((finish-string (buffer-string))
        (buffer shm-string-buffer))
    (quit-window)
    (switch-to-buffer buffer)
    (shm/delete)
    (insert "\"\"")
    (forward-char -1)
    (save-excursion
      (font-lock-fontify-region (line-beginning-position)
                                (line-end-position)))
    (shm-insert-indented (lambda () (insert finish-string)))
    (forward-char -1)))

(provide 'shm-edit-string)