1.2.2 • Published 1 year ago

newin v1.2.2

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

neWin

CLI command to open new Window(s) or Tab(s) on WSL Windows Terminal or KDE Konsole and executes bash command(s).

$ newin --workdir ~/myproject 'npm run start' 'npm run test:watch'

# executes each command in a separate new window and exits.

Works with KDE Konsole or Windows Terminal in WSL, without any code changes or config.

On Windows, it can be called as-is from WSL, PowerShell or cmd.

Written in Nodejs/TypeScript, but it works for everyone.

Perfect companion for your package.json scripts in a multi-flavor team!

Motivation

I needed a powerful way to start tasks on new windows (or tabs) automatically, mainly from within my nodejs scripts.

For example, don't we all want to npm run dev to start an API server AND its integration tests, but on 2 separate windows? In a tiny line of code?

I needed it to be:

  • without external bash scripts like I used to crack the problem, but straight from package.json.

  • laconic, with sane defaults

  • powerful, able to open multiple windows and run multiple commands and set a meaningful title.

  • portable, at least on Linux KDE & Windows Terminal, with no code/package changes.

  • supporting Windows mapped Drive letters - eg Z: pointing to \\wsl.localhost\ubuntu

Unfortunately, it's much more complicated that one would think in 2023. I found wttab & ttab but none was working for my case. I was actually inspired and based initial code on wttab. Unfortunately as it was M$ Windows-only, it wasn't possible to use it in a dual Windows/native linux as-is, and also there were some other breaking issues.

The neWin in comparison is:

  • Same command works on both WSL, PowerShell and native Linux - keeps you package.json scripts consistent.

  • Multiple commands can be executed, each opening in a new window! So in your package.json's scripts you can have

    scripts:
      "dev": "newin 'npm run start:watch' 'npm run test:watch'"

to start a development API server & the integration tests on separate windows, in the most terse way ;-)

In the future I'd love neWin to just support more of *Nix options (Macs & other Linux consoles).

Install

npm install -g newin

On WSL/Windows/PowerShell/Cmd:

On WSL:

  • Make sure $WSL_INTEROP env variable is set and it's working (i.e you should be able to execute "$ wt.exe" etc on your WSL shell)

Usage

╰─$ newin --help          
Usage: newin [options] [cmds...]

Opens multiple new windows/tabs on KDE Konsole or Windows Terminal (WT) & execute given bash command(s).

  * Works as-is from either WSL Linux shell, PowerShell, cmd or a native Linux KDE konsole shell!

  * It uses the default Konsole / WT Profile.

  * It uses a workdir relative to CWD or an absolute dir.

  * On WSL/Windows it always calls "source /etc/environment" to set the correct path and environment variables.

  Notes:

  * On WSL, make sure $WSL_INTEROP variable is set and working (i.e you should be able to execute "$ wt.exe" etc on your WSL shell)

  * On Linux Konsole, DONT use multiple bash commands for each window, as it fails in various ways (it's Konsole's fault as far as I can dig, please help if you know better). For example DONT USE $ newin "ls & npm -v". Opening in multiple windows (eg $ newin "ls" "npm -v") works as expected!

  Examples:

    $ newin                                          # opens a new window on CWD

    $ newin -workdir /mnt/projects                   # opens a new window on an absolute path on WSL (/mnt/projects in this case)
    $ newin -workdir ~/projects                      # opens a new window on an absolute path on WSL (~/projects in this case)
    
    $ newin -workdir z:\\mnt\\projects                 # opens a new window on a Windows absolute path (z:\\mnt\\projects in this case). 
                                                     # It is correctly translated when called from Windows, if the drive letter is mapped to a WSL Linux instance (eg Z: mapped to \\\\wsl.localhost\\ubuntu)

    $ newin -workdir projects                        # opens a new window on ./projects, relative to CWD
    $ newin -workdir ./projects                      #                  same ^

    $ newin 'npm -v' 'node -v'                       # execute 'npm -v' on a new window and 'node -v' on another one.

    $ newin -p 'Ubuntu-20.04'                        # use this profile name. NOTE: in current distro only - see below.

    $ newin --color AF3 --title foo "node -v"

    $ newin --color AF3 --title 'ZenDash: test:watch' --workdir 'projects/devzen/packages/zendash' 'node -v'

  Note: Commands that are (Konsole only) or (WT Only) are ignored on the other environment.
  

Options:

  -d --workdir <workdir>       Specify working directory of new window. It is relative to
                               CWD, unless it starts with '/' or '~' where it becomes
                               absolute. Default is CWD. (default: ".")
  -n, --new-tab                Open a new Tab instead of a new Window. Default is new
                               Window.
  -t, --title <title>          (WT Only) Specify title for new Window/Tab. It suppresses native app titles.
  
  It defaults to "<lastPath>: $ <bashCmd>" where "lastPath" is taken from "/some/project/path/lastpath"
  
  A nodejs specific tweek is that if a bash command starts with "npm run", "npm-run-all" or "npx", these are removed!
  
  Eg $ newin  --workdir '~/project' 'npm run start:watch'
  
  gives rise to the title "/project: $ start:watch"
  
  -o --notitle                 Leave the title alone!
  -c --color <hexcode>         (WT Only) Set color of Tab - no need to add # and quotes, but you can do so.
  -e --echo                    (WT Only) Echo bash command before executing.
  -l --close                   (Konsole only) Close the initial session automatically when
                               it ends (Konsole executed by default with --hold).
  -s --separate                (Konsole only) Run the new instance of Konsole in a
                               separate process.
  -p, --profile "profileName"  Use this profile, by name. NOTE: on Windows Terminal, it
                               uses the profile settings (colors, fonts etc) BUT RUNS ON
                               CURRENT DISTRO, for some esoteric Microsoft reason ;-(
  --debug                      Enable debugging, outputs the command(s) before executing.
  -h, --help                   Display help for command

Contributing

Help to improve neWin is absolutely welcome! Please open an issue if you have issues or suggestions.

Most of all, as I have no time or way to support other distros / platforms, it would be great if someone can implement the MacOS and other Linux consoles (eg gnome-terminal). PRs (with tests) are mostly welcome.

References

Commands taken from Official Windows Terminal docs & https://docs.kde.org/trunk5/en/konsole/konsole/command-line-options.html

Copyright (c) 2023 Angelos Pikoulas

1.2.0

1 year ago

1.2.2

1 year ago

1.2.1

1 year ago

1.1.0

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago