2

次の関数定義があります。

(defun nth (n)
  (format
   (concat
    "%d"
    (if (memq n '(11 12 13)) "th"
      (let ((last-digit (% n 10)))
        (case last-digit
          (1 "st")
          (2 "nd")
          (3 "rd")
          (otherwise "th"))))) n))

で使用できるようにしたいと思いますformat-time-string。普通なら関数のソースを見ますが、これはCソースコードで定義されています。(これにより、何かをフックすることはできなくなると思いますが、修正する必要があります。)

適切な引数%oに適用される別の書式指定子 (たとえば、) を追加するにはどうすればよいですか?nth

希望の使用法:

(format-time-string "%A, %B %o, %T (%z)" (seconds-to-time 1250553600))

=> "Monday, August 17th, 20:00:00 (-0400)"
4

3 に答える 3

3

これがあなたがしたいことです。Stefan と Drew はすでにいくつかの重要な発言をしています ( nthemacs-lisp/advising 関数の情報ファイルを上書きして見ないでください)。

(defun ordinal (n)
  "Special day of month format."
  (format
   (concat
    "%d"
    (if (memq n '(11 12 13)) "th"
      (let ((last-digit (% n 10)))
        (case last-digit
          (1 "st")
          (2 "nd")
          (3 "rd")
          (otherwise "th"))))) n))


(defadvice format-time-string (before ordinal activate)
  "Add ordinal to %d."
  (let ((day (nth 3 (decode-time (or time (current-time))))))
    (setq format-string
      (replace-regexp-in-string "%o"
                    (ordinal day)
                    format-string))))

ノート:

  1. UNIVERSAL 引数を処理しませんでした

  2. Cから呼び出された場合、ハックは機能しませんformat-time-string(マニュアルで読むことができます)。

于 2013-12-01T21:34:32.407 に答える
1

私の知る限り、あなたは運が悪いです: format-time-string はそれを行う方法を提供していません。

次のようなものを使用して、これを回避できる場合があります。

(let ((ti (seconds-to-time 1250553600)))
 (format-time-string (concat "%A, %B " (my-nth (format-time-string "%d" ti)) ", %T (%z)") ti))

これは、「8 月 17 日」は間違っているといつも言われてきました。「8 月 17 日」と書くべきで、「8 月 17 日」と発音します。

もう 1 つ:nthは事前定義されたコア関数です。独自のまったく異なる定義で上書きしない方がよいでしょう。

于 2013-12-01T20:55:10.583 に答える
1

ステファンが言ったことに付け加えると (「あなたは運が悪い」) --

format-time-stringはビルトインですが、ビルトインについてもアドバイスできます。ただし、実行したい種類の手術は定義の奥深くまで掘り下げてしまうため (これは実行できません)、実際には の定義を置き換える必要があります。つまりまったく使用しないでください。format-time-stringdefadvicead-do-it

言い換えれば、いずれにせよ (defunまたはdefadvice) Lisp で関数を完全に再定義する必要があります。これは、「あなたは運が悪い」と言っているのとほぼ同じです。

于 2013-12-01T21:15:55.393 に答える