dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

修改Hotkeys.xml 自定义 ChemDraw 快捷键的方法

已有 243 次阅读 2017-3-18 16:14 |个人分类:其它兴趣|系统分类:教学心得|关键词:快捷键 Hotkeys.xml XML DTD 自定义 ChemDraw 别名

ChemDraw是一个非常强大的化学绘图软件,功能丰富.不过我最喜欢的是它的自定义快捷键的能力,如果和别名定义结合起来,简直是如虎添翼. ---自定义快捷键的好处非常明显,你可以根据自己的习惯来设定怎么操作CD.在本文末尾展示的我的快捷键设定环境下, 选中一个原子(鼠标移过时选中即可),按下3 即可以增加3个伸出键,画叔丁基非常方便. 如果要绘制EC的衍生物,只要按下Shift+E,就可以得到EC这个自定义的标签,再点击按 Expand Label菜单命令就可以变为EC的结构了(EC的别名要先定义一下,一两分钟就可以搞定). 画Li+我只要画一根单键,再选中一个原子,按下l键,就自动设置标签为Li+,再删除单键就完成了,非常快.


修改前的准备

虽然ChemDraw为用户提供了自定义快捷键的能力, 但这种自定义是通过修订文件间接提供的,没有在交互界面上直接提供.通过修改它的hotkeys.xml文件,你可以达到设定快捷键的目的. 操作也很简单,如下:

1)       查找 hotkeys.xml文件(注意文件名中有一个s),它放在 chemdraw items目录下,但这个目录随安装位置变化而变化,通过搜索来找它比较方便.可能会有同名的文件,但注意它的目录名称就能区别开.

2)       用记事本(Notepad,Notepad2, Emeditor, UltraEdit)等打开这个文件.为保险起见,你可以在打开前先备份一下,比如选中该文件后按住CTRL用鼠标拖放一下再释放,生成一个副本,将其命名为hotkeys.xml.bak.

3)       查看文件的内容, 并根据需要修订. 所有的秘密都在这里,下文详述. 不过要注意使用UTF-8编码来保存文件(用记事本等软件编辑此文件时不要修改编码即可)。有一回我不小心用了ANSI编码保存, ChemDraw无法正确读取文件内容,就好象这个文件不存在一样(文件内容中第一行就规定了用UTF-8编码),很是蹊跷,找了半天才发现是编码格式的问题。

4)       保存文件,快捷键就马上生效了.


XML文件的结构

怎么根据我们的需要来修改这个文件呢?  首先我们来看看这个文件的内容, 本文末尾展示的是我修改过的版本,已经把一些英文描述翻译成了中文(忽略了生物相关的部分). XML文件内容是一个规范的数据块,根据文本的缩进,你大概可以看出, 这个文件大致分为以下几个部分: (如果看糊涂了可以跳过这一块继续往下看)

1.       XML标识说明,前两行,说明这个文件的格式与编码等信息..

2.       XML的数据, 这是一个层次分明的4层结构:

2.1            2.1 最高一层是Objects(对象集合),<Objects>标签开头,到末尾以</Objects>结束. 本文件中只有一个这样的Objects集合。

       2.2 它下面一层是 Object(不含有s), 开头是 <Object Type=XXX> (XXX是这个对象的类型, 如原子(Atom),(Bond), 通用工具 (Generic),这些类型名称是软件规定的,用户不能修改), 这个Object的内容规定完了, 结尾就是</Object>表示结束.

   另一个Object的规定,同样是用<ObjectType=XXX>这种格式开头,</Object>结尾.这些Object块之间是平等的关系,可以调整先后顺序. 每一个<Object>标签都和下面的离它最近的</Object>构成一个独立的内容块.

       2.3 Object对象下面,还有两类集合,一类叫Commands,另一类叫Hotkeys.顾名思义, Commands是命令的集合, Hotkeys是快捷键的集合. 表示方法类似上面, 形式上分别是 <Commands> XXXX </Commands>, <Hotkeys>YYYYY</Hotkeys>. 它们的内容就是对具体命令的规定,分别 Command Hotkey 对象构成.

       2.4  Command Hotkey对象,这是最低一级的对象,实际上我们修改的地方就是这个层级,特别是对Hotkey对象内容的修订. (Command对象我们只能修改它的描述,也就是Description=后面的双引号内的内容).

