14个版本 (8个破坏性更新)

0.10.2 2024年6月3日
0.9.1 2024年5月16日
0.9.0 2024年1月31日
0.8.2 2023年12月30日
0.6.0 2023年4月26日

#250 in 数据库接口

MIT许可证

240KB
1.5K SLoC

twm

Tmux工作空间管理器

twm是一个高性能、可定制的工具,用于将工作空间作为tmux会话进行管理。合理的默认设置可以让您无需配置即可开始使用,或者您可以将其设置为您喜欢的任何工作流程。

twm

目录

命令行界面使用

安装说明

公开的环境变量

配置twm

配置方案

贡献指南

使用方法

twm (tmux workspace manager) is a customizable tool for managing workspaces in tmux sessions.

Workspaces are defined as a directory matching any workspace pattern from your configuration. If no configuration is set, any directory containing a `.git` file/folder or a `.twm.yaml` file is considered a workspace.

Usage: twm [OPTIONS]

Options:
  -e, --existing
          Prompt user to select an existing tmux session to attach to.

          This shouldn't be used with other options.

  -g, --group
          Prompt user to start a new session in the same group as an existing session.

          Setting this option will cause `-l/--layout` and `-p/--path` to be ignored.

  -d, --dont-attach
          Don't attach to the workspace session after opening it

  -l, --layout
          Prompt user to select a globally-defined layout to open the workspace with.

          Using this option will override any other layout definitions that would otherwise automatically be used when opening the workspace.

  -p, --path <PATH>
          Open the given path as a workspace.

          Using this option does not require that the path be a valid workspace according to your configuration.

  -n, --name <NAME>
          Force the workspace to be opened with the given name.

          When setting this option, you should be aware that twm will not "see" this session when performing other automatic actions. For example, if you have a workspace at ~/foobar and run `twm -n jimbob -p ~/foobar`, and then run `twm` and select `~/foobar` from the picker, a new session `foobar` will be created. If you then run `twm -g` and select `foobar`, `foobar-1` will be created in the `foobar` group.

      --make-default-config
          Make default configuration file.

          By default will attempt to write a default configuration file and configuration schema in `$XDG_CONFIG_HOME/twm/` Using `-p/--path` with this flag will attempt to write the files to the folder specified. twm will not overwrite existing files. You will be prompted to rename/move the existing files before retrying.

      --make-default-layout-config
          Make default local layout configuration file.

          Will attempt to create `.twm.yaml` in the current directory. Will not overwrite existing files. You can use `-p/--path <PATH>` to specify a different directory to write the file to.

      --print-config-schema
          Print the configuration file (twm.yaml) schema.

          This can be used with tools (e.g. language servers) to provide autocompletion and validation when editing your configuration.

      --print-layout-config-schema
          Print the local layout configuration file (.twm.yaml) schema.

          This can be used with tools (e.g. language servers) to provide autocompletion and validation when editing your configuration.

      --print-bash-completion
          Print bash completions to stdout

      --print-zsh-completion
          Print zsh completions to stdout

      --print-fish-completion
          Print fish completions to stdout

      --print-man
          Print man(1) page to stdout

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

环境变量

twm将在它生成的所有会话中设置几个环境变量。它们用于帮助您与twm交互的脚本或快捷键。它们是

  • TWM - 如果当前shell处于twm会话中,则设置为1
  • TWM_ROOT - 新工作空间的根目录
  • TWM_TYPE - 工作空间的类型。如果没有定义工作空间类型,则为空字符串。
  • TWM_NAME - 由twm创建的tmux会话的名称。

这些可以用很多方式使用

  • 您不必在特定工作空间类型的布局中定义所有设置命令,而可以有一个1个共享的设置脚本定义全局,该脚本在进入工作空间时运行,检查TWM_TYPE以进行特定类型的设置
  • 您可以使用TWM_ROOT来执行特定目录内的操作
  • 您可以通过检查TWM来确保在自动化任务中手动创建的会话与twm创建的会话处理不同

此外,设置 TWM_CONFIG_FILE 环境变量将覆盖默认的配置搜索路径。如果您的配置文件位于非标准位置,可以使用以下命令测试 twm 与默认配置:TWM_CONFIG_FILE= twm,或者如果您的配置文件位于标准位置,使用以下命令:TWM_CONFIG_FILE=/dev/null twm

安装

欢迎贡献!如果您认为某些工作流程很有用,或者发现了错误,请打开一个问题或 PR。对于样式和 linting,我简单地使用 cargo fmtclippy::all

Cargo

最简单的安装方法是使用 Cargo

cargo install twm

Nix

如果您使用 Nix,它也包含在 nixpkgs 中,并且也被包含在这个仓库的 flake 中。

自动完成

如果您使用 Nix,自动完成脚本会随 twm 一起安装,无论是从这个 flake 还是 nixpkgs。

我认为它没有被包含在任何其他操作系统上。您可以通过在您的 shell 配置中添加以下内容来手动设置 shell 完成功能

Bash

# ~/.bashrc
eval "$(twm --print-bash-completion)"

Zsh

# ~/.zshrc
eval "$(twm --print-zsh-completion)"

Fish

# ~/.config/fish/config.fish
twm --print-fish-completion | source

配置

twm 运行不需要任何配置。您可以仅安装它并运行 twm,默认设置应该适用于一些人。

要获取一个合理的默认配置文件,您可以运行 twm --make-default-config,这将尝试写入两个文件:$XDG_CONFIG_HOME/twm/{twm.yaml,twm.schema.json}

您可以使用 --make-default-config--p/---path <PATH> 将文件写入不同的文件夹。

如果您使用 yaml-language-server,默认配置文件将自动设置为使用 twm.schema.json 文件进行验证和完成。

当您更新 twm 时,您可以运行 twm --print-config-schema > $XDG_CONFIG_HOME/twm/twm.schema.json 以确保您有最新的模式文件。

有关配置选项的完整列表和示例,请参阅 CONFIGURATION.md

配置验证示例

以下是使用 yaml-language-server 在 neovim 中进行编辑器内配置验证的外观

twm configuration completion

twm configuration validation

食谱

tmux 键绑定

以下是个人使用的 twm 基本绑定

# ~/.tmux.conf
bind f run-shell "tmux neww twm"
bind F run-shell "tmux neww twm -l"
bind s run-shell "tmux neww twm -e"  # i rebind the original `s` to `S` so I can still use it
bind g run-shell "tmux neww twm -g"
bind e run-shell "tmux switch -t $TWM_DEFAULT"  # i set TWM_DEFAULT in my shellrc, just a session that is always available as a scratch area

有用的别名 / 脚本

twm 有意不添加可以通过一些轻量级脚本轻松完成的特性。以下是我使用的一些简化示例

# ~/.zshrc
alias twm-clone='git clone $1 $2 && twm -p $2'  # clone repo $1 to path $2 and open $2 with twm

# kill current session and switch to last/next/previous session
# i bind this to K in tmux
kt() {
  ORIG_SESS="$TWM_NAME"
  tmux switch -l || tmux switch -n || tmux switch -p
  tmux kill-session -t "$ORIG_SESS"
}

贡献

贡献当然欢迎!这不是一个大项目,所以我没有很多指南。确保测试(test*,目前是这样:\) 通过。《code>cargo fmtcargo clippy -- -D clippy::all。我只能想到这些。

特性哲学

我尽量避免在 twm 内添加没有明显价值的东西。如果某些事情可以用简单的shell脚本或类似的东西很好地完成,那么它可能应该这样。

不会添加的功能示例

  • 打开模糊查找器以选择要终止的会话。简单的shell脚本/足以用内置的tmux功能完成。
  • 在窗口中打开git工作树分支。使用布局来完成这个。检测你在一个包含工作树的工作区中,然后运行一个脚本来以你想要的方式打开它们。这总是比任何内置的功能更灵活。
  • 将git存储库克隆到新的工作区。这个和上面都相当特定于 tmux-sessionizer,但有助于突出我们目标的不同。《code>twm 提供了 -p 来在特定路径打开工作区,所以这样的功能可以用一个简单的别名 alias twm-clone='git clone $1 $2 && twm -p $2' 来实现。你可以用mercurial,svn,你想要做什么都可以。

可能添加的功能示例

  • 支持不同的多路复用器(例如,Zellij)。将 twm 的tmux特定部分抽象为可以与不同的多路复用器后端一起设置的东西,这将是一个很好的补充。但我只使用tmux/没有人问,所以我没有费心。

意外加入的功能

有一些功能我最初不想添加,但后来还是添加了。

  • 模糊查找现有会话以附加到。最初我想这更适合留给内置的tmux功能,但当有人要求添加打开组中的会话的功能(twm -g)时,我不得不添加 twm -e 所需的一切。此外,如果你想 模糊查找 现有的会话,那么这个功能在 twm 之外将依赖于某些其他的模糊查找器。twm 内置自己的查找器的部分原因是为了避免一开始就依赖于其他工具。因此,twm -gtwm - 应运而生。我认为 - 是将被添加到 twm 中的最无用的功能。

许可

MIT

类似的项目

依赖项

~12-19MB
~251K SLoC