Cetak output kode di tengah layar

10

Kode di bawah ini akan menampilkan apa pun filekata demi kata di layar. Sebagai contoh:

Hello akan ditampilkan selama 1 detik dan menghilang. Kemudian, kata berikutnya dalam kalimat akan muncul sebentar dan menghilang dan seterusnya.

Bagaimana cara menampilkan apa pun yang ditampilkan di tengah layar?

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' file
Nebelz Cheez
sumber
Apa yang sebenarnya ingin Anda capai?
muru
perintah itu menampilkan setiap kata membentuk file di sudut kiri atas layar. Saya perlu tahu cara membuat output di tengah layar.
Nebelz Cheez
4
Ya, tetapi apa yang ingin Anda capai? Ini kedengarannya seperti masalah XY ,
muru
Apa itu "tengah layar"? Bagian tengah terminal? Bagian tengah layar yang sebenarnya? Bagaimana jika Anda mengubah ukuran terminal, apakah Anda memerlukan ini untuk secara dinamis menempatkan teks di tengah berapapun ukuran terminal Anda?
terdon
Iya. Bagian tengah terminal.
Nebelz Cheez

Jawaban:

7

Di sini Anda adalah skrip bash yang sangat kuat:

#!/bin/bash

## When the program is interrupted, call the cleanup function
trap "cleanup; exit" SIGHUP SIGINT SIGTERM

## Check if file exists
[ -f "$1" ] || { echo "File not found!"; exit; }

function cleanup() {
    ## Restores the screen content
    tput rmcup

    ## Makes the cursor visible again
    tput cvvis
}

## Saves the screen contents
tput smcup

## Loop over all words
while read line
do
    ## Gets terminal width and height
    height=$(tput lines)
    width=$(tput cols)

    ## Gets the length of the current word
    line_length=${#line}

    ## Clears the screen
    clear

    ## Puts the cursor on the middle of the terminal (a bit more to the left, to center the word)
    tput cup "$((height/2))" "$((($width-$line_length)/2))"

    ## Hides the cursor
    tput civis

    ## Prints the word
    printf "$line"

    ## Sleeps one second
    sleep 1

## Passes the words separated by a newline to the loop
done < <(tr ' ' '\n' < "$1")

## When the program ends, call the cleanup function
cleanup
Helio
sumber
8

Coba skrip di bawah ini. Ini akan mendeteksi ukuran terminal untuk setiap kata input sehingga bahkan akan secara dinamis memperbarui jika Anda mengubah ukuran terminal saat sedang berjalan.

#!/usr/bin/env bash

## Change the input file to have one word per line
tr ' ' '\n' < "$1" | 
## Read each word
while read word
do
    ## Get the terminal's dimensions
    height=$(tput lines)
    width=$(tput cols)
    ## Clear the terminal
    clear

    ## Set the cursor to the middle of the terminal
    tput cup "$((height/2))" "$((width/2))"

    ## Print the word. I add a newline just to avoid the blinking cursor
    printf "%s\n" "$word"
    sleep 1
done 

Simpan sebagai ~/bin/foo.sh, buat itu dapat dieksekusi ( chmod a+x ~/bin/foo.sh) dan berikan file input Anda sebagai argumen pertama:

foo.sh file
terdon
sumber
3

fungsi bash untuk melakukan hal yang sama

mpt() { 
   clear ; 
   w=$(( `tput cols ` / 2 ));  
   h=$(( `tput lines` / 2 )); 
   tput cup $h;
   printf "%${w}s \n"  "$1"; tput cup $h;
   sleep 1;
   clear;  
}

lalu

mpt "Text to show"
Ratnakar Pawar
sumber
1
Ini tampaknya persis sama dengan jawaban saya kecuali bahwa itu menunjukkan satu hal dan tidak setiap kata kalimat membaca dari file secara terpisah seperti yang diminta oleh OP.
terdon
1

Berikut skrip Python yang mirip dengan solusi @ Heliobash :

#!/usr/bin/env python
import fileinput
import signal
import sys
import time
from blessings import Terminal # $ pip install blessings

def signal_handler(*args):
    raise SystemExit

for signal_name in "SIGHUP SIGINT SIGTERM".split():
    signal.signal(getattr(signal, signal_name), signal_handler)

term = Terminal()
with term.hidden_cursor(), term.fullscreen():
    for line in fileinput.input(): # read from files on the command-line and/or stdin
        for word in line.split(): # whitespace-separated words
            # use up to date width/height (SIGWINCH support)
            with term.location((term.width - len(word)) // 2, term.height // 2):
                print(term.bold_white_on_black(word))
                time.sleep(1)
                print(term.clear)
jfs
sumber