Go や Node.js でターミナルのサイズを取得する
コマンドラインツールを作っていて、実行されているターミナルの幅や行数を知りたいなと思う時があったので調べた。
Go 言語での方法
Go 言語では terminal
というパッケージを使うと取得できる。
$ go version
go version go1.19 darwin/amd64
# 適当にモジュール (プロジェクト) を作る → go.mod が生成される
$ go mod init my-module
# terminal パッケージをインストールする → go.mod に追記され go.sum が生成される
$ go get golang.org/x/crypto/ssh/terminal
以下のように呼び出して利用できる。
main.go
package main
import (
"fmt"
"os"
"syscall"
"golang.org/x/crypto/ssh/terminal"
)
func main() {
var width int
var height int
var err error
width, height, err = terminal.GetSize(syscall.Stdin)
if err != nil {
fmt.Printf("Error : %+v", err)
os.Exit(1)
}
fmt.Printf("Width : %d\n", width)
fmt.Printf("Height : %d\n", height)
}
実行してみる。
$ go run ./main.go
Width : 72
Height : 17
取れた。
Node.js での方法
Node.js はもっと簡単というか、process.stdout
から取得できる。
main.js
console.log('Width : ', process.stdout.columns);
console.log('Height : ', process.stdout.rows);
// `process.stderr` にも同じプロパティがある
コレだけで OK。
- 参考 : TypeScript/executeCommandLine.ts at 16156b1baf26a39ce428423f7106f3ef2b4e98bb · microsoft/TypeScript
- 参考 : TypeScript/sys.ts at fd05c0cc6da676c5b9183ad2a7ced7ce363b855a · microsoft/TypeScript
- 元々は TypeScript がコマンドラインにロゴを出力しているコードから発見した
以上。