Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Christian Salzmann-Jaeckel
tmux-resurrect
Commits
4234ba99
Unverified
Commit
4234ba99
authored
Aug 30, 2021
by
Bruno Sutic
Committed by
GitHub
Aug 30, 2021
Browse files
Merge pull request #401 from Farzat07/automatic-rename2
Maintain the value of automatic-rename
parents
003a7cdd
3e8fbdf7
Changes
2
Show whitespace changes
Inline
Side-by-side
scripts/restore.sh
View file @
4234ba99
...
...
@@ -126,31 +126,29 @@ pane_creation_command() {
new_window
()
{
local
session_name
=
"
$1
"
local
window_number
=
"
$2
"
local
window_name
=
"
$3
"
local dir
=
"
$4
"
local
pane_index
=
"
$5
"
local dir
=
"
$3
"
local
pane_index
=
"
$4
"
local
pane_id
=
"
${
session_name
}
:
${
window_number
}
.
${
pane_index
}
"
dir
=
"
${
dir
/#\~/
$HOME
}
"
if
is_restoring_pane_contents
&&
pane_contents_file_exists
"
$pane_id
"
;
then
local
pane_creation_command
=
"
$(
pane_creation_command
"
$session_name
"
"
$window_number
"
"
$pane_index
"
)
"
tmux new-window
-d
-t
"
${
session_name
}
:
${
window_number
}
"
-n
"
$window_name
"
-c
"
$dir
"
"
$pane_creation_command
"
tmux new-window
-d
-t
"
${
session_name
}
:
${
window_number
}
"
-c
"
$dir
"
"
$pane_creation_command
"
else
tmux new-window
-d
-t
"
${
session_name
}
:
${
window_number
}
"
-n
"
$window_name
"
-c
"
$dir
"
tmux new-window
-d
-t
"
${
session_name
}
:
${
window_number
}
"
-c
"
$dir
"
fi
}
new_session
()
{
local
session_name
=
"
$1
"
local
window_number
=
"
$2
"
local
window_name
=
"
$3
"
local dir
=
"
$4
"
local
pane_index
=
"
$5
"
local dir
=
"
$3
"
local
pane_index
=
"
$4
"
local
pane_id
=
"
${
session_name
}
:
${
window_number
}
.
${
pane_index
}
"
if
is_restoring_pane_contents
&&
pane_contents_file_exists
"
$pane_id
"
;
then
local
pane_creation_command
=
"
$(
pane_creation_command
"
$session_name
"
"
$window_number
"
"
$pane_index
"
)
"
TMUX
=
""
tmux
-S
"
$(
tmux_socket
)
"
new-session
-d
-s
"
$session_name
"
-n
"
$window_name
"
-c
"
$dir
"
"
$pane_creation_command
"
TMUX
=
""
tmux
-S
"
$(
tmux_socket
)
"
new-session
-d
-s
"
$session_name
"
-c
"
$dir
"
"
$pane_creation_command
"
else
TMUX
=
""
tmux
-S
"
$(
tmux_socket
)
"
new-session
-d
-s
"
$session_name
"
-n
"
$window_name
"
-c
"
$dir
"
TMUX
=
""
tmux
-S
"
$(
tmux_socket
)
"
new-session
-d
-s
"
$session_name
"
-c
"
$dir
"
fi
# change first window number if necessary
local
created_window_num
=
"
$(
first_window_num
)
"
...
...
@@ -162,9 +160,8 @@ new_session() {
new_pane
()
{
local
session_name
=
"
$1
"
local
window_number
=
"
$2
"
local
window_name
=
"
$3
"
local dir
=
"
$4
"
local
pane_index
=
"
$5
"
local dir
=
"
$3
"
local
pane_index
=
"
$4
"
local
pane_id
=
"
${
session_name
}
:
${
window_number
}
.
${
pane_index
}
"
if
is_restoring_pane_contents
&&
pane_contents_file_exists
"
$pane_id
"
;
then
local
pane_creation_command
=
"
$(
pane_creation_command
"
$session_name
"
"
$window_number
"
"
$pane_index
"
)
"
...
...
@@ -172,27 +169,24 @@ new_pane() {
else
tmux split-window
-t
"
${
session_name
}
:
${
window_number
}
"
-c
"
$dir
"
fi
tmux rename-window
-t
"
${
session_name
}
:
${
window_number
}
"
"
$window_name
"
# minimize window so more panes can fit
tmux resize-pane
-t
"
${
session_name
}
:
${
window_number
}
"
-U
"999"
}
restore_pane
()
{
local
pane
=
"
$1
"
while
IFS
=
$d
read
line_type session_name window_number
window_name
window_active window_flags pane_index
dir
pane_active pane_command pane_full_command
;
do
while
IFS
=
$d
read
line_type session_name window_number window_active window_flags pane_index
dir
pane_active pane_command pane_full_command
;
do
dir
=
"
$(
remove_first_char
"
$dir
"
)
"
window_name
=
"
$(
remove_first_char
"
$window_name
"
)
"
pane_full_command
=
"
$(
remove_first_char
"
$pane_full_command
"
)
"
if
[
"
$session_name
"
==
"0"
]
;
then
restored_session_0_true
fi
if
pane_exists
"
$session_name
"
"
$window_number
"
"
$pane_index
"
;
then
tmux rename-window
-t
"
${
session_name
}
:
${
window_number
}
"
"
$window_name
"
if
is_restoring_from_scratch
;
then
# overwrite the pane
# happens only for the first pane if it's the only registered pane for the whole tmux server
local
pane_id
=
"
$(
tmux display-message
-p
-F
"#{pane_id}"
-t
"
$session_name
:
$window_number
"
)
"
new_pane
"
$session_name
"
"
$window_number
"
"
$window_name
"
"
$dir
"
"
$pane_index
"
new_pane
"
$session_name
"
"
$window_number
"
"
$dir
"
"
$pane_index
"
tmux kill-pane
-t
"
$pane_id
"
else
# Pane exists, no need to create it!
...
...
@@ -200,12 +194,11 @@ restore_pane() {
register_existing_pane
"
$session_name
"
"
$window_number
"
"
$pane_index
"
fi
elif
window_exists
"
$session_name
"
"
$window_number
"
;
then
tmux rename-window
-t
"
${
session_name
}
:
${
window_number
}
"
"
$window_name
"
new_pane
"
$session_name
"
"
$window_number
"
"
$window_name
"
"
$dir
"
"
$pane_index
"
new_pane
"
$session_name
"
"
$window_number
"
"
$dir
"
"
$pane_index
"
elif
session_exists
"
$session_name
"
;
then
new_window
"
$session_name
"
"
$window_number
"
"
$window_name
"
"
$dir
"
"
$pane_index
"
new_window
"
$session_name
"
"
$window_number
"
"
$dir
"
"
$pane_index
"
else
new_session
"
$session_name
"
"
$window_number
"
"
$window_name
"
"
$dir
"
"
$pane_index
"
new_session
"
$session_name
"
"
$window_number
"
"
$dir
"
"
$pane_index
"
fi
done
< <
(
echo
"
$pane
"
)
}
...
...
@@ -292,15 +285,23 @@ handle_session_0() {
fi
}
restore_pane_layout_for_each_window
()
{
restore_window_properties
()
{
local
window_name
\g
rep
'^window'
$(
last_resurrect_file
)
|
while
IFS
=
$d
read
line_type session_name window_number window_active window_flags window_layout
;
do
while
IFS
=
$d
read
line_type session_name window_number window_name window_active window_flags window_layout automatic_rename
;
do
window_name
=
"
$(
remove_first_char
"
$window_name
"
)
"
tmux rename-window
-t
"
${
session_name
}
:
${
window_number
}
"
"
$window_name
"
tmux
select
-layout
-t
"
${
session_name
}
:
${
window_number
}
"
"
$window_layout
"
if
[
"
${
automatic_rename
}
"
=
":"
]
;
then
tmux set-option
-u
-t
"
${
session_name
}
:
${
window_number
}
"
automatic-rename
else
tmux set-option
-t
"
${
session_name
}
:
${
window_number
}
"
automatic-rename
"
$automatic_rename
"
fi
done
}
restore_shell_history
()
{
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ { print $2, $3, $
7
, $
10
; }'
$(
last_resurrect_file
)
|
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ { print $2, $3, $
6
, $
9
; }'
$(
last_resurrect_file
)
|
while
IFS
=
$d
read
session_name window_number pane_index pane_command
;
do
if
!
is_pane_registered_as_existing
"
$session_name
"
"
$window_number
"
"
$pane_index
"
;
then
local
pane_id
=
"
$session_name
:
$window_number
.
$pane_index
"
...
...
@@ -321,7 +322,7 @@ restore_shell_history() {
restore_all_pane_processes
()
{
if
restore_pane_processes_enabled
;
then
local
pane_full_command
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $1
1
!~ "^:$" { print $2, $3, $
7
, $
8
, $1
1
; }'
$(
last_resurrect_file
)
|
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $1
0
!~ "^:$" { print $2, $3, $
6
, $
7
, $1
0
; }'
$(
last_resurrect_file
)
|
while
IFS
=
$d
read
-r
session_name window_number pane_index
dir
pane_full_command
;
do
dir
=
"
$(
remove_first_char
"
$dir
"
)
"
pane_full_command
=
"
$(
remove_first_char
"
$pane_full_command
"
)
"
...
...
@@ -331,7 +332,7 @@ restore_all_pane_processes() {
}
restore_active_pane_for_each_window
()
{
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $
9
== 1 { print $2, $3, $
7
; }'
$(
last_resurrect_file
)
|
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $
8
== 1 { print $2, $3, $
6
; }'
$(
last_resurrect_file
)
|
while
IFS
=
$d
read
session_name window_number active_pane
;
do
tmux switch-client
-t
"
${
session_name
}
:
${
window_number
}
"
tmux
select
-pane
-t
"
$active_pane
"
...
...
@@ -339,7 +340,7 @@ restore_active_pane_for_each_window() {
}
restore_zoomed_windows
()
{
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $
6
~ /Z/ && $
9
== 1 { print $2, $3; }'
$(
last_resurrect_file
)
|
awk
'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $
5
~ /Z/ && $
8
== 1 { print $2, $3; }'
$(
last_resurrect_file
)
|
while
IFS
=
$d
read
session_name window_number
;
do
tmux resize-pane
-t
"
${
session_name
}
:
${
window_number
}
"
-Z
done
...
...
@@ -355,7 +356,7 @@ restore_grouped_sessions() {
}
restore_active_and_alternate_windows
()
{
awk
'BEGIN { FS="\t"; OFS="\t" } /^window/ && $
5
~ /[*-]/ { print $2, $4, $3; }'
$(
last_resurrect_file
)
|
awk
'BEGIN { FS="\t"; OFS="\t" } /^window/ && $
6
~ /[*-]/ { print $2, $4, $3; }'
$(
last_resurrect_file
)
|
sort
-u
|
while
IFS
=
$d
read
session_name active_window window_number
;
do
tmux switch-client
-t
"
${
session_name
}
:
${
window_number
}
"
...
...
@@ -376,7 +377,7 @@ main() {
execute_hook
"pre-restore-all"
restore_all_panes
handle_session_0
restore_
pane_layout_for_each_window
>
/dev/null 2>&1
restore_
window_properties
>
/dev/null 2>&1
execute_hook
"pre-restore-history"
if
save_shell_history_option_on
;
then
restore_shell_history
...
...
scripts/save.sh
View file @
4234ba99
...
...
@@ -33,8 +33,6 @@ pane_format() {
format+
=
"
${
delimiter
}
"
format+
=
"#{window_index}"
format+
=
"
${
delimiter
}
"
format+
=
":#{window_name}"
format+
=
"
${
delimiter
}
"
format+
=
"#{window_active}"
format+
=
"
${
delimiter
}
"
format+
=
":#{window_flags}"
...
...
@@ -61,6 +59,8 @@ window_format() {
format+
=
"
${
delimiter
}
"
format+
=
"#{window_index}"
format+
=
"
${
delimiter
}
"
format+
=
":#{window_name}"
format+
=
"
${
delimiter
}
"
format+
=
"#{window_active}"
format+
=
"
${
delimiter
}
"
format+
=
":#{window_flags}"
...
...
@@ -227,25 +227,28 @@ fetch_and_dump_grouped_sessions(){
dump_panes
()
{
local
full_command
dump_panes_raw |
while
IFS
=
$d
read
line_type session_name window_number
window_name
window_active window_flags pane_index
dir
pane_active pane_command pane_pid history_size
;
do
while
IFS
=
$d
read
line_type session_name window_number window_active window_flags pane_index
dir
pane_active pane_command pane_pid history_size
;
do
# not saving panes from grouped sessions
if
is_session_grouped
"
$session_name
"
;
then
continue
fi
full_command
=
"
$(
pane_full_command
$pane_pid
)
"
dir
=
$(
echo
$dir
|
sed
's/ /\\ /'
)
# escape all spaces in directory path
echo
"
${
line_type
}${
d
}${
session_name
}${
d
}${
window_number
}${
d
}${
window_
name
}${
d
}${
window_
active
}${
d
}${
window_flags
}${
d
}${
pane_index
}${
d
}${
dir
}${
d
}${
pane_active
}${
d
}${
pane_command
}${
d
}
:
${
full_command
}
"
echo
"
${
line_type
}${
d
}${
session_name
}${
d
}${
window_number
}${
d
}${
window_active
}${
d
}${
window_flags
}${
d
}${
pane_index
}${
d
}${
dir
}${
d
}${
pane_active
}${
d
}${
pane_command
}${
d
}
:
${
full_command
}
"
done
}
dump_windows
()
{
dump_windows_raw |
while
IFS
=
$d
read
line_type session_name window_index window_active window_flags window_layout
;
do
while
IFS
=
$d
read
line_type session_name window_index
window_name
window_active window_flags window_layout
;
do
# not saving windows from grouped sessions
if
is_session_grouped
"
$session_name
"
;
then
continue
fi
echo
"
${
line_type
}${
d
}${
session_name
}${
d
}${
window_index
}${
d
}${
window_active
}${
d
}${
window_flags
}${
d
}${
window_layout
}
"
automatic_rename
=
"
$(
tmux show-window-options
-vt
"
${
session_name
}
:
${
window_index
}
"
automatic-rename
)
"
# If the option was unset, place the ":" placeholder instead.
[
-z
"
${
automatic_rename
}
"
]
&&
automatic_rename
=
":"
echo
"
${
line_type
}${
d
}${
session_name
}${
d
}${
window_index
}${
d
}${
window_name
}${
d
}${
window_active
}${
d
}${
window_flags
}${
d
}${
window_layout
}${
d
}${
automatic_rename
}
"
done
}
...
...
@@ -256,14 +259,14 @@ dump_state() {
dump_pane_contents
()
{
local
pane_contents_area
=
"
$(
get_tmux_option
"
$pane_contents_area_option
"
"
$default_pane_contents_area
"
)
"
dump_panes_raw |
while
IFS
=
$d
read
line_type session_name window_number
window_name
window_active window_flags pane_index
dir
pane_active pane_command pane_pid history_size
;
do
while
IFS
=
$d
read
line_type session_name window_number window_active window_flags pane_index
dir
pane_active pane_command pane_pid history_size
;
do
capture_pane_contents
"
${
session_name
}
:
${
window_number
}
.
${
pane_index
}
"
"
$history_size
"
"
$pane_contents_area
"
done
}
dump_shell_history
()
{
dump_panes |
while
IFS
=
$d
read
line_type session_name window_number
window_name
window_active window_flags pane_index
dir
pane_active pane_command full_command
;
do
while
IFS
=
$d
read
line_type session_name window_number window_active window_flags pane_index
dir
pane_active pane_command full_command
;
do
save_shell_history
"
$session_name
:
$window_number
.
$pane_index
"
"
$pane_command
"
"
$full_command
"
done
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment