0

我修改了 gnome-terminal 并添加了对自定义 url 处理程序的支持:src://
它允许您在ctrl-click.

例子src:///path/to/file:43

这一切都很好,但现在我需要某种类型的过滤器,它将所有相对和绝对路径转换为绝对src链接。然后我就可以通过它管道输出另一个程序。

例子

$ go build

# command-line-arguments
./test.go:3931: undefined: erre

我想要这样的东西

$ go build | src-links

# command-line-arguments
src:///home/icholy/gocode/src/test/test.go:3931: undefined: erre

我的第一个想法是使用正则表达式,但我发现的唯一示例是路径已经以方案/协议为前缀。

我被困住了,因此将不胜感激想法/建议。我将在 go 中实现它,但这并不重要。

4

2 回答 2

2

很酷的主意。然而,文件名具有相当通用的格式,所以我怀疑你应该只覆盖其中的很大一部分,而不是全部。

如果您打算将其用于编程工作,那么您可能会认为只匹配许多程序员认为好的做法的文件名是可以接受的。即路径中的字符集匹配 [A-Za-z0-9/_.-] 。您还期望您要查找的是文件名后跟 ':\d+',并且行规范与看起来可能是行规范的一部分的其他字符不连续。最后一点可以通过前向和后向环视断言来完成。

如果将其与文件存在测试(相对于当前目录或指定目录)结合起来,那么您将获得一个非常易于管理的范围和一个健壮的测试。

所以你的文件规范正则表达式是这样的:

(?<![A-Za-z0-9/_.-])([A-Za-z0-9_.-]):(\d+)(?![A-Za-z0-9/_.-])

您应该能够将大多数此类文件规范转换为绝对格式,只需将它们附加到所需的路径,除非它们以/.

$PATH/$file_path

路径是否以 开头并不重要./。无论如何,上述方法都有效,因为 /foo/./bar/baz是可接受的路径。与 相同/foo/bar/../../bar/baz/xyz'\

您应该尝试确保您在此处使用的规范与您的 gnome 终端视为链接的一部分一致。

很高兴看到有关您如何完成 gnome 终端位的详细信息。它会使这个页面在未来对其他人更有用。

于 2013-06-07T17:33:56.867 回答
1

除了 mc0e 提供的正则表达式解决方案之外,一旦您找到带有文件名的字符串,您可以通过以下方式对它们进行管道传输:

package main

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

func checkLine(s string) bool {
    // Insert regex checking logic here. Just checking for blank line now.
    if s == "" {
        return false
    }
    return true
}

func srcerer(s string) (string, error) {
    p, err := filepath.Abs(s)
    if err != nil {
        return "", err
    }
    return "src:///" + p, nil
}

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        v := scanner.Text()
        if checkLine(v) {
            link, err := srcerer(v)
            if err != nil {
                fmt.Fprintln(os.Stderr, "Error:", err)
                return
            }
            fmt.Println(link)
        }
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }
    return
}

其中,将上述代码编译为名为 的二进制src-links文件,并给出一个名为的文件testlines.txt,其内容为:

./test.go:14: undefined: erre
./test.go:16: undefined: erre
./test.go:21: undefined: erre
./test.go:27: undefined: erre

该命令cat testlines.txt | src-links将输出:

src:///home/icholy/gocode/src/test/test.go:14: undefined: erre
src:///home/icholy/gocode/src/test/test.go:16: undefined: erre
src:///home/icholy/gocode/src/test/test.go:21: undefined: erre
src:///home/icholy/gocode/src/test/test.go:27: undefined: erre
于 2013-06-08T05:45:03.377 回答