用artist-mode画文本图

概述
artist是一个emacs的内置lisp包。
在artist-mode中,你可以使用鼠标或者键盘来画线(可以带箭头)、矩形、正方形、多边形、椭圆、圆和一些类似于水蒸气似的不规则图形,当然可以擦除,填出图形,还可以在其上写字。
截图
这是一个很不错的绘制单链表的截图flash
这是我工作时的一个绘制结果.
为什么使用Artist-mode
我经常在写程序的时候,希望在文档里画一些类的继承关系、包含关系什么的,以帮助读这个文件的人能够更好的理解代码,但是此处不能且不适合放一张jpg(要是h,cpp文件里能插图,那多拉风啊)。
就考虑用plain-text的文本格式来绘图。初始时想用“-|+_”这几个符号来拼凑,但是工作效率太低,而且容易出错,一修改就几乎整个图作废。将有限的时间浪费在如此耗时,且没有技术含量的工作上,那还不就等于浪费生命啊,剩下来的时间多去看看twitter多好!
正如截图中绘制单链表的截图flash所展示,artist-mode来做这件事情,那是最适合不过了。那么来初探一下emacs的artist-mode能够如何完成任务呢。
怎么使用Mouse 绘制
进入artist-mode
M-x artist-mode
离开artist-mode
M-x artist-mode-off
三个mouse
mouse-2(鼠标中键),shift mouse-2
弹出一个菜单,从菜单里你可以选择要使用左键画什么类型更改一些设定
mouse-1 ( 鼠标左键) , shift-mouse-1
绘制部分由鼠标左键完成,请参考绘制操作。
mouse-3 ( 鼠标右键) , shift mouse-3
| mouse-3 | 删除鼠标下的一个字符 |
| shift mouse-3 | 画出矩形框,删除框选所有字符 |
绘制操作(鼠标左键)
| 操作 | 无shift | shift |
| pen | 单击,在鼠标点填充一个“填充符号”,默认为”.”;按下左键,拖动,抬起,绘制填充符号组成的线 | 单击,在鼠标点填充一个“o”;按下左键,拖动,抬起,绘制一条从初始点到最终点的直线 |
| Line | 任意方向的线 | 直线 |
| Rectangle | 矩形 | 正方形1 |
| Poly-line | 任意方向的多边形 | 每条线都是直线的多边形 |
| Ellipses | 椭圆 | 圆2 |
| Text | 文本 | 覆盖式文本 |
| Spray-can | 喷雾器3 | 设置喷雾器的大小 |
| Erase | 橡皮,擦掉一个字符 | 擦掉矩形内字符 |
| Vaporize | 擦除一行 | 擦除所有相连的行 |
| Cut | 剪切矩形 | 剪切正方形 |
| copy | 复制矩形 | 复制正方形 |
| paste | 粘贴 | 粘贴 |
| Flood-fill | 填充工具,填充 | 填充 |
一些说明
直线:只能是垂直,水平,对角线
箭头:绘制线,或多边形时,可以设置箭头,详细见箭头.
设定
| 设定选项 | 含义 |
| Set fill | 设定用来填充矩形和正方形的字符 |
| Set line | 设定绘制线的时候使用的字符 |
| Erase char | 设置擦除的时候使用的字符 |
| Trimming | 开关修剪行尾的功能(一个图画完,一行行尾的空格会被移除) |
| Borders | 开关在填充图形周围绘制行边界的功能 |
箭头
在artist-mode中,有下面两个键
< artist-toggle-first-arrow > artist-toggle-second-arrow
就像他们的快捷键所展示,artist-toggle-first-arrow将一条直线的第一个字符变为<,而artist-toggle-second-arrow将一条线的最后一个字符变为>。
命令
基本命令
| 命令 | 功能 |
| M-x artist-key-set-point | 执行以下功能 |
| M-x artist-select-operation | 选择绘制类型 |
| M-x artist-next-line, M-x artist-previous-line, M-x artist-forward-char and M-x artist-backward-char. | 移动 |
| M-x artist-select-fill-char | 设置填充字符 |
| M-x artist-select-line-char | 设置绘制时字符 |
| M-x artist-select-erase-char | 设置擦除时使用字符 |
| M-x artist-toggle-rubber-banding | 开关 rubber-banding功能(不知道是什么) |
| M-x artist-toggle-trim-line-endings | 开关修剪行尾的功能 |
| M-x artist-toggle-borderless-shapes | 开关在填充图形周围绘制行边界的功能 |
artist-key-set-point 执行的功能
| 情况 | 作用 |
| lines/rectangles/squares | 设置起始/结束点 |
| poly-lines | 设置其中一个点, (使用 C-u M-x artist-key-set-point 设置结束点) |
| 擦除字符时 | 开关橡皮功能 |
| 剪切,复制 | 设置区域/正方形 的 开始/结束点 |
| 粘贴时 | 粘贴动作 |
箭头命令
| M-x artist-toggle-first-arrow | 设置/取消 在线/多线段开头的箭头 |
| M-x artist-toggle-second-arrow | 设置/取消 在线/多线段结尾的箭头 |
选择操作
| M-x artist-select-op-line | 绘制线 |
| M-x artist-select-op-straight-line | 绘制直线 |
| M-x artist-select-op-rectangle | 绘制矩形 |
| M-x artist-select-op-square | 绘制正方形 |
| M-x artist-select-op-poly-line | 绘制多线段 |
| M-x artist-select-op-straight-poly-line | 绘制直线组成的多线段 |
| M-x artist-select-op-ellipse | 绘制椭圆 |
| M-x artist-select-op-circle | 绘制圆 |
| M-x artist-select-op-text-see-thru | 写字(插入模式) |
| M-x artist-select-op-text-overwrite | 写字(覆盖模式) |
| M-x artist-select-op-spray-can | 喷雾器 |
| M-x artist-select-op-spray-set-size | 设置喷雾器的大小 |
| M-x artist-select-op-erase-char | 擦除字符 |
| M-x artist-select-op-erase-rectangle | 擦除矩形内字符 |
| M-x artist-select-op-vaporize-line | 擦除一行 |
| M-x artist-select-op-vaporize-lines | 擦除所有相连的行 |
| M-x artist-select-op-cut-rectangle | 剪切矩形 |
| M-x artist-select-op-copy-rectangle | 复制矩形 |
| M-x artist-select-op-paste | 粘贴 |
| M-x artist-select-op-flood-fill | 填充 |
有了以上的介绍,我将所有artist-mode的命令绘制为一张表格,再参考artist-mode的键绑定+自己绑定,键盘绘制会像用鼠标绘制一样顺手。
artist变身
或许有人觉得artist-mode绘制出来的ascii图很不错,但是如果能变成图片或许更好;或者图片是一种硬性要求;或者由于不知道的原因,总有可能有需求将ascii变成图片呢?多一种选择总是好事。
好吧,传送门 。
1. 我试验,此处并没有绘制正方形,难道是我的版本有问题,求确认。
3. 顾名思义,很拉风的东西,但是我感觉不实用

