众所周知,markdown中插入图片的功能是比较蛋疼的。你得先找到一个图床,上传图片,获取URL,然后编写代码。简单一点,你也需要先保存图片后再在文档中插入相对路径。这样对于插入来自剪切板的图片就十分困难了。对于像我这样的懒癌患者,截图之后要打开画图工具粘贴保存图片太麻烦。为了方便懒癌患者,实现直接粘贴图片的目的,我写了个脚本视线了一个插图神器的工具。具体实现了使用Ctrl+Alt+A进行截图后,Ctrl+Alt+V即可直接粘贴编码好的markdown代码。自动完成保存图片、上传图片、markdown编码等一系列工作。简单粗暴、快捷方便!下面就具体说说实现的过程。

配置环境

不同于之前某知乎土豪大神的神器是运行在Mac环境,本屌丝电脑装的是ubuntu,实现的原理基本一样,但需要配置的东西却大不相同。具体而言有如下几个步骤:

我们使用的是七牛云存储,七牛云存储是一个云存储平台,我们可以将图片之类的文件上传到这里。如果还没注册可以点击链接注册,注册成功并且实名认证成为标准用户后即可永久获得10GB永久免费存储空间以及每月10GB下载流量。完成之后我们需要安装七牛的python包,pip没有安装的请自行百度安装:

pip install qiniu

然后安装截图工具,注意系统自带的截图工具不是很方便,我们使用shutter这个截图工具:

sudo apt-get install shutter

此外还需要对剪切板进行操作,这里对比了xsel以及xclip发现只有xclip是兼容的:

sudo apt-get install xclip

因为在lubuntu中进行复制粘贴的时候,若复制的来源关闭了程序的话,剪切板的内容就会清空,所以这里还需要安装Parcellite来避免剪切板被清空。

sudo apt-get install Parcellite

此外,还要安装键盘模拟器,用以模拟按下Ctrl+V,来输入数据:

sudo apt-get install xdotool

最后为了更加人性化,这里使用对ubuntu发送通知的方法提示图片上传成功与否。

sudo apt-get install libnotify-bin

实现原理

实现整个神器具体来说有两步:保存图片与上传图片(废话!)。保存图片可以直接在截图软件首选项中设置:

![](http://7xlpkk.com1.z0.glb.clouddn.com/nfeng-img/160721-170122-620940.png “”)

如图,这里主要要设置成自动保存,当然如果你习惯从剪切板复制粘贴图片也可以把下面的复制到剪切板勾上。同时,使用:

shutter --help

查看帮助,我们可以看到我们需要执行的命令是:

shutter -s

不过这里有个问题,当选择自动保存时候,他保存的图片不会覆盖原来的图片,而是会在文件名后加个计数的部分。因此需要在保存之前先吧文件夹中相同名字图片清空下,所以命令变成如下形式,sleep是为了稍微延时一小会。应该可以不加:

rm /tmp/snap_shutter* ; sleep 0.1s ; shutter -s

细心的童鞋可能发现了,为什么不用

shutter -s -o /tmp/snap_shutter.png

这是因为如果这样就不能复制到剪切板,对于我来说不太习惯这种用法,所以只能在程序中设置。按照之前说过的给lubuntu添加快捷键的方法,发现,不能使用,百度后发现,在command里面只能输入一条指令,所以最简单的想法就是直接用一个sh脚本文件把这一串指令加进去,但实测发现,这样会导致ubuntu假死,于是指令变成这样:

sh -c 'rm /tmp/snap_shutter* ; sleep 0.1s ; shutter -s'

此时截图并保存的部分就搞定了,保存的路径就是固定的在/tmp/snap_shutter.png。

接下来就是上传图片:使用七牛的API开发起来不要太方便!代码如下,其中把ak,sk,bn,dm按实际情况修改好即可:

# -*- coding: utf-8 -*-
import qiniu
import datetime
import os

def uploadImg(fn,sfx='.png'):
  ak='xxxxx'#
  sk='xxxxx'#
  bn='xxxx'#bucket的名称
  dm='http://xxxx.xxx.xxx.xxx.clouddn.com/' #域名
  now=datetime.datetime.now()
  key='nfeng-img/'+now.strftime('%y%m%d-%H%M%S-')+str(now.microsecond)+sfx
  q=qiniu.Auth(ak,sk)
  token = q.upload_token(bn, key, 3600)
  ret,info=qiniu.put_file(token,key,fn) 
  if ret!=None and ret['key'] == key and ret['hash'] == qiniu.etag(fn):return dm+key
  else: return False
upRes=uploadImg('/tmp/snap_shutter.png')
if upRes:
  os.system('notify-send 文件已上传,请按Ctrl+V粘贴代码 -t 3000')
  print '![]('+upRes+' "")'
else:
  os.system('notify-send 上传失败,请检查哪出错了并重新试试~~ -t 3000')
  print 'UPLOAD FAILED!'

这里使用到了notify-send来向桌面环境发送消息。这个程序实现了上传图片并输出按照markdown格式写好的图片代码。但还不能输出到当前键盘的输入中,要实现这一目的,一个简单粗暴的方法就是首先复制到剪切板中,然后粘贴即可。所以实现起来就需要两个工具,一个是xsel,用来复制输出的内容到剪贴板;另外一个是xdotool,用来模拟按键输入Ctrl+V。这样下来,脚本如下所示:

python ~/MINE/markdown-img-tool/run.py |xclip -selection clipboard
sleep 0.5s 
xdotool keydown Control key v keyup Control

可以看到,这里的延迟0.5秒钟必须要有,因为如果没有延迟,当xdotool模拟按键按下Ctrl+V时,你的手还按着Ctrl+Alt+V,所以Ctrl+V就不会起作用。因此等待0.5秒就是为了等待按键的释放。同样,按照给lubuntu添加快捷键的方法的方法给这个脚本添加快捷键。这样在按下对应的快捷键后,脚本就自动完成了上传图片以及输入代码的功能。有木有很方便!