2017-12-12 12 views
1

私はSwiftでコマンドラインツールを構築していますが、画面上のテキストを折り返しなしで収まるように制限するために、アプリケーションの実行中にビューポートの現在の幅を判断する方法があるかどうかは疑問です。Swiftのコマンドラインアプリからビューポートサイズ(文字数)を決定しますか?

pico、man、pineなどはすべてウィンドウサイズに基づいてテキストインターフェイスをレンダリングするので、これは「実際の」コマンドラインアプリでは可能ですが、情報は見つからないようです彼らのやり方について

実際には、実行中にウィンドウのサイズを変更して更新することもできます。誰でもこの仕組みが分かっていて、Swiftで書かれたコマンドラインツールにサポートを追加することが可能な場合は、

+0

、 'LINES'と' COLUMNS'環境変数は、画面サイズを与えます。しかし、それらはMacのSwiftコマンドラインツールで 'ProcessInfo.processInfo.environment'を使って私には見えません。 – rmaddy

答えて

3

Getting terminal width in C?からCコードは簡単スウィフトに翻訳されています

import Darwin 

var w = winsize() 
if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 { 
    print("rows:", w.ws_row, "cols", w.ws_col) 
} 

(何らかの理由で、これはXcodeのデバッガコンソールでは動作しません、 あなたは、ターミナルウィンドウで実行可能ファイルを呼び出す必要があります。)

また

、(Getting terminal width in C?から)ncursesライブラリを使用して:

import Darwin.ncurses 

initscr() 
let s = "rows: \(LINES), cols: \(COLS)" 
mvaddstr(1, 1, s); 
refresh(); 
getch() 
endwin() 

ウィンドウresizを追跡するためにあなたがTrapping signals in a Swift command line applicationを比較し、 SIGWINCH信号を処理する必要がEイベント:bashシェルで

import Darwin 
import Dispatch 

var w = winsize() 
if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 { 
    print("rows:", w.ws_row, "cols", w.ws_col) 
} 

let sigwinchSrc = DispatchSource.makeSignalSource(signal: SIGWINCH, queue: .main) 
sigwinchSrc.setEventHandler { 
    if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 { 
     print("rows:", w.ws_row, "cols", w.ws_col) 
    } 
} 
sigwinchSrc.resume() 

dispatchMain() 
+1

すごい!私はできればあなたにビールを買うだろう。マーティンありがとう! – devios1

+1

@ devios1:もし私がカナダに来なければならないなら、私はあなたに電話します:) –

関連する問題