]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new macro with-locale-environment
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 20 Oct 2021 07:36:25 +0000 (09:36 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 20 Oct 2021 07:36:25 +0000 (09:36 +0200)
* lisp/international/mule-cmds.el (with-locale-environment): New macro.
(current-locale-environment): New variable.

etc/NEWS
lisp/international/mule-cmds.el

index 20696afb6124e440d588818527994db64f0d0b2b..84e2121086b66ee8840a3876cce6980bfc3b0475 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -236,6 +236,17 @@ with recent versions of Firefox.
 \f
 * Lisp Changes in Emacs 29.1
 
+** Locale
+
+---
+*** New variable 'current-locale-environment'.
+This holds the value of the previous call to 'set-locale-environment'.
+
+---
+*** New macro 'with-locale-environment'.
+This macro can be used to change the locale temporarily while
+executing code.
+
 +++
 ** 'define-key' now understands a new strict 'kbd' representation for keys.
 The '(define-key map ["C-c M-f"] #'some-command)' syntax is now
index 94d2f82e8c8f858ea108b083b977bad480b76a66..be4a4eb0cb272fc510b079921929f4ec3aecdaef 100644 (file)
@@ -2665,6 +2665,20 @@ For example, translate \"swedish\" into \"sv_SE.ISO8859-1\"."
           locale))
     locale))
 
+(defvar current-locale-environment nil
+  "The currently set locale environment.")
+
+(defmacro with-locale-environment (locale-name &rest body)
+  "Execute BODY with the locale set to LOCALE-NAME."
+  (declare (indent 1) (debug (sexp def-body)))
+  (let ((current (gensym)))
+    `(let ((,current current-locale-environment))
+       (unwind-protect
+           (progn
+             (set-locale-environment ,locale-name)
+             ,@body)
+         (set-locale-environment ,current)))))
+
 (defun set-locale-environment (&optional locale-name frame)
   "Set up multilingual environment for using LOCALE-NAME.
 This sets the language environment, the coding system priority,
@@ -2690,6 +2704,10 @@ If FRAME is non-nil, only set the keyboard coding system and the
 terminal coding system for the terminal of that frame, and don't
 touch session-global parameters like the language environment.
 
+This function sets the `current-locale-environment' variable.  To
+change the locale temporarily, `with-locale-environment' can be
+used.
+
 See also `locale-charset-language-names', `locale-language-names',
 `locale-preferred-coding-systems' and `locale-coding-system'."
   (interactive (list (completing-read "Set environment for locale: "
@@ -2723,6 +2741,7 @@ See also `locale-charset-language-names', `locale-language-names',
 
     (when locale
       (setq locale (locale-translate locale))
+      (setq current-locale-environment locale)
 
       ;; Leave the system locales alone if the caller did not specify
       ;; an explicit locale name, as their defaults are set from