4

How do I get the terminal size in Go. In C it would look like this:

struct ttysize ts; 
ioctl(0, TIOCGWINSZ, &ts);

But how to i access TIOCGWINSZ in Go

4

4 に答える 4

1

これを行う最良の方法は、syscallパッケージを使用することです。syscallパッケージは、非常に多くの異なることを行うため、ioctl関数を定義しませんが、それでも次のように呼び出すことができます。

syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(TIOCGWINSZ), uintptr(unsafe.Pointer(&ts)))

残っている2つのことは、winsize構造と必要な定数を複製することです。このためのツールはgodefsであり、Cヘッダーの構造と定数を調べて.goソースファイルを生成します。次のようなtermios.cファイルを作成します。

#include <termios.h>

enum {
    $TIOCGWINSZ = TIOCGWINSZ
};

typedef winsize $winsize;

今すぐ実行

godefs -gpackagename termios.c > termios.go

これで、端末のサイズを取得するために必要なものがすべて揃っているはずです。サイズの設定は、termios.cに別の定数を追加するのと同じくらい簡単です。

于 2011-02-09T09:32:24.123 に答える
1

読む: http://www.darkcoding.net/software/pretty-command-line-console-output-on-unix-in-python-and-go-lang/

const (
    TIOCGWINSZ     = 0x5413
    TIOCGWINSZ_OSX = 1074295912
)

type window struct {
    Row    uint16
    Col    uint16
    Xpixel uint16
    Ypixel uint16
}

func terminalWidth() (int, error) {
    w := new(window)
    tio := syscall.TIOCGWINSZ
    if runtime.GOOS == "darwin" {
        tio = TIOCGWINSZ_OSX
    }
    res, _, err := syscall.Syscall(syscall.SYS_IOCTL,
        uintptr(syscall.Stdin),
        uintptr(tio),
        uintptr(unsafe.Pointer(w)),
    )
    if int(res) == -1 {
        return 0, err
    }
    return int(w.Col), nil
}
于 2013-04-03T10:02:25.880 に答える
0

ドキュメンテーションをざっと見ただけでは、これに関してまだ多くの作業が行われているようには見えません。実際、まったく見つけることができませんioctl

このように初期段階にある言語では、未踏の地を踏んでいると言っても過言ではありません。TIOCGWINSZ、それ自体は単なる整数です (Linux ソース コードでその値を見つけました)。

#define TIOCGWINSZ  0x5413

しかし、幸運を祈ります。

于 2009-11-14T05:09:30.733 に答える