【问题标题】:SAS - Error calling macro from hotkey (Open CWD from within SAS)SAS - 从热键调用宏时出错(从 SAS 中打开 CWD)
【发布时间】:2017-08-23 19:57:47
【问题描述】:

我厌倦了手动导航到当前工作文件夹,并想在 SAS 中创建一个热键来让我到达那里。我设计了一个命令来从 SAS 中打开当前文件夹。但是,我无法通过热键执行它。

我已创建 (stolen) 宏:

%macro GetPwd();
  %qsubstr(
      %sysget(SAS_EXECFILEPATH)
    , 1
    , %length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))
  )
%mend;

我已将上述内容保存为 GetPwd.sas 在我的自动调用库中。

在交互模式下,我可以使用以下命令打开 Windows 资源管理器到当前 SAS 工作文件夹:

/*The Call:*/
%sysexec(start explorer.exe "%GetPwd()" && exit);

当我将上述调用放在KEYS 菜单中时,问题就出现了。

当我通过热键 (SHF F9) 发出呼叫时,Windows 资源管理器打开到“计算机”,我在 SAS 中收到以下错误:

WARNING: Argument 2 to macro function %QSUBSTR is out of range.
WARNING: Argument 3 to macro function %QSUBSTR is out of range.

为什么从热键发出调用时会出现此错误,而通过编辑器提交时不会出现此错误?


我已经成功完成了使用以下方法打开 SAS 临时文件夹位置的类似任务:

%sysexec(start explorer.exe "%sysfunc(pathname(work))" && exit);

请参阅上面KEYS 菜单图像中的F9

【问题讨论】:

  • 我现在无权访问 SAS,因此无法对其进行测试,但我会尝试将 %sysexec 调用直接放在宏例程中并将其分配给快捷方式,c.g. submit '%OpenPwd;'

标签: sas


【解决方案1】:

正如 user2877959 在 cmets 中指出的那样,SAS_EXECFILEPATH 和 SAS_EXECFILENAME 不可用,除非您在已保存的程序中 - 所以它们不可用,它们没有值。值得注意的是,在 KEYS 环境中,它们永远不可用(因为它们没有存储在文件中!)。您可以通过在尚未保存的新编辑器窗口中运行代码来查看这一点。

你可以使用键盘宏来完成你想要的,或多或少;将相同的文本分配给键盘宏,然后它将调用您的程序的代码放在当前编辑器窗口中,然后您可以执行并选择删除它。 (您甚至可以将其嵌入到 /* */ 块中,这样就不必将其删除)。

或者,您可以让您的程序始终在程序开始时将当前工作目录更改为自己的目录(您提交具有相同路径的cd 命令),然后您可以打开资源管理器并让它从正确的地方开始;或者(取决于您如何启动 SAS)您可以设置 SAS 以正确的目录启动(在快捷方式中)。仅当您只需要从几个地方开始时,这才真正有用。

【讨论】:

    【解决方案2】:

    正如@user2877959 所指出的,似乎无法直接解决。在这里,我描述了我认为的次佳解决方案。它需要一个我称之为“缩写宏”的技巧,它结合了keyboard macrosSAS Abbreviations 的强大功能。这假设正在使用增强型编辑器。

    1. 通过转到Tools > Add Abbreviation... 添加缩写
    2. 在“缩写”字段中输入\pwd。对于“要插入缩写的文本”,输入电话%sysexec(start explorer.exe "%GetPwd()" && exit);

    这就是诀窍出现的地方。

    1. 导航到Tools > Keyboard Macros > Macros...。请注意\pwd 现在出现在列表中。这意味着\pwd 不仅可以充当缩写,即代码 sn-p 的简写,还可以充当一系列键盘宏命令的触发器。
    2. 选择\pwd 的条目并选择“编辑”。从可用命令中,将以下内容分配给“键盘宏内容:”,然后按“确定”。

    Move cursor to end of line 
    Insert carriage return 
    Insert the string "%sysexec(start explorer..." 
    Extend selection to beginning of line
    

    现在,当使用\pwd 缩写时,调用将放在下一行并自动突出显示。缩写可以在任何地方发布,甚至在一行代码的中间,并且不会破坏已经编写的内容。要删除该行,请为“删除行”创建一个键盘宏。这将删除由\pwd 创建的行并将源代码返回到其原始状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多