1

是否可以从 bash 脚本调用复制命令(就像用户按下Cmd+一样)?C基本上我想编写一个使用全局热键运行的简单脚本,它应该从活动应用程序中获取当前选择,替换某些内容并粘贴结果。这可能吗?

到目前为止,我能想到的最好的方法是使用pbpasteand pbcopy,但如果可能的话,我想自动化它。

4

1 回答 1

1

如果您只是想修改文本选择,您可以使用 AppleScript。

osascript -e 'try
    set old to the clipboard
end try
try
    delay 0.3
    tell application "System Events" to keystroke "c" using command down
    delay 0.2
    set text item delimiters to linefeed
    set input to (paragraphs of (the clipboard as text)) as text
    set the clipboard to do shell script "shopt -u xpg_echo; echo -n " & quoted form of input & " | rev" without altering line endings
    tell application "System Events" to keystroke "v" using command down
    delay 0.05
end try
try
    set the clipboard to old
end try'

如果脚本使用具有除命令以外的其他修饰键的快捷方式运行,则第一个延迟用于释放修饰键。第二个延迟也可以减少到 0.05 左右,但是长选择或例如 web 视图通常需要更长的延迟。如果没有第三次延迟,the clipboard有时会old在粘贴文本之前设置为。

the clipboard as textdo shell script默认将行尾转换为回车。shopt -u xpg_echo需要,因为echoinsh默认情况下解释单引号内的反斜杠。如果输入长于getconf ARG_MAX字节,则不能使用echo,必须将其写入临时文件或使用pbpaste.

pbpastepbcopy在使用的环境中默认用问号替换非 ASCII 字符do shell script您可以通过设置LC_CTYPE来防止这种情况发生UTF-8

告诉系统事件单击菜单栏项通常会更慢,并且在没有菜单栏或全屏窗口的应用程序中不起作用。

另一种选择是创建 Automator 服务。但是它们在运行之前也有小的延迟。存在一个错误,即服务的快捷方式在菜单栏上显示一次服务菜单之前并不总是有效。当最前面的应用程序没有菜单栏或服务菜单时,这些服务不可用。

于 2012-08-25T19:37:09.647 回答