aboutsummaryrefslogtreecommitdiff
path: root/TODO
blob: dad421daccd8a5b37beefe382145103c4a77eff0 (plain) (blame)
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
- command bits and pieces:
	* allow multiple targets: fnmatch for -t/-c, for example detach all
	  clients with -t*
	* ' and " should be parsed the same (eg "\e" vs '\e') in config
	  and command prompt
	* last-pane across sessions
	* resize-pane -p to match split-window -p
	* flag to wait-for to have a timeout and/or to stop waiting when the
	  client gets a signal

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

- options bits and pieces:
	* way to set socket path from config file

- format improvements:
	* some way to pad # stuff with spaces
	* formats to show if a window is linked into multiple sessions, into
	  multiple attached sessions, and is the active window in multiple
	  attached sessions?
	* comparison operators like < and > (for #{version}?)

- 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?
	* commands executed when clicking on a pattern (URL)

- warts on current naming:
	* display-time but message-fg/bg/attr
	* list-* vs show-*

- copy/paste improvements:
	* paste w/o trailing whitespace
	* command to toggle selection not to move it in copy-mode
	* regex searching
	* searching in copy mode should unwrap lines, so if you search for "foobar"
	  then it should be found even if it is now "foo\nbar" (if the WRAP flag
	  is set on the line)
	* capture-pane option to preserve spaces but not join lines
	* improve word and line selection in copy mode (for example when
	  dragging it should select by word. compare how xterm works. GitHub
	  issue 682)
	* key to search for word under cursor (GitHub issue 1240)
	* when entering copy mode, should copy grid so that input does not
	  need to be suspended
	* allow the prefix for automatic buffers to be specified as part of the
	  key binding to allow session buffers or similar (GitHub issue 1501)
	* copy-pipe should be synchronous (GitHub issue 1517)

- 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
	* a mode where one application can cross two panes (ie x|y, width =
	  COLUMNS/2 but height = ROWS * 2)
	* separate active panes for different clients
	* way to choose where the freed space goes when a pane is killed:
	  option to kill-pane? GitHub issue 918

- 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.
	  problem: what about windows in multiple sessions? there are contexts
	  where we do not know which session, or where multiple choices makes
	  no sense... could at least have one global list for all types of
	  global options and keep separate window,session lists
	* 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

- miscellaneous
	* 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? separate command prompt and status line?
	* automatic pane logging
	* marks in history, automatically add (move?) one when pane is changed
	* this doesn't work, need pane reference count probably:
	  bind -n DoubleClick3Status confirm-before -p "kill-window #I? (y/n)" kill-window
	* marker lines in history (GitHub issue 1042)
	* tree mode stuff: make command prompt (:) common code so all modes get it,
	  predefined filters, tag-all key, ...
	* drag panes and windows around to move/swap them in choose mode
	* flag to specify environment to new-window, split-window,
          new-session (issue 1498)
	* multiple column panes (issue 1503)
	* support for ZERO WIDTH JOINER U+200D

- hooks
	* more hooks for various things
	* finish after hooks for special commands. these do not have a hook at
	  the moment:
		 attach-session detach-client kill-server respawn-window
		 swap-window break-pane find-window kill-session rotate-window
		 switch-client choose-tree if-shell kill-window run-shell
		 wait-for command-prompt join-pane move-window source-file
		 confirm-before kill-pane respawn-pane swap-pane
	  at the moment AFTERHOOK uses current only if target is not valid,
	  but target is ALWAYS valid - it should use current if no -t flag?
	  then select-* could use AFTERHOOK
	* multiple hooks with the same name?
	* finish hooks for notifys
	* for session_closed, if no sessions at all, perhaps fake up a
	  temporary one

- pan
	* tty_window_offset should try to keep as much off active pane
	  visible as possible
	* rather than centering cursor it might be better if only
	  moved offset when it gets close to an edge?

----

TODO soonish maybe:

- Horizontal cursor position is incorrect after resize (bug), issue 1323.
- Multiple status lines:

       1) Extend formats to include some way to loop over every window
          (or pane or session), perhaps something like
          #{W:#{window_name} }.  It would need to be able to reach
          into a window's options in order to allow different windows
          to have different format. (DONE) An operator to evaluate an
          option value as a format, maybe make it so E: on evaluates
          the result as a format again something like, so end up with
          something like #{W:#{E:window-status-format} }

       2) Some way to include alignment information for part of a format.

       3) Then the entire status line can be drawn with one option,
          instead of status-left/status-right. But how to stay
          backwards compatible, even slightly? Can probably keep
          status-left and right and the default status-format becomes
          something like (plus some bits for current window):

	  #{L:#{E:status-left} #{M:#{W:{E:window-status-format}}} #{R:#{E:status-right}}

	  Where L = left, M = middle, R = right; W = for each window;
	  E = get option value and evaluate as format.

       4) Also need a way to return mouse positioning, so a format
          like the alignment that stores the offset/size for
          Mouse*Status{Left,Right}.

       5) Likewise, styles. Alignment, mouse, styles can all be done
          similarly - format_expand can be given the available width
          and then build a list of format_range with type (ALIGN_LEFT,
          STYLE, MOUSE_LEFT and so on) which a format_draw function
          can use to draw the format, and can be stored to be used by
          the mouse positioning check code.

(DONE) 6) status-left-length and similar will need to be taken into
          account.

       7) Supporting trimming the window list and adding <> might be
          tricky, probably a second pass over the format_range list to
          trim as appropriate. But it will need to know which element
          to trim first, so some way to mark that is needed (maybe a
          priority or something in the alignment/length limit).

(DONE) 8) Formats are going to get very long so perhaps standardize
          them a bit so they are all something like #{F/argument:text}
          then then could be #{A/foo;B/bar:text} rather than
          #{A:foo,#{B:bar,text}} and so on. Need to keep the old style
          for compatibility, at least for the most popular formats. So
          the status-left part would be something like:

	  	    #{A/left;S/#{status-left-style};M/left;=/#{status-left-length};E:status-left}

          Where A = alignment, S = style, M = mouse, = = length limit,
          E = expand again.

	  Existing formats are:

	  	   #{l:foo} <-- literal
		   #{m:foo} <-- match
		   #{C:foo} <-- search
		   #{b:foo} <-- basename
		   #{d:foo} <-- dirname
		   #{t:foo} <-- time
		   #{q:foo} <-- quote
		   #{s/a/b/:foo} <-- sub
	           #{=123:foo} <-- length

		   #{||:foo,bar} <-- or
		   #{&&:foo,bar} <-- and
		   #{!=:foo,bar} <-- neq
		   #{==:foo,bar} <-- eq
		   #{?foo,bar,baz} <-- if

           So comparisons and ? can stay as they are.

           All other formats can be parsed as #{X/arg1/arg2/arg3:...}
           with an optional leading and trailing /. Each argument can
           be expanded.

       9) Then status-format can be an array option specifying
          multiple status lines. Perhaps one option for top and one
          for bottom.

- Store hooks as options, issue 1619.
- Support buffer prefixes, issue 1501.
- copy-pipe should be synchronous, issue 1517.
- -E flag to pass environment to new-*, issue 1498.
- Copy mode searching is slow when there is a big history, issue 1545.
- Grid "block" stuff - some work done, there is an issue
  somewhere. Can be used potentially for compression of history (bit
  silly really though), reflow performance (can reflow blocks on
  demand). It would possibly be good if history-limit could be global
  and collected LRU.