2017-12-12 13 views
1

Swift에서 명령 줄 도구를 만들고 있는데, 화면에서 텍스트를 줄 바꿈없이 적용 할 수 있도록 응용 프로그램을 실행하는 동안 뷰포트의 현재 너비를 확인할 방법이 있는지 궁금합니다.Swift의 명령 줄 앱에서 뷰포트 크기 (문자)를 결정 하시겠습니까?

pico, man, pine 등이 모두 창 크기를 기반으로 텍스트 인터페이스를 렌더링하므로 "실제"명령 줄 앱에서 가능하다는 것을 알고 있지만 정보를 찾을 수없는 것 같습니다. 그들이 어떻게하는지.

실제로 실행중인 창 크기를 조정하여 새로 고침 할 수도 있습니다. 누구나 어떻게 작동하는지 알고 Swift로 작성된 명령 행 도구에 지원을 추가 할 수 있다면?

+0

을 bash 쉘에서'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을 추적하려면 전자 이벤트는 SIGWINCH 신호를 처리 할 수 ​​있고, Trapping signals in a Swift command line application 비교 :

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

놀라운! 내가 할 수 있으면 너에게 맥주를 사줄거야. Martin 고마워! – devios1

+1

@ devios1 : 내가 캐나다에 가야한다면 전화 할께. :) –