精华内容
下载资源
问答
  • vim宏命令学习

    2019-10-23 16:10:23
    2019年10月23日 vim下宏的使用 在 Vim 编辑器中创建新文件或打开现有文件 按 q 并跟上 宏名 开始录制。...编辑宏命令 按q停止录制 ##按 @ 接 宏名 即可运行宏一次,按 次数 接 @宏名 重复运行宏多次 ...

    2019年10月23日 vim下宏的使用

    在 Vim 编辑器中创建新文件或打开现有文件

    在这里插入图片描述

    按 q 并跟上 宏名 开始录制。假设我们想要将宏名命名为 a ,则按 Esc 和 qa 开始录制

    在这里插入图片描述

    编辑宏命令

    在这里插入图片描述

    按q停止录制

    在这里插入图片描述##按 @ 接 宏名 即可运行宏一次,按 次数 接 @宏名 重复运行宏多次
    在这里插入图片描述

    展开全文
  • 宏命令

    2019-07-25 00:06:40
    宏命令 玩过EQ的都知道一点宏的知识,比如组队时用来告诉队友你的行动,告诉目标等。最简单的比如puller 常用的: /v %t过来了,大家集中火力。 法师常用的: /v 我要催眠%t,大家不要打醒他 这些宏个性鲜明,是EQ的...

    0b3a1c08f93a86ef63d9862a.jpg

    宏命令

      玩过EQ的都知道一点宏的知识,比如组队时用来告诉队友你的行动,告诉目标等。最简单的比如puller 常用的: /v %t过来了,大家集中火力。 法师常用的: /v 我要催眠%t,大家不要打醒他 这些宏个性鲜明,是EQ的一大乐趣之一。然而EQ毕竟是N年前的游戏,宏也比较简单,和它比起来。WOW的宏就复杂和强大的多了。它的函数就有上千种,如果都掌握,能实现许多匪夷所思的功能。一个宏可以完成一个相对比较复杂的命令.比如战斗中发布命令,如果打字当然不算麻烦,但在战斗中却很要命.浪费了时间和生命.一个简单的宏便可以用一个键来完成这一切。

    基本宏命令

    1. 什么是宏
      宏是由一组宏命令组成的。以下是一些普通宏命令:

       /say (/s)

       /whisper(/w, /talk, /t)

       /emote(/e, /em, /me)

       /dance

       喜爱PVP的人,应该不会忘了这个:/spit

      利用宏,我们可以把这些宏命令放到技能栏上点击使用,而且可以同时做多个动作。写宏的时候,每条动作写在一行上,就像在聊天界面中输入的一样。比如,让你的角色喊一声“Everybody, dance now!”然后开始跳舞的宏:

      /y Everybody, dance now!

      /dance

      一个基本完整的宏命令列表可以参考这里:《宏命令全表》,不过个别新添加的宏命令还没有被收录。WoWWiki有很多关于宏的资料,尤其是脚本和/run命令(后面将会提到)。

      注:我先在此说一下,宏的执行是立即进行的。这意味着当你点击技能栏上的一个宏时,宏命令会一条接一条地执行,执行完后才会返回游戏控制。这将会产生两个重要问题:第一,如果写了一个会执行很长时间的宏(如:/run for i=1, 1000000000 do end),游戏会被卡死,直到它执行结束;第二,也是更重要的一点,那就是宏命令不可能具有延时功能。这一现象在我们熟悉/cast之类的命令后就可以很清楚地感觉到。而一些提供了延时执行命令功能的插件,只能是能执行一些所谓的“良性命令”,如交谈、表情和对于其他插件命令的调用(不过战斗中更换武器是可以进行的)。

    2. 怎样写宏
      首先,打开你的宏窗口:单击主菜单上的“宏”按钮,或者在聊天界面中输入/macro(/m)回车。在宏窗口的顶端,可以看见两个标签:“通用宏”和“<你的角色名>的专用宏”。通用宏被存储在账号专有的文件夹中,被所有角色共享。而角色专用宏则存储在角色自己的文件夹下,是角色专用的(废话……囧)。在标签下面是18个存放宏的栏位。再往下是一个栏位,用于显示当前选中的宏;还有一个“修改名称/图标”的按钮,用于修改选中的宏。然后是一个用于显示、编辑当前宏的文本框。最下面是三个按钮,傻子也能看出它们是干什么的。

      如果要创建一个宏,首先单击窗口下方的“新建”按钮,这时窗口旁边会显示一个对话框,用于选择图标和输入宏的名称。如果选择了第一个图标(就是那个很红很暴力的问号),WoW会自动根据你宏命令中涉及的技能或物品选择图标。选好图标,输入完名称,就可以单击“确定”按钮了。

      顺便提几点:1.使用问号图标的宏,可以通过使用#show指定显示的图标。2.虽然可以给不同的宏起相同的名字,但是最好不要这样做。因为有些插件和宏命令是通过宏名称来调用宏的。3.在图标列表中可以添加自定义的图标。

      现在,你选择的宏图标被显示在栏位中了(还会显示部分宏名称)。同时,新建的宏被选中,图标显示在当前选中宏的栏位中:现在你可以写你的宏了。单击编辑文本框,然后输入吧。

      注:宏限定为255个字符,传闻这样做是为了以后可以把用户的宏上传到服务器中。不过……现在能做的就是遵循这个限定,至于想要把宏移植到其他机器上使用,请参见第三部分的宏的移植。

      写完宏以后,只要把它的图标拖放到技能栏中就可以了。当你执行一个宏,或者是关闭宏窗口的时候,宏都会自动保存的。现在点击宏的图标,看看效果吧!

    3. 施放法术
      在正常游戏过程中,很多宏命令通过聊天窗口输入使用似乎并不好用,但是在宏中就不一样了。在特定场合下,简简单单的表情宏也可以产生有趣的角色扮演效果哦,那么,继续看……

      这个:/cast,它是最常见的宏命令了。作用嘛,就是施放一个技能书中的技能(包括宠物的)。最简单的用法就是这样:

      /cast 暗言术:痛

      把这个宏放到技能栏上点击,将会对目标施放你最高级的痛。这和把技能书中的痛拖到技能栏上,然后点击的效果是一样的。我们制作的宏同样会在技能栏显示你的技能冷却状态和射程状态,点击后同样能正确的施放痛。如果宏使用了问号图标,那么还同样会显示痛原有的图标。

      那直接用技能不就行了么,何必用宏呢?继续看,在宏中通过集成多条命令可以产生什么效果吧,这才是宏的价值所在。比如说你是个法师,想让队友知道你要羊掉谁,你该怎么办?用宏吧,一个简单的/p命令加上一个/cast就可以了(使用这个无耻的插件可以达到更好的效果:CCWarn,不过我们现在需要的只是这个简单易懂的教学例子):

      /cast 变形术

      /p 我羊了%t!谁打谁扛着哈!

      注:由于宏的执行是立即进行的,所以不管目标是否有效技能是否冷却,宏被点击时/p命令就执行了,也就是说这两行命令的顺序颠倒后效果是相同的。如果你想在确定成功施放一个技能后才执行某条命令,你可以试试这个插件:AfterCast。AfterCast可以设定在施放某个技能后执行一条宏命令,当然,是在第1节末尾所提到的限制之下的。如:

      /aftercast /p 请队友点门,把懒猪%t揪过来!

      /cast 召唤仪式

    i.关于技能名称和等级的说明

      /cast命令对技能名称是十分严格的,文字、标点、空格,一个都不能错。为了防止出错,编辑宏时,你可以打开你的技能书,按下Shift然后单击你的技能图标,技能名称和等级就会被正确地输入到你的宏编辑文本框中,如:

      /cast 暗言术:痛(等级 5)

      如果把“(等级5)”删掉,宏在执行时就会自动选择你最高级别的技能执行;不过在很多场合下,还是需要指定级别的技能,比如术士放逐就需要根据时间来选择技能。另外要注意,等级指示中使用的括号是英文的半角括号,等级与数字间有一个半角空格。而一些技能名称中的括号,比如“精灵之火(野性)”中的括号,是中文的全角括号。以下宏命令不能正常执行:

      /cast 精灵之火(野性)

      /cast 精灵之火(野性)(等级 1)

      而以下的命令是正确的:

      /cast 精灵之火(野性)

      /cast 精灵之火(野性)()

      空的括号效果和没有括号是一样的。由于255字符限制的存在,空间还是要节省的,所以空括号可以删掉了……

    4. 使用物品或者饰品
      使用物品和饰品和施放法术是类似的。用于使用物品的命令是/use,后面只需要加上物品的名字就可以了。例如:

      /use 绿色机械陆行鸟

      另外,还有以下其它的使用格式:

    i./use <装备栏>

      这种格式可以使用指定装备栏中的物品。具体使用请参见《装备栏编号方式》。例如:

      /use 13

      使用第一个饰品。

    ii./use <背包> <栏>

      这种形式是在指定背包中确定物品栏的,比如你总是把猫食狗粮放在行囊的第一个栏位中,那么你就可以用这样的宏来喂养宠物:

      /cast 喂养宠物

      /use 0 1

      背包的编号为0-4,顺序是从右到左,即0是行囊。物品栏则是从上到下从左到右,从1开始依次编号的(与书写顺序相同):

      1 2 3 4

      5 6 7 8

      ……

      或者是:

      1 2

      3 4 5 6

      7 8 9 10

      ……

      如果怕把/cast和/use的用法混淆了,那就彻底搞混吧,因为它们其实本来就是完全一样。/cast可以使用物品,而/use也可以施放技能。这一点在目前看来似乎没有什么,但是到后面,介绍命令条件语和施法队列时,你会发现能把物品和技能混合在同一条命令中是多么爽的一件事。

    5. 集成多个动作
      首先,在一个宏中想一键释放多个法术是不行的。大多数技能和很多物品会触发公共冷却(GCD),防止你同时做太多的动作。即使一个技能释放失败,如果它可以触发GCD,那么它也会阻止后续/cast命令的执行。这是2.0版本之后的设定,之前可能看到这样的宏:

      /cast 压制

      /cast 斩杀

      /cast 致死打击

      /cast 破甲

      但是现在,记住,这种宏已经不能正常执行了。如果压制施放失败,虽然没有触发GCD,客户端也不会继续执行后续的技能施放。不过令人欣慰的是部分技能还是可以集成到一个宏中。任何不触发GCD的瞬发技能后面可以接上另一个技能(“下次近战攻击”型的技能,如英勇打击也归于此类)。一个技能可以通过看说明知道它是否瞬发,至于是它是否触发GCD通过实验就可以知道。

      2.3版本之前,在这个瞬发无GCD技能之后需要加上一个/stopcasting才可以施放其后的技能。施放第一个技能后,游戏客户端会认为当前在施法状态,而/stopcasting就可以解除这个状态,就可以解决后续技能不能释放的问题。但是由于技能是瞬发,/stopcasting实际上并不能取消技能的施放。

      而现在这里可以不用/stopcasting了,例如:

      /use 短暂能量护符

      /cast 奥术强化

      /stopcasting

      /cast 气定神闲

      /stopcasting

      /cast 炎爆术

    6. 选择目标
      选择目标是宏的另一个主要作用。此类功能可以用专门的目标选择命令实现,改变当前的目标;也可以在一些命令中用[target=]命令条件语实现,临时指定施法或使用物品的目标,而不改变当前目标。命令条件语在第二部分将会讲到到。现在我先介绍目标选择命令。

      最基本的命令是/target,用法如下:

      /target Cogwheel

      /target的选择是经过最佳相近匹配的,也就是说,如果我正站在你附近(并且附近没有谁叫Cog的),你执行/target Cog,我就会变成你的当前目标。至于这种机制是利是弊……那就取决于实际情况了,因为这个东东貌似不稳定,有时会得到莫名其妙的结果。比如下面这个宏就可能不是很好用:

      /target 黑翼法师

      /cast 痛苦诅咒

      如果附近没有黑翼法师呢?或许结果就是:选中了团里的某个人,因为他的名字在某种意义上比较相近。虽然你的诅咒不会真对他们放出来,但还是够囧的。另外一个问题是,它可能会选择你身后一个离你100码的单位——根本不是你想选中的那一个……不过在2.3版之后,增加了一个/targetexact命令,第一个问题得到解决了。

      除了用人名进行选择之外,还可以通过单位标识符进行选择。单位标识符(Unit ID)是用于标识特定单位的字符串。比如你的当前的目标就可以用“target”来表示,而你自己对应的标识符是“player”,如果你有宠物,那么它的标识符是“pet”。另外,通过在一个正确的标识符后加上target,就可以获取他的目标。如此变态也可以:

      /target targettargettargettargettargettarget

    这里是一个可用ID的全表:《单位标识符》。

    i.其他选择命令

      以下是其他的目标选择命令:

       /assist

      不加任何其他参数时效果是选择你目标的目标,如果在其后加上人物名称,那么就会选择对应人物的当前目标。例如:

      /assist Cogwheel

      另外,在客户端的界面选项中有一个选项,可以设置用/assist选中一个敌对目标时是否自动进行攻击。

       /cleartarget

      清除当前目标。

       /targetexact

      准确选择,如果附近没有单位的名字和给出的参数完全匹配,就不会切换目标。

       /targetlasttarget, /targetlastfriend 和 /targetlastenemy

      顾名思义,分别用来选择上一个目标、上一个友方目标和上一个敌对目标。如果你之前没有过任何目标,那么这些命令不会产生任何影响。

       /targetenemy 和 /targetfriend

      选择敌方目标和选择友方目标。这两条命令是按一定顺序循环选择指定类型的目标的,和使用Tab键的效果类似。如果在命令后加上一个1作为参数,那么就会按循环的反方向进行选择。例如:

      /targetenemy 1

      效果就和按下Shift+Tab键一样。

      注:这两个宏命令每个宏中只能用一次。

       /targetparty 和 /targetraid

      按距离循环选择你附近的小队或团队队友,与/targetenemy类似,也可以用1作为参数改变选择的循环方向。

    7. 控制宠物
      之前在讲施放技能的时候提到过,使用/cast命令可以施放宠物的技能。玻璃渣把法师的水宝宝的霜星起名叫“冰冻术”就是为了避免和法师自身的“冰霜新星”技能冲突,从而导致不能在宏内使用。但是有宠物的职业会发现,如果宏只能施放技能的话,甚至还不如宠物技能栏的功能。别急,燃烧的远征中,新增了以下这些宏指令:

    i./petattack

      让你的宠物去攻击你的当前目标。当然,在命令后加参数可以指定攻击的对象。

    ii./petfollow

      宠物切换到跟随状态,同时取消攻击。

    iii./petpassive, /petdefensive 和 /petaggressive

      宠物切换被动、防御和主动攻击状态。同宠物技能栏上的最后3个按钮。

    iv./petautocaston 和 /petautocastoff

      打开/关闭宠物技能的自动施放。例如:

      /petautocaston 折磨

      /petautocastoff 受难

      不过美中不足,没有直接切换自动施放状态的宏命令,我将在后面“模拟点击”部分提到一个解决方法。

    8. 宏在动作栏的显示控制
      如果一个宏使用问号图标,魔兽世界客户端会默认把宏内容中的第一个技能或物品的图标、冷却状态等信息显示在技能栏上。比如前面所讲的这个例子:

      /use 短暂能量护符

      /cast 奥术强化

      /cast 气定神闲

      /cast 炎爆术

      客户端会把奥术强化的状态信息作为宏的状态显示。但是这恐怕不是我们所希望的,因为这个宏的目的是炎爆,前几行的奥强气定都只是为了最后把一个大大的脸盆给丢出来。如果在宏的前面加上这样一行,炎爆术就会被当作宏的默认技能:

      #show 炎爆术

      如果使用了问号图标的话,宏还会直接显示炎爆的图标。#show的参数机制和/cast类似,可以使用技能名、物品名、物品编号(如item:12345)、装备栏或者背包+物品栏编号。

      和#item类似的还有#showtooltip。正常情况下,鼠标指向宏的时候,提示信息显示的是宏的名字。而这在绝大多数情况下是很不好用的(除非你用了TheoryCraft之类的插件可以显示详细的技能信息)。而用#showtooltip就可以指定宏在鼠标指向时显示的信息,用法同#show。另外,如果使用了#showtooltip的话,就没必要再用#show了。

      如果客户端自动选择的技能符合你的要求,那么可以只用#showtooltip而不加参数来显示该技能的说明,这样可以节约空间。

      请注意:#show和#showtooltip与/开头的宏命令不同,是大小写敏感的,也就是说只能用小写字母。

    9. 其他的命令
      现在有了足够的基础,以下这些命令我就只简要地讲解一下了。有些命令看似没啥用,但如果配合将在第二部分介绍的命令条件语,它将会产生惊人的效果。

    i.装备物品

      用于装备物品的命令有两个:/equip和/equipslot。/equip的参数为物品名称,效果是把对应物品装备到默认的装备栏中,类似在背包中右键单击物品(如:一件单手武器就会被装备到主手上)。而/equipslot的参数为装备栏编号和物品名称,效果是把物品装备到指定栏位中去。例:

      装备武器:

      /equip 虚空角斧

      把饰品装备在第二个饰品栏中:

      /equip 14 棍子上的胡萝卜

      注意:即使是在战斗中,插件页是可以直接使用装备命令的。因此在AfterCast和Chronos中可以使用装备命令。如果插件内部会检查命令是否经过安全化可能就不那么好用了,因为它属于“安全化”指令——但是事实上它并没有受到安全限制。

    ii.队列施法或使用物品

      很多时候我们需要经常按一定顺序使用固定的一些技能或物品。这样的操作是可用/castsequence宏命令进行傻瓜化的。/castsequence命令用法是在后面写上一些技能或物品的名称,之间用英文的半角逗号分隔,和/use、/cast类似。技能名、物品名、物品代号、装备栏代号和背包位代号都可以混合使用。每次执行宏,就使用当前的技能或物品(从第一个开始),如果成功,队列的当前位置就被移至下一个技能或物品。也就是说需要反复执行宏来按顺序使用这些技能或物品。当最后一个技能/物品成功使用后,这个队列就被重置到开头。比如:

      /castsequence 献祭, 腐蚀术, 痛苦诅咒, 生命通道

      这是痛苦术士起手的招牌动作。注意,如果献祭没有施放成功(比如魔法不足,超出范围,被沉默了等等),这个队列不会继续执行,直到献祭放出去。所以下面这个宏是屁用没有的:

      /castsequence 压制, 斩杀, 致死打击

      在技能列表之前,可以插入一个条件语,用于另外指定一些队列的重置条件。语法是:

      reset=n/target/combat/shift/alt/ctrl

      以上的这些条件都可以任意共存。其中,n是数字,表示从某次执行宏开始,经过n秒后没有再次执行这个宏,那么队列就被重置到开头。这一点很重要,因为这意味着无法利用reset条件语来精确计时(比如让某技能一冷却就用)。target条件表示当目标切换时,宏队列重置;combat条件表示脱离战斗后重置;shift,alt和ctrl表示当执行宏时指定的键为按下状态时重置。例如:

      /castsequence reset=10/shift 第一个技能, 其他技能, 一些物品

      如果这个宏图标使用的是问号,就会自动显示下一个要施放技能的图标。但如果/castsequence前面还有其他/cast和/uses命令,这个功能就没有了,而且玻璃渣也没有提供什么命令来解决这个问题。

    iii.随机施法或使用物品

    最常见的例子就是希望随机召唤一个坐骑来装B,使用/castrandom或者/userandom宏命令很容易实现这个功能。用法和/castsequence类似,如:

      /castrandom 迅捷绿色机械路行鸟, 军用黑色机械路行鸟, 召唤恐惧战马

    iv.攻击

      以前的宏是/attack,后面可以写上单位名作为攻击对象,无参数则以当前目标为对象。效果是切换当前的攻击状态(攻击/停止攻击)。但是这个宏从2.2.3开始就被废除了,只能使用/startattack和/stopattack了。分别用来攻击和停止攻击。如:

      /startattack Cogwheel

    v.技能栏控制

      有两个控制技能栏翻页的宏:/changeactionbar和/swapactionbar。前者接受一个数字作为参数,表示要切换到的技能栏页码。常见的是猎人用来转换近战远程攻击状态:

      /cast 雄鹰守护

      /changeactionbar 1

      和

      /cast 灵猴守护

      /changeactionbar 2

      /swapactionbar命令后面要写两个页码,表示来回切换指定的两个技能页。如果当前技能页不是两个页码中的一个,当前页就会被设置为第一个页码指定的技能栏页。

      /swapactionbar 1 2

    vi.移除增益效果

      /cancelaura命令可以移除自己不想要的增益效果(BUFF),比如主坦需要移除身上的拯救祝福:

      /cancelaura 拯救祝福

    vii.退出形态

      除了战士,任何有“形态”概念的职业(德鲁伊、暗牧)都可以用/cancelform来退出当前形态:

      /cancelform

      /use 超强治疗药水

      2.3版本之前,上面这个宏由于形态取消有一个延迟,为了达到效果需要执行两次。不过2.3版本后,小德可以只点一次就产生效果了。

    viii.中止施法

      前面简单提到了/stopcasting命令,不过它存在的目的顾名思义,是用来打断当前施法的。这对处理紧急情况很有用,比如我的术士:

      /stopcasting

      /cast 暗影灼烧

    ix.终止一个宏:/stopmacro

      /stopmacro如果不配合条件语来使用是没有什么意义的。它一般用来实现条件执行的功能:如果满足了某些条件,则中止宏继续运行。具体用例请参见设置焦点(focus)。

      x.解散坐骑

      /dismount

      不用再说什么了吧?

    xi.保存一个目标用于后续动作

      /focus宏可以把一个目标设为焦点(focus),然后可以在其他指令中使用这个focus。比如你的老大指定了一个目标让你羊着。你要做的就是选择它,然后输入/focus。然后你就可以用这个宏羊着它了,而不用管你当前目标变成了谁:

      /cast [target=focus] 变形术

      注意,focus的作用可不仅仅如此,具体还是请参见设置焦点(focus)一节的内容,那里有更深入的剖析。

    xii.模拟点击

      /click命令的参数为一个按钮(本质上来说是一个窗口)的名称,执行的效果就相当于用鼠标点击了这个按钮。默认情况下,它的效果相当于左键单击,也可以根据设置成其他按键点击的效果。至于按钮名称可以通过一下方式获知:

       使用插件。某些插件,比如MoveAnything,提供了查看窗口名称的功能。

       查看界面的源代码。这一般是非常娴熟非常牛B的插件制作者才能做到的。

       用这样一个宏获取当前鼠标所指的窗口名称:

      /run local f=GetMouseFocus(); if f then DEFAULT_CHAT_FRAME:AddMessage(f:GetName()) end

      /click可以用于很多用途。比如利用它可以一次执行很多宏。还有,假设你有一个宏太长了,远远超过255字符限制。你就可以把后面写不下的代码写到另一个宏中,而前面那个宏的末尾写上:

      /click MultiBarRightButton1

      再把第二个宏拖到那个叫MultiBarRightButton1的栏位中。这样执行第一个宏就相当于执行了所有的宏命令。

      另外,这个宏还可以用来做一些其他命令没法办到的事。比如前面提到的切换宠物技能自动施放状态的功能,就可以这样解决:

      /click PetAttackButton5 RightButton

      这个命令的涵义就是右键单击一下宠物栏上第五个按钮。

      用于指定按键的参数还可以是LeftButton(左键,默认),MiddleButton(中键),Button4(4号键)和Button5(5号键,职业玩家的鼠标……)。在掌握这些之后,第二部分结尾处还会介绍更复杂的,利用/click产生分支判定效果的例子。

    10. 进阶:脚本
    i.脚本有哪些限制?

      脚本是一个强大的工具,它按照LUA语言的语法执行,利用客户端提供的接口可以产生强大的智能。所以玻璃渣就给它加了限制,防止它被滥用而影响游戏平衡性。我之所以要先讲脚本的限制,为的是让大家对它别抱太大希望。虽然脚本还是很有用,但是不能用来施法、使用物品、改换技能栏或改变当前目标。这些功能只能依靠那些“安全化”的命令来实现。

    ii.什么是脚本?

      魔兽世界客户端的用户界面是可以通过LUA脚本控制的。通过/run和/script命令就可以执行脚本(我个人推荐使用/run,节省字符数……)。在命令后面书写脚本内容,中间不能换行。不过一个宏中可以包含多个/run命令。

      过多关于LUA语言和编程的内容本文就不再赘述。如果你有一定的编程经验,那么就可以访问学习LUA语言。如果没有什么基础,那么请先看《编程入门》了解一些基本概念。

      玻璃渣提供了很多API函数(Application Programming Interface),可以在LUA脚本中调用来实现对界面的控制。关于API函数和相关的内容可以看看这篇文章:《界面DIY》(如果你打算花时间好好研究魔兽世界插件的话,WoWWiki是最优选择)。我不可能把所有关于用户界面的细节都讲到,因此我只打算用我最常用的一个宏做例子,简单地讲一下。想了解得可以看上面给出的链接,或者这里:《Mod Author Resources sticky》。

      下面这个宏是我给出的例子,它会向所有和你目标相同的人发送悄悄话,通知他们改变目标(我的插件CCWarn也是就是基于这段代码的)。这样就可以防止已被羊的人受到攻击。

      /cast 变形术

      /run for i=1,GetNumRaidMembers()-1 do local u,t="raid"..i,"target"if UnitIsUnit(u..t,t)then SendChatMessage("Change targets! Trying to sheep...","WHISPER",nil,UnitName(u))end end

      呃……貌似看起来有些乱……不过没办法……首先,宏是有255字符数限制的,所以常常要用一些不美观的方式去写代码。其次,脚本要写在一行中。这两个条件导致代码的可读性很低。如果把代码单独拿出来美化一下的话,应该是这个样子:

      for i = 1, GetNumRaidMembers() - 1 do

      local unit = "raid"..i

      if UnitIsUnit(unit.."target", "target") then

      SendChatMessage("Change targets! Trying to sheep...", "WHISPER", nil, UnitName(unit))

      end

      end

    编辑本段四、 命令条件语

    1. 什么是命令条件语
      命令条件语是插入在宏命令中,使宏根据条件执行不同功能的语句。举个例子,下面这个宏的作用是,如果是友方目标就施放恢复,如果是敌方目标就上痛:

      /cast [help] 恢复; [harm] 暗言术:痛

      当这个宏执行时,首先检查[help]条件,判断当前目标是否是一个可以接受治疗/增益法术的目标。如果[help]条件成立,那么就施放恢复并执行下一条命令,否则(即没有目标,或目标不接受有益技能)继续执行下一个子句,也就是分号后[harm]那里,再判断[harm]条件。[harm]条件和[help]条件相反,判断目标是否接受敌对法术。同上,如果条件成立就释放“暗言术:痛”并执行下一条命令。如果条件不成立,由于后面没有其他子句,这条宏命令就算执行完了,但是什么动作都没有做。

      注:如果没有写[harm]条件,实际运行效果是差不多的。不过,如果你没有目标或者当前目标不接受任何法术,那么屏幕上将会出现错误信息,或者对于某些技能,鼠标将会变成选择施放目标的状态。

    2. 可以使用条件语的命令
      只有那些“安全化”命令可以接受命令条件语。其实正是经过安全化的命令才需要条件语。常规命令,比如说聊天、表情之类的,可以通过脚本来实现命令条件语的功能。而且暴雪不想限制大家在聊天时使用分号(;)。如果/s命令可以使用命令条件语的话,那么下面这个命令就会只说hello:

      /say Hello; I’m a n00b

      以下是当前客户端中安全化命令的列表:

      #show1

      #showtooltip1

      /assist

      /cancelaura

      /cancelform

      /cast

      /castrandom

      /castswquence

      /changeactionbar

      /clearfocus

      /cleartarget

      /click

      /dismount

      /equip2

      /equipslot2

      /focus

      /petaggressive

      /petattack

      /petautocastoff

      /petautocaston

      /petdefensive

      /petfollow

      /petpassive

      /petstay

      /startattack

      /stopattack

      /stopcasting

      /stopmacro

      /swapactionbar

      /target

      /targetenemy

      /targetfriend

      /targetlasttarget

      /targetparty

      /targetraid

      /use

      /userandom

      注1:#show和#showtooltip不是真正意义上的安全化命令,但是它和/use以及/cast的内部机制相仿。

      注2:/equip和/equipslot逻辑上也不算是安全化命令,因为它们的功能是可以通过插件和脚本实现的。

      当然,如果你希望在常规命令中使用命令条件语,就需要安装专门的插件。MacroTalk,这是我的一个作品,通过在非安全化命令前添加/opt,然后在/opt中处理各类条件来实现对不同命令的调用(当然只能是非安全化命令)。最新版的SuperMacro中应该也有类似的功能。

    3. [target=]条件语
      该条件语使得宏命令除了可以对条件进行判断外,还可以设置动作的目标。例如,下面这个宏运行时,无论当前目标是谁,玩家只会给自己绑绷带:

      /use [target=player] 厚灵纹绷带

      Target条件语在指定动作目标的同时,也指定了进行条件判断的目标。下面这个垃圾宏是一个纯教学例子,看我的说明:

      /cast [help] [target=targettarget, help] [target=player] 快速治疗

      这个宏运行的时候,首先会检查[help]条件。如果条件为真,那么就开始吟唱快速治疗。否则就跳至第二个条件,[target=targettarget, help]。此时,判断目标和技能目标都被设定为你当前目标的目标,然后进行help条件判断。如果条件成立就对你当前目标的目标施放快速治疗,否则再跳至第三个条件。而第三个条件总是成立的,所做的只是把你自己当作施法目标。

    4. 语法
      命令条件语是按什么规则生效的?恐怕要回答这个问题很容易引起混乱。所以,趁还没有正式开始讲,我先用一些现实生活的例子做类比。看不懂不要紧,这只是些概念,技术性的内容后面都还会再提到的。

    i.条件语语法简介

      所有的宏命令的基本工作方式是相同的:一个命令,后面带上一个或多个参数(取决于命令的要求,有些甚至不需要任何参数)。看下面这些例子:

      /cast 猛击

      \___/ \___/

      | |

      | 参数

      |

      命令

      /petattack

      \_______/ \/

      | |

      | 参数(为空)

      |

      命令

      /castsequence reset=target 献祭, 腐蚀术, 痛苦诅咒, 生命虹吸

      \_________/ \_______________________________________/

      | |

      命令 参数

      而命令条件语可以通过对一组条件进行的判断来选择命令的实际参数。首先,可以用分号分隔出若干个“若干组条件+参数”这样的子句,逻辑上,分号就相当于高级语言中的else或是elseif。条件的组数不定,也可以没有,同一组条件用一个方括号括在一起。而每组条件中有可以包含多个条件。就像这样:

      /命令 [一组条件] [另一组条件] 参数1; [又一组条件] 参数2; ……

      前面的例子已经说明了,宏命令的解释过程是从左至右的。当一组条件被判定成立时,命令就会采用其对应的条件。如果某一个子句中不包含条件,那么就被无条件判定为成立。像/cast XXX这种简单的宏命令就可以理解为一个只有一个子句的宏,而这个子句又不包含条件。而如果一个宏的任何一组条件都不为真,那么它就完全不会执行。

    ii.条件语法

      每组条件都是由逗号分隔的一些条件语组成的,各条件不分前后次序。逻辑上,[target=]总是先发生作用,然后其他的条件才进行判定。逗号在这里可以理解为“并且”,也就是说各条件简是逻辑“与”的关系。比如[help, nodead, target=focus]的含义就是:我的焦点是友善的,并且是只活的。

      注意:条件是对大小写敏感的,如果你把[help]写成了[Help],宏运行时会报错。

      条件中有组合式的使用方式,比如nodead,同样对于help,你可以用nohelp表示相反的条件。但是nohelp不等于harm:首先,help和harm都要求目标存在才有可能成立;其次,有些目标,比如中立阵营NPC、非战斗宠物或者护送任务NPC等,既不算help,也不算harm。

      还有些条件可以指定一些特定的参数。比如[stance],姿态,单独使用时表示“在任一姿态中”(显然这对战士来说是废话一句)。如果给它加上参数,就可以指定在某个姿态下,格式是在条件语后写上冒号(:),然后后面写上参数,每个参数间用斜线(/)分隔。综上所述,一个条件语的完整格式如下(<>表示其中的部分是可选的):

      [<no>condition<:parameter</parameter</parameter<…>>>>]

      下面举个例子,如果在战斗或防御姿态施放盾击,否则转入防御姿态:

      /cast [stance:1/2] 盾击; 防御姿态

      这个宏用伪代码写的话就是:

      IF 当前在姿态1或姿态2

      THEN 用盾击

      ELSE 切换防御姿态

      注意:“no”前缀是对整个条件和所有参数的修饰,即把原来的真变为假,假变为真。比如[nostance:1/2]表示“不在姿态1也不在姿态2中”。

    iii.完整的EBNF语法

      对EBNF规范很熟悉的人,以上内容可以概括为:

      command = "/", command-verb, [ {command-object, ";" } command-object] ]

      command-verb = ? any secure command word ?

      command-object = parameters

      parameters = ? anything which may be passed to the command word ?

      condition = "[" condition-phrase { "," condition-phrase } "]"

      condition-phrase = [ "no" ], option-word, [ ":" option-argument { "/" option-argument } ]

      option-argument = ? any one-word option, such as 'shift, 'ctrl', 'target', '1', '2' ?

    iv.参数为空

      有些命令是可以没有参数的,这里就存在着一个陷阱。比如:

      /petattack [target=focus, harm];

      很多初学者一看,认为这个宏的含义应该就是判断焦点是否为敌对,如果是,就把宠物送上去咬。而实际上呢?让我们分析一下:

      /petattack [target=focus, harm] ;

      \________/ \______________/ V V V

      | | | | |

      命令 条件语1 | | 参数2 (为空)

      | |

      | 条件语2(为空)

      |

      参数1 (为空)

      现在看出来了吧?由于那个分号的存在,这个语句实际上包含两个子句,而一个条件语为空的子句是被当作条件成立处理的,因此即使前面的条件语1不成立,也会执行一个/petattack。

    v.条件为空

      有时我们需要在特定条件下对特定目标施放技能,并在条件不成立的情况下按常规施放。这中效果可以通过使用一组空条件来获得。下面例子中的宏在执行时会对你鼠标指向的友方单位施放圣光闪现。如果鼠标没有指向任何单位或者指向的目标不是友善的,那么就会按常规对当前目标施放,或者根据设置(如自动自我施法、自我施法功能键)对自己施放。

      /cast [target=mouseover, help] [ ] 圣光闪现

    vi.[target=]条件语与命令参数

    很多命令的参数是可以直接指定目标的。比如/target party1就可以把小队中第一个队友作为你的目标。而用/target [target=party1]的话,虽然看起来别扭,但是效果也是一样的。但是宏的设计者不希望我们根据一个单位的状态而对另一个单位执行动作,因此大多数情况下[target=]条件和命令参数只能有一个发生作用。例如:

      /target [target=focus, dead] party1

      客户端会把party1直接忽略掉——因为你已经指定了[target=focus]。不过这种情况也有例外,就是个别命令拥有一个“特殊单位”(其实也就是该命令会影响的单位标志符)。见下表:

      命令 特殊单位

      /target target

      /focus focus

      /startattack target

      /petattack pettarget

      当在[target=]中使用的是该命令的“特殊单位”时,命令执行目标不会被设置为该单位,而命令参数中指定的目标也不会被忽略。例如

      /focus [target=focus, dead] [target=focus, noharm] target

      由于focus是/focus命令的特殊单位,所以/focus的目标就不会被[target=focus]设置成焦点,而是target,即当前目标。如果没有指定target,/focus就相当于没有参数,同样是把当前目标设为焦点。

    5. 命令条件语
      下面给出一张条件总表,每一个条件在后面我都会再给出更详细的介绍。

    i.总表

    WOW2.0在对宏命令系统的更新中,宗旨就是把玩家从按“一键万能宏”按到手抽筋的状态中“解脱”出来。不过有一些宏的用法是被官方认可了的,它们获得了“玻璃渣祝福”的效果——可以通过使用条件语来重现。

      下面列出宏命令系统中支持的所有条件语。如果你需要的判断条件没有在此列出,那么就不可能通过该条件来执行安全化命令的动作。这是中央的死龟腚,谁都没办法,不过以后也有可能会再增加一些。

       help 目标可以接受增益法术

       harm 目标可以受到攻击

       exists 目标存在

       dead 目标已经挂了

       stance:0/1/2../n 玩家在某姿态下

       stealth 玩家在潜行状态下

       modifier:shift/ctrl/alt 某功能键被按下

       button:1/…/5/<虚拟按键号> 宏通过某键点击执行

       equipped:<装备类型> 玩家装备了某类型物品,参见《装备类型》

       channeling:<法术名称> 玩家正在引导某法术

       actionbar:1/…./6 当前技能栏为某动作栏

       pet:<宠物名称或类型> 玩家当前宠物为某宠物

       combat 玩家正在战斗状态

       mounted 玩家在骑乘状态

       swimming 玩家在游泳

       flying 玩家在飞行状态

       flyable 玩家正处在一个允许飞行的地界

       indoors 玩家在室内

       outdoors 玩家在户外

       party 目标在玩家的小队中

       raid 目标在玩家的小队或团队中

       group:party/raid 玩家在某集体中(小队/团队)

    ii.敌/友(help / harm)

      没什么好说的,保留空地一块,等待补充。

    iii.存在(exists)

      如果目标存在条件为真。比如[exists],如果你没有目标,该条件就不成立。而对于[target=focus, exists],如果你设置了焦点目标,条件就成立。不过很多情况下该条件用不到,因为[help],[harm],[dead],[party]和[raid]条件成立的情况下,[exists]条件是必定成立的。

    iv.死亡(dead)

      如果判断对象已经挂了,条件就成立。

    v.姿态(stance:0/1/2/…/n)

      姿态是指对技能能否施放有影响的状态,比如战士的姿态,小德、萨满、暗牧的形态,盗贼的潜行状态。而骑士的光环、猎人的守护都算是姿态。单独用[stance]是指在任意一种姿态下,就相当于[stance:1/2/…/n]这样把所有姿态列出来,对战士来说就是永远成立的。而[stance:0]就相当于[nostance]表示不在任何形态下。而[stance:0/3]就表示在形态3下或者不在任何形态下。

      姿态的编号和面板上的顺序是对应的。下面给出各职业的姿态表:

      编号 小德 战士 暗牧 盗贼 萨满

      1 熊形态 战斗姿态 暗影形态 潜行 幽灵狼

      2 海豹形态 防御姿态

      3 豹形态

      4 旅行形态

      5 枭兽/树形态

      6 飞行形态

      注意:上面给出的是全表。如果少了某个姿态,其下方的形态就依次上移。我承认,我这话是针对小德说的……

      下面给出例子:

      /cancelform [nostance:0/1/3]

      /cast [stance:1/3] 精灵之火(野性);[nostance] 精灵之火

      如果在熊/猫形态,施放精灵之火(野性);在人形态,施放精灵之火;在其他形态就先退出,然后施放精灵之火(WOW2.3以后可以这样,2.3之前该宏只能退出形态)。

    vi.潜行(stealth)

      对于盗贼来说由于[stance]的存在反而显得多余。这个是给暗夜、法师、猫德用的,我的意思是它可以用来判断影遁、隐形和猫的潜行。

    vii.功能键状态(modifier:shift/ctrl/alt)

      它是节省技能栏的好帮手,可以让一个宏对不同功能键做不同动作,比如:

      /cast [modifier, help] [modifier, target=targettarget, help] 快速治疗; [help] [target=targettarget] 强效治疗术

      该宏会依次判断你的目标和目标的目标是否友善,条件成立的话,如果按下了某功能键,施放快速治疗,否则施放强效治疗术。

      当然也可以指定特定的功能键。[modifier:shift/ctrl]表示Shift或者Ctrl被按下;如果想表示两个键同时按下则可以这样实现:[modifier:shift, modifier:ctrl]。

      但是要注意这样一种情况,比如你的宏是通过A键执行的,然后根据Shift来做判断。但是你的Shift+A被设置了另外一个动作,那么你按下Shift+A的时候,执行的就是其对应的动作,而不是你的宏。另外,modifier可以被简写做mod以节省空间。

    viii.功能键变量

      虽然说mod指定的只能是shift、ctrl或alt,但是还可以通过一些系统变量来间接指定。比如SELFCAST这个系统变量,是指“自我施法功能键”,默认值为alt,可以通过某些插件修改,表示按下该键后执行的动作都是针对玩家自身的。下面看这个例子:

      /cast [modifier:SELFCAST, target=player] [target=mouseover] [ ] 强效治疗术

      这样的话,不管你系统设置的自我施法键是什么,宏命令都会正常执行。下面给出其他的一些系统变量,括号内为默认值,后面为中文含义:

       AUTOLOOTTOGGLE(shift) 自动拾取键

       STICKYCAMERRA(ctrl) 镜头跟随

       SPLITSTACK(shift) 物品堆叠分离

       PICKUPACTION(shift) 拖动技能栏按钮

       COMPAREITEMS(shift) 物品比较

       OPENALLBAGS(shift) 打开所有背包

       QUESTWATCHTOGGLE(shift) 任务追踪

    ix.点击状态(button:1/2/…/5/<虚拟按键号>)

      与[modifier]类似,可以根据不同的鼠标点击按钮做不同动作。1为左键,2为右键,3为中键,4和5则对应五键鼠标上另外两个扩展键。如果是通过键盘触发宏,那么也相当于左键点击。比如我的坐骑宏:

      #show迅捷绿色机械陆行鸟

      /userandom [nobutton:2, flyable, nomounted] 黑色狮鹫; [nomounted] 黑色战豹, 迅捷绿色机械陆行鸟

      /dismount [noflying]

      非右键键点击时,如果没在坐骑上就召唤坐骑;如果右键点击并且不在飞行状态则取消坐骑。而虚拟按键号一般可以忽略,有些动作条插件可以在不同条件下向宏按钮提供不同的虚拟按键号,具体情况请查看插件说明,我们在此不作讨论。

    x.装备(equipped:<物品类型>)

      [equipped]条件可以判断指定类型的物品是否被装备。物品类型号可以是装备栏名称,物品类别或者物品子类别。比如我根据盾牌装备状态判断该用盾击还是拳击:

      #show [equipped:Shields] 盾击; 拳击

      /cast [equipped:Shields,stance:1/2] 盾击; [equipped:Shields] 防御姿态; [stance:3] 拳击; 狂暴姿态

      利用[equipped]这里的#show可以根据装备显示不同的图标。下面的伪代码用来解释上面/cast命令的执行过程:

      if 装备了盾牌 and 在防御姿态 then

      /cast 盾击

      else if 装备了盾牌 then

      /cast 防御姿态

      else if 在狂暴姿态 then

      /cast 拳击

      else /cast 狂暴姿态

      下面再给出一个变态的压制宏作例子:

      /equip [noequipped:Two-Handed Axes] 水晶熔铸战斧

      /cast [nostance:1] 战斗姿态; [equipped:Two-Handed Axes] 压制

    xi.引导中(channeling:<技能名称>)

      在引导法术的状态下,如果施放另外一个法术将会打断施法。这个条件语就是用来防止这一情况的。当然,它还有些其他的用途,比如只打断特定的引导技。只用[channeling]的话表示正在引导任意技能,或者后面可以指定任意个引导技能的名称表示正在引导其中一个。

      注意:引导和吟唱是两码事,[channeling]条件只对引导技能,如奥书飞弹、吸取生命、精神鞭笞等有用。

    xii.技能条(actionbar:1/…/6)

      系统默认的界面中有一个主技能条,可以翻页。而用这个条件就可以根据当前技能页作出不同反应。比如猎人可以拿来把守护做成姿态:

      /swapactionbar 1 2

      /cast [actionbar:1] 雄鹰守护; 灵猴守护

      这样就可以切换1号和2号两个技能页,换到1页时施放雄鹰守护,2页时则施放灵猴守护。

    xiii.宠物(pet:<宠物名称或类型>)

      对任何有宠职业来说这个条件都很有用,它可以根据你宠物状态来执行动作,可以根据宠物名字,也可以是类型(比如Voidwalker,Boar,Imp,Wolf等),如果只用[pet]的话表示带着任意宠物。比如法师可以根据是否有水宝宝施放不同的霜星:

      /cast [pet] 冰冻术;冰霜新星

    xiv.战斗(combat)

      如果在战斗状态则条件成立。

    xv.行动方式、室内外状态(mounted, swimming, flying, indoors & outdoors)

      这些都无庸赘述,要说的就是它们都是对玩家自身状态的判断,而不是目标。

    xvi.允许飞行 (flyable)

      用于判断是否处在可以使用飞行坐骑的地区。

    xvii.小队/团队队友(party/raid)

      判断目标是否是自己的小队或团队中的队友。

    xviii.在小队/团队中(group:party/raid)

      注意和前面的区别。这个用于判断玩家自己是否处在小队或团队中,并且团队包括小队。这对加状态很有用,比如:

      /cast [group, nomodifier] 奥术光辉; [help] [target=player] 奥术智慧

      如果在队伍中,施放奥数光辉;如果按下功能键或者不在队伍中则施放奥术智慧。

    6. 命令条件语的应用
      在第一部分中提到的很多命令,如果不配合条件语的使用,是没有什么价值的。而上述内容也只给出了一小部分的应用示例。作为本部分的压轴内容,下面两段将会把你带入一个更高的境界。

    i.设置焦点(focus)

      focus是一个单位标识符(参见《单位标识符》),就像target、player、raidpet1target一样。你可以将它设定为某一个单位,玩家或者NPC。比较简单的设置方法是通过按键设置。在按键设置中有两个选项:“焦点目标”和“目标焦点”。我不知道这是哪个脑残翻译的,其实际含义分别是“以目标为焦点”和“以焦点为目标”。当你设置了焦点以后,就可以用focus这个标识符了,也可以通过“目标焦点”绑定的按键把你设的focus作为你的当前目标。话说按键绑定也太小儿科了,下面来看看什么是职业玩家的focus用法。

      作为一个有控制技能的专业DPS,我们最常用的就是控场宏。我们可以预先把你的“被监护人”设为你的焦点,然后用这种宏来调教他——而此过程中并不用切换目标:

      /cast [target=focus] 变形术

      而作为一个灰常牛逼灰常娴熟的治疗,你可以把焦点设为你的主坦。另外还可以通过一些头像增强插件,比如FocusFrame来观察你焦点的状态。

      不过职业玩家一般不用按键绑定设置焦点,而是用/focus和/clearfocus宏命令来设置或清除焦点。/focus直接就可以达到按键绑定的效果了,而通过参数指定/focus的目标更是按键绑定所没有的功能:

      /focus party3target

      上面的只不过是教学示例,实际上职业玩家是这样用的:

      /focus [target=focus, noharm] [target=focus, dead] [modifier]

      /stopmacro [target=focus, noexists]

      /cast [target=focus] 变形术

      第一行先判断以下三个条件,如果满足任意一个,就把你的当前目标设为焦点(不要忘记,focus是/focus命令的特殊单位,参见[target=]条件语与命令参数):

       你的当前焦点不是敌对目标(如果焦点不存在该条件也成立)

       你的焦点已经死了

       某个功能键被按下了

      第二行判断你的焦点是否存在,如果不存在就终止宏的运行。这样控场是不是很方便?我们注意到这里用了/stopmacro命令,而不是在/cast命令中对焦点是否存在进行判断。这样的好处是我们可以在宏的最后加上更多的内容,比如一个小队喊话。

      下面这个宏也很有用,可以把你的目标和焦点互换:

      /cleartarget [target=target, dead]

      /clearfocus [target=focus, dead]

      /target focus

      /cleartarget [target=focus, noexists]

      /targetlasttarget

      /focus target

      /targetlasttarget

      前两行的作用是把死亡的目标和焦点清除掉。第四行的作用是防止你没有当前焦点,导致当前目标不变,以至于在第五行选择了你以前的一个目标。

    ii.用/click进行分支判定

      假如你想让一个按键根据不同的功能键施放不同的技能,并且根据左键右键选择不同的施放目标,那么我可以给你这样的一个例子:

      /cast [modifier:shift, button:1, target=party1] [modifier:shift, button:2, target=player] 强效治疗术; [modifier:ctrl, button:1, target=party1] [modifier:ctrl, button:2, target=player] 快速治疗; [nomodifier, button:1, target=party1] [nomodifier, button:2, target=player] 恢复

      哦……对不起,不大好看……而且貌似超过255个字符限制了。重新写一下:

      /cast [modifier:shift, button:1, target=party1] [modifier:shift, target=player] 强效治疗术

      /cast [modifier:ctrl, button:1, target=party1] [modifier:ctrl, target=player] 快速治疗

      /cast [target=player] 恢复

      不过如果我们写一个宏根据不同按键点击分别选择两个不同的宏,而把功能键状态的判断放到这两个宏中的话,条理就会更清晰了:

      主宏:

      /click MultiBarLeftButton2; MultiBarLeftButton3

      辅助宏1:

      /cast [mod:shift, target=party1] 强效治疗术; [mod:ctrl, target=party1] 快速治疗; [target=party1] 恢复

      辅助宏2:

      /cast [mod:shift, target=player] 强效治疗术; [mod:ctrl, target=palyer] 快速治疗; [target=player] 恢复

    编辑本段五、 附录

    1. 自定义图标
      如果想自定义宏的图标,可以把做好的图标放在游戏目录的“.\Interface\Icons”文件夹中(可能需要自己新建)。文件格式应该是界面材质规定的.BLP或24位无压缩的TGA文件。图片的长宽必须是2的自然数次幂,但不得超过512,比如可以是32×32、512×128等。注意:图片如果不是正方形,在界面显示中是会走形的……
    2. 宏的移植
      个人账户的角色通用设置都保存在游戏目录的“.\WTF\Account\账户名称”文件夹下,每个角色分别的数据则保存在“.\WTF\Account\账户名称\服务器名\角色名称”文件夹下,包括自定义的宏、按键设置、插件数据等,其中macros-cache.txt保存着宏的定义。
    3. 更多信息
      如果你有关于宏的疑问,并且在此找不到答案,可以看看这里:《Macro FAQ & Repository》,其中包含很多对于常见问题的解答和一些很好的例子。而且最好多看看(不过在中国访问的话很可能需要代理),可以获得很多东西,比如宏和脚本相关的文章,还有数据控喜欢的关于游戏算法的研究。
    4. 鸣谢
      首先要感谢的是Slouken,他在暴雪一直关注着我们的反馈,如果没有他对广大玩家建议的重视就没有今天的宏命令系统。

      还要感谢的是Iriel,Tem,Cladhaire等很多高手与大家分享知识。

      还要感谢论坛上那些一直为大家做出贡献的朋友,Neuro,Shirik,Jelly,Lunessa,Troodi,Lealla,Aella,Valaron等等,还有很多我不记得名字的朋友,感谢你们。

    转载于:https://www.cnblogs.com/andyfurong/archive/2010/12/21/1912897.html

    展开全文
  • Word 宏命令大全

    千次阅读 2016-12-09 15:02:00
    1、为宏命令指定快捷键。在WORD中,操作可以通过菜单项或工具栏按钮实现,如果功能项有对应的快捷键的话,利用快捷键可以快速实现我们需要的功能。如最常见的CTRL+O、CTRL+A等等。WORD已经为很多功能指定了快捷键...

     

    1、   为宏命令指定快捷键。
    WORD中,操作可以通过菜单项或工具栏按钮实现,如果功能项有对应的快捷键的话,利用快捷键可以快速实现我们需要的功能。如最常见的CTRLOCTRLA等等。WORD已经为很多功能指定了快捷键,可以大大提高WORD的操作速度,比用鼠标操作快捷很多。

    而我们自己编辑或者录制的宏,可以用菜单项操作完成,也可以为这些命令设置按钮,通过工具栏按钮操作,如果为这些常用的宏指定合适的快捷键,会为我们提供很大的便利。

    如何为功能项设置快捷键或修改功能项已有的快捷键,需要对 WORD进行自定义设置。
    WORD主界面中,点击工具菜单下的自定义菜单项, 自定义对话框中,点击键盘,如下图所示:


    2、   举例说明
    WORD打开状态下,按ALTF11,打开VBA编辑器,粘贴如下代码


    Sub 英文引号转中文双引号()
    '
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
    .Text = """"
    .Forward = True
    .Wrap = wdStop
    .MatchByte = True
    End With
    With Selection
    While .Find.Execute
    .Text = ChrW(8220)
    .Find.Execute
    .Text = ChrW(8221)
    Wend
    End With
    End Sub


    保存后,再打开自定义等命令可以出现下图:

    这时按你要指定的快捷键,一一般要跟CTRLALTSHIFT结合,可选取一个两个或者三个,再加上某一个字母。上例我为选定的宏指定的快捷键为ALT+",因为"'是在同一键上,实际操作是按三个键。如果目前指定到项为[未指定],选择是保存常规模板“NORMAL”还是本文档,点指定,然后关闭。每次按ALT+",就会执行这段VBA命令。

    3、   指定快捷键,尽量不要使用WORD已经使用的快捷键,如果一定使用,那么该快捷键将不再指定给原有的功能命令。指定的快捷键要方便记忆,要有一定的规律。
    4、如果对WORD默认为功能命令指定的快捷键或自己指定的快捷键不满意,可以进入自定义键盘对话框,在当前快捷键列表中,选中要删除的快捷键,此时删除按钮被激活,点击删除,指定的功能命令的快捷键就被删除了。

    也可为符号和样式指定快捷,这里不再多说了,下面就放几段宏命令。如有错误,务必指出。如有侵权,请告知,马上删除。

    常规设置下标的过程:输入,选定,设定下标,取消选定,设置非下标,继续输入。下面的命令设置光标前一个字符为下标,并继续输入时保持设置前的格式。后面的例子不再解释。
    Sub Macro1()
    '
    ' Macro1 Macro
    ' 设置光标前一个字符为下标,快捷键为"Alt+="
    '
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.Subscript = True
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.Font.Subscript = False
    End Sub

     

    Sub Macro9()
    '
    ' Macro9 Macro
    设置光标前一个字符为上标,快捷键为"Alt++"
    '
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.Superscript = True
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.Font.Superscript = False
    End Sub

    Sub Macro2()
    '
    ' Macro2 Macro
    设置光标前一个字符为斜体,快捷键为"Alt+I"
    '
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.Italic = True
    Selection.Font.NameOther = "Times New Roman"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.Font.Italic = False

    End Sub

    Sub Macro5()
    '
    ' Macro5 Macro
    调整中西文字符间距,快捷键为"Alt+J"
    '
    If Selection.ParagraphFormat.AddSpaceBetweenFarEastAndAlpha = False Then
    Selection.ParagraphFormat.AddSpaceBetweenFarEastAndAlpha = True
    Else
    Selection.ParagraphFormat.AddSpaceBetweenFarEastAndAlpha = False
    End If

    End Sub

    Sub Macro4()
    '
    ' Macro4 Macro
    设置光标前一个文字加着重号,快捷键为"Alt+."
    '
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.EmphasisMark = wdEmphasisMarkUnderSolidCircle
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.Font.EmphasisMark = wdEmphasisMarkNone
    End Sub

    Sub Macro10()
    '
    ' Macro10 Macro
    ' 调整中文和数字符间距,快捷键为"Alt+N"
    '
    If Selection.ParagraphFormat.AddSpaceBetweenFarEastAndDigit = False Then
    Selection.ParagraphFormat.AddSpaceBetweenFarEastAndDigit = True
    Else
    Selection.ParagraphFormat.AddSpaceBetweenFarEastAndDigit = False
    End If
    End Sub

    设置分式的宏命令:A为分子,B为分母,输入A,B(注意AB之间的逗号为英文逗号)。如果分子是ABC,分母是DG,输入ABC,DG按住SHIFT,按左方向键,选定刚才输入的字符,留3个不选,执行下面的命令。

    Sub 分式()
    '
    分式 Macro
    设置选定分数,快捷键为"Alt+F"
    '
    Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=wdExtend
    If Selection.Type = wdSelectionNormal Then
    'Selection.Font.Italic = True
    Selection.Cut
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
    PreserveFormatting:=False
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace
    Selection.TypeText Text:="eq \f()"
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.Paste
    'Selection.TypeText Text:=")"
    Selection.Fields.Update
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Else
    MsgBox "
    您没有选择文字。"
    End If
    '
    End Sub

    Sub ()
    '
     Macro
    设置选定的两个字母上加弧
    Selection.MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
    If Selection.Type = wdSelectionNormal Then
    Selection.Font.Italic = True
    Selection.Cut
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
    PreserveFormatting:=False
    Selection.Delete Unit:=wdCharacter, Count:=1
    Selection.TypeText Text:="eq \o(\s\up5(
    "
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.Scaling = 150
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.Font.Scaling = 100
    Selection.TypeText Text:="),\s\do0("
    Selection.Paste
    Selection.TypeText Text:="))"
    Selection.Fields.Update
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Else
    MsgBox "
    您没有选择文字。"
    End If
    '
    End Sub

    Sub Password()
    '
    文件自动添加密码。
    '
    If ActiveDocument.WriteReserved = False Then
    If MsgBox("
    是否为本文档添加密码?", vbYesNo) = vbYes Then With ActiveDocument
    .Password = "123456"
    .WritePassword = "123456"
    End With

    Else 
    End If
    Else
    End If
    End Sub

    Sub Example()
    '
    根据文档字符数中重复频率排序字符并计数
    '* +++++++++++++++++++++++++++++
    '* Created By SHOUROU@OfficeFans 2008-2-24 18:05:42
    '
    仅测试于System: Windows NT Word: 11.0 Language: 2052
    '№ 0334^The Code CopyIn [ThisDocument-ThisDocument]^'
    '* 
    ----------------------------- Dim myDictionary As Object, MyString As String
    Dim iCount As Long, i As Long, n As Long
    Dim ochar As String, TempA As Variant, st As Single
    Dim Array_Keys() As Variant, Array_Items() As Variant
    st = VBA.Timer
    Set myDictionary = CreateObject("Scripting.Dictionary")
    MyString = ActiveDocument.Content.Text
    n = Len(MyString) - 1
    For i = 1 To n
    ochar = VBA.Mid(MyString, i, 1)
    If myDictionary.Exists(ochar) = False Then
    myDictionary.Add ochar, 1
    Else
    myDictionary(ochar) = myDictionary(ochar) + 1
    End If
    Next
    MyString = ""
    iCount = myDictionary.Count - 1
    Array_Keys = myDictionary.keys
    Array_Items = myDictionary.Items
    Set myDictionary = Nothing
    For i = 0 To iCount - 1
    For n = i + 1 To iCount
    If Array_Items(i) < Array_Items(n) Then
    TempA = Array_Items(n)
    Array_Items(n) = Array_Items(i)
    Array_Items(i) = TempA
    TempA = Array_Keys(n)
    Array_Keys(n) = Array_Keys(i)
    Array_Keys(i) = TempA
    End If
    Next n
    Next i
    For i = 0 To iCount
    MyString = MyString & Array_Keys(i) & "
     " & Array_Items(i) & Chr(13)
    Next
    ActiveDocument.Content.Text = MyString
    MsgBox "
    共有" & iCount & "个不重复的字符,用时" & VBA.Format(Timer - st, "0.00") & ""
    End Sub

    Sub yy()
    '
    本代码旨在解决WORD中数据转化为千分位
    '数据限定要求:-922,337,203,685,477.5808  922,337,203,685,477.5807
    '
    转化结果1000以上数据以千分位计算,小数点右侧保留二位小数;1000以下数据不变
    Dim myRange As Range, i As Byte, myValue As Currency
    On Error Resume Next
    Application.ScreenUpdating = False '
    关闭屏幕更新
    NextFind: Set myRange = ActiveDocument.Content '定义为主文档文字部分
    With myRange.Find '查找
    .ClearFormatting '清除格式
    .Text = "[0-9]{4,15}" '415位数据
    .MatchWildcards = True '使用通配符
    Do While .Execute '每次查找成功
    i = 2 '起始值为2
    '
    如果是有小数点
    If myRange.Next(wdCharacter, 1) = "." Then
    '
    进行一个未知循环
    While myRange.Next(wdCharacter, i) Like "#"
    i = i + 1 '
    只要是[0-9]任意数字则累加
    Wend
    '
    重新定义RANGE对象
    myRange.SetRange myRange.Start, myRange.End + i - 1
    End If
    myValue = VBA.Val(myRange) '
    保险起见转换为数据,也可省略
    myRange = VBA.Format(myValue, "Standard") '转为千分位格式
    GoTo NextFind '转到指定行
    Loop
    End With
    Application.ScreenUpdating = True '
    恢复屏幕更新
    End Sub

    Sub setpicsize_1() '设置图片大小为当前的百分比
    Dim n '图片个数
    Dim picwidth
    Dim picheight
    If Selection.Type = wdSelectionNormal Then 
    On Error Resume Next '
    忽略错误
    For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes类型图片
    picheight = ActiveDocument.InlineShapes(n).Height
    picwidth = ActiveDocument.InlineShapes(n).Width
    ActiveDocument.InlineShapes(n).Height = picheight * 0.5 '
    设置高度
    ActiveDocument.InlineShapes(n).Width = picwidth * 0.5 '设置宽度
    Next n
    For n = 1 To ActiveDocument.Shapes.Count 'Shapes
    类型图片
    picheight = ActiveDocument.Shapes(n).Height
    picwidth = ActiveDocument.Shapes(n).Width
    ActiveDocument.Shapes(n).Height = picheight * 0.5 '
    设置高度倍数
    ActiveDocument.Shapes(n).Width = picwidth * 0.5 '设置宽度倍数
    Next n

    Else End If
    End Sub

    Sub setpicsize_2() '设置图片大小为固定值
    Dim n '图片个数
    On Error Resume Next '忽略错误
    For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes类型图片
    ActiveDocument.InlineShapes(n).Height = 400 '设置图片高度为 400px
    ActiveDocument.InlineShapes(n).Width = 300 '
    设置图片宽度 300px
    Next n
    For n = 1 To ActiveDocument.Shapes.Count 'Shapes
    类型图片
    ActiveDocument.Shapes(n).Height = 400 '设置图片高度为 400px
    ActiveDocument.Shapes(n).Width = 300 '
    设置图片宽度 300px
    Next n
    End Sub

    Sub 图片版式转换()
    '* 
    +++++++++++++++++++++++++++++
    '* Created By SHOUROU@ExcelHome 2007-12-11 5:28:26
    '
    仅测试于System: Windows NT Word: 11.0 Language: 2052
    '№ 0281^The Code CopyIn [ThisDocument-ThisDocument]^'
    '* 
    -----------------------------
    'Option Explicit Dim oShape As Variant, shapeType As WdWrapType
    On Error Resume Next
    If MsgBox("Y
    将图片由嵌入式转为浮动式,N将图片由浮动式转为嵌入式", 68) = 6 Then
    shapeType = Val(InputBox(Prompt:="
    请输入图片版式:0=四周型,1=紧密型, " & vbLf & _
    "3=
    衬于文字下方,4=浮于文字上方", Default:=0))
    For Each oShape In ActiveDocument.InlineShapes
    Set oShape = oShape.ConvertToShape
    With oShape
    Select Case shapeType
    Case 0, 1
    .WrapFormat.Type = shapeType
    Case 3
    .WrapFormat.Type = 3
    .ZOrder 5
    Case 4
    .WrapFormat.Type = 3
    .ZOrder 4
    Case Else
    Exit Sub
    End Select
    .WrapFormat.AllowOverlap = False '
    不允许重叠
    End With
    Next
    Else
    For Each oShape In ActiveDocument.Shapes
    oShape.ConvertToInlineShape
    Next
    End If
    End Sub

    Sub GetChineseNum2()
    '
    把数字转化为汉字大写人民币
    Dim Numeric As Currency, IntPart As Long, DecimalPart As Byte, MyField As Field, Label As String
    Dim Jiao As Byte, Fen As Byte, Oddment As String, Odd As String, MyChinese As String
    Dim strNumber As String
    Const ZWDX As String = "
    壹贰叁肆伍陆柒捌玖零" '定义一个中文大写汉字常量
    On Error Resume Next '错误忽略
    If Selection.Type = wdSelectionNormal Then

    With Selection
    strNumber = VBA.Replace(.Text, " ", "")
    Numeric = VBA.Round(VBA.CCur(strNumber), 2) '
    四舍五入保留小数点后两位
    '判断是否在表格中
    If .Information(wdWithInTable) Then _
    .MoveRight Unit:=wdCell Else .MoveRight Unit:=wdCharacter
    '
    对数据进行判断,是否在指定的范围内
    If VBA.Abs(Numeric) > 2147483647 Then MsgBox "数值超过范围!", _
    vbOKOnly + vbExclamation, "Warning": Exit Sub
    IntPart = Int(VBA.Abs(Numeric)) '
    定义一个正整数
    Odd = VBA.IIf(IntPart = 0, "", "") '定义一个STRING变量
    '插入中文大写前的标签
    Label = VBA.IIf(Numeric = VBA.Abs(Numeric), "人民币金额大写: ", "人民币金额大写: 负")
    '
    对小数点后面二位数进行择定
    DecimalPart = (VBA.Abs(Numeric) - IntPart) * 100
    Select Case DecimalPart
    Case Is = 0 '
    如果是0,即是选定的数据为整数
    Oddment = VBA.IIf(Odd = "", "", Odd & "")
    Case Is < 10 '<10,
    即是零头是分
    Oddment = VBA.IIf(Odd <> "", "圆零" & VBA.Mid(ZWDX, DecimalPart, 1) & "", _
    VBA.Mid(ZWDX, DecimalPart, 1) & "
    ")
    Case 10, 20, 30, 40, 50, 60, 70, 80, 90 '
    如果是角整
    Oddment = "" & VBA.Mid(ZWDX, DecimalPart / 10, 1) & "角整"
    Case Else '
    既有角,又有分的情况
    Jiao = VBA.Left(CStr(DecimalPart), 1) '取得角面值
    Fen = VBA.Right(CStr(DecimalPart), 1) '取得分面值
    Oddment = Odd & VBA.Mid(ZWDX, Jiao, 1) & "" '转换为角的中文大写
    Oddment = Oddment & VBA.Mid(ZWDX, Fen, 1) & "" '转换为分的中文大写
    End Select
    '
    指定区域插入中文大写格式的域
    Set MyField = .Fields.Add(Range:=.Range, Text:="= " & IntPart & " \*CHINESENUM2")
    MyField.Select '
    选定域(最后是用指定文本覆盖选定区域)
    '
    如果仅有角分情况下,Mychinese""
    MyChinese = VBA.IIf(MyField.Result <> "
    ", MyField.Result, "")
    .Text = Label & MyChinese & Oddment
    End With
    Else
    MsgBox "
    您没有选择数字。"
    End If End Sub

    Sub ToggleInterpunction() '中英文标点互换
    Dim ChineseInterpunction() As Variant, EnglishInterpunction() As Variant
    Dim myArray1() As Variant, myArray2() As Variant, strFind As String, strRep As String
    Dim msgResult As VbMsgBoxResult, n As Byte
    '
    定义一个中文标点的数组对象
    ChineseInterpunction = Array("", "", "", "", "", "", "", "……", "—", "", "", "", "", "")
    '
    定义一个英文标点的数组对象
    EnglishInterpunction = Array(",", ".", ",", ";", ":", "?", "!", "…", "-", "~", "(", ")", "&lt;", "&gt;")
    '
    提示用户交互的MSGBOX对话框
    msgResult = MsgBox("您想中英标点互换吗?Y将中文标点转为英文标点,N将英文标点转为中文标点!", vbYesNoCancel)
    Select Case msgResult
    Case vbCancel
    Exit Sub '
    如果用户选择了取消按钮,则退出程序运行
    Case vbYes '如果用户选择了YES,则将中文标点转换为英文标点
    myArray1 = ChineseInterpunction
    myArray2 = EnglishInterpunction
    strFind = "“(*)”"
    strRep = """\1"""
    Case vbNo '
    如果用户选择了NO,则将英文标点转换为中文标点
    myArray1 = EnglishInterpunction
    myArray2 = ChineseInterpunction
    strFind = """(*)"""
    strRep = "“\1”"
    End Select
    Application.ScreenUpdating = False '
    关闭屏幕更新
    For n = 0 To UBound(ChineseInterpunction) '从数组的下标到上标间作一个循环
    With ActiveDocument.Content.Find
    .ClearFormatting '
    不限定查找格式
    .MatchWildcards = False '不使用通配符
    '查找相应的英文标点,替换为对应的中文标点
    .Execute findtext:=myArray1(n), replacewith:=myArray2(n), Replace:=wdReplaceAll
    End With
    Next
    With ActiveDocument.Content.Find
    .ClearFormatting '
    不限定查找格式
    .MatchWildcards = True '使用通配符
    .Execute findtext:=strFind, replacewith:=strRep, Replace:=wdReplaceAll
    End With
    Application.ScreenUpdating = True '
    恢复屏幕更新
    End Sub

    Sub 图片版式转换()
    '* 
    +++++++++++++++++++++++++++++
    '* Created By SHOUROU@ExcelHome 2007-12-11 5:28:26
    '
    仅测试于System: Windows NT Word: 11.0 Language: 2052
    '№ 0281^The Code CopyIn [ThisDocument-ThisDocument]^'
    '* 
    -----------------------------
    'Option Explicit Dim oShape As Variant, shapeType As WdWrapType
    On Error Resume Next
    If MsgBox("Y
    将图片由嵌入式转为浮动式,N将图片由浮动式转为嵌入式", 68) = 6 Then
    shapeType = Val(InputBox(Prompt:="
    请输入图片版式:0=四周型,1=紧密型, " & vbLf & _
    "3=
    衬于文字下方,4=浮于文字上方", Default:=0))
    For Each oShape In ActiveDocument.InlineShapes
    Set oShape = oShape.ConvertToShape
    With oShape
    Select Case shapeType
    Case 0, 1
    .WrapFormat.Type = shapeType
    Case 3
    .WrapFormat.Type = 3
    .ZOrder 5
    Case 4
    .WrapFormat.Type = 3
    .ZOrder 4
    Case Else
    Exit Sub
    End Select
    .WrapFormat.AllowOverlap = False '
    不允许重叠
    End With
    Next
    Else
    For Each oShape In ActiveDocument.Shapes
    oShape.ConvertToInlineShape
    Next
    End If
    End Sub

    Sub 设置图片大小为原始大小()
    Dim n '
    图片个数
    Dim picwidth
    Dim picheight
    On Error Resume Next '
    忽略错误
    For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes类型图片
    ActiveDocument.InlineShapes(n).Reset
    Next n
    For n = 1 To ActiveDocument.Shapes.Count 'Shapes
    类型图片
    ActiveDocument.Shapes(n).Select
    Selection.ShapeRange.ScaleHeight 1#, msoTrue, msoScaleFromTopClientHeigh
    Selection.ShapeRange.ScaleWidth 1#, msoTrue, msoScaleFromTopClientwidth
    Next n
    End Sub

    下面的代码可以代替16楼的,操作更方便
    ========================

    Sub setpicsize_1() '设置图片大小为当前的百分比
    Dim n '图片个数
    Dim beilv
    Dim picwidth
    Dim picheight
    On Error Resume Next '
    忽略错误 ' If MsgBox("确定要改变文档中图片大小?", 68) = 6 Then
    beilv = Val(InputBox(Prompt:="
      请输入数字,然后按确定,文档中所有图形、图片和文本框的大小将按输入的数字以相同的宽高比缩放。 " & vbLf & vbLf & _
    "
      退出按取消", Default:=0.8))
    For n = 1 To ActiveDocument.InlineShapes.Count 'InlineShapes
    类型图片
    picheight = ActiveDocument.InlineShapes(n).Height
    picwidth = ActiveDocument.InlineShapes(n).Width
    ActiveDocument.InlineShapes(n).Height = picheight * beilv '
    设置高度倍数
    ActiveDocument.InlineShapes(n).Width = picwidth * beilv '设置宽度倍数
    Next n
    For n = 1 To ActiveDocument.Shapes.Count 'Shapes
    类型图片
    picheight = ActiveDocument.Shapes(n).Height
    picwidth = ActiveDocument.Shapes(n).Width
    ActiveDocument.Shapes(n).Height = picheight * beilv '
    设置高度倍数
    ActiveDocument.Shapes(n).Width = picwidth * beilv '设置宽度倍数
    Next n
    ' Else
    ' End If
    End Sub

    Sub mySaveAs()
    '

    Dim i As Long, st As Single, mypath As String, fs As FileSearch
    Dim myDoc As Document, n As Integer
    Dim strpara1 As String, strpara2 As String, docname As String, a

    On Error GoTo hd
    With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "
    请选定任一文件,确定后将重命名全部WORD文档"
    If .Show <> -1 Then Exit Sub
    st = Timer
    mypath = .InitialFileName
    End With

    Application.ScreenUpdating = False
    If Dir(mypath & "
    另存为", vbDirectory) = "" Then MkDir mypath & "另存为" '另存为文档的保存位置
    Set fs = Application.FileSearch
    With fs
    .NewSearch
    .LookIn = mypath
    .FileType = msoFileTypeWordDocuments
    If .Execute(msoSortByFileName) > 0 Then
    For i = 1 To .FoundFiles.Count
    If InStr(fs.FoundFiles(i), "~$") = 0 Then
    Set myDoc = Documents.Open(.FoundFiles(i), Visible:=False)
    With myDoc
    strpara1 = Replace(.Paragraphs(1).Range.Text, Chr(13), "")
    strpara1 = Left(strpara1, 10)
    strpara2 = Replace(.Paragraphs(2).Range.Text, Chr(13), "")
    If Len(strpara1) < 2 Or Len(strpara2) < 2 Then GoTo hd
    docname = strpara1 & "_" & strpara2
    docname = CleanString(docname)
    For Each a In Array("\", "/", ":", "*", "?", """ ", "<", " >", "|")
    docname = Replace(docname, a, "")
    Next
    .SaveAs mypath & "
    另存为\" & docname & ".doc"
    n = n + 1
    .Close
    End With
    End If
    Next
    End If
    End With
    MsgBox "
    共处理了" & fs.FoundFiles.Count & "个文档,保存于目标文件夹的名称为另存为的下一级文件夹中。" _
    & vbCrLf & "
    处理时间:" & Format(Timer - st, "0") & "秒。"
    Application.ScreenUpdating = True
    Exit Sub

    hd:
    MsgBox "
    运行出现意外,程序终止!" & vbCrLf & "已处理文档数:" & n _
    & vbCrLf & "
    出错文档:" & vbCrLf & fs.FoundFiles(i)
    If Not myDoc Is Nothing Then myDoc.Close
    End Sub

    这段代码是我请 @sylun 为我编写的,很好用。 
    这段代码可以不打开文档提取指定文件夹的WORD文档的中的第1段的前10个字符和第2段落的文字作为并被提取文档的另存为文件的文件名,如果想修改提取的文字内容,可修改

    strpara1 = Replace(.Paragraphs(1).Range.Text, Chr(13), "")
    strpara1 = Left(strpara1, 10)
    strpara2 = Replace(.Paragraphs(2).Range.Text, Chr(13), "")

    这三行。前两行是提取第一段的前10字符,后一行是提取第二段的内容。如果文档标题是第一段,第二段是作者,把strpsra1Left(strpara1, 10)一行删除,如果没有标题,第一段是一大段内容,把strpara2一行删除。

    转载于:https://www.cnblogs.com/jiaotashidi/p/6149569.html

    展开全文
  • Cisco IOS 宏命令

    千次阅读 2013-09-04 08:33:48
    批处理和宏是一个比较普遍的方法,能为网络工程师的日常工作提高极大效率,而Cisco IOS中也包含了宏命令,能对设备进行批量处理。   路由器上的宏命令 在思科路由器中可以使用TCL脚本语言来编辑脚本实现宏...
    众所周知,在网络工程师的日常工作中,可能需要管理的网络设备(交换机、路由器、防火墙、AP等)会上百台甚至上千台,这个时候如何有效率地进行管控和处理日常事务就显得非常必要了。批处理和宏是一个比较普遍的方法,能为网络工程师的日常工作提高极大效率,而Cisco IOS中也包含了宏命令,能对设备进行批量处理。

     

    路由器上的宏命令

    在思科路由器中可以使用TCL脚本语言来编辑脚本实现宏管控的目的,同时高端型号的交换机(6509系列等)也能提供TCL脚本环境。
    ?
    1
    2
    Router#tclsh                       进入TCL脚本编译环境
    Router(tcl)tclquit              退出TCL脚本编译环境
    TCL脚本编译之后不会出现在配置文件中。

    首先在记事本编辑TCL脚本语言:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach TEST {
    192.168.1.1
    192.168.1.2
    192.168.1.3
    192.168.1.4
    192.168.1.5
    192.168.1.6
    192.168.1.7
    192.168.1.8
    192.168.1.9
    192.168.1.10
    } { puts [exec "ping $TEST"] }
    能通过循环语句一次Ping上面的IP地址,直到最后一个IP地址。
    然后在路由器中运行:
    ?
    1
    2
    3
    Router>enable
    Router#tclsh
    Router(tcl)# 粘贴上述TCL脚本语言
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.1, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 1/2/4 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 56/58/60 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.3, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 84/86/89 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.4, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 140/147/164 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.5, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 140/142/144 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.6, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 56/59/65 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.7, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 1/2/4 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.8, timeout is 2 seconds:
    …..
    Success rate is 0 percent (0/5)
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.9, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 1/2/4 ms
    Type escape sequence to abort.
    Sending 5, 100‐byte ICMP Echos to 192.168.1.10, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round‐trip min/avg/max = 56/57/60 ms
    这样就可以通过一条命令来简单测试全网的连通性了,而不需要繁琐地一个一个PING命令打!

    交换机上的宏命令

    交换机IOS上同样存在宏命令,不过略显不同。交换机使用macro命令来实现定义宏命令,该宏命令可以保存到配置文件中。
    定义交换机宏命令:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    macro name TEST
    do ping 192.168.255.1
    do ping 192.168.255.2
    do ping 192.168.255.3
    do ping 192.168.255.4
    do ping 192.168.255.5
    do ping 192.168.255.6
    do ping 192.168.255.7
    do ping 192.168.255.8
    do ping 192.168.255.9
    do ping 192.168.255.10
    @
    实施调用:
    ?
    1
    Switch(config)#macro global apply TEST
    即可以实施逐个ping以上地址的效果了。
    另外思科交换机中默认已经定义了一些macro宏命令,例如cisco-desktop. cisco-phone. cisco-switch. cisco-router等。
    展开全文
  • 而在Unity项目中,条件编译符号需要在Unity Editor编辑器中添加。 为什么要用条件编译 Unity中最常见的使用条件编译的情况就是分平台编译不同的代码片段。由于Unity是跨平台的,不同平台有不同的特性,我们经常能...
  • excel 永久保存宏命令

    千次阅读 2018-05-31 10:41:00
    excel 永久保存宏命令 CreateTime--2018年5月31日10:03:44 Author:Marydon 情形一:下次编辑excel时,仍可使用  Ctrl+s--&gt;选择否,选择保存类型为"Excel 启用宏的工作薄(*.xlsm)"--&gt;...
  • MobaXterm 宏命令

    千次阅读 2019-11-15 16:26:32
    MobaXterm宏命令 [Macros] set server= set serverip=12:0:0:set serverip 10.117.197.23|258:13:1835009:RETURN|0:0:0:SLEEPEQUAL1200| set serverip (1)= set ipaddr=12:0:0:set ipaddr 10.117.197.11|258:13:...
  • unity提供的宏命令在开发中可以非常方便的对不同的代码进行区分,例如UNITY_EDITOR 就可以定义代码只在编辑器里运行,这样就可以在下面写一些编辑器专用的代码,而不用担心打包Android或者IOS包的时候会出问题。...
  • UltraEdit的宏命令

    千次阅读 2005-11-17 16:21:00
    UltraEdit的宏命令The Edit Macro command allows a new macro to be created and edited or an existing macro that has previously been generated with this command or with the Macro Record command to be ...
  • VS Code 宏命令实现行尾加分号

    千次阅读 2018-05-10 15:01:04
    VS Code 宏命令实现行尾加分号 在从 Sublime 转到使用 Visual Studio Code 的时候,感觉到 VSCode 的强大,但是在 Sublime 中一直喜欢用 Alt + ; 实现末尾加分号、Alt + Shift + ; 实现末尾加冒号等,但是 VSCode...
  • 为 Source Insight 添加宏命令

    千次阅读 2012-09-11 20:27:58
    用Source Insight阅读代码过程中,有时需要添加注释,但是Source Insight中没有这样的快捷键,在这里我以此为例,演示怎么创建一个宏命令: 1.编辑Source Insight程序目录下的utils.em文件(软件自带的一些宏程序...
  • 宏命令完全指南》8.0最新修改篇

    千次阅读 2019-04-03 12:34:46
    本文主要参考的《Cogwheel's Complete Macro Guide》,由于找不到原文,所以实际参考链接是《考格威尔(Cogwheel's)宏命令完全指南》。后来又发现了可能的真正原文来自wowwiki的这篇《Making a macro》。。。 基于...
  • World中利用宏命令批量删除页眉和页脚 某些world资料中有很多页眉页脚,真让人头疼…于是有了这个… 百度搜的宏处理代码来自 : https://jingyan.baidu.com/article/75ab0bcbf91d7297864db2ef.html 能看懂个大概,哈哈...
  • office2013如何开启宏命令word or excel

    千次阅读 2018-05-23 22:11:52
    以2013为例:第一步:选项第二步:自定义功能区-开发工具第三步:建立模块第四步:F5运行,F9的话可以设置断点调试。
  • Outlook 宏命令提醒插入附件

    千次阅读 2014-12-26 14:57:54
    1、在Outlook里面键入ALT+F11打开VBA编辑器; 2、键入CTRL+R激活左边的那个工程面板,展开并双击上面的“Project (VbaProject.OTM)\Microsoft Office Outlook 对象\ThisOutlookSession”; 3、将下面的代码粘贴到...
  • CATIA宏命令的简单运用

    千次阅读 2011-11-12 12:18:57
    macro是CATIA中一个强大的功能在这里我只能简单...1.工具————启动录制——开始录制, W8 e, m5 }+ [: n8 t# t 2.根据自己需要,创建草图(也可是实体,为了方便这里就用草图,以后大家可以自己拓展练习)' M...
  • Excel表格宏命令教学一:VBA入门

    千次阅读 2019-11-21 13:46:26
    宏命令就是指VBA,VBA就是宏命令 。 1.2 如何使用Excel执行宏命令(VBA)? 两种,比较简单的一种是直接在编辑栏输入公式,另外一种是打开VBA编辑器写代码。 两种方式优缺点: 编辑栏方式: 优点 :适合...
  • 在VS2010写自己业余项目的时候使用自定义的Snippet添加注释的时候发现不能自动匹配时间,如果每次都自己改时间实在浪费时间~搜索后发现只有使用宏才能动态生成时间~参考: ...双击打开宏命令编辑器,添加
  • 1 工具--,打开窗口  2 鼠标单击任意将其选中,点击选项,即可修改或为他增加快捷键。 ... 3 注意,你直接在Visual Basci编辑器里面改是不行的,因为加了'的只是注释而已
  • OneNote使用技巧???? - 7.Onestatic插件使用 在本文,我整理了一些OneNote的使用经验,...3. 合并两个编辑框、拆分编辑框 4. 页面等级设置 5. 快速设置首行缩进 6. 插入格式化程序代码 7.Onestatic使用 7. One...
  • 而其自带的宏命令更是能简化一些数据处理中重复性的工作。一次笔者要把一批资料的纸张大小由B4纸调整为A4纸,并在打印时缩放成一页(即一页宽,一页高)。由于资料都是由单独工作簙构成的,对于每一个明细资料,都...
  • 问题: 解决: ①“视图” - “取消隐藏” ...②取消隐藏第一个工作簿(PERSONAL.XLSB) ...③会弹出一个空白文档,不用管(后面可以直接关掉,也可以...④这个时候直接返回原来的文档,就可以编辑宏了 完毕。 ...
  • @x 播放记录在x寄存器中的宏命令 稍微解释一下,当在normal模式下输入:qx后,你对文本的所有编辑动作将会被记录下来,再次输入q即退出了记录模 式,然后输入@x对刚才记录下来的命令进行重复,此命令后可跟数字,表示...
  • vim编辑器常用命令

    2015-07-15 23:00:20
    @x 播放记录在x寄存器中的宏命令 稍微解释一下,当在normal模式下输入:qx后,你对文本的所有编辑动作将会被记录下来,再次输入q即退出了记录模 式,然后输入@x对刚才记录下来的命令进行重复,此命令后可跟数字,
  • 点击【视图】。 在【窗口】中点击【取消隐藏】后,可正常编辑
  • 2020-12-24 09:04:47
    (英语:Macro)是一种批量处理的称谓。...绝大多数情况下,“”这个词的使用暗示着将小命令或动作转化为一系列指令。 的特点:批量批处理的称谓 的用途:自动化频繁使用的序列 介绍 就是.
  • 快速编辑excel 快捷键

    千次阅读 2016-08-09 10:17:40
    打开excel 的模块快捷键 Alt + F11

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,249
精华内容 19,699
关键字:

如何编辑宏命令