以下的内容,基本上都是对这个Hotkey对象进行修改而来展开的.

Hotkey条下面,可以依样画葫芦增加一行形式类似的设置, 相当于在上一级的Hotkeys集合中增加一个hotkey对象.当然,删除一行规定相当于从Hotkeys集合中去除一个对象.

所以,从整体看,hotkeys.xml文件的结构是这样的

文件基本信息 2

<Objects>

<Object Type=XXX>

<Commands>

                              <Command id="预设命令1"  description="描述1"/>

                          <Command id="预设命令2"  description="描述2 "/>

                            …若干条类似的规定

</Commands>

                  <Hotkeys>

<Hotkey key="快捷键1" command="预设命令a" value="允许值a"  description="描述1"/>

                          <Hotkey key="快键键2" command="预设命令b" value="允许值b"  description="描述2"/>

                                    …若干条类似的规定

</Hotkeys>

           </Object>

<Object Type=YYY>

结构类似上面

</Object>

</Objects>


XML格式由DTD文件规定


实际上,以上格式就是同一个目录下的, 同名但不同后缀的文件 hotkeys.dtd规定的. DTD文件的表示方式有所不同,我把调整过顺序的DTD文件的内容放在下面你就明白了. (ATTLIST即Attributes List,属性列表; CDATA 即Character Data,即字符数据, XML文件中的CDATA内容是不被解析的,用来存放对命令的解释正合适)

<!ELEMENT Command EMPTY>

       <!ATTLIST Command id (BONDDISPLAY | BONDORDER | CHARGE | DIALOG | LABELTEXT | FUSERING | AA1 | DNA | RNA) #REQUIRED description CDATA #REQUIRED >

这两行规定的是Command对象的描述方法,可选的ID只有BONDDISPLAY那个列表,竖线表示平行关系可以选择其中之一,#REQUIRED表示这一行必须出现.

<!ELEMENT Hotkey EMPTY>

<!ATTLIST Hotkey key CDATA #REQUIRED command (BONDDISPLAY | BONDORDER | CHARGE | DIALOG | LABELTEXT | FUSERING | AA1 | DNA | RNA) #REQUIRED value CDATA #REQUIRED description CDATA #REQUIRED >

这两行规定的是Hotkey对象的描述方法, 类似的,可选的command属性也是括号中的那个上面,与上面提供的Command的id清单是一致的(注意这两个command的大小写不同,首字母大写的是对象,全小写的hotkey的属性)

<!ELEMENT Commands (Command+)>

<!ELEMENT Hotkeys (Hotkey+)>

这两行分别表示,Commands集合是Command对象组成的, +表示至少一个. 类似的Hotkeys集合也类似,由至少一个Hotkey对象构成.


<!ELEMENT Object (Commands, Hotkeys)>

<!ATTLIST Object type (Atom | Bond | AA1 | DNA | RNA | Generic) #REQUIRED >

这两行表示, Object  对象由两个集合构成,一个是Commands,一个是Hotkeys.(有点怪异,这个对象的名字就叫对象(Object),不过其实在编程中这种现象很常见), 对象的type属性有6种选择,我们化学绘图相关的是Atom,Bond和Generic.


<!ELEMENT Objects (Object+)>

这一行表示, Objects集合是由至少一个Object对象构成的.

怎么样,是不是就是上面分析的XML文件的结构?


快捷键如何修改


Hotkey的描述方法

既然我们修改的重点在Hotkey这个对象,我们来仔细看一下Hotkey对象是怎么描述的. 取一行来作为麻雀来解剖一下.

<Hotkey key="m"  command="LABELTEXT"  value="Me"  description="AtomLabeling"/>

ChemDraw里运行快捷键的规则是, 先搞清楚当前选中的对象是什么, 再根据对象来读取快捷键指定的动作. 上面辛辛苦苦讲这个文件的结构就是为了这会儿你如何判断对象的类型是怎么规定的。说起来复杂,做起来其实很简单就是在这一句往上面找离它最近的那行<Object Type=XXX>处的XXX这个属性就是.

