

hr for your terminal - C0d3r
https://github.com/LuRsT/hr
Tired of not finding things in your terminal because there&#x27;s a lot of logs and garbage? Tired of destroying the Enter key by creating a &quot;void zone&quot; in your terminal so that you can see the error that you&#x27;re trying to debug?<p>Use the old &lt;hr &#x2F;&gt; tag, but in your terminal
======
ehamberg
If you want a solid line, you could use U+2501 (━) from the set of box drawing
characters ([https://en.wikipedia.org/wiki/Box-
drawing_character](https://en.wikipedia.org/wiki/Box-drawing_character)):

    
    
        <━> 9473, U+2501 BOX DRAWINGS HEAVY HORIZONTAL
    
        hr(){printf '━%.0s' $(seq $COLUMNS)}

~~~
chjj
Some terminals support ACS (with SCLD) but not unicode. It might be better to
use ACS:

    
    
        $ hr() { printf '\e(0'; printf 'q%.0s' $(seq $(tput cols)); printf '\e(B'; }
    

Same thing, but potentially more portable.

edit: Could also use tput instead of $COLUMNS. Sometimes the $COLUMNS may not
always be updated (bash's checkwinsize option).

~~~
pdw
For portability you should also use \033 (the octal code) instead of \e, which
is non-standard.

------
IgorPartola
Great idea, one random nitpick:

    
    
        curl https://raw.github.com/LuRsT/hr/master/hr > ~/bin/hr
    

is just evil. That's a great way to own a machine. You can even read the code
today, but run the command tomorrow when someone had replaced the code with a
giant exploit. Not saying there is a better way to distribute something like
this that is as easy to use, but damn, this is just asking for trouble.

~~~
C0d3r
I know that, I did not want to be evil writing that in the instructions but
that's the best way to copy that file, also this is a file to be executable,
so even if you use wget you are asking for trouble, downloading a file to your
$PATH and making it executable, do you have any idea on how to improve the
instructions?

~~~
IgorPartola
I honestly don't know of another way, other than encouraging the user to read
the code.

------
lstamour
This has me wondering, why haven't terminal windows evolved functionally to
better support history, scrollback buffers jumping or markers, selection with
a mouse, auto-complete hints, etc. Instead we're limited to hacks like this or
the screenshot at [http://unix.stackexchange.com/questions/3650/would-it-be-
pos...](http://unix.stackexchange.com/questions/3650/would-it-be-possible-to-
jump-between-prev-next-command-prompts) ... and no, I don't think "use emacs"
is an acceptable answer ;-)

Oh and instead of adding blank lines with "Enter", I often just type "clear"
and hit return. Bingo, tons of whitespace now added.

~~~
ppurka
I think terminology [1] is quite promising, although it doesn't yet do all of
the above.

[1]
[http://www.enlightenment.org/p.php?p=about/terminology](http://www.enlightenment.org/p.php?p=about/terminology)

~~~
lstamour
Huh. From there I discovered [http://acko.net/blog/on-
termkit/](http://acko.net/blog/on-termkit/)

Previous thread:
[https://news.ycombinator.com/item?id=2559734](https://news.ycombinator.com/item?id=2559734)

Related terminals:
[https://news.ycombinator.com/item?id=3227702](https://news.ycombinator.com/item?id=3227702)
[https://news.ycombinator.com/item?id=3910649](https://news.ycombinator.com/item?id=3910649)

"What happened to TermKit?" on Reddit with a reply from the author:
[http://www.reddit.com/r/programming/comments/137kd9/18_month...](http://www.reddit.com/r/programming/comments/137kd9/18_months_ago_termkit_a_nextgeneration_terminal/)

I'm thinking we'll need a terminal window that interfaces with bash but has
overlays in HTML and other controls for scrollback, etc. Maybe a fork of an
existing terminal.

------
tgrochowicz
i forked this to do something immature instead because i'm 12 years old.

$ dong 8=================================D # Till the end of your terminal
window $

[https://github.com/tgrochowicz/hr](https://github.com/tgrochowicz/hr)

~~~
rm445
Hardly cause to fork a project - surely it would make more sense as an option
to the original?

------
loopj
I currently just mash <return> <return> <return> to create a visual break in
my terminal output.

~~~
C0d3r
Me too, and it's exactly why I made this script :)

------
comex
Some other characters you may want to substitute into the script:

――――――――――――――――――――――――――――――――――――――――――――――――――

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅

██████████████████████████████████████████████████

~~~
C0d3r
Oh yeah! Definitely! Although, to make this non-unicode compatible, it's
better to have a cleaner default like '='.

But if you really want another character by default, you can do this:

    
    
        alias hr='hr █'

------
Aardwolf
Much simpler: having a colored prompt works quite well to solve the mentioned
problem.

PS1="\\[\033[0;31m\\][\u@\h:\w]$\\[\033[0m\\]"

~~~
wylee
I just stuck this in my PS1:

    
    
        hr() {
            printf '=%.0s' $(seq $((${COLUMNS} - 20)))
        }
    
        PS1="${GREY}\d ${RED}\$(hr)${GREY} \t"
    

It dynamically adjusts to the width of the terminal, and looks like this:

    
    
        Mon Feb 10 ======================================== 16:30:30
    

My complete BASH prompt:
[https://bitbucket.org/wyatt/dotfiles/src/25cb260a05b68dd81a5...](https://bitbucket.org/wyatt/dotfiles/src/25cb260a05b68dd81a5c8710b5034a0b08ea9a81/bashrc?at=default#cl-47)

------
jamestomasino
Great little script. I tossed it into by bash functions and added a bit of
error checking and output formatting: [https://github.com/jamestomasino/bash-
scripts/blob/master/.f...](https://github.com/jamestomasino/bash-
scripts/blob/master/.functions#L159-L174)

------
ramses0
I like to use terminal colors so it's red, as well as allowing controlling
width, but defaulting to terminal width.

    
    
      $ cat ~/bin/br
      #!/bin/sh
      if [ "$1" == "" ] ; then
              COLS=`tput cols`
      elif [ "$1" == "--help" ] ; then
              echo "$0: Prints a red line across the screen. or $0 <##> for a specific width."
              echo "$0:   br ; grep -ir foo *  -- place a marker to see where results begin / end."
              echo "$0:   br 80 ; cat file     -- use to check for overly long lines."
              exit
      else
              COLS=$1
      fi
      LINE=""
      for (( x=0 ; x<$COLS ; x++ ));  do LINE="$LINE-" ; done
      echo -e '\E[47;0m'"\033[1m$LINE\033[0m"

------
pbhjpbhj
I'm interested why they use "seq"? [seq can take a single value too
apparently, perhaps they did half width rulers with "seq 2 $(tputs cols)"?]

Why doesn't

    
    
        !/bin/bash
        j=$(tput cols); for i in {1..$j}; do echo -n "#";done
    

work, presumably there's some escape that needs doing?

The alternative:

    
    
        !/bin/bash
        for (( c=1 ; c<=$COLUMNS; c++ )); do echo -n "#";done
    

seems fine?

Also BASH has $COLUMNS builtin FWIW, though portability explains use of tput.

I like it, should be a standard command, including options to specify width as
a proportion and to add whitespace lines. Code for this must be in almost
every shell script.

~~~
pdw
Both of those would work in bash, but they're non-standard extensions. The seq
construction would work in any POSIX shell, though the seq command itself is
still non-standard I think.

~~~
pbhjpbhj
Sorry, the first doesn't work - I was asking if anyone knew why. The second
works in BASH, but it's bashism as you note.

------
yoha
hr(){printf '=%.0s' $(seq $COLUMNS)}

~~~
sp332
What language is that?

~~~
sheetjs
bash shell, although some whitespace is missing:

    
    
        hr() { printf '=%.0s' $(seq $COLUMNS); }
    

printf is a bash builtin

~~~
ajross
Actually printf is a POSIX standard shell utility. Bash happens to implement
it as a builtin, but there's also a conforming copy in GNU coreutils (and
presumably busybox, but I didn't check). And the syntax above is standard
Bourne shell, not specifically bash.

Actually of the constructs in that, the only non-portable one is the seq tool,
which (I think) is unique to coreutils.

~~~
sheetjs
I don't know if its still the case, but OSX used to not ship with seq.
Instead, you had to use jot.

~~~
_delirium
OSX 10.9 ships a 'seq'. This particular version was written in 2005 by the
NetBSD project, and its provenance is NetBSD 3.0 -> FreeBSD 9.0 -> OSX.

Fwiw, it isn't a GNUism, though GNU's version was the first widely distributed
one. A 'seq' appears in some old Research UNIX editions, and also in Plan9,
but not in commercial AT&T Unix or in BSD. Instead 'jot' is the traditional
BSD utility. Not sure if commercial AT&T Unix (and descendants) had anything
similar.

------
gamacodre
If you like this idea and are stuck in Windows, this does the same thing:

    
    
        @set @jScript=1;/*
        @for /f "tokens=1,2" %%w in ('mode con:') do @if "%%w" == "Columns:" set cols=%%x
        @cscript /noLogo /E:jScript  "%~f0" %cols% %1 =
        @Goto :EOF
        */line='';while(line.length<WScript.Arguments(0))line+=WScript.Arguments(1);
        WScript.StdOut.Write(line.substr(0,WScript.Arguments(0)));
    

Save as hr.cmd and stick it somewhere in your path.

------
num
Fortunately this is what I've used Figlet
([http://www.figlet.org](http://www.figlet.org)) or Toilet
([http://caca.zoy.org/wiki/toilet](http://caca.zoy.org/wiki/toilet)) for:

    
    
        $ figlet -- ----------
        
        
         _____ _____ _____ _____ _____ _____ _____ _____ _____ _____
        |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|

------
codegeek
love useful utilities like this. Nothing rocket science but handy. I updated
the README.md btw and pull request already accepted. Thx :)

~~~
C0d3r
Thanks! This is actually what I love doing, small utilities to help me and
others which are not that fancy but get the work done and are compatible with
my workflow.

------
nagrom
I don't understand - is there something better about this than the 'clear'
command?

~~~
Ujio
Clear doesn't do anything to differentiate new output from old.

~~~
nagrom
It makes an entire blank line, which is sufficient if you have a lot of
textual output. It also gets rid of the old stuff from the screen - if you're
running a window manager, you can then scroll up if you need the old stuff.

~~~
C0d3r
I use `clear` but in tmux, the whitespace produced by `clear` disappears, so
it's the same as pressing <Enter> :(

------
rcfox
Anyone know how to add this sort of thing before the prompt in `git add -p` ?

~~~
C0d3r
You can create an alias in git like this:

vim ~/.gitconfig

    
    
        ap = !hr && git add -p # Add this line to your file

------
abruzzi
The one problem is that the ability or substitute a different character
doesn't test for length. I want to do: hr --==##==

~~~
C0d3r
Hi! I implemented your idea, now you can do that! Thanks for your input!

------
KiwiCoder
Perl on Windows;

    
    
       perl -e "$_=`mode`;/ns:\s+(\d+)/;print '='x$1"

------
farginay
I've long wanted a shell with logical separation of each command/output pair.

------
hayksaakian
I thought control + l was a fairly well known hotkey?

it inserts a terminal worth of line breaks

------
chris-martin
PS1="$(hr -) $PS1"

Beautiful.

Now I need a way to make this happen in SBT too.

------
middleclick
Nice and useful! Thanks!

------
roadnottaken
Love this, thanks!

------
NickSharp
Love it. Thanks!

