在dwm下使用自定义快捷键后台控制Cmus终端音乐播放器

自从发现Cmus这个终端下的音乐播放器后，就很少使用 GUI 的音乐播放器了.

通过cmus-remote还能远程控制，但是使用cmus-remote仍然需要先启动Cmus, 否则会提示cmus-remote: cmus is not running.
而启动 cmus 就需要打开终端，这不就和 GUI 的音乐播放器差不多了嘛，这对一个懒人来说是不能忍的，那么有什么办法能在启动Cmus的时候给放到后台去呢？
答案是tmux!
tmux是一个终端复用器，类似的还有screen等.

怎么做？

我们先整理下思路
首先我们想用cmus-remote来控制Cmus, 但是需要先启动Cmus, 那么我们就需要想一个办法让Cmus在后台启动，因为我们不需要看它的界面操作，这个过程我们可以用tmux来完成.

流程如下:

用tmux创建一个会话

在会话中启动Cmus

把会话放到后台

按照正常思路是行不通的，因为我们需要整个过程不可感知，完全后台操作.

那么我们需要:

后台创建一个tmux会话

把命令传给这个后台会话用来启动Cmus

tmux创建后台会话的命令如下:

Copy
tmux new -s 会话名 -d

tmux传递命令的命令如下:

Copy
tmux send-keys -t 会话名 "传递的命令"

那么整个过程写到脚本里就是两行代码:

Copy
tmux new -s cmus -d # 创建一个名为cmus的tmux会话
tmux send-keys -t cmus "cmus" C-m # 向名为cmus的tmux会话发送cmus命令并回车

# 注意发送的命令如果需要回车执行, 需要在后面加一个 C-m ,表示一个回车

启动后自然需要播放，那么我们可以在启动后再用cmus-remote控制Cmus播放就行:

Copy
tmux new -s cmus -d
tmux send-keys -t cmus "cmus" C-m
sleep 1s
cmus-remote --play

这里加sleep是为了防止 cmus 还没有启动完，cmus-remote就执行了，导致音乐没有播放.

能启动了自然要能关闭，这里就直接上代码:

Copy
tmux send-keys -t cmus "cqy" #向名为cmus的tmux会话发送cqy用来退出cmus
# c代表暂停,q代表退出,y是确认, 因为不需要回车所以不用加 C-m
tmux kill-session -t cmus #干掉名为cmus的tmux会话

当然也可以简单粗暴的直接干掉tmux会话...

成品

把上面两个部分写成函数，同时用 if 判断传入的参数就可以决定触发哪个了，成品如下:

Copy
play() {
tmux new -s cmus -d
tmux send-keys -t cmus "cmus" C-m
sleep 1s
cmus-remote --play
}

quit() {
tmux send-keys -t cmus "cqy"
tmux kill-session -t cmus
}

if [ $1 == "play" ];then
play
elif [ $1 == "quit" ];then
quit
else
echo "指令错误!"
fi

cmus-remote 命令

用cmus-remote --help可以查看帮助，或者直接man也可以.
这里列一些常用的命令:

Copy
# 播放
cmus-remote --play
或
cmus-remote -p
# 暂停
cmus-remote --pause
或
cmus-remote --u
# 上一首
cmus-remote --prev
或
cmus-remote -r
# 下一首
cmus-remote --next
或
cmus-remote -n

dwm 按键绑定

用 dwm 的应该都会，我就不水了.