Hello, Nicolas Goaziou <m...@nicolasgoaziou.fr> writes:
> Hello, > ... >> This allow you to specify something like >> >> #+begin_example >> ,#+INCLUDE: "myfile.cmd" src cmd :coding "cp850-dos" >> #+end_example > > The quotes are not necessary. AFAICT, coding systems do not contain > spaces. Ok, I've reworked the rexexp to suppress them. New patch attached
> From fcf191842bea64442d69a0fcfa927a046d8fbd92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20T=C3=A9choueyres?= <pierre.techouey...@free.fr> Date: Mon, 16 Apr 2018 21:20:17 +0200 Subject: [PATCH] Add new keyword :coding for #+include directive * lisp/ox.el (org-export-expand-include-keyword): Add new keyword `:coding' for specify the file encoding whith the `#+include:' directive. This allow to use somting like : when your org-file is encoded in utf-8. --- etc/ORG-NEWS | 10 ++++- lisp/ox.el | 117 +++++++++++++++++++++++++++++++---------------------------- 2 files changed, 71 insertions(+), 56 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 013c7b139..f285b7337 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -108,6 +108,14 @@ You can use =ob-scala.el= as packaged in scala-mode, available from the MELPA repository. ** New features +*** New keyword for ~#+include:~ directive +Add ~:coding "codign-system"~ keyword to allow include of files from +different codign system than the main org-file. +For example: +#+begin_example +,#+INCLUDE: "myfile.cmd" src cmd :coding cp850-dos +#+end_example + *** iCalendar export uses inheritance for TIMEZONE and LOCATION properties Both these properties can be inherited during iCalendar export, depending on the value of ~org-use-property-inheritance~. @@ -514,7 +522,7 @@ want to take over maintenance of this compatibility, please contact our mailing list. *** New syntax for export blocks - + Export blocks are explicitly marked as such at the syntax level to disambiguate their parsing from special blocks. The new syntax is diff --git a/lisp/ox.el b/lisp/ox.el index ea7d1dc81..f4c5660ff 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -3326,6 +3326,12 @@ storing and resolving footnotes. It is created automatically." value) (prog1 (match-string 1 value) (setq value (replace-match "" nil nil value))))) + (coding + (intern (or (and (string-match + ":coding +\\<\\([a-z0-9\\-]+\\)\\>" value) + (prog1 (match-string 1 value) + (setq value (replace-match "" nil nil value)))) + (symbol-name buffer-file-coding-system)))) (env (cond ((string-match "\\<example\\>" value) 'literal) ((string-match "\\<export\\(?: +\\(.*\\)\\)?" value) @@ -3348,63 +3354,64 @@ storing and resolving footnotes. It is created automatically." (match-string 1 value)))) ;; Remove keyword. (delete-region (point) (line-beginning-position 2)) - (cond - ((not file) nil) - ((not (file-readable-p file)) - (error "Cannot include file %s" file)) - ;; Check if files has already been parsed. Look after - ;; inclusion lines too, as different parts of the same - ;; file can be included too. - ((member (list file lines) included) - (error "Recursive file inclusion: %s" file)) - (t + (let ((coding-system-for-read coding)) (cond - ((eq env 'literal) - (insert - (let ((ind-str (make-string ind ?\s)) - (arg-str (if (stringp args) (format " %s" args) "")) - (contents - (org-escape-code-in-string - (org-export--prepare-file-contents file lines)))) - (format "%s#+BEGIN_%s%s\n%s%s#+END_%s\n" - ind-str block arg-str contents ind-str block)))) - ((stringp block) - (insert - (let ((ind-str (make-string ind ?\s)) - (contents - (org-export--prepare-file-contents file lines))) - (format "%s#+BEGIN_%s\n%s%s#+END_%s\n" - ind-str block contents ind-str block)))) + ((not file) nil) + ((not (file-readable-p file)) + (error "Cannot include file %s" file)) + ;; Check if files has already been parsed. Look after + ;; inclusion lines too, as different parts of the same + ;; file can be included too. + ((member (list file lines) included) + (error "Recursive file inclusion: %s" file)) (t - (insert - (with-temp-buffer - (let ((org-inhibit-startup t) - (lines - (if location - (org-export--inclusion-absolute-lines - file location only-contents lines) - lines))) - (org-mode) - (insert - (org-export--prepare-file-contents - file lines ind minlevel - (or - (gethash file file-prefix) - (puthash file (cl-incf current-prefix) file-prefix)) - footnotes))) - (org-export-expand-include-keyword - (cons (list file lines) included) - (file-name-directory file) - footnotes) - (buffer-string))))) - ;; Expand footnotes after all files have been - ;; included. Footnotes are stored at end of buffer. - (unless included - (org-with-wide-buffer - (goto-char (point-max)) - (maphash (lambda (k v) - (insert (format "\n[fn:%s] %s\n" k v))) - footnotes)))))))))))) + (cond + ((eq env 'literal) + (insert + (let ((ind-str (make-string ind ?\s)) + (arg-str (if (stringp args) (format " %s" args) "")) + (contents + (org-escape-code-in-string + (org-export--prepare-file-contents file lines)))) + (format "%s#+BEGIN_%s%s\n%s%s#+END_%s\n" + ind-str block arg-str contents ind-str block)))) + ((stringp block) + (insert + (let ((ind-str (make-string ind ?\s)) + (contents + (org-export--prepare-file-contents file lines))) + (format "%s#+BEGIN_%s\n%s%s#+END_%s\n" + ind-str block contents ind-str block)))) + (t + (insert + (with-temp-buffer + (let ((org-inhibit-startup t) + (lines + (if location + (org-export--inclusion-absolute-lines + file location only-contents lines) + lines))) + (org-mode) + (insert + (org-export--prepare-file-contents + file lines ind minlevel + (or + (gethash file file-prefix) + (puthash file (cl-incf current-prefix) file-prefix)) + footnotes))) + (org-export-expand-include-keyword + (cons (list file lines) included) + (file-name-directory file) + footnotes) + (buffer-string))))) + ;; Expand footnotes after all files have been + ;; included. Footnotes are stored at end of buffer. + (unless included + (org-with-wide-buffer + (goto-char (point-max)) + (maphash (lambda (k v) + (insert (format "\n[fn:%s] %s\n" k v))) + footnotes))))))))))))) (defun org-export--inclusion-absolute-lines (file location only-contents lines) "Resolve absolute lines for an included file with file-link. -- 2.14.3
> ... > Is it really an Org problem? E.g., couldn't you put a coding: cookie in > your ".cmd" file? IMO, the coding system depends on the includee, not > the includer. I tend to aggree with you that TRTDT is to put cookies or something inside the included file. But : a) This seem to not work as expected (see exemples joinned). b) Sometimes you can't modify the included file (ex: remote file access).
# -*- coding: utf-8 -*- #+title: test with different encodings. * Pierre Téchoueyres bad #+include: "./file.1.txt" src bat or #+include: "./file.2.txt" src sh and good ? #+include: "./file.1.txt" src bat :coding cp850-dos or #+include: "./file.2.txt" src sh :coding iso-8859-15-unix # Local Variables: # coding: utf-8-unix # End:
::- -*- coding: cp850-dos -*- @echo off echo Hello Pierre Téchoueyres rem Local Variables: rem coding: cp850-dos rem End:
#!/bin/sh # -*- coding: iso-8859-15-unix -*- echo "Hello Pierre Téchoueyres" # Local Variables: # coding: iso-8859-15-unix # End:
For a I can try to jump into the rabbit hole and find a solution (but for now I'm lost) Regards,