# Changelog

To install the unreleased tmuxp version, see [developmental releases](https://tmuxp.git-pull.com/quickstart.html#developmental-releases).

[pip](https://pip.pypa.io/en/stable/):

```console
$ pip install --user --upgrade --pre tmuxp
```

[pipx](https://pypa.github.io/pipx/docs/):

```console
$ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force
// Usage: tmuxp@next load yoursession
```

## tmuxp 1.56.0 (Yet to be released)

<!-- To maintainers and contributors: Please add notes for the forthcoming version below -->

- _Future release notes will be placed here_

## tmuxp 1.55.0 (2025-02-26)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: Bump minimum version from 0.45.0 -> 0.46.0 (#969)

  0.46.0+ needs this release of tmuxp to stay up-to-date with test helpers.

## tmuxp 1.54.0 (2025-02-23)

### Breaking changes

- libtmux: Bump minimum version from 0.44.2 -> 0.45.0 (#968)

  0.45.0+ needs this release of tmuxp to stay up-to-date with test helpers.

### Development

- CI: Check CLI modules runtime dependencies (#967)

  An extra set of checks on top of #965.

## tmuxp 1.53.0 (2025-02-19)

### Bug fixes

- Fix import type unavailable at runtime (#965)

### Development

- CI: Check for runtime dependencies (#965)
- libtmux: Bump minimum version from 0.42.0 -> 0.44.2 (#962)
- Tests: Improve parametrized test suite (#964)

  Convert remaining `pytest.mark.parametrize()` tests to `NamedTuple` fixtures:

  - Improved test maintainability and readability
  - Added descriptive test IDs for better failure reporting
  - Added docstrings to test fixtures
  - Files updated:
    - `test_cli.py`: Added `HelpTestFixture`
    - `test_convert.py`: Added `ConvertTestFixture` and `ConvertJsonTestFixture`
    - `test_freeze.py`: Added `FreezeTestFixture` and `FreezeOverwriteTestFixture`
    - `test_import.py`: Added `ImportTestFixture`, `ImportTeamocilTestFixture`, and `ImportTmuxinatorTestFixture`
    - `test_load.py`: Added `ZshAutotitleTestFixture`, `LogFileTestFixture`, `PluginVersionTestFixture`, and `PluginMissingTestFixture`

## tmuxp 1.52.2 (2025-02-02)

### Bug fixes

- `run_before_script()`: Additional output capturing improvements (#960)

## tmuxp 1.52.1 (2025-02-02)

### Bug fixes

- `run_before_script()`: Fix output issue (#959)

## tmuxp 1.52.0 (2025-02-02)

_Maintenance only, no bug fixes or new features_

### Development

- libtmux: Bump minimum version from 0.40.1 -> 0.42.0 (#958)

  - `run_before_script()`: Remove reliance on `console_to_str()`

## tmuxp 1.51.0 (2025-02-02)

_Maintenance only, no bug fixes or new features_

### Development

#### chore: Implement PEP 563 deferred annotation resolution (#957)

- Add `from __future__ import annotations` to defer annotation resolution and reduce unnecessary runtime computations during type checking.
- Enable Ruff checks for PEP-compliant annotations:
  - [non-pep585-annotation (UP006)](https://docs.astral.sh/ruff/rules/non-pep585-annotation/)
  - [non-pep604-annotation (UP007)](https://docs.astral.sh/ruff/rules/non-pep604-annotation/)

For more details on PEP 563, see: https://peps.python.org/pep-0563/

## tmuxp 1.50.1 (2024-12-24)

### Development

- libtmux: Bump minimum version 0.40.0 -> 0.40.1 (#956)

  Bug fix for server environmental variables from https://github.com/tmux-python/libtmux/pull/553.
  Thank you @ppentchev!

## tmuxp 1.50.0 (2024-12-20)

_Maintenance only, no bug fixes or new features_

### Development

- libtmux: Bump minimum version 0.39.0 -> 0.40.0 (#954)

  Adopts Python 3.9 syntax features

- Aggressive automated lint fixes via `ruff` (#953)

  via ruff v0.8.4, all automated lint fixes, including unsafe and previews were applied for Python 3.9:

  ```sh
  ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .
  ```

## tmuxp 1.49.0 (2024-11-26)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- Drop Python 3.8. end of life was October 7th, 2024 (#951)

  tmuxp 1.48.0 was the last release for Python 3.8.

  The minimum python for tmuxp as of 1.49.0 is Python 3.9
- libtmux 0.38.1 -> 0.39.0 (Minimum Python version of 3.9)

## tmuxp 1.48.0 (2024-11-26)

_Maintenance only, no bug fixes or new features_

### Breaking changes

#### Project and package management: poetry to uv (#949)

[uv] is the new package and project manager for the project, replacing Poetry.

[uv]: https://github.com/astral-sh/uv

#### Build system: poetry to hatchling (#949)

[Build system] moved from [poetry] to [hatchling].

[Build system]: https://packaging.python.org/en/latest/tutorials/packaging-projects/#choosing-a-build-backend
[poetry]: https://github.com/python-poetry/poetry
[hatchling]: https://hatch.pypa.io/latest/

#### Minimum libtmux version 0.37.0 -> 0.38.1 (#950)

Built with uv.

### Development

- Code quality: Use f-strings in more places (#931)

  via [ruff 0.4.2](https://github.com/astral-sh/ruff/blob/v0.4.2/CHANGELOG.md).

[uv]: https://github.com/astral-sh/uv

## tmuxp 1.47.0 (2024-04-21)

_Maintenance only, no bug fixes or new features_

### Developmental

- libtmux: 0.36.0 -> 0.37.0 (#929)

  Internal improvements to test suite (pytest-xdist and relaxing `retry_until()` tests)

## tmuxp 1.46.0 (2024-04-12)

### Breaking change

#### Workspace builder now detects terminal size (#926)

Dimensions used by workspace builder now use {py:func}`shutil.get_terminal_size()`.

In conjunction with `main-pane-height: 67%`, for instance, this will render a
proportional layout:

```yaml
session_name: my session
windows:
- window_name: example with percentage
  focus: True
  layout: main-horizontal
  options:
    main-pane-height: 67%
  panes:
  - focus: true
  - pane 
```

To use old behavior, set `TMUXP_DETECT_TERMINAL_SIZE=0` in your terminal
environment and file an issue on the tracker.

### Documentation

- Automatically linkify links that were previously only text.

### Development

- Another `ruff` linting pass, this time with ruff 0.3.7 (#928)
- poetry: 1.8.1 -> 1.8.2

  See also: https://github.com/python-poetry/poetry/blob/1.8.2/CHANGELOG.md

## tmuxp 1.45.0 (2024-03-24)

_Maintenance only, no bug fixes or new features_

### Development

- Aggressive automated lint fixes via `ruff` (#922)

  via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied:

  ```sh
  ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .
  ```

  Branches were treated with:

  ```sh
  git rebase \
      --strategy-option=theirs \
      --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \
      origin/master
  ```

## tmuxp 1.44.0 (2024-03-24)

### Breaking changes

- libtmux: 0.35.1 -> 0.36.0 (#923)

  Internal refactorings and maintenance.

## tmuxp 1.43.1 (2024-03-24)

### Breaking changes

- libtmux: 0.35.0 -> 0.35.1

  Improved support in libtmux when multiple clients attached to a session in a server.

## tmuxp 1.43.0 (2024-03-17)

### Breaking changes

- libtmux: 0.34.0 -> 0.35.0 (#920)

  Simplify redundant `target` passing and `window-index` usages (#920)

## tmuxp 1.42.0 (2024-03-17)

### Breaking changes

- libtmux: 0.33.0 -> 0.34.0 (#919)

  Explicit targets in `cmd()`

## tmuxp 1.41.1 (2024-03-17)

_Maintenance only, no bug fixes or new features_

- WorkspaceBuilder: Use `Pane.split` instead of `Window.split_window`

## tmuxp 1.41.0 (2024-03-17)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: 0.32.0 -> 0.33.0 (#918)

  Move `split_window()` to `split()`.

### Development

- poetry: 1.7.1 -> 1.8.1

  See also: https://github.com/python-poetry/poetry/blob/1.8.1/CHANGELOG.md

## tmuxp 1.40.0 (2024-03-32)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: 0.31.0.post0 -> 0.32.0 (#914)

  Export fix, ruff 0.3.0 updates.

### Development

- ruff 0.2.2 -> 0.3.0 (#913)

  Related formattings. Update CI to use `ruff check .` instead of `ruff .`.

## tmuxp 1.39.0 (2024-02-17)

_Maintenance only, no bug fixes or new features_

#### Breaking changes

- libtmux: 0.30.2 -> 0.31.0 (#912)

- Renamings of libtmux 0.31.0's streamlining of `cmd()`, renaming of `attached_{window,pane}s` to
  `active_{window,pane}s`.

## tmuxp 1.38.0 (2024-02-16)

_Maintenance only, no bug fixes or new features_

#### Breaking changes

- libtmux: 0.28.1 -> 0.30.1 (#911)

  Updated method names

- Rename methods to libtmux v0.30.0+-style (#911).

## tmuxp 1.37.1 (2024-02-15)

#### Development

- libtmux: 0.28.0 -> 0.28.1

  Maintenance release (docs and CI bumps)

#### Testing

- CI: Bump actions to node 20+ versions

## tmuxp 1.37.0 (2024-02-14)

### Breaking changes

- libtmux: 0.27.0 -> 0.28.0 (#910)

  Refresh and resize improvements

### Tests

- CI: Add tmux 3.4 to test matrix (#909)

## tmuxp 1.36.0 (2024-02-07)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: 0.26.0 -> 0.27.0 (#908)

  QueryList generic typing improvements.

## tmuxp 1.35.0 (2024-02-07)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: 0.25.0 -> 0.26.0, maintenance release (#906)

  Doc string + linting stringency updates.

### Development

- Strengthen linting (#907)

  - Add flake8-commas (COM)

    - https://docs.astral.sh/ruff/rules/#flake8-commas-com
    - https://pypi.org/project/flake8-commas/

  - Add flake8-builtins (A)

    - https://docs.astral.sh/ruff/rules/#flake8-builtins-a
    - https://pypi.org/project/flake8-builtins/

  - Add flake8-errmsg (EM)

    - https://docs.astral.sh/ruff/rules/#flake8-errmsg-em
    - https://pypi.org/project/flake8-errmsg/

## tmuxp 1.34.0 (2023-12-21)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- libtmux: 0.24.1 -> 0.25.0, maintenance release (#896)

  Improve styling via pydocstyle.

- `config_reader`: Move to `tmuxp._internal` (#897)
- `_types`: Move to `tmuxp._internal` (#900)

### Documentation

- Refactor API docs to split across multiple pages (#898)
- Remove unused reStructuredText section headers from some modules (#898)

## tmuxp 1.33.0 (2023-12-21)

_Maintenance only, no bug fixes or new features_

### CI

- Move CodeQL from advanced configuration file to GitHub's default
- Add pydocstyle rule to ruff (#891)

### Documentation

- Add docstrings to functions, methods, classes, and packages (#891)

## tmuxp 1.32.1 (2023-11-23)

### Packaging

- pypoetry: Add `gp-lib` to `test` dependency group

### Development

- libtmux: 0.24.0 -> 0.24.1 (maintenance release)

### Tests

- Shell tests: Use named, typed test fixture (#893)

## tmuxp 1.32.0 (2023-11-19)

_Maintenance only, no bug fixes or new features_

### Packaging

- Move pytest configuration to `pyproject.toml` (#886)
- Poetry: 1.6.1 -> 1.7.0

  See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md

- Add Python 3.12 to trove classifiers
- Packaging (poetry): Fix development dependencies

  Per [Poetry's docs on managing dependencies] and `poetry check`, we had it wrong: Instead of using extras, we should create these:

  ```toml
  [tool.poetry.group.group-name.dependencies]
  dev-dependency = "1.0.0"
  ```

  Which we now do.

  [Poetry's docs on managing dependencies]: https://python-poetry.org/docs/master/managing-dependencies/

### Development

- libtmux: 0.23.0 -> 0.24.0 (maintenance release)
- Move formatting from `black` to [`ruff format`] (#890)

  This retains the same formatting style of `black` while eliminating a
  dev dependency by using our existing rust-based `ruff` linter.

  [`ruff format`]: https://docs.astral.sh/ruff/formatter/

- CI: Update action packages to fix warnings

  - [dorny/paths-filter]: 2.7.0 -> 2.11.1

  [dorny/paths-filter]: https://github.com/dorny/paths-filter

## tmuxp 1.31.0 (2023-09-23)

### Breaking changes

- Python 3.7 Dropped (#885)

### Development

- **Improved typings**

  Now [`mypy --strict`] compliant (#859)

  [`mypy --strict`]: https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-strict

- Poetry 1.5.1 -> 1.6.1 (#885)

## tmuxp 1.30.1 (2023-09-09)

_Maintenance only, no bug fixes or new features_

### Breaking changes

- Cut last python 3.7 release (EOL was June 27th, 2023)

  For security updates, a 1.30.x branch can be maintained for a limited time,
  if necessary.

## tmuxp 1.30.0 (2023-09-04)

_Maintenance only, no bug fixes or new features_

### Development

- Code quality improved via [ruff] rules (#879)

  This includes fixes made by hand alongside ruff's automated fixes. The more
  stringent rules include import sorting, and still runs almost instantly
  against the whole codebase.

- CI: `black . --check` now runs on pushes and pull requests

### Packaging

- libtmux: v0.23.1 -> v0.23.2

  Final Python 3.7 release of libtmux

### Documentation

- README Example for Nix (#883), thank you @ChristopherHarwell!

## tmuxp 1.29.1 (2023-09-02)

_Maintenance only, no bug fixes or new features_

### Development

- libtmux: v0.23.0 -> v0.23.1

  Typo fixes inside libtmux

### Docs

- Typo fixes (#884), thanks @kianmeng

## tmuxp 1.29.0 (2023-08-20)

_Maintenance only, no bug fixes or new features_

### Development

- libtmux v0.22.2 -> v0.23.0 (#882)

  Code quality improvements from https://github.com/tmux-python/libtmux/pull/488

### Post-release: v1.29.0post0 (2023-09-02)

- libtmux post-release bumps

  Re-add comments that went missing from `ruff` formatter.

## tmuxp 1.28.2 (2023-08-20)

_Maintenance only, no bug fixes or new features_

### Packaging

- libtmux v0.22.1 -> v0.22.2

  Removes `setuptools` from `build-system` requirements

## tmuxp 1.28.1 (2023-05-28)

_Maintenance only, no bug fixes or new features_

### Development

- Add back `black` for formatting

  This is still necessary to accompany `ruff`, until it replaces black.

## tmuxp 1.28.0 (2023-05-27)

_Maintenance only, no bug fixes or new features_

### Internal improvements

- Move formatting, import sorting, and linting to [ruff].

  This rust-based checker has dramatically improved performance. Linting and
  formatting can be done almost instantly.

  This change replaces black, isort, flake8 and flake8 plugins.

- libtmux: 0.21.1 -> 0.22.0 (Moved to ruff as well)
- poetry: 1.4.0 -> 1.5.0

  See also: https://github.com/python-poetry/poetry/releases/tag/1.5.0

[ruff]: https://ruff.rs

## tmuxp 1.27.1 (2022-04-07)

_Maintenance only, no bug fixes or new features_

### Development

- Update mypy to 1.2.0
- libtmux 0.21.0 -> 0.21.1 (mypy / typing updates only)

## tmuxp 1.27.0 (2022-01-29)

_Maintenance only, no bug fixes or new features_

### Internal improvements

- libtmux 0.20.0 -> 0.21.0 (#865)

  This updates the separator uses from libtmux to be a rarer character. See
  [libtmux#475](https://github.com/tmux-python/libtmux/pull/475).

## tmuxp 1.26.0 (2023-01-15)

_Maintenance only, no bug fixes or new features_

### Internal improvements

- libtmux 0.19.1 -> 0.20.0 (#863)

  Improves support around `Server.new_session` and its params, e.g. `-x` and
  `-y`.

## tmuxp 1.25.0 (2023-01-07)

### Internal improvements

- libtmux 0.18.3 -> 0.19.1 (#862)

  0.19.1 has a fix for `Window.set_window_option()`

## tmuxp 1.24.1 (2023-01-07)

### Internal improvements

- libtmux: 0.18.2 -> 0.18.3 (#861)

  via [libtmux#466](https://github.com/tmux-python/libtmux/pull/466)

- tests(test_pane_order): Improve reliability of `pane_current_path` test.

## tmuxp 1.24.0 (2022-12-30)

_Maintenance only, no bug fixes or new features_

### Internal improvements

- libtmux: 0.18.1 -> 0.18.2

  Fix for starting new sessions at default socket / temporary directory
  ([libtmux#464](https://github.com/tmux-python/libtmux/pull/464))

- CLI Tests: Refactor `tests/cli` (#858)

  - Fix resolution of directories

- WorkspaceBuilder: Require `Server` in constructor (#857)

## tmuxp 1.23.0 (_yanked_, 2022-12-28)

_Yanked release: `tmuxp load` issues, see #856_

### Internal improvements

_Maintenance only, no bug fixes or new features_

- Type annotations: More mypy typings (#796)

## tmuxp 1.22.1 (2022-12-27)

_Maintenance only, no bug fixes or new features_

- Update libtmux 0.18.0 -> 0.18.1

  Only code documentation fixes

## tmuxp 1.22.0 (2022-12-27)

### Improvement

- `tmuxp shell`: now detects current `server` via `TMUX` (#854)

## tmuxp 1.21.0 (2022-12-27)

_Maintenance only, no bug fixes or new features_

- libtmux 0.17.2 -> 0.18.0

  Server: Improved `__repr__`

## tmuxp 1.20.3 (2022-12-27)

- Fix warnings for `_update_panes()` in builder

## tmuxp 1.20.2 (2022-12-27)

_Internal update only_

- libtmux 0.17.1 -> 0.17.2

  More deprecation warnings

## tmuxp 1.20.1 (2022-12-27)

_Internal update only_

- libtmux 0.17.0 -> ~0.17.1

  Deprecation warning updates, doc fixes

### Development

- Poetry 1.2.2 -> 1.3.1

## tmuxp 1.20.0 (2022-12-26)

### Breaking change

- libtmux 0.16 -> 0.17 (#850)

  This includes the API overhaul from
  [libtmux#426](https://github.com/tmux-python/libtmux/pull/426).

### Development

- Tests: Stabilization fix for automatic rename test (#853)

## tmuxp 1.19.1 (2022-12-12)

### Fixes

- Update libtmux 0.16.0 -> 0.16.1

  This removes the underlying dependency on `packaging`

## tmuxp 1.19.0 (2022-12-10)

### What's new

- Environment variables for windows / panes (#845)

  _Requires tmux 3.0_

  Allow to configure window and pane specific environment variables

  Having a setup like:

  ```yaml
  session_name: env-demo
  environment:
    DATABASE_URL: "sqlite3:///default.db"
  windows:
    - window_name: dev
      environment:
        DATABASE_URL: "sqlite3:///dev-1.db"
      panes:
        - pane
        - environment:
            DATABASE_URL: "sqlite3:///dev-2.db"
  ```

  will result in a window with two panes. In the first pane `$DATABASE_URL` is
  `sqlite3:///dev-1.db`, while in the second pane it is `sqlite3://dev-2.db`.
  Any freshly created window gets `sqlite3:///default.db` as this is what was
  defined for the session.

  Credit: @zappolowski

### Internal

- Update libtmux 0.15.9 -> 0.16.0

  - Support for environmental variables
  - Remove reliance on `distutils.version.LooseVersion` for
    `libtmux._compat.LegacyVersion`

- Fix distutil warnings by using libtmux 0.16.0's `LegacyVersion` (#727)

## tmuxp 1.18.2 (2022-11-06)

**Maintenance release, no features or fixes**

### Development

- Bump libtmux from 0.15.9 -> 0.15.10 (only test tweaks)
- Poetry no longer forces `in-project: true`

## tmuxp 1.18.1 (2022-10-31)

### Bug fix

- cli: `tmuxp load`: Fix pass-through of config files (#843)

## tmuxp 1.18.0 (2022-10-30)

We now refer to configs as workspaces. Other than just, just maintenance.

### Internal refactoring (#840)

#### Rename config to workspace

Reference to "config" are now "workspace"

#### Organize files

- `cli/utils.py` functions moved to `workspace/finders.py`
- `config.py` split between:

  - `workspace/finders.py`
  - `workspace/freezer.py`
  - `workspace/importers.py`
  - `workspace/validation.py`

- `workspacebuilder.py` split into:

  - `workspace/builder.py`
  - `workspace/freezer.py`

    `config.inline` moved to freezer

#### Tests

- `tests/fixtures/{workspacebuilder,workspacefreezer}` -> `tests/fixtures/workspace/{builder,freezer}`
- `tests/test_import_{teamocil,tmuxinator}.py` -> `tests/workspace/test_import_{teamocil,tmuxinator}.py`

## tmuxp 1.17.3 (2022-10-30)

**Maintenance release, no features or fixes**

### Development

- Add python 3.11 to test grid, pyenv / asdf files (#842)

### Packaging

- Add python 3.11 to classifiers

## tmuxp 1.17.2 (2022-10-29)

### Bug fix

- CLI: Fix loading of multiple workspaces in `tmuxp load` (#838 fixes #837)

## tmuxp 1.17.1 (2022-10-15)

### Minor completion improvements

- Improved shtab completions for files with `tmuxp load [tab]` (#834)

### Internal

- Remove unused completion code leftover from click (#834)

## tmuxp 1.17.0 (2022-10-09)

### Breaking changes

- **Completions have changed** (#830)

  Completions now use a different tool: [shtab]. See the [completions page] for more information.

  If you were using earlier versions of tmuxp (earlier than 1.17.0), you may need to uninstall the old completions, first.

  [completions page]: https://tmuxp.git-pull.com/cli/completion.html
  [shtab]: https://docs.iterative.ai/shtab/

- Deprecate `click` in favor of {mod}`argparse` (#830)

### Packages

- Remove `click` dependency

## tmuxp 1.16.2 (2022-10-08)

### Packaging

- Add `yaml` to required dependencies (#833, credit: @heindsight)

## tmuxp 1.16.1 (2022-10-02)

### Bug fix

- Update libtmux 0.15.7 -> 0.15.8

  Includes an improvement for blank window names, e.g. `window_name: ''`

  See also: https://github.com/tmux-python/libtmux/pull/444

## tmuxp 1.16.0 (2022-10-01)

**Maintenance release, no features or fixes**

### Internal

- Add `ConfigReader`: Our clean, typed parser for raw strings and files (#828)

  This is our shiny, new, 200-line, doctested and typed parser that replaces `kaptan`.

### Packaging

- Drop kaptan dependency (#828)

## tmuxp 1.15.3 (2022-10-01)

### Bug fixes

- WorkspaceBuilder: Fix bug in `start_directory` (#829, credit: @heindsight)

## tmuxp 1.15.2 (2022-09-24)

**Maintenance release, no features or fixes**

### Packaging

- Move conftest.py to root, to avoid packaging in wheel (#826 vs #825)

## tmuxp 1.15.1 (2022-09-23)

**Maintenance release, no features or fixes**

### Infrastructure

- CI speedups (#819)

  - Split out release to separate job so the PyPI Upload docker image isn't pulled on normal runs
  - Clean up CodeQL

- Bump poetry 1.1.x -> 1.2.x
- Bump libtmux 0.15.1 -> 0.15.7
  - 0.15.7 (move `.coveragerc` -> `pyproject.toml`)
  - 0.15.6 (#823, pytest fixes, packaging improvements)
  - 0.15.3 (#821, pytest plugin improvements, root-level
    conftest.py)
- Move `.coveragerc` -> `pyproject.toml` (#824)

### Packaging

- Remove `MANIFEST.in`

  This is handled by poetry's `include` in pyproject.toml.

- Remove `.tmuxp-before-script.sh` from `.tmuxp.yaml`

## tmuxp 1.15.0 (2022-09-11)

**Maintenance release, no features or fixes**

### Development

- Project moved to `src/` layout (#814)

## tmuxp 1.14.0 (2022-09-11)

**Maintenance release, no features or fixes**

There will be several of these releases as infrastructure and APIs are upgraded
to facilitate fixes for layout issues and general contributions.

### Development

- libtmux bumped to v0.15.1

  This includes a major retooling underneath, including `src/` layout and
  testing of `doctest` in documentation.

[v0.15.1]: https://github.com/tmux-python/libtmux/blob/v0.15.1/CHANGES#libtmux-0151-2022-09-11

### Documentation

- Render changelog in [`linkify_issues`] (#812)
- Fix Table of contents rendering with sphinx autodoc with [`sphinx_toctree_autodoc_fix`] (#812)
- Test doctests in our docs via [`pytest_doctest_docutils`] (built on [`doctest_docutils`]) (#812)

[`linkify_issues`]: https://gp-libs.git-pull.com/linkify_issues/
[`sphinx_toctree_autodoc_fix`]: https://gp-libs.git-pull.com/sphinx_toctree_autodoc_fix/
[`pytest_doctest_docutils`]: https://gp-libs.git-pull.com/doctest/pytest.html
[`doctest_docutils`]: https://gp-libs.git-pull.com/doctest

## tmuxp 1.13.3 (2022-09-10)

- Revert v1.13.1's #793 change for now, the behavior behind launching workspace
  layouts need to be understood clearly. Future releases will decisively solve
  this issue (#811).

## tmuxp 1.13.2 (2022-09-10)

### Bug fixes

- Layout size has been bumped for those experiencing layout spacing issues
  (#809, fixes #800)

  If you encounter issues with pane spacing, consider passing an `option` like
  so:

  ```yaml
  session_name: main-pane-height
  start_directory: "~"
  options:
    default-size: 999x999
  windows:
    - window_name: my window name
      layout: main-horizontal
      options:
        main-pane-height: 30
      panes:
        - shell_command: top
        - shell_command: top
        - shell_command: top
        - shell_command: echo "hey"
        - shell_command: echo "moo"
  ```

### Development

- Add [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) (#807)
- Add [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) (#808)

## tmuxp 1.13.1 (2022-08-21)

### Bug fixes

- Fix layout related issues from #667, #704, #737, via
  #793. Thank you @nvasilas.

## tmuxp 1.13.0 (2022-08-14)

### Internal

- libtmux updated from v0.12 to v0.14 #790
- Add [doctest](https://docs.python.org/3/library/doctest.html) w/
  [pytest + doctest](https://docs.pytest.org/en/7.1.x/how-to/doctest.html) via #791.
- Added basic [mypy](http://mypy-lang.org/) type annotations via #786

## tmuxp 1.12.1 (2022-08-04)

### Bug fix

- #787 Fix #724 Fix `start_directory` issue with first pane,
  credit: nvasilas.

## tmuxp 1.12.0 (2022-07-31)

_Mostly internal cleanups, no features_

### Tests

- #774 Fix #620 tests not finishing
- #777 Fix #778 to move the old, broken `retry()` to the new
  `retry_until()`, credit: @categulario.
- #783 Fix #620 Symlink edge for for pane order tests, credit: @categulario.
- #781 Testing with ZSH will mock `~/.zshrc` startup file for cleaner
  pane outputs.

## tmuxp 1.11.1 (2022-05-02)

### Bug fix

- #775: Assure click 8+

  tmuxp 1.10 supports click 7.x.

## tmuxp 1.11.0 (2022-04-24)

### Compatibility

- #773: Allow click 8.1.x
- #770: Fix shell completion for `tmuxp load` {kbd}`tab` and `tmuxp freeze`
  {kbd}`tab`
- Note: Requires click 8+ (#770)

### Maintenance

- #762: CLI: Break up into modules in _cli.py_ -> _cli/{command}_
- #761: Refactor _tests/_ constants and fixtures
- Show libtmux version with `-V` / `--version`

### Development

- Remove tox and tox-poetry-installer

  This created issues with running poetry while inside the virtualenv.

- Publish packages to PyPI via github action by setting git tag.

## tmuxp 1.10.1 (2022-04-17)

### Compatibility

- #773 (backport): Allow click 8.1.x

## tmuxp 1.10.0 (2022-03-19)

### Compatibility

- Final python 3.7 and 3.8 release

  Bug fixes and security updates will go to
  [`v1.10.x`](https://github.com/tmux-python/tmuxp/tree/v1.10.x)

### What's new

- #747: Skip execution via `enter: false`

  See {ref}`enter`.

  :::{note}

  _Experimental setting_: behavior and api is subject to change until stable.

  :::

  ```yaml
  session_name: Should not execute
  windows:
    - panes:
        - shell_command:
            - echo "this sends"
            - cmd: echo "___$((1 + 3))___"
              enter: false
            # pane-wide skip
        - shell_command:
            - echo "___$((1 + 3))___"
          enter: false
  ```

- #750: Pause execution via `sleep_before: [int]` and `sleep_after: [int]`

  See {ref}`sleep`.

  :::{note}

  _Experimental setting_: behavior and api is subject to change until stable.

  :::

  ```yaml
  session_name: Pause / skip command execution (command-level)
  windows:
    - panes:
        - shell_command:
            # Executes immediately
            - echo "___$((11 + 1))___"
            # Delays before sending 2 seconds
            - cmd: echo "___$((1 + 3))___"
              sleep_before: 2
            # Executes immediately
            - cmd: echo "___$((1 + 3))___"
            # Pauses 2 seconds after
            - cmd: echo "Stuff rendering here!"
              sleep_after: 2
            # Executes after earlier commands (after 2 sec)
            - cmd: echo "2 seconds later"
  ```

- #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the
  `--config-format` and filename (`--save-to`). This means you can do it all in
  one command:

  `tmuxp freeze -yqo .tmuxp.yaml`

  Or bind it to `.tmux.conf` itself: `bind -T root C-s run-shell "tmuxp freeze -yqo .tmuxp.yaml"`

  Credit: [@davidatbu](https://github.com/davidatbu)

- #672: Panes now accept `shell` for their initial command.

  Equivalent to `tmux split-windows`'s `[shell-command]`

  ```yaml
  session_name: Pane shell example
  windows:
    - window_name: first
      window_shell: /usr/bin/python2
      layout: even-vertical
      suppress_history: false
      options:
        remain-on-exit: true
      panes:
        - shell: /usr/bin/python3
          shell_command:
            - print('This is python 3')
        - shell: /usr/bin/vim -u none
          shell_command:
            - iAll panes have the `remain-on-exit` setting on.
            - When you exit out of the shell or application, the panes will remain.
            - Use tmux command `:kill-pane` to remove the pane.
            - Use tmux command `:respawn-pane` to restart the shell in the pane.
            - Use <Escape> and then `:q!` to get out of this vim window. :-)
        - shell_command:
            - print('Hello World 2')
        - shell: /usr/bin/top
  ```

  Credit: @jerri

### Improvements

- Improve `tmuxp freeze` UX flow, credit @joseph-flinn (#657, in re: #627)
- `tmuxp freeze` will now detect the attached session if no session name
  is specified. Credit: @will-ockmore. (#660)

### Bugs

- Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725)

### Internal API

- #752: Command structure (internal API)

  To pave the way for per-command options such as `enter: false` (#53), commands are now a different format:

  Before, [`str`](str):

  ```python
  "echo hello"
  ```

  After, {py:class}`dict`:

  ```python
  {
     "cmd": "echo hello"
  }
  ```

  This is purely internal. Normal usage should be the same since the
  configuration emits the equivalent result.

- #752: Configuration parsing refactorings

### Development

- Run through black + isort with string normalization (#738). This way we can
  use black without any configuration. (One-time, big diff)
- Run codebase through pyupgrade (#745)
- Add `codeql-analysis.yml` to try it out

### Documentation

- Move to `furo` sphinx theme
- Reorganize documentation into sections
- Added examples for `enter: false` and `sleep: [second]`

## tmuxp 1.9.4 (2022-01-10)

### Packaging

- `poetry build` used to package in place of `python setup.py build` (#729)

  Package maintainers: If you run into any issues check in at #625 and file an issue.

  Additionally, `libtmux` has been pinned to a similar release at
  [0.10.3](https://pypi.org/project/libtmux/0.10.3/) which has used the new
  build process.

- `poetry publish` instead of `twine upload dist/*` (#729)

  Similar to the above, reach out to the #625 issue if you bump into problems.

### What's new

- `tmuxp edit` for configuration changes (#707, @GlebPoljakov)

  Inside of configuration directory: `tmuxp edit yourconfig`

  Inside a project: `tmuxp edit .`

### Removed support

- Python 3.6 support has been removed (#726)

### Development

- We are trying `.pre-commit-config.yaml` in pull requests to automate
  black, isort and flake8 for those who forget (#726)
- Poetry update 1.1.7 -> 1.1.12 and use new installer URL (#726)
- Black updated 21.9b0 -> 21.12b0 (#726)

## tmuxp 1.9.3 (2021-10-30)

- #700: Add `-h` / `--help` option, thanks @GHPS
- #689: Update poetry to 1.1
  - CI: Use poetry 1.1.7 and `install-poetry.py` installer
  - Relock poetry.lock at 1.1 (w/ 1.1.7's fix)
- #696: Typo fix, thanks @inkch

## tmuxp 1.9.2 (2021-06-17)

- #686: Allow click 8.0.x
- Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals

## tmuxp 1.9.1 (2021-06-16)

- libtmux: Update to 0.10.1+ to include `Window.select_window()` fix

  https://github.com/tmux-python/libtmux/pull/271

## tmuxp 1.9.0 (2021-06-16)

- libtmux: Update to 0.10.x

## tmuxp 1.8.2 (2021-06-15)

- #474 Re-release with `python setup.py sdist bdist_wheel` to
  fix missing test files

## tmuxp 1.8.1 (2021-06-14)

- #681 Bump version to make homebrew release easier

## tmuxp 1.8.0.post0 (2021-06-14)

- #681 tmuxp is now available on homebrew! Thank you @jvcarli!

## tmuxp 1.8.0 (2021-06-14)

- #662 CI: Only update docs when changed
- #666 CI: Move test plugin packages from pyproject.toml to
  pytest fixtures. Fixes #658
- #661

  - Bump minimum version 3.5 -> 3.6
  - Drop python 2.7 support
  - Modernize syntax (remove `__future__` and modesets)
  - Update black to 21.6b0

## tmuxp 1.7.2 (2021-02-03)

- #666 CI: Move test plugin packages from pyproject.toml to
  pytest fixtures. Fixes #658

## tmuxp 1.7.1 (2021-02-03)

- #665 Support for passing tmux config file (`-f`), thanks
  @jfindlay! Fixes #654

## tmuxp 1.6.5 (2021-02-03)

- #665 Support for passing tmux config file (`-f`), thanks @jfindlay! Fixes
  #654

## tmuxp 1.7.0 (2021-01-09)

This will be the last Python 2.7 release of tmuxp. Bug fixes for python
2.7 will live in the [1.7.x branch].

- #530 New feature: Plugin system

  - Add plugin system for user customization of tmuxp
  - Add tests for the plugin system
  - Update existing tests for the plugin system
  - Add the plugin interface to the tmuxp package
  - Add in depth documentation for the plugin system

  Thank you @joseph-flinn!

- #656 New feature: Ability to append windows to a session

  `tmuxp load -a configfile` will append a configuration to your current
  tmux session.

  Thank you @will-ockmore!

- #647 Improvement: Logging to file:

  `tmuxp load <filename> --log-level outputfile.log`

- #643 New command: Debug information

  Port `tmuxp debug-info` from via v1.6.2

[1.7.x branch]: https://github.com/tmux-python/tmuxp/tree/v1.7.x

## tmuxp 1.7.0a4 (2021-01-06)

- Port click package fix from 1.6.4

## tmuxp 1.7.0a3 (2020-11-22)

- Port `tmuxp load <filename> --log-level outputfile.log` from
  1.6.3

## tmuxp 1.7.0a2 (2020-11-08)

- Port `tmuxp debug-info` from #643 from via v1.6.2

## tmuxp 1.7.0a1 (2020-11-07)

- #530 Plugin system

  - Add plugin system for user customization of tmuxp
  - Add tests for the plugin system
  - Update existing tests for the plugin system
  - Add the plugin interface to the tmuxp package
  - Add in depth documentation for the plugin system

  Thank you @joseph-flinn!

## tmuxp 1.6.4 (2021-01-06)

- #651 Fix packaging issue with click, thanks @dougharris! Fixes
  #649

## tmuxp 1.6.3 (2020-11-22)

- #647 Adding option to dump `load` output to log file, thank you
  @joseph-flinn!

  `tmuxp load file.yaml --log-file yourfile.txt`

  Adjust log levels:

  `tmuxp --log-level DEBUG load file.yaml --log-file yourfile.txt`

## tmuxp 1.6.2 (2020-11-08)

- #643 New command `tmuxp debug-info` for creating github
  issues, fixes #352. Thank you @joseph-flinn!

(v1-6-1)=

## tmuxp 1.6.1 (2020-11-07)

- #641 Improvements to `shell`

  Thanks [django-extensions] (licensed MIT) for the shell detection abstraction.

  - Deprecate `shell_plus`
  - `tmuxp shell` now detects the best shell available by default
  - Python 3.7+ with `PYTHONBREAKPOINT` set in env will drop into `pdb` by
    default
  - Drop into `code.interact` by default instead of `pdb` if no third
    party shells found
  - New options, override:

    - `--pdb`: Use plain old `breakpoint()` (python 3.7+) or
      `pdb.set_trace`
    - `--code`: Drop into `code.interact`, accepts `--use-pythonrc`
    - `--bpython`: Drop into [bpython]
    - `--ipython`: Drop into [ipython]
    - `--ptpython`: Drop into [ptpython], accepts `--use-vi-mode`
    - `--ptipython`: Drop into [ipython], accepts
      `--use-vi-mode`

[django-extensions]: https://github.com/django-extensions/django-extensions

## tmuxp 1.6.0 (2020-11-06)

- #636 + #638 New command: `tmuxp shell`

  Automatically preloads session, window, and pane via [libtmux]
  {ref}`API objects <libtmux:api>` and makes them available in a python
  console.

  ```{image} _static/tmuxp-shell.gif
  :width: 100%

  ```

  As of {ref}`1.6.1 (above) <v1-6-1>`, `tmuxp shell` will find the most
  feature-rich shell available. If you have [ipython], or
  [bpython] available, it will be selected automatically. Pass `--pdb`
  to use standard library pdb, or `--code` to use `code.interact`.

  In python 3.7+, supports `PYTHONBREAKPOINT`:

  ```{code-block} sh

  $ pip install --user ipdb
  $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell

  ```

  You can execute python directly via `-c`:

  ```{code-block} sh

  $ tmuxp shell -c 'print(session.name); print(window.name)'
  my_server
  my_window

  $ tmuxp shell my_server -c 'print(session.name); print(window.name)'
  my_server
  my_window

  $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)'
  my_server
  my_window

  $ tmuxp shell my_server my_window -c 'print(window.name.upper())'
  MY_WINDOW

  ```

[bpython]: https://bpython-interpreter.org/
[ipython]: https://ipython.org/
[ptpython]: https://github.com/prompt-toolkit/ptpython

## tmuxp 1.5.8 (2020-10-31)

- #639 Passes start_directory through to new tmux session
  Fixes #631, thank you @joseph-flinn!

## tmuxp 1.5.7 (2020-10-31)

- #637 Support for loading directories with periods in it

  `tmuxp load ~/work/your.project` will now work

  Earlier workaround was to do `tmuxp load ~/work/your.project/.tmuxp.yaml`

  Fixes #212 and #201

## tmuxp 1.5.6 (2020-10-12)

- #618: allow passing `--overwrite` to `tmuxp freeze`. Thank you
  @betoSolares!
- #589 added option for the the confirm command to auto-confirm the prompt.
  Thank you @aRkedos!
- #626 Add new session name option to cli. Thank you @joseph-flinn!
- #626 Add test for new session name option
- #626 Update docs for new session name option
- #623 Move docs from RTD to self-serve site
- #623 Modernize Makefiles
- #623 New development docs
- #623 Move doc -> docs
- #623 Move tests to GitHub Actions
- #623 Update pyproject.toml to experiment with poetry packaging
- #619 isort 5
- #629 Update black from 19.10b0 to 20.08b1

## tmuxp 1.5.5 (2020-07-26)

- #616 (via: #599) New command: `tmuxp ls`

  List commands available via config directory. If the config is printed,
  it's loadable via `tmuxp load configfilename` without needing to type the
  full filepath. Thank you @pythops!

- #480 Fix typo, thanks @jstoja
- #578 Fix typo, thanks @mauroporras
- #519 Fix typo, thanks @timgates42
- #506 Fix Makefile typo, thanks @wolfgangpfnuer
- #619 Update isort to 5.x
- Travis: Only run on master and PRs one time
- Travis: Add caching for tmux builds
- Travis: Test 2.9 and 3.0a
- #613: Move from Pipenv to Poetry

## tmuxp 1.5.4 (2019-11-06)

- #500: Fix window focus
- Fix travis CI builds for python 3.7

## tmuxp 1.5.3 (2019-06-06)

- #377: Include examples in source distribution package

## tmuxp 1.5.2 (2019-06-02)

- Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2
  released today)
- #484 CHANGES converted to plain reStructuredText
- #491 `tmuxp freeze` will now infer active session with freezing
- #490 Fix XDG's `$XDG_CONFIG_HOME` behavior
- #483, #482, #480 Doc fixes
- #487 Simplifying handling of configs with no panes (Fixes
  #470)

## tmuxp 1.5.1 (2019-02-18)

- Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package.
- Include twine to dev packages on requirements and Pipfile files.

## tmuxp 1.5.0 (2018-10-02)

- Support Click 7.0
- Remove unused `__future__` imports
- #471 Update libtmux 0.8.0 -> 0.8.1
- #404 from @anddam, support XDG base directory
- Sort imports
- Add configuration and make command for isort.
- Add sphinxcontrib-napoleon.
- Assure _requirements/dev.txt_ dependencies are in _Pipfile_
- Update sphinx, releases to latest version
- Sync _requirements/_.txt* dependencies with *Pipfile\*.
- Update docstring style to use numpy-style documentation.
  This enhances readability and plays nicely with sphinx documentation.
- Documentation overhaul.

  - Areas like {meth}`tmuxp.cli.load_workspace` are now documented verbosely.
    This is so contributors helping on the project can more quickly gain
    situational awareness in this tricky area of code.

## tmuxp 1.4.2 (2018-09-30)

- #431 Include tests in source distribution

## tmuxp 1.4.1 (2018-09-26)

- Loosen click restraint to <7

## tmuxp 1.4.0 (2018-03-11)

- Bump libtmux to 0.8.0
- #264 Update license from BSD to MIT
- #348 Continuous integration updates and fixes for Travis CI

  - Update builds to use trusty
  - Remove older python 3 versions (before 3.6)
  - Update pypy versions

- #349 flake8 via continuous integration
- Improve reliability of time-sensitive tests by
  using `while True` with a timeout.
- Update sphinx to 1.7.1
- Update alagitpull (sphinx theme) to 0.0.19.
  External websites open in new window.
- Update pytest to 3.4.1

## tmuxp 1.3.5 (2017-11-10)

- #312 Support for tmux 2.6 layout setting (via hooks) in the
  following scenarios:

  - loading outside tmux
  - loading inside tmux, via switch-client
  - loading inside tmux, with session in background (with -d), and
    reattaching/switching to after
  - loading session outside tmux in background with -d, and
    reattaching/switching after

- #308 Fix bug where layouts don't correctly set on tmux 2.6
- Upgrade libtmux to 0.7.7

## tmuxp 1.3.4 (2017-10-12)

- `before_script` now respects `start_directory`
  in the session root. This makes it easier to run things like `pipenv install` as a `before_script`.

## tmuxp 1.3.3 (2017-10-07)

- Update libtmux to 0.7.5 for tmux 2.6 hotfix

## tmuxp 1.3.2 (2017-08-20)

- #184 - update libtmux to fix environmental variables in the
  session scope
- Update libtmux to 0.7.4
- Updates to pytest and pytest-rerunfailures

## tmuxp 1.3.1 (2017-05-29)

- #252 Fix bug where loading a session with a name matching a subset
  of current session causes undesired behavior.
- Update libtmux to 0.7.3
- Switch theme to alagitpull (alabaster subtheme)
- Remove unneeded doc dependency packages

## tmuxp 1.3.0 (2017-04-27)

- #239 Improve support for formatted options when freezing and
  using configs with them.
- #236 Support for symlinked directories, thanks @rafi.
- #235 Support for `options_after`, for setting options like
  `synchronize-panes`. Thanks @sebastianst.
- #248 Drop python 2.6 support
- #248 Upgrade libtmux to 0.7.1
- Upgrade colorama from 0.3.7 to 0.3.9

## tmuxp 1.2.8 (2017-04-02)

- #229 More helpful error message on systems missing
  tmux.
- Update libtmux from 0.6.4 to 0.6.5.

## tmuxp 1.2.7 (2017-03-25)

- Support for OpenBSD.

## tmuxp 1.2.6 (2017-02-24)

- #218 Fix pane ordering by running `select-layout` before
  splits.

## tmuxp 1.2.5 (2017-02-08)

- #207 add custom tmuxp config directory via
  `TMUXP_CONFIGDIR` variable.
- #199 support for running tmuxp on tmux `master`.
- update libtmux from 0.6.2 to 0.6.3.

## tmuxp 1.2.4 (2017-01-13)

- #198 bump click from 6.6 to 6.7
- #195 pin packages for colorama and doc requirements

## tmuxp 1.2.3 (2016-12-21)

- bump libtmux 0.6.0 to 0.6.1
- #193 improve suppress history test, courtesy of @abeyer.
- #191 documentation typo from @modille
- #186 documentation typo from @joelwallis

## tmuxp 1.2.2 (2016-09-16)

- #181 Support tmux 2.3

## tmuxp 1.2.1 (2016-09-16)

- #132 Handle cases with invalid session names
- update libtmux from 0.5.0 to 0.6.0

## tmuxp 1.2.0 (2016-06-16)

- #65 Ability to specify `options` and `global_options` via
  configuration. Also you can specify environment variables via that.

  Include tests and add example.

## tmuxp 1.1.1 (2016-06-02)

- #167 fix attaching multiple sessions
- #165 fix typo in error output, thanks @fpietka
- #166 add new docs on zsh/bash completion
- Add back `tmuxp -V` for version info

## tmuxp 1.1.0 (2016-06-01)

- #160 load tmuxp configs by name
- #134 Use `click` for command-line completion, Rewrite command
  line functionality for importing, config finding, conversion and prompts.
- Remove `-l` from `tmuxp import tmuxinator|teamocil`
- #158 argparse bug overcome by switch to click

## tmuxp 1.0.2 (2016-05-25)

- #163 fix issue re-attaching sessions that are already loaded
- #159 improved support for tmuxinator imports, from @fpietka.
- #161 readme link fixes from @Omeryl.

## tmuxp 1.0.1 (2016-05-25)

- switch to readthedocs.io for docs
- #157 bump libtmux to 0.4.1

## tmuxp 1.0.0-rc1 (2016-05-25)

- version jump 0.11.1 to 1.0
- tests moved to py.test framework
- [libtmux] core split into its own project
- #145 Add new-window command functionality, @ikirudennis
- #146 Optionally disable shell history suppression, @kmactavish
- #147 Patching unittest timing for shell history suppression
- move doc building, tests and watcher to Makefile
- update .tmuxp.yaml and .tmuxp.json for Makefile change
- overhaul README

## tmuxp 0.11.0 (2016-02-29)

- #137 Support for environment settings in configs, thanks
  `@tasdomas`
- Spelling correction, thanks [@sehe].

## tmuxp 0.10.0 (2016-01-30)

- #135 Load multiple tmux sessions at once, thanks [@madprog].
- #131 #133 README and Documentation fixes

## tmuxp 0.9.3 (2016-01-06)

- switch to `.venv` for virtualenv directory to not conflict
  with `.env` (used by [autoenv]).
- #130 move to [entr(1)] for file watching in tests. update docs.
- [compatibility] Support [Anaconda Python] 2 and 3

## tmuxp 0.9.2 (2015-10-21)

- #122 Update to support tmux 2.1, thank you [@estin].
- use travis container infrastructure for faster tests
- change test in workspace builder test to use `top(1)` instead of
  `man(1)`. `man(1)` caused errors on some systems where `PAGER` is set.

## tmuxp 0.9.1 (2015-08-23)

- #119 Add fix python 3 for [sysutils/pytmuxp] on FreeBSD ports.
  See GH issue 119 and [#201564] @ FreeBSD Bugzilla. Thanks Ruslan
  Makhmatkhanov.

## tmuxp 0.9.0 (2015-07-08)

- Renamed `config.expandpath` to `config.expandshell`.
- compat 2.7/3.3 wrapper for `EnvironmentVarGuard` for
  testing.
- You can now use environment variables inside of
  `start_directory`, `before_script`, `shell_command_before`,
  `session_name` and `window_name`.
- [examples]: add example for environmental variables,
  `examples/env-variables.json` and `examples/env-variables.yaml`.
- #110 de-vendorize [colorama].
- #109 fix failure of test_pane_order on fedora machines from
  [@marbu]
- #105 append `.txt` extension to manuals (repo only)
  from [@yegortimoshenko].
- #107 Fix Server.attached_sessions return type by
  [@thomasballinger].
- update travis to use new tmux git repository.

## tmuxp 0.8.1 (2015-05-09)

- [testing]: fix sniffer test runner in python 3
- new animated image demo for RTD and README

## tmuxp 0.8.0 (2015-05-07)

- version bump 0.1.13 -> 0.8.0
- tmux 2.0 support
- Fix documentation for :meth:`Session.switch_client()`.
- Add `--log-level` argument.
- Refactor `{Server,Session,Window,Pane}.tmux` into:

  - {meth}`Server.cmd()`
  - {meth}`Session.cmd()`
  - {meth}`Window.cmd()`
  - {meth}`Pane.cmd()`

  (See conversation at <https://github.com/bitprophet/dotfiles/issues/5>)

- Refactor `util.tmux` into {meth}`util.tmux_cmd`.

## tmuxp 0.1.13 (2015-03-25)

- Remove `package_metadata.py` in favor of `__about__.py`.
- `scent.py` for building docs
- docutils from 0.11 to 0.12
- `bootstrap_env.py` will check for linux, darwin (OS X) and
  windows and install the correct [sniffer] file watcher plugin.
- testsuite for cli uses {py:func}`tempfile.mkdtemp()` instead
  `TMP_DIR` (which resolved to `.tmuxp` in the testsuite directory.
- replace [watchingtestrunner] in examples.
  `.tmuxp.conf` and `.tmux.json` updated
- updates to doc links
- `make checkbuild` for verifying internal / intersphinx doc
  references.
- Add Warning tmux versions less than 1.4 from [@techtonik].
- Add documentation on leading space in `send_keys`
  from [@thomasballinger].
- Update about page from teamocil and erb support from [@raine].

## tmuxp 0.1.12 (2014-08-06)

- [config] {meth}`config.expand` now resolves directories in configuration
  via {py:func}`os.path.expanduser` and {py:func}`os.path.expandvars`.
- [config] {meth}`config.expandpath` for helping resolve paths.
- improved support for loading tmuxp project files from
  outside current working directory. e.g.

  ```
  $ tmuxp load /path/to/my/project/.tmuxp.yaml
  ```

  Will behave better with relative directories.

## tmuxp 0.1.11 (2014-04-06)

- `before_script` now loads relative to project directory with
  `./`.
- Use `bootstrap_env.py` in tmuxp's `.tmuxp.yaml` and
  `.tmuxp.json` project files.
- Improvements to {meth}`util.run_before_script()`,
  {class}`exc.BeforeLoadScriptFailed` behavior to print `stdout` and
  return `stderr` is a non-zero exit is returned.
- `run_script_before` has moved to `util`.
- `BeforeLoadScriptFailed` and `BeforeLoadScriptNotExists`
  has moved to the `exc` module.
- Tests for `run_script_before` refactored.

## tmuxp 0.1.10 (2014-04-02)

- 2 bug fixes and allow panes with no shell commands to accept options,
  thanks for these 3 patches, [@ThiefMaster]:
- #73 Fix an error caused by spaces in
  `start_directory`.
- #77 Fix bug where having a `-` in a
  `shell_command` would cauesd a build error.
- #76 Don't require `shell_command` to
  pass options to panes (like `focus: true`).

## tmuxp 0.1.9 (2014-04-01)

- The `--force` was not with us.

## tmuxp 0.1.8 (2014-03-30)

- #72 Create destination directory if it doesn't exist. Thanks
  [@ThiefMaster].
- New context manager for tests, `temp_session`.
- New testsuite, `testsuite.test_utils` for testing testsuite
  tools.
- New command, `before_script`, which is a file to
  be executed with a return code. It can be a bash, perl, python etc.
  script.
- #56 {ref}`python_api_quickstart <libtmux:quickstart>`

## tmuxp 0.1.7 (2014-02-25)

- #55 where tmuxp would crash with letter numbers in version.
  Write tests.

## tmuxp 0.1.6 (2014-02-08)

- {meth}`Window.split_window()` now allows `-c start_directory`.
- #35 Builder will now use `-c start_directory` to
  create new windows and panes.

  This removes a hack where `default-path` would be set for new pane and
  window creations. This would bleed into tmux user sessions after
  creations.

## tmuxp 0.1.5-1 (2014-02-05)

- #49 bug where `package_manifest.py` missing
  from `MANIFEST.in` would cause error installing.

## tmuxp 0.1.5 (2014-02-05)

- section heading normalization.
- tao of tmux section now treated as a chatper. tao of tmux may be
  split off into its own project.
- use conventions from [tony/cookiecutter-pypackage].

## tmuxp 0.1.4 (2014-02-02)

- Fix `$ tmuxp freeze` CLI output.
- Update `_compat` support module.
- Fix extra space in [PEP 263].

## tmuxp 0.1.3 (2014-01-29)

- #48 Fix Python 3 CLI issue.
- #48 `$ tmuxp` without option raises an error.
- Add space before send-keys to not populate bash and zsh
  history.

## tmuxp 0.1.2 (2014-01-08)

- now using werkzeug / flask style testsuites.
- #43 Merge `tmuxp -d` for loading in detached mode.
  Thanks [roxit].

## tmuxp 0.1.1 (2013-12-25)

- #32 Fix bug where special characters caused unicode caused
  unexpected outcomes loading and freezing sessions.

## tmuxp 0.1.0 (2013-12-18)

- fix duplicate print out of filename with using `tmuxp load .`.
- version to 0.1. No `--pre` needed. Future versions will not use rc.

## tmuxp 0.1-rc8 (2013-12-17)

- `unicode_literals`
- Move py2/py3 compliance code to `_compat`.

## tmuxp 0.1-rc7 (2013-12-07)

- #33 Partial rewrite of {meth}`config.expand`.
- tmuxp will exit silently with `Ctrl-c`.

## tmuxp 0.1-rc6 (2013-12-06)

- #31 [examples] from stratoukos add `window_index` option,
  and example.

## tmuxp 0.1-rc5 (2013-12-04)

- #28 shell_command_before in session scope of config causing
  duplication. New test.
- #26 #29 for OS X tests. Thanks stratoukos.
- #27 `$ tmuxp freeze` raises unhelpful message if session doesn't
  exist.

## tmuxp 0.1-rc4 (2013-12-03)

- fix bug were `focus: true` would not launch sessions when using
  `$ tmuxp load` in a tmux session.

## tmuxp 0.1-rc3 (2013-12-03)

- #25 `focus: true` not working in panes. Add
  tests for focusing panes in config.
- {meth}`Pane.select_pane()`.
- add new example for `focus: true`.

## tmuxp 0.1-rc2 (2013-11-23)

- #23 fix bug where workspace would not build with pane-base-index
  set to 1. Update tests to fix if `pane-base-index` is not 0.
- removed `$ tmuxp load --list` functionality. Update
  {ref}`quickstart` accordingly.

## tmuxp 0.1-rc1 (2013-11-23)

- [pep8] in unit tests.
- Changelog will now be updated on a version basis, use [pep440]
  versioning.

## tmuxp 0.1-dev (2013-11-21)

- {meth}`Session.show_options`, {meth}`Session.show_option` now
  accept `g` to pass in `-g`.

## tmuxp 0.1-dev (2013-11-20)

- {meth}`Window.show_window_options`,
  {meth}`Window.show_window_option` now accept `g` to pass in `-g`.
- #15 Behavioral changes in the WorkspaceBuilder to fix pane
  ordering.
- #21 Error with unit testing python 2.6 python configuration tests.
  Use {py:mod}`tempfile` instead.
- WorkspaceBuilder tests have been improved to use async better.

## tmuxp 0.1-dev (2013-11-17)

- fix a bug where missing tmux didn't show correct warning.

## tmuxp 0.1-dev (2013-11-15)

- Travis now tests python 2.6 as requirement and not allowed to
  fail.

## tmuxp 0.1-dev (2013-11-13)

- #19 accept `-y` argument to answer yes to questions.
- {meth}`cli.SessionCompleter` no longer allows a duplicate session
  after one is added.
- ongoing work on {ref}`about-tmux`.

## tmuxp 0.1-dev (2013-11-09)

- [translation] [documentation in Chinese].
- More work done on the {ref}`about-tmux` page.
- {meth}`Pane.split_window()` for splitting {class}`Window` at
  `target-pane` location.

## tmuxp 0.1-dev (2013-11-08)

- [freeze] - `$ tmuxp freeze` will now freeze a window with a
  `start_directory` when all panes in a window are inside the same
  directory.
- [config] {meth}`config.inline` will now turn panes with no
  other attributes and 1 command into a single item value.

  ```
  - panes:
    - shell_command: top

  # will now inline to:

  - panes
    - top

  This will improve ``$ tmuxp freeze``
  ```

## tmuxp 0.1-dev (2013-11-07)

- Remove old logger (based on [tornado's log.py]), replace
  with new, simpler one.
- fix [teamocil] import.
- support import teamocil `root` to
  `start_directory`.

## tmuxp 0.1-dev (2013-11-06)

- tagged v0.0.37. Many fixes. Python 2.6 support. Will
  switch to per-version changelog after 0.1 release.
- support for blank panes (null, `pane`, `blank`) and panes
  with empty strings.
- tmuxp freeze supports exporting to blank panes.
- tmuxp freeze will now return a blank pane for panes that would
  previously return a duplicate shell command, or generic python, node
  interpreter.

## tmuxp 0.1-dev (2013-11-05)

- Support for `[-L socket-name]` and `[-S socket-path]` in
  autocompletion and when loading. Note, switching client into another
  socket may cause an error.
- Documentation tweaking to {ref}`API`, {ref}`about-tmux`.
- [pep257].

## tmuxp 0.1-dev (2013-11-04)

- [pep257].
- tagged version `v0.0.36`.

## tmuxp 0.1-dev (2013-11-02)

- Many documentation, [pep257] fixes
- move old {class}`Server` methods `__list_panes()`,
  `__list_windows` and `__list_sessions` into the single underscore.
- #12 fix for `$ tmuxp freeze` by @finder.
- Support for spaces in `$ tmuxp attach-session` and
  `$ tmuxp kill-session`, and `$ tmuxp freeze`.
- [config] support for relative paths of `start_directory`. Add an
  update config in _Start Directory_ on {ref}`examples`.

## tmuxp 0.1-dev (2013-11-01)

- New servers for {class}`Server` arguments `socket_name`,
  `socket_path`, `config_file`.
- {class}`Server` support for `-2` with `colors=256` and
  `colors=8`.
- `$ tmuxp -2` for forcing 256 colors and `tmuxp -8` for forcing 88.
- [config] Concatenation with `start_directory` via
  {meth}`config.trickle()` if window `start_directory` is alphanumeric /
  relative (doesn't start with `/`). See {ref}`Examples` in _start directory_.
- Fix bug with import teamocil and tmuxinator
- Improve quality of tmuxinator imports. Especially `session_name`
  and `start_directory`.
- Allow saving with `~` in file destination.

## tmuxp 0.1-dev (2013-10-31)

- {meth}`util.is_version()`
- correctly {meth}`config.trickle()` the `start_directory`.
- get `start_directory` working for configs
- fix :meth:`Window.kill_window()` target to
  `session_id:window_index` for compatibility and pass tests.
- [examples]: Example for `start_directory`.
- fix bug where first and second window would load in mixed order
- {class}`Window.move_window()` for moving window.
- doc overhaul. front page, renamed orm_al.rst to internals.rst.

## tmuxp 0.1-dev (2013-10-30)

- fix bug where if inside tmux, loading a workspace via switch_client
  wouldn't work.
- fix bug where `tmuxp load .` would return an error instead of a
  notice.
- `tmuxp freeze <filename>` experimental
- tmuxp now has experimental support for freezing live
  sessions.
- {meth}`Window.kill_window()`
- support for `start_directory` (work in progress)

## tmuxp 0.1-dev (2013-10-29)

- {meth}`Window.select_pane` now accepts `-l`, `-U`, `-D`,
  `-L`, `-R`.
- support for `automatic-rename` option.
- 3 new {ref}`examples`, 'main-pane-height', 'automatic-rename', and
  'shorthands'.
- enhancements to prompts
- `tmuxp import` for teamocil and tmuxinator now has a wizard and offers
  to save in JSON or YAML format.
- [b6c2e84] Fix bug where tmuxp load w/ session already loaded would
  switch/attach even if no was entered
- when workspace loader crashes, give option to kill session, attach it or
  detach it.
- tmux 1.8 `set-option` / `set-window-options` command
  `target-window` fix.
- {class}`WorkspaceBuilder` now has `.session` attribute accessible
  publicly.
- tmux will now use {meth}`Session.switch_client` and
  {meth}`Session.attach_session` to open new sessions instead of `os.exec`.
- [config] tmuxp now allows a new shorter form for panes. Panes can just be a
  string. See the shorthand form in the {ref}`examples` section.
- [config] support loading `.yml`.

## tmuxp 0.1-dev (2013-10-28)

- fix `tmuxp load .` fixed
- fix `tmuxp convert <file>` fixed.
- [pep257] fixes.
- {class}`Pane` now has {meth}`Pane.set_width` and
  {meth}`Pane.set_height`.
- `./run_tests.py --tests` now automatically prepends
  `tmuxp.testsuite` to names.
- {meth}`Window.tmux` and {meth}`Pane.tmux` will automatically add
  their `{window/pane}_id` if one isn't specific.

## tmuxp 0.1-dev (2013-10-27)

- [argcomplete] overhaul for CLI bash completion.
- `tmuxp load`, `tmuxp convert` and `tmuxp import` now support
  relative and full filenames in addition to searching the config
  directory.

## tmuxp 0.1-dev (2013-10-26)

- initial version of [tmuxinator]
  config importer. it does not support all options and it not guaranteed
  to fully convert window/pane size and state.
- {meth}`config.in_dir` supports a list of `extensions` for
  filetypes to search, i.e. `['.yaml', '.json']`.
- {meth}`config.is_config_file` now supports `extensions`
  argument as a string also.
- fix `$ tmuxp load -l` to work correctly alongside
  `$ tmuxp load filename`.

## tmuxp 0.1-dev (2013-10-25)

- fix bug where `-v` and `--version` wouldn't print version.
- property handle case where no tmux server exists when
  `attach-session` or `kill-session` is used.
- test fixtures and initial work for importing
  [tmuxinator] configs

## tmuxp 0.1-dev (2013-10-24)

- clean out old code for `automatic-rename` option. it will
  be reimplemented fresh.
- check for `oh-my-zsh` when using `$SHELL` `zsh`. Prompt if
  `DISABLE_AUTO_TITLE` is unset or set to `true`.
- tmuxp can now `$ tmuxp convert <file>` from JSON <=> YAML, back
  and forth.
- New examples in JSON. Update the {ref}`examples` page in the
  docs.
- [dev] `.tmuxp.json` now exists as a config for tmuxp development and
  as an example.
- Fix bug where `tmuxp kill-session` would give bad output
- Fix bug in tab completion for listing sessions with no tmux server
  is active.

## tmuxp 0.1-dev (2013-10-23)

- zsh/bash/tcsh completion improvements for tab-completion options
- tmuxp `kill-session` with tab-completion.
- tmuxp `attach-session` with tab-completion. Attach session will
  `switch-client` for you if you are inside of of a tmux client.
- tmuxp `load` for loading configs.
- unit test fixes.

## tmuxp 0.1-dev (2013-10-21)

- Make 1.8 the official minimym version, give warning notice to
  upgrade tmux if out of date
- Fix regression causing unexpected build behavior due to unremoved code
  supporting old tmux versions.
- Added 2 new examples to the {ref}`examples` page.
- Examples now have graphics
- `$ tmuxp -v` will print the version info.

## tmuxp 0.1-dev (2013-10-19)

- tmuxp will now give warning and sys.exit() with a message if
  `tmux` not found in system PATH
- internal overhaul of {class}`Server`, {class}`Session`
  , {class}`Window`, and {class}`Pane` continues.

  - {class}`Server` has @property {meth}`Server.sessions`, which is forward
    to {meth}`Server.list_sessions()` (kept to keep tmux commands in
    serendipty with api), {meth}`Server._list_sessions()` returns dict
    object from {meth}`Server.__list_sessions()` tmux command.
    {meth}`Server.__list_sessions()` exists to keep the command layered so
    it can be tested against in a matrix with travis and compatibility
    methods can be made.
  - {class}`Session` now has @property {meth}`Session.windows` returning a
    list of {class}`Window` objects via {meth}`Session.list_windows()`.
    @property {meth}`Session._windows` to {meth}`Session._list_windows()`
    to return a list of dicts without making objects.
  - {class}`Window` now has @property {meth}`Window.panes` returning a
    list of {class}`Pane` objects via {meth}`Window.list_panes()`.
    @property {meth}`Window._panes` to {meth}`Window._list_panes()`
    to return a list of dicts without making objects.

## tmuxp 0.1-dev (2013-10-18)

- internal overhaul of {class}`Server`, {class}`Session`,
  {class}`Window`, and {class}`Pane`.

  - `Session`, `Window` and `Pane` now refer to a data object
    in {class}`Server` internally and always pull the freshest data.
  - A lot of code and complexity regarding setting new data for objects
    has been reduced since objects use their unique key identifier to
    filter their objects through the windows and panes in `Server`
    object.
  - `Server` object is what does the updating now.

- [project] some research into supporting legacy tmux versions. tmux 1.6
  and 1.7 support seem likely eventually if there is enough demand.
- python 3 support

## tmuxp 0.1-dev (2013-10-17)

- updated README docs with new project details, screenshots
- new example `.tmuxp.yaml` file updated to include
  development workflow. Removed nodemon as the tool for checking files for
  now.
- Support for switching sessions from within tmux. In both cases
  after the the session is built and if session already exists.

## tmuxp 0.1-dev (2013-10-16)

- use {meth}`util.which()` from salt.util to find tmux binary.
- add MANIFEST.in, fix issue where package would not
  install because missing file
- bash / zsh completion.
- New page on {ref}`internals`.
- Updates to {ref}`about-tmux` page.
- add vim modeline for rst to bottom of this page
- Server is now a subclass of `util.TmuxObject`.
- subclasses of {class}`util.TmuxRelationalObject`,
  {class}`Server`, {class}`Session`, {class}`Window`, {class}`Pane` now
  have {meth}`util.TmuxRelationalObject.getById` (similar to [.get()] in
  [backbone.js] collection), {meth}`util.TmuxRelationalObject.where` and
  {meth}`util.TmuxRelationalObject.findWhere` ([.where()] and
  [.findWhere()]), to easily find child objects.
- tmux object mapping has been split into
  {class}`util.TmuxMappingObject`. The mapping and the relational has been
  decoupled to allow {class}`Server` to have children while not being a
  dict-like object.
- {class}`Server`, {class}`Session`, {class}`Window`,
  {class}`Pane` now explicitly mixin subclasses.

## tmuxp 0.1-dev (2013-10-15)

- new theme
- initial examples, misc. updates, front page update.
- support for `$ tmux .` to load `.tmuxp.{yaml/json/py}` in current
  working directory.
- support for `socket-name` (`-L`) and `socket-path`
  (`socket-path`)
- [config] Support for 1-command pane items.

  ```
  session_name: my session
  windows:
    - window_name: hi
      panes:
      - bash
      - htop
  ```

- If session name is already exists, prompt to attach.

## tmuxp 0.1-dev (2013-10-14)

- can now -l to list configs in current directory and $HOME/.tmuxp
- tmuxp can now launch configs and build sessions
- new exceptions
- {meth}`config.check_consistency()` to verify and diagnose
  issues with config files.
- {meth}`cli.startup()`
- {meth}`config.is_config_file()`
- {meth}`config.in_dir()`
- {meth}`config.in_cwd()`

## tmuxp 0.1-dev (2013-10-13)

- {meth}`config.inline()` to produce far far better looking
  config exports and tests.
- {meth}`Pane.resize_pane()` and tests
- documentation fixes and updates
- {meth}`Session.refresh()`, {meth}`Window.refresh()`,
  {meth}`Pane.refresh()`.
- {meth}`Server.find()`, {meth}`Session.find()`,
  {meth}`Window.find()`.

## tmuxp 0.1-dev (2013-10-12)

- Test documentation updates
- Builder is now {class}`WorkspaceBuilder` + tests.
  - WorkspaceBuilder can build panes
  - WorkspaceBuilder can build windows and set options
- {meth}`Window.show_window_options()`,
  {meth}`Window.show_window_option()`, {meth}`Window.set_window_option()`
- {meth}`Session.show_options()`,
  {meth}`Session.show_option()`, {meth}`Session.set_option()`

## tmuxp 0.1-dev (2013-10-11)

- More preparation for builder / session maker utility.
- test runner and test suite overhaul.
- Documentation for development environment and test runner updated.
- Travis now tests against tmux 1.8 and latest source. Door open for
  future testing against python 3 and earlier tmux versions in the future.
- Quiet logger down in some areas
- **future** imports for future python 3 compatibility
- setup.py import **version** via regex from tmuxp package
- move beginnings of cli to `tmuxp.cli`

## tmuxp 0.1-dev (2013-10-09)

- New logging module
- Removed dependency logutils
- Removed dependency sh

## tmuxp 0.1-dev (2013-10-08)

- switch to semver

[tmuxinator]: https://github.com/aziz/tmuxinator
[teamocil]: https://github.com/remiprev/teamocil
[argcomplete]: https://github.com/kislyuk/argcomplete
[pep257]: http://www.python.org/dev/peps/pep-0257/
[pep8]: http://www.python.org/dev/peps/pep-0008/
[pep440]: http://www.python.org/dev/peps/pep-0440/
[tony/cookiecutter-pypackage]: https://github.com/tony/cookiecutter-pypackage
[@tasdomas]: https://github.com/tasdomas
[@sehe]: https://github.com/sehe
[@madprog]: https://github.com/madprog
[autoenv]: https://github.com/kennethreitz/autoenv
[entr(1)]: http://entrproject.org/
[anaconda python]: http://docs.continuum.io/anaconda/index
[@estin]: https://github.com/estin
[sysutils/pytmuxp]: http://www.freshports.org/sysutils/py-tmuxp/
[#201564]: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201564
[colorama]: https://pypi.python.org/pypi/colorama
[@marbu]: https://github.com/marbu
[@yegortimoshenko]: https://github.com/yegortimoshenko
[@thomasballinger]: https://github.com/thomasballinger
[sniffer]: https://github.com/jeffh/sniffer
[watchingtestrunner]: https://pypi.python.org/pypi/watching_testrunner/1.0
[@raine]: https://github.com/raine
[@techtonik]: https://github.com/techtonik
[@thiefmaster]: https://github.com/ThiefMaster
[pep 263]: http://www.python.org/dev/peps/pep-0263/
[roxit]: https://github.com/roxit
[documentation in chinese]: http://tmuxp-zh.readthedocs.io
[wrongwaycn]: https://github.com/wrongwaycn
[tornado's log.py]: https://github.com/facebook/tornado/blob/master/tornado/log.py
[underscore.js]: http://underscorejs.org/
[backbone.js]: http://backbonejs.org/
[.get()]: http://backbonejs.org/#Collection-get
[.where()]: http://underscorejs.org/#where
[.findwhere()]: http://underscorejs.org/#findWhere
[libtmux]: https://github.com/tmux-python/libtmux

<!---
# vim: set filetype=markdown:
-->
