2018-01-10 10:24:21 +03:00
|
|
|
= Controlling kitty from scripts or the shell
|
|
|
|
|
|
|
|
kitty can be controlled from scripts or the shell prompt. You can open new
|
|
|
|
windows, send arbitrary text input to any window, name windows and tabs, etc.
|
|
|
|
Let's walk through a few examples of controlling kitty.
|
|
|
|
|
|
|
|
Start by running kitty as:
|
|
|
|
|
|
|
|
kitty -o allow_remote_control=yes --window-layout tall
|
|
|
|
|
|
|
|
In order for control to work, `allow_remote_control` must be enabled in
|
|
|
|
kitty.conf. Here we turn it on explicitly at the command line.
|
|
|
|
|
|
|
|
Now, in the new kitty window, enter the command:
|
|
|
|
|
|
|
|
kitty @ new-window --title Output --keep-focus cat
|
|
|
|
|
|
|
|
This will open a new window, running the ``cat`` program that will appear next
|
|
|
|
to the current window.
|
|
|
|
|
|
|
|
Let's send some text to this new window:
|
|
|
|
|
|
|
|
kitty @ send-text --match cmdline:cat Hello, World
|
|
|
|
|
|
|
|
This will make `Hello, World` show up in the window running the `cat` program.
|
|
|
|
The `--match` option is very powerful, it allows selecting windows by their
|
|
|
|
titles, the command line of the program running in the window, the working
|
|
|
|
directory of the program running in the window, etc. See `kitty @ send-text
|
|
|
|
--help` for details.
|
|
|
|
|
|
|
|
More usefully, you can pipe the output of a command running in one window to
|
|
|
|
another window, for example:
|
|
|
|
|
|
|
|
ls | kitty @ send-text --match title:Output --stdin
|
|
|
|
|
|
|
|
This will show the output of ls in the output window instead of the current
|
|
|
|
window. You can use this technique to, for example, show the output of running
|
2018-01-10 10:53:04 +03:00
|
|
|
`make` in your editor in a different window. The possibilities are endless.
|
2018-01-10 10:24:21 +03:00
|
|
|
|
|
|
|
You can even have things you type show up in a different window. Run:
|
|
|
|
|
|
|
|
kitty @ send-text --match title:Output --stdin
|
|
|
|
|
|
|
|
And type some text, it will show up in the output window, instead of the current
|
|
|
|
window. Type `Ctrl+D` when you are ready to stop.
|
|
|
|
|
|
|
|
Now, let's open a new tab.
|
|
|
|
|
|
|
|
kitty @ new-window --new-tab --tab-title "My Tab" --keep-focus bash
|
|
|
|
|
|
|
|
This will open a new tab running the bash shell with the title "My Tab".
|
|
|
|
We can change the title of the tab with:
|
|
|
|
|
|
|
|
kitty @ set-tab-title --match title:My New Title
|
|
|
|
|
|
|
|
Let's change the title of the current tab:
|
|
|
|
|
|
|
|
kitty @ set-tab-title Master Tab
|
|
|
|
|
2018-03-15 15:11:49 +03:00
|
|
|
Now lets switch to the newly opened tab:
|
2018-01-10 10:53:04 +03:00
|
|
|
|
2018-03-15 15:11:49 +03:00
|
|
|
kitty @ focus-tab --match title:New
|
|
|
|
|
|
|
|
Similarly, to focus the previously opened output window (which will also switch
|
|
|
|
back to the old tab, automatically):
|
|
|
|
|
|
|
|
kitty @ focus-window --match title:Output
|
2018-01-10 10:53:04 +03:00
|
|
|
|
2018-01-10 10:30:59 +03:00
|
|
|
You can get a listing of available tabs and windows, by running:
|
|
|
|
|
|
|
|
kitty @ ls
|
|
|
|
|
|
|
|
This outputs a tree of data in JSON format. The top level of the tree is all
|
|
|
|
operating system kitty windows. Each OS window has an id and a list of tabs.
|
|
|
|
Each tab has its own id, a title and a list of windows. Each window has an id,
|
|
|
|
title, current working directory, process id (PID) and command-line of the
|
|
|
|
process running in the window. You can use this information with `--match`
|
|
|
|
to control individual windows.
|
|
|
|
|
2018-01-10 10:24:21 +03:00
|
|
|
As you can see, it is very easy to control kitty using the
|
|
|
|
`kitty @` messaging system. This tutorial touches only the
|
|
|
|
surface of what is possible. See `kitty @ --help` for more details.
|
2018-02-10 05:05:36 +03:00
|
|
|
|
2018-03-03 08:08:25 +03:00
|
|
|
Note that in the example's above, `kitty @` messaging works only when run inside a kitty window,
|
|
|
|
not anywhere. But, within a kitty window it even works over SSH. If you want to control
|
|
|
|
kitty from programs/scripts not running inside a kitty window, you have to implement a couple of
|
|
|
|
extra steps. First start kitty as:
|
|
|
|
|
|
|
|
kitty -o allow_remote_control=yes --listen-on unix:/tmp/mykitty
|
|
|
|
|
|
|
|
The `--listen-on` option tells kitty to listen for control messages at the
|
|
|
|
specified path. See `kitty --help` for details. Now you can control this
|
|
|
|
instance of kitty using the `--to` command line argument to `kitty @`. For example:
|
|
|
|
|
|
|
|
kitty @ --to unix:/tmp/mykitty ls
|
|
|
|
|
|
|
|
|
|
|
|
Note that is all you want to do is run a single kitty "daemon" and have subsequent
|
|
|
|
kitty invocations appear as new top-level windows, you can use the simpler `--single-instance`
|
|
|
|
option, see `kitty --help` for that.
|
2018-04-06 12:36:28 +03:00
|
|
|
|
|
|
|
== The builtin kitty shell
|
|
|
|
|
|
|
|
You can explore the kitty command language more easily using the builtin kitty
|
|
|
|
shell. Run `kitty @` with no arguments and you will be dropped into the kitty
|
|
|
|
shell with completion for kitty command names and options.
|
|
|
|
|
|
|
|
You can even open the kitty shell inside a running kitty using a simple
|
|
|
|
keyboard shortcut (`ctrl+shift+escape` by default). This has the added
|
|
|
|
advantage that you dont need to use `allow_remote_control` to make it work.
|