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 が提供する regexp ソリューションに加えて、ファイル名を含む文字列を見つけたら、次のようにパイプすることができます。

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 に答える