kitty/remote-control.asciidoc
2018-04-06 15:06:28 +05:30

111 lines
4.3 KiB
Plaintext

= 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
`make` in your editor in a different window. The possibilities are endless.
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
Now lets switch to the newly opened tab:
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
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.
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.
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.
== 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.