Scite Other

lua-users home
wiki

SciteOther 库是一个带有 Lua 驱动的小型 DLL,允许您控制 SciTE 的另一个实例。例如,OpenOther(file) 会在另一个 SciTE 窗口中打开文件;如果没有,SciTE 将会重新启动。在这些说明中,当我提到另一个“窗口”时,我指的是 SciTE 的另一个实例(Emacs 用户称之为另一个“frame”)

您可以在 http://home.mweb.co.za/sd/sdonovan/scite_other.zip 找到 DLL(已编译和源代码)以及驱动程序。将 DLL 放在 SciTE 可执行文件的同一目录中(“默认主目录”),并从您的 Lua 启动文件中加载 Lua 代码。

该库使用外部 SciTE Director 接口向 SciTE 发送命令。其中一部分命令在 SciTE 帮助的“命令行参数”部分给出,但还有其他可用的命令——最终参考是 SciTEBase::PerformOne (SciTEBase.cxx, 4287)。提供了一个通用函数 PerformOther(verb,arg),因此 OpenOther(file) 等同于 PerformOther('open',file)

close
cwd            change working directory 
find           search text 
goto           line number[,column number] 
open           file name 
quit  
replaceall     search text\000replacement text 
saveas         file name 

loadsession    session file
extender       Lua expression
menucommand    menu id

These export commands apply to the currently shown file:

exportashtml   output file
exportasrtf    ''
exportaspdf    ''
exportaslatex  '' 
exportasxml    ''

请记住,这些“动词”的参数必须是 C(或 Lua)风格的字符串。Director 接口就是这样设计的,以便可以搜索特殊字符等。例如,这将在另一个窗口中将所有制表符替换为空格

   PerformOther('replaceall','\t\000 ')

这里使用八进制常量 \000 来分隔目标字符串和替换字符串。

也许最具潜力的动词是 'extender',它允许您在另一个实例中执行 Lua 代码。例如,此代码将在另一个窗口中移动到某个位置,并调用 Lua 函数来标记该位置。

   PerformOther('goto',line)
   PerformOther('extender','mark_current_line()')

正在运行程序的 SciTE 实例(可以说)也可以通过此类命令进行驱动,这非常有用。Perform 函数在当前窗口中执行这些命令。例如,Perform('close') 将关闭当前缓冲区。一个特别有用的动词是 'menucommand',因为这使您可以完全访问通过菜单可用的任何 SciTE 功能。我已经提供了 Command(cmd) 来利用这一点,并从 SciTE.h 中提取了大部分有用的菜单 ID。例如,Command 'IDM_BOOKMARK_TOGGLE' 将在光标位置设置一个书签。

最后,SciteOther 库还为 os.execute() 提供了一个“安静”的替代方案 Execute(cmd),它不会出现那个讨厌的黑色闪烁框。

笔记和限制

目前 scite_other 仅适用于 Win32 平台,但编写等效的 Linux 共享库并不困难。scite_other.c 实际上是希望了解 SciTE Director 接口的人的一个很好的参考。

示例

此 Lua 函数将关闭当前文件并在另一个窗口中打开它。

  function open_in_other()
    local file = props['FilePath']
    Perform('close')
    OpenOther(file)
  end

书签是一个非常有用的 SciTE 功能,但它们不会强制将行位置置于屏幕中央。这是“下一个书签”的一个替换项,它会将行强制置于屏幕中央。

  function next_bookmark()
    Command 'IDM_BOOKMARK_NEXT'
    local line = editor:LineFromPosition(editor.CurrentPos)
    local top = editor.FirstVisibleLine
    local middle = top + editor.LinesOnScreen/2
    editor:LineScroll(0,line - middle)
  end

这将在另一个窗口中查找提供的单词并设置一个书签

  function find_in_other(f)
     PerformOther('find',f)
     Command('IDM_BOOKMARK_TOGGLE','other')
  end


RecentChanges · preferences
编辑 · 历史
最后编辑时间 2004 年 11 月 11 日 上午 4:12 GMT (差异)