overview.rst 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. Overview
  2. ==============
  3. Design philosophy
  4. -------------------
  5. |kitty| is designed for power keyboard users. To that end all its controls work
  6. with the keyboard (although it fully supports mouse interactions as well). Its
  7. configuration is a simple, human editable, single file for easy reproducibility
  8. (I like to store configuration in source control).
  9. The code in |kitty| is designed to be simple, modular and hackable. It is
  10. written in a mix of C (for performance sensitive parts), Python (for easy
  11. extensibility and flexibility of the UI) and Go (for the command line
  12. :term:`kittens`). It does not depend on any large and complex UI toolkit,
  13. using only OpenGL for rendering everything.
  14. Finally, |kitty| is designed from the ground up to support all modern terminal
  15. features, such as Unicode, true color, bold/italic fonts, text formatting, etc.
  16. It even extends existing text formatting escape codes, to add support for
  17. features not available elsewhere, such as colored and styled (curly) underlines.
  18. One of the design goals of |kitty| is to be easily extensible so that new
  19. features can be added in the future with relatively little effort.
  20. .. include:: basic.rst
  21. Configuring kitty
  22. -------------------
  23. |kitty| is highly configurable, everything from keyboard shortcuts to painting
  24. frames-per-second. Press :sc:`edit_config_file` in kitty to open its fully
  25. commented sample config file in your text editor. For details see the
  26. :doc:`configuration docs <conf>`.
  27. .. toctree::
  28. :hidden:
  29. conf
  30. .. _layouts:
  31. Layouts
  32. ----------
  33. A :term:`layout` is an arrangement of multiple :term:`kitty windows <window>`
  34. inside a top-level :term:`OS window <os_window>`. The layout manages all its
  35. windows automatically, resizing and moving them as needed. You can create a new
  36. :term:`window` using the :sc:`new_window` key combination.
  37. Currently, there are seven layouts available:
  38. * **Fat** -- One (or optionally more) windows are shown full width on the top,
  39. the rest of the windows are shown side-by-side on the bottom
  40. * **Grid** -- All windows are shown in a grid
  41. * **Horizontal** -- All windows are shown side-by-side
  42. * **Splits** -- Windows arranged in arbitrary patterns created using horizontal
  43. and vertical splits
  44. * **Stack** -- Only a single maximized window is shown at a time
  45. * **Tall** -- One (or optionally more) windows are shown full height on the
  46. left, the rest of the windows are shown one below the other on the right
  47. * **Vertical** -- All windows are shown one below the other
  48. By default, all layouts are enabled and you can switch between layouts using
  49. the :sc:`next_layout` key combination. You can also create shortcuts to select
  50. particular layouts, and choose which layouts you want to enable, see
  51. :ref:`conf-kitty-shortcuts.layout` for examples. The first layout listed in
  52. :opt:`enabled_layouts` becomes the default layout.
  53. For more details on the layouts and how to use them see :doc:`the documentation
  54. <layouts>`.
  55. .. toctree::
  56. :hidden:
  57. layouts
  58. Extending kitty
  59. ------------------
  60. kitty has a powerful framework for scripting. You can create small terminal
  61. programs called :doc:`kittens <kittens_intro>`. These can be used to add features
  62. to kitty, for example, :doc:`editing remote files <kittens/remote_file>` or
  63. :doc:`inputting Unicode characters <kittens/unicode_input>`. They can also be
  64. used to create programs that leverage kitty's powerful features, for example,
  65. :doc:`viewing images <kittens/icat>` or :doc:`diffing files with image support
  66. <kittens/diff>`.
  67. You can :doc:`create your own kittens to scratch your own itches
  68. <kittens/custom>`.
  69. For a list of all the builtin kittens, :ref:`see here <kittens>`.
  70. Additionally, you can use the :ref:`watchers <Watchers>` framework
  71. to create Python scripts that run in response to various events such as windows
  72. being resized, closing, having their titles changed, etc.
  73. .. toctree::
  74. :hidden:
  75. kittens_intro
  76. Remote control
  77. ------------------
  78. |kitty| has a very powerful system that allows you to control it from the
  79. :doc:`shell prompt, even over SSH <remote-control>`. You can change colors,
  80. fonts, open new :term:`windows <window>`, :term:`tabs <tab>`, set their titles,
  81. change window layout, get text from one window and send text to another, etc.
  82. The possibilities are endless. See the :doc:`tutorial <remote-control>` to get
  83. started.
  84. .. toctree::
  85. :hidden:
  86. remote-control
  87. .. _sessions:
  88. Startup Sessions
  89. ------------------
  90. You can control the :term:`tabs <tab>`, :term:`kitty window <window>` layout,
  91. working directory, startup programs, etc. by creating a *session* file and using
  92. the :option:`kitty --session` command line flag or the :opt:`startup_session`
  93. option in :file:`kitty.conf`. An example, showing all available commands:
  94. .. code-block:: session
  95. # Set the layout for the current tab
  96. layout tall
  97. # Set the working directory for windows in the current tab
  98. cd ~
  99. # Create a window and run the specified command in it
  100. launch zsh
  101. # Create a window with some environment variables set and run vim in it
  102. launch --env FOO=BAR vim
  103. # Set the title for the next window
  104. launch --title "Chat with x" irssi --profile x
  105. # Create a new tab
  106. # The part after new_tab is the optional tab title which will be displayed in
  107. # the tab bar, if omitted, the title of the active window will be used instead.
  108. new_tab my tab
  109. cd ~/somewhere
  110. # Set the layouts allowed in this tab
  111. enabled_layouts tall,stack
  112. # Set the current layout
  113. layout stack
  114. launch zsh
  115. # Create a new OS window
  116. # Any definitions specified before the first new_os_window will apply to first OS window.
  117. new_os_window
  118. # Set new window size to 80x24 cells
  119. os_window_size 80c 24c
  120. # Set the --class for the new OS window
  121. os_window_class mywindow
  122. # Change the OS window state to normal, fullscreen, maximized or minimized
  123. os_window_state normal
  124. launch sh
  125. # Resize the current window (see the resize_window action for details)
  126. resize_window wider 2
  127. # Make the current window the active (focused) window in its tab
  128. focus
  129. # Make the current OS Window the globally active window (not supported on Wayland)
  130. focus_os_window
  131. launch emacs
  132. # Create a complex layout using multiple splits. Creates two columns of
  133. # windows with two windows in each column. The windows in the firt column are
  134. # split 50:50. In the second column the windows are not evenly split.
  135. new_tab complex tab
  136. layout splits
  137. # First window, set a user variable on it so we can focus it later
  138. launch --var window=first
  139. # Create the second column by splitting the first window vertically
  140. launch --location=vsplit
  141. # Create the third window in the second column by splitting the second window horizontally
  142. # Make it take 40% of the height instead of 50%
  143. launch --location=hsplit --bias=40
  144. # Go back to focusing the first window, so that we can split it
  145. focus_matching_window var:window=first
  146. # Create the final window in the first column
  147. launch --location=hsplit
  148. .. note::
  149. The :doc:`launch <launch>` command when used in a session file cannot create
  150. new OS windows, or tabs.
  151. .. note::
  152. Environment variables of the for :code:`${NAME}` or :code:`$NAME` are
  153. expanded in the session file, except in the *arguments* (not options) to the
  154. launch command.
  155. Creating tabs/windows
  156. -------------------------------
  157. kitty can be told to run arbitrary programs in new :term:`tabs <tab>`,
  158. :term:`windows <window>` or :term:`overlays <overlay>` at a keypress.
  159. To learn how to do this, see :doc:`here <launch>`.
  160. .. toctree::
  161. :hidden:
  162. launch
  163. Mouse features
  164. -------------------
  165. * You can click on a URL to open it in a browser.
  166. * You can double click to select a word and then drag to select more words.
  167. * You can triple click to select a line and then drag to select more lines.
  168. * You can triple click while holding :kbd:`Ctrl+Alt` to select from clicked
  169. point to end of line.
  170. * You can right click to extend a previous selection.
  171. * You can hold down :kbd:`Ctrl+Alt` and drag with the mouse to select in
  172. columns.
  173. * Selecting text automatically copies it to the primary clipboard (on platforms
  174. with a primary clipboard).
  175. * You can middle click to paste from the primary clipboard (on platforms with a
  176. primary clipboard).
  177. * You can right click while holding :kbd:`Ctrl+Shift` to open the output of the
  178. clicked on command in a pager (requires :ref:`shell_integration`)
  179. * You can select text with kitty even when a terminal program has grabbed the
  180. mouse by holding down the :kbd:`Shift` key
  181. All these actions can be customized in :file:`kitty.conf` as described
  182. :ref:`here <conf-kitty-mouse.mousemap>`.
  183. You can also customize what happens when clicking on :term:`hyperlinks` in
  184. kitty, having it open files in your editor, download remote files, open things
  185. in your browser, etc.
  186. For details, see :doc:`here <open_actions>`.
  187. .. toctree::
  188. :hidden:
  189. open_actions
  190. Font control
  191. -----------------
  192. |kitty| has extremely flexible and powerful font selection features. You can
  193. specify individual families for the regular, bold, italic and bold+italic fonts.
  194. You can even specify specific font families for specific ranges of Unicode
  195. characters. This allows precise control over text rendering. It can come in
  196. handy for applications like powerline, without the need to use patched fonts.
  197. See the various font related configuration directives in
  198. :ref:`conf-kitty-fonts`.
  199. .. _scrollback:
  200. The scrollback buffer
  201. -----------------------
  202. |kitty| supports scrolling back to view history, just like most terminals. You
  203. can use either keyboard shortcuts or the mouse scroll wheel to do so. While
  204. you are browsing the scrollback a :opt:`small indicator <scrollback_indicator_opacity>`
  205. is displayed along the right edge of the window to show how far back you are.
  206. However, |kitty| has an extra, neat feature. Sometimes you need to explore the scrollback
  207. buffer in more detail, maybe search for some text or refer to it side-by-side
  208. while typing in a follow-up command. |kitty| allows you to do this by pressing
  209. the :sc:`show_scrollback` shortcut, which will open the scrollback buffer in
  210. your favorite pager program (which is :program:`less` by default). Colors and
  211. text formatting are preserved. You can explore the scrollback buffer comfortably
  212. within the pager.
  213. Additionally, you can pipe the contents of the scrollback buffer to an
  214. arbitrary, command running in a new :term:`window`, :term:`tab` or
  215. :term:`overlay`. For example::
  216. map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting less +G -R
  217. Would open the scrollback buffer in a new :term:`window` when you press the
  218. :kbd:`F1` key. See :sc:`show_scrollback <show_scrollback>` for details.
  219. If you want to use it with an editor such as :program:`vim` to get more powerful
  220. features, see for example, `kitty-scrollback.nvim
  221. <https://github.com/mikesmithgh/kitty-scrollback.nvim>`__ or `kitty-grab <https://github.com/yurikhan/kitty_grab>`__
  222. or see more tips for using various editor programs, in :iss:`this thread <719>`.
  223. If you wish to store very large amounts of scrollback to view using the piping
  224. or :sc:`show_scrollback <show_scrollback>` features, you can use the
  225. :opt:`scrollback_pager_history_size` option.
  226. Integration with shells
  227. ---------------------------------
  228. kitty has the ability to integrate closely within common shells, such as `zsh
  229. <https://www.zsh.org/>`__, `fish <https://fishshell.com>`__ and `bash
  230. <https://www.gnu.org/software/bash/>`__ to enable features such as jumping to
  231. previous prompts in the scrollback, viewing the output of the last command in
  232. :program:`less`, using the mouse to move the cursor while editing prompts, etc.
  233. See :doc:`shell-integration` for details.
  234. .. toctree::
  235. :hidden:
  236. shell-integration
  237. .. _cpbuf:
  238. Multiple copy/paste buffers
  239. -----------------------------
  240. In addition to being able to copy/paste from the system clipboard, in |kitty|
  241. you can also setup an arbitrary number of copy paste buffers. To do so, simply
  242. add something like the following to your :file:`kitty.conf`::
  243. map f1 copy_to_buffer a
  244. map f2 paste_from_buffer a
  245. This will allow you to press :kbd:`F1` to copy the current selection to an
  246. internal buffer named ``a`` and :kbd:`F2` to paste from that buffer. The buffer
  247. names are arbitrary strings, so you can define as many such buffers as you need.
  248. Marks
  249. -------------
  250. kitty has the ability to mark text on the screen based on regular expressions.
  251. This can be useful to highlight words or phrases when browsing output from long
  252. running programs or similar. To learn how this feature works, see :doc:`marks`.
  253. .. toctree::
  254. :hidden:
  255. marks