s.el'in s-lex-formatı gerçekten istediğiniz şeydir, ancak kodu sadece değişken isimlere değil, ikame bloklarının içine koymak istiyorsanız, bunu bir kavram kanıtı olarak yazdım.
(defmacro fmt (str)
"Elisp string interpolation for any expression."
(let ((exprs nil))
(with-temp-buffer
(insert str)
(goto-char 1)
(while (re-search-forward "#{" nil t 1)
(let ((here (point))
(emptyp (eql (char-after) ?})))
(unless emptyp (push (read (buffer-substring (point) (progn (forward-sexp 1) (point)))) exprs))
(delete-region (- here 2) (progn (search-forward "}") (point)))
(unless emptyp (insert "%s"))
(ignore-errors (forward-char 1))))
(append (list 'format (buffer-string)) (reverse exprs)))))
;; demo with variable and code substitution
(fmt "My name is #{user-full-name}, I am running Emacs #{(if (display-graphic-p) \"with a GUI\" \"in a terminal\")}.")
;; results in
"My name is Jordon Biondo, I am running Emacs with a GUI."
Hatta bir gömebilirsiniz fmt
diğerinin içine çağrıyı fmt
Deli misin,
(fmt "#{(fmt\"#{(fmt\\\"#{user-full-name}\\\")}\")}")
;; =>
"Jordon Biondo"
Kod sadece bir format
çağrıya genişler, böylece tüm ikameler sırayla yapılır ve çalışma zamanında değerlendirilir.
(cl-prettyexpand '(fmt "Hello, I'm running Emacs #{emacs-version} on a #{system-type} machine with #{(length (window-list))} open windows."))
;; expands to
(format "Hello, I'm running Emacs %s on a %s machine with %s open windows."
emacs-version
system-type
(length (window-list)))
Her zaman% s kullanmak yerine hangi biçim türünün kullanıldığına ilişkin iyileştirmeler yapılabilir, ancak çalışma zamanında yapılması gerekir ve ek yük eklenir, ancak işleri güzel bir şekilde biçimlendiren bir işlev çağrısında tüm biçim bağımsız değişkenlerini çevreleyerek yapılabilir tipte ama gerçekten isteyebileceğiniz tek senaryo muhtemelen yüzüyor ve hatta (format "% f" float) bile yapabiliyordunuz.
Daha çok çalıştığımda, bu cevap yerine bu özeti güncelleme olasılığı daha yüksek. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b