Julia의 REPL에서 다채로운 출력을한다 (놀이)

10692 단어 Julia

오늘은



  • TerminalMenus 의 실장을 조사하고 있으면(자) 이런 할 수 있을 것 같다라고 하는 물건으로 만든 재료입니다. TerminalMenus 자체는 Julia의 REPL에서 상호 작용을 가능하게하고 결과에 따라 처리를 분기 할 수있는 도구로 Julia 표준에 내장되어 있습니다. 이번에는 구현을 바라보고있는 지식에서 얻은 코드를 소개합니다.

  • 할 수있는 일



    아래의 GIF를 참조하십시오.



    터미널 상에 출력되는 문자(뒤)에 색을 붙인 것을 순차적으로 프린트하고 있는 것이 됩니다.

    구현



    아래 코드를 그대로 실행합니다.
    $ julia --color=yes partypeople.jl
    
    --color 옵션을 활성화하지 않으면 배경에 색상이 한정되지 않으므로 외로운 출력이됩니다.

    partypeople.jl
    #=
    julia --color=yes partypeople.jl
    =#
    
    using Crayons
    using Crayons.Box
    using ColorTypes
    
    
    const SPACE = " " # one white space
    BG_COLORS=[
        #BLACK_BG         ,
        RED_BG           ,
        GREEN_BG         ,
        YELLOW_BG        ,
        BLUE_BG          ,
        MAGENTA_BG       ,
        CYAN_BG          ,
        LIGHT_GRAY_BG    ,
        DEFAULT_BG       ,
        DARK_GRAY_BG     ,
        LIGHT_RED_BG     ,
        LIGHT_GREEN_BG   ,
        LIGHT_YELLOW_BG  ,
        LIGHT_BLUE_BG    ,
        LIGHT_MAGENTA_BG ,
        LIGHT_CYAN_BG    ,
        WHITE_BG         ,
    ]
    
    function draw(c,H,W; init::Bool=false)
        H,W = 5,10
        buf = IOBuffer()
        if !init
            print(buf, "\x1b[999D\x1b[$(H)A") #rollback H-times
        end
        for i in 1:H
            msg = repeat("$(rand(1:9))",W)
            println(buf, c, msg, Crayon(reset=true))
        end
        print(buf |> take! |> String)
    end
    
    function clean(H)
        buf = IOBuffer()
        for i in 1:H+1
            print(buf, "\x1b[2K") # clear line
            print(buf, "\x1b[999D\x1b[$(1)A") # rollback
        end
        print(buf |> take! |> String)
    end
    
    function partypeople()
        H,W=5,10
        draw(BLACK_BG,H,W,init=true)
        for c in BG_COLORS
            draw(c,H,W)
            sleep(0.1)
        end
        clean(H)
    end
    
    partypeople()
    

    하고 있는 일



    Crayon으로 색칠


    draw 함수는 컬러 문자를 출력합니다. for 루프를 보면 msg에 저장된 문자열을 println하는 방법을 볼 수 있습니다.
    색상을 지정하기 위해 Crayons.jl에 정의 된 Crayon 구조체는 msg 앞뒤에 끼워져 있습니다. 엔티티는 인쇄 제어 \e[31m (적색) 또는 \e[0m (취소)와 같은 명령을 끼고 있습니다.

    예를 들어 아래 그림과 같이 출력에 사용하는 색을 제어시킬 수 있습니다.



    반복 인쇄하기 위해



    인쇄한 후 실행 취소


    print(buf, "\x1b[999D\x1b[$(H)A") 를 하면 프린트를 하는 장소를 H행분 되돌려 줍니다. 이것을 하는 것으로 출력이 다르--와 흐르는 것을 막고 있습니다.

    보통 println("Hello") 라고 하면 프린트한 결과의 다음의 행에 커서가 나오는군요. 계속 println("World")
    Hello
    World
    

    와 같이 이전의 출력인 Hello 가 남아 있습니다. 커서를 1행 되돌려 World를 쓰면 Hello가 사라지고 World "만"이 남는 구조입니다.
    Step 1      |     Step 2      | Step 3
    Hello       |   > Hello       | World
    World>      | (上に持っていく)  |
    

    실제로 움직여 주신 분이 이해가 진행된다고 생각합니다.

    후 정리


    clean 함수에서 draw를 한 결과를 지 웁니다. print(buf, "\x1b[2K") 하고 행을 지우고 커서를 한 행 위에 가져간다는 조작을 프린트한 행수 반복한다는 것을 하고 있습니다.

    요약


  • 이상의 동작을 고속으로 하는 것으로 색이 붙은 문자가 파파와 바뀌는 것처럼 보이게 할 수 있었습니다.
  • TerminnalMenu 구현에서 흥미로운 부분을 가져 와서 Julia의 놀이 코드를 작성했습니다. TerminalMenus 내에서는 waitKey라는 함수가 안에서 움직이고 있어 사용자의 키의 입력에 맞추어 액션을 해 그 안에서 IOBuffer를 제어
    하고 터미널에서의 대화 조작을 가능하게 하고 있습니다. 노력하면 Julia만으로 간단한 에디터 만들 수 있을 것 같네요. 여가 시간은 꼭 부디.



  • 오츠키 씨가 빙글빙글 회전합니다.
    function moonbar()
        try
            print("\x1b[?25l") # hide cursor
            while true
                for 🌝  '🌑':'🌘'
                    sleep(0.1)
                    print(🌝)
                    print('\r')
                end
            end
        finally
            print("\x1b[?25h") # unhide cursor
        end
    end
    
    moonbar()
    

    이것도 마찬가지로 출력하는 장소를 컨트롤하고 있습니다. Nowloading ... 라는 느낌의 상황에서 사용해보십시오.

    좋은 웹페이지 즐겨찾기