mirror of
https://codeberg.org/hyperreal/nushell-config
synced 2024-11-25 12:23:42 +01:00
Nushell, who dis?
This commit is contained in:
commit
782e6cd8a1
196
config.nu
Normal file
196
config.nu
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
# Nushell Config File
|
||||||
|
#
|
||||||
|
# version = "0.90.1"
|
||||||
|
|
||||||
|
# Command existence checker function
|
||||||
|
def 'is-installed' [ app: string ] {
|
||||||
|
((which $app | length) > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git aliases
|
||||||
|
export alias ga = git add
|
||||||
|
export alias gcl = git clone
|
||||||
|
export alias gcmsg = git commit -m
|
||||||
|
export alias gd = git diff
|
||||||
|
export alias gl = git pull
|
||||||
|
export alias gp = git push
|
||||||
|
export alias gr = git remote
|
||||||
|
export alias grbi = git rebase -i
|
||||||
|
export alias grm = git rm
|
||||||
|
export alias grv = git remote -v
|
||||||
|
export alias gst = git status
|
||||||
|
|
||||||
|
# Doom Emacs
|
||||||
|
def doomdoc [] { ~/.config/emacs/bin/doom doctor }
|
||||||
|
def dsync [] { ~/.config/emacs/bin/doom sync }
|
||||||
|
def dclean [] { ~/.config/emacs/bin/doom clean }
|
||||||
|
def dcomp [] { ~/.config/emacs/bin/doom compile }
|
||||||
|
def dpurge [] { ~/.config/emacs/bin/doom purge }
|
||||||
|
def denv [] { ~/.config/emacs/bin/doom env }
|
||||||
|
def dupgrade [] { ~/.config/emacs/bin/doom upgrade }
|
||||||
|
|
||||||
|
# firewalld
|
||||||
|
export alias fw = sudo firewall-cmd
|
||||||
|
export alias fwp = sudo firewall-cmd --permanent
|
||||||
|
export alias fwr = sudo firewall-cmd --reload
|
||||||
|
export alias fwrp = sudo firewall-cmd --runtime-to-permanent
|
||||||
|
|
||||||
|
# Execute bash on host (atomic desktop)
|
||||||
|
export alias hostexec = distrobox-host-exec bash
|
||||||
|
|
||||||
|
# Aliases for APT
|
||||||
|
export alias acs = sudo apt-cache search
|
||||||
|
export alias acp = sudo apt-cache policy
|
||||||
|
export alias afs = sudo apt-file search
|
||||||
|
export alias afu = sudo apt-file update
|
||||||
|
export alias aac = sudo apt autoclean
|
||||||
|
export alias agc = sudo apt clean
|
||||||
|
export alias agi = sudo apt install
|
||||||
|
export alias agli = sudo apt list --installed
|
||||||
|
export alias agp = sudo apt purge
|
||||||
|
export alias agr = sudo apt remove
|
||||||
|
export alias agu = sudo apt update
|
||||||
|
export alias agud = sudo apt update and sudo apt dist-upgrade
|
||||||
|
export alias agar = sudo apt autoremove
|
||||||
|
|
||||||
|
# Aliases for DNF
|
||||||
|
export alias dnfc = sudo dnf clean all
|
||||||
|
export alias dnfi = sudo dnf install
|
||||||
|
export alias dnfu = sudo dnf update
|
||||||
|
export alias dnfr = sudo dnf remove
|
||||||
|
export alias dnfs = sudo dnf search
|
||||||
|
|
||||||
|
# Copy SSH public key to clipboard
|
||||||
|
def pubkey [] { open --raw ~/.ssh/id_ed25519.pub | str trim | xclip -selection clipboard }
|
||||||
|
|
||||||
|
# Get public ip info
|
||||||
|
def pubip [] { curl --silent ipinfo.io | from json }
|
||||||
|
|
||||||
|
# Get Mullvad info
|
||||||
|
def amimulvad [] { curl -sSL https://am.i.mullvad/json | from json }
|
||||||
|
|
||||||
|
# Uptime info
|
||||||
|
def upt [] { uptime | jc --uptime | from json }
|
||||||
|
|
||||||
|
# df info
|
||||||
|
def dfj [] { df | jc --df | from json }
|
||||||
|
|
||||||
|
# /etc/fstab info
|
||||||
|
def etc-fstab [] { open --raw /etc/fstab | jc --fstab | from json }
|
||||||
|
|
||||||
|
# memory free info
|
||||||
|
def memfree [] { free | jc --free | from json }
|
||||||
|
|
||||||
|
# /etc/group
|
||||||
|
def etc-group [] { open --raw /etc/group | jc --group | from json }
|
||||||
|
|
||||||
|
# /etc/passwd
|
||||||
|
def etc-passwd [] { open --raw /etc/passwd | jc --passwd | from json }
|
||||||
|
|
||||||
|
# Network connections
|
||||||
|
def netcons [] { lsof -i | jc --lsof | from json }
|
||||||
|
|
||||||
|
# Ports
|
||||||
|
def tulp [] { ss -tulp | jc --ss | from json }
|
||||||
|
|
||||||
|
# Open ports
|
||||||
|
def openports [] { sudo lsof -i | jc --lsof | from json | find "LISTEN" }
|
||||||
|
|
||||||
|
# List sockets in use
|
||||||
|
def lsock [] { sudo lsof -i P | jc --lsof | from json }
|
||||||
|
|
||||||
|
# List UDP sockets in use
|
||||||
|
def lsocku [] { sudo lsof -nP | jc --lsof | from json | find "UDP" }
|
||||||
|
|
||||||
|
# List TCP sockets in use
|
||||||
|
def lsockt [] { sudo lsof -nP | jc --lsof | from json | find "TCP" }
|
||||||
|
|
||||||
|
# Print timestamp as %FT%T%:z
|
||||||
|
def tstampz [] { date now | format date "%FT%T%:z" }
|
||||||
|
|
||||||
|
# Create new directory and enter it
|
||||||
|
def --env mkd [path] { mkdir $path; cd $path }
|
||||||
|
|
||||||
|
# Display pid info of command
|
||||||
|
def pids [cmd] { ps | where name == "$cmd" }
|
||||||
|
|
||||||
|
# Get time in specific time zone
|
||||||
|
def whattimein [string] { date now | date to-timezone $string }
|
||||||
|
|
||||||
|
# cd to home and clear screen
|
||||||
|
def --env rsrc [] { cd $env.HOME; clear }
|
||||||
|
|
||||||
|
# Convert filename to given case
|
||||||
|
# Ex. caseify camel hello_world.txt
|
||||||
|
# => helloWorld.txt
|
||||||
|
# Based on https://github.com/nushell/nu_scripts/blob/main/sourced/cool-oneliners/file_convert_naming_case.nu
|
||||||
|
def caseify [case: string, filename: path] {
|
||||||
|
let ext = (echo $filename | path parse | get extension)
|
||||||
|
let cur_stem = (echo $filename | path parse | get stem)
|
||||||
|
let new_name = match $case {
|
||||||
|
"camel" => (((echo $cur_stem | str camel-case) + "." + $ext) | str join),
|
||||||
|
"kebab" => (((echo $cur_stem | str kebab-case) + "." + $ext) | str join),
|
||||||
|
"lower" => (((echo $cur_stem | str downcase) + "." + $ext) | str join),
|
||||||
|
"pascal" => (((echo $cur_stem | str pascal-case) + "." + $ext) | str join),
|
||||||
|
"screamsnake" => (((echo $cur_stem | str screaming-snake-case) + "." + $ext) | str join),
|
||||||
|
"snake" => (((echo $cur_stem | str snake-case) + "." + $ext) | str join),
|
||||||
|
_ => "Invalid case option"
|
||||||
|
}
|
||||||
|
mv $filename $new_name
|
||||||
|
}
|
||||||
|
|
||||||
|
# weather
|
||||||
|
use ~/.config/nushell/modules/get-weather.nu get_weather
|
||||||
|
export alias weather = get_weather
|
||||||
|
|
||||||
|
# ultimate-extractor
|
||||||
|
use ~/.config/nushell/modules/ultimate-extractor.nu extract
|
||||||
|
def x [path] { extract $path }
|
||||||
|
|
||||||
|
# ssh
|
||||||
|
use ~/.config/nushell/modules/ssh.nu
|
||||||
|
|
||||||
|
def nussh [] {
|
||||||
|
let ssh_host = (ssh ssh-list | get Host | input list $"(ansi yellow)Which host to SSH into?(ansi reset)")
|
||||||
|
if ($ssh_host | describe) != "string" {
|
||||||
|
echo "Operation cancelled"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ssh $ssh_host
|
||||||
|
}
|
||||||
|
|
||||||
|
def nulicense [] {
|
||||||
|
let licenses = (http get https://api.github.com/licenses)
|
||||||
|
let license_name = ($licenses | get name | input list $"(ansi yellow)Choose an open source license:(ansi reset)")
|
||||||
|
if ($license_name | describe) != "string" {
|
||||||
|
echo "Operation cancelled"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let license_body = (http get ($licenses | where name == $license_name).url.0).body
|
||||||
|
$license_body | save --raw -f LICENSE
|
||||||
|
}
|
||||||
|
|
||||||
|
def yaml2json [filename: path] {
|
||||||
|
let stem = (echo $filename | path parse | get stem)
|
||||||
|
open --raw $filename | from yaml | to json | save --raw ($stem + ".json" | str join)
|
||||||
|
}
|
||||||
|
|
||||||
|
$env.config = {
|
||||||
|
rm: {
|
||||||
|
always_trash: true
|
||||||
|
}
|
||||||
|
|
||||||
|
table: {
|
||||||
|
show_empty: false
|
||||||
|
}
|
||||||
|
|
||||||
|
keybindings: [
|
||||||
|
{
|
||||||
|
name: nussh
|
||||||
|
modifier: alt
|
||||||
|
keycode: char_s
|
||||||
|
mode: [emacs vi_normal vi_insert]
|
||||||
|
event: { send: executehostcommand cmd: nussh }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
104
env.nu
Normal file
104
env.nu
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# Nushell Environment Config File
|
||||||
|
#
|
||||||
|
# version = "0.90.1"
|
||||||
|
|
||||||
|
def create_left_prompt [] {
|
||||||
|
let home = $nu.home-path
|
||||||
|
|
||||||
|
# Perform tilde substitution on dir
|
||||||
|
# To determine if the prefix of the path matches the home dir, we split the current path into
|
||||||
|
# segments, and compare those with the segments of the home dir. In cases where the current dir
|
||||||
|
# is a parent of the home dir (e.g. `/home`, homedir is `/home/user`), this comparison will
|
||||||
|
# also evaluate to true. Inside the condition, we attempt to str replace `$home` with `~`.
|
||||||
|
# Inside the condition, either:
|
||||||
|
# 1. The home prefix will be replaced
|
||||||
|
# 2. The current dir is a parent of the home dir, so it will be uneffected by the str replace
|
||||||
|
let dir = (
|
||||||
|
if ($env.PWD | path split | zip ($home | path split) | all { $in.0 == $in.1 }) {
|
||||||
|
($env.PWD | str replace $home "~")
|
||||||
|
} else {
|
||||||
|
$env.PWD
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
|
||||||
|
let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
|
||||||
|
let path_segment = $"($path_color)($dir)"
|
||||||
|
|
||||||
|
$path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
|
||||||
|
}
|
||||||
|
|
||||||
|
def create_right_prompt [] {
|
||||||
|
# create a right prompt in magenta with green separators and am/pm underlined
|
||||||
|
let time_segment = ([
|
||||||
|
(ansi reset)
|
||||||
|
(ansi magenta)
|
||||||
|
(date now | format date '[%H:%M:%S]') # try to respect user's locale
|
||||||
|
] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
|
||||||
|
str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")
|
||||||
|
|
||||||
|
let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
|
||||||
|
(ansi rb)
|
||||||
|
($env.LAST_EXIT_CODE)
|
||||||
|
] | str join)
|
||||||
|
} else { "" }
|
||||||
|
|
||||||
|
([$last_exit_code, (char space), $time_segment] | str join)
|
||||||
|
}
|
||||||
|
|
||||||
|
def is-container [] {
|
||||||
|
($env.container? | describe) == "string"
|
||||||
|
}
|
||||||
|
|
||||||
|
def create_user_host [] {
|
||||||
|
let user_host = (ansi red) + (whoami) + (ansi reset) + '@' + (ansi blue) + (hostname) + (ansi reset)
|
||||||
|
let container_segment = (ansi green_bold) + "⬢ " + (ansi reset)
|
||||||
|
let user_host_segment = (if (is-container) { ($container_segment + $user_host) | str join } else { $user_host })
|
||||||
|
|
||||||
|
([$user_host_segment, ":", (create_left_prompt)] | str join)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Use nushell functions to define your right and left prompt
|
||||||
|
$env.PROMPT_COMMAND = {|| create_user_host }
|
||||||
|
# FIXME: This default is not implemented in rust code as of 2023-09-08.
|
||||||
|
$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }
|
||||||
|
|
||||||
|
# The prompt indicators are environmental variables that represent
|
||||||
|
# the state of the prompt
|
||||||
|
$env.PROMPT_INDICATOR = {|| "> " }
|
||||||
|
$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
|
||||||
|
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
|
||||||
|
$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }
|
||||||
|
|
||||||
|
# Specifies how environment variables are:
|
||||||
|
# - converted from a string to a value on Nushell startup (from_string)
|
||||||
|
# - converted from a value back to a string when running external commands (to_string)
|
||||||
|
# Note: The conversions happen *after* config.nu is loaded
|
||||||
|
$env.ENV_CONVERSIONS = {
|
||||||
|
"PATH": {
|
||||||
|
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
|
||||||
|
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
|
||||||
|
}
|
||||||
|
"Path": {
|
||||||
|
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
|
||||||
|
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Directories to search for scripts when calling source or use
|
||||||
|
# The default for this is $nu.default-config-dir/scripts
|
||||||
|
$env.NU_LIB_DIRS = [
|
||||||
|
($nu.default-config-dir | path join 'scripts') # add <nushell-config-dir>/scripts
|
||||||
|
]
|
||||||
|
|
||||||
|
# Directories to search for plugin binaries when calling register
|
||||||
|
# The default for this is $nu.default-config-dir/plugins
|
||||||
|
$env.NU_PLUGIN_DIRS = [
|
||||||
|
($nu.default-config-dir | path join 'plugins') # add <nushell-config-dir>/plugins
|
||||||
|
]
|
||||||
|
|
||||||
|
# To add entries to PATH (on Windows you might use Path), you can use the following pattern:
|
||||||
|
# $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path')
|
||||||
|
let gopath = ($env.HOME + '/go/bin' | str join)
|
||||||
|
$env.PATH = ($env.PATH | split row (char esep) | prepend $gopath)
|
315
modules/get-weather.nu
Normal file
315
modules/get-weather.nu
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
# From https://github.com/nushell/nu_scripts/blob/main/modules/weather/get-weather.nu
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
## Weather Script based on IP Address v1.0
|
||||||
|
###################################################
|
||||||
|
def locations [] {
|
||||||
|
[
|
||||||
|
[location city_column state_column country_column lat_column lon_column];
|
||||||
|
["http://ip-api.com/json/" city region countryCode lat lon]
|
||||||
|
["https://ipapi.co/json/" city region_code country_code latitude longitude]
|
||||||
|
# ["https://freegeoip.app/json/" city region_code country_code latitude longitude] # doesn't appear to be free any longer
|
||||||
|
["https://ipwhois.app/json/" city region country_code latitude longitude]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_my_location [index: int] {
|
||||||
|
let loc_json = (http get (locations | select $index).0.location)
|
||||||
|
let city_column = (locations | select $index).0.city_column
|
||||||
|
let state_column = (locations | select $index).0.state_column
|
||||||
|
let country_column = (locations | select $index).0.country_column
|
||||||
|
let lat_column = (locations | select $index).0.lat_column
|
||||||
|
let lon_column = (locations | select $index).0.lon_column
|
||||||
|
|
||||||
|
# echo $loc_json
|
||||||
|
if ($city_column | str length) > 1 {
|
||||||
|
if ($state_column | str length) > 1 {
|
||||||
|
if ($country_column | str length) > 1 {
|
||||||
|
let lookup_state = ($loc_json | get ($state_column))
|
||||||
|
if ($lookup_state | str length) > 2 {
|
||||||
|
let state = (state_abbrev_lookup $lookup_state)
|
||||||
|
$"($loc_json | get ($city_column)),($state),($loc_json | get ($country_column))"
|
||||||
|
} else {
|
||||||
|
$"($loc_json | get ($city_column)),($loc_json | get ($state_column)),($loc_json | get ($country_column))"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$"($loc_json | get ($city_column)),($loc_json | get ($state_column))"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$"($loc_json | get ($city_column))"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"No City Found"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_location_by_ip [locIdx: int, token: string] {
|
||||||
|
let URL_QUERY_LOCATION = "https://api.openweathermap.org/geo/1.0/direct"
|
||||||
|
let location = (get_my_location $locIdx)
|
||||||
|
let url = $"($URL_QUERY_LOCATION)?q=($location)&limit=5&appid=($token)"
|
||||||
|
http get $url
|
||||||
|
}
|
||||||
|
|
||||||
|
def show-error [msg label err] {
|
||||||
|
let span = (metadata $err).span;
|
||||||
|
error make {msg: $msg, label: {text: $label, span: $span } }
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_weather_by_ip [locIdx: int, units: string, token: string] {
|
||||||
|
# units
|
||||||
|
# f = imperial aka Fahrenheit
|
||||||
|
# c = metric aka Celcius
|
||||||
|
let URL_WEATHER = "https://api.openweathermap.org/data/2.5/weather"
|
||||||
|
let URL_FORECAST = "http://api.openweathermap.org/data/2.5/forecast/daily"
|
||||||
|
let coords = (get_location_by_ip $locIdx $token)
|
||||||
|
if ($coords | length) > 1 {
|
||||||
|
show-error "Error getting location" "There were more than one locations found" $coords
|
||||||
|
}
|
||||||
|
|
||||||
|
if $units == "f" {
|
||||||
|
let units = "imperial"
|
||||||
|
let url = $"($URL_WEATHER)?lat=($coords.lat.0)&lon=($coords.lon.0)&units=($units)&appid=($token)"
|
||||||
|
let url_forecast = $"($URL_FORECAST)?lat=($coords.lat.0)&lon=($coords.lon.0)&units=($units)&appid=($token)"
|
||||||
|
let weather = (http get $url)
|
||||||
|
let forecast_data = (http get $url_forecast)
|
||||||
|
let forecast = ($forecast_data.list | each {|day|
|
||||||
|
{
|
||||||
|
id: ($day.weather.0.id)
|
||||||
|
dt: ($day.dt * 1_000_000_000 | into string | into datetime -z local | format date '%a, %b %e') #'%Y-%m-%d')
|
||||||
|
high: ($day.temp.max)
|
||||||
|
low: ($day.temp.min)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let day1 = $"($forecast | get 0.dt) (get_emoji_by_id ($forecast | get 0.id | into string)) high: ($forecast | get 0.high | into string -d 1) low: ($forecast | get 0.low | into string -d 1)"
|
||||||
|
let day2 = $"($forecast | get 1.dt) (get_emoji_by_id ($forecast | get 1.id | into string)) high: ($forecast | get 1.high | into string -d 1) low: ($forecast | get 1.low | into string -d 1)"
|
||||||
|
let day3 = $"($forecast | get 2.dt) (get_emoji_by_id ($forecast | get 2.id | into string)) high: ($forecast | get 2.high | into string -d 1) low: ($forecast | get 2.low | into string -d 1)"
|
||||||
|
let day4 = $"($forecast | get 3.dt) (get_emoji_by_id ($forecast | get 3.id | into string)) high: ($forecast | get 3.high | into string -d 1) low: ($forecast | get 3.low | into string -d 1)"
|
||||||
|
let day5 = $"($forecast | get 4.dt) (get_emoji_by_id ($forecast | get 4.id | into string)) high: ($forecast | get 4.high | into string -d 1) low: ($forecast | get 4.low | into string -d 1)"
|
||||||
|
let day6 = $"($forecast | get 5.dt) (get_emoji_by_id ($forecast | get 5.id | into string)) high: ($forecast | get 5.high | into string -d 1) low: ($forecast | get 5.low | into string -d 1)"
|
||||||
|
let day7 = $"($forecast | get 6.dt) (get_emoji_by_id ($forecast | get 6.id | into string)) high: ($forecast | get 6.high | into string -d 1) low: ($forecast | get 6.low | into string -d 1)"
|
||||||
|
{
|
||||||
|
'Weather Location': $"($weather.name), ($weather.sys.country)"
|
||||||
|
Longitude: $weather.coord.lon
|
||||||
|
Latitude: $weather.coord.lat
|
||||||
|
Temperature: $"($weather.main.temp | into string -d 1) °F"
|
||||||
|
'Feels Like': $"($weather.main.feels_like | into string -d 1) °F"
|
||||||
|
Humidity: $weather.main.humidity
|
||||||
|
Pressure: $weather.main.pressure
|
||||||
|
Emoji: (get_icon_from_table $weather.weather.main.0)
|
||||||
|
'Forecast Day 1': $day1
|
||||||
|
'Forecast Day 2': $day2
|
||||||
|
'Forecast Day 3': $day3
|
||||||
|
'Forecast Day 4': $day4
|
||||||
|
'Forecast Day 5': $day5
|
||||||
|
'Forecast Day 6': $day6
|
||||||
|
'Forecast Day 7': $day7
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let units = "metric"
|
||||||
|
let url = $"($URL_WEATHER)?lat=($coords.lat.0)&lon=($coords.lon.0)&units=($units)&appid=($token)"
|
||||||
|
let url_forecast = $"($URL_FORECAST)?lat=($coords.lat.0)&lon=($coords.lon.0)&units=($units)&appid=($token)"
|
||||||
|
let weather = (http get $url)
|
||||||
|
let forecast_data = (http get $url_forecast)
|
||||||
|
let forecast = ($forecast_data.list | each {|day|
|
||||||
|
{
|
||||||
|
id: ($day.weather.0.id)
|
||||||
|
dt: ($day.dt * 1_000_000_000 | into string | into datetime -z local | format date '%a, %b %e') #'%Y-%m-%d')
|
||||||
|
high: ($day.temp.max)
|
||||||
|
low: ($day.temp.min)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let day1 = $"($forecast | get 0.dt) (get_emoji_by_id ($forecast | get 0.id | into string)) high: ($forecast | get 0.high | into string -d 1) low: ($forecast | get 0.low | into string -d 1)"
|
||||||
|
let day2 = $"($forecast | get 1.dt) (get_emoji_by_id ($forecast | get 1.id | into string)) high: ($forecast | get 1.high | into string -d 1) low: ($forecast | get 1.low | into string -d 1)"
|
||||||
|
let day3 = $"($forecast | get 2.dt) (get_emoji_by_id ($forecast | get 2.id | into string)) high: ($forecast | get 2.high | into string -d 1) low: ($forecast | get 2.low | into string -d 1)"
|
||||||
|
let day4 = $"($forecast | get 3.dt) (get_emoji_by_id ($forecast | get 3.id | into string)) high: ($forecast | get 3.high | into string -d 1) low: ($forecast | get 3.low | into string -d 1)"
|
||||||
|
let day5 = $"($forecast | get 4.dt) (get_emoji_by_id ($forecast | get 4.id | into string)) high: ($forecast | get 4.high | into string -d 1) low: ($forecast | get 4.low | into string -d 1)"
|
||||||
|
let day6 = $"($forecast | get 5.dt) (get_emoji_by_id ($forecast | get 5.id | into string)) high: ($forecast | get 5.high | into string -d 1) low: ($forecast | get 5.low | into string -d 1)"
|
||||||
|
let day7 = $"($forecast | get 6.dt) (get_emoji_by_id ($forecast | get 6.id | into string)) high: ($forecast | get 6.high | into string -d 1) low: ($forecast | get 6.low | into string -d 1)"
|
||||||
|
{
|
||||||
|
'Weather Location': $"($weather.name), ($weather.sys.country)"
|
||||||
|
Longitude: $weather.coord.lon
|
||||||
|
Latitude: $weather.coord.lat
|
||||||
|
Temperature: $"($weather.main.temp | into string -d 1) °C"
|
||||||
|
'Feels Like': $"($weather.main.feels_like | into string -d 1) °C"
|
||||||
|
Humidity: $weather.main.humidity
|
||||||
|
Pressure: $weather.main.pressure
|
||||||
|
Emoji: (get_icon_from_table $weather.weather.main.0)
|
||||||
|
'Forecast Day 1': $day1
|
||||||
|
'Forecast Day 2': $day2
|
||||||
|
'Forecast Day 3': $day3
|
||||||
|
'Forecast Day 4': $day4
|
||||||
|
'Forecast Day 5': $day5
|
||||||
|
'Forecast Day 6': $day6
|
||||||
|
'Forecast Day 7': $day7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def weather_emoji_table [] {
|
||||||
|
{
|
||||||
|
Clear: (char sun)
|
||||||
|
Clouds: (char clouds)
|
||||||
|
Rain: (char rain)
|
||||||
|
Fog: (char fog)
|
||||||
|
Mist: (char mist)
|
||||||
|
Haze: (char haze)
|
||||||
|
Snow: (char snow)
|
||||||
|
Thunderstorm: (char thunderstorm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_icon_from_table [w] {
|
||||||
|
weather_emoji_table | get $w
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the local weather by ip address
|
||||||
|
export def get_weather [
|
||||||
|
--locIdx(-l): int # The location id 0-2
|
||||||
|
--units(-u): string # The units "f" or "c"
|
||||||
|
] {
|
||||||
|
let token = "85a4e3c55b73909f42c6a23ec35b7147"
|
||||||
|
|
||||||
|
let is_loc_empty = ($locIdx == null)
|
||||||
|
let is_units_empty = ($units == null)
|
||||||
|
|
||||||
|
let no_loc_no_unit = ($is_loc_empty == true and $is_units_empty == true)
|
||||||
|
let no_loc_with_unit = ($is_loc_empty == true and $is_units_empty == false)
|
||||||
|
let with_loc_no_unit = ($is_loc_empty == false and $is_units_empty == true)
|
||||||
|
let with_loc_with_unit = ($is_loc_empty == false and $is_units_empty == false)
|
||||||
|
|
||||||
|
# This is a cautionary tale, the commented out code below is returning
|
||||||
|
# and autoview is viewing the data, so no structured data is being returned.
|
||||||
|
# The ramification to this is you can't do get_weather | select Temperature Emoji
|
||||||
|
# like you should be able to. The following uncommented section below fixes it.
|
||||||
|
|
||||||
|
# Hopefully we'll be able to fix this somehow because it's easy to fall into
|
||||||
|
# this hole without knowing.
|
||||||
|
|
||||||
|
# if $no_loc_no_unit {
|
||||||
|
# echo "no_loc_no_unit"
|
||||||
|
# (get_weather_by_ip 0 "f")
|
||||||
|
# } { }
|
||||||
|
|
||||||
|
# if $no_loc_with_unit {
|
||||||
|
# echo "no_loc_with_unit"
|
||||||
|
# (get_weather_by_ip 0 $units)
|
||||||
|
# } { }
|
||||||
|
|
||||||
|
# if $with_loc_no_unit {
|
||||||
|
# echo "with_loc_no_unit"
|
||||||
|
# (get_weather_by_ip $locIdx "f")
|
||||||
|
# } { }
|
||||||
|
|
||||||
|
# if $with_loc_with_unit {
|
||||||
|
# echo "with_loc_with_unit"
|
||||||
|
# (get_weather_by_ip $locIdx $units)
|
||||||
|
# } { }
|
||||||
|
|
||||||
|
if $no_loc_no_unit {
|
||||||
|
(get_weather_by_ip 0 "f" $token)
|
||||||
|
} else if $no_loc_with_unit {
|
||||||
|
(get_weather_by_ip 0 $units $token)
|
||||||
|
} else if $with_loc_no_unit {
|
||||||
|
(get_weather_by_ip $locIdx "f" $token)
|
||||||
|
} else if $with_loc_with_unit {
|
||||||
|
(get_weather_by_ip $locIdx $units $token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def state_abbrev_lookup [state_name: string] {
|
||||||
|
# Weather Location 3 does not return state name abbreviations
|
||||||
|
# so we have to convert a state full name to a state abbreviation
|
||||||
|
let lookup_table = {
|
||||||
|
Alabama: AL
|
||||||
|
Alaska: AK
|
||||||
|
Arizona: AZ
|
||||||
|
Arkansas: AR
|
||||||
|
California: CA
|
||||||
|
Colorado: CO
|
||||||
|
Connecticut: CT
|
||||||
|
Delaware: DE
|
||||||
|
Florida: FL
|
||||||
|
Georgia: GA
|
||||||
|
Hawaii: HI
|
||||||
|
Idaho: ID
|
||||||
|
Illinois: IL
|
||||||
|
Indiana: IN
|
||||||
|
Iowa: IA
|
||||||
|
Kansas: KS
|
||||||
|
Kentucky: KY
|
||||||
|
Louisiana: LA
|
||||||
|
Maine: ME
|
||||||
|
Maryland: MD
|
||||||
|
Massachusetts: MA
|
||||||
|
Michigan: MI
|
||||||
|
Minnesota: MN
|
||||||
|
Mississippi: MS
|
||||||
|
Missouri: MO
|
||||||
|
Montana: MT
|
||||||
|
Nebraska: NE
|
||||||
|
Nevada: NV
|
||||||
|
'New Hampshire': NH
|
||||||
|
'New Jersey': NJ
|
||||||
|
'New Mexico': NM
|
||||||
|
'New York': NY
|
||||||
|
'North Carolina': NC
|
||||||
|
'North Dakota': ND
|
||||||
|
Ohio: OH
|
||||||
|
Oklahoma: OK
|
||||||
|
Oregon: OR
|
||||||
|
Pennsylvania: PA
|
||||||
|
'Rhode Island': RI
|
||||||
|
'South Carolina': SC
|
||||||
|
'South Dakota': SD
|
||||||
|
Tennessee: TN
|
||||||
|
Texas: TX
|
||||||
|
Utah: UT
|
||||||
|
Vermont: VT
|
||||||
|
Virginia: VA
|
||||||
|
Washington: WA
|
||||||
|
'West Virginia': WV
|
||||||
|
Wisconsin: WI
|
||||||
|
Wyoming: WY
|
||||||
|
}
|
||||||
|
|
||||||
|
$lookup_table | get $state_name
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_emoji_by_id [id] {
|
||||||
|
let emoji_dict = ({
|
||||||
|
"200": "⚡", "201": "⚡", "202": "⚡", "210": "⚡", "211": "⚡", "212": "⚡", "221": "⚡", "230": "⚡",
|
||||||
|
"231": "⚡", "232": "⚡",
|
||||||
|
"300": "☔", "301": "☔", "302": "☔", "310": "☔", "311": "☔",
|
||||||
|
"312": "☔", "313": "☔", "314": "☔", "321": "☔",
|
||||||
|
"500": "☔", "501": "☔", "502": "☔", "503": "☔", "504": "☔",
|
||||||
|
"511": "☔", "520": "☔", "521": "☔", "522": "☔", "531": "☔",
|
||||||
|
"600": "❄️", "601": "❄️", "602": "❄️", "611": "❄️", "612": "❄️",
|
||||||
|
"613": "❄️", "615": "❄️", "616": "❄️", "620": "❄️", "621": "❄️",
|
||||||
|
"622": "❄️",
|
||||||
|
"701": "🌫️", "711": "🌫️", "721": "🌫️", "731": "🌫️", "741": "🌫️", "751": "🌫️", "761": "🌫️", "762": "🌫️",
|
||||||
|
"771": "🌫️",
|
||||||
|
"781": "🌀",
|
||||||
|
"800": "☀️",
|
||||||
|
"801": "🌤️", "802": "🌤️", "803": "☁️", "804": "☁️",
|
||||||
|
})
|
||||||
|
|
||||||
|
($emoji_dict | get $id)
|
||||||
|
}
|
||||||
|
|
||||||
|
# To run this call
|
||||||
|
# > get_weather
|
||||||
|
# it will default to location 0 and Fahrenheit degrees
|
||||||
|
# > get_weather -l 1
|
||||||
|
# This changes to location 1. Locations are listed in the locations custom command above
|
||||||
|
# > get_weather -l 2 -u c
|
||||||
|
# This uses location 2 and Celcius degrees. f = Fahrenheit, c = Celcius
|
||||||
|
|
||||||
|
# Since I live in the USA I have not tested outside the country.
|
||||||
|
# We'll take PRs for things that are broke or augmentations.
|
||||||
|
|
||||||
|
# HOW TO USE
|
||||||
|
# put this in your config.nu file
|
||||||
|
# use /path/to/get-weather.nu get_weather
|
||||||
|
#
|
||||||
|
# then from the nushell commmand prompt type
|
||||||
|
# get_weather
|
135
modules/ssh.nu
Normal file
135
modules/ssh.nu
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
export def ensure-cache [cache paths action] {
|
||||||
|
mut cfgs = []
|
||||||
|
for i in $paths {
|
||||||
|
let cs = (do -i {ls $i})
|
||||||
|
if not ($cs | is-empty) {
|
||||||
|
$cfgs = ($cfgs | append $cs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let cfgs = $cfgs
|
||||||
|
let ts = ($cfgs | sort-by modified | reverse | get 0.modified)
|
||||||
|
if ($ts | is-empty) { return false }
|
||||||
|
let tc = (do -i { ls $cache | get 0.modified })
|
||||||
|
if not (($cache | path exists) and ($ts < $tc)) {
|
||||||
|
mkdir ($cache | path dirname)
|
||||||
|
do $action | save -f $cache
|
||||||
|
}
|
||||||
|
open $cache
|
||||||
|
}
|
||||||
|
|
||||||
|
export def 'str max-length' [] {
|
||||||
|
$in | reduce -f 0 {|x, a|
|
||||||
|
if ($x|is-empty) { return $a }
|
||||||
|
let l = ($x | str length)
|
||||||
|
if $l > $a { $l } else { $a }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def "nu-complete ssh host" [] {
|
||||||
|
rg -LNI '^Host [a-z0-9_\-\.]+' ~/.ssh | lines | each {|x| $x | split row ' '| get 1}
|
||||||
|
}
|
||||||
|
|
||||||
|
export def parse-ssh-file [group] {
|
||||||
|
$in
|
||||||
|
| parse -r '(?P<k>Host|HostName|User|Port|IdentityFile)\s+(?P<v>.+)'
|
||||||
|
| append { k: Host, v: null}
|
||||||
|
| reduce -f { rst: [], item: {Host: null} } {|it, acc|
|
||||||
|
if $it.k == 'Host' {
|
||||||
|
$acc | upsert rst ($acc.rst | append $acc.item)
|
||||||
|
| upsert item { Host : $it.v, HostName: null, Port: null, User: null, IdentityFile: null, Group: $group }
|
||||||
|
} else {
|
||||||
|
$acc | upsert item ($acc.item | upsert $it.k $it.v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| get rst
|
||||||
|
| where {|x| not (($x.Host | is-empty) or $x.Host =~ '\*')}
|
||||||
|
}
|
||||||
|
|
||||||
|
export def ssh-list [] {
|
||||||
|
rg -L -l 'Host' ~/.ssh
|
||||||
|
| lines
|
||||||
|
| each {|x| cat $x | parse-ssh-file $x}
|
||||||
|
| flatten
|
||||||
|
}
|
||||||
|
|
||||||
|
def fmt-group [p] {
|
||||||
|
$p | str replace $"($env.HOME)/.ssh/" ''
|
||||||
|
}
|
||||||
|
|
||||||
|
def "ssh-hosts" [] {
|
||||||
|
let cache = $'($env.HOME)/.cache/nu-complete/ssh.json'
|
||||||
|
ensure-cache $cache [~/.ssh/config ~/.ssh/config*/* ] { ||
|
||||||
|
let data = (ssh-list | each {|x|
|
||||||
|
let uri = $"($x.User)@($x.HostName):($x.Port)"
|
||||||
|
{
|
||||||
|
value: $x.Host,
|
||||||
|
uri: $uri,
|
||||||
|
group: $"(fmt-group $x.Group)",
|
||||||
|
identfile: $"($x.IdentityFile)",
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let max = {
|
||||||
|
value: ($data.value | str max-length),
|
||||||
|
uri: ($data.uri | str max-length),
|
||||||
|
group: ($data.group | str max-length),
|
||||||
|
identfile: ($data.identfile | str max-length),
|
||||||
|
}
|
||||||
|
|
||||||
|
{max: $max, completion: $data}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def "nu-complete ssh" [] {
|
||||||
|
let data = (ssh-hosts)
|
||||||
|
$data.completion
|
||||||
|
| each { |x|
|
||||||
|
let uri = ($x.uri | fill -a l -w $data.max.uri -c ' ')
|
||||||
|
let group = ($x.group | fill -a l -w $data.max.group -c ' ')
|
||||||
|
let id = ($x.identfile | fill -a l -w $data.max.identfile -c ' ')
|
||||||
|
{value: $x.value, description: $"\t($uri) ($group) ($id)" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export extern main [
|
||||||
|
host: string@"nu-complete ssh" # host
|
||||||
|
...cmd # cmd
|
||||||
|
-v # verbose
|
||||||
|
-i: string # key
|
||||||
|
-p: int # port
|
||||||
|
-N # n
|
||||||
|
-T # t
|
||||||
|
-L # l
|
||||||
|
-R # r
|
||||||
|
-D # d
|
||||||
|
-J: string # j
|
||||||
|
-W: string # w
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def "nu-complete scp" [cmd: string, offset: int] {
|
||||||
|
let argv = ($cmd | str substring ..$offset | split row ' ')
|
||||||
|
let p = if ($argv | length) > 2 { $argv | get 2 } else { $argv | get 1 }
|
||||||
|
let ssh = (ssh-hosts | get completion
|
||||||
|
| each {|x| {value: $"($x.value):" description: $x.uri} }
|
||||||
|
)
|
||||||
|
let n = ($p | split row ':')
|
||||||
|
if $"($n | get 0):" in ($ssh | get value) {
|
||||||
|
^ssh ($n | get 0) $"sh -c 'ls -dp ($n | get 1)*'"
|
||||||
|
| lines
|
||||||
|
| each {|x| $"($n | get 0):($x)"}
|
||||||
|
} else {
|
||||||
|
let files = (do -i {
|
||||||
|
ls -a $"($p)*"
|
||||||
|
| each {|x| if $x.type == dir { $"($x.name)/"} else { $x.name }}
|
||||||
|
})
|
||||||
|
$files | append $ssh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export def scp [
|
||||||
|
lhs: string@"nu-complete scp",
|
||||||
|
rhs: string@"nu-complete scp"
|
||||||
|
] {
|
||||||
|
^scp -r $lhs $rhs
|
||||||
|
}
|
28
modules/ultimate-extractor.nu
Normal file
28
modules/ultimate-extractor.nu
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# From https://github.com/nushell/nu_scripts/blob/main/modules/data_extraction/ultimate_extractor.nu
|
||||||
|
|
||||||
|
# Function to extract archives with different extensions.
|
||||||
|
export def extract [name:string] {
|
||||||
|
let handlers = [ [extension command];
|
||||||
|
['tar\.bz2|tbz|tbz2' 'tar xvjf']
|
||||||
|
['tar\.gz|tgz' 'tar xvzf']
|
||||||
|
['tar\.xz|txz' 'tar xvf']
|
||||||
|
['tar\.Z' 'tar xvZf']
|
||||||
|
['bz2' 'bunzip2']
|
||||||
|
['deb' 'ar x']
|
||||||
|
['gz' 'gunzip']
|
||||||
|
['pkg' 'pkgutil --expand']
|
||||||
|
['rar' 'unrar x']
|
||||||
|
['tar' 'tar xvf']
|
||||||
|
['xz' 'xz --decompress']
|
||||||
|
['zip|war|jar|nupkg' 'unzip']
|
||||||
|
['Z' 'uncompress']
|
||||||
|
['7z' '7za x']
|
||||||
|
]
|
||||||
|
let maybe_handler = ($handlers | where $name =~ $'\.(($it.extension))$')
|
||||||
|
if ($maybe_handler | is-empty) {
|
||||||
|
error make { msg: "unsupported file extension" }
|
||||||
|
} else {
|
||||||
|
let handler = ($maybe_handler | first)
|
||||||
|
nu -c ($handler.command + ' ' + $name)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user