javascript 使用JXA设置BBEdit插入点

jdzmm42g  于 2023-01-08  发布在  Java
关注(0)|答案(2)|浏览(108)

我试图翻译一些苹果脚本(AS)到Javascript(JXA)的BBedit。
这是一个有趣的小事情敲一些生 rust 了,但我难倒了。用AS我可以设置一个插入点到BBEdit文档这样;

tell application "BBEdit"
    activate
    tell text 1 of window 1
        select insertion point before line 40
    end tell
end tell

当谈到JXA时,我完全被难倒了。我已经在行对象中四处寻找,但是我找不到insertsionPoint属性。
您可以按如下方式访问选择属性;

currentLine = bbedit.selection().startline().

但是它是只读的。所以我认为如果你想设置一个选择或者插入点,你需要访问那个select方法。我不知道怎么做,或者你是否可以使用JXA。
有谁知道如何用JXA设置BBEdit插入点和/或选择吗?谢谢。

eit6fx6z

eit6fx6z1#

JXA没有实现插入引用形式(before/after/beginning/end)。相对(previous…/next…)和范围(from…to…)说明符也被破坏了,过滤器(whose…)子句也很糟糕。在JXA的AS中断中有很多重要的东西可以正常工作:像苹果早期的API一样,JXA在发布时是半生不熟的,很快就被抛弃了。
这就是为什么我建议坚持使用AppleScript的原因。这种语言可能很糟糕,但它是唯一一个(勉强)支持的选项,可以正确地实现苹果事件。通常我会建议通过AppleScript-ObjC桥从其他语言调用AppleScript,这是最不糟糕的解决方案,但苹果在10.13中也成功地打破了这一点。
(If你喜欢危险的生活,NodeAutomation为Node.js提供了不间断的苹果事件支持,但是随着苹果放弃AppleScript自动化,我不想浪费任何人的时间来推广或支持它,所以请注意。)

btxsgosb

btxsgosb2#

下面是一个使用Javascript(JXA)作为BBedit插入点对象和select方法的例子。BBEdit看起来确实可以与JXA一起工作,但是BBEdit中绝对没有关于JXA的文档,网上的信息也很少。下面是我花了几个小时的试验和错误后得出的一些代码。所以我希望它能有所帮助。

(() => {
    /* Example to show using insertionPoints with BBEdit
        the script adds new text to the last line of a BBEdit text document
    */
    const strPath = '/Users/bartsimpson/Library/Mobile Documents/com~apple~ScriptEditor2/Documents/insertionPointsExample.txt';
    
    const BBEdit = Application('BBEdit');
    const docs = BBEdit.textDocuments;
    //use select in case there are multiple BBEdit documents open
    BBEdit.open(Path(strPath)).select();
    let doc = docs[0];
    let insertionPoints = doc.characters.insertionPoints;
    let lines = doc.characters.lines;
    let indexLastChar = doc.characters.length;
    let indexLastLine = lines.length-1;
    //last line in doc is blank
    if (lines[indexLastLine].length() == 0){ 
        insertionPoints[indexLastChar].contents = 'some new text5';
        indexLastChar = doc.characters.length; //update after adding text
        insertionPoints[indexLastChar].select(); //puts cursor end of last line
    }
    //last line in doc has text so add a new line first
    else {
        insertionPoints[indexLastChar].contents = '\n';
        insertionPoints[indexLastChar+1].contents = 'some new text6';
        indexLastChar = doc.characters.length; //update after adding text
        insertionPoints[indexLastChar].select(); //puts cursor end of last line
    }
})()

相关问题