我想看看是否有可用的工具或脚本可以用来动态修改剪贴板内容。
在我编写代码时,我经常想把一串文本变成蛞蝓。与其将内容重新输入为 slug 格式,不如在复制时将其更改为 slug,那就太棒了。
例如:“与朋友一起烧烤”→“bbq-with-friends”
知道有什么应用程序或 Applescript 可以帮助解决这个问题吗?非常感谢。
答案1
我结合了以下脚本这里和这里创建一个脚本,对剪贴板中的所有内容进行 slugify 处理。
set theclip to the clipboard contents
on normalize(the_string)
set p_script to ¬
"# -*- coding: utf-8 -*-
import unicodedata, sys
def normalize(x):
normal_form_1 = 'NFKD'
normal_form_2 = 'NFC'
x = unicodedata.normalize(normal_form_2, x)
x = x.lower()
x = x.replace(u'ß', u'ss')
x = x.replace(u'å', u'aa')
x = unicodedata.normalize(normal_form_1, x)
x = u''.join([c for c in x if not unicodedata.combining(c)])
x = x.encode('utf-8')
return x
arg = sys.argv[1].decode('utf-8')
x = normalize(arg)
print x"
set p_script to quoted form of p_script
set the_string to quoted form of the_string
return (do shell script ("python -c " & p_script & " " & the_string))
end normalize
on change_case(this_text)
set the comparison_string to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set the source_string to "abcdefghijklmnopqrstuvwxyz"
set the new_text to ""
repeat with this_char in this_text
set x to the offset of this_char in the comparison_string
if x is not 0 then
set the new_text to (the new_text & character x of the source_string) as string
else
set the new_text to (the new_text & this_char) as string
end if
end repeat
return the new_text
end change_case
on replace_chars(this_text, search_string, replacement_string)
set AppleScript's text item delimiters to the search_string
set the item_list to every text item of this_text
set AppleScript's text item delimiters to the replacement_string
set this_text to the item_list as string
set AppleScript's text item delimiters to ""
return this_text
end replace_chars
set theresult to normalize(theclip)
set theresult to replace_chars(theresult, " ", "-")
set theresult to change_case(theresult)
编辑1如果您想要将字符串 slugify 用作 URL,请将其添加到该脚本的末尾:
set theresult to replace_chars(theresult, "%", "%25")
set theresult to replace_chars(theresult, "<", "%3C")
set theresult to replace_chars(theresult, ">", "%3E")
set theresult to replace_chars(theresult, "#", "%23")
set theresult to replace_chars(theresult, "{", "%7B")
set theresult to replace_chars(theresult, "}", "%7D")
set theresult to replace_chars(theresult, "|", "%7C")
set theresult to replace_chars(theresult, "\\", "%5C")
set theresult to replace_chars(theresult, "^", "%5E")
set theresult to replace_chars(theresult, "~", "%7E")
set theresult to replace_chars(theresult, "[", "%5B")
set theresult to replace_chars(theresult, "]", "%5D")
set theresult to replace_chars(theresult, "`", "%60")
set theresult to replace_chars(theresult, ";", "%3B")
set theresult to replace_chars(theresult, "/", "%2F")
set theresult to replace_chars(theresult, "?", "%3F")
set theresult to replace_chars(theresult, ":", "%3A")
set theresult to replace_chars(theresult, "@", "%40")
set theresult to replace_chars(theresult, "=", "%3D")
set theresult to replace_chars(theresult, "&", "%26")
set theresult to replace_chars(theresult, "$", "%24")
答案2
我使用这样的函数:
f() {
(. ~/Scripts/f; "$@")
}
ff() {
pbpaste | f "$@" | pbcopy
}
~/Scripts/f
(不过我更常使用 emacs 和 OS X 文本视图中的功能。)
~/Scripts/f
可以包含如下函数:
slug() {
LC_ALL=C tr A-Z a-z | LC_ALL=C tr -cs a-z0-9 - | sed 's/^-//;s/-$//'
}
tr -c
是补语,tr -s
将多个连字符压缩为单个连字符。
答案3
我有一个脚本可以对文件名执行类似的操作,不过我用下划线替换了空格。您可以使用类似这样的脚本:
pbpaste | sed -e 's/ /-/g' | awk '{print tolower($0)}' | pbcopy
结合少量的 applescript 形成:
do shell script "pbpaste | sed -e 's/ /-/g' | awk '{print tolower($0)}' | pbcopy"