Notepad ++中的宏可以包含击键吗?

时间:2016-03-08 04:44:06

标签: regex macros notepad++

如果我尝试在文本文件中创建一个列并使用在文本文件的特定区域中找到的相同值填充该列,我可以使用正则表达式查找/替换以成功执行此操作。由于该列最右边,我找到\r并替换为,VALUE,\r,其中VALUE粘贴在上一个副本中( CTRL - C )命令。问题是我无法将其作为其他文件上的宏工作,因为它记录了 CTRL - V 的值而不是keystroke命令< KBD> CTRL - V 。有没有办法让宏模拟 CTRL - V 而不是填写特定值?

添加信息: 文件中的每一行都需要粘贴的值。原因是因为每一行都包含产品编号和数量。通过能够粘贴其中一个标题中找到的值,我可以将这些行链接到粘贴值表示的顺序。因此,一个表将包含订单号,日期等,而另一个表将包含订单的详细信息,即项目。

这是一个示例文件:

ITEMNAME,ITEMID,QTY STORE#578 PO 0076875422 04-01-2014,SHIPPED
蓝鱼,98799,3
红鱼,48573,10
YELLOW SNAIL,94582,2
GREEN LIZARD-MEDIUM,32451,12
黑色TARANTULA,29879,909

在notepad ++中运行脚本后,此文件将如下所示:
ITEMNAME,ITEMID,QTY STORE#578 PO 0076875422 04-01-2014,SHIPPED,ORDER_NUMBER 蓝鱼,98799,3,,0076875422
红鱼,48573,10,0076875422
YELLOW SNAIL,94582,2,0076875422
GREEN LIZARD-MEDIUM,32451,12,,0076875422
BLACK TARANTULA,29879,909,,0076875422

包含QTY的标题包含其他数据:商店数量,订单数量和订单日期。订单号始终以&#34; PO&#34;开头。它总是10位数。宏需要能够在每个文件中找到它,然后将其添加到每行的末尾,但是需要在逗号前面加上允许SHIPPED列中的空值。当然,您还会注意到标题行已添加到名为ORDER_NUMBER的标题行中。

我遇到的问题是能够将订单号的值粘贴到当前宏中每行b / c的末尾,它只能粘贴记录时粘贴的值,而不是当前正在处理的文件中的实际采购订单编号。所以我想,如果我告诉宏在标题行中找到PO编号并将其复制到剪贴板后,我能以某种方式记录CTRL-V键击,那么它就能工作。

3 个答案:

答案 0 :(得分:1)

这是承诺的NppExec脚本。将其保存到脚本名称,然后您可以使用菜单项目名称将其添加到NppExec菜单中(在插件 - &gt; NppExec - &gt;高级选项关联中) 脚本名称项目名称),重新启动记事本++后,您将在快捷方式映射器中的某处找到此项目名称(在插件选项卡下)并且您可以为其指定键盘快捷键。

npp_exec脚本

// http://www.scintilla.org/ScintillaDoc.html
// http://docs.notepad-plus-plus.org/index.php/Moving_And_Selecting_Around

NPP_CONSOLE OFF

// 1. retrieve to PO:
  // 1.1 set the first line as target for the search
  SCI_SENDMSG SCI_DOCUMENTSTART
  SCI_SENDMSG SCI_LINEDOWN

  SCI_SENDMSG SCI_GETCURRENTPOS
  set Line1End ~ $(MSG_RESULT) -1

  // 1.2 do a RE search for the PO and retrieve the value for later reuse
  // set the range for the RE search to the first line
  SCI_SENDMSG SCI_SETTARGETSTART 0
  SCI_SENDMSG SCI_SETTARGETEND $(Line1End)

  SCI_SENDMSG SCI_SETSEARCHFLAGS SCFIND_REGEXP
  SCI_SENDMSG SCI_SEARCHINTARGET 11 "PO (\d{10})"
  set POPos=$(MSG_RESULT)

  if $(POPos) == -1 goto NOTFOUND

  // 1.3 get the PO Text:
  SCI_SENDMSG SCI_GETTAG 1 @""
  set POText=$(MSG_LPARAM)

  // 2 append ",ORDER_NUMBER" to first line
  SCI_SENDMSG SCI_DOCUMENTSTART
  SCI_SENDMSG SCI_LINEEND
  SCI_SENDMSG SCI_INSERTTEXT -1 @",ORDER_NUMBER"

  // 3 append POText to every other line
  SCI_SENDMSG SCI_LINEDOWN
  :REPEAT
    // 3.1 append ",POText" to line
    SCI_SENDMSG SCI_LINEEND
    SCI_SENDMSG SCI_INSERTTEXT -1 @",$(POText)"

    // 3.2 as long as we have not reached the last line: loop  
    SCI_SENDMSG SCI_LINEEND
    SCI_SENDMSG SCI_GETCURRENTPOS
    set pos1 = $(MSG_RESULT) 

    SCI_SENDMSG SCI_LINEDOWN
    SCI_SENDMSG SCI_GETCURRENTPOS
    set pos2 = $(MSG_RESULT) 

    // if the linedown doesnot give another pos, we have reached the end
    if $(pos1) == $(pos2) goto END
    // else loop
    if 1==1 goto REPEAT

  :NOTFOUND
    NPP_CONSOLE ON
    echo "There is no PO in the first line!"

  :END

它主要使用NppExec的SCI_SENDMSG命令来远程控制编辑器。消息的文档位于第一行的链接中。但也存在大量的反复试验。

答案 1 :(得分:1)

以下假设每个文件中只有一个采购订单编号 并且应该在Notepad ++版本6.4.3以后工作:

说明

1) Define a  macro `Save PO #` that  
    a) Finds and saves the PO # to the clipboard  
    b) Advances to the start of the following line  

2) Define a macro `Add PO #` that  
    a) Adds a comma to the end of a line then pastes the clipboard  
    b) Advances to the next line  

3) For each file  
    a) Run macro `Save PO #`  
    b) Run macro `Add PO #` to `end of file`  

方法

1)Start recording
    Ctrl+Home
    Find找到:PO
    Find Next Alt+F4
    Right Edit Begin/End Select
    Find找到:
    Find Next Alt+F4
    Left Edit Begin/End Select Ctrl+C End Right
    Stop recording
    Save current recorded macro姓名:Save PO # OK

2)Start recording     End , Ctrl+V Right
    Stop recording
    Save current recorded macro姓名:Add PO # OK

3)打开文件进行编辑     Macro Save PO #
    Run a Macro Multiple Times
    要运行的宏:Add PO # Run until end of file Run

答案 2 :(得分:0)

由于NPPExec脚本太慢,这是另一个纯Notepad ++解决方案:

正则表达式查找/替换如下:

  • 打开替换对话框
  • 查找内容: (PO (\d{10})[^\r\n]+\R(.*\2\R)*+)([^\r\n]+)(\R)
  • 替换为: \1\4,\2\5
  • 检查正则表达式
  • 点击替换或全部替换
  • 继续单击全部替换(或按住ALT-A)直到不再进行更换(查找对话框的状态栏会告诉您)
  • 手动将,ORDER_NUMBER附加到第一行

一个先决条件是最后一行在其末尾有一个换行符,这意味着您必须在最后一行手动添加缺少的换行符,或者您需要手动插入PO。