summaryrefslogtreecommitdiff
path: root/.config/nushell
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2025-02-08 08:16:07 +0100
committerMike Vink <mike@pionative.com>2025-02-08 08:16:07 +0100
commit7d30d2272ef59166c1b382cab324a400a42d577d (patch)
tree8f153f04818c7622b9cd2a3e1a18f9dcce1a1104 /.config/nushell
parentfd48011d2ef530b392df72e8685da4e8a2a54d1d (diff)
copy config
Diffstat (limited to '.config/nushell')
-rw-r--r--.config/nushell/config.nu921
-rw-r--r--.config/nushell/env.nu213
-rw-r--r--.config/nushell/history.txt1167
-rw-r--r--.config/nushell/login.nu14
-rw-r--r--.config/nushell/scripts/task.nu434
5 files changed, 2749 insertions, 0 deletions
diff --git a/.config/nushell/config.nu b/.config/nushell/config.nu
new file mode 100644
index 0000000..c13da9f
--- /dev/null
+++ b/.config/nushell/config.nu
@@ -0,0 +1,921 @@
+if ($env | default "" DOCKER_NAME | get DOCKER_NAME | is-empty) {
+ if (pidof gpg-agent | is-empty) { gpgconf --launch gpg-agent }
+ if ("~/.gnupg/S.gpg-agent.ssh" | path exists) {
+ ln -sf ("~/.gnupg/S.gpg-agent.ssh" | path expand) $env.SSH_AUTH_SOCK
+ }
+ # try {pnsh-nvim}
+}
+# Nushell Config File
+#
+# version = "0.99.1"
+
+# For more information on defining custom themes, see
+# https://www.nushell.sh/book/coloring_and_theming.html
+# And here is the theme collection
+# https://github.com/nushell/nu_scripts/tree/main/themes
+let dark_theme = {
+ # color for nushell primitives
+ separator: white
+ leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off
+ header: green_bold
+ empty: blue
+ # Closures can be used to choose colors for specific values.
+ # The value (in this case, a bool) is piped into the closure.
+ # eg) {|| if $in { 'light_cyan' } else { 'light_gray' } }
+ bool: light_cyan
+ int: white
+ filesize: cyan
+ duration: white
+ date: purple
+ range: white
+ float: white
+ string: white
+ nothing: white
+ binary: white
+ cell-path: white
+ row_index: green_bold
+ record: white
+ list: white
+ block: white
+ hints: dark_gray
+ search_result: { bg: red fg: white }
+ shape_and: purple_bold
+ shape_binary: purple_bold
+ shape_block: blue_bold
+ shape_bool: light_cyan
+ shape_closure: green_bold
+ shape_custom: green
+ shape_datetime: cyan_bold
+ shape_directory: cyan
+ shape_external: cyan
+ shape_externalarg: green_bold
+ shape_external_resolved: light_yellow_bold
+ shape_filepath: cyan
+ shape_flag: blue_bold
+ shape_float: purple_bold
+ # shapes are used to change the cli syntax highlighting
+ shape_garbage: { fg: white bg: red attr: b }
+ shape_glob_interpolation: cyan_bold
+ shape_globpattern: cyan_bold
+ shape_int: purple_bold
+ shape_internalcall: cyan_bold
+ shape_keyword: cyan_bold
+ shape_list: cyan_bold
+ shape_literal: blue
+ shape_match_pattern: green
+ shape_matching_brackets: { attr: u }
+ shape_nothing: light_cyan
+ shape_operator: yellow
+ shape_or: purple_bold
+ shape_pipe: purple_bold
+ shape_range: yellow_bold
+ shape_record: cyan_bold
+ shape_redirection: purple_bold
+ shape_signature: green_bold
+ shape_string: green
+ shape_string_interpolation: cyan_bold
+ shape_table: blue_bold
+ shape_variable: purple
+ shape_vardecl: purple
+ shape_raw_string: light_purple
+}
+
+let light_theme = {
+ # color for nushell primitives
+ separator: dark_gray
+ leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off
+ header: green_bold
+ empty: blue
+ # Closures can be used to choose colors for specific values.
+ # The value (in this case, a bool) is piped into the closure.
+ # eg) {|| if $in { 'dark_cyan' } else { 'dark_gray' } }
+ bool: dark_cyan
+ int: dark_gray
+ filesize: cyan_bold
+ duration: dark_gray
+ date: purple
+ range: dark_gray
+ float: dark_gray
+ string: dark_gray
+ nothing: dark_gray
+ binary: dark_gray
+ cell-path: dark_gray
+ row_index: green_bold
+ record: dark_gray
+ list: dark_gray
+ block: dark_gray
+ hints: dark_gray
+ search_result: { fg: white bg: red }
+ shape_and: purple_bold
+ shape_binary: purple_bold
+ shape_block: blue_bold
+ shape_bool: light_cyan
+ shape_closure: green_bold
+ shape_custom: green
+ shape_datetime: cyan_bold
+ shape_directory: cyan
+ shape_external: cyan
+ shape_externalarg: green_bold
+ shape_external_resolved: light_purple_bold
+ shape_filepath: cyan
+ shape_flag: blue_bold
+ shape_float: purple_bold
+ # shapes are used to change the cli syntax highlighting
+ shape_garbage: { fg: white bg: red attr: b }
+ shape_glob_interpolation: cyan_bold
+ shape_globpattern: cyan_bold
+ shape_int: purple_bold
+ shape_internalcall: cyan_bold
+ shape_keyword: cyan_bold
+ shape_list: cyan_bold
+ shape_literal: blue
+ shape_match_pattern: green
+ shape_matching_brackets: { attr: u }
+ shape_nothing: light_cyan
+ shape_operator: yellow
+ shape_or: purple_bold
+ shape_pipe: purple_bold
+ shape_range: yellow_bold
+ shape_record: cyan_bold
+ shape_redirection: purple_bold
+ shape_signature: green_bold
+ shape_string: green
+ shape_string_interpolation: cyan_bold
+ shape_table: blue_bold
+ shape_variable: purple
+ shape_vardecl: purple
+ shape_raw_string: light_purple
+}
+
+# The default config record. This is where much of your global configuration is setup.
+$env.config = {
+ show_banner: true # true or false to enable or disable the welcome banner at startup
+
+ ls: {
+ use_ls_colors: true # use the LS_COLORS environment variable to colorize output
+ clickable_links: true # enable or disable clickable links. Your terminal has to support links.
+ }
+
+ rm: {
+ always_trash: false # always act as if -t was given. Can be overridden with -p
+ }
+
+ table: {
+ mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
+ index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
+ show_empty: true # show 'empty list' and 'empty record' placeholders for command output
+ padding: { left: 1, right: 1 } # a left right padding of each column in a table
+ trim: {
+ methodology: wrapping # wrapping or truncating
+ wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology
+ truncating_suffix: "..." # A suffix used by the 'truncating' methodology
+ }
+ header_on_separator: false # show header text on separator/border line
+ # abbreviated_row_count: 10 # limit data rows from top and bottom after reaching a set point
+ }
+
+ error_style: "fancy" # "fancy" or "plain" for screen reader-friendly error messages
+
+ # Whether an error message should be printed if an error of a certain kind is triggered.
+ display_errors: {
+ exit_code: false # assume the external command prints an error message
+ # Core dump errors are always printed, and SIGPIPE never triggers an error.
+ # The setting below controls message printing for termination by all other signals.
+ termination_signal: true
+ }
+
+ # datetime_format determines what a datetime rendered in the shell would look like.
+ # Behavior without this configuration point will be to "humanize" the datetime display,
+ # showing something like "a day ago."
+ datetime_format: {
+ # normal: '%a, %d %b %Y %H:%M:%S %z' # shows up in displays of variables or other datetime's outside of tables
+ # table: '%m/%d/%y %I:%M:%S%p' # generally shows up in tabular outputs such as ls. commenting this out will change it to the default human readable datetime format
+ }
+
+ explore: {
+ status_bar_background: { fg: "#1D1F21", bg: "#C4C9C6" },
+ command_bar_text: { fg: "#C4C9C6" },
+ highlight: { fg: "black", bg: "yellow" },
+ status: {
+ error: { fg: "white", bg: "red" },
+ warn: {}
+ info: {}
+ },
+ selected_cell: { bg: light_blue },
+ }
+
+ history: {
+ max_size: 100_000 # Session has to be reloaded for this to take effect
+ sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file
+ file_format: "plaintext" # "sqlite" or "plaintext"
+ isolation: false # only available with sqlite file_format. true enables history isolation, false disables it. true will allow the history to be isolated to the current session using up/down arrows. false will allow the history to be shared across all sessions.
+ }
+
+ completions: {
+ case_sensitive: false # set to true to enable case-sensitive completions
+ quick: true # set this to false to prevent auto-selecting completions when only one remains
+ partial: true # set this to false to prevent partial filling of the prompt
+ algorithm: "prefix" # prefix or fuzzy
+ sort: "smart" # "smart" (alphabetical for prefix matching, fuzzy score for fuzzy matching) or "alphabetical"
+ external: {
+ enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up may be very slow
+ max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
+ completer: null # check 'carapace_completer' above as an example
+ }
+ use_ls_colors: true # set this to true to enable file/path/directory completions using LS_COLORS
+ }
+
+ filesize: {
+ metric: false # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard)
+ format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, auto
+ }
+
+ cursor_shape: {
+ emacs: line # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (line is the default)
+ vi_insert: block # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (block is the default)
+ vi_normal: underscore # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (underscore is the default)
+ }
+
+ color_config: $dark_theme # if you want a more interesting theme, you can replace the empty record with `$dark_theme`, `$light_theme` or another custom record
+ footer_mode: 25 # always, never, number_of_rows, auto
+ float_precision: 2 # the precision for displaying floats in tables
+ buffer_editor: null # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL
+ use_ansi_coloring: true
+ bracketed_paste: true # enable bracketed paste, currently useless on windows
+ edit_mode: emacs # emacs, vi
+ shell_integration: {
+ # osc2 abbreviates the path if in the home_dir, sets the tab/window title, shows the running command in the tab/window title
+ osc2: true
+ # osc7 is a way to communicate the path to the terminal, this is helpful for spawning new tabs in the same directory
+ osc7: true
+ # osc8 is also implemented as the deprecated setting ls.show_clickable_links, it shows clickable links in ls output if your terminal supports it. show_clickable_links is deprecated in favor of osc8
+ osc8: true
+ # osc9_9 is from ConEmu and is starting to get wider support. It's similar to osc7 in that it communicates the path to the terminal
+ osc9_9: false
+ # osc133 is several escapes invented by Final Term which include the supported ones below.
+ # 133;A - Mark prompt start
+ # 133;B - Mark prompt end
+ # 133;C - Mark pre-execution
+ # 133;D;exit - Mark execution finished with exit code
+ # This is used to enable terminals to know where the prompt is, the command is, where the command finishes, and where the output of the command is
+ osc133: true
+ # osc633 is closely related to osc133 but only exists in visual studio code (vscode) and supports their shell integration features
+ # 633;A - Mark prompt start
+ # 633;B - Mark prompt end
+ # 633;C - Mark pre-execution
+ # 633;D;exit - Mark execution finished with exit code
+ # 633;E - Explicitly set the command line with an optional nonce
+ # 633;P;Cwd=<path> - Mark the current working directory and communicate it to the terminal
+ # and also helps with the run recent menu in vscode
+ osc633: true
+ # reset_application_mode is escape \x1b[?1l and was added to help ssh work better
+ reset_application_mode: true
+ }
+ render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt.
+ use_kitty_protocol: false # enables keyboard enhancement protocol implemented by kitty console, only if your terminal support this.
+ highlight_resolved_externals: false # true enables highlighting of external commands in the repl resolved by which.
+ recursion_limit: 50 # the maximum number of times nushell allows recursion before stopping it
+
+ plugins: {} # Per-plugin configuration. See https://www.nushell.sh/contributor-book/plugins.html#configuration.
+
+ plugin_gc: {
+ # Configuration for plugin garbage collection
+ default: {
+ enabled: true # true to enable stopping of inactive plugins
+ stop_after: 10sec # how long to wait after a plugin is inactive to stop it
+ }
+ plugins: {
+ # alternate configuration for specific plugins, by name, for example:
+ #
+ # gstat: {
+ # enabled: false
+ # }
+ }
+ }
+
+ hooks: {
+ pre_prompt: [{ null }] # run before the prompt is shown
+ pre_execution: [{ null }] # run before the repl input is run
+ env_change: {
+ PWD: [{|before, after| null }] # run if the PWD environment is different since the last repl input
+ }
+ display_output: "if (term size).columns >= 100 { table -e } else { table }" # run to display the output of a pipeline
+ command_not_found: { null } # return an error message when a command is not found
+ }
+
+ menus: [
+ # Configuration for default nushell menus
+ # Note the lack of source parameter
+ {
+ name: completion_menu
+ only_buffer_difference: false
+ marker: "| "
+ type: {
+ layout: columnar
+ columns: 4
+ col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
+ col_padding: 2
+ }
+ style: {
+ text: green
+ selected_text: { attr: r }
+ description_text: yellow
+ match_text: { attr: u }
+ selected_match_text: { attr: ur }
+ }
+ }
+ {
+ name: ide_completion_menu
+ only_buffer_difference: false
+ marker: "| "
+ type: {
+ layout: ide
+ min_completion_width: 0,
+ max_completion_width: 50,
+ max_completion_height: 10, # will be limited by the available lines in the terminal
+ padding: 0,
+ border: true,
+ cursor_offset: 0,
+ description_mode: "prefer_right"
+ min_description_width: 0
+ max_description_width: 50
+ max_description_height: 10
+ description_offset: 1
+ # If true, the cursor pos will be corrected, so the suggestions match up with the typed text
+ #
+ # C:\> str
+ # str join
+ # str trim
+ # str split
+ correct_cursor_pos: false
+ }
+ style: {
+ text: green
+ selected_text: { attr: r }
+ description_text: yellow
+ match_text: { attr: u }
+ selected_match_text: { attr: ur }
+ }
+ }
+ {
+ name: history_menu
+ only_buffer_difference: true
+ marker: "? "
+ type: {
+ layout: list
+ page_size: 10
+ }
+ style: {
+ text: green
+ selected_text: green_reverse
+ description_text: yellow
+ }
+ }
+ {
+ name: help_menu
+ only_buffer_difference: true
+ marker: "? "
+ type: {
+ layout: description
+ columns: 4
+ col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
+ col_padding: 2
+ selection_rows: 4
+ description_rows: 10
+ }
+ style: {
+ text: green
+ selected_text: green_reverse
+ description_text: yellow
+ }
+ }
+ ]
+
+ keybindings: [
+ {
+ name: completion_menu
+ modifier: none
+ keycode: tab
+ mode: [emacs vi_normal vi_insert]
+ event: {
+ until: [
+ { send: menu name: completion_menu }
+ { send: menunext }
+ { edit: complete }
+ ]
+ }
+ }
+ {
+ name: completion_previous_menu
+ modifier: shift
+ keycode: backtab
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: menuprevious }
+ }
+ {
+ name: ide_completion_menu
+ modifier: control
+ keycode: space
+ mode: [emacs vi_normal vi_insert]
+ event: {
+ until: [
+ { send: menu name: ide_completion_menu }
+ { send: menunext }
+ { edit: complete }
+ ]
+ }
+ }
+ {
+ name: history_menu
+ modifier: control
+ keycode: char_r
+ mode: [emacs, vi_insert, vi_normal]
+ event: { send: menu name: history_menu }
+ }
+ {
+ name: help_menu
+ modifier: none
+ keycode: f1
+ mode: [emacs, vi_insert, vi_normal]
+ event: { send: menu name: help_menu }
+ }
+ {
+ name: next_page_menu
+ modifier: control
+ keycode: char_x
+ mode: emacs
+ event: { send: menupagenext }
+ }
+ {
+ name: undo_or_previous_page_menu
+ modifier: control
+ keycode: char_z
+ mode: emacs
+ event: {
+ until: [
+ { send: menupageprevious }
+ { edit: undo }
+ ]
+ }
+ }
+ {
+ name: escape
+ modifier: none
+ keycode: escape
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: esc } # NOTE: does not appear to work
+ }
+ {
+ name: cancel_command
+ modifier: control
+ keycode: char_c
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: ctrlc }
+ }
+ {
+ name: quit_shell
+ modifier: control
+ keycode: char_d
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: ctrld }
+ }
+ {
+ name: clear_screen
+ modifier: control
+ keycode: char_l
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: clearscreen }
+ }
+ {
+ name: search_history
+ modifier: control
+ keycode: char_q
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: searchhistory }
+ }
+ {
+ name: open_command_editor
+ modifier: control
+ keycode: char_o
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: openeditor }
+ }
+ {
+ name: move_up
+ modifier: none
+ keycode: up
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuup }
+ { send: up }
+ ]
+ }
+ }
+ {
+ name: move_down
+ modifier: none
+ keycode: down
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menudown }
+ { send: down }
+ ]
+ }
+ }
+ {
+ name: move_left
+ modifier: none
+ keycode: left
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuleft }
+ { send: left }
+ ]
+ }
+ }
+ {
+ name: move_right_or_take_history_hint
+ modifier: none
+ keycode: right
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { send: menuright }
+ { send: right }
+ ]
+ }
+ }
+ {
+ name: move_one_word_left
+ modifier: control
+ keycode: left
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: control
+ keycode: right
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: move_to_line_start
+ modifier: none
+ keycode: home
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_start
+ modifier: control
+ keycode: char_a
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_end_or_take_history_hint
+ modifier: none
+ keycode: end
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { edit: movetolineend }
+ ]
+ }
+ }
+ {
+ name: move_to_line_end_or_take_history_hint
+ modifier: control
+ keycode: char_e
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { edit: movetolineend }
+ ]
+ }
+ }
+ {
+ name: move_to_line_start
+ modifier: control
+ keycode: home
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_end
+ modifier: control
+ keycode: end
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolineend }
+ }
+ {
+ name: move_down
+ modifier: control
+ keycode: char_n
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menudown }
+ { send: down }
+ ]
+ }
+ }
+ {
+ name: move_up
+ modifier: control
+ keycode: char_p
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuup }
+ { send: up }
+ ]
+ }
+ }
+ {
+ name: delete_one_character_backward
+ modifier: none
+ keycode: backspace
+ mode: [emacs, vi_insert]
+ event: { edit: backspace }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: control
+ keycode: backspace
+ mode: [emacs, vi_insert]
+ event: { edit: backspaceword }
+ }
+ {
+ name: delete_one_character_forward
+ modifier: none
+ keycode: delete
+ mode: [emacs, vi_insert]
+ event: { edit: delete }
+ }
+ {
+ name: delete_one_character_forward
+ modifier: control
+ keycode: delete
+ mode: [emacs, vi_insert]
+ event: { edit: delete }
+ }
+ {
+ name: delete_one_character_backward
+ modifier: control
+ keycode: char_h
+ mode: [emacs, vi_insert]
+ event: { edit: backspace }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: control
+ keycode: char_w
+ mode: [emacs, vi_insert]
+ event: { edit: backspaceword }
+ }
+ {
+ name: move_left
+ modifier: none
+ keycode: backspace
+ mode: vi_normal
+ event: { edit: moveleft }
+ }
+ {
+ name: newline_or_run_command
+ modifier: none
+ keycode: enter
+ mode: emacs
+ event: { send: enter }
+ }
+ {
+ name: move_left
+ modifier: control
+ keycode: char_b
+ mode: emacs
+ event: {
+ until: [
+ { send: menuleft }
+ { send: left }
+ ]
+ }
+ }
+ {
+ name: move_right_or_take_history_hint
+ modifier: control
+ keycode: char_f
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { send: menuright }
+ { send: right }
+ ]
+ }
+ }
+ {
+ name: redo_change
+ modifier: control
+ keycode: char_g
+ mode: emacs
+ event: { edit: redo }
+ }
+ {
+ name: undo_change
+ modifier: control
+ keycode: char_z
+ mode: emacs
+ event: { edit: undo }
+ }
+ {
+ name: paste_before
+ modifier: control
+ keycode: char_y
+ mode: emacs
+ event: { edit: pastecutbufferbefore }
+ }
+ {
+ name: cut_word_left
+ modifier: control
+ keycode: char_w
+ mode: emacs
+ event: { edit: cutwordleft }
+ }
+ {
+ name: cut_line_to_end
+ modifier: control
+ keycode: char_k
+ mode: emacs
+ event: { edit: cuttolineend }
+ }
+ {
+ name: cut_line_from_start
+ modifier: control
+ keycode: char_u
+ mode: emacs
+ event: { edit: cutfromstart }
+ }
+ {
+ name: swap_graphemes
+ modifier: control
+ keycode: char_t
+ mode: emacs
+ event: { edit: swapgraphemes }
+ }
+ {
+ name: move_one_word_left
+ modifier: alt
+ keycode: left
+ mode: emacs
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: alt
+ keycode: right
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: move_one_word_left
+ modifier: alt
+ keycode: char_b
+ mode: emacs
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: alt
+ keycode: char_f
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: delete_one_word_forward
+ modifier: alt
+ keycode: delete
+ mode: emacs
+ event: { edit: deleteword }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: alt
+ keycode: backspace
+ mode: emacs
+ event: { edit: backspaceword }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: alt
+ keycode: char_m
+ mode: emacs
+ event: { edit: backspaceword }
+ }
+ {
+ name: cut_word_to_right
+ modifier: alt
+ keycode: char_d
+ mode: emacs
+ event: { edit: cutwordright }
+ }
+ {
+ name: upper_case_word
+ modifier: alt
+ keycode: char_u
+ mode: emacs
+ event: { edit: uppercaseword }
+ }
+ {
+ name: lower_case_word
+ modifier: alt
+ keycode: char_l
+ mode: emacs
+ event: { edit: lowercaseword }
+ }
+ {
+ name: capitalize_char
+ modifier: alt
+ keycode: char_c
+ mode: emacs
+ event: { edit: capitalizechar }
+ }
+ # The following bindings with `*system` events require that Nushell has
+ # been compiled with the `system-clipboard` feature.
+ # If you want to use the system clipboard for visual selection or to
+ # paste directly, uncomment the respective lines and replace the version
+ # using the internal clipboard.
+ {
+ name: copy_selection
+ modifier: control_shift
+ keycode: char_c
+ mode: emacs
+ event: { edit: copyselection }
+ # event: { edit: copyselectionsystem }
+ }
+ {
+ name: cut_selection
+ modifier: control_shift
+ keycode: char_x
+ mode: emacs
+ event: { edit: cutselection }
+ # event: { edit: cutselectionsystem }
+ }
+ # {
+ # name: paste_system
+ # modifier: control_shift
+ # keycode: char_v
+ # mode: emacs
+ # event: { edit: pastesystem }
+ # }
+ {
+ name: select_all
+ modifier: control_shift
+ keycode: char_a
+ mode: emacs
+ event: { edit: selectall }
+ }
+ ]
+}
+
+if ("~/.cache/wal/sequences" | path exists) { ^cat ~/.cache/wal/sequences }
+source ~/.cache/zoxide.nu
+if ("~/.cache/starship.nu" | path exists) { source ~/.cache/starship.nu }
+if ("~/.cache/carapace.nu" | path exists) { source ~/.cache/carapace.nu }
+
+$env.K9S_DEFAULT_PF_ADDRESS = "0.0.0.0"
+$env.config.show_banner = false
+
+alias p = pnsh-nvim
+alias k = kubectl
+alias d = docker
+alias t = terraform
+alias g = git
+alias f = nvim +G +only
+
+let pistarchio_dir = "~/Programming/Pionative/pistarchio" | path expand
+$env.PISTARCHIO_STACKS_DIR = $pistarchio_dir + "/stacks"
+$env.PISTARCHIO_LIBRARY_DIR = $pistarchio_dir + "/library"
+$env.PISTARCHIO_VENDOR_DESTINATION_DIR = ($pistarchio_dir + "/../clients") | path expand
+# overlay use ~/Programming/Pionative/quickstart/.venv/bin/activate.nu
diff --git a/.config/nushell/env.nu b/.config/nushell/env.nu
new file mode 100644
index 0000000..435a090
--- /dev/null
+++ b/.config/nushell/env.nu
@@ -0,0 +1,213 @@
+# Nushell Environment Config File
+#
+# version = "0.99.1"
+
+def create_left_prompt [] {
+ let dir = match (do --ignore-errors { $env.PWD | path relative-to $nu.home-path }) {
+ null => $env.PWD
+ '' => '~'
+ $relative_pwd => ([~ $relative_pwd] | path join)
+ }
+
+ 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)(ansi reset)"
+
+ $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 '%x %X') # 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)
+}
+
+# Use nushell functions to define your right and left prompt
+$env.PROMPT_COMMAND = {|| create_left_prompt }
+# 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 = {|| "::: " }
+
+# If you want previously entered commands to have a different prompt from the usual one,
+# you can uncomment one or more of the following lines.
+# This can be useful if you have a 2-line prompt and it's taking up a lot of space
+# because every command entered takes up 2 lines instead of 1. You can then uncomment
+# the line below so that previously entered commands show with a single `🚀`.
+# $env.TRANSIENT_PROMPT_COMMAND = {|| "🚀 " }
+# $env.TRANSIENT_PROMPT_INDICATOR = {|| "" }
+# $env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT = {|| "" }
+# $env.TRANSIENT_PROMPT_INDICATOR_VI_NORMAL = {|| "" }
+# $env.TRANSIENT_PROMPT_MULTILINE_INDICATOR = {|| "" }
+# $env.TRANSIENT_PROMPT_COMMAND_RIGHT = {|| "" }
+
+# 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
+ ($nu.data-dir | path join 'completions') # default home for nushell completions
+]
+
+# 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 load from a custom file you can use:
+# source ($nu.default-config-dir | path join 'custom.nu')
+
+let darwin: bool = (uname | get operating-system) == "Darwin"
+let nix: bool = "/nix" | path exists
+
+if $darwin and $nix {
+ $env.__NIX_DARWIN_SET_ENVIRONMENT_DONE = 1
+
+ $env.PATH = [
+ $"($env.HOME)/.nix-profile/bin"
+ $"/etc/profiles/per-user/($env.USER)/bin"
+ "/run/current-system/sw/bin"
+ "/nix/var/nix/profiles/default/bin"
+ "/usr/local/bin"
+ "/usr/bin"
+ "/usr/sbin"
+ "/bin"
+ "/sbin"
+ ]
+ $env.EDITOR = "VIM"
+ $env.NIX_PATH = [
+ $"darwin-config=($env.HOME)/.nixpkgs/darwin-configuration.nix"
+ "/nix/var/nix/profiles/per-user/root/channels"
+ ]
+ $env.NIX_SSL_CERT_FILE = "/etc/ssl/certs/ca-certificates.crt"
+ $env.PAGER = "less -R"
+ $env.TERMINFO_DIRS = [
+ $"($env.HOME)/.nix-profile/share/terminfo"
+ $"/etc/profiles/per-user/($env.USER)/share/terminfo"
+ "/run/current-system/sw/share/terminfo"
+ "/nix/var/nix/profiles/default/share/terminfo"
+ "/usr/share/terminfo"
+ ]
+ $env.XDG_CONFIG_DIRS = [
+ $"($env.HOME)/.nix-profile/etc/xdg"
+ $"/etc/profiles/per-user/($env.USER)/etc/xdg"
+ "/run/current-system/sw/etc/xdg"
+ "/nix/var/nix/profiles/default/etc/xdg"
+ ]
+ $env.XDG_DATA_DIRS = [
+ $"($env.HOME)/.nix-profile/share"
+ $"/etc/profiles/per-user/($env.USER)/share"
+ "/run/current-system/sw/share"
+ "/nix/var/nix/profiles/default/share"
+ ]
+ $env.TERM = $env.TERM
+ $env.NIX_USER_PROFILE_DIR = $"/nix/var/nix/profiles/per-user/($env.USER)"
+ $env.NIX_PROFILES = [
+ "/nix/var/nix/profiles/default"
+ "/run/current-system/sw"
+ $"/etc/profiles/per-user/($env.USER)"
+ $"($env.HOME)/.nix-profile"
+ ]
+
+ if ($"($env.HOME)/.nix-defexpr/channels" | path exists) {
+ $env.NIX_PATH = ($env.PATH | split row (char esep) | append $"($env.HOME)/.nix-defexpr/channels")
+ }
+
+ if (false in (ls -l `/nix/var/nix`| where type == dir | where name == "/nix/var/nix/db" | get mode | str contains "w")) {
+ $env.NIX_REMOTE = "daemon"
+ }
+}
+
+# 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')
+# An alternate way to add entries to $env.PATH is to use the custom command `path add`
+# which is built into the nushell stdlib:
+use std "path add"
+# $env.PATH = ($env.PATH | split row (char esep))
+# path add /some/path
+# path add ($env.CARGO_HOME | path join "bin")
+try {
+ if $darwin {
+ $env.PATH = ["/opt/homebrew/bin" "/opt/X11/bin" "/opt/local/bin" "/opt/local/sbin"] ++ $env.PATH
+ }
+}
+path add ($env.HOME | path join ".local" "bin")
+$env.PATH = ($env.PATH | uniq)
+
+$env.XDG_CACHE_HOME = "~/.cache" | path expand
+$env.XDG_DATA_HOME = "~/.local/share" | path expand
+$env.XDG_CONFIG_HOME = "~/.config" | path expand
+
+if (which carapace | is-not-empty) {
+ $env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense' # optional
+ carapace _carapace nushell | save --force ~/.cache/carapace.nu
+}
+if (which zoxide | is-not-empty) {
+ zoxide init nushell --cmd=cd | save --force ~/.cache/zoxide.nu
+}
+if (which starship | is-not-empty) {
+ starship init nu | save --force ~/.cache/starship.nu
+}
+
+if (not ("/var/run/docker.sock" | path exists)) and (not darwin) {
+ $env.DOCKER_HOST = $"unix://($env | default $"/run/($env.USER)" XDG_RUNTIME_DIR | get XDG_RUNTIME_DIR)/docker.sock"
+}
+
+# if not ("/.dockerenv" | path exists) {
+# do --env {
+# let ssh_agent_file = (
+# $nu.temp-path | path join $"ssh-agent-($env.USER).nuon"
+# )
+#
+# if ($ssh_agent_file | path exists) {
+# let ssh_agent_env = open ($ssh_agent_file)
+# if (ps | where pid == ($ssh_agent_env.SSH_AGENT_PID | into int) | is-not-empty) {
+# load-env $ssh_agent_env
+# return
+# } else {
+# rm $ssh_agent_file
+# }
+# }
+#
+# let ssh_agent_env = ssh-agent -c
+# | lines
+# | first 2
+# | parse "setenv {name} {value};"
+# | transpose --header-row
+# | into record
+# load-env $ssh_agent_env
+# $ssh_agent_env | save --force $ssh_agent_file
+# }
+# }
diff --git a/.config/nushell/history.txt b/.config/nushell/history.txt
new file mode 100644
index 0000000..34c5d47
--- /dev/null
+++ b/.config/nushell/history.txt
@@ -0,0 +1,1167 @@
+bash
+ls .config/nushell/
+vi .config/nushell/env.nu
+path
+path add
+vi .config/nushell/env.nu
+vi .config/nushell/config.nu
+vi /nix-config/profiles/core/home.nix
+xdg-open https://google.com
+cat .local/bin/desktop-open-pipe
+/nix/store/zcw13r2mmpzlnv2yvfl13mcpky3hivq1-system-path/bin/xdg-open https://google.com
+which xdg-open
+vi /nix-config
+cd /nix-config/
+git fetch --all
+ls
+htop
+ssh-add ~/.ssh/id_ed25519_sk
+vi
+git fetch --all
+git pull
+vi
+sudo nixos-rebuild switch --flake /nix-config
+vi /nix-config/profiles/core/home.nix
+vi
+cd mut/neovim/pack/plugins/start/blink.cmp/
+git status
+vi
+ls
+vi
+cd /nix-config/
+vi mut/neovim/lua/my/packages/blink.lua
+vi
+cp /nix-config/mut/surf/surf-open.sh /nix-config/mut/bin
+surf-open.sh
+vi .local/bin/surf-open.sh
+mkdir tmp
+surf-open.sh
+sudo nixos-rebuild switch --flake /nix-config
+chromium
+vi /nix-config/mut/surf/
+sudo nixos-rebuild switch --flake /nix-config
+man surf
+man tabbed
+xwininfo
+vi /nix-config/profiles/graphical/suckless.nix
+sudo nixos-rebuild switch --flake /nix-config
+xwininfo
+surf-open.sh https://troubleshooters.com/linux/surf.htm
+vi /nix-config/mut/tabbed/config.def.h
+sudo nixos-rebuild switch --flake /nix-config
+cat ~/.ssh/id_rsa_yubikey.pub
+vi /nix-config/lib/my.nix
+ssh-add ~/.ssh/id_ed25519_sk
+ssh 192.168.178.44
+ssh -i ~/.ssh/id_ed25519_sk 192.168.178.44 -p 2222
+ssh -i ~/.ssh/id_ed25519_sk 192.168.178.44 -p 2222 -vvv
+build-pixie
+build-pixie pump
+which run-pixiecore
+which run-pixiecore | open ($in | get patch)
+which run-pixiecore | open ($in | get path)
+which run-pixiecore | open ($in.0 | get path)
+run-pixiecore
+ssh -i ~/.ssh/id_ed25519_sk 192.168.178.44 -p 2222 -vvv
+ls
+ls initrd/
+ls
+ls init/bin/
+cd initrd/initrw
+cd initrd/
+ls
+ls initrd.zst
+ls -l initrd.zst
+ls -al initrd.zst
+zstd
+zstd -h
+zstd initrd -o here
+zstd initrd -o ~/here
+cd ..
+cd here
+ls
+cd ..
+ls
+cd
+ls
+cd ~/here
+ls ~/here
+file ~/here
+rm ~/here
+cd initrd/
+ls
+zstd
+zstd -h
+zstd -d initrd -o ~/here
+cd ~/here
+ls
+cd ../
+ls
+file here
+cpio
+open here | cpio -idmv
+ls
+cd nix/
+ls
+cd store/
+ls
+cd ..
+cat init
+ls
+rm -rf nix
+sudo rm -rf ./nix
+ls
+mkdir unpackedinitrd
+cd unpackedinitrd/
+cp ../here .
+ls
+open here | cpio -idmv
+ls
+cat init
+cat init | grep mnt
+cd
+cd /nix-config
+vi
+git status
+vi
+ls
+vi
+ssh-add ~/.ssh/id_ed25519_sk
+git push
+git remote remove origin
+surf-open.sh
+surf
+tabbed
+surf-open.sh
+which surf-open.sh
+which surf-open.sh | get path | open
+which surf-open.sh | get path.0 | open
+which surf-open.sh | get path.0 | nvim
+which surf-open.sh | get path.0 | nvim $in
+ls tmp
+rm tmp/tabbed-surf.xid
+vi
+git remote add origin git@github.com:ivi-vink/flake.git
+vi
+cccccbhnjjflcnulunfkudgidkhejkdlibutfngdreeh
+cd
+cd Programming/ThirdParty/
+git clone https://github.com/martanne/vis
+cd vis
+makegcc
+gcc
+./configure
+gcc
+vi Dockerfile
+cd vis
+make docker
+vi Dockerfile
+ls
+./vis
+vi hello
+vis
+vi
+mv vis ~/.local/bin
+vi
+vis
+cd
+vis
+cd Programming/
+vis
+ls
+vis
+cd ~/.config/
+man vis-open
+vis-open
+ls
+./vis-open
+vis
+ls
+vis
+vi
+vis
+cd
+rm ~/.local/bin/vis
+cd /nix-config/
+vi flake.nix
+s
+sudo nixos-rebuild switch --flake /nix-config
+vis
+which vis
+echo 1 2 3 | vis-menu
+^echo 1 2 3 | vis-menu
+^echo 1\n2 3 | vis-menu
+^ls | vis-menu
+ls | get name | vis-menu
+ls | each {get name} | vis-menu
+ls | each {|f| $f.name} | vis-menu
+ls | each {|f| $f.name}
+ls | each {|f| $f.name} | to tsv
+ls | each {|f| $f.name}
+ls | each {|f| $f.name} | to json
+ls | each {|f| $f.name} | to text
+ls | each {|f| $f.name} | to text | vis-menu
+let result = ls | each {|f| $f.name} | to text | vis-menu
+$result
+vis
+man vis
+cd .config/vis
+ls
+wget https://repo.or.cz/vis-quickfix.git/blob_plain/ff8e5e14c0b9e47238fa14723e1a0f5913ee3aeb:/init.lua
+ls
+mkdir quickfix
+mv init.lua quickfix/
+vis visrc.lua
+grpe
+cd .config/vis
+grep -n require
+grep -n require .
+grep -n require *
+grep -rn require *
+vis
+grep -n -rn require *
+which grep
+grep require *
+which rg
+vis visrc.lua
+vis
+vis
+vis
+which bash
+ls /bin/bash
+ls /usr/bin/bash
+vis
+ls
+vis
+cd .config/vis
+vis
+vis visrc.lua
+vis
+cd .config/vis
+vis
+touch vislogs
+surf
+surf-open.sh
+surf-open.sh google.com
+surf-open.sh https://google.com
+surf
+rm tmp/tabbed-surf.xid
+cd
+cd .config/vis
+vis
+tail -f vislogs
+ls
+vis
+grep -rn require quickfix
+vis
+ls
+rm debug
+rm --debug
+rm '--debug'
+ls
+rm vislogs
+ls
+vis
+cd .config/vis
+vis
+vis visrc.lua
+vis
+vis visrc.lua
+fmt
+which fmt
+vis
+cd .config/vis
+vis
+vis visrc.lua
+ll
+ls
+vis-open .config
+vi /run/current-system/sw/bin/vis-open
+which sh
+ls /etc/profiles/per-user/ivi/bin/sh
+ls -l /etc/profiles/per-user/ivi/bin/sh
+ls -l /etc/profiles/per-user/ivi/bin/sh | get target
+ls -l /nix/store/88s532drks0ip0ffyp9va413zssq9hvr-home-manager-path/bin/sh
+ls -l /nix/store/88s532drks0ip0ffyp9va413zssq9hvr-home-manager-path/bin/sh | get target
+vi /run/current-system/sw/bin/vis-open
+which vis-open
+$env.PATH
+chmod +x .local/bin/vis-open
+which vis-open
+vis-open .config
+vi ~/.local/bin/vis-open
+vis-open .config
+vi ~/.local/bin/vis-open
+vis-open .config
+vi ~/.local/bin/vis-open
+vis-open .config
+vi ~/.local/bin/vis-open
+man getops
+vis
+vis .local/bin/vis-open
+rm .local/bin/vis-open
+rm .config/vis/--debug
+vis
+cd Programming/Projects/csapp/
+ls
+vis Makefile
+vis `--debug`
+ls
+rm --debug
+rm ./--debug
+vis ~/.config/vis/quickfix/init.lua
+ls
+rm ./--debug
+vis
+ls
+mkdir 4
+ls
+cd 4
+ls
+cd ..
+vis
+git status
+git add .
+git commit -m dunno
+ls
+vis 58_decode2.s
+ls
+vis 58_decode2.s
+vis *.s
+vis
+man getopts
+man vis
+lf
+vis
+vis
+ls
+cd 4
+ls
+ls ../3/
+vis
+vis ~/.config/vis/visrc.lua
+vis
+cd 4
+vis
+sb-battery
+rm -rf tmp/
+surf-open.sh https://google.com
+mkdir tmp
+vis
+git clone https://github.com/seifferth/vis-editorconfig "$HOME/.config/vis/edconf"
+uarocks install editorconfig-core
+luarocks install editorconfig-core
+which lua
+lua
+vis
+man vis
+vis
+cd third vis
+ls
+vis ~/.config/vis/visrc.lua
+cd third vis
+ls
+man vis-complete
+ls --raw
+^ls
+^ls | vis-complete
+^ls | vis-complete --file
+^ls | vis-complete --file *.c
+^ls | vis-complete --word *.c
+vis-complete --word *.c
+man vis-complete
+l
+ls
+vis Dockerfile
+cd csapp
+ls
+sb-battery
+cd /nix-config/
+vi machines/pump-netboot.nix
+cd /nix-config/
+build-pixie pump
+run-pixiecore
+run-pixiecore
+which build-pixie
+ls -al /run/current-system/sw/bin/build-pixie
+vi machines/pump-netboot.nix
+sudo nixos-rebuild switch --flake /nix-config
+which build-pixie
+ls -l /run/current-system/sw/bin/build-pixie
+ls init/
+man read
+bash
+ls init/
+man switch_root
+ls init
+ls init/init
+cat init/init
+cd unpackedinitrd/
+ls
+ls nix/store
+ls **/*
+ls **/init
+ls **/init | each { |f| $f.name }
+open nix/store/r1m9wckjsjgiiai77hfxazc0mc3k2nc3-extra-utils/bin/init
+rm -rf unpackedinitrd/
+sudo rm -rf unpackedinitrd/
+rm -rf init/
+rm -f init
+rm -f kernel/
+rm -f kernel
+rm -f initrd/
+rm -f initrd
+vi machines/pump-netboot.nix
+ls
+cd
+ls
+ls -l
+rm lib
+ls -l
+vi init/init
+cpio
+man cpio
+nix-collect-garbage -d
+df -h
+sudo nixos-rebuild switch --flake /nix-config
+build-pixie pump
+ls
+open hando
+open hando | xdg-open $in
+surf-open.sh https://drive.google.com/drive/folders/1r5DIUnDRfc1JlgZmRUEODCxsw5YcnixW
+ls
+ls hando
+ls
+ls initrd/
+open initrd/initrd | zstd -d -o unpacked
+ls unpacked
+file unpacked
+open unpacked | cpio -d
+open unpacked | cpio
+cpio --help
+open unpacked | cpio -i
+ls
+ls unpacked
+mkdir unpacked
+mkdir test
+mv unpacked test
+cd test
+ls
+cd .
+cd ..
+ls -al tes
+ls -al test
+sudo rm -rf
+ls
+sudo rm -rf test
+ls -al test
+mkdir test
+mv unpacked test
+cd test
+open unpacked | cpio -i
+ls
+ls nix/
+ls nix/store/
+ls ../init
+ls nix/store/6wxswzjpf7fp5flag2baqqkm75rqqykf-linux-6.6.68-modules-shrunk
+ls nix/store/6wxswzjpf7fp5flag2baqqkm75rqqykf-linux-6.6.68-modules-shrunk/lib/
+ls nix/store/**/init
+file nix/store/v971vc1mpx06qavx6z9kwj3nbyifbd1g-extra-utils/bin/init
+ls
+cd ..
+ls
+sudo nixos-rebuild switch --flake /nix-config
+cd /nix-config/
+vi flake.nix
+sudo nixos-rebuild switch --flake /nix-config
+sudo nixos-rebuild switch --flake /nix-config --impure
+vi flake.nix
+sudo nixos-rebuild switch --flake /nix-config --impure
+run-pixiecore
+which run-pixiecore | get path.0
+ls -l /run/current-system/sw/bin/run-pixiecore
+ls -l /run/current-system/sw/bin/run-pixiecore | get target.0 | open $in
+ls /nix/store/m9j4rark32jdpigzdwdpj1q9w9l70230-nixos-system-pump-25.05.20241229.88195a9/init
+ls /nix/store/m9j4rark32jdpigzdwdpj1q9w9l70230-nixos-system-pump-25.05.20241229.88195a9/init/
+ls /nix/store/m9j4rark32jdpigzdwdpj1q9w9l70230-nixos-system-pump-25.05.20241229.88195a9/init
+cat /nix/store/m9j4rark32jdpigzdwdpj1q9w9l70230-nixos-system-pump-25.05.20241229.88195a9/init
+run-pixiecore
+ssh -i ~/.ssh/id_ed25519_sk 192.168.178.44 -p 2222 -vvv
+vi /etc/resolv.conf
+ip
+ip a
+ip route
+sudo -E vi /etc/resolv.conf
+run-pixiecore
+rm tmp/tabbed-surf.xid
+pass show personal/home-admin
+vis
+cd /nix-config/
+gitu
+git status
+git diff
+git add .
+git commit -m 'fix netboot'
+ls init/
+rm ~/tmp/tabbed-surf.xid
+git rm --cached init*
+git rm --cached kernel*
+ls
+rm init* kernel*
+ls
+rm result
+ls
+git status
+git add .
+git commit --amend
+git stash pop
+git status
+vis flake.nix
+git diff
+git stash clear
+git diff
+vis flake.lock
+git diff
+git clean -fd
+ls
+git reset --hard
+ls
+git pull
+ls
+curl -LO larbs.xyz/larbs.sh
+vis larbs.sh
+mv larbs.sh ~/larbs.sh
+cd ~
+ls
+ls larbs.sh
+cd /nix-config/
+git pull
+git log
+git pull --rebase
+vi
+git branch --set-upstream-to=origin/master master
+git pull --rebase
+git diff
+vis mut/ghostty/config
+git rebase --continue
+git add mut/ghostty/config
+git status
+git rebase --continue
+git push
+vis
+mv ~/.config/vis ~/vis.bu
+just
+nix-shell -p just
+ls ~/.config/
+ls ~/.config/nvim
+ls -l ~/.config
+s
+sudo nixos-rebuild switch --flake /nix-config --impure
+vis flake.nix
+ls mut/vis/
+ls mut/vis/vis-editorconfig/
+ls ~/.config/vis/
+ls -l ~/.config/vis
+ls -l ~/.config
+ls
+surfraw
+ls
+bash
+ls
+which sh
+readlink sh
+readlink /etc/profiles/per-user/ivi/bin/sh
+realpaht /nix/store/gh3ri50y5k7mjmvxz4ncllb4xqjj3nhp-home-manager-path/bin/sh
+realpath /nix/store/gh3ri50y5k7mjmvxz4ncllb4xqjj3nhp-home-manager-path/bin/sh
+surf
+ls .local/bin/dmenu
+vis .local/bin/dmenu
+rm .local/bin/dmenu
+wget https://raw.githubusercontent.com/LukeSmithxyz/LARBS/master/static/progs.csv
+ls
+git status
+cd /nix-config/
+cd pnsh
+vis progs.csv
+git add progs.csv
+git status
+gs
+git commit -m 'add progs.csv'
+git log
+git push
+virt-admin
+virt-viewer
+cd /nix-config/
+cd mut/vis
+ls
+touch Makefile
+ls
+vis Makefile
+vis larbs.sh
+ls /run/secrets/
+sudo su
+ls Downloads/
+ls Downloads | sort
+ls Downloads
+ls Downloads | sort-by modified
+cd Downloads/
+ls Downloads | sort-by modified
+ls | sort-by modified
+ls | sort-by --reverse modified
+cd
+ls
+cd /nix-config/
+ls
+vis secrets/root.yaml
+ls -al
+vis .sops.yaml
+vis machines/pump-netboot.nix
+cd ~/.config
+ls age
+ls
+cd -
+vis machines/pump-netboot.nix
+ls ~/sync/
+ls ~/sync/my/
+ls ~/.config/
+ls ~/.config/sops/age/
+cat /home/ivi/.config/sops/age/keys.txt
+vis machines/pump-netboot.nix
+vis profiles/homeserver/transmission.nix
+run-pixiecore
+ssh 192.168.178.44
+TERM=xterm ssh 192.168.178.44
+sudo su
+cd /nix-config/
+nix shell
+cd /nix-config/
+nix repl
+vis flake.nix
+nix repl
+nix flake --help
+nix flake lock
+nix repl
+vis flake.nix
+nix repl
+vis flake.nix
+rg sops-nix
+vis profiles/core/secrets.nix
+nix repl
+vis profiles/netboot/system.nix
+cd /nix-config/
+ls
+cat .sops.yaml
+ls /run/secrets.d/
+sudo su
+age
+ls
+cat pump
+ls
+age
+age-keygen -o pump-age-keys.txt
+cd /nix-config/
+vis ~/.config/sops/age/keys.txt
+cat ~/pump-age-keys.txt
+vis .sops.yaml
+age
+sops -h
+sops -h | less
+sops -r
+sops -r ./secrets/*
+sops -r ./secrets/**/*
+./secrets/**/* | each {|f| sops -r $f.name }
+ls ./secrets/**/* | each {|f| sops -r $f.name }
+ls ./secrets/**/*
+ls ./secrets/**/* | where type == file | each {|f| sops -r $f.name }
+ls ./secrets/**/* | where type == file | each {|f| sops -r -i $f.name }
+git status
+git add secrets
+git status
+sops ./secrets/porkbun
+vis ./secrets/porkbun
+cat .sops.yaml
+sops -h | less
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys -r -i $f.name }
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys -i $f.name }
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys $f.name }
+git status
+vis ./secrets/porkbun
+sops ./secrets/porkbun
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys $f.name }
+vis /nix-config/secrets/root.yaml
+sops updatekeys
+sops updatekeys ./secrets
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys $f.name }
+vis /nix-config/secrets/serber/ivi
+git log
+git clean -fd ./secrets/
+git status
+git rm --cached ./clean
+git diff
+git diff --cached
+git status
+ls ./secrets/**/* | where type == file | each {|f| git restore --stage $f.name }
+git status
+git clean -fd ./secrets/
+git status
+git reset --hard ./clean
+ls ./secrets/**/* | where type == file | each {|f| git restore $f.name }
+git status
+ls ./secrets/**/* | where type == file | each {|f| sops updatekeys $f.name }
+git status
+vis /nix-config/secrets/serber/ivi
+vis .sops.yaml
+vis /nix-config/secrets/porkbun
+sops updatekeys ./secrets/porkbun
+sops -h
+sops -h | less
+bash
+git status
+git add secrets
+git commit -m 'sops updatekeys'
+git log
+git push
+TERM=xterm ssh 192.168.178.44
+sed /192.168.178.44/d ~/.ssh/known_hosts
+sed -i /192.168.178.44/d ~/.ssh/known_hosts
+run-pixiecore
+cd
+cat pump-age-keys.txt
+TERM=xterm ssh 192.168.178.44
+vis /nix-config/profiles/homeserver/
+vis /nix-config/profiles/homeserver/nginx.nix
+sudo nixos-rebuild switch --flake /nix-config --impure
+ssh 192.168.178.44
+pass show personal/zpool
+TERM=xterm ssh 192.168.178.44
+sed -i /192.168.178.44/d ~/.ssh/known_hosts
+run-pixiecore
+TERM=xterm ssh 192.168.178.44
+vis /nix-config/profiles/homeserver/transmission.nix
+sudo nixos-rebuild switch --flake /nix-config --impure
+run-pixiecore
+pass show personal/zpool
+cat pump-age-keys.txt
+TERM=xterm ssh 192.168.178.44
+sed -i /192.168.178.44/d ~/.ssh/known_hosts
+virt-manager
+pass show personal/zpool
+cat pump-age-keys.txt
+cd /nix-config/
+ls
+vis profiles/homeserver/transmission.nix
+vis machines/pump-netboot.nix
+grep -rn docker .
+grep -rn rootless .
+vis profiles/homeserver/transmission.nix
+TERM=xterm ssh 192.168.178.44
+cd /nix-config/
+vis profiles/homeserver/transmission.nix
+sudo nixos-rebuild switch --flake /nix-config --impure
+run-pixiecore
+pass show personal/zpool
+cat pump-age-keys.txt
+cd
+cat pump-age-keys.txt
+ssh 192.168.178.44
+TERM=xterm ssh 192.168.178.44
+sed -i /192.168.178.44/d ~/.ssh/known_hosts
+cat pump-age-keys.txt
+curl 192.168.178.44:9091
+curl -f 192.168.178.44:9091
+curl -4 http://192.168.178.44:9091
+curl - http://192.168.178.44:9091
+curl http://192.168.178.44:9091
+TERM=xterm ssh 192.168.178.44
+cd /nix-config/
+vis profiles/homeserver/transmission.nix
+curl http://192.168.178.44:8096
+curl -L http://192.168.178.44:8096
+ip a
+TERM=xterm ssh 192.168.178.44
+cd /var/lib/libvirt/images/
+ls
+sudo su
+ssh 192.168.122.158
+ssh root@192.168.122.158
+ssh ivi@192.168.122.159
+TERM=xterm ssh ivi@192.168.122.159
+cd /nix-config/
+ls
+mv ~/larbs.sh .
+ls
+mv larbs.sh mvbs.sh
+vis larbs.sh
+ssh ivi@192.168.122.159
+TERM=xterm ssh ivi@192.168.122.159
+TERM=xterm ssh ivi@192.168.122.159 < /nix-config/mvbs.sh
+open /nix-config/mvbs.sh | TERM=xterm ssh ivi@192.168.122.159
+ssh-add ~/.ssh/id_ed25519_sk
+ssh-add -L
+open /nix-config/mvbs.sh | TERM=xterm ssh root@192.168.122.159
+open /nix-config/mvbs.sh | TERM=xterm ssh ivi@192.168.122.159
+vis mvbs.sh
+TERM=xterm ssh ivi@192.168.122.159
+TERM=xterm ssh root@192.168.122.159
+open /nix-config/mvbs.sh | TERM=xterm ssh ivi@192.168.122.159
+open /nix-config/mvbs.sh | TERM=xterm ssh root@192.168.122.159
+bash
+ssh-copy-id
+TERM=xterm ssh-copy-id root@192.168.122.159
+ssh 'root@192.168.122.159'
+open /nix-config/mvbs.sh | TERM=xterm ssh root@192.168.122.159
+scp /nix-config/mvbs.sh root@192.168.122.159:/opt/installer | TERM=xterm ssh root@192.168.122.159 /opt/installer
+scp /nix-config/mvbs.sh root@192.168.122.159:/opt/installer; TERM=xterm ssh root@192.168.122.159 bash /opt/installer
+scp /nix-config/mvbs.sh root@192.168.122.159:/opt/installer; TERM=xterm ssh root@192.168.122.159
+ls
+vi mvbs.sh
+vis mvbs.sh
+virt-manager
+cd /e
+cd /nix-config/
+grep progs.csv
+grep desktop progs.csv
+grep -e '^desktop' progs.csv
+grep -e '^desktop' -e '^cli' progs.csv
+vis progs.csv
+ls ~/.config/vis/
+cd /nix-config/mut/dwm/
+git stuat
+git status
+cd ../..
+vis mut/dwm/dwm.c
+git subtree
+git subtree push --prefix mut/dwm git@github.com:ivi-vink/dwm.git master
+git subtree pull --prefix mut/dwm git@github.com:ivi-vink/dwm.git master
+git status
+rm mut/vis/Makefile
+TERM=xterm ssh root@192.168.122.159
+git add .
+git commit -m 'fix homeserver and start xbps'
+git push
+git subtree pull --prefix mut/dwm git@github.com:ivi-vink/dwm.git master
+git subtree push --prefix mut/dwm git@github.com:ivi-vink/dwm.git master -f
+cd ~
+ls
+git clone git@github.com:ivi-vink/dwm.git
+cp -r /nix-config/mut/dwm dwm
+ls dwm
+rm -rf dwm/dwm
+cp -r /nix-config/mut/dwm/* dwm
+ls dwm
+cd dwm
+git status
+git diff
+git add .
+git commit -m 'fix homeserver and start xbps'
+git push
+cd /nix-config
+ls
+rm tmp/tabbed-surf.xid
+git clone git@github.com:ivi-vink/vis.git
+cd vis
+ls
+git remote
+git remote add upstream git@github.com:martanne/vis.git
+git fetch upstream v0.9
+git status
+git checkout v0.9
+git checkout upstream/v0.9
+git checkout -b v0.9
+git checkout master
+git log
+git branch -d v0.9
+git checkout refs/tags/v0.9
+carapace
+cd vis
+git remote
+git fetch upstream v0.9
+ssh-add ~/.ssh/id_ed25519_sk
+ls
+git checkout upstream/refs/tags/v0.9
+git checkout upstream/v0.9
+git fetch upstream
+git reset --hard v0.9
+git push -f
+git clone git@github.com:ivi-vink/lua.git
+cd ..
+git clone git@github.com:ivi-vink/lua.git
+cd lua/
+vis Makefile
+man make
+vis Makefile
+ls
+rm Makefile
+cd ..
+git clone git@github.com:pionative/pnsh.git
+cd pnsh/
+ls
+cd ~/sync/my/
+ls
+cd ../..
+cd lua
+cd /nix-config
+ls
+cd ~/sync/my/
+ls
+cd
+cd ~/sync/my/
+ls
+cd notes
+ls
+cd ..
+ls
+vis Dockerfile.vis
+ls
+cat Dockerfile.vis
+cd lua
+ls
+curl -L -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gz
+ls
+tar zxf lua-5.4.7.tar.gz
+ls
+rm -rf lua-5.4.7/
+ls
+tar zxf --strip-components 1 lua-5.4.7.tar.gz
+tar -zxf --strip-components 1 lua-5.4.7.tar.gz
+ls
+tar -zxf lua-5.4.7.tar.gz --strip-components 1
+ls
+rm lua-5.4.7.tar.gz
+ls
+git add .
+git commit -m 'fetch tarball'
+sed -i -e 's/^TO_LIB=.*/\0 liblua.so/' Makefile
+git diff
+sed -i -e 's/^CFLAGS.*/\0 -fPIC/' src/Makefile
+git diff
+sed -i -e '/^LUA_A=/a LUA_SO= liblua.so' src/Makefile
+sed -i -e 's/^ALL_T=.*/\0 $(LUA_SO)/' src/Makefile
+git diff
+echo >> src/Makefile
+^echo >> src/Makefile
+bash
+git diff
+git add .
+git commit -m 'patch to also compile shared object'
+vis Makefile
+man LD_LIBRARY_PATHERR
+man LD_LIBRARY_PATH
+ls /usr/lib
+vis Makefile
+virt-manager
+ssh-add ~/.ssh/id_ed25519_sk
+ssh 'root@192.168.122.159'
+ssh 'root@192.168.122.158'
+sed -i /192.168.122.158/d ~/.ssh/known_hosts
+ssh 'root@192.168.122.158'
+eval
+ssh-add ~/.ssh/id_ed25519_sk
+ssh-agent
+$env.SSH_AUTH_SOCK = '/tmp/ssh-XXXXXXeXq31s/agent.30985'
+ssh-add ~/.ssh/id_ed25519_sk
+cd vis
+cd ..
+cd lua
+ls
+git push
+ssh-add ~/.ssh/id_ed25519_sk
+git push
+ls
+cd ..
+git clone git@github.com:ivi-vink/luarocks.git
+cd luarocks/
+ls
+curl -L -R -O https://luarocks.github.io/luarocks/releases/luarocks-3.11.1.tar.gz
+ls
+tar -zxf luarocks-3.11.1.tar.gz --strip-components 1
+ls
+rm luarocks-3.11.1.tar.gz
+ls
+cat configure
+vis ./configure
+ls
+git add .
+git commit -m 'fetch tarball'
+git push
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.159:/opt/installer; TERM=xterm ssh root@192.168.122.159
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.159:/opt/installer; TERM=xterm ssh root@192.168.122.158
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt/installer; TERM=xterm ssh root@192.168.122.158
+ssh 'ivi@192.168.122.158'
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt/installer; TERM=xterm ssh root@192.168.122.158
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+vis Dockerfile.vis
+cd /nix-config/
+git diff
+cd
+ls
+ls larbs.sh
+vis larbs.sh
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158 bash
+vis mvbs.sh
+git add progs.csv
+git status
+git commit -m 'update progs'
+git push
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+cd /nix-config/
+vis mvbs.sh
+cd
+cd lua/
+ls
+vi Makefile
+git diff
+ls
+vi src/Makefile
+git diff
+make
+vi src/Makefile
+vi
+git push
+vis
+cd /nix-config/
+ls
+vis mvbs.sh
+cd ~
+cd lua/
+ls
+git push
+cd -
+cd /nix-config/
+ls
+cd pnsh/
+ls
+cd /nix-config/
+ls
+cd sync my
+vis mvbs.sh
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+vi Dockerfile.vis
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+cd
+git add progs.csv
+git commit -m 'update progs'
+git push
+cd /nix-config/
+scp /nix-config/mvbs.sh /nix-config/progs.csv root@192.168.122.158:/opt; TERM=xterm ssh root@192.168.122.158
+ls
+git status
+git diff progs.csv
+git add progs.csv mvbs.sh
+git commit -m 'update progs mvbs.sh'
+git push
+git status
+git diff
+cd /nix-config/
+git status
+vis
+vis progs.csv
+cd /nix-config/
+virt-manager
+cd /nix-config/
+ssh 'ivi@192.168.122.68'
+ssh 'ivi@192.168.122.86'
+ssh 'root@192.168.122.86'
+ssh 'ivi@192.168.122.86'
+LS
+ls
+ssh 'root@192.168.122.86'
+ssh-copy-id
+ssh-copy-id 'root@192.168.122.86'
+ssh 'root@192.168.122.86'
+ssh-agent
+$env.SSH_AUTH_SOCK = "/tmp/ssh-XXXXXXiOxnW8/agent.21661"
+ssh 'root@192.168.122.86'
+TERM=xterm ssh 'root@192.168.122.86'
+TERM=xterm scp /nix-config/progs.csv /nix-config/mvbs.sh 'root@192.168.122.86:/opt'
+oksh
+nix-shell -p oksh
+e
+vis
+cd /nix-config/
+git status
+tig
+rm bash_carapace_completion
+ls
+git status
+vis mut/nushell/config.nu
+git diff
+git add .
+git commit -m 'update progs mvbs.sh'
+git push
+ls
+rm tmp/tabbed-surf.xid
+man git
+ls
+cd /nix-config/
+ls
+cd
+man git clone
+mkdir .local/src
+cd .local/src/
+ls
+git clone git@github.com:ivi-vink/dotfiles.git
+cd dotfiles/
+git checkout -b master --orphan
+git checkout -b master --orphan origin
+git checkout master --orphan origin
+git checkout master --orphan
+git checkout -b master --orphan
+git checkout -b master --orphan origin/main
+git checkout master --orphan origin/main
+git checkout --orphan master
+git status
+git diff
+git stat
+git stattus
+git status
+git rm --cached .
+git rm -r --cached .
+git status
+rm -rf *
+ls
+git status
+vis .gitmodules
+ls
+mkdir -p .local/bin
+mkdir .local/bin
+cd /nix-config/
+ls
+ls mut/
+cp -r /nix-config/mut/bin/* .local/bin
+ls .local/bin
+rm .local/bin/hs
+rm .local/bin/choose
+ls .local/bin
+git add .local
+git status
+rm .gitmodules
+vis .gitignore
+rm .gitignore
+vis .gitconfig
+rm .gitconfig
+git status
+git add .local
+git commit -m 'copy bin'
+ls
+mkdir .config
+cp -r /nix-config/mut/aerospace .config
+cp -r /nix-config/mut/carapace .config
+cp -r /nix-config/mut/dwmblocks .config
+cp -r /nix-config/mut/ghostty/ .config
+cp -r /nix-config/mut/k9s .config
+cp -r /nix-config/mut/neovim/* .config/nvim
+mkdir .config/nvim
+cp -r /nix-config/mut/neovim/* .config/nvim
+ls .config/nvim/
+cp -r /nix-config/mut/wal .config
+cp -r /nix-config/mut/emacs .config
+ls .config/emacs/
+cp -r /nix-config/mut/git .config
+ls .config/git/
+open .config/git/config
+vis .config/git/config
+cp -r /nix-config/mut/lf .config
+ls
diff --git a/.config/nushell/login.nu b/.config/nushell/login.nu
new file mode 100644
index 0000000..4ca972e
--- /dev/null
+++ b/.config/nushell/login.nu
@@ -0,0 +1,14 @@
+def load-posix-env [p: string] {
+ bash -c $"source ($p) && env"
+ | lines
+ | parse "{n}={v}"
+ | filter { |x| ($x.n not-in $env) or $x.v != ($env | get $x.n) }
+ | where n not-in ["_", "LAST_EXIT_CODE", "DIRS_POSITION"]
+ | transpose --header-row
+ | into record
+ | load-env
+}
+
+load-posix-env /etc/profile
+# load-posix-env $"($env.HOME)/.profile"
+$env.PATH = $env.PATH ++ [$"($env.HOME)/.local/bin"]
diff --git a/.config/nushell/scripts/task.nu b/.config/nushell/scripts/task.nu
new file mode 100644
index 0000000..6c7968b
--- /dev/null
+++ b/.config/nushell/scripts/task.nu
@@ -0,0 +1,434 @@
+# Spawn a task to run in the background, even when the shell is closed.
+#
+# Note that a fresh Nushell interpreter is spawned to execute the
+# given task, so it won't inherit the current scope's variables,
+# custom commands and alias definitions.
+#
+# It will only inherit environment variables which can be converted to a string.
+#
+# Note that the closure can't take arguments.
+#
+# Example usage: task spawn { echo "Hello, World!" }
+export def spawn [
+ command: closure # The closure to run.
+ --working-directory (-w): directory # Specify the working directory the task will be run in.
+ --immediate (-i) # Immediately start the task.
+ --stashed (-s) # Create the task in Stashed state. Useful to avoid immediate execution if the queue is empty
+ --delay (-d): duration # Queue the task for execution only after the duration.
+ --group (-g): string # The group to spawn the task under.
+ --after (-a): int # Start the task once all specified tasks have successfully finished. As soon as one of the dependencies fails, this task will fail as well.
+ --priority (-o): string # Start this task with a higher priority. The higher the number, the faster it will be processed.
+ --label (-l): string # Label the task. This string will be shown in the `status` column of `task status`.
+] -> int {
+ mut args = []
+
+ if $working_directory != null {
+ $args = ($args | prepend ["--working-directory", $working_directory])
+ }
+ if $immediate {
+ $args = ($args | prepend "--immediate")
+ }
+ if $stashed {
+ $args = ($args | prepend "--stashed")
+ }
+ if $delay != null {
+ $args = ($args | prepend ["--delay" ($delay | format duration sec | parse "{secs} {_}" | get 0.secs)])
+ }
+ if $group != null {
+ $args = ($args | prepend ["--group" $group])
+ }
+ if $after != null {
+ $args = ($args | prepend ["--after" $after])
+ }
+ if $priority != null {
+ $args = ($args | prepend ["--priority" $priority])
+ }
+ if $label != null {
+ $args = ($args | prepend ["--label" $label])
+ }
+
+ let source_path = mktemp --tmpdir --suffix "-nu-task"
+
+ (
+ view source $command
+ | str trim --left --char "{"
+ | str trim --right --char "}"
+ )
+ | save --force $source_path
+
+ (pueue add --print-task-id ...$args $"nu --config '($nu.config-path)' --env-config '($nu.env-path)' ($source_path)")
+}
+
+# Remove tasks from the queue.
+# Running or paused tasks need to be killed first.
+export def remove [
+ ...ids: int # IDs of the tasks to remove from the status list.
+] {
+ pueue remove ...$ids
+}
+
+# Switches the queue position of two tasks.
+# Only works for queued or stashed tasks.
+export def switch [
+ task_id_1: int # The first task ID.
+ task_id_2: int # The second task ID.
+] {
+ pueue switch $task_id_1 $task_id_2
+}
+
+# Stash a task that is not currently running.
+#
+# Stashed tasks won't be automatically started.
+# You will have to queue them or start them by hand.
+export def stash [
+ ...ids: int # IDs of the tasks to stash.
+] {
+ pueue stash ...$ids
+}
+
+# Queue stashed tasks for execution.
+export def queue [
+ ...ids: int # IDs of the tasks to queue.
+ --delay (-d): duration # Queue only after the specified delay.
+] {
+ let args = if $delay != null {
+ ["--delay" ($delay | format duration sec | parse '{secs} {_}' | get 0.secs)]
+ } else {
+ []
+ }
+
+ pueue enqueue ...$args ...$ids
+}
+
+# Resume operation of specific tasks or groups of tasks.
+#
+# By default, this resumes the default group and all its tasks.
+# It can also be used force-start specific tasks or start whole groups.
+export def start [
+ ...ids: int # IDs of the tasks to start. By default all the tasks in the default group will be started.
+ --group (-g): string # Resume a specific group and all paused tasks in it. The group will be set to running and its paused tasks will be resumed.
+ --all (-a) # Resume all groups. All groups will be set to running and paused tasks will be resumed.
+] {
+ mut args = []
+
+ if $group != null {
+ $args = ($args | prepend ["--group" $group])
+ }
+ if $all {
+ $args = ($args | prepend "--all")
+ }
+
+ pueue start ...$args
+}
+
+# Restart failed or successful task(s).
+#
+# By default, identical tasks will be created and
+# enqueued, but it's possible to restart in-place.
+#
+# You can also edit a few properties, such as
+# the path and the command of the task, before restarting.
+export def restart [
+ ...ids: int # IDs of the tasks to restart.
+ --all-failed (-a) # Restart all failed tasks across all groups. Nice to use in combination with `--in-place/i`.
+ --failed-in-group (-g): string # Like `--all-failed`, but only restart tasks failed tasks of a specific group. The group will be set to running and its paused tasks will be resumed.
+ --start-immediately (-k) # Immediately start the tasks, no matter how many open slots there are. This will ignore any dependencies tasks may have.
+ --stashed (-s) # Set the restarted task to a "Stashed" state. Useful to avoid immediate execution.
+ --in-place (-i) # Restart the tasks by reusing the already existing tasks.
+ --not-in-place (-n) # Opposite of `--in-place`. This is already the default unless you have `restart_in_place` set to true.
+ --edit (-e) # Edit the tasks' commands before restarting
+ --edit-path (-p) # Edit the tasks' paths before restarting
+ --edit-label (-l) # Edit the tasks' labels before restarting
+] {
+ mut args = []
+
+ if $all_failed {
+ $args = ($args | prepend "--all-failed")
+ }
+ if $failed_in_group != null {
+ $args = ($args | prepend "--failed-in-group")
+ }
+ if $start_immediately {
+ $args = ($args | prepend "--start-immediately")
+ }
+ if $stashed {
+ $args = ($args | prepend "--stashed")
+ }
+ if $in_place {
+ $args = ($args | prepend "--in-place")
+ }
+ if $not_in_place {
+ $args = ($args | prepend "--not-in-place")
+ }
+ if $edit {
+ $args = ($args | prepend "--edit")
+ }
+ if $edit_path {
+ $args = ($args | prepend "--edit-path")
+ }
+ if $edit_label {
+ $args = ($args | prepend "--edit-label")
+ }
+
+ pueue restart ...$args ...$ids
+}
+
+# Either pause a running tasks or a specific groups of tasks.
+#
+# By default, pauses the default group and all its tasks.
+#
+# A paused group won't start any new tasks automatically.
+export def pause [
+ ...ids: int # IDs of the tasks to pause.
+ --group (-g) # Pause a specific group
+ --all (-a) # Pause all groups.
+ --wait (-w) # Only pause the specified group and let already running tasks finish by themselves
+] {
+ mut args = []
+
+ if $group != null {
+ $args = ($args | prepend "--group")
+ }
+ if $all != null {
+ $args = ($args | prepend "--all")
+ }
+ if $wait != null {
+ $args = ($args | prepend "--wait")
+ }
+
+ pueue pause ...$args ...$ids
+}
+
+# Kill specific running tasks or whole task groups.
+#
+# Kills all tasks of the default group when no ids or a specific group are provided.
+export def kill [
+ ...ids: int # IDs of the tasks to kill.
+ --group (-g): string # Kill all running tasks in a group. This also pauses the group.
+ --all (-a) # Kill all running tasks across ALL groups. This also pauses all groups.
+ --signal (-s): string # Send a UNIX signal instead of simply killing the process. DISCLAIMER: This bypasses Pueue's process handling logic! You might enter weird invalid states, use at your own descretion.
+] {
+ mut args = []
+
+ if $group != null {
+ $args = ($args | prepend ["--group" $group])
+ }
+ if $all {
+ $args = ($args | prepend "--all")
+ }
+ if $signal != null {
+ $args = ($args | prepend ["--signal" $signal])
+ }
+
+ pueue kill ...$args ...$ids
+}
+
+# Send something to a task. Useful for sending confirmations such as "y\n".
+export def send [
+ id: int # ID of the task to send something to.
+ input: string # The input that should be sent to the process.
+] {
+ pueue send $id $input
+}
+
+# Edit the command, path or label of a stashed or queued task.
+#
+# By default only the command is edited.
+#
+# Multiple properties can be added in one go.
+export def edit [
+ id: int # ID of the task to edit.
+ --command (-c) # Edit the task's command
+ --path (-p) # Edit the task's path
+ --label (-l) # Edit the task's label
+] {
+ mut args = []
+
+ if $command {
+ $args = ($args | prepend "--command")
+ }
+ if $path {
+ $args = ($args | prepend "--path")
+ }
+ if $label {
+ $args = ($args | prepend "--label")
+ }
+
+ pueue edit ...$args $id
+}
+
+# Use this to add or remove groups.
+#
+# By default, this will simply display all known groups.
+export def group [] {
+ pueue group --json | from json
+}
+
+# Create a new group with a name.
+export def "group add" [
+ name: string # The name of the new group.
+ --parallel (-p): int # The amount of parallel tasks the group can run at one time.
+] {
+ let args = if $parallel != null {
+ ["--parallel" $parallel]
+ } else {
+ []
+ }
+
+ pueue group add ...$args $name
+}
+
+# Remove a group with a name.
+export def "group remove" [
+ name: string # The name of the group to be removed.
+] {
+ pueue group remove $name
+}
+
+# Display the current status of all tasks.
+export def status [
+ --detailed (-d) # Return a table with more detailed information.
+] {
+ let output = (
+ pueue status --json
+ | from json
+ | get tasks
+ | transpose --ignore-titles status
+ | flatten
+ )
+
+ # TODO: Rename the Done column to done.
+ if not $detailed {
+ $output | select id label group Done? status? start? end?
+ } else {
+ $output
+ }
+}
+
+# Display the output of tasks.
+#
+# Only the last few lines will be shown by default for multiple tasks.
+# If you want to follow the output, use `--tail/-t`.
+export def log [
+ ...ids: int # The tasks to check the outputs of.
+ --last (-l): int # Only print the last N lines of each task's output. This is done by default if you're looking at multiple tasks.
+ --tail (-t) # Follow the output as it is printing. Only works with 1 task. When used in conjunction with `--last`, the last N lines will be printed before starting to wait for output.
+ --detailed (-d) # Include all fields, don't simplify output.
+] {
+ def process_raw [raw: string] {
+ let full = (
+ $raw
+ | from json
+ | transpose -i info
+ | flatten --all
+ | flatten --all
+ )
+
+ if $detailed {
+ $full
+ } else {
+ $full | select id label group Done? status? start? end?
+ }
+ }
+
+ if (($ids | length) == 1) {
+ if $tail {
+ let args = if $last != null {
+ ["--lines" $last]
+ } else {
+ []
+ }
+
+ pueue follow ...$ids
+ } else {
+ let args = if $last != null {
+ ["--lines" $last]
+ } else {
+ []
+ }
+
+ process_raw (pueue log --full --json ...$args ...$ids)
+ | first
+ }
+ } else {
+ if $tail {
+ echo $"(ansi red)--tail can only be used with one task.(ansi reset)"
+ return
+ }
+
+ let args = if $last != null {
+ ["--lines" $last]
+ } else {
+ []
+ }
+
+ process_raw (pueue log --full --json ...$args ...$ids)
+ }
+}
+
+# Wait until the provided tasks are finished.
+#
+# This is like join() or await in many languages.
+export def wait [
+ ...ids: int # IDs of the tasks to wait for.
+ --group (-g): string # Wait for all tasks in a specific group.
+ --all (-a) # Wait for all tasks across all groups and the default group.
+ --quiet (-q) # Don't show any log output while waiting.
+ --status (-s): string # Wait for tasks to reach a specific task status.
+] {
+ mut args = []
+
+ if $group != null {
+ $args = ($args | prepend ["--group" $group])
+ }
+ if $all {
+ $args = ($args | prepend $all)
+ }
+ if $quiet {
+ $args = ($args | prepend $quiet)
+ }
+ if $status != null {
+ $args = ($args | prepend ["--status" $status])
+ }
+
+ pueue wait ...$args ...$ids
+}
+
+# Remove tasks from the status list.
+export def clean [
+ --successful-only (-s) # Only clean tasks that finished successfully
+ --group (-g): string # Only clean tasks of a specific group
+] {
+ mut args = []
+
+ if $successful_only {
+ $args = ($args | prepend "--successful-only")
+ }
+ if $group != null {
+ $args = ($args | prepend ["--group" $group])
+ }
+
+ pueue clean ...$args
+}
+
+# Shutdown pueue and thus this module.
+export def shutdown [] {
+ pueue shutdown
+}
+
+# Set the maximum parallel tasks for a group.
+#
+# Note that no tasks will be stopped if the number is lowered.
+# The limit only applies when schelduing.
+export def set-parallel-limit [
+ max: int # The maximum parallel tasks allowed for a group when schelduing.
+ --group (-g): string # The group to set the limit for. By default this is `default`.
+] {
+ let args = if $group != null {
+ ["--group" $group]
+ } else {
+ []
+ }
+
+ pueue parallel ...$args $max
+}