我想创建某种elisp函数,并将其绑定到一个键上,该键采用两种格式之一的URL,并生成一个HTML链接元素。
以下是两种输入格式:
http://developer.apple.com/safaridemos/
http://developer.apple.com/safaridemos|Safari Demos
以下是两个所需的输出值:
<a href="http://developer.apple.com/safaridemos/">safaridemos</a>
<a href="http://developer.apple.com/safaridemos/">Safari Demos</a>
理想情况下,这将适用于一个区域,但即使它只适用于一行,也会有所帮助。
这里有一种方法。这种方法是让用户选择应该变成链接的文本,然后替换它。
;;; http://developer.apple.com/safaridemos|Safari Demos
;;; becomes <a href="http://developer.apple.com/safaridemos">Safari Demos</a>
;;; http://developer.apple.com/safaridemos|Safari Demos
;;; <a href="http://developer.apple.com/safaridemos">Safari Demos</a>
(defun url-to-html-link(input)
"Convert INPUT url into a html link. The link text will be the text after the last slash or you can end the url with a | and add text after that"
(let ((split-on-| (split-string input "|"))
(split-on-/ (split-string input "/"))
(fmt-string "<a href="%s">%s</a>"))
(if (> (length split-on-|) 1)
(format fmt-string (first split-on-|) (second split-on-|))
(format fmt-string input (first (last split-on-/))))))
(defun url-region-to-html-link(b e)
(interactive "r")
(let ((link
(url-to-html-link (buffer-substring-no-properties b e))))
(delete-region b e)
(insert link)))
(global-set-key (kbd "C-c j") 'url-region-to-html-link)
EDIT:您还可以将第一个功能与query-replace-regexp
结合使用,以生成交互式命令:
(defun query-replace-urls ()
(interactive)
(query-replace-regexp "http://.*"
(quote (replace-eval-replacement replace-quote (url-to-html-link (match-string 0))))
nil
(if (and transient-mark-mode mark-active) (region-beginning))
(if (and transient-mark-mode mark-active) (region-end))))
也许更好的想法是使用一些代码片段引擎?例如,Yasnippet提供了类似缩写的机制来填充样板文本。我不记得我到底是从哪里得到下面的片段的,但如果你自己想出这样的片段,那就太微不足道了:
# contributor: Jimmy Wu <frozenthrone88 at gmail dot com>
# name: <a href="...">...</a>
# key: href
# --
<a href="$1">$2</a>
Yasnippet还允许您在占位符中放置默认值,eLisp代码在填充代码段或从系统状态等读取一些值时交互式地查询用户。