summaryrefslogtreecommitdiffstats
path: root/TODO
blob: a0a7570a9a6cafc2bca94bb0d451c9a19aa5963f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
- command bits and pieces:
	* why doesn't command-prompt work if made read-only?
	* allow multiple targets: fnmatch for -t/-c, for example detach all
	  clients with -t*
	* add -c for new-session like new-window
	* attach should take a pane and select it as well as attaching
	* ' and " should be parsed the same (eg "\e" vs '\e') in config
	  and command prompt
	* last-pane across sessions
	* exact match operator for targets (or break the substring match
	  and require eg x* instead of just x)

- make command sequences more usable
	* don't require space after ;
	* options for error handling: && and ||?

- options bits and pieces:
	* set-remain-on-exit is a complete hack
	* way to set socket path from config file

- format improvements:
	* last bits of status_replace into formats?
	* option to quote format (#{session_name:quoted})
	* formats need conditions for >0 (for #P)
	* some way to pad # stuff with spaces, #!2T maybe
	* last window update time and format for it
	* formats to show if a window is linked into multiple sessions, into
	  multiple attached sessions, and is the active window in multiple
	  attached sessions?

- choose mode improvements:
	* choose-pane command (augment choose-tree to do this?)
	* choose-mode and copy-mode are very similar, make choose-mode a subset?
	* flag to choose-* for sort order
	* choose mode would be better per client than per window?
	* two choices (first one then second, for swap-pane and join-pane)

- improve monitor-*:
	* straighten out rules for multiple clients
	* think about what happens across sessions
	* monitor changes within a region
	* perhaps monitor /all/ panes in the window not just one

- improve mouse support:
	* bind commands to mouse in different areas? 
	* more fine-grained options?
	* commands executed when clicking on a pattern (URL)
	* mouse-select-pane will screw up with !MODE_MOUSE_STANDARD (it sets
	  the flag on w/o checking the others before calling tty_update_mode)
	* mouse can be like normal key bindings?
	      - {button-{1,2,3},wheel-{up,down}}-{status,pane,border} and
	        drag-{start,end}-{status,pane,border} plus the modifiers
	      - resize and copy can be special cases - once you call something
	        like copy-mode -M or resize-pane -M to start the drag, it tracks
	        mouse until you call -m to stop the drag. or just keep drags
	        entirely special?
	      - what happens with stuff that wants mouse inside? especially for
	        pane clicks which need to run command AND pass event through
	        (like mouse-select-pane). maybe just a flag to say whether it
		always runs or only if pane hasn't taken mouse? or it could be
		eg bind Button1Pane "select-pane -t=; send-keys -Mt='
	      - also need a) some way to tell commands bound to key which
	        window or pane the mouse key binding applies to (maybe a new
	        special char in target, or pass targets through formats?) b) a
	        way to bind repeat count to mode keys so that wheel up/down can
	        do multiple lines c) send-keys -M to pass a mouse event through?
	      - what does the mouse->KEYC_* conversion and find-the-pane bit?
                server_client_handle_key?

- hooks!

- warts on current naming:
	* display-time but message-fg/bg/attr
	* list-* vs show-*
	* split-window -> split-pane??

- better UTF-8 support:
	* window names and titles
	* message display
	* prompt input
	* multibyte key input

- copy/paste improvements:
	* incremental searching
	* append to buffer
	* paste w/o trailing whitespace
	* command to toggle selection not to move it in copy-mode

- layout stuff
	* way to tag a layout as a number/name
	* maybe keep last layout + size around and if size reverts just put it
          back
	* revamp layouts: they are too complicated, should be more closely
	  integrated, should support hints, layout sets should just be a
	  special case of custom layouts, and we should support panes that are
	  not attached to a cell at all. this could be the time to introduce
	  panelink to replace layout_cell
	* way to set hints/limits about pane size for resizing
	* panning over window (window larger than visible)
	* a mode where one application can cross two panes (ie x|y, width =
          COLUMNS/2 but height = ROWS * 2)
        * general key to space cells out evenly (horiz or vert) within their
          parent cell (could replace even-vert/even-horiz layouts)

- terminfo bits
	* use a better termcap internally instead of screen, perhaps xterm
	* use screen-256color when started on 256 colour terminal?
	* need a tmux terminfo entry to document the extensions we are using in
	  upstream terminfo

- code cleanup
	* instead of separate window and session options, just one master
	  options list with each option having a type (window or session), then
	  options on window, on session, and global. for window options we look
	  window->session->global, and for session we look session->global
	* the way pane, window, session destroy is handled is too complicated
	  and the distinction between session.c, window.c and server-fn.c
	  functions is not clear. could we just have kill_pane(),
	  kill_window(), unlink_window(), kill_session() that fix up all data
	  structures (flagging sessions as dead) and return a value to say
	  whether clients need to be checked for dead sessions? sort of like
	  session_detach now but more so. or some other scheme to make it
	  simpler and clearer? also would be nice to remove/rename server-fn.c
	* more readable way to work out the various things commands need to
	  know about the client, notably:
		- is this the config file? (cmdq->c == NULL)
		- is this a command client? (cmdq->c != NULL &&
                  cmdq->c->session == NULL)
		- is this a control client?
		- can i do stdin or stdout to this client?
	  or even guarantee that cmdq->c != NULL and provide a better way to
	  tell when in the config file - then we use cmdq->c if we need a
	  client w/o a session else cmd_current_client
	* optimize pane redraws, 20120318184853.GK10965@yelena.nicm.ath.cx
	* cmd_find_* could be much simpler - parse everything the same, only
          difference is what to choose when not given a ":" or "." (such as a
          plain "0" could be session, window or pane). So just cmd_find_target
          with a type (session, window, or pane)..

- miscellaneous
	* way to keep a job running just read its last line of output for #()
	* link panes into multiple windows
	* live update: server started with -U connects to server, requests
	  sessions and windows, receives file descriptors
	* there are inconsistencies in what we get from old shell and what
	  comes from config for new sessions and windows. likewise, panes and
	  jobs and run-shell and lock command all start with slightly different
	  environments
	* multiline status line?
	* bind commands to key sequences -- make it so ALL keys go through a
	  table, first an implicit table in which C-b is the only default
	  binding to a command that says "next key from $othertable" and so
	  on. means -n can go away as well
	* customizable command aliases
	* any remaining clients in wait-for should be woken when server exits