209 Commits

Author SHA1 Message Date
8987dd4492 Bump version to 0.13.0 2017-04-27 19:49:05 +01:00
9049818b25 Add optional target window argument to newly added layout helpers 2017-04-27 19:48:15 +01:00
47ef3bd857 Merge pull request #75 from leesei/sort-list
feat: sort sessions and windows list
2017-04-27 19:32:01 +01:00
a9ca566c28 Merge pull request #73 from Yuki-Inoue/synchronize-helper-methods
Add synchronize helper methods
2017-04-27 19:23:22 +01:00
87e31a03c9 Merge pull request #58 from mlavi/fish2-0-0
Accommodate fish shell 2.0.0
2017-04-27 19:21:02 +01:00
7f3ec1cd5b Merge pull request #76 from xsteve/feature/fix-has-session
Work around a problem with tmux has-session:
2017-04-27 19:18:49 +01:00
9baadfbb1e Bump version to 0.12.3 2017-04-27 18:59:38 +01:00
2adc885bb8 Fix issue with using a tmux version compiled source
Resolves #79.

When tmux is compiled from source the version string is "master" which
the tmux-version command didn't deal with correctly.
2017-04-27 18:59:38 +01:00
7cc0fa2d0e Fix typo in help text of tmux-version command 2017-04-27 18:59:38 +01:00
Stefan Reichoer
e41b15c515 Work around a problem with tmux has-session:
tmux has-session does a prefix match and not an exact match.

When a session "ABC" does exist, the session "A" is also interpreted as "ABC"
Using tmux list-sessions fixes this problem
2016-10-28 13:07:17 +02:00
leesei
690a4465b0 feat: sort sessions and windows list
On branch sort-list
Changes to be committed:
	modified:   libexec/tmuxifier-list-sessions
	modified:   libexec/tmuxifier-list-windows
2016-08-19 23:14:08 +08:00
Yuki Inoue
9bcfbd3428 Add synchronize helper methods 2016-05-09 12:34:48 +09:00
7aeeaf31d1 Merge pull request #71 from Yuki-Inoue/balance-windows-layout-helpers
Add balance_window helper methods
2016-04-28 18:35:42 +01:00
ca6dcfaaf2 Merge pull request #72 from Yuki-Inoue/fix-ci-use-github
Fix tmux sourcecode url to github
2016-04-28 18:30:26 +01:00
Yuki Inoue
fdbb1704e0 Fix tmux sourcecode url to github
The sourceforge project of tmux seems to have been removed.  So,
wgetting from github releases instead of sourceforge.
2016-04-28 22:08:30 +09:00
Yuki Inoue
499c5abd83 Add balance_window helper methods 2016-04-28 15:17:05 +09:00
3563c3d975 Bump version to 0.12.2 2016-04-02 22:28:37 +01:00
3bfbc50918 Merge pull request #70 from blueyed/fix-load-session
Fixes for load_session with file in current dir
2016-04-02 22:26:23 +01:00
Daniel Hahler
3a8a43ccdc style: load_session: move return case up, removing indent 2016-04-02 22:38:40 +02:00
Daniel Hahler
a9a87992df load_session: prefer existing session instead of file in cwd
This also adds './' to a file used from the current working dir (in case
there is no session with that name), which is required for Bash's
`source` to use it (and not look for it in `$PATH`).

Fixes https://github.com/jimeh/tmuxifier/issues/69.
2016-04-02 22:38:25 +02:00
5f4dd92d7f Merge pull request #66 from shalecraig/patch-1
Update link to iterm2
2016-01-26 23:09:54 +00:00
shale
bdaa272ca5 Update link to iterm2
iterm2 moved to gitlab from google project hosting.
2016-01-19 10:30:28 -08:00
dce4fb3ad2 Merge pull request #65 from bchretien/topic/window-rename
new_window: disable allow-rename if a window name was given
2015-12-20 23:38:43 +00:00
Benjamin Chrétien
6f8773133d new_window: disable allow-rename if a window name was given 2015-12-15 17:53:45 +01:00
92d188f9f5 Bump version to 0.12.1 2015-07-25 13:38:00 +01:00
8d1751daea Merge pull request #62 from jimeh/fix-issue-61
Fix issue #61
2015-07-25 13:35:24 +01:00
dafa938923 Add Tmux 2.0 to Travis-CI test environments 2015-07-25 13:27:12 +01:00
595269dd6a Make load-window within a session adhere to session_root setting
This should fix #61. Previously when you manually ran `tmuxifier
load-window` from within a session created by Tmuxifier, the
`session_root` path set in the session was ignored, and the new window
would be cd'd to `$HOME` unless the window configuration had
`window_root` set.
2015-07-25 13:24:02 +01:00
Mark Lavi
3c37e18987 Accommodate fish shell 2.0.0 2015-03-22 00:38:17 -07:00
b801aade99 Bump version to 0.12.0 2014-12-02 22:23:37 +00:00
a888efe6d0 Update __go_to_session layout helper test 2014-12-02 22:22:09 +00:00
4a4f62fcf2 Improve/fix help messages for a few commands 2014-12-01 21:03:26 +00:00
41da75ad39 Add support for iTerm2's Tmux integration
This should resolve #52.
2014-12-01 21:01:58 +00:00
6f98020309 Bump version to 0.11.6 2014-08-29 22:59:23 +01:00
a96b5a1d44 Merge pull request #50 from jimeh/fix-new_window-active-window-tracking
Fix new window active window tracking
2014-08-29 22:52:48 +01:00
fe3beeac29 Attempt to avoid timing issue which sometimes causes test to fail 2014-08-29 22:46:41 +01:00
ef0f25591c Set $window var based on currently active window
Previously $window was only set by the new_window() helper when it was
passed a name argument. This caused weird behavior cause if it was
called without a name it would simply attempt to recreate the same
window and fail. That was until @blueyed's fix in 2249cf8.

However, the $window var still wasn't being set correctly, leaving
split_v(), split_h() and other helpers to operate on the wrong
window. This is no longer an issue as $window is always set to the index
of the currently active window at the end of new_window() and
select_window().
2014-08-29 22:29:03 +01:00
0ae0bc84e3 Add __get_current_window_index internal helper function 2014-08-29 22:28:25 +01:00
Daniel Hahler
2249cf8d1b new_window: only set $window and pass -n if a name is provided
Otherwise `new_window` after `new_window foo` would re-use the same
name, resulting in an error.
2014-08-29 20:20:07 +01:00
4bf105eebc Improve wording of comment 2014-08-29 20:15:32 +01:00
71236afccf Clean up structure of initialize_session helper function 2014-08-29 20:14:59 +01:00
6e5794a2b4 Add travis build status to readme 2014-08-29 19:33:38 +01:00
f8f0054c99 Merge pull request #46 from jimeh/add-tests
Add tests
2014-08-29 19:26:47 +01:00
6a1e9e4de7 Cleanup Makefile a bit 2014-08-21 01:54:05 +01:00
77ccb5d532 Clean up test a bit 2014-07-21 16:13:16 +01:00
48b5150b0d Bump version to 0.11.5 2014-07-21 16:08:22 +01:00
38932bf33e Fix issue where EDITOR contains flags 2014-07-21 16:07:33 +01:00
d8b8dff61f Add tests for new_window layout helper 2014-06-04 00:36:33 +01:00
d47838ca1f Add and use test helpers to create/kill test-specific tmux sessions 2014-06-04 00:07:23 +01:00
87d767d1c5 Fix issue with PATH in test environment 2014-06-03 23:19:34 +01:00
1b0b3b8ba8 Add tests for __get_first_window_index layout helper 2014-06-03 20:31:41 +01:00
94b9559bfa Use full tmux command names rather than aliases 2014-06-03 20:31:19 +01:00
636e92b118 Add tests for __go_to_window_or_session_path layout helper 2014-06-03 20:01:47 +01:00
8a06ad149e Update test-runner.sh to v0.2.0 2014-06-03 20:01:31 +01:00
7e63149c26 Add tests for tmux layout helper 2014-05-26 20:20:39 +01:00
36add22637 Use test-runner.sh instead of homegrown test.sh 2014-05-26 13:52:55 +01:00
3aa151b865 Add tests for __go_to_session layout helper 2014-05-26 11:35:10 +01:00
f977850ea9 Add tests for __expand_path layout helper 2014-05-26 11:34:53 +01:00
47219d2d40 Improve test environment for individual test files 2014-05-26 11:28:28 +01:00
6e634ecba9 Update stub.sh 2014-05-26 11:28:16 +01:00
396120cf53 Add slight speed improvements for Travis-CI 2014-05-25 02:41:54 +01:00
a875b63033 Attempt to fix test failing with Tmux 1.6 and 1.7 2014-05-25 02:38:05 +01:00
0d0106e7ba Attempt to run travis-ci tests against multiple versions of tmux 2014-05-25 02:34:13 +01:00
ed52353bba Attempt to get tmux 1.8 on Travis-CI boxes 2014-05-25 01:42:09 +01:00
57b4f303f2 Install tmux on travis-ci.org 2014-05-25 01:32:27 +01:00
359f1a9a94 Use tput instead of hard-coded color codes 2014-05-25 01:32:07 +01:00
41218e3072 Colorize part of test output 2014-05-25 01:24:49 +01:00
5602bf650e Add basic tests for tmuxifier-tmux 2014-05-25 01:24:30 +01:00
54f6f890bb Add tests for lib/util.sh 2014-05-25 00:27:09 +01:00
e5ffdc6f16 A few further tweaks to how path handling in tests 2014-05-25 00:27:09 +01:00
1fb80660b8 Add tests for lib/runtime.sh 2014-05-25 00:27:09 +01:00
a700770757 Fix path related test setup issue 2014-05-25 00:27:09 +01:00
c927126cb3 Improve global test setup in test-helper.sh 2014-05-25 00:27:08 +01:00
279e68f7c5 Add tests for lib/env.sh 2014-05-25 00:27:08 +01:00
1bf087faa3 Basic setup for tests
Based on the test setup of stub.sh: https://github.com/jimeh/stub.sh
2014-05-25 00:27:08 +01:00
2aa549ff70 Bump version to 0.11.4 2014-05-25 00:17:14 +01:00
6f0fdba121 Remove all argument handling from tmuxifier-tmux
It's meant to be a wrapper for tmux, allowing additional arguments to be
passed. Hence having the wrapper itself intercept -h as previously, or
--help as removed in this commit prevents the wrapper from working
properly.
2014-05-25 00:15:29 +01:00
a1e6972434 Bump version to 0.11.3 2014-05-25 00:12:22 +01:00
7443dd74f8 Fix #45 - tmuxifier-tmux should not treat -h flag as output help 2014-05-25 00:12:17 +01:00
e08ee38927 Bump version to 0.11.2 2014-05-15 14:10:53 +01:00
8416e63094 Merge pull request #38 from fritzgrabo/source-missing-utility-functions
Source missing utility functions in tmuxifier-tmux
2014-05-15 14:06:13 +01:00
Fritz Grabo
fe1ac9d2f9 Source missing utility functions in tmuxifier-tmux 2014-05-15 14:22:34 +02:00
87c38ae818 Bump version to 0.11.1 2014-05-14 00:11:38 +01:00
3a74ff3a60 Minor tweaks and updates to a few help messages 2014-05-14 00:08:09 +01:00
7df4a33a7d Fix typo in readme 2014-05-13 23:56:43 +01:00
255fe78572 Bump version to 0.11.0 2014-05-13 23:47:35 +01:00
a5426d4e12 Add some comments, if for nothing else, then for educational purposes 2014-05-13 23:47:35 +01:00
5850c15d87 Check for minimum required Tmux version (fixed #37) 2014-05-13 23:47:34 +01:00
4ccf61f692 Merge pull request #36 from MrAlexLau/master
Correct typo in window template, fixes #35.
2014-05-03 08:09:01 +01:00
mralexlau
44c443efe4 Correct typo in window template, fixes #35. 2014-05-02 16:19:18 -05:00
72cfab20a0 Fix typo in fish examples 2014-02-28 11:14:42 +00:00
33f26bca56 Wrap long line 2014-02-27 23:41:11 +00:00
90caa0d362 Fix typo in code comment 2014-02-27 23:40:48 +00:00
0aa0e43949 Improve custom tmux arguments section
Don't ask why there was no header, cause it's beyond me >_<
2014-02-27 22:46:00 +00:00
2a09683851 Bump version to 0.10.0
The 0.9.2 bump should have been 0.10.0. Support for fish shell was
added, hence a minor version bump is needed, not a patch.
2014-02-27 22:36:40 +00:00
5b3f4d8488 Bump version to 0.9.2 2014-02-27 22:34:23 +00:00
36c702cb88 Improve TMUXIFIER_TMUX_OPTS section 2014-02-27 22:33:39 +00:00
50f84b1586 Improve Update section, slightly, just slightly :) 2014-02-27 22:33:05 +00:00
feed17581a Mention fish shell where sensible 2014-02-27 22:32:23 +00:00
91722a4895 Update copyright year 2014-02-27 22:31:55 +00:00
cd7ae2ebce Merge pull request #32 from trekdemo/fish_support
Full fish shell support
2014-02-27 22:23:47 +00:00
Gergő Sulymosi
a9479df7c1 Update README with fish related stuff 2014-02-27 23:03:09 +01:00
Gergő Sulymosi
84de3da9ac Initialization under fish 2014-02-27 23:02:54 +01:00
7f8840eac9 Bump version to 0.9.1 2014-02-25 00:35:13 +00:00
0653074570 Fix issue #28, default-path error with Tmux 1.9
When using Tmux 1.9 and later the "-c" argument is given to the
"new-session" command to set the session's root/default path. When using
Tmux 1.8.x and earlier, the old "default-path" session option method is
used instead.
2014-02-25 00:30:34 +00:00
5047f596af Merge pull request #31 from trekdemo/fish_completion
Add completion for fish shell
2014-02-24 22:41:45 +00:00
Gergő Sulymosi
f2c5e9bb66 Add completion for fish shell 2014-02-24 10:06:01 +01:00
ae96c17580 Merge pull request #29 from matthias-guenther/installation-fix-for-zsh
Problems with zsh installation
2014-02-11 09:28:49 +00:00
Matthias Guenther
f5c4361268 Add /home/wikimatze variable 2014-02-04 20:28:48 +01:00
Matthias Guenther
8a9174c1c5 Fixing the export path option for bash and zsh in the README 2014-02-04 18:23:21 +01:00
3dfa166041 Bump version to 0.9.0 2014-01-29 08:12:42 +00:00
e231f2d642 Enable passing custom arguments to tmux
Custom arguments can now be passed to tmux by setting the
TMUXIFIER_TMUX_OPTS environment variable.
2014-01-29 08:11:20 +00:00
966e500b40 Bump version to 0.8.1 2013-07-17 14:43:17 +01:00
4c1cb0762a Fix issue #23 - Some consoles don't seem to support C-l 2013-07-17 14:42:46 +01:00
a7473208c0 Bump version to 0.8.0 2013-07-02 23:06:03 +02:00
1dddbb502c Enable load commands to accept file paths in addition to layout names
Resolves issue #20. Additionally, load_session now has an optional
second argument to set the default session name. And error output from
both load commands is now printed to STDERR and give a return code of 1
on error.
2013-07-02 23:05:18 +02:00
da1354d5b7 Bump version to 0.7.3 2013-06-27 08:56:40 +02:00
f01c789de4 Fix typo 2013-06-27 08:55:43 +02:00
b52ef20be8 Merge pull request #22 from limeyd/master
Add optional window name when loading windows
2013-06-26 23:54:38 -07:00
limeyd
212693b1e9 added optional window name 2013-06-26 20:55:29 -06:00
908152bb57 Bump version to 0.7.2 2013-06-20 09:38:22 +01:00
a0365273d0 Minor formatting fixes 2013-06-20 09:38:00 +01:00
6c8777adc2 Merge pull request #19 from gryftir/master
split_hl, split_vl and clock functions
2013-06-20 01:36:45 -07:00
Lawrence Siebert
5e33aefa7d modified: lib/layout-helpers.sh
added split_hl and split_hl and split_vl which split with a count of
columns/lines instead of by percentage,  and clock which starts
clock-mode.  Comments for each added.
2013-06-19 23:35:13 -07:00
e15ae597e4 Bump version to 0.7.1 2013-06-18 09:13:41 +01:00
d982588302 Merge pull request #18 from fomichev/master
tmux set-option default-path
2013-06-18 01:11:42 -07:00
Stanislav Fomichev
0fc1f20af7 Fix typo 2013-06-18 11:11:22 +04:00
Stanislav Fomichev
8c2582a948 Add set_default_path option
This option lets user disable 'tmux set-option default-path' for
$session_root, like this:
	session_root "~/x/y/z"
	set_default_path=false
2013-06-18 11:10:48 +04:00
c1ecc0a7c8 Update LICENSE file to match license details in readme 2013-06-18 00:27:22 +01:00
85718b9a9e Update Todos section in readme 2013-06-18 00:24:51 +01:00
1b5c451e39 Remove "Heed My Warning" section from readme, it's no longer relevant 2013-06-18 00:24:36 +01:00
887bbc4fbc No need to attempt to syntax highlight shell command examples 2013-06-18 00:23:18 +01:00
103cf66ec3 Bump version to 0.7.0 2013-06-18 00:13:57 +01:00
f3797204fb Merge pull request #15 from jimeh/new-init-system
New init system
2013-06-17 16:11:56 -07:00
83b6b47f7c Update readme 2013-06-18 00:05:15 +01:00
fb5a775d98 Improve EDITOR checks 2013-06-17 13:39:13 +01:00
0359e09806 Merge branch 'master' into new-init-system 2013-06-17 13:36:09 +01:00
ee32ac25b8 Merge pull request #17 from peter-d/new-init-system-check
New init system check
2013-06-17 05:32:04 -07:00
peter-d
54561b9bbd fixed a typo 2013-06-17 14:25:24 +02:00
peter-d
a4e3edc4ca Fixed the path setup for tcsh 2013-06-17 14:24:32 +02:00
9f1a3621f0 Fix an error and tweak some styling in readme 2013-06-12 09:00:18 +01:00
831deec069 Update readme with details of new init system 2013-06-12 08:50:25 +01:00
536f625b5d Print correct help info for init command based on the shell used 2013-06-12 00:53:40 +01:00
9e8a5c3dc9 Separate init command output commands with ; fixing issues with tcsh 2013-06-12 00:48:48 +01:00
f0647b0326 Update init scripts 2013-06-12 00:31:51 +01:00
c9c3534f05 Improve init command's argument parsing 2013-06-12 00:08:44 +01:00
7a9c94ff6f Merge pull request #14 from raulbrito/patch-1
Update README.md
2013-06-06 11:43:16 -07:00
Raul Brito
0caf3a78f5 Update README.md 2013-06-06 20:31:26 +02:00
21c43be558 Merge branch 'master' into new-init-system 2013-06-03 09:50:38 +03:00
bb97d5791b Bump version to 0.6.1 2013-06-03 09:48:21 +03:00
dea8939ee0 Remove forgotten and useless variable 2013-06-03 09:46:26 +03:00
df5e6031cd Alter how internal help invocation work to make life a bit easier 2013-06-03 09:46:03 +03:00
adcea18bdc Get rid of now needless for loops 2013-06-03 09:44:57 +03:00
f9c91e5fcd Improve --help and --complete argument handling 2013-06-03 09:32:13 +03:00
1a9dd4787d Improve argument handling of init command 2013-06-03 09:16:58 +03:00
4d486d48d0 Fix a typo 2013-06-02 21:30:56 +03:00
d94ccf560e Simplify internals of init command a bit 2013-06-02 21:29:38 +03:00
ed3fda5769 Update init command to use new help system 2013-06-02 21:25:19 +03:00
35832165ec Merge branch 'master' into new-init-system 2013-06-02 21:04:49 +03:00
7d91ca4292 Bump version to 0.6.0 2013-06-02 20:35:30 +03:00
15bbca80d4 Update aliases and fixed inconsistencies with list command aliases 2013-06-02 20:35:06 +03:00
bd585ca2bb Misc. code cleanup and minor improvement to help command 2013-06-02 20:27:28 +03:00
bf6969ba37 Bump version to 0.5.1 2013-06-02 20:11:36 +03:00
bdea895af0 Change output format of list commands 2013-06-02 20:10:26 +03:00
55cf26b9e6 Re-organize and improve help command and help info for each command 2013-06-02 20:09:59 +03:00
5363ac555b Re-organize internal files a bit 2013-06-02 18:45:12 +03:00
489d1a5a3e Small readme update 2013-06-02 18:40:27 +03:00
fa28de8b94 Bump version to 0.5.0 2013-06-02 18:30:53 +03:00
0e2cfa2327 Enable load-session command from outside of Tmux
This means that "init" session layouts can now be used to start and/or
re-attach to your main session.

Personally I have a "main" session layout with a couple of default
windows. I can now either start that session, or re-attach to it from
outside of Tmux by just running `tmuxifier s main`, instead of manually
creating a session named "main" and then loading my windows into it.
2013-06-02 18:30:28 +03:00
7cc9228839 Add early version new tmuxifier-init command 2013-06-02 17:51:43 +03:00
7ab7586f74 Auto-set $TMUXIFIER to correct directory based on relative path 2013-06-02 17:43:41 +03:00
51ebf880dc Only add $TMUXIFIER/bin to $PATH if it is not in $PATH already 2013-06-02 17:42:31 +03:00
04c9309668 Bump version to 0.4.1 2013-01-27 02:17:52 +00:00
455d8660f4 Merge pull request #12 from stephenmckinney/fix-list-for-symlinks
Fixes `list` for symlinks
2013-01-26 18:15:37 -08:00
Steve McKinney
00e5c98da0 Fixes list for symlinks 2013-01-26 12:13:47 -05:00
7106a81066 Bump version to 0.4.0 2012-09-06 23:04:20 +01:00
68ee1b8660 Remove capitalization from shell names in headers 2012-09-06 23:01:57 +01:00
11103822c2 Fix tcsh instructions 2012-09-06 23:01:12 +01:00
f460d78f48 Update readme with tcsh installation instructions 2012-09-06 22:57:13 +01:00
2da8fc9d7b Remove hard-coded path to tmuxifier binary from tcsh completion script 2012-09-06 22:51:58 +01:00
e493745b6e Keep indentation consistent 2012-09-06 22:50:18 +01:00
d5d87d3ab2 Fix issue #7
Instead of assuming that the default created window in a new session has
a index of `0`, we now check window index for the session with Tmux's
list-windows command.

Additionally, the default window is now moved to index `999` instead of
`99`, cause I'm paranoid and probably stupid :)
2012-09-06 22:11:51 +01:00
d367b5ecd6 Merge pull request #8 from peter-d/tcsh-support
added setup script and completion script for tcsh
2012-09-06 00:35:59 -07:00
peter-d
3f171997df added setup script and completion script for tcsh 2012-09-05 22:36:52 +02:00
307c959b65 Bump version to 0.3.1 2012-07-04 20:01:04 +01:00
b79125f55d Rename function to match existing naming convention 2012-07-04 19:56:00 +01:00
ddc11cc192 Merge pull request #6 from trobrock/work-with-rvm
When specifying a windows default path, rvm no longer works
2012-07-04 11:51:36 -07:00
Trae Robrock
5c2659c8e7 Use cd to set the working dir of a split or window so that rvm works 2012-06-27 17:46:12 -07:00
Trae Robrock
54a4f565c6 Merge branch 'master' of https://github.com/jimeh/tmuxifier 2012-06-27 14:03:49 -07:00
6a5bf32991 Bump version to 0.3.0 2012-06-27 21:47:12 +01:00
1f81e98e73 Add send_keys examples to window layout template 2012-06-27 21:40:59 +01:00
5989b1f516 Add send_keys layout helper 2012-06-27 21:39:54 +01:00
012526656e Remove send-keys -l support check as it is not needed
After some experimentation it turns out that if input to send-keys is
not a known key sequence like `C-m` or `C-l` for example, it it
automatically treated as literal input.

 Negating the need to use it and hence check if it's supported.
2012-06-27 21:29:29 +01:00
b2857b7df9 Merge pull request #4 from trobrock/no-l-flag
Support tmux versions that do not have the -l flag
2012-06-27 13:08:12 -07:00
Trae Robrock
8df639ae47 Merge branch 'no-l-flag' 2012-06-26 16:36:17 -07:00
Trae Robrock
75ae3ba142 Support tmux versions that do not have the -l flag 2012-06-26 16:35:23 -07:00
c862df2d82 Merge pull request #2 from greeneca/current_session_fix
fixed current session script
2012-06-04 11:52:19 -07:00
Charlie Greene
c06df475be fixed current session script 2012-06-04 14:25:02 -03:00
10104b7412 Update example window layout file with new helpers 2012-05-24 01:02:53 +01:00
3fa749dbf3 Update example in readme with new layout helpers 2012-05-24 00:58:48 +01:00
f8c0c8c749 Bump version to 0.2.1 2012-05-24 00:53:50 +01:00
147db787d5 Add completion to new-session and new-window commands
Complete names of existing sessions and windows for the `new` commands,
enabling easier creation of similarly named layouts.
2012-05-24 00:53:20 +01:00
4477b69f7a Bump version to 0.2.0 2012-05-24 00:42:37 +01:00
71303c8eba Update window template with new layout helpers 2012-05-24 00:42:36 +01:00
89325d0982 Add new layout helper functions for pane creation and command execution 2012-05-24 00:42:35 +01:00
8155740ceb Fix window specific root path
If a session root was set, any window layouts loaded with a window root
set caused the window root to be ignored. This resolves the issue.
2012-05-24 00:42:34 +01:00
ae70bae022 Reorganize functions a bit 2012-05-24 00:42:31 +01:00
a8ff37808a Clean up the code a bit 2012-05-24 00:41:37 +01:00
12100e7f79 Ensure default layouts directory exists after fresh git clone 2012-04-30 17:05:47 +01:00
50 changed files with 1663 additions and 278 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
test-runner.sh
test/assert.sh
test/stub.sh

16
.travis.yml Normal file
View File

@@ -0,0 +1,16 @@
language: c
env:
- TMUX_VERSION="1.6"
- TMUX_VERSION="1.7"
- TMUX_VERSION="1.8"
- TMUX_VERSION="1.9a"
- TMUX_VERSION="2.0"
before_install:
- sudo apt-get update
- sudo apt-get install -y bc build-essential libevent-dev libncurses5-dev
- wget https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz
- tar -zxf tmux-${TMUX_VERSION}.tar.gz
- cd tmux-${TMUX_VERSION}
- ./configure && make && sudo make install
- cd ..
script: make test

View File

@@ -1,4 +1,4 @@
Copyright (c) 2012 Jim Myhrberg. Copyright (c) 2014 Jim Myhrberg.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

50
Makefile Normal file
View File

@@ -0,0 +1,50 @@
test: bootstrap
./test-runner.sh
bootstrap: test-runner.sh test/assert.sh test/stub.sh
clean: remove_test-runner.sh remove_test/assert.sh remove_test/stub.sh
update: update_test-runner.sh update_test/assert.sh update_test/stub.sh
test-runner.sh:
echo "fetching test-runner.sh..." && \
curl -s -L -o test-runner.sh \
https://github.com/jimeh/test-runner.sh/raw/v0.2.0/test-runner.sh && \
chmod +x test-runner.sh
remove_test-runner.sh:
( \
test -f "test-runner.sh" && rm "test-runner.sh" && \
echo "removed test-runner.sh"\
) || exit 0
update_test-runner.sh: remove_test-runner.sh test-runner.sh
test/assert.sh:
echo "fetching test/assert.sh..." && \
curl -s -L -o test/assert.sh \
https://raw.github.com/lehmannro/assert.sh/v1.0.2/assert.sh
remove_test/assert.sh:
test -f "test/assert.sh" && \
rm "test/assert.sh" && \
echo "removed test/assert.sh"
update_test/assert.sh: remove_test/assert.sh test/assert.sh
test/stub.sh:
echo "fetching test/stub.sh..." && \
curl -s -L -o test/stub.sh \
https://raw.github.com/jimeh/stub.sh/v1.0.1/stub.sh
remove_test/stub.sh:
test -f "test/stub.sh" && \
rm "test/stub.sh" && \
echo "removed test/stub.sh"
update_test/stub.sh: remove_test/stub.sh test/stub.sh
.SILENT:
.PHONY: test bootstrap clean \
remove_test-runner.sh update_test-runner.sh \
remove_test/assert.sh update_test/assert.sh \
remove_test/stub.sh update_test/stub.sh

141
README.md
View File

@@ -1,11 +1,11 @@
# Tmuxifier # Tmuxifier [![Build Status](https://api.travis-ci.org/jimeh/tmuxifier.svg)](https://travis-ci.org/jimeh/tmuxifier)
Tmuxify your Tmux. Create, edit, mangage and load complex Tmux session, window Tmuxify your Tmux. Create, edit, manage and load complex Tmux session, window
and pane configurations with ease. and pane configurations with ease.
In short, Tmuxifier allows you to easily create, edit, and load "layout" In short, Tmuxifier allows you to easily create, edit, and load "layout"
files, which are simple shell scripts where you use the `tmux` command and files, which are simple shell scripts where you use the `tmux` command and
helper commands provided by tmuxifier to manage Tmux sessions and windows helper commands provided by `tmuxifier` to manage Tmux sessions and windows
### Window Layouts ### Window Layouts
@@ -33,17 +33,16 @@ looks like:
```bash ```bash
window_root "~/Desktop" window_root "~/Desktop"
new_window "Example Window" new_window "Example Window"
tmux split-window -t "$session:$window.0" -v -p 20 "watch -t date" split_v 20
tmux split-window -t "$session:$window.1" -h -p 60 run_cmd "watch -t date"
tmux select-pane -t "$session:$window.0" split_h 60
select_pane 0
``` ```
You can then load that window layout into a new window in the You can then load that window layout into a new window in the
current tmux session using: current tmux session using:
```bash tmuxifier load-window example
tmuxifier load-window example
```
Which will yield a Tmux window looking like this: Which will yield a Tmux window looking like this:
@@ -51,14 +50,86 @@ Which will yield a Tmux window looking like this:
## Installation ## Installation
Clone the repo to your machine:
git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier
Then add `$HOME/.tmuxifier/bin` to your PATH to make the `tmuxifier` executable
available to you:
__In bash & zsh:__
```bash ```bash
git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier export PATH="$HOME/.tmuxifier/bin:$PATH"
``` ```
And add the following to your `~/.profile`, `~/.bash_profile` or equivalent: __In tcsh:__
```tcsh
set path = ( "~/.tmuxifier/bin" $path )
```
__In fish:__
```bash ```bash
[[ -s "$HOME/.tmuxifier/init.sh" ]] && source "$HOME/.tmuxifier/init.sh" set -gx PATH "~/.tmuxifier/bin" $PATH
```
### Custom Installation Path
To install Tmuxifier somewhere else than the suggested `~/.tmuxifier`, simply
clone the repository to your custom location, and ensure the `bin` folder is
added to your PATH making the `tmuxifier` executable available to you.
## Setup
__In bash & zsh:__
And add the following to your `~/.profile`, `~/.bash_profile`, `~/.zshrc` or
equivalent:
```bash
eval "$(tmuxifier init -)"
```
__In tcsh:__
Add the following to your `~/.cshrc`, `~/.tcshrc` or equivalent:
```tcsh
eval `tmuxifier init -`
```
__In fish:__
And add the following to your `~/.config/fish/config.fish` or equivalent:
```bash
eval (tmuxifier init - fish)
```
### Custom Tmux Arguments
If you need to pass custom arguments to `tmux` itself, you can do so by
setting the `TMUXIFIER_TMUX_OPTS` environment variable. For example to set
custom arguments globally:
```bash
export TMUXIFIER_TMUX_OPTS="-L my-awesome-socket-name"
eval "$(tmuxifier init -)"
```
And/or specify dynamically when calling `tmuxifier`:
```bash
TMUXIFIER_TMUX_OPTS="-L other-socket" tmuxifier load-session welcome
```
## Updating
```bash
cd ~/.tmuxifier # or where you've cloned tmuxifier to
git pull
``` ```
## Usage ## Usage
@@ -113,17 +184,6 @@ in it.
## Configure & Customize ## Configure & Customize
### Custom Installaton Path
To install Tmuxifier to a custom path, clone the repository to your desired
path and set `$TMUXIFIER` to that path, additionally loading `init.sh` from
that same path.
```bash
export TMUXIFIER="$HOME/.dotfiles/tmuxifier"
[[ -s "$TMUXIFIER/init.sh" ]] && source "$TMUXIFIER/init.sh"
```
### Custom Layouts Path ### Custom Layouts Path
You can customize the layouts directory used by Tmuxifier by setting You can customize the layouts directory used by Tmuxifier by setting
@@ -135,13 +195,29 @@ export TMUXIFIER_LAYOUT_PATH="$HOME/.tmux-layouts"
### Disable Shell-Completion ### Disable Shell-Completion
Tmuxifier comes with shell-completion for bash and zsh. If for any Tmuxifier comes with shell-completion for bash, zsh, tcsh, and fish. If for
reason you need to disable it, just set `$TMUXIFIER_NO_COMPLETE`. any reason you need to disable it, just set `$TMUXIFIER_NO_COMPLETE`.
```bash ```bash
export TMUXIFIER_NO_COMPLETE=1 export TMUXIFIER_NO_COMPLETE=1
``` ```
## Tips
### iTerm2 Integration
Tmuxifier supports iTerm2's [Tmux integration][]. It can be used in two ways:
- Passing `-CC` as a second argument to the `load-session` command. For
example:
tmuxifier load-session my-awesome-session -CC
- Setting the `TMUXIFIER_TMUX_ITERM_ATTACH` environment variable to `-CC`
before calling the `load-session` command.
[tmux integration]: https://gitlab.com/gnachman/iterm2/wikis/TmuxIntegration
## Inspiration ## Inspiration
- Tmuxifier is largely inspired by [Tmuxinator][]. - Tmuxifier is largely inspired by [Tmuxinator][].
@@ -151,7 +227,7 @@ export TMUXIFIER_NO_COMPLETE=1
## Tmuxifier vs. Tmuxinator ## Tmuxifier vs. Tmuxinator
Though Tmuxifier is largely inspired by the excellent [Tmuxinator][] project, Though Tmuxifier is largely inspired by the excellent [Tmuxinator][] project,
but does set itself apart in a number of ways: it does set itself apart in a number of ways:
- Uses shell scripts to define Tmux sessions and windows instead of YAML - Uses shell scripts to define Tmux sessions and windows instead of YAML
files. The benefit is total control over Tmux, but the definition files are files. The benefit is total control over Tmux, but the definition files are
@@ -166,25 +242,16 @@ but does set itself apart in a number of ways:
[tmuxinator]: https://github.com/aziz/tmuxinator [tmuxinator]: https://github.com/aziz/tmuxinator
[rbenv]: https://github.com/sstephenson/rbenv [rbenv]: https://github.com/sstephenson/rbenv
## Heed My Warning
Tmuxifier is pretty much an alpha product hacked together over a weekend at
this point. Documentation is sketchy at best, and things might drastically
change and/or break.
But if that doesn't put you off, please enjoy Tmuxifier :)
## Todos ## Todos
* Improve Readme, specially Usage section. * Improve Readme, specially Usage section.
* Expand `help` command with details for most commands, rather than just the * Write up a detailed reference for all available layout helper functions.
essential ones.
## License ## License
(The MIT license) (The MIT license)
Copyright (c) 2012 Jim Myhrberg. Copyright (c) 2014 Jim Myhrberg.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -2,17 +2,47 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
resolve_link() {
$(type -p greadlink readlink | head -1) $1
}
abs_dirname() {
local cwd="$(pwd)"
local path="$1"
while [ -n "$path" ]; do
cd "${path%/*}"
local name="${path##*/}"
path="$(resolve_link "$name" || true)"
done
pwd
cd "$cwd"
}
if [ -z "${TMUXIFIER}" ]; then if [ -z "${TMUXIFIER}" ]; then
export TMUXIFIER="${HOME}/.tmuxifier" # Set TMUXIFIER relative to the "tmuxifier" executable.
export TMUXIFIER="$(dirname "$(abs_dirname "$0")")"
else else
# Strip any trailing slash (/) characters from TMUXIFIER variable.
export TMUXIFIER="${TMUXIFIER%/}" export TMUXIFIER="${TMUXIFIER%/}"
fi fi
# Load tmuxifier environment variables. # Load tmuxifier environment variables.
source "$TMUXIFIER/env.sh" source "$TMUXIFIER/lib/env.sh"
# Add tmuxifier's internal commands to PATH.
export PATH="$TMUXIFIER/libexec:$PATH" export PATH="$TMUXIFIER/libexec:$PATH"
# Check Tmux version.
export TMUXIFIER_MIN_TMUX_VERSION="1.6"
if [ "$(tmuxifier-tmux-version "$TMUXIFIER_MIN_TMUX_VERSION")" == "<" ]; then
echo -e "ERROR: Tmuxifier requires Tmux v${TMUXIFIER_MIN_TMUX_VERSION}" \
"or newer. You have v$(tmuxifier-tmux-version)." >&2
exit 1
fi
# Parse given command
command="$1" command="$1"
case "$command" in case "$command" in
"" | "-h" | "--help" ) "" | "-h" | "--help" )

36
completion/tmuxifier.fish Normal file
View File

@@ -0,0 +1,36 @@
set -l cmd_load_session 'load-session s'
set -l cmd_load_window 'load-window w'
set -l cmd_list 'list l'
set -l cmd_list_sessions 'list-sessions ls'
set -l cmd_list_windows 'list-windows lw'
set -l cmd_new_session 'new-session ns'
set -l cmd_new_window 'new-window nw'
set -l cmd_edit_session 'edit-session es'
set -l cmd_edit_window 'edit-window ew'
set -l cmd_commands 'commands'
set -l cmd_version 'version'
set -l cmd_help 'help'
complete -c tmuxifier -x
# Commands
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_load_session -d 'Load the specified session layout.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_load_window -d 'Load the specified window layout into current session.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_list -d 'List all session and window layouts.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_list_sessions -d 'List session layouts.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_list_windows -d 'List window layouts.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_new_session -d 'Create new session layout and open it with $EDITOR.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_new_window -d 'Create new window layout and open it with $EDITOR.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_edit_session -d 'Edit specified session layout with $EDITOR.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_edit_window -d 'Edit specified window layout with $EDITOR.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_commands -d 'List all tmuxifier commands.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_version -d 'Print Tmuxifier version.'
complete -c tmuxifier -n '__fish_use_subcommand' -a $cmd_help -d 'Show this message.'
# Complete subcommands
complete -c tmuxifier -x -n "__fish_seen_subcommand_from $cmd_load_session" -a '(tmuxifier list-sessions)' -d 'session-template'
complete -c tmuxifier -x -n "__fish_seen_subcommand_from $cmd_load_window" -a '(tmuxifier list-windows)' -d 'window-template'
complete -c tmuxifier -x -n "__fish_seen_subcommand_from $cmd_edit_session" -a '(tmuxifier list-sessions)' -d 'session-template'
complete -c tmuxifier -x -n "__fish_seen_subcommand_from $cmd_edit_window" -a '(tmuxifier list-windows)' -d 'window-template'

View File

@@ -0,0 +1,2 @@
complete tmuxifier 'p@1@`tmuxifier commands`@' \
'p@2@`tmuxifier completions $:-1`@'

View File

@@ -7,8 +7,9 @@ window_root "~/Desktop"
new_window "Example Window" new_window "Example Window"
# Split window into panes. # Split window into panes.
tmux split-window -t "$session:$window.0" -v -p 20 "watch -t date" split_v 20
tmux split-window -t "$session:$window.1" -h -p 60 run_cmd "watch -t date"
split_h 60
# Set active pane. # Set active pane.
tmux select-pane -t "$session:$window.0" select_pane 0

20
init.fish Normal file
View File

@@ -0,0 +1,20 @@
# Set/fix Tmuxifier root path if needed.
if test -z $TMUXIFIER
set -gx TMUXIFIER "$HOME/.tmuxifier"
end
# Add `bin` directroy to `$PATH`.
if not contains "$TMUXIFIER/bin" $PATH
set -gx PATH "$TMUXIFIER/bin" $PATH
end
# If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then
# load Tmuxifier shell completion.
if test -n (which tmuxifier); and test -z $TMUXIFIER_NO_COMPLETE
# fish shell 2.0.0 does not have the source alias
if [ (fish --version 2>| awk -F'version ' '{print $2}') = '2.0.0' ];
. "$TMUXIFIER/completion/tmuxifier.fish"
else
source "$TMUXIFIER/completion/tmuxifier.fish"
end
end

View File

@@ -1,4 +1,4 @@
# Set tmuxifier root path. # Set/fix Tmuxifier root path if needed.
if [ -z "${TMUXIFIER}" ]; then if [ -z "${TMUXIFIER}" ]; then
export TMUXIFIER="${HOME}/.tmuxifier" export TMUXIFIER="${HOME}/.tmuxifier"
else else
@@ -6,10 +6,12 @@ else
fi fi
# Add `bin` directroy to `$PATH`. # Add `bin` directroy to `$PATH`.
export PATH="$TMUXIFIER/bin:$PATH" if [[ ":$PATH:" != *":$TMUXIFIER/bin:"* ]]; then
export PATH="$TMUXIFIER/bin:$PATH"
fi
# If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then # If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then
# load tmuxifier shell completion. # load Tmuxifier shell completion.
if [ -n "$(command -v "tmuxifier")" ] && [ -z "$TMUXIFIER_NO_COMPLETE" ]; then if [ -n "$(command -v "tmuxifier")" ] && [ -z "$TMUXIFIER_NO_COMPLETE" ]; then
if [ -n "$BASH_VERSION" ]; then if [ -n "$BASH_VERSION" ]; then
source "$TMUXIFIER/completion/tmuxifier.bash" source "$TMUXIFIER/completion/tmuxifier.bash"

15
init.tcsh Normal file
View File

@@ -0,0 +1,15 @@
# Set Tmuxifier root path if needed.
if ( ! $?TMUXIFIER ) then
setenv TMUXIFIER "${HOME}/.tmuxifier"
endif
# Add `bin` directroy to `$path` if needed.
if ( ! (" $path " =~ "* $TMUXIFIER/bin *" ) ) then
set path = ( $TMUXIFIER/bin $path )
endif
# If `tmuxifier` is available, and `$TMUXIFIER_NO_COMPLETE` is not set, then
# load Tmuxifier shell completion.
if ( ! $?TMUXIFIER_NO_COMPLETE ) then
which tmuxifier > /dev/null && source "$TMUXIFIER/completion/tmuxifier.tcsh"
endif

0
layouts/.gitkeep Normal file
View File

View File

View File

@@ -6,6 +6,11 @@
# otherwise more complex means. # otherwise more complex means.
# #
# Alias tmux to tmuxifier-tmux wrapper.
tmux() {
tmuxifier-tmux "$@"
}
# Create a new window. # Create a new window.
# #
# Arguments: # Arguments:
@@ -13,17 +18,72 @@
# - $2: (optional) Shell command to execute when window is created. # - $2: (optional) Shell command to execute when window is created.
# #
new_window() { new_window() {
if [ -n "$1" ]; then if [ -n "$1" ]; then local winarg=(-n "$1"); fi
window="$1" if [ -n "$2" ]; then local command=("$2"); fi
fi
local command=() tmuxifier-tmux new-window -t "$session:" "${winarg[@]}" "${command[@]}"
if [ -n "$2" ]; then
command+=("$2") # Disable renaming if a window name was given.
fi if [ -n "$1" ]; then tmuxifier-tmux set-option -t "$1" allow-rename off; fi
if [ -n "$window" ]; then
local winarg=(-n "$window") window="$(__get_current_window_index)"
fi __go_to_window_or_session_path
tmux new-window -t "$session:" "${winarg[@]}" "${command[@]}" }
# Split current window/pane vertically.
#
# Arguments:
# - $1: (optional) Percentage of frame the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_v() {
if [ -n "$1" ]; then local percentage=(-p "$1"); fi
tmuxifier-tmux split-window -t "$session:$window.$2" -v "${percentage[@]}"
__go_to_window_or_session_path
}
# Split current window/pane horizontally.
#
# Arguments:
# - $1: (optional) Percentage of frame the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_h() {
if [ -n "$1" ]; then local percentage=(-p "$1"); fi
tmuxifier-tmux split-window -t "$session:$window.$2" -h "${percentage[@]}"
__go_to_window_or_session_path
}
# Split current window/pane vertically by line count.
#
# Arguments:
# - $1: (optional) Number of lines the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_vl() {
if [ -n "$1" ]; then local count=(-l "$1"); fi
tmuxifier-tmux split-window -t "$session:$window.$2" -v "${count[@]}"
__go_to_window_or_session_path
}
# Split current window/pane horizontally by column count.
#
# Arguments:
# - $1: (optional) Number of columns the new pane will use.
# - $2: (optional) Target pane ID to split in current window.
#
split_hl() {
if [ -n "$1" ]; then local count=(-l "$1"); fi
tmuxifier-tmux split-window -t "$session:$window.$2" -h "${count[@]}"
__go_to_window_or_session_path
}
# Run clock mode.
#
# Arguments:
# - $1: (optional) Target pane ID in which to run
clock() {
tmuxifier-tmux clock-mode -t "$session:$window.$1"
} }
# Select a specific window. # Select a specific window.
@@ -32,52 +92,79 @@ new_window() {
# - $1: Window ID or name to select. # - $1: Window ID or name to select.
# #
select_window() { select_window() {
tmux select-window -t "$session:$1" tmuxifier-tmux select-window -t "$session:$1"
window="$(__get_current_window_index)"
} }
# Load specified window layout. # Select a specific pane in the current window.
# #
# Arguments: # Arguments:
# - $1: Name of window layout to load. # - $1: Pane ID to select.
# #
load_window() { select_pane() {
local file="$TMUXIFIER_LAYOUT_PATH/$1.window.sh" tmuxifier-tmux select-pane -t "$session:$window.$1"
if [ -f "$file" ]; then
window="$1"
source "$file"
window=""
# Reset `$window_root`.
if [[ "$window_root" != "$session_root" ]]; then
window_root "$session_root"
fi
else
echo "No such window layout found '$1' in '$TMUXIFIER_LAYOUT_PATH'."
fi
} }
# Load specified session layout. # Balance windows vertically with the "even-vertical" layout.
# #
# Arguments: # Arguments:
# - $1: Name of session layout to load. # - $1: (optional) Window ID or name to operate on.
# #
load_session() { balance_windows_vertical() {
local file="$TMUXIFIER_LAYOUT_PATH/$1.session.sh" tmuxifier-tmux select-layout -t "$session:${1:-$window}" even-vertical
if [ -f "$file" ]; then
session="$1"
source "$file"
session=
# Reset `$session_root`.
if [[ "$session_root" != "$HOME" ]]; then
session_root="$HOME"
fi
else
echo "No such session layout found '$1' in '$TMUXIFIER_LAYOUT_PATH'."
fi
} }
# Cusomize session root path. Default is `$HOME`. # Balance windows horizontally with the "even-horizontal" layout.
#
# Arguments:
# - $1: (optional) Window ID or name to operate on.
#
balance_windows_horizontal() {
tmuxifier-tmux select-layout -t "$session:${1:-$window}" even-horizontal
}
# Turn on synchronize-panes in a window.
#
# Arguments:
# - $1: (optional) Window ID or name to operate on.
#
synchronize_on() {
tmuxifier-tmux set-window-option -t "$session:${1:-$window}" \
synchronize-panes on
}
# Turn off synchronize-panes in a window.
#
# Arguments:
# - $1: (optional) Window ID or name to operate on.
#
synchronize_off() {
tmuxifier-tmux set-window-option -t "$session:${1:-$window}" \
synchronize-panes off
}
# Send/paste keys to the currently active pane/window.
#
# Arguments:
# - $1: String to paste.
# - $2: (optional) Target pane ID to send input to.
#
send_keys() {
tmuxifier-tmux send-keys -t "$session:$window.$2" "$1"
}
# Runs a shell command in the currently active pane/window.
#
# Arguments:
# - $1: Shell command to run.
# - $2: (optional) Target pane ID to run command in.
#
run_cmd() {
send_keys "$1" "$2"
send_keys "C-m" "$2"
}
# Customize session root path. Default is `$HOME`.
# #
# Arguments: # Arguments:
# - $1: Directory path to use for session root. # - $1: Directory path to use for session root.
@@ -97,7 +184,81 @@ session_root() {
window_root() { window_root() {
local dir="$(__expand_path $@)" local dir="$(__expand_path $@)"
if [ -d "$dir" ]; then if [ -d "$dir" ]; then
cd "$dir" window_root="$dir"
fi
}
# Load specified window layout.
#
# Arguments:
# - $1: Name of or file path to window layout to load.
# - $2: (optional) Override default window name.
#
load_window() {
local file="$1"
if [ ! -f "$file" ]; then
file="$TMUXIFIER_LAYOUT_PATH/$1.window.sh"
fi
if [ -f "$file" ]; then
if [ $# -gt 1 ]; then
window="$2"
else
window="${1/%.window.sh}"
window="${window/%.sh}"
fi
source "$file"
window=
# Reset `$window_root`.
if [[ "$window_root" != "$session_root" ]]; then
window_root "$session_root"
fi
else
echo "\"$1\" window layout not found." >&2
return 1
fi
}
# Load specified session layout.
#
# Arguments:
# - $1: Name of or file path to session layout to load.
# - $2: (optional) Override default window name.
#
load_session() {
local file
if [ "${1#*/}" = "$1" ]; then
# There's no slash in the path.
if [ -f "$TMUXIFIER_LAYOUT_PATH/$1.session.sh" ] || [ ! -f "$1" ]; then
file="$TMUXIFIER_LAYOUT_PATH/$1.session.sh"
else
# bash's 'source' requires an slash in the filename to not use $PATH.
file="./$1"
fi
else
file="$1"
fi
if ! [ -f "$file" ]; then
echo "\"$1\" session layout not found." >&2
return 1
fi
if [ $# -gt 1 ]; then
session="$2"
else
session="${1/%.session.sh}"
session="${session/%.sh}"
fi
set_default_path=true
source "$file"
session=
# Reset `$session_root`.
if [[ "$session_root" != "$HOME" ]]; then
session_root="$HOME"
fi fi
} }
@@ -119,45 +280,61 @@ initialize_session() {
fi fi
# Ensure tmux server is running for has-session check. # Ensure tmux server is running for has-session check.
tmux start-server tmuxifier-tmux start-server
# Check if the named session already exists. # Check if the named session already exists.
if ! tmux has-session -t "$session" 2>/dev/null; then if tmuxifier-tmux list-sessions | grep -q "^$session:"; then
return 1
fi
# Tmux 1.8 and earlier.
if [ "$(tmuxifier-tmux-version "1.9")" == "<" ]; then
# Create the new session. # Create the new session.
env TMUX= tmux new-session -d -s "$session" env TMUX="" tmuxifier-tmux new-session -d -s "$session"
# Set default-path for session # Set default-path for session
if [ -n "$session_root" ] && [ -d "$session_root" ]; then if [ -n "$session_root" ] && [ -d "$session_root" ]; then
cd "$session_root" cd "$session_root"
tmux set-option -t "$session" default-path "$session_root" 1>/dev/null
$set_default_path && tmuxifier-tmux \
set-option -t "$session:" \
default-path "$session_root" 1>/dev/null
fi fi
# In order to ensure only specified windows are created, we move the # Tmux 1.9 and later.
# default window to position 99, and later remove it with the else
# `finalize_session` function. if $set_default_path; then
tmux move-window -s "$session:0" -t "$session:99" local session_args=(-c "$session_root")
fi
# Ensure correct pane splitting. env TMUX="" tmuxifier-tmux new-session \
__go_to_session -d -s "$session" "${session_args[@]}"
# Session created, return ok exit status.
return 0
fi fi
# Session already existed, return error exit status.
return 1 if $set_default_path && [[ "$session_root" != "$HOME" ]]; then
tmuxifier-tmux setenv -t "$session:" \
TMUXIFIER_SESSION_ROOT "$session_root"
fi
# In order to ensure only specified windows are created, we move the
# default window to position 999, and later remove it with the
# `finalize_and_go_to_session` function.
local first_window_index=$(__get_first_window_index)
tmuxifier-tmux move-window \
-s "$session:$first_window_index" -t "$session:999"
} }
# Finalize session creation and then switch to it if needed. # Finalize session creation and then switch to it if needed.
# #
# When the session is created, it leaves a unused window in position #99, this # When the session is created, it leaves a unused window in position #999,
# is the default window which was created with the session, but it's also a # this is the default window which was created with the session, but it's also
# window that was not explicitly created. Hence we kill it. # a window that was not explicitly created. Hence we kill it.
# #
# If the session was created, we've already been switched to it. If it was not # If the session was created, we've already been switched to it. If it was not
# created, the session already exists, and we'll need to specifically switch # created, but already existed, then we'll need to specifically switch to it.
# to it here. #
finalize_and_go_to_session() { finalize_and_go_to_session() {
! tmux kill-window -t "$session:99" 2>/dev/null ! tmuxifier-tmux kill-window -t "$session:999" 2>/dev/null
if [[ "$(tmuxifier-current-session)" != "$session" ]]; then if [[ "$(tmuxifier-current-session)" != "$session" ]]; then
__go_to_session __go_to_session
fi fi
@@ -179,10 +356,49 @@ __expand_path() {
echo $(eval echo "$@") echo $(eval echo "$@")
} }
__go_to_session() { __get_first_window_index() {
if [ -z "$TMUX" ]; then local index=$(tmuxifier-tmux list-windows -t "$session:" \
tmux -u attach-session -t "$session" -F "#{window_index}" 2>/dev/null)
if [ -n "$index" ]; then
echo "$index" | head -1
else else
tmux -u switch-client -t "$session" echo "0"
fi
}
__get_current_window_index() {
local lookup=$(tmuxifier-tmux list-windows -t "$session:" \
-F "#{window_active}:#{window_index}" 2>/dev/null | grep "^1:")
if [ -n "$lookup" ]; then
echo "${lookup/1:}"
fi
}
__go_to_session() {
if [ -z "$TMUX" ]; then
tmuxifier-tmux $TMUXIFIER_TMUX_ITERM_ATTACH -u \
attach-session -t "$session:"
else
tmuxifier-tmux -u switch-client -t "$session:"
fi
}
__go_to_window_or_session_path() {
local target_path
if [ -n "$window_root" ]; then
target_path="$window_root"
elif [ -n "$TMUXIFIER_SESSION_ROOT" ]; then
target_path="$TMUXIFIER_SESSION_ROOT"
elif [ -n "$session_root" ]; then
target_path="$session_root"
fi
# local window_or_session_root=${window_root-$session_root}
if [ -n "$target_path" ]; then
run_cmd "cd \"$target_path\""
run_cmd "clear"
fi fi
} }

View File

@@ -3,7 +3,7 @@
# #
# Load tmuxifier environment. # Load tmuxifier environment.
source "$TMUXIFIER/env.sh" source "$TMUXIFIER/lib/env.sh"
# Setup default variables. # Setup default variables.
session_root="$HOME" session_root="$HOME"

11
lib/util.sh Normal file
View File

@@ -0,0 +1,11 @@
calling-help() {
if [[ " $@ " != *" --help "* ]] && [[ " $@ " != *" -h "* ]]; then
return 1
fi
}
calling-complete() {
if [[ " $@ " != *" --complete "* ]]; then
return 1
fi
}

View File

@@ -2,6 +2,17 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier alias <alias>
Resolve a command alias to it's full name."
exit
fi
case "$1" in case "$1" in
"session" | "ses" | "s" ) "session" | "ses" | "s" )
echo "load-session" echo "load-session"
@@ -9,25 +20,25 @@ case "$1" in
"window" | "win" | "w" ) "window" | "win" | "w" )
echo "load-window" echo "load-window"
;; ;;
"new-ses" | "ns" ) "new-ses" | "nses" | "ns" )
echo "new-session" echo "new-session"
;; ;;
"new-win" | "nw" ) "new-win" | "nwin" | "nw" )
echo "new-window" echo "new-window"
;; ;;
"edit-ses" | "es" ) "edit-ses" | "eses" | "es" )
echo "edit-session" echo "edit-session"
;; ;;
"edit-win" | "ew" ) "edit-win" | "ewin" | "ew" )
echo "edit-window" echo "edit-window"
;; ;;
"ls" ) "l" )
echo "list" echo "list"
;; ;;
"list-ses" | "lss" ) "list-ses" | "lses" | "ls" )
echo "list-sessions" echo "list-sessions"
;; ;;
"list-win" | "lsw" ) "list-win" | "lwin" | "lw" )
echo "list-windows" echo "list-windows"
;; ;;
* ) * )

View File

@@ -2,6 +2,18 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier commands
List all available commands, includes internal commands not intended for
normal use by users."
exit
fi
shopt -s nullglob shopt -s nullglob
{ for path in ${PATH//:/$'\n'}; do { for path in ${PATH//:/$'\n'}; do

View File

@@ -2,23 +2,33 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier completion <command>
Print a list of available completions for specified command."
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
tmuxifier-commands tmuxifier-commands
exit exit
fi fi
has-completions() { has-completions() {
grep -i "^# provide tmuxifier completions" "$1" >/dev/null grep -i "^# Provide tmuxifier completions" "$1" >/dev/null
} }
command="$1" if [ -z "$1" ]; then
if [ -z "$command" ]; then echo "$(tmuxifier-help completions $@)" >&2
echo "$(tmuxifier-help completions)" >&2
exit 1 exit 1
fi fi
! command_path="$(tmuxifier-resolve-command-path "$command")" ! command_path="$(tmuxifier-resolve-command-path "$1")"
if [ -n "$command_path" ] && has-completions "$command_path"; then if [ -n "$command_path" ] && has-completions "$command_path"; then
shift shift

View File

@@ -2,12 +2,21 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier current-session
Outputs the name of the current Tmux session."
exit
fi
if [ -n "$TMUX" ]; then if [ -n "$TMUX" ]; then
for item in $(tmux list-sessions -F "#{?session_attached,1,0}:#S"); do for item in $(tmuxifier-tmux list-pane -F "#{session_name}");do
if [[ "$item" == "1:"* ]]; then echo $item
echo ${item/1:/} exit 0
exit 0
fi
done done
fi fi

View File

@@ -2,16 +2,27 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier edit-session <layout_name>
Aliases: edit-ses, eses, es
Open specified session layout for editing in \$EDITOR."
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
for item in $(tmuxifier-list-sessions); do tmuxifier-list-sessions
echo "$item"
done
exit exit
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help edit-session)" >&2 echo "$(tmuxifier-help edit-session $@)" >&2
exit 1 exit 1
fi fi
@@ -26,4 +37,10 @@ if [ ! -f "$layout_file" ]; then
exit 1 exit 1
fi fi
exec "$EDITOR" "$layout_file" if [ -n "$EDITOR" ]; then
exec $EDITOR "$layout_file"
else
echo "'\$EDITOR' is not set. Please manually open the layout for editing:"
echo "$layout_file"
echo
fi

View File

@@ -2,16 +2,27 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier edit-window <layout_name>
Aliases: edit-win, ewin, ew
Open specified window layout for editing in \$EDITOR."
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
for item in $(tmuxifier-list-windows); do tmuxifier-list-windows
echo "$item"
done
exit exit
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help edit-window)" >&2 echo "$(tmuxifier-help edit-window $@)" >&2
exit 1 exit 1
fi fi
@@ -26,4 +37,10 @@ if [ ! -f "$layout_file" ]; then
exit 1 exit 1
fi fi
exec "$EDITOR" "$layout_file" if [ -n "$EDITOR" ]; then
exec $EDITOR "$layout_file"
else
echo "'\$EDITOR' is not set. Please manually open the layout for editing:"
echo "$layout_file"
echo
fi

View File

@@ -2,123 +2,63 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
tmuxifier-help
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
tmuxifier-commands tmuxifier-commands
exit exit
fi fi
command="$1" has-help() {
grep -i "^# Provide tmuxifier help" "$1" >/dev/null
}
# Ensure we have the correct command name in case an alias was given. if [ -z "$1" ]; then
if [ -n "$command" ]; then echo "usage: tmuxifier <command> [<args>]
! resolved="$(tmuxifier-alias "$command")"
if [ -n "$resolved" ]; then
command="$resolved"
fi
fi
case "$command" in
"" )
echo "usage: tmuxifier <command> [<args>]
Some useful tmuxifier commands are: Some useful tmuxifier commands are:
<command> <alias> <command> <alias>
load-session s Load the specified session layout. load-session s Load the specified session layout.
load-window w Load the specified window layout into current session. load-window w Load the specified window layout into current session.
list ls List all session and window layouts. list l List all session and window layouts.
list-sessions lss List session layouts. list-sessions ls List session layouts.
list-windows lsw List window layouts. list-windows lw List window layouts.
new-session ns Create new session layout and open it with \$EDITOR. new-session ns Create new session layout and open it with \$EDITOR.
new-window nw Create new window layout and open it with \$EDITOR. new-window nw Create new window layout and open it with \$EDITOR.
edit-session es Edit specified session layout with \$EDITOR. edit-session es Edit specified session layout with \$EDITOR.
edit-window ew Edit specified window layout with \$EDITOR. edit-window ew Edit specified window layout with \$EDITOR.
commands List all tmuxifier commands. commands List all tmuxifier commands (including internal).
version Print Tmuxifier version. version Print Tmuxifier version.
help Show this message. help Show this message.
See 'tmuxifier help <command>' for information on a specific command." See 'tmuxifier help <command>' for information on a specific command."
;; exit
"load-session" ) fi
echo "usage: tmuxifier load-session <layout_name>
Aliases: session, ses, s ! command_path="$(tmuxifier-resolve-command-path "$1")"
Create a session using the session layout, unless the session already exists if [ -z "$command_path" ]; then
in which case, we simply switch to the existing one." echo "tmuxifier: no such command '$1'" >&2
;; exit 1
"load-window" ) fi
echo "usage: tmuxifier load-window <layout_name>
Aliases: window, win, w if has-help "$command_path"; then
shift
Create a new window using the specified window layout in the current session." exec "$command_path" "$@" --help
;; else
"new-session" ) command="$(basename "$command_path")"
echo "usage: tmuxifier new-session <layout_name> command="${command/tmuxifier\-/}"
echo "Sorry, the '$command' command isn't documented yet."
Aliases: new-ses, ns echo ""
echo "You can view the command's source here:"
Create a new session layout and open it for editing in \$EDITOR." echo "$command_path"
;; echo ""
"new-window" ) fi
echo "usage: tmuxifier new-window <layout_name>
Aliases: new-win, ws
Create a new window layout and open it for editing in \$EDITOR."
;;
"edit-session" )
echo "usage: tmuxifier edit-session <layout_name>
Aliases: edit-ses, es
Open specified session layout for editing in \$EDITOR."
;;
"edit-window" )
echo "usage: tmuxifier edit-window <layout_name>
Aliases: edit-win, ew
Open specified window layout for editing in \$EDITOR."
;;
"completions" )
echo "usage: tmuxifier completion <command>
Print a list of available completions for specified command."
;;
"list" )
echo "usage: tmuxifier list
Aliases: ls
List all available session and window layouts."
;;
"list-sessions" )
echo "usage: tmuxifier list-sessions
Aliases: list-ses, lss
List all session layouts."
;;
"list-windows" )
echo "usage: tmuxifier list-windows
Aliases: list-win, lsw
List all window layouts."
;;
* )
! command_path="$(tmuxifier-resolve-command-path "$command")"
if [ -n "$command_path" ]; then
echo "Sorry, the '$command' command isn't documented yet."
echo
echo "You can view the command's source here:"
echo "$command_path"
echo
else
echo "tmuxifier: no such command '$command'" >&2
exit 1
fi
;;
esac

90
libexec/tmuxifier-init Executable file
View File

@@ -0,0 +1,90 @@
#! /usr/bin/env bash
set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x
# Set shell to first argument that is not "-", "-h" or "--help".
for arg in "$@"; do
if [ "$arg" != "-" ] && [ "$arg" != "-h" ] && [ "$arg" != "--help" ]; then
shell="$arg"
fi
done
if [ -z "$shell" ]; then
shell="$(basename "$SHELL")"
fi
case "$shell" in
bash )
profile='~/.bash_profile'
;;
zsh )
profile='~/.zshrc'
;;
ksh )
profile='~/.profile'
;;
csh )
profile='~/.cshrc'
;;
tcsh )
profile='~/.tcshrc'
;;
fish )
profile='~/.config/fish/config.fish'
;;
* )
profile='shell init file'
;;
esac
# Provide tmuxifier help
if [[ " $@ " == *" --help "* ]]; then
echo "usage: tmuxifier init -
Load Tmuxifier by adding the following to your ${profile}:
"
case "$shell" in
csh | tcsh )
echo " eval \`tmuxifier init -\`
"
;;
fish )
echo " eval (tmuxifier init -)
"
;;
* )
echo " eval \"\$(tmuxifier init -)\"
"
;;
esac
echo "You might also need to add Tmuxifier's bin directory to your PATH."
exit
fi
# Print help if "-" argument is not given
if [[ " $@ " != *" - "* ]]; then
echo "$(tmuxifier-help init $@)" >&2
exit 1
fi
case "$shell" in
csh | tcsh )
echo "setenv TMUXIFIER \"$TMUXIFIER\";"
echo "source \"\$TMUXIFIER/init.tcsh\";"
;;
fish )
echo "set -gx TMUXIFIER \"$TMUXIFIER\";"
# fish shell 2.0.0 does not have the source alias
if [[ $(fish --version 2>&1 | awk -F'version ' '{print $2}') = '2.0.0' ]]; then
echo ". \"\$TMUXIFIER/init.fish\";"
else
echo "source \"\$TMUXIFIER/init.fish\";"
fi
;;
* )
echo "export TMUXIFIER=\"$TMUXIFIER\";"
echo "source \"\$TMUXIFIER/init.sh\";"
;;
esac

View File

@@ -2,10 +2,27 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier list
Aliases: l
List all available session and window layouts."
exit
fi
echo "" echo ""
echo "Sessions:" echo "Sessions:"
tmuxifier-list-sessions for item in $(tmuxifier-list-sessions); do
echo " - $item"
done
echo "" echo ""
echo "Windows:" echo "Windows:"
tmuxifier-list-windows for item in $(tmuxifier-list-windows); do
echo " - $item"
done
echo "" echo ""

View File

@@ -2,8 +2,21 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
list=$(find "$TMUXIFIER_LAYOUT_PATH" -name "*.session.sh") # Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier list-sessions
Aliases: list-ses, lses, ls
List all session layouts."
exit
fi
list=$(find -L "$TMUXIFIER_LAYOUT_PATH" -name "*.session.sh" | sort)
for file in $list; do for file in $list; do
file=${file/$TMUXIFIER_LAYOUT_PATH\//} file=${file/$TMUXIFIER_LAYOUT_PATH\//}
echo " ${file/.session.sh/}" echo "${file/.session.sh/}"
done done

View File

@@ -2,8 +2,21 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
list=$(find "$TMUXIFIER_LAYOUT_PATH" -name "*.window.sh") # Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier list-windows
Aliases: list-win, lwin, lw
List all window layouts."
exit
fi
list=$(find -L "$TMUXIFIER_LAYOUT_PATH" -name "*.window.sh" | sort)
for file in $list; do for file in $list; do
file=${file/$TMUXIFIER_LAYOUT_PATH\//} file=${file/$TMUXIFIER_LAYOUT_PATH\//}
echo " ${file/.window.sh/}" echo "${file/.window.sh/}"
done done

View File

@@ -2,25 +2,44 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier load-session <layout_name | file_path> [<iterm mode>]
Aliases: session, ses, s
Create a session using the session layout, unless the session already exists
in which case, we simply attach/switch to the existing one.
Arguments:
<layout_name | file_path> - Name of a session layout stored in the layouts
directory, or path to a session layout file.
<iterm mode> - When given as \"-CC\" tmux will be called with
the -CC argument enabling iTerm2 integration.
More info: http://bit.ly/1yDbMlm"
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
for item in $(tmuxifier-list-sessions); do tmuxifier-list-sessions
echo "$item"
done
exit exit
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help load-session)" >&2 echo "$(tmuxifier-help load-session $@)" >&2
exit 1 exit 1
fi fi
# Load runtime functions. # Load runtime functions.
source "$TMUXIFIER/runtime.sh" source "$TMUXIFIER/lib/runtime.sh"
if [ ! -z $TMUX ]; then if [ "$2" == "-CC" ]; then
load_session "$1" export TMUXIFIER_TMUX_ITERM_ATTACH="-CC"
else
echo "tmuxifier: 'load-session' command can only be used from within Tmux."
exit 1
fi fi
# Load session file.
load_session "$1"

View File

@@ -2,21 +2,36 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier load-window <layout_name | file_path>
Aliases: window, win, w
Create a new window using the specified window layout in the current session.
Arguments:
<layout_name | file_path> - Name of a window layout stored in the layouts
directory, or path to a window layout file."
exit
fi
# Provide tmuxifier completions # Provide tmuxifier completions
if [ "$1" == "--complete" ]; then if calling-complete "$@"; then
for item in $(tmuxifier-list-windows); do tmuxifier-list-windows
echo "$item"
done
exit exit
fi fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help load-window)" >&2 echo "$(tmuxifier-help load-window $@)" >&2
exit 1 exit 1
fi fi
# Load runtime functions. # Load runtime functions.
source "$TMUXIFIER/runtime.sh" source "$TMUXIFIER/lib/runtime.sh"
if [ ! -z $TMUX ]; then if [ ! -z $TMUX ]; then
session="$(tmuxifier-current-session)" session="$(tmuxifier-current-session)"

View File

@@ -2,8 +2,27 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier new-session <layout_name>
Aliases: new-ses, nses, ns
Create a new session layout and open it for editing in \$EDITOR."
exit
fi
# Provide tmuxifier completions
if calling-complete "$@"; then
tmuxifier-list-sessions
exit
fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-session)" >&2 echo "$(tmuxifier-help new-session $@)" >&2
exit 1 exit 1
fi fi
@@ -27,8 +46,8 @@ fi
content="$(cat "$template")" content="$(cat "$template")"
echo "${content//\{\{SESSION_NAME\}\}/$layout_name}" > "$layout_file" echo "${content//\{\{SESSION_NAME\}\}/$layout_name}" > "$layout_file"
if [ ! -z "$EDITOR" ]; then if [ -n "$EDITOR" ]; then
exec "$EDITOR" "$layout_file" exec $EDITOR "$layout_file"
else else
echo "Layout file has been created, but '\$EDITOR' is not set. Please " echo "Layout file has been created, but '\$EDITOR' is not set. Please "
echo "manually open the layout for editing:" echo "manually open the layout for editing:"

View File

@@ -2,8 +2,27 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier new-window <layout_name>
Aliases: new-win, nwin, nw
Create a new window layout and open it for editing in \$EDITOR."
exit
fi
# Provide tmuxifier completions
if calling-complete "$@"; then
tmuxifier-list-windows
exit
fi
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo "$(tmuxifier-help new-window)" >&2 echo "$(tmuxifier-help new-window $@)" >&2
exit 1 exit 1
fi fi
@@ -27,8 +46,8 @@ fi
content="$(cat "$template")" content="$(cat "$template")"
echo "${content//\{\{WINDOW_NAME\}\}/$layout_name}" > "$layout_file" echo "${content//\{\{WINDOW_NAME\}\}/$layout_name}" > "$layout_file"
if [ ! -z "$EDITOR" ]; then if [ -n "$EDITOR" ]; then
exec "$EDITOR" "$layout_file" exec $EDITOR "$layout_file"
else else
echo "Layout file has been created, but '\$EDITOR' is not set. Please " echo "Layout file has been created, but '\$EDITOR' is not set. Please "
echo "manually open the layout for editing:" echo "manually open the layout for editing:"

View File

@@ -2,6 +2,17 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier resolve-command-path <command_or_alias>
Outputs the absolute path to the given command or command alias."
exit
fi
if [ -n "$1" ]; then if [ -n "$1" ]; then
! command_path="$(command -v "tmuxifier-$1")" ! command_path="$(command -v "tmuxifier-$1")"
if [ -z "$command_path" ]; then if [ -z "$command_path" ]; then

5
libexec/tmuxifier-tmux Executable file
View File

@@ -0,0 +1,5 @@
#! /usr/bin/env bash
set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x
tmux $TMUXIFIER_TMUX_OPTS "$@"

67
libexec/tmuxifier-tmux-version Executable file
View File

@@ -0,0 +1,67 @@
#! /usr/bin/env bash
shopt -s extglob
[ -n "$TMUXIFIER_DEBUG" ] && set -x
# Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier tmux-version [<target-version>]
Outputs current Tmux version. If given optional target-version it outputs one
of three possible characters indicating if the current Tmux version number is
equal to, less than, or greater than the <target-version>.
The three possible outputs are \"=\", \"<\", and \">\"."
exit
fi
# The vercomp() function is shamelessly ripped/borrowed from the following
# StackOverflow answer: http://stackoverflow.com/a/4025065/42146
vercomp () {
if [[ $1 == $2 ]]; then return 0; fi
local IFS=.
local i ver1=($1) ver2=($2)
# fill empty fields in ver1 with zeros
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do ver1[i]=0; done
for ((i=0; i<${#ver1[@]}; i++)); do
# fill empty fields in ver2 with zeros
if [[ -z ${ver2[i]} ]]; then ver2[i]=0; fi
if ((10#${ver1[i]} > 10#${ver2[i]})); then
return 1
elif ((10#${ver1[i]} < 10#${ver2[i]})); then
return 2
fi
done
return 0
}
version=$(tmux -V)
version=${version/tmux /}
if [ -z "$1" ]; then
echo "$version"
exit
fi
if [ "$version" == "master" ]; then
# When version string is "master", tmux was compiled from source, and we
# assume it's later than whatever the <target-version> is.
echo '>'
else
# Fix for "1.9a" version comparison, as vercomp() can only deal with
# purely numeric version numbers.
version=${version//+([a-zA-Z])/}
vercomp "$version" "$1"
case $? in
0) echo '=';;
1) echo '>';;
2) echo '<';;
esac
fi

View File

@@ -2,4 +2,15 @@
set -e set -e
[ -n "$TMUXIFIER_DEBUG" ] && set -x [ -n "$TMUXIFIER_DEBUG" ] && set -x
echo "0.1.3" # Load internal utility functions.
source "$TMUXIFIER/lib/util.sh"
# Provide tmuxifier help
if calling-help "$@"; then
echo "usage: tmuxifier version
Outputs Tmuxifier version."
exit
fi
echo "0.13.0"

View File

@@ -7,7 +7,16 @@
new_window "{{WINDOW_NAME}}" new_window "{{WINDOW_NAME}}"
# Split window into panes. # Split window into panes.
#tmux split-window -t "$session:$window.0" -h -p 20 #split_v 20
#split_h 50
# Run commands.
#run_cmd "top" # runs in active pane
#run_cmd "date" 1 # runs in pane 1
# Paste text
#send_keys "top" # paste into active pane
#send_keys "date" 1 # paste into pane 1
# Set active pane. # Set active pane.
#tmux select-pane -t "$session:$window.0" #select_pane 0

33
test/lib/env.test.sh Executable file
View File

@@ -0,0 +1,33 @@
#! /usr/bin/env bash
source "../test-helper.sh"
#
# env.sh tests.
#
# Setup.
realTMUXIFIER="$TMUXIFIER"
TMUXIFER="/path/to/tmuxifier"
# When TMUXIFIER_LAYOUT_PATH is not set.
source "${root}/lib/env.sh"
assert 'echo $TMUXIFIER_LAYOUT_PATH' "${TMUXIFIER}/layouts"
# When TMUXIFIER_LAYOUT_PATH is set and has a trailing slash.
TMUXIFIER_LAYOUT_PATH="/path/to/layouts/"
source "${root}/lib/env.sh"
assert 'echo $TMUXIFIER_LAYOUT_PATH' "/path/to/layouts"
unset TMUXIFIER_LAYOUT_PATH
# When TMUXIFIER_LAYOUT_PATH is set and does not have a trailing slash.
TMUXIFIER_LAYOUT_PATH="/path/to/layouts"
source "${root}/lib/env.sh"
assert 'echo $TMUXIFIER_LAYOUT_PATH' "/path/to/layouts"
unset TMUXIFIER_LAYOUT_PATH
# Tear down.
TMUXIFER="$realTMUXIFIER"
unset realTMUXIFIER
# End of tests.
assert_end "env.sh"

View File

@@ -0,0 +1,27 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# __expand_path() tests.
#
# Setup.
realHOME="$HOME"
HOME="/home/test-user"
# When given a path containing "~", it expands "~" to "$HOME".
assert '__expand_path "~/Foo/Bar"' "${HOME}/Foo/Bar"
# When given a path without "~", it returns path as is.
assert '__expand_path "/path/to/file"' "/path/to/file"
# When given a path containing spaces, it returns path correctly.
assert '__expand_path "~/Path To/File"' "${HOME}/Path To/File"
# Tear down.
HOME="$realHOME"
unset realHOME
# End of tests.
assert_end "__expand_path()"

View File

@@ -0,0 +1,48 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# __get_current_window_index() tests.
#
# When current window is the first and only window.
create-test-session
assert "__get_current_window_index" "0"
kill-test-session
# When creating a second window.
create-test-session
test-socket-tmux new-window -t "$session:1"
assert "__get_current_window_index" "1"
kill-test-session
# When creating a second window and then switching back to the first window.
create-test-session
test-socket-tmux new-window -t "$session:1"
test-socket-tmux select-window -t "$session:0"
assert "__get_current_window_index" "0"
kill-test-session
# When creating multiples windows and switching between them randomly.
create-test-session
assert "__get_current_window_index" "0"
test-socket-tmux new-window -t "$session:1"
assert "__get_current_window_index" "1"
test-socket-tmux new-window -t "$session:2"
assert "__get_current_window_index" "2"
test-socket-tmux new-window -t "$session:3"
assert "__get_current_window_index" "3"
test-socket-tmux select-window -t "$session:1"
assert "__get_current_window_index" "1"
test-socket-tmux select-window -t "$session:0"
assert "__get_current_window_index" "0"
test-socket-tmux select-window -t "$session:3"
assert "__get_current_window_index" "3"
test-socket-tmux select-window -t "$session:2"
assert "__get_current_window_index" "2"
kill-test-session
# End of tests.
assert_end "__get_current_window_index()"

View File

@@ -0,0 +1,30 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# __get_first_window_index() tests.
#
# When first window has a index of 0.
create-test-session
assert "__get_first_window_index" "0"
kill-test-session
# When first window has a index of 1.
create-test-session
test-socket-tmux new-window -t "$session:1"
test-socket-tmux kill-window -t "$session:0"
assert "__get_first_window_index" "1"
kill-test-session
# When first window has a index of 2.
create-test-session
test-socket-tmux new-window -t "$session:2"
test-socket-tmux kill-window -t "$session:0"
assert "__get_first_window_index" "2"
kill-test-session
# End of tests.
assert_end "__get_first_window_index()"

View File

@@ -0,0 +1,42 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# __go_to_session() tests.
#
# Setup.
session="tmuxifier-test-session"
# When TMUX is not set, attach to $session.
stub tmuxifier-tmux
__go_to_session
assert_raises \
"stub_called_with tmuxifier-tmux -u attach-session -t \"${session}:\"" 0
restore tmuxifier-tmux
# When TMUXIFIER_TMUX_ITERM_ATTACH is set, pass it in as first argument(s) to
# tmuxifier-tmux
TMUXIFIER_TMUX_ITERM_ATTACH="-CC"
stub tmuxifier-tmux
__go_to_session
assert_raises \
"stub_called_with tmuxifier-tmux -CC -u attach-session -t \"${session}:\"" 0
restore tmuxifier-tmux
unset TMUXIFIER_TMUX_ITERM_ATTACH
# When TMUX is set, switch to $session.
TMUX="/tmp/tmux-501/default,1203,0"
stub tmuxifier-tmux
__go_to_session
assert_raises \
"stub_called_with tmuxifier-tmux -u switch-client -t \"${session}:\"" 0
restore tmuxifier-tmux
unset TMUX
# Tear down.
unset session
# End of tests.
assert_end "__go_to_session()"

View File

@@ -0,0 +1,88 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# __go_to_window_or_session_path() tests.
#
# When neither $window_root or $session_root are set, does nothing.
stub run_cmd
__go_to_window_or_session_path
assert "stub_called_times run_cmd" "0"
restore run_cmd
# When only $window_root is set, runs cd to $window_root path.
stub run_cmd
window_root="/tmp"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/tmp\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset window_root
restore run_cmd
# When only $TMUXIFIER_SESSION_ROOT is set, runs cd to $TMUXIFIER_SESSION_ROOT
# path.
stub run_cmd
TMUXIFIER_SESSION_ROOT="/opt"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/opt\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset TMUXIFIER_SESSION_ROOT
restore run_cmd
# When only $session_root is set, runs cd to $session_root path.
stub run_cmd
session_root="/usr"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/usr\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset session_root
restore run_cmd
# When $window_root and $session_root are set, runs cd to $window_root path.
stub run_cmd
window_root="/tmp"
session_root="/usr"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/tmp\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset window_root
unset session_root
restore run_cmd
# When $TMUXIFIER_SESSION_ROOT and $session_root are set, runs cd to
# $TMUXIFIER_SESSION_ROOT path.
stub run_cmd
TMUXIFIER_SESSION_ROOT="/opt"
session_root="/usr"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/opt\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset TMUXIFIER_SESSION_ROOT
unset session_root
restore run_cmd
# When $window_root, $TMUXIFIER_SESSION_ROOT, and $session_root are set, runs
# cd to $window_root path.
stub run_cmd
window_root="/tmp"
TMUXIFIER_SESSION_ROOT="/opt"
session_root="/usr"
__go_to_window_or_session_path
assert 'stub_called_with_times run_cmd cd \"/tmp\"' "1"
assert 'stub_called_with_times run_cmd clear' "1"
unset window_root
unset TMUXIFIER_SESSION_ROOT
unset session_root
restore run_cmd
# End of tests.
assert_end "__go_to_window_or_session_path()"

View File

@@ -0,0 +1,59 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# new_window() tests.
#
# When called without arguments, creates new window.
create-test-session
stub __go_to_window_or_session_path
assert "test-socket-window-count" "1"
new_window
assert "test-socket-window-count" "2"
assert "stub_called_times __go_to_window_or_session_path" "1"
restore __go_to_window_or_session_path
kill-test-session
# When called with name argument, creates new window with specified name.
create-test-session
stub __go_to_window_or_session_path
assert "test-socket-window-count yippieezzz" "0"
new_window "yippieezzz"
assert "test-socket-window-count" "2"
assert "test-socket-window-count yippieezzz" "1"
restore __go_to_window_or_session_path
kill-test-session
# When called with name and command argument, creates new window with
# specified name and executes given command.
rm "/tmp/tmuxifier-new_window-test" &> /dev/null
create-test-session
stub __go_to_window_or_session_path
new_window "foobardoo" "touch /tmp/tmuxifier-new_window-test; bash"
assert "test-socket-window-count" "2"
assert "test-socket-window-count foobardoo" "1"
sleep 0.1 # attempt to avoid timing issue causing flicker
assert_raises 'test -f "/tmp/tmuxifier-new_window-test"' 0
restore __go_to_window_or_session_path
kill-test-session
rm "/tmp/tmuxifier-new_window-test" &> /dev/null
# When called ensure it sets the $window variable to the index of the newly
# created window.
unset window
create-test-session
stub __go_to_window_or_session_path
new_window "foo"
assert "echo $window" "1"
new_window
assert "echo $window" "2"
new_window "bar"
assert "echo $window" "3"
restore __go_to_window_or_session_path
kill-test-session
unset window
# End of tests.
assert_end "new_window()"

View File

@@ -0,0 +1,55 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# select_window() tests.
#
window_list() {
test-socket-tmux list-windows -t "$session:" \
-F "#{window_active}:#{window_index}" 2>/dev/null
}
# Selects given window when passed a window index
create-test-session
test-socket-tmux new-window -t "$session:1"
test-socket-tmux new-window -t "$session:2"
select_window 0
assert "window_list | grep '^1:'" "1:0"
select_window 1
assert "window_list | grep '^1:'" "1:1"
select_window 2
assert "window_list | grep '^1:'" "1:2"
kill-test-session
# Selects given window when passed a window name
create-test-session
test-socket-tmux new-window -t "$session:1" -n "foo"
test-socket-tmux new-window -t "$session:2" -n "bar"
select_window foo
assert "window_list | grep '^1:'" "1:1"
select_window bar
assert "window_list | grep '^1:'" "1:2"
kill-test-session
# When called ensure it sets the $window variable to the index of the newly
# created window.
unset window
create-test-session
test-socket-tmux new-window -t "$session:1" -n "foo"
test-socket-tmux new-window -t "$session:2" -n "bar"
select_window "foo"
assert "echo $window" "1"
select_window "bar"
assert "echo $window" "2"
select_window 1
assert "echo $window" "1"
select_window 2
assert "echo $window" "2"
kill-test-session
unset window
# End of tests.
assert_end "select_window()"

View File

@@ -0,0 +1,20 @@
#! /usr/bin/env bash
source "../../test-helper.sh"
source "${root}/lib/layout-helpers.sh"
#
# tmux() tests.
#
# Passes all arguments to tmuxifier-tmux.
stub tmuxifier-tmux
tmux -V
tmux --help
tmux new -s dude
assert_raises "stub_called_with tmuxifier-tmux -V" 0
assert_raises "stub_called_with tmuxifier-tmux --help" 0
assert_raises "stub_called_with tmuxifier-tmux new -s dude" 0
restore tmuxifier-tmux
# End of tests.
assert_end "tmux()"

23
test/lib/runtime.test.sh Executable file
View File

@@ -0,0 +1,23 @@
#! /usr/bin/env bash
source "../test-helper.sh"
#
# runtime.sh tests.
#
source "${root}/lib/runtime.sh"
# We assume env.sh has been sourced if $TMUXIFIER_LAYOUT_PATH has been set.
assert 'echo $TMUXIFIER_LAYOUT_PATH' "${TMUXIFIER}/layouts"
# We ensure $session_root is set to $HOME by default.
assert 'echo $session_root' "$HOME"
# We assume layout-helpers.sh has been sourced if a few of them are available.
for helper in new_window split_v split_h select_window select_pane; do
assert "type $helper | head -1" "$helper is a function"
done
# End of tests.
assert_end "runtime.sh"

58
test/lib/util.test.sh Executable file
View File

@@ -0,0 +1,58 @@
#! /usr/bin/env bash
source "../test-helper.sh"
source "${root}/lib/util.sh"
#
# calling-help() tests.
#
# Returns 0 when "--help" is part of passed arguments.
assert_raises 'calling-help --help' 0
assert_raises 'calling-help foo --help' 0
assert_raises 'calling-help --help bar' 0
assert_raises 'calling-help foo --help bar' 0
# Returns 0 when "-h" is part of passed arguments.
assert_raises 'calling-help -h' 0
assert_raises 'calling-help foo -h' 0
assert_raises 'calling-help -h bar' 0
assert_raises 'calling-help foo -h bar' 0
# Returns 1 when neither "--help" or "-h" is not part of passed arguments.
assert_raises 'calling-help' 1
assert_raises 'calling-help foo' 1
assert_raises 'calling-help foo bar' 1
# Returns 1 when "--help" is part of passed arguments, but not free-standing.
assert_raises 'calling-help --help-me' 1
assert_raises 'calling-help foo--help' 1
# Returns 1 when "-h" is part of passed arguments, but not free-standing.
assert_raises 'calling-help -hj' 1
assert_raises 'calling-help welcome-home' 1
# End of tests.
assert_end "calling-help()"
#
# calling-complete() tests.
#
# Returns 0 when "--complete" is part of passed arguments.
assert_raises 'calling-complete --complete' 0
assert_raises 'calling-complete foo --complete' 0
assert_raises 'calling-complete --complete bar' 0
assert_raises 'calling-complete foo --complete bar' 0
# Returns 1 when "--complete" is not part of passed arguments.
assert_raises 'calling-complete' 1
assert_raises 'calling-complete foo' 1
assert_raises 'calling-complete foo bar' 1
# Returns 1 when "--complete" is part of passed arguments, but not free-standing.
assert_raises 'calling-complete --complete-me' 1
assert_raises 'calling-complete foo--complete' 1
# End of tests.
assert_end "calling-complete()"

View File

@@ -0,0 +1,22 @@
#! /usr/bin/env bash
source "../test-helper.sh"
source "${root}/lib/util.sh"
#
# tmuxifier-tmux tests.
#
# Setup.
libexec="${root}/libexec"
test-socket-tmux new-session -d -s foobar
test-socket-tmux new-session -d -s dude
# Passes all arguments to Tmux.
assert "${libexec}/tmuxifier-tmux list-sessions -F \"- #{session_name}\"" \
"- dude\n- foobar"
# Tear down.
kill-test-server
# End of tests.
assert_end "tmuxifier-tmux"

87
test/test-helper.sh Normal file
View File

@@ -0,0 +1,87 @@
[ -n "$TEST_DEBUG" ] && set -x
resolve_link() {
$(type -p greadlink readlink | head -1) $1
}
abs_dirname() {
local cwd="$(pwd)"
local path="$1"
while [ -n "$path" ]; do
cd "${path%/*}"
local name="${path##*/}"
path="$(resolve_link "$name" || true)"
done
pwd
cd "$cwd"
}
# Find and store path to Tmux binary.
TMUX_BIN="$(command -v tmux)"
# Set testroot variable.
testroot="$(abs_dirname "$BASH_SOURCE")"
# Set root variable.
root="$(abs_dirname "$testroot/../..")"
# Set TMUXIFIER environment variable.
TMUXIFIER="$root"
# Setup PATH environment variable.
PATH="$root/bin:$root/libexec:$PATH"
# Unset TMUX environment variable, tests assume they're not running within
# Tmux.
unset TMUX
# Unset various Tmuxifier environment variables to prevent a local install of
# Tmuxifier interfering with tests.
unset TMUXIFIER_LAYOUT_PATH
unset TMUXIFIER_TMUX_OPTS
unset TMUXIFIER_NO_COMPLETE
# Include assert.sh and stub.sh libraries.
source "${testroot}/assert.sh"
source "${testroot}/stub.sh"
#
# Test Helpers
#
test-socket-tmux() {
export TMUXIFIER_TMUX_OPTS="-L tmuxifier-tests"
"$TMUX_BIN" $TMUXIFIER_TMUX_OPTS $@
}
create-test-session() {
session="$1"
if [ -z "$session" ]; then session="test"; fi
test-socket-tmux new-session -d -s "$session"
}
kill-test-session() {
local target="$1"
if [ -z "$target" ]; then target="$session"; fi
test-socket-tmux kill-session -t "$target"
}
kill-test-server() {
test-socket-tmux kill-server
unset TMUXIFIER_TMUX_OPTS
unset session
}
test-socket-window-count() {
local list="$(test-socket-tmux list-windows)"
if [ -n "$1" ]; then
echo "$list" | grep $1 | wc -l | awk '{print $1}'
else
echo "$list" | wc -l | awk '{print $1}'
fi
}