Idea
The initial idea comes from a discussion with friends over dinner a couple of
nights ago, when we realized ar(1)
can read input from STDIN
. While we were
wondering why that would be useful and what it could be used for, one of use
mentioned that gcc(1)
can also read input from STDIN
. From there, the
conversation derailed into how to “misuse” that feature in order to do something
completely over the top and useless.
Inspired by Kelsey Hightower’s
nocode idea, we wanted to
use gcc(1)
to write our code directly on STDIN
, compile it, and, if successful,
add and commit it to a git repo. Obviously doing all of this by hand wouldn’t cut
it, so all of it had to be “automated” or neatly wrapped into a useable script.
Which then gave birth to Nocode: A simple way to write clean single-file code without taking up disk space
.
Implementation
Nocode
is essentialy a bash script which wraps all of the useful steps.
It starts of by creating and filling a .gitignore
file if none exist, as to
not create git clutter with the following steps.
if [ ! -f ".gitignore" ]; then
$(echo "a.out" >> ".gitignore")
$(echo -n "*.c" >> ".gitignore")
fi
The script then goes on to read the code from STDIN
, in order to compiling it.
Before passing the input to gcc(1)
it is first given to clang-format
in
order to apply the coding style the user wants. This is then input to tee(1)
in
order to save it until it is committed to our git repository, and finally into
gcc(1)
for compilation.
# "$ARG" is equal to the first argument given to Nocode
$(clang-format | tee "$ARG" | gcc -x c -)
The next step is to check if the script was called in a git repository, if not the user is prompted to initialize one. If the user refuses, the script stops and the generated C file is saved.
# Check if we're it a git repository
$(git status &>/dev/null)
if [ "$?" -ne 0 ]; then
read -p "Not a git repository, do you want to create one? [Y/n] " USERCREATEGITINPUT
if [ "$USERCREATEGITINPUT" = "n" ]; then
echo "nocode.sh: leaving file as is"
exit 0
fi
$(git init &>/dev/null)
fi
To finish everything off, the file is added and committed to the repository before finally being deleted.
# Perform all git actions except push, left up to the user
$(git add "$ARG" &>/dev/null)
$(git commit -m "$ARG: update" &>/dev/null)
# Remove file because we're #NoCodeCompliant
$(rm "$ARG")
Of course, not all of the boilerplate is presented here because it is not very interesting. The scource code is available on GitHub. Issues and PRs are welcome!
Usage
All you have to do to use Nocode
is call it with the filename you want to
save, as follows:
./nocode.sh filename.c
Once you are done writing your code on STDIN
, you can use CTRL+D
to send
an EOF
in order to tell clang-format
that you are done typing.
Pushing the code to the repository’s remote is left up to the user in order to avoid dealing with git credentials.