--- /dev/null
+;;; go-keyify.el --- keyify integration for Emacs
+
+;; Copyright 2016 Dominik Honnef. All rights reserved.
+;; Use of this source code is governed by a BSD-style
+;; license that can be found in the LICENSE file.
+
+;; Author: Dominik Honnef
+;; Version: 1.0.0
+;; Keywords: languages go
+;; URL: https://github.com/dominikh/go-keyify
+;;
+;; This file is not part of GNU Emacs.
+
+;;; Code:
+
+(require 'json)
+
+;;;###autoload
+(defun go-keyify ()
+ "Turn an unkeyed struct literal into a keyed one.
+
+Call with point on or in a struct literal."
+ (interactive)
+ (let* ((name (buffer-file-name))
+ (point (point))
+ (bpoint (1- (position-bytes point)))
+ (out (get-buffer-create "*go-keyify-output")))
+ (with-current-buffer out
+ (setq buffer-read-only nil)
+ (erase-buffer))
+ (with-current-buffer (get-buffer-create "*go-keyify-input*")
+ (setq buffer-read-only nil)
+ (erase-buffer)
+ (go--insert-modified-files)
+ (call-process-region (point-min) (point-max) "keyify" t out nil
+ "-modified"
+ "-json"
+ (format "%s:#%d" name bpoint)))
+ (let ((res (with-current-buffer out
+ (goto-char (point-min))
+ (json-read))))
+ (delete-region
+ (1+ (cdr (assoc 'start res)))
+ (1+ (cdr (assoc 'end res))))
+ (insert (cdr (assoc 'replacement res)))
+ (indent-region (1+ (cdr (assoc 'start res))) (point))
+ (goto-char point))))
+
+(provide 'go-keyify)
+
+;;; go-keyify.el ends here