在Atom中找到位置

时间:2018-02-16 08:45:03

标签: atom-editor

在linter提供程序中,我收到错误发生的Point compatible array(行,列)。现在我想强调围绕这一点的词,基本上是如果在编辑器中双击那个确切的点就会得到的结果。像

这样的东西
const range = textEditor.getWordAtPosition(point)

是我希望的,但在文档中找不到。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

在环顾四周之后,似乎没有针对给定需求的API方法。我最终写了一个基于this answer的小辅助函数:

function getWordAtPosition(line, pos) {
    // Perform type conversions.
    line = String(line);
    pos = Number(pos) >>> 0;

    // Search for the word's beginning and end.
    const left = Math.max.apply(null, [/\((?=[^(]*$)/,/\)(?=[^)]*$)/, /\,(?=[^,]*$)/, /\[(?=[^[]*$)/, /\](?=[^]]*$)/, /\;(?=[^;]*$)/, /\.(?=[^.]*$)/, /\s(?=[^\s]*$)/].map(x => line.slice(0, pos).search(x))) + 1
    let right = line.slice(pos).search(/\s|\(|\)|\,|\.|\[|\]|\;/)

    // The last word in the string is a special case.
    if (right < 0) {
        right = line.length - 1
    }

    // Return the word, using the located bounds to extract it from the string.
    return str.slice(left, right + pos)
}

这里,单词的开头由其中一个字符(),。[]的最新出现确定。或者一片空白。

单词的结尾由相同的字符决定,但是这里首先出现的是一个分隔符。

给定原始上下文,可以使用API​​方法::lineTextForBufferRow和所需的位置(列)调用该函数,如下所示:

const range = getWordAtPosition(textEditor.lineTextForBufferRow(bufferRow), 10)