数据层次上看, Hotkey对象的上一级是Hotkeys集合, Hotkeys集合的上一级是Object对象,对象的类型就在Object这个层级说明. 如果数据也有辈份的话, 对象的类型就存放在Hotkey的爷爷辈(上二级)的属性里面.  

注意一下,为了表述方便,这里XXX,YYY都是拉来临时来占位的字符实际使用的Object的Type值, 目前只有以下几种选择,都是软件事先规定好了的: Atom, Bond,Generic, AA1, DNA, RNA. 目前就这几种, 但不排除以后软件开发人员还会给它增加新品种.对化学绘图者来讲,只有前三种对象涉及到分别代表 原子, 和 通用工具.

上面这一行往上找到的对象类型正是Atom,说明它正是处于Atom 数据块这个快捷键就是针对选中的对象为原子时规定的.

快捷键描述的这一行,有四个部分Key, command, value, description都是用来说明Hotkey这个对象的特征,称为Hotkey的属性. 先简述如下:

1)Key=”m” 说明快捷键的按键为字母m;  

2)command="LABELTEXT" 说明执行的动作是设置文本标签,也就是原子或基团的符号. 可用的Command与所属的对象紧密相关,见表1的规定.

3)value="Me" 规定,设置的符号为Me,也就是甲基的缩写. 这个Value除了是元素符号外,还可以是缩写(Me,Et, MeO)或者用户自定义的别名.1中也列出了一部分可选的值范围。

4)description="Atom Labeling" 说明这个快捷键是干什么的.本例中只是非常简单的说是 设置原子的标签文本,可以随便修改,不要破坏双引号就行.



Hotkey的属性详解

针对上面4个部分,再详述如下

1.   Key的设置

Key=后面跟的就是快键键符号,可以根据你需要用哪个键来修改.注意的是

a)     硬编码的键如功能键Fn,回车键,空格键,退格键,箭头键不能用作自定义快捷键, 除此之外的其它任何键都可以用作快捷键.

b)   不同对象之间的Key允许重复.因为Hotkey是放在一个组织严密的数据层级里的, 各级之间有明确的归属关系.区分了不同的对象类型, 所以不会冲突.

c)    字母类的快捷键是区分大小写的. 这样也好,对同一个字母按键可以利用2,比如我就喜欢用大写的S作为快捷键来输入Si,小写的s作为快捷键来输入S. 小写的e用来输入乙基(Et),大写的E来输入(EC,自定义的一个别名).

d)    如果同一快捷键(大小写一样)设定在文件内或对象类型出现不止一次,只有最接近文件末尾出现的定义生效。这个很好理解,读设置时从上到下,实际上就是前面的设定被后面的覆盖了,只有后面的生效。这种现象当然要避免。


2.   Command的范围.

          必须交代的是,针对不同的对象, 配套可以使用的command是不同的, 比如Atom对象只能设置8种命令, Bond对象只能设置5种命令, Generic对象只有2种选择.如下表1规定:


再举个例子讲一下。有快捷键设定如下, 当选中的对象是原子(<Objecttype="Atom">), 快捷键3表示从在这个原子上增加三个伸出的单键.

<Hotkey key="3"  command="SPROUT"value="3" description="Adds three bonds to the atom"/>

这里 command是 “SPROUT”,英文原意树枝状伸出去的意思, 此处表示在选中原子上增加伸出的键(默认增加的都是单键). 增加几个单键呢? value=后面的内容给出了回复:3.  因此,这一规定的意思就是说, 按下数字键3, 该原子就增加3个伸出的单键. 注意,这一条规定因为是<Object type="Atom">这个对象的规定范围之内,它在选中的对象是原子时执行上述操作.

同样的,对于选中的对象是“键”,也有一条用3作为快捷键的规定:

<Object type="Bond"> 这一行下面的层级中,有这样的规定

<Hotkey key="3"command="BONDORDER"value="3"description="Set Bond to Triple"/>

这个快捷键的规定在说, 按下3,指定的动作是设定键级(BONDORDER)3(value), 即将当前选中的键设置为叁键.

再总结一下,快捷键规定中的command,只能从上面表1的第2列中选择,还要看当前选中的对象属于第1列规定的哪种.

不能随意编写Command的命名.但Key是有一定的自由度选择的.


3.   Value的设置.

value的选择范围与命令(command)密切相关. 比如,你可以尝试下把sprout命令对应的value设置为5看看,它不会执行的! 要知道每个命令可以设置哪些值,才能相应的在文件中作出规定,上面的表格1中展示了一些可用的值,我是根据现在的信息和一些测试总结的,但很可能不全面. 由于ChemDraw的帮助并没有明确给出每个Command允许的选值范围. 不过这些总结的值也基本够用了.

举例来说, 如果命令是LABELTEXT, 这个value就是要设置的原子或基团的文本. 这个文本的选择自由度比较大,可以是元素符号如N,O,S,Br等等; 也可以是离子,如Li+, Ca2+等; 还可以是缩写,如Me, OMe, CN, OCH2CH3等; 还可以是别名,如自己定义的某个特定结构,你给它设定一个别名,也可以作为LABELTEXT 命令的值. 本质上,ChemDraw并不管你输入的是什么,这一步只负责根据快捷键输入一个文本标签. 化学上正确与否是下一步其它过程的事情.

如果命令是BONDDISPLAY, 这个value就是化学键显示的形式. 如果是AUTONUMBER,则这个value只能设置为True 或False.

这里值得一提就是Generic对象(通用工具)的设置中,有一个命令TOOLMODE,用于快速切换绘图工具. 它对应的value选择比较丰富,翻译如下:

(括号内为解释,不要复制).

比如末尾的示例中,在Generic对象下面有这样2行

<Hotkeykey="m" command="TOOLMODE" value="MARQUEE"description="M代表Marquee,启用框选"/>

<Hotkeykey="l" command="TOOLMODE" value="LASSO"description="L代表Lasso,启用套索"/>

它表示,当选中的对象不是键或原子时(实际就是没有选中这两种对象时),如果按下m,则鼠标对应的工具自行切换为Marqee模式,也就是框选模式. 如果按下l键,则鼠标对应的工具切换为套索模式,这样通过键盘按键就能方便的切换工具了,是不是很方便?


4.   Description 部分

这个部分不太重要, 却是需要的.这部分只是描述一下命令的目的用途,主要是方便识别命令的用途. 比如把描述翻译成了中文,或者作为解释为什么这么设置.

讲到这里,基本上我把快捷键设定的方式讲得比较清楚了,你所要做的就是,你想设定什么键来指定什么操作.想好之后,先找出适用的对象(找表格1的第1列),再找出对应的操作属于什么命令(找表格1的第2列), 再确定快捷键的取值, 基本上在哪里改,怎么改(或增删)就很清楚了. 修改之后保存一下,工作就完成了.以后如果需要,只要把这个hotkeys.xml文件备份一下就成.


最后附上我的电脑上用的样本,供参考.



样本 hotkeys.xml

<?xmlversion="1.0" encoding="UTF-8" ?>

<!DOCTYPE Objects SYSTEM "hotkeys.dtd">

