Autohotkey增加/减少所选文本中的最后一个数字

时间:2017-03-20 11:40:21

标签: regex autohotkey

我正在尝试创建一个有用的系统来自动增加所选文本中的数字。例如,当我在Zbrush中使用名为“Example_character012”的项目时,我有一个包含23个文件的文件夹,从“Example_character012_prj_01.zpr”“Example_character012_prj_23.zpr” “。当我需要保存下一次迭代时,我按下“ctrl + s”,然后在最后一个工作目录中打开常规保存屏幕并预选文件名文本,在这种情况下它将是“Example_character012_prj_23.zpr” 。我需要复制此文本,选择最后一个数字(23)将其增加一个,然后将所有文本返回到文本字段。在这种情况下,它将是“Example_character012_prj_24.zpr”。 这种脚本在各种场景中都非常有用,主要是保存在不同的程序中。 我试图自己做出来并提出这个:

^!Numpad1::
      Sleep 100
      Send ^c
      Sleep 10
      RegExMatch(clipboard,"(\d+)(?!.*\d)",Number)
      NewNumber:=Number1+1
      OldNumber:=NewNumber-1
      Clipboard:=RegExReplace(clipboard, OldNumber, NewNumber)
      Sleep 10
      Send ^v
      Sleep 10
      Send +{Home}

Return

^!Numpad0::
      Sleep 100
      Send ^c
      Sleep 10
      RegExMatch(clipboard,"(\d+)(?!.*\d)",Number)
      NewNumber:=Number1-1
      OldNumber:=NewNumber+1
      Clipboard:=RegExReplace(clipboard, OldNumber, NewNumber)
      Sleep 10
      Send ^v
      Sleep 10
      Send +{Home}

Return

Ctrl + alt + Num1用于增加,Ctrl + alt + Num0用于减少。 在最简单的场景中它可以正常工作,但是有一些我无法解决的重大问题:

  1. 它仅适用于英文键盘布局。当我在俄语布局中使用它时 - 它将“cv”放入而不是粘贴(如果我之后手动粘贴它会放入正确的文本)
  2. 有时它不仅会增加最后一个数字“Example_character012_prj_01.zpr”更改为“Example_character022_prj_02.zpr”而不是“Example_character012_prj_02.zpr”
  3. Zeros工作不正确“Example_prj_09.zpr”更改为“Example_prj_010.zpr”而不是“Example_prj_10.zpr”
  4. 粘贴后,选择整行而不是仅粘贴的内容
  5. 如果可能,那么在不影响剪贴板的情况下使它工作会很棒。
  6. 有些像“ctrl”这样的按键只是因为某种原因被手动点击才会卡住。
  7. 编辑: 在Autohotkey论坛上获得了一些帮助,下面是当前版本的脚本。只留下问题4和5。

    ^!Numpad1::
    ^!Numpad0::
          Sleep 50
          Send {Ctrl up}^{Ins}
          Sleep 10
          RegExMatch(Clipboard, "^(.*)(?=_)_(\d+)(\....)$", Match)
          Len := StrLen(Match2)
          if InStr(A_ThisHotkey, 1)
                Match2++
          else
                Match2--
          if (StrLen(Match2) < Len)
                Match2 := Format("{:0" Len "}", Match2)
          Clipboard := Match1 "_" Match2 Match3
          Sleep 10
          Send +{Ins}
          Sleep 10
          Send +{Home}
    Return
    

1 个答案:

答案 0 :(得分:0)

你的CTRL键行为不端的原因可能是因为:

如果你有像

这样的热键
int * pt = 0;

pt = new int;
*pt = 12;

delete pt;
pt=0;

if (pt==0) {
   // the pointer doesn't point to anything, and we can test it safely
}

/* ... */

if (pt!=0) {
    delete pt; //this second delete wont occur if pt is null (==0)
    pt=0;
}

当您按下CTRL + F12时实际发生的是AHK释放CTRL,发送a,然后重新点击CTRL。

这可能会变得更复杂,例如在你的场景中。

尝试使用^F12:: Send {a} Send命令前缀{Blind}来阻止此行为。

这可能也可能不起作用(即如果热键是shift + ctrl +但是热键发送ctrl + v,那么实际上会发送的是ctrl + shift + v)但是如果它仍然有效,它< em>可能让CTRL开始表现得更多。