loading...
果然是很拉风的东西!!!
不知道,在muse里面,有没有什么画图的工具。
[回复]
fangzhzh 回复:
五月 19th, 2010 at 4:06 上午
@CCheng, 文中的图,就是在org-mode中画的,同理,muse也可以。muse里,画图时启动artist-mode即可,画完退出,还是muse:)
[回复]
nowait 回复:
五月 19th, 2010 at 5:29 上午
@fangzhzh, 不错,好用
[回复]
very sweet!
可能我是有些picky了:
- artist-mode移动画好的矩形或箭头不大方便。
- 放大和缩小也不太方便。
[回复]
fangzhzh 回复:
五月 19th, 2010 at 12:48 下午
@filebat, 呵呵,是啊,放大缩小确实没有这个功能,比较郁闷。移动的话,我就退出artist-mode,然后把矩形当矩阵操作:) 不知道这个能不能对你有帮助
[回复]
ahei 回复:
五月 19th, 2010 at 12:51 下午
@fangzhzh,
….强
[回复]
fangzhzh 回复:
五月 19th, 2010 at 12:54 下午
@ahei, 就是 kill-rectangle, yank-rectangle, insert-rectangle 之类的 :)
[回复]
ahei 回复:
五月 19th, 2010 at 12:58 下午
@fangzhzh, 用CUA吧, CUA操作矩形特别方便.
[回复]
fangzhzh 回复:
五月 19th, 2010 at 1:07 下午
@ahei, emacs的默认操作用久了也就熟了,用熟了也就不想改了。有空试试吧。
[回复]
ahei 回复:
五月 19th, 2010 at 1:14 下午
@fangzhzh, … 顽固啊
[回复]
filebat 回复:
五月 19th, 2010 at 1:08 下午
@fangzhzh, 使用artist-mode的复制和粘贴可以一定程度上解决这个问题。
理论上,还蛮简单的:
- 标识光标附近的矩形/线段
- 选中区域
- 剪切
- 移动光标
- 粘贴
我试着,自己写个小lisp代码片断。 折腾了一下,总是有些小的瑕疵。然后就放弃了。
[回复]
fangzhzh 回复:
五月 19th, 2010 at 1:13 下午
@filebat, 贴出来探讨一下也好:),
站长aheii是个lisp高手,狂热的geek,最喜欢解决问题了
[回复]
ahei 回复:
五月 19th, 2010 at 1:16 下午
@fangzhzh, …这话说的, 我最近太太忙了
[回复]
谢谢作者。
这么酷的功能居然现在才知道,以前也听说过这个mode,但是实在没想到它还有这么大作用。
关于1,2,我感觉画出来的好像确实是圆和正方形,不过它说的正是指横向和竖向的字符数一样,但是在我这横向的字符比竖向的字符短,的以看起来好像变成了椭圆和矩形。
PS: Flood-fill真拉风,我不小心在一个不算大的文件中(10几K吧)用这个点了一下鼠标,就见emacs从点的地方不停地往下fill,fill,fill……….一直到文件尾,整个过程持续了好几分钟,想停都停不下来。全文fill完之后我undo一下,整个emacs整个挂掉了,到我打完这么大段话还没恢复过来,不知道它还有没有活过来的勇气。
[回复]
Meteor Liu 回复:
五月 19th, 2010 at 1:50 下午
@Meteor Liu,
另外,在我这鼠标位置好像点得不准,总是点到第一行,结果画的线是在鼠标的下一行,不知道怎么回事
[回复]
fangzhzh 回复:
五月 20th, 2010 at 9:02 上午
@Meteor Liu, 如果你使用的是org之类的开启了outline-mode的mode,必须要show-all后,鼠标才能绘制正确,否则行为很诡异:)
[回复]
yswzing 回复:
五月 25th, 2010 at 1:11 上午
@Meteor Liu,
我也遇到了这个问题,经查证,是 tabbar-mode 引进的,关掉 tabbar-mode 后正常,
不知道开启 tabbar-mode 的时候如何让 artist-mode 正常工作。如果你找到方法的话,
通知我一声,tianlei.zhao # gmail.com
[回复]
fangzhzh 回复:
五月 25th, 2010 at 5:18 上午
@yswzing, 我机器里没有tabbar-mode,我感觉他让我的emacs看起来很凌乱,而且据说,tabbar及其耗内存。我推荐aheii的emaci+window-num-mode,基本可以去掉一个一个的tabbar。个人意见,仅供参考:)
[回复]
yswzing 回复:
五月 25th, 2010 at 6:13 上午
@fangzhzh,
我没有发现 tabbar 占用内存多,可能是我内存比较大(1.5G),不明显。
Vim 中也有人向我推荐使用 buffer number 来切换,总觉得还要记 buffer 号,不方便。
还是觉得 tabbar 这样的偶而需要切换的时候去看一眼方便一些。其实我用 emacs 的时候
最多也就同时操作两个主要文件,所以 tabbar 对我也并不是不可或缺的。
Anyway,还是看了一下 artist 的源代码,如下代码可以解决和 tabbar-mode 的兼容问题。
[回复]
fangzhzh 回复:
五月 25th, 2010 at 6:23 上午
@yswzing, 谢谢你的代码:) 另:window-number-mode是不用记住buffer号的,这个mode将你当前emacs可以看到的所有buffer,按照左右上下的顺序排成1,2,3,4,5,6, 并且此数字就是显示在mode-line上,- 1 -,红色的,还是很醒目的。 切换时,看一眼也很方便
[回复]
yswzing 回复:
五月 25th, 2010 at 7:31 上午
@fangzhzh,
恕在下愚钝,没有找到你所说的 window-num-mode 的相关资料,
window-number-mode 资料也很少。能否指点一下哪里可以找到
中文的相关介绍?截图之类的?
另外,在我的 firefox 3.5 上,这个嵌入的回复框似乎太宽了,超出
了页面可显示内容的宽度,导致有一部分内容显示不出来,害的我每
次都得手工换行。
[回复]
fangzhzh 回复:
五月 25th, 2010 at 7:35 上午
@yswzing, window-number-mode,http://www.emacswiki.org/emacs/NumberedWindows 我的也是firefox,我的也是回复框太宽,有时候我写好全部一块贴进去,呵呵
[回复]
yswzing 回复:
五月 25th, 2010 at 7:47 上午
@fangzhzh,
试了一下,确实不错,谢谢!
[回复]
ryan 回复:
八月 11th, 2010 at 12:21 下午
@fangzhzh, 恕我愚钝,window-number-mode是多window的时候显示window号,而不是buffer的号,一个windows,一直是1.
[回复]
fangzhzh 回复:
八月 11th, 2010 at 3:13 下午
@ryan, 我的意思就是一个emacs,使用若干次(>=1)split-window-*后,一个emacs上的那些窗口,都是有1,2,3,4标注的。
谢谢指点,我buffer和window的概念没有搞清楚
[回复]
Meteor Liu 回复:
五月 26th, 2010 at 2:14 上午
@yswzing,
Thanks,这下鼠标终于准了
[回复]
ahei 回复:
五月 19th, 2010 at 2:21 下午
@Meteor Liu, 刚才也试了下Flood-fill,靠, 太拉风了, 哈哈
[回复]
喷雾器Spray-can很好玩的, 多喷几下就全变成#了, 果然浓度很高啊
[回复]
哈哈, 还是Flood-fill最拉风, 太牛叉了
[回复]
@ahei
我靠,果然如此,这两天忙着公司的事情,结果今天来一看,原来上次的东西真搞定了,哈哈 抄袭抄袭!~~
[回复]
ahei 回复:
五月 20th, 2010 at 1:44 上午
@, 。。。不知道你在说啥
[回复]
我来溜达溜达,上次的东西真找到了。。非常感谢,不过郁闷的是 我的muse或org任意一个启动后都不能关闭,找不到哪里出现了死锁状态。。。。。。。
每次编辑完了 还要终端来killed~~~~~~
[回复]
ahei 回复:
五月 20th, 2010 at 1:44 上午
@B.Qnyd, 我的DEA也有这种情况,我已加到我的TODO list里面了。
[回复]
B.Qnyd 回复:
五月 20th, 2010 at 1:55 上午
@ahei, 如何解决呢?
[回复]
ahei 回复:
五月 20th, 2010 at 2:05 上午
@B.Qnyd, 。。。都说了加到TODO list里面了,你还问我怎么解决
[回复]
现在出了一个用Emacs进行协同编辑的扩展,有兴趣的朋友可以试试
http://rudel.sourceforge.net/
[回复]
fangzhzh 回复:
五月 20th, 2010 at 9:04 上午
@demon386, 我最近喜欢的一个东西是gds,google desktop集成到emacs,然后用w3m浏览桌面效果,效果也很拉风!!
[回复]
ahei 回复:
五月 20th, 2010 at 9:10 上午
@fangzhzh, 是google的桌面搜索吗?哈,啥时候有空再整篇文章给大家show show
[回复]
fangzhzh 回复:
五月 20th, 2010 at 9:14 上午
@ahei, 是的,google的桌面搜索,一个require就行,好像叫gds.el,有兴趣可以去搜一下,回头我整张图给站长ahei,ahei发上来看看就行。
[回复]
ahei 回复:
五月 20th, 2010 at 9:26 上午
@fangzhzh, 哈哈,你可以写一篇短文嘛,技巧类的,也可以发上来的
[回复]
fangzhzh 回复:
五月 20th, 2010 at 9:15 上午
@demon386,
你博客的文章写的挺好,第一篇《阅读与思维的提升》我就很喜欢,翻阅中:)
[回复]
ahei 回复:
五月 20th, 2010 at 9:26 上午
@fangzhzh, 我啥时候写过这种文章阿?
[回复]
demon386 回复:
五月 24th, 2010 at 12:12 下午
@fangzhzh, 多谢大牛捧场
[回复]
fangzhzh 回复:
五月 25th, 2010 at 5:18 上午
@demon386, 太客气了,思想上有高度的人,才是真正的大牛呢。
[回复]
应该建立自己的QQ群!!!!!!!!
[回复]
ahei 回复:
五月 30th, 2010 at 11:29 上午
@凌狐, 太山寨了,我的计划是等有空的时候把wiki和论坛搭起来.
[回复]
qudian 回复:
五月 31st, 2010 at 5:25 上午
@ahei, 其实论坛用不上,搞个wiki就蛮好的
[回复]
ahei 回复:
五月 31st, 2010 at 7:38 上午
@qudian, 用户多了的话,论坛还是很有必要的,方便讨论
[回复]
倒是发布了一款Ascii art 软件!
[回复]
fangzhzh 回复:
八月 22nd, 2010 at 5:31 上午
@G字头老大, 什么?
[回复]