summaryrefslogtreecommitdiff
path: root/accounts
diff options
context:
space:
mode:
Diffstat (limited to 'accounts')
-rw-r--r--accounts/gkleen@sif/niri/default.nix221
-rw-r--r--accounts/gkleen@sif/systemd.nix2
-rw-r--r--accounts/gkleen@sif/zshrc4
3 files changed, 112 insertions, 115 deletions
diff --git a/accounts/gkleen@sif/niri/default.nix b/accounts/gkleen@sif/niri/default.nix
index 8752f3e3..35a3d799 100644
--- a/accounts/gkleen@sif/niri/default.nix
+++ b/accounts/gkleen@sif/niri/default.nix
@@ -3,6 +3,7 @@ let
3 cfg = config.programs.niri; 3 cfg = config.programs.niri;
4 4
5 kdl = flakeInputs.niri-flake.lib.kdl; 5 kdl = flakeInputs.niri-flake.lib.kdl;
6 sleaf = name: arg: kdl.node name [arg] [];
6 7
7 niri = cfg.package; 8 niri = cfg.package;
8 terminal = lib.getExe config.programs.kitty.package; 9 terminal = lib.getExe config.programs.kitty.package;
@@ -450,7 +451,7 @@ in {
450 { title = ".*Passkey credentials$"; } 451 { title = ".*Passkey credentials$"; }
451 ]; 452 ];
452 windowRuleExtra = with kdl; [ 453 windowRuleExtra = with kdl; [
453 (kdl.leaf "open-focused" false) 454 (sleaf "open-focused" false)
454 ]; 455 ];
455 key = "Mod+Control+P"; 456 key = "Mod+Control+P";
456 app-id = "org.keepassxc.KeePassXC"; 457 app-id = "org.keepassxc.KeePassXC";
@@ -488,7 +489,7 @@ in {
488 exec dex $HOME/.local/state/nix/profile/share/applications/kimai.desktop 489 exec dex $HOME/.local/state/nix/profile/share/applications/kimai.desktop
489 '')) ]; 490 '')) ];
490 windowRuleExtra = with kdl; [ 491 windowRuleExtra = with kdl; [
491 (leaf "block-out-from" "screencast") 492 (sleaf "block-out-from" "screencast")
492 ]; 493 ];
493 } 494 }
494 ]; 495 ];
@@ -500,10 +501,12 @@ in {
500 then v 501 then v
501 else null; 502 else null;
502 opt-props = lib.filterAttrs (lib.const (value: value != null)); 503 opt-props = lib.filterAttrs (lib.const (value: value != null));
504 normalize-nodes = nodes: lib.remove null (lib.flatten nodes);
503 in 505 in
504 [ (flag "prefer-no-csd") 506 normalize-nodes [
507 (flag "prefer-no-csd")
505 508
506 (leaf "screenshot-path" "~/screenshots/%Y-%m-%dT%H:%M:%S.png") 509 (sleaf "screenshot-path" "~/screenshots/%Y-%m-%dT%H:%M:%S.png")
507 510
508 (plain "hotkey-overlay" [ 511 (plain "hotkey-overlay" [
509 (flag "skip-at-startup") 512 (flag "skip-at-startup")
@@ -511,27 +514,27 @@ in {
511 514
512 (plain "input" [ 515 (plain "input" [
513 (plain "keyboard" [ 516 (plain "keyboard" [
514 (leaf "repeat-delay" 300) 517 (sleaf "repeat-delay" 300)
515 (leaf "repeat-rate" 50) 518 (sleaf "repeat-rate" 50)
516 519
517 (plain "xkb" [ 520 (plain "xkb" [
518 (leaf "layout" "us,us") 521 (sleaf "layout" "us,us")
519 (leaf "variant" "dvp,") 522 (sleaf "variant" "dvp,")
520 (leaf "options" "compose:caps,grp:win_space_toggle") 523 (sleaf "options" "compose:caps,grp:win_space_toggle")
521 ]) 524 ])
522 ]) 525 ])
523 526
524 (flag "workspace-auto-back-and-forth") 527 (flag "workspace-auto-back-and-forth")
525 # (leaf "focus-follows-mouse" {}) 528 # (sleaf "focus-follows-mouse" {})
526 # (flag "warp-mouse-to-focus") 529 # (flag "warp-mouse-to-focus")
527 530
528 # (plain "touchpad" [ (flag "off") ]) 531 # (plain "touchpad" [ (flag "off") ])
529 (plain "trackball" [ 532 (plain "trackball" [
530 (leaf "scroll-method" "on-button-down") 533 (sleaf "scroll-method" "on-button-down")
531 (leaf "scroll-button" 278) 534 (sleaf "scroll-button" 278)
532 ]) 535 ])
533 (plain "touch" [ 536 (plain "touch" [
534 (leaf "map-to-output" "eDP-1") 537 (sleaf "map-to-output" "eDP-1")
535 ]) 538 ])
536 ]) 539 ])
537 540
@@ -539,7 +542,7 @@ in {
539 (plain "hot-corners" [(flag "off")]) 542 (plain "hot-corners" [(flag "off")])
540 ]) 543 ])
541 544
542 (plain "environment" (lib.mapAttrsToList leaf { 545 (plain "environment" (lib.mapAttrsToList sleaf {
543 NIXOS_OZONE_WL = "1"; 546 NIXOS_OZONE_WL = "1";
544 QT_QPA_PLATFORM = "wayland"; 547 QT_QPA_PLATFORM = "wayland";
545 QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; 548 QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
@@ -552,47 +555,47 @@ in {
552 SUDO_ASKPASS = lib.getExe pkgs.kdePackages.ksshaskpass; 555 SUDO_ASKPASS = lib.getExe pkgs.kdePackages.ksshaskpass;
553 })) 556 }))
554 557
555 (node "output" "eDP-1" [ 558 (node "output" ["eDP-1"] [
556 (leaf "scale" 1.5) 559 (sleaf "scale" 1.5)
557 (leaf "position" { x = 0; y = 0; }) 560 (sleaf "position" { x = 0; y = 0; })
558 ]) 561 ])
559 (node "output" "Ancor Communications Inc ASUS PB287Q 0x0000DD9B" [ 562 (node "output" ["Ancor Communications Inc ASUS PB287Q 0x0000DD9B"] [
560 (leaf "scale" 1.5) 563 (sleaf "scale" 1.5)
561 (leaf "position" { x = 2560; y = 0; }) 564 (sleaf "position" { x = 2560; y = 0; })
562 ]) 565 ])
563 (node "output" "HP Inc. HP 727pu CN4417143K" [ 566 (node "output" ["HP Inc. HP 727pu CN4417143K"] [
564 (leaf "mode" "2560x1440@119.998") 567 (sleaf "mode" "2560x1440@119.998")
565 (leaf "scale" 1) 568 (sleaf "scale" 1)
566 (leaf "position" { x = 2560; y = 0; }) 569 (sleaf "position" { x = 2560; y = 0; })
567 (flag "variable-refresh-rate") 570 (flag "variable-refresh-rate")
568 ]) 571 ])
569 572
570 (plain "debug" [ 573 (plain "debug" [
571 (leaf "render-drm-device" "/dev/dri/by-path/pci-0000:00:02.0-render") 574 (sleaf "render-drm-device" "/dev/dri/by-path/pci-0000:00:02.0-render")
572 ]) 575 ])
573 576
574 (plain "animations" [ 577 (plain "animations" [
575 (leaf "slowdown" 0.5) 578 (sleaf "slowdown" 0.5)
576 (plain "workspace-switch" [(flag "off")]) 579 (plain "workspace-switch" [(flag "off")])
577 ]) 580 ])
578 581
579 (plain "layout" [ 582 (plain "layout" [
580 (leaf "gaps" 8) 583 (sleaf "gaps" 8)
581 (plain "struts" [ 584 (plain "struts" [
582 (leaf "left" 26) 585 (sleaf "left" 26)
583 (leaf "right" 26) 586 (sleaf "right" 26)
584 (leaf "top" 0) 587 (sleaf "top" 0)
585 (leaf "bottom" 0) 588 (sleaf "bottom" 0)
586 ]) 589 ])
587 (plain "border" [ 590 (plain "border" [
588 (leaf "width" 2) 591 (sleaf "width" 2)
589 (leaf "active-gradient" { 592 (sleaf "active-gradient" {
590 from = "hsla(195 100% 45% 1)"; 593 from = "hsla(195 100% 45% 1)";
591 to = "hsla(155 100% 37.5% 1)"; 594 to = "hsla(155 100% 37.5% 1)";
592 angle = 29; 595 angle = 29;
593 relative-to = "workspace-view"; 596 relative-to = "workspace-view";
594 }) 597 })
595 (leaf "inactive-gradient" { 598 (sleaf "inactive-gradient" {
596 from = "hsla(0 0% 27.7% 1)"; 599 from = "hsla(0 0% 27.7% 1)";
597 to = "hsla(0 0% 23% 1)"; 600 to = "hsla(0 0% 23% 1)";
598 angle = 29; 601 angle = 29;
@@ -603,29 +606,29 @@ in {
603 (flag "off") 606 (flag "off")
604 ]) 607 ])
605 608
606 (plain "preset-column-widths" (map (prop: leaf "proportion" prop) [ 609 (plain "preset-column-widths" (map (prop: sleaf "proportion" prop) [
607 (1. / 4.) (1. / 3.) (1. / 2.) (2. / 3.) (3. / 4.) (1.) 610 (1. / 4.) (1. / 3.) (1. / 2.) (2. / 3.) (3. / 4.) (1.)
608 ])) 611 ]))
609 (plain "default-column-width" [ (leaf "proportion" (1. / 2.)) ]) 612 (plain "default-column-width" [ (sleaf "proportion" (1. / 2.)) ])
610 (plain "preset-window-heights" (map (prop: leaf "proportion" prop) [ 613 (plain "preset-window-heights" (map (prop: sleaf "proportion" prop) [
611 (1. / 3.) (1. / 2.) (2. / 3.) (1.) 614 (1. / 3.) (1. / 2.) (2. / 3.) (1.)
612 ])) 615 ]))
613 616
614 (flag "always-center-single-column") 617 (flag "always-center-single-column")
615 618
616 (plain "tab-indicator" [ 619 (plain "tab-indicator" [
617 (leaf "gap" 4) 620 (sleaf "gap" 4)
618 (leaf "width" 8) 621 (sleaf "width" 8)
619 (leaf "gaps-between-tabs" 4) 622 (sleaf "gaps-between-tabs" 4)
620 (flag "place-within-column") 623 (flag "place-within-column")
621 (leaf "length" { total-proportion = 1.; }) 624 (sleaf "length" { total-proportion = 1.; })
622 (leaf "active-gradient" { 625 (sleaf "active-gradient" {
623 from = "hsla(195 100% 60% 0.75)"; 626 from = "hsla(195 100% 60% 0.75)";
624 to = "hsla(155 100% 50% 0.75)"; 627 to = "hsla(155 100% 50% 0.75)";
625 angle = 29; 628 angle = 29;
626 relative-to = "workspace-view"; 629 relative-to = "workspace-view";
627 }) 630 })
628 (leaf "inactive-gradient" { 631 (sleaf "inactive-gradient" {
629 from = "hsla(0 0% 42% 0.66)"; 632 from = "hsla(0 0% 42% 0.66)";
630 to = "hsla(0 0% 35% 0.66)"; 633 to = "hsla(0 0% 35% 0.66)";
631 angle = 29; 634 angle = 29;
@@ -639,129 +642,121 @@ in {
639 ]) 642 ])
640 643
641 (map (name: 644 (map (name:
642 (node "workspace" name [ 645 (node "workspace" [name] [
643 (leaf "open-on-output" "eDP-1") 646 (sleaf "open-on-output" "eDP-1")
644 ]) 647 ])
645 ) (map ({name, ...}: name) cfg.scratchspaces)) 648 ) (map ({name, ...}: name) cfg.scratchspaces))
646 (map (name: 649 (map (name:
647 (leaf "workspace" name) 650 (sleaf "workspace" name)
648 ) ["comm" "web" "vid" "bmr"]) 651 ) ["comm" "web" "vid" "bmr"])
649 652
650 (plain "window-rule" [ 653 (plain "window-rule" [
651 (leaf "clip-to-geometry" true) 654 (sleaf "clip-to-geometry" true)
652 ]) 655 ])
653 656
654 (plain "window-rule" [ 657 (plain "window-rule" [
655 (leaf "match" { is-floating = true; }) 658 (sleaf "match" { is-floating = true; })
656 (leaf "geometry-corner-radius" 8) 659 (sleaf "geometry-corner-radius" 8)
657 (plain "shadow" [ (flag "on") ]) 660 (plain "shadow" [ (flag "on") ])
658 ]) 661 ])
659 662
660 (plain "window-rule" [ 663 (plain "window-rule" [
661 (leaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; }) 664 (sleaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; })
662 (leaf "block-out-from" "screencast") 665 (sleaf "block-out-from" "screencast")
663 ]) 666 ])
664 (plain "window-rule" [ 667 (plain "window-rule" (normalize-nodes [
665 (map (title: 668 (map (title:
666 (leaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; inherit title; }) 669 (sleaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; inherit title; })
667 ) ["^Unlock Database.*" "^Access Request.*" ".*Passkey credentials$" "Browser Access Request$"]) 670 ) ["^Unlock Database.*" "^Access Request.*" ".*Passkey credentials$" "Browser Access Request$"])
668 (leaf "open-focused" true) 671 (sleaf "open-focused" true)
669 (leaf "open-floating" true) 672 (sleaf "open-floating" true)
670 ]) 673 ]))
671 674
672 (map ({ name, match, exclude, windowRuleExtra, ... }: 675 (map ({ name, match, exclude, windowRuleExtra, ... }:
673 (optional-node (match != []) (plain "window-rule" [ 676 (optional-node (match != []) (plain "window-rule" (normalize-nodes [
674 (map (leaf "match") match) 677 (map (sleaf "match") match)
675 (map (leaf "exclude") exclude) 678 (map (sleaf "exclude") exclude)
676 (leaf "open-on-workspace" name) 679 (sleaf "open-on-workspace" name)
677 (leaf "open-maximized" true) 680 (sleaf "open-maximized" true)
678 windowRuleExtra 681 windowRuleExtra
679 ])) 682 ])))
680 ) cfg.scratchspaces) 683 ) cfg.scratchspaces)
681 684
682 (plain "window-rule" [ 685 (plain "window-rule" [
683 (leaf "match" { app-id = "^emacs$"; }) 686 (sleaf "match" { app-id = "^emacs$"; })
684 (leaf "match" { app-id = "^firefox$"; }) 687 (sleaf "match" { app-id = "^firefox$"; })
685 (plain "default-column-width" [(leaf "proportion" (2. / 3.))]) 688 (plain "default-column-width" [(sleaf "proportion" (2. / 3.))])
686 ]) 689 ])
687 (plain "window-rule" [ 690 (plain "window-rule" [
688 (leaf "match" { app-id = "^kitty$"; }) 691 (sleaf "match" { app-id = "^kitty$"; })
689 (leaf "match" { app-id = "^kitty-play$"; }) 692 (sleaf "match" { app-id = "^kitty-play$"; })
690 (plain "default-column-width" [(leaf "proportion" (1. / 3.))]) 693 (plain "default-column-width" [(sleaf "proportion" (1. / 3.))])
691 ]) 694 ])
692 695
693 (plain "window-rule" [ 696 (plain "window-rule" [
694 (leaf "match" { app-id = "^thunderbird$"; }) 697 (sleaf "match" { app-id = "^thunderbird$"; })
695 (leaf "match" { app-id = "^Element$"; }) 698 (sleaf "match" { app-id = "^Element$"; })
696 (leaf "match" { app-id = "^chrome-web\.openrainbow\.com__-Default$"; }) 699 (sleaf "match" { app-id = "^chrome-web\.openrainbow\.com__-Default$"; })
697 (leaf "open-on-workspace" "comm") 700 (sleaf "open-on-workspace" "comm")
698 ]) 701 ])
699 (plain "window-rule" [ 702 (plain "window-rule" [
700 (leaf "match" { app-id = "^firefox$"; }) 703 (sleaf "match" { app-id = "^firefox$"; })
701 (leaf "open-on-workspace" "web") 704 (sleaf "open-on-workspace" "web")
702 (leaf "open-maximized" true) 705 (sleaf "open-maximized" true)
703 ]) 706 ])
704 (plain "window-rule" [ 707 (plain "window-rule" [
705 (leaf "match" { app-id = "^mpv$"; }) 708 (sleaf "match" { app-id = "^mpv$"; })
706 (leaf "open-on-workspace" "vid") 709 (sleaf "open-on-workspace" "vid")
707 (plain "default-column-width" [(leaf "proportion" 1.)]) 710 (plain "default-column-width" [(sleaf "proportion" 1.)])
708 ]) 711 ])
709 (plain "window-rule" [ 712 (plain "window-rule" [
710 (leaf "match" { app-id = "^kitty-play$"; }) 713 (sleaf "match" { app-id = "^kitty-play$"; })
711 (leaf "open-on-workspace" "vid") 714 (sleaf "open-on-workspace" "vid")
712 (leaf "open-focused" false) 715 (sleaf "open-focused" false)
713 ]) 716 ])
714 (plain "window-rule" [ 717 (plain "window-rule" [
715 (leaf "match" { app-id = "^chrome-audiobookshelf\.yggdrasil\.li__-Default$"; }) 718 (sleaf "match" { app-id = "^chrome-audiobookshelf\.yggdrasil\.li__-Default$"; })
716 (leaf "match" { app-id = "^YouTube Music Desktop App$"; }) 719 (sleaf "match" { app-id = "^YouTube Music Desktop App$"; })
717 (leaf "open-on-workspace" "vid") 720 (sleaf "open-on-workspace" "vid")
718 ]) 721 ])
719 (plain "window-rule" [ 722 (plain "window-rule" [
720 (leaf "match" { app-id = "^pdfpc$"; }) 723 (sleaf "match" { app-id = "^pdfpc$"; })
721 (plain "default-column-width" [(leaf "proportion" 1.)]) 724 (plain "default-column-width" [(sleaf "proportion" 1.)])
722 ]) 725 ])
723 (plain "window-rule" [ 726 (plain "window-rule" [
724 (leaf "match" { app-id = "^pdfpc$"; title = "^.*presentation.*$"; }) 727 (sleaf "match" { app-id = "^pdfpc$"; title = "^.*presentation.*$"; })
725 (plain "default-column-width" [(leaf "proportion" 1.)]) 728 (plain "default-column-width" [(sleaf "proportion" 1.)])
726 (leaf "open-fullscreen" true) 729 (sleaf "open-fullscreen" true)
727 (leaf "open-on-workspace" "bmr") 730 (sleaf "open-on-workspace" "bmr")
728 (leaf "open-focused" false) 731 (sleaf "open-focused" false)
729 ]) 732 ])
730 (plain "window-rule" [ 733 (plain "window-rule" (normalize-nodes [
731 (map (leaf "match") [ 734 (map (sleaf "match") [
732 { app-id = "^Gimp-"; title = "^Quit GIMP$"; } 735 { app-id = "^Gimp-"; title = "^Quit GIMP$"; }
733 { app-id = "^org\\.kde\\.polkit-kde-authentication-agent-1$"; } 736 { app-id = "^org\\.kde\\.polkit-kde-authentication-agent-1$"; }
734 { app-id = "^xdg-desktop-portal-gtk$"; } 737 { app-id = "^xdg-desktop-portal-gtk$"; }
735 ]) 738 ])
736 (leaf "open-floating" true) 739 (sleaf "open-floating" true)
737 ]) 740 ]))
738 (plain "window-rule" [ 741 (plain "window-rule" [
739 (leaf "match" { app-id = "^org\\.pwmt\\.zathura$"; }) 742 (sleaf "match" { app-id = "^org\\.pwmt\\.zathura$"; })
740 (leaf "match" { app-id = "^evince$"; }) 743 (sleaf "match" { app-id = "^evince$"; })
741 (leaf "match" { app-id = "^org\\.gnome\\.Papers$"; }) 744 (sleaf "match" { app-id = "^org\\.gnome\\.Papers$"; })
742 (leaf "default-column-display" "tabbed") 745 (sleaf "default-column-display" "tabbed")
743 ]) 746 ])
744 747
745 (plain "layer-rule" [ 748 (plain "layer-rule" [
746 (leaf "match" { namespace = "^notifications$"; }) 749 (sleaf "match" { namespace = "^notifications$"; })
747 (leaf "match" { namespace = "^waybar$"; }) 750 (sleaf "match" { namespace = "^waybar$"; })
748 (leaf "match" { namespace = "^launcher$"; }) 751 (sleaf "match" { namespace = "^launcher$"; })
749 (leaf "block-out-from" "screencast") 752 (sleaf "block-out-from" "screencast")
750 ]) 753 ])
751 754
752 (plain "binds" 755 (plain "binds"
753 (let 756 (let
754 bind = name: cfg: node name (opt-props { 757 bind = name: cfg: node name [(lib.removeAttrs cfg ["action"])] (lib.mapAttrsToList leaf (lib.removeAttrs cfg.action ["__functor"]));
755 cooldown-ms = cfg.cooldown-ms or null;
756 }
757 // (lib.optionalAttrs (!(cfg.repeat or true)) {
758 repeat = false;
759 })
760 // (lib.optionalAttrs (cfg.allow-when-locked or false) {
761 allow-when-locked = true;
762 })) (lib.mapAttrsToList leaf (lib.removeAttrs cfg.action ["__functor"]));
763 in 758 in
764 [ 759 normalize-nodes [
765 (lib.mapAttrsToList bind (with config.lib.niri.actions; { 760 (lib.mapAttrsToList bind (with config.lib.niri.actions; {
766 "Mod+Slash".action = show-hotkey-overlay; 761 "Mod+Slash".action = show-hotkey-overlay;
767 762
diff --git a/accounts/gkleen@sif/systemd.nix b/accounts/gkleen@sif/systemd.nix
index 90cccc58..18c2315f 100644
--- a/accounts/gkleen@sif/systemd.nix
+++ b/accounts/gkleen@sif/systemd.nix
@@ -385,6 +385,8 @@ in {
385 }; 385 };
386 Service = { 386 Service = {
387 ExecStart = "${config.systemd.package}/lib/systemd/systemd-socket-proxyd --exit-idle-time=60s 127.0.0.1:${toString (port + 1)}"; 387 ExecStart = "${config.systemd.package}/lib/systemd/systemd-socket-proxyd --exit-idle-time=60s 127.0.0.1:${toString (port + 1)}";
388 Restart = "always";
389 RestartSec = "23s";
388 }; 390 };
389 }) [{ host = "proxy.ssh.math.lmu.de"; port = 8118; } { host = "proxy.vidhar"; port = 8120; } { host = "proxy.mathw0h"; port = 8122; } { host = "proxy.mathw0e"; port = 8124; }]); 391 }) [{ host = "proxy.ssh.math.lmu.de"; port = 8118; } { host = "proxy.vidhar"; port = 8120; } { host = "proxy.mathw0h"; port = 8122; } { host = "proxy.mathw0e"; port = 8124; }]);
390 sockets = listToAttrs (map (port: nameValuePair "proxy-to-autossh-socks@${toString port}" { 392 sockets = listToAttrs (map (port: nameValuePair "proxy-to-autossh-socks@${toString port}" {
diff --git a/accounts/gkleen@sif/zshrc b/accounts/gkleen@sif/zshrc
index abc200c6..b24ff257 100644
--- a/accounts/gkleen@sif/zshrc
+++ b/accounts/gkleen@sif/zshrc
@@ -93,7 +93,7 @@ dir() {
93 if [[ $curlArchive = "true" ]]; then 93 if [[ $curlArchive = "true" ]]; then
94 archiveFile=$(mktemp -t "archive.XXXXXXXXXX.${templateArchive:t}") 94 archiveFile=$(mktemp -t "archive.XXXXXXXXXX.${templateArchive:t}")
95 95
96 curl -L -o ${archiveFile} ${templateArchive} 96 curl -SfL -o ${archiveFile} ${templateArchive}
97 97
98 templateArchive=${archiveFile} 98 templateArchive=${archiveFile}
99 fi 99 fi
@@ -231,7 +231,7 @@ clock() {
231} 231}
232 232
233public-ip() { 233public-ip() {
234 curl -s -H 'Accept: application/json' $@ ifconfig.co | jq -r '.ip' 234 curl -sSf -H 'Accept: application/json' $@ ifconfig.co | jq -r '.ip'
235} 235}
236 236
237swap() { 237swap() {