Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Compare the difference in PO fuzzy string
;;; po-fuzzy-diff.el --- Compare the difference in PO fuzzy string
;; Copyright (C) 2013 Akihiro Motoki <>
;; Author: Akihiro Motoki <>
;; Keywords: convenience po-mode
;; 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 2, 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
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; po-fuzzy-diff makes it easier to check the difference
;; in a PO fuzzy msgid string.
;; This command works only in po-mode.
;; Run this command around fuzzy msgid string in a PO file.
;;; Installation
;; (require 'po-fuzzy-diff)
;; (define-key po-mode-map "\M-=" 'po-fuzzy-diff)
;;; History:
;; 1.0: Initial revision
;;; Code:
(defun po-fuzzy-diff ()
"Check a difference in fuzzy contents."
(let (begin end prevfile newfile diffbuf)
(re-search-backward "^$" nil t)
(setq begin (point))
(re-search-forward "^msgstr " nil t)
(setq end (point))
(goto-char begin)
(if (not (and (re-search-forward "^#| msgid " nil t)
(< (point) end)))
(error "Valid fuzzy section not found."))
(setq begin (point))
;; cut text from the original buffer
(kill-ring-save begin end)
;; previous string
(goto-char (point-min))
(re-search-forward "^msgid " nil t)
(move-beginning-of-line nil)
(kill-region (point) (point-max))
(goto-char (point-min))
(replace-regexp "^#| " "" nil (point-min) (point-max))
(replace-regexp "^msgid " "" nil (point-min) (point-max))
(replace-regexp "^\"" "" nil (point-min) (point-max))
(replace-regexp "\"$" "" nil (point-min) (point-max))
(setq prevfile (make-temp-file "podiff"))
(write-region (point-min) (point-max) prevfile))
(goto-char (point-min))
(replace-regexp "^msgid " "" nil (point-min) (point-max))
(replace-regexp "^\"" "" nil (point-min) (point-max))
(replace-regexp "\"$" "" nil (point-min) (point-max))
(setq newfile (make-temp-file "podiff"))
(write-region (point-min) (point-max) newfile))
(setq diffbuf (diff prevfile newfile "-c" 'no-async))
(set-buffer diffbuf)
(toggle-read-only t)
(set-buffer-modified-p nil)
(pop-to-buffer diffbuf)
(delete-file prevfile)
(delete-file newfile))))
(provide 'po-fuzzy-diff)
;;; po-fuzzy-diff.el ends here
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment