2

我正在寻找一个接受字符串并在标题大小写中返回相同字符串的 elisp 函数(即,所有单词大写,“a”、“an”、“on”、“the”等除外)。

我找到了这个脚本,它需要一个标记的区域。

只是,我需要一个接受字符串变量的函数,所以我可以将它与replace-regex. 我很想看到上述脚本的一个版本,它可以接受或者......

4

3 回答 3

3

像这样的东西?

(progn
  (defun title-case (input) ""
         (let* (
                (words (split-string input))
                (first (pop words))
                (last (car(last words)))
                (do-not-capitalize '("the" "of" "from" "and" "yet"))) ; etc
           (concat (capitalize first)
                   " "
                   (mapconcat (lambda (w)
                                (if (not(member (downcase w) do-not-capitalize))
                                    (capitalize w)(downcase w)))
                              (butlast words) " ")
                   " " (capitalize last))))
  (title-case "the presentation of this HEADING OF my own from my keyboard and yet\n"))
于 2018-07-18T00:07:31.303 回答
1

我会说您链接到的脚本在标题外壳方面做得很好。您可以按原样使用它。

这给我们留下了另外两个问题:

  • 我们怎样才能让它接受一个字符串?
  • 我们如何编写一个同时接受字符串或(标记)区域的函数?

在 Emacs 中处理字符串通常是在不显示的临时缓冲区中完成的。你可以这样写一个包装器:

(defun title-capitalization-string (s)
  (with-temp-buffer
    (erase-buffer)
    (insert s)
    (title-capitalization (point-min)
                          (point-max))
    (buffer-substring-no-properties (point-min)
                                    (point-max))))

现在,对于一个神奇地实现你的意思的函数,考虑这样的事情:

(defun title-capitalization-dwim (&optional arg)
  (interactive)
  (cond
   (arg
    (title-capitalization-string arg))
   ((use-region-p)
    (title-capitalization-string
     (buffer-substring-no-properties (region-beginning)
                                     (region-end))))
   (t
    (title-capitalization-string
     (buffer-substring-no-properties (point-at-bol)
                                     (point-at-eol))))))

它接受可选参数、活动区域或回退到当前行的文本。请注意,此功能在交互使用时并不是真正有用,因为它不显示任何效果。帽子小费也给https://www.emacswiki.org/emacs/titlecase.el

执照

除了站点的默认许可之外,我将所有这些代码置于 Apache 许可 2.0 和 GPL 2.0(或更高版本,由您选择)下。

于 2018-07-19T09:45:16.313 回答
1

利用M-x

upcase-initials-region是“C 源代码”中的交互式内置函数。

upcase-initials-region 请求 结束

将区域中每个单词的首字母大写。这意味着每个单词的第一个字符被转换为标题大小写或大写,其余的保持不变。在程序中,给出两个参数,即要操作的起始字符位置和结束字符位置。

于 2019-04-16T17:18:55.747 回答