diff options
-rw-r--r-- | .bashrc | 49 | ||||
-rw-r--r-- | .config/foot/foot.ini | 214 | ||||
-rw-r--r-- | .config/kak/kakrc | 19 | ||||
-rw-r--r-- | .config/sway/config | 255 | ||||
-rwxr-xr-x | .local/bin/rupload | 65 | ||||
-rwxr-xr-x | .local/bin/rws | 95 | ||||
-rwxr-xr-x | .local/bin/status.sh | 52 | ||||
-rwxr-xr-x | .local/bin/ud | 49 |
8 files changed, 798 insertions, 0 deletions
@@ -0,0 +1,49 @@ +# .bashrc + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +PS1='[\u@\h \W]\$ ' + +poezio () { ~/soft/poezio/launch.sh; } + +alias xqr='xbps-query -R' +alias xqrs='xbps-query -Rs' + +bind -s 'set completion-ignore-case on' + +runtimeify() { + sudo mkdir /run/user/1000 + sudo chown rebecca:rebecca /run/user/1000 + sudo chmod 700 /run/user/1000 + export XDG_RUNTIME_DIR=/run/user/1000 +} + +alias vz='kak ~/.bashrc' +alias sz='source ~/.bashrc' + +alias l='ls -lah' + +export SSH_AUTH_SOCK=/run/user/1000/ssh-agent.sock +( pgrep -u $USER ssh-agent || ssh-agent -a $SSH_AUTH_SOCK ; ) >/dev/null + +export XDG_CONFIG_HOME=$HOME/.config + +apwd () { + pwd | sed -e 's!'"$HOME"'!~!' +} + +set_title () { printf "\e]2;%s\e\\" "$1"; } +_lastcmd () { history 1 | sed -e 's/^ *[0-9]* *//g' ; } +trap 'set_title "$(_lastcmd)"' DEBUG +PROMPT_COMMAND='set_title "$(apwd)"' + +add_path () { + export PATH="$1:$PATH" +} + +add_path ~/.local/bin + +. ~/.local/bin/rws +gowork diff --git a/.config/foot/foot.ini b/.config/foot/foot.ini new file mode 100644 index 0000000..4965b4b --- /dev/null +++ b/.config/foot/foot.ini @@ -0,0 +1,214 @@ +# -*- conf -*- + +# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) +# term=foot (or xterm-256color if built with -Dterminfo=disabled) +# login-shell=no + +# app-id=foot +# title=foot +# locked-title=no + +font=Iosevka Fixed:size=8 +# font=monospace:size=8 +# font-bold=<bold variant of regular font> +# font-italic=<italic variant of regular font> +# font-bold-italic=<bold+italic variant of regular font> +# line-height=<font metrics> +# letter-spacing=0 +# horizontal-letter-offset=0 +# vertical-letter-offset=0 +# underline-offset=<font metrics> +# box-drawings-uses-font-glyphs=no +# dpi-aware=auto + +# initial-window-size-pixels=700x500 # Or, +# initial-window-size-chars=<COLSxROWS> +# initial-window-mode=windowed +# pad=2x2 # optionally append 'center' +# resize-delay-ms=100 + +# notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body} + +# bold-text-in-bright=no +# word-delimiters=,│`|:"'()[]{}<> +# selection-target=primary +# workers=<number of logical CPUs> + +[environment] +# name=value + +[bell] +# urgent=no +# notify=no +# command= +# command-focused=no + +[scrollback] +# lines=1000 +# multiplier=3.0 +# indicator-position=relative +# indicator-format= + +[url] +launch=firefox-wayland ${url} +# launch=xdg-open ${url} +# label-letters=sadfjklewcmpgh +# osc8-underline=url-mode +# protocols=http, https, ftp, ftps, file, gemini, gopher +# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[] + +[cursor] +# style=block +# color=<inverse foreground/background> +# blink=no +# beam-thickness=1.5 +# underline-thickness=<font underline thickness> + +[mouse] +# hide-when-typing=no +# alternate-scroll-mode=yes + +[colors] +# alpha=1.0 +foreground=dcdccc +background=000000 + +regular0=000000 +regular1=cd0000 +regular2=00cd00 +regular3=ffa500 +regular4=1e90ff +regular5=cd00cd +regular6=00cdcd +regular7=e5e5e5 + +bright0=7f7f7f +bright1=ff0000 +bright2=00ff00 +bright3=ffff00 +bright4=5c5cff +bright5=ff00ff +bright6=00ffff +bright7=ffffff +## Normal/regular colors (color palette 0-7) +# regular0=222222 # black +# regular1=cc9393 # red +# regular2=7f9f7f # green +# regular3=d0bf8f # yellow +# regular4=6ca0a3 # blue +# regular5=dc8cc3 # magenta +# regular6=93e0e3 # cyan +# regular7=dcdccc # white + +## Bright colors (color palette 8-15) +# bright0=666666 # bright black +# bright1=dca3a3 # bright red +# bright2=bfebbf # bright green +# bright3=f0dfaf # bright yellow +# bright4=8cd0d3 # bright blue +# bright5=fcace3 # bright magenta +# bright6=b3ffff # bright cyan +# bright7=ffffff # bright white + +## dimmed colors (see foot.ini(5) man page) +# dim0=<not set> +# ... +# dim7=<not-set> + +## The remaining 256-color palette +# 16 = <256-color palette #16> +# ... +# 255 = <256-color palette #255> + +## Misc colors +# selection-foreground=<inverse foreground/background> +# selection-background=<inverse foreground/background> +# jump-labels=<regular0> <regular3> # black-on-yellow +# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue +# search-box-no-match=<regular0> <regular1> # black-on-red +# search-box-match=<regular0> <regular3> # black-on-yellow +# urls=<regular3> + +[csd] +# preferred=server +# size=26 +# font=<primary font> +# color=<foreground color> +# hide-when-typing=no +# border-width=0 +# border-color=<csd.color> +# button-width=26 +# button-color=<background color> +# button-minimize-color=<regular4> +# button-maximize-color=<regular2> +# button-close-color=<regular1> + +[key-bindings] +# scrollback-up-page=Shift+Page_Up +# scrollback-up-half-page=none +# scrollback-up-line=none +# scrollback-down-page=Shift+Page_Down +# scrollback-down-half-page=none +# scrollback-down-line=none +# clipboard-copy=Control+Shift+c XF86Copy +# clipboard-paste=Control+Shift+v XF86Paste +# primary-paste=Shift+Insert +# search-start=Control+Shift+r +# font-increase=Control+plus Control+equal Control+KP_Add +# font-decrease=Control+minus Control+KP_Subtract +# font-reset=Control+0 Control+KP_0 +# spawn-terminal=Control+Shift+n +# minimize=none +# maximize=none +# fullscreen=none +# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none +# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none +# pipe-selected=[xargs -r firefox] none +# show-urls-launch=Control+Shift+u +# show-urls-copy=none +# show-urls-persistent=none +# prompt-prev=Control+Shift+z +# prompt-next=Control+Shift+x +# unicode-input=none +# noop=none + +[search-bindings] +# cancel=Control+g Control+c Escape +# commit=Return +# find-prev=Control+r +# find-next=Control+s +# cursor-left=Left Control+b +# cursor-left-word=Control+Left Mod1+b +# cursor-right=Right Control+f +# cursor-right-word=Control+Right Mod1+f +# cursor-home=Home Control+a +# cursor-end=End Control+e +# delete-prev=BackSpace +# delete-prev-word=Mod1+BackSpace Control+BackSpace +# delete-next=Delete +# delete-next-word=Mod1+d Control+Delete +# extend-to-word-boundary=Control+w +# extend-to-next-whitespace=Control+Shift+w +# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste +# primary-paste=Shift+Insert +# unicode-input=none + +[url-bindings] +# cancel=Control+g Control+c Control+d Escape +# toggle-url-visible=t + +[text-bindings] +# \x03=Mod4+c # Map Super+c -> Ctrl+c + +[mouse-bindings] +# selection-override-modifiers=Shift +# primary-paste=BTN_MIDDLE +# select-begin=BTN_LEFT +# select-begin-block=Control+BTN_LEFT +# select-extend=BTN_RIGHT +# select-extend-character-wise=Control+BTN_RIGHT +# select-word=BTN_LEFT-2 +# select-word-whitespace=Control+BTN_LEFT-2 +# select-row=BTN_LEFT-3 + +# vim: ft=dosini diff --git a/.config/kak/kakrc b/.config/kak/kakrc new file mode 100644 index 0000000..52a8a45 --- /dev/null +++ b/.config/kak/kakrc @@ -0,0 +1,19 @@ +add-highlighter global/ number-lines -relative +addhl global/ wrap -word +set -add global ui_options terminal_assistant=none +set -add global ui_options terminal_status_on_top=true + +set global indentwidth 0 +set global tabstop 4 + +hook global WinSetOption filetype=python %{ + set window indentwidth 4 + hook -once -always window WinSetOption filetype=.* %{ + set window indentwidth 0 + } +} + + +map global user <c> ':comment-line<ret>' -docstring 'comment line' +map global user <x> '<a-|>wl-copy<ret>' -docstring 'wl-copy' + diff --git a/.config/sway/config b/.config/sway/config new file mode 100644 index 0000000..77dad32 --- /dev/null +++ b/.config/sway/config @@ -0,0 +1,255 @@ +# Default config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term foot +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu bemenu-run | xargs swaymsg exec -- + +### Output configuration +# +# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) +output * bg /home/rebecca/Pictures/lagana.png stretch +# +# Example configuration: +# +# output HDMI-A-1 resolution 1920x1080 position 1920,0 +# +# You can get the names of your outputs by running: swaymsg -t get_outputs + +### Idle configuration +# +# Example configuration: +# +# exec swayidle -w \ +# timeout 300 'swaylock -f -c 000000' \ +# timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ +# before-sleep 'swaylock -f -c 000000' +# +# This will lock your screen after 300 seconds of inactivity, then turn off +# your displays after another 300 seconds, and turn your screens back on when +# resumed. It will also lock your screen before your computer goes to sleep. + +### Input configuration +# +# Example configuration: +# +# input "2:14:SynPS/2_Synaptics_TouchPad" { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# You can get the names of your inputs by running: swaymsg -t get_inputs +# Read `man 5 sway-input` for more information about this section. + +input * { + xkb_layout "gb,gb" + xkb_variant "dvorak," + xkb_options "grp:shifts_toggle,caps:swapescape" +} + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+d exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace 0 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace 0 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+Shift+v splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 40px + bindsym $down resize grow height 40px + bindsym $up resize shrink height 40px + bindsym $right resize grow width 40px + + # Ditto, with arrow keys + bindsym Left resize shrink width 40px + bindsym Down resize grow height 40px + bindsym Up resize shrink height 40px + bindsym Right resize grow width 40px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position bottom + + separator_symbol ' :: ' + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command ~/.local/bin/status.sh + + colors { + statusline #ffffff + background #323232 + inactive_workspace #434343 #323232 #5c5c5c + focused_workspace #df73ff #663399 #ffffff + } +} + +# things from old i3 conf +font pango:Iosevka Fixed 12 + +bindsym $mod+Shift+f exec "firefox-wayland" +bindsym $mod+b workspace back_and_forth +bindsym $mod+Shift+b move container to workspace back_and_forth + +bindsym $mod+apostrophe exec rws -queryws +bindsym $mod+Shift+apostrophe exec rws -queryws -m +exec rws -listen + +bindsym $mod+bracketleft workspace prev +bindsym $mod+bracketright workspace next +bindsym $mod+Shift+bracketleft move container to workspace prev +bindsym $mod+Shift+bracketright move container to workspace next + +set $lock swaylock -f --indicator-radius 400 --indicator-thickness 20 --ring-color df73ff --key-hl-color 663399 -K -c 000000 +bindsym $mod+o exec $lock +bindsym $mod+Shift+o exec $lock && zzz + +bindsym XF86AudioRaiseVolume exec 'amixer set Master 5%+' +bindsym XF86AudioLowerVolume exec 'amixer set Master 5%-' +bindsym XF86AudioMute exec 'amixer set Master toggle' + +client.focused #663399 #663399 #ffffff + +bindsym Print exec slurp|grim -g- -|feh - -.wG -A'[upload]rupload -x png %F' + +include /etc/sway/config.d/* + diff --git a/.local/bin/rupload b/.local/bin/rupload new file mode 100755 index 0000000..925fc0e --- /dev/null +++ b/.local/bin/rupload @@ -0,0 +1,65 @@ +#!/bin/sh + +if [ $# -eq 0 ]; then + printf '%s\n' "usage: $0 [-n] [-x override_ext] <filename>" >&2 + printf '\t%s\n' "-n: dry run (don't actually upload anything)" >&2 + printf '\t%s\n' "-x override_ext: set extension to override_ext on uploaded filename" >&2 + exit 1 +fi + +dry_run=0 +while [ $# -gt 1 ]; do + if [ "$1" = "-x" ]; then + override_ext=".$2" + shift 2 + elif [ "$1" = "-n" ]; then + dry_run=1 + shift + fi +done + +if [ ! -f "$1" ]; then + printf %s "$1: file does not exist" >&2 + exit 1 +fi + +REMOTE="do" +URLBASE="https://ubq323.website/files/" +REMOTEDIR="/srv/web/ubq/files/" + +ext="${1#*.}" +if [ "$ext" = "$1" ]; then + ext='.file' + bname="$(basename "$1")" +else + ext=".$ext" + bname="$(basename "$1" "$ext")" +fi +ext=${override_ext:-$ext} + +rbname="$(md5sum "$1"|cut -d' ' -f1|tr 'a-z' 'A-Z'|basenc -d --base16|basenc --base64|head -c8)" +rname="$rbname$ext" + +exists_already() { + ssh "$REMOTE" stat "$REMOTEDIR$1" 2>/dev/null >/dev/null + return $? +} + +while exists_already "$rname"; do + printf "%s exists already\n" "$rname" + rbname="${rbname}_" + rname="$rbname$ext" +done + +printf 'uploading to %s\n' "$rname" +if [ "$dry_run" -eq 1 ]; then + echo dryrun, not uploading anything + exit 0 +fi + +scp "$1" "${REMOTE}:$REMOTEDIR$rname" +ssh "$REMOTE" chmod a+r "$REMOTEDIR$rname" + +url="$URLBASE$rname" +printf %s "$url" | wl-copy +notify-send 'copied url to clipboard' "$url" diff --git a/.local/bin/rws b/.local/bin/rws new file mode 100755 index 0000000..ebee83c --- /dev/null +++ b/.local/bin/rws @@ -0,0 +1,95 @@ +#!/bin/sh + +# rebecca workspace +# +# source this from your shell rc file +# and also start rws -listen when you start sway + + +WSD=$XDG_RUNTIME_DIR/ws +mkdir -p $WSD + + + +wslist () { + # list workspaces, most-recently-used first + swaymsg -t get_workspaces | jq -rc '.[] | .name' | while read wsn; do + wsp=$WSD/"$(printf %s "$wsn" | base64)" + dt="$(stat -c '%Y' $wsp 2>/dev/null)" + if [ $? -eq 1 ]; then + dt=1 + fi + printf "%s\t%s\n" "$dt" "$wsn" + done | sort -nr | cut -f2- +} + +_escape() { + printf %s "$1" | sed -e 's*\\*\\\\*g' -e 's*"*\\"*g' +} + +workin () { + # cds to the given directory, then moves focused window to workspace + # with that name + if [ ! -d "$1" ]; then + printf "not a directory\n" >&2 + return 1 + else + cd "$1" + dirname="$(_escape "$(apwd)")" + swaymsg "move container to workspace \"$dirname\"" + swaymsg "workspace \"$dirname\"" + fi +} + + +curws () { + # prints name of current workspace + swaymsg -t get_workspaces \ + | jq -rc '.[] | select(.focused==true) | .name' +} +gowork() { + # cds to working directory for current workspace + d="$(curws|sed -e "s*^~*$HOME*")" + if [ -d "$d" ]; then + cd "$d" || return 1 + fi +} + +queryws () { + # uses bmenu to prompt for a workspace name, then switches to that workspace + # or if -m given, moves focused window to that workspace instead + wsn="$(wslist | bemenu -p workspace -l100 --fn 'Iosevka Fixed 16' --tf '#df73ff' --hf '#df73ff' --hb '#333333')" + [ -z "$wsn" ] && return + + if [ "$1" = "-m" ]; then + swaymsg "move container to workspace \"$(_escape "$wsn")\"" + else + swaymsg "workspace \"$(_escape "$wsn")\"" + fi +} + + +_onswitch () { + wsb=$(printf %s "$1" | base64) + touch ${WSD}/$wsb +} +# run rws -listen to listen for workspace changes, +# and keep track of that +if [ "$1" = "-listen" ]; then + swaymsg -rmt subscribe '[ "workspace" ]' | while read line; do + wsn="$(printf %s "$line" | jq -rc '.current.name')" + printf "%s\n" "$wsn" + _onswitch "$wsn" + done +fi + +# rws -queryws does the same thing as queryws +# because it needs to be runnable from sway cfg in order to keybind something for it +if [ "$1" = "-queryws" ]; then + shift + queryws $@ +fi + + + + diff --git a/.local/bin/status.sh b/.local/bin/status.sh new file mode 100755 index 0000000..5bd9e4c --- /dev/null +++ b/.local/bin/status.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +puts () { + printf %s "$1" +} + +escape () { + printf %s "$1" | sed -e 's*\\*\\\\*g' -e 's!"!\\"!g' +} + +block_basic () { + printf '{"full_text":"%s"},' "$1" +} +block_color () { + printf '{"full_text":"%s","color":"%s"},' "$1" "$2" +} + +BDIR=/sys/class/power_supply/BAT0 + +# header +printf '%s\n' '{"version":1}' +puts '[' + +while true; do + puts '[' + + volinfo="$(amixer get Master | grep 'Mono:')" + vol_level="$(printf %s "$volinfo" | awk -F'[][]' '{print $2}')" + vol_enabled="$(printf %s "$volinfo" | awk -F'[][]' '{print $6}')" + color="#ffffff"; bl=""; br="" + [ "$vol_enabled" = "off" ] && { color="#ffff00"; bl="("; br=")"; } + block_color "vol $bl$vol_level$br" "$color" + + bat_status="$(cat $BDIR/status | tr 'a-z' 'A-Z' | head -c 3)" + bat_level="$(cat $BDIR/capacity)" + color="#ffffff" + if [ "$bat_level" -le 10 ]; then + color="#ff0000" + elif [ "$bat_level" -le 25 ]; then + color="#ffff00" + fi + block_color "$bat_status $bat_level%" "$color" + + date="$(date +'%a %Y-%m-%d %H:%M:%S')" + block_basic "$date" + + + puts '],' + sleep 1 + +done + diff --git a/.local/bin/ud b/.local/bin/ud new file mode 100755 index 0000000..a1a50ac --- /dev/null +++ b/.local/bin/ud @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# unidump version 0.1.1 +# made by ubq323 in the year 2021 +# please use this software for GOOD, not for EVIL + +import unicodedata +import sys + +uniquify = True +arg="" +args = sys.argv[1:] +while len(args) > 0: + arg = args.pop(0) + if arg[0] != '-' or arg == "--": + break + if arg == "-a": + uniquify = False + arg = "" + + +s = arg+" ".join(args) + +if len(s) == 0: + s = sys.stdin.read() + +def row(c): + try: + name = unicodedata.name(c).rjust(50) + except ValueError: + name = "?"*50 + + number = ("U+"+hex(ord(c))[2:].zfill(4)).rjust(7).upper() + + to_c = c + if c == '\n': + to_c = ' ' + + + + return f"{to_c} | {unicodedata.category(c)} | {name} | {number}" + +seen = set() +for c in s: + if uniquify: + if c in seen: + continue + seen.add(c) + print(row(c)) |