我想在使用后几秒钟自动清除剪贴板。
#!/usr/bin/env bash
LOCKFILE=/tmp/.clearclip-lock
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
exit 1
fi
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
touch ${LOCKFILE}
echo $$ > ${LOCKFILE}
if xclip -o -selection clipboard 1>&2 2>/dev/null; then
if watch -n 0.5 -t --chgexit xclip -o -selection clipboard @>/dev/null; then
sleep 10
xsel -bc
fi
fi
rm -f ${LOCKFILE}
我才刚刚开始使用这个粗略的可执行文件,~/mypath/clearclip
我想用用户本地 systemd 计时器触发它。无论如何,服务会抛出错误Error opening terminal: unknown.
# ~/.local/share/systemd/user/clearclip.service
[Unit]
Description=clear the clipboard
ConditionFileIsExecutable=%h/_path/clearclip.sh
[Service]
Environment=DISPLAY=:0
ExecStart=%h/_path/clearclip.sh
Type=oneshot
我的主要问题是:
是否有一个工具可以执行与 相同但非交互的功能watch -g
?你的方法是什么?您是否会在 while 循环中将输出写入 tmp 文件以比较它们、恢复到预期或执行其他操作?
另一个问题是:双定时器设置是什么样的?
例如,计时器将检查剪贴板何时发生变化,并触发(或重新启动)另一个清除剪贴板选择的计时器
编辑 2018 年 7 月 25 日:
本周我已经放弃将此脚本与用户计时器一起使用。我正在使用 zpty 来模拟终端来消除opening terminal
错误,但最终我只是clearclip &
在~/.config/zsh/.zlogin
.
#!/usr/bin/env zsh
# zmodload zsh/zpty
oclip=""
let count='-1'
let timeout=70
clipchanged() {
if ! xclip -o -selection clipboard 2>/dev/null 1>&2; then
count='-1'
return 1
fi
clip="$(xclip -o -selection clipboard)"
if [[ -z "$clip" ]] || [[ "$oclip" == "$clip" ]]; then
return 1
elif [[ -z "$oclip" ]]; then
oclip="$clip"
return 1
else
(( count=timeout ))
oclip="$clip"
return 0
fi
}
while true; do
if (( count > 0 )); then
((count--))
# echo -n "\r\033[K$count"
fi
if (( count == 0 )); then
xsel -bc
fi
if clipchanged; then
(( count=timeout ))
fi
sleep .5
done
编辑 2020 年 9 月 7 日:
我在标题中添加了一个适当的问题,尽管我很快就放弃了这个想法。要清除剪贴板或对更改进行操作,我使用--watch
以下选项wl-copy(1)
:
--watch command...
Instead of pasting once and exiting, continuously watch the clipboard for changes, and run the specified command each time a new selection appears. The spawned process can read the clipboard contents from its standard input. This mode requires a compositor that supports the wlroots data-control protocol.