<Objects>      

   <Object type="Atom">        

       <Commands>

             <Command id="LABELTEXT" description="设置原子的文本标签"/>

             <Command id="SPROUT" description="在原子上增加外接键"/>

             <Command id="CHARGE" description="改变原子的电荷数"/>

             <Command id="FREE_SITE" description="增/减原子的自由连接点"/>

             <Command id="UPTO_SITE" description="增/减原子的取代基数目上限"/>

             <Command id="EXACT_SITE" description="增/减原子的取代基数目"/>

             <Command id="ATOMNUMBER" description="显示/隐藏原子的编号"/>

             <Command id="ATTACHMENTPOINT" description="设置连接点的值"/>

        </Commands>

          <Hotkeys>

             <Hotkeykey="a" command="LABELTEXT" value="A"description="Atom Labeling"/>

             <Hotkeykey="A" command="LABELTEXT" value="Ac"description="Atom Labeling"/>

             <Hotkeykey="b" command="LABELTEXT" value="B"description="Atom Labeling"/>

             <Hotkeykey="B" command="LABELTEXT" value="Br"description="Atom Labeling"/>

             <Hotkeykey="c" command="LABELTEXT" value="C"description="Atom Labeling"/>

             <Hotkeykey="C" command="LABELTEXT" value="Cl"description="Atom Labeling"/>

             <Hotkeykey="d" command="LABELTEXT" value="D"description="Atom Labeling"/>

             <Hotkeykey="e" command="LABELTEXT" value="Et"description="Atom Labeling"/>

             <Hotkeykey="E" command="LABELTEXT" value="EC"description="大写E定义为自定义标签EC"/>

             <Hotkeykey="f" command="LABELTEXT" value="F"description="Atom Labeling"/>

             <Hotkeykey="F" command="LABELTEXT" value="CF3"description="大写F定义为标签 三氟甲基"/>

             <Hotkeykey="h" command="LABELTEXT" value="H"description="Atom Labeling"/>

             <Hotkeykey="i" command="LABELTEXT" value="I"description="Atom Labeling"/>

             <Hotkeykey="k" command="LABELTEXT" value="K+"description="Atom Labeling"/>

             <Hotkeykey="l" command="LABELTEXT" value="Li+"description="Atom Labeling"/>

             <Hotkeykey="m" command="LABELTEXT" value="Me"description="Atom Labeling"/>

             <Hotkeykey="M" command="LABELTEXT" value="OMe"description="大写M -->甲氧基OMe"/>

             <Hotkeykey="n" command="LABELTEXT" value="N"description="Atom Labeling"/>

             <Hotkeykey="N" command="LABELTEXT" value="Na+"description="Atom Labeling"/>

             <Hotkeykey="o" command="LABELTEXT" value="O"description="Atom Labeling"/>

             <Hotkeykey="p" command="LABELTEXT" value="P"description="Atom Labeling"/>

             <Hotkeykey="P" command="LABELTEXT" value="Ph"description="Atom Labeling"/>

             <Hotkeykey="q" command="LABELTEXT" value="Q"description="Atom Labeling"/>

             <Hotkeykey="r" command="LABELTEXT" value="R"description="Atom Labeling"/>

             <Hotkeykey="s" command="LABELTEXT" value="S"description="Atom Labeling"/>

             <Hotkeykey="S" command="LABELTEXT" value="Si" description="AtomLabeling"/>

             <Hotkeykey="t" command="LABELTEXT" value="Tf"description="Tf,三氟甲基磺酰基"/>

             <Hotkeykey="T" command="LABELTEXT" value="TMS"description="TMS 三甲基硅基"/>

             <Hotkeykey="x" command="LABELTEXT" value="X"description="Atom Labeling"/>

             <Hotkeykey="1" command="SPROUT" value="1" description="Addsone bonds to the atom"/>

             <Hotkeykey="2" command="SPROUT" value="2" description="Addstwo bonds to the atom"/>

             <Hotkeykey="3" command="SPROUT" value="3" description="Addsthree bonds to the atom"/>

             <Hotkeykey="4" command="SPROUT" value="4" description="Addsfour bonds to the atom"/>

             <Hotkeykey="5" command="LABELTEXT" value="EC"description="自定义别名EC,碳酸乙烯酯基"/>

             <Hotkeykey="6" command="LABELTEXT" value="Ph" description="AtomLabeling: Ph"/>

             <Hotkeykey="." command="ATOMNUMBER" value="True"description="句点,显示原子数"/>

             <Hotkeykey="-" command="CHARGE" value="-"description="减少原子的电荷"/>

             <Hotkeykey="=" command="CHARGE" value="+" description="加号不方便,改为=号"/>

          </Hotkeys>

        </Object>

     <Object type="Bond">

         <Commands>

             <Command id="BONDORDER" description="Sets the Bond Order"/>

             <Command id="BONDDISPLAY" description="Sets the Bond Display"/>

             <Command id="BONDPOSITION" description="Sets the Position ofBonds"/>

             <Command id="BONDDOUBLEPOSITION" description="Sets the Alignment forDouble Bonds"/>

             <Command id="FUSERING" description="Fuses a ring to a bond"/>

         </Commands>

         <Hotkeys>

             <Hotkeykey="f" command="BONDPOSITION" value="FRONT"description="键显示在前面"/>

             <Hotkeykey="l" command="BONDDOUBLEPOSITION" value="LEFT"description="双键左对齐"/>

             <Hotkeykey="r" command="BONDDOUBLEPOSITION"value="RIGHT" description="双键右对齐">

             <Hotkeykey="c" command="BONDDOUBLEPOSITION"value="CENTER" description="双键居中对齐"/>

             <Hotkeykey="1" command="BONDORDER" value="1"description="设为单键"/>

             <Hotkeykey="2" command="BONDORDER" value="2"description="设为双键"/>

             <Hotkeykey="3" command="BONDORDER" value="3"description="设为叁键"/>

             <Hotkeykey="4" command="FUSERING" value="4"description="Fuse 4 membered ring"/>

             <Hotkeykey="5" command="FUSERING" value="5"description="Fuse 5 membered ring"/>

             <Hotkeykey="6" command="FUSERING" value="6"description="Fuse 6 membered ring"/>

             <Hotkeykey="7" command="FUSERING" value="7"description="Fuse 7 membered ring"/>

             <Hotkeykey="8" command="FUSERING" value="8"description="Fuse 8 membered ring"/>

             <Hotkeykey="9" command="FUSERING" value="9"description="Fuse chair cyclohexane"/>

             <Hotkeykey="0" command="FUSERING" value="10"description="Fuse chair cyclohexane"/>

             <Hotkeykey="d" command="BONDDISPLAY" value="DASHED"description="Display a Bond as Dashed"/>

             <Hotkeykey="H" command="BONDDISPLAY" value="HASHED"description="Display a Bond as Hashed"/>

             <Hotkeykey="h" command="BONDDISPLAY"value="HASHEDWEDGED" description="HasHashWedged"/>

             <Hotkeykey="b" command="BONDDISPLAY" value="BOLD"description=" Bond as Bold"/>

             <Hotkeykey="w" command="BONDDISPLAY" value="WEDGED"description="Bond as Wedged"/>

             <Hotkeykey="y" command="BONDDISPLAY" value="WAVY"description=" Bond as Wavy"/>

         </Hotkeys>

        </Object>

         <Object type="Generic">

         <Commands>

             <Command id="DIALOG" description="Display a Dialog"/>

             <Command id="TOOLMODE" description="Changes the Current Tool"/>

          </Commands>

          <Hotkeys>

             <Hotkeykey="\" command="DIALOG" value="CHOOSENICKNAME"description="等号默认调出别名定义"/>

             <Hotkeykey="/" command="DIALOG" value="PROPERTIES"description="斜杠默认调出属性对话框。"/>

             <Hotkeykey="w" command="TOOLMODE" value="SNAKINGCHAIN"description="w形象代表蛇形链"/>

             <Hotkeykey="d" command="TOOLMODE" value="SOLIDBOND"description="d代表启用单实线键"/>

             <Hotkeykey="5" command="TOOLMODE" value="CYCLOPENTANE"description="5启用环戊烷"/>

             <Hotkeykey="6" command="TOOLMODE" value="CYCLOHEXANE"description="6启用环已烷"/>

              <Hotkeykey="p" command="TOOLMODE" value="BENZENE"description="p代表Phenyl, 启用苯环"/>

             <Hotkeykey="e" command="TOOLMODE" value="ERASER"description="e代表Eraser,启用橡皮擦"/>

             <Hotkeykey="l" command="TOOLMODE" value="LASSO"description="L代表Lasso,启用套索"/>

             <Hotkeykey="m" command="TOOLMODE" value="MARQUEE"description="M代表Marquee,启用框选"/>

             <Hotkeykey="j" command="TOOLMODE" value="ARROW"description="J代表Jiantou,表示启用箭头"/>

         </Hotkeys>

      </Object>

</Objects>



updated on 2017-3-20



http://blog.sciencenet.cn/blog-1213210-1040207.html

上一篇:从SMILES谈起, 到CAL脚本生成SMILES字串

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|科学网 ( 京ICP备14006957 )

GMT+8, 2017-3-26 21:05

Powered by ScienceNet.cn

Copyright © 2007-2017 中国科学报社