home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume29 / zsh2.2 / part13 < prev    next >
Text File  |  1992-05-13  |  50KB  |  2,104 lines

  1. Newsgroups: comp.sources.misc
  2. From: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  3. Subject:  v29i109:  zsh2.2 - The Z shell, Part13/17
  4. Message-ID: <1992May13.160654.10358@sparky.imd.sterling.com>
  5. X-Md4-Signature: 2c035840861e8b42f58582935f9913e1
  6. Date: Wed, 13 May 1992 16:06:54 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  10. Posting-number: Volume 29, Issue 109
  11. Archive-name: zsh2.2/part13
  12. Environment: BSD
  13. Supersedes: zsh2.1: Volume 24, Issue 1-19
  14.  
  15. #!/bin/sh
  16. # this is aa.13 (part 13 of zsh2.2)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file zsh2.2/src/zle.h continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 13; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping zsh2.2/src/zle.h'
  34. else
  35. echo 'x - continuing file zsh2.2/src/zle.h'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'zsh2.2/src/zle.h' &&
  37. X#define z_viforwardwordend 104
  38. X#define z_vigotocolumn 105
  39. X#define z_vigotomark 106
  40. X#define z_vigotomarkline 107
  41. X#define z_vihistorysearchbackward 108
  42. X#define z_vihistorysearchforward 109
  43. X#define z_viindent 110
  44. X#define z_viinsert 111
  45. X#define z_viinsertbol 112
  46. X#define z_vijoin 113
  47. X#define z_vimatchbracket 114
  48. X#define z_viopenlineabove 115
  49. X#define z_viopenlinebelow 116
  50. X#define z_vioperswapcases 117
  51. X#define z_viputafter 118
  52. X#define z_virepeatchange 119
  53. X#define z_virepeatfind 120
  54. X#define z_virepeatsearch 121
  55. X#define z_vireplace 122
  56. X#define z_vireplacechars 123
  57. X#define z_virevrepeatfind 124
  58. X#define z_virevrepeatsearch 125
  59. X#define z_visetbuffer 126
  60. X#define z_visetmark 127
  61. X#define z_visubstitute 128
  62. X#define z_viswapcase 129
  63. X#define z_viundochange 130
  64. X#define z_viunindent 131
  65. X#define z_viyank 132
  66. X#define z_viyankeol 133
  67. X#define z_whichcommand 134
  68. X#define z_yank 135
  69. X#define z_yankpop 136
  70. X#define z_emacsbackwardword 137
  71. X#define z_emacsforwardword 138
  72. X#define z_killword 139
  73. X#define z_vikillline 140
  74. X#define z_vibackwardkillword 141
  75. X#define z_expandcmdpath 142
  76. X#define z_negargument 143
  77. X#define z_poundinsert 144
  78. X#define z_viforwardword 145
  79. X#define z_vibackwardword 146
  80. X#define ZLECMDCOUNT 147
  81. X
  82. Xextern struct zlecmd zlecmds[];
  83. X
  84. SHAR_EOF
  85. echo 'File zsh2.2/src/zle.h is complete' &&
  86. chmod 0644 zsh2.2/src/zle.h ||
  87. echo 'restore of zsh2.2/src/zle.h failed'
  88. Wc_c="`wc -c < 'zsh2.2/src/zle.h'`"
  89. test 8371 -eq "$Wc_c" ||
  90.     echo 'zsh2.2/src/zle.h: original size 8371, current size' "$Wc_c"
  91. rm -f _shar_wnt_.tmp
  92. fi
  93. # ============= zsh2.2/src/zle_bindings.c ==============
  94. if test -f 'zsh2.2/src/zle_bindings.c' -a X"$1" != X"-c"; then
  95.     echo 'x - skipping zsh2.2/src/zle_bindings.c (File already exists)'
  96.     rm -f _shar_wnt_.tmp
  97. else
  98. > _shar_wnt_.tmp
  99. echo 'x - extracting zsh2.2/src/zle_bindings.c (Text)'
  100. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/zle_bindings.c' &&
  101. X/*
  102. X *
  103. X * zle_bindings.c - commands and keymaps
  104. X *
  105. X * This file is part of zsh, the Z shell.
  106. X *
  107. X * This software is Copyright 1992 by Paul Falstad
  108. X *
  109. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  110. X * use this software as long as: there is no monetary profit gained
  111. X * specifically from the use or reproduction of this software, it is not
  112. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  113. X * included prominently in any copy made. 
  114. X *
  115. X * The author make no claims as to the fitness or correctness of this software
  116. X * for any use whatsoever, and it is provided as is. Any use of this software
  117. X * is at the user's own risk. 
  118. X *
  119. X */
  120. X
  121. X#define ZLE
  122. X#include "zsh.h"
  123. X
  124. X
  125. Xstruct zlecmd zlecmds[] = {
  126. X"accept-and-hold",acceptandhold,0,
  127. X"accept-and-infer-next-history",acceptandinfernexthistory,0,
  128. X"accept-and-menu-complete", acceptandmenucomplete, ZLE_MENUCMP,
  129. X"accept-line",acceptline,0,
  130. X"accept-line-and-down-history",acceptlineanddownhistory,0,
  131. X"backward-char",backwardchar,ZLE_MOVEMENT,
  132. X"backward-delete-char",backwarddeletechar,0,
  133. X"backward-delete-word",backwarddeleteword,0,
  134. X"backward-kill-line",backwardkillline,ZLE_KILL,
  135. X"backward-kill-word",backwardkillword,ZLE_KILL,
  136. X"backward-word",backwardword,ZLE_MOVEMENT,
  137. X"beginning-of-buffer-or-history",beginningofbufferorhistory,ZLE_MOVEMENT,
  138. X"beginning-of-history",beginningofhistory,0,
  139. X"beginning-of-line",beginningofline,ZLE_MOVEMENT,
  140. X"beginning-of-line-hist",beginningoflinehist,ZLE_MOVEMENT,
  141. X"capitalize-word",capitalizeword,0,
  142. X"clear-screen",clearscreen,0,
  143. X"complete-word",completeword,ZLE_MENUCMP,
  144. X"copy-prev-word",copyprevword,0,
  145. X"copy-region-as-kill",copyregionaskill,ZLE_KILL,
  146. X"delete-char",deletechar,0,
  147. X"delete-char-or-list",deletecharorlist,ZLE_MENUCMP,
  148. X"delete-word",deleteword,0,
  149. X"digit-argument",digitargument,ZLE_ARG,
  150. X"down-case-word",downcaseword,0,
  151. X"down-history",downhistory,0,
  152. X"down-line-or-history",downlineorhistory,ZLE_MOVEMENT|ZLE_LINEMOVE,
  153. X"end-of-buffer-or-history",endofbufferorhistory,ZLE_MOVEMENT,
  154. X"end-of-history",endofhistory,0,
  155. X"end-of-line",endofline,ZLE_MOVEMENT,
  156. X"end-of-line-hist",endoflinehist,ZLE_MOVEMENT,
  157. X"exchange-point-and-mark",exchangepointandmark,ZLE_MOVEMENT,
  158. X"execute-last-named-cmd",NULL,0,
  159. X"execute-named-cmd",NULL,0,
  160. X"expand-history",expandhistory,0,
  161. X"expand-or-complete",expandorcomplete,ZLE_MENUCMP,
  162. X"expand-word",expandword,0,
  163. X"forward-char",forwardchar,ZLE_MOVEMENT,
  164. X"forward-word",forwardword,ZLE_MOVEMENT,
  165. X"get-line",getline,0,
  166. X"gosmacs-transpose-chars",gosmacstransposechars,0,
  167. X"history-incremental-search-backward",historyincrementalsearchbackward,0,
  168. X"history-incremental-search-forward",historyincrementalsearchforward,0,
  169. X"history-search-backward",historysearchbackward,ZLE_HISTSEARCH,
  170. X"history-search-forward",historysearchforward,ZLE_HISTSEARCH,
  171. X"infer-next-history",infernexthistory,0,
  172. X"insert-last-word",insertlastword,ZLE_INSERT,
  173. X"kill-buffer",killbuffer,ZLE_KILL,
  174. X"kill-line",killline,ZLE_KILL,
  175. X"kill-region",killregion,ZLE_KILL,
  176. X"kill-whole-line",killwholeline,ZLE_KILL,
  177. X"list-choices",listchoices,0,
  178. X"list-expand",listexpand,ZLE_MENUCMP,
  179. X"magic-space",magicspace,0,
  180. X"menu-complete",menucompleteword,ZLE_MENUCMP,
  181. X"menu-expand-or-complete",menuexpandorcomplete,ZLE_MENUCMP,
  182. X"overwrite-mode",overwritemode,0,
  183. X"push-line",pushline,0,
  184. X"quoted-insert",quotedinsert,ZLE_INSERT,
  185. X"quote-line",quoteline,0,
  186. X"quote-region",quoteregion,0,
  187. X"redisplay",redisplay,0,
  188. X"reverse-menu-complete",reversemenucomplete,ZLE_MENUCMP,
  189. X"run-help",processcmd,0,
  190. X"self-insert",selfinsert,ZLE_INSERT,
  191. X"self-insert-unmeta",selfinsertunmeta,ZLE_INSERT,
  192. X"send-break",sendbreak,0,
  193. X"send-string",sendstring,0,
  194. X"",NULL,0,
  195. X"set-mark-command",setmarkcommand,0,
  196. X"spell-word",spellword,0,
  197. X"toggle-literal-history",toggleliteralhistory,0,
  198. X"transpose-chars",transposechars,0,
  199. X"transpose-words",transposewords,0,
  200. X"undefined-key",undefinedkey,0,
  201. X"undo",undo,ZLE_UNDO,
  202. X"universal-argument",universalargument,ZLE_ARG,
  203. X"up-case-word",upcaseword,0,
  204. X"up-history",uphistory,0,
  205. X"up-line-or-history",uplineorhistory,ZLE_LINEMOVE|ZLE_MOVEMENT,
  206. X"vi-add-eol",viaddeol,0,
  207. X"vi-add-next",viaddnext,0,
  208. X"vi-backward-blank-word",vibackwardblankword,ZLE_MOVEMENT,
  209. X"vi-backward-char",vibackwardchar,ZLE_MOVEMENT,
  210. X"vi-backward-delete-char",vibackwarddeletechar,ZLE_KILL,
  211. X"vi-beginning-of-line",vibeginningofline,ZLE_MOVEMENT,
  212. X"vi-caps-lock-panic",vicapslockpanic,0,
  213. X"vi-change",vichange,0,
  214. X"vi-change-eol",vichangeeol,0,
  215. X"vi-change-whole-line",vichangewholeline,0,
  216. X"vi-cmd-mode",vicmdmode,0,
  217. X"vi-delete",videlete,ZLE_KILL,
  218. X"vi-delete-char",videletechar,ZLE_KILL,
  219. X"vi-digit-or-beginning-of-line",NULL,0,
  220. X"vi-end-of-line",viendofline,ZLE_MOVEMENT,
  221. X"vi-fetch-history",vifetchhistory,0,
  222. X"vi-find-next-char",vifindnextchar,ZLE_MOVEMENT,
  223. X"vi-find-next-char-skip",vifindnextcharskip,ZLE_MOVEMENT,
  224. X"vi-find-prev-char",vifindprevchar,ZLE_MOVEMENT,
  225. X"vi-find-prev-char-skip",vifindprevcharskip,ZLE_MOVEMENT,
  226. X"vi-first-non-blank",vifirstnonblank,ZLE_MOVEMENT,
  227. X"vi-forward-blank-word",viforwardblankword,ZLE_MOVEMENT,
  228. X"vi-forward-blank-word-end",viforwardblankwordend,ZLE_MOVEMENT,
  229. X"vi-forward-char",viforwardchar,ZLE_MOVEMENT,
  230. X"vi-forward-word-end",viforwardwordend,ZLE_MOVEMENT,
  231. X"vi-goto-column",vigotocolumn,ZLE_MOVEMENT,
  232. X"vi-goto-mark",vigotomark,ZLE_MOVEMENT,
  233. X"vi-goto-mark-line",vigotomarkline,ZLE_MOVEMENT,
  234. X"vi-history-search-backward",vihistorysearchbackward,0,
  235. X"vi-history-search-forward",vihistorysearchforward,0,
  236. X"vi-indent",viindent,0,
  237. X"vi-insert",viinsert,0,
  238. X"vi-insert-bol",viinsertbol,0,
  239. X"vi-join",vijoin,0,
  240. X"vi-match-bracket",vimatchbracket,ZLE_MOVEMENT,
  241. X"vi-open-line-above",viopenlineabove,0,
  242. X"vi-open-line-below",viopenlinebelow,0,
  243. X"vi-oper-swap-case",vioperswapcase,0,
  244. X"vi-put-after",viputafter,ZLE_YANK,
  245. X"vi-repeat-change",virepeatchange,0,
  246. X"vi-repeat-find",virepeatfind,ZLE_MOVEMENT,
  247. X"vi-repeat-search",virepeatsearch,ZLE_MOVEMENT,
  248. X"vi-replace",vireplace,0,
  249. X"vi-replace-chars",vireplacechars,0,
  250. X"vi-rev-repeat-find",virevrepeatfind,ZLE_MOVEMENT,
  251. X"vi-rev-repeat-search",virevrepeatsearch,ZLE_MOVEMENT,
  252. X"vi-set-buffer",visetbuffer,0,
  253. X"vi-set-mark",visetmark,0,
  254. X"vi-substitute",visubstitute,0,
  255. X"vi-swap-case",viswapcase,0,
  256. X"vi-undo-change",undo,0,
  257. X"vi-unindent",viunindent,0,
  258. X"vi-yank",viyank,0,
  259. X"vi-yank-eol",viyankeol,0,
  260. X"which-command",processcmd,0,
  261. X"yank",yank,ZLE_YANK|ZLE_NAMEDBUFFER,
  262. X"yank-pop",yankpop,ZLE_YANK,
  263. X"emacs-forward-word",emacsforwardword,ZLE_MOVEMENT,
  264. X"emacs-backward-word",emacsbackwardword,ZLE_MOVEMENT,
  265. X"kill-word",killword,ZLE_KILL,
  266. X"vi-kill-line",vikillline,0,
  267. X"vi-backward-kill-word",vibackwardkillword,0,
  268. X"expand-cmd-path",expandcmdpath,0,
  269. X"neg-argument",negargument,ZLE_NEGARG,
  270. X"pound-insert",poundinsert,0,
  271. X"vi-forward-word",viforwardword,ZLE_MOVEMENT,
  272. X"vi-backward-word",vibackwardword,ZLE_MOVEMENT,
  273. X"",NULL,0
  274. X};
  275. X
  276. Xint emacsbind[256] = {
  277. X/* ^@ */ z_setmarkcommand,
  278. X/* ^A */ z_beginningofline,
  279. X/* ^B */ z_backwardchar,
  280. X/* ^C */ z_sendbreak,
  281. X/* ^D */ z_deletecharorlist,
  282. X/* ^E */ z_endofline,
  283. X/* ^F */ z_forwardchar,
  284. X/* ^G */ z_undefinedkey,
  285. X/* ^H */ z_backwarddeletechar,
  286. X/* ^I */ z_expandorcomplete,
  287. X/* ^J */ z_acceptline,
  288. X/* ^K */ z_killline,
  289. X/* ^L */ z_clearscreen,
  290. X/* ^M */ z_acceptline,
  291. X/* ^N */ z_downlineorhistory,
  292. X/* ^O */ z_acceptlineanddownhistory,
  293. X/* ^P */ z_uplineorhistory,
  294. X/* ^Q */ z_pushline,
  295. X/* ^R */ z_historyincrementalsearchbackward,
  296. X/* ^S */ z_historyincrementalsearchforward,
  297. X/* ^T */ z_transposechars,
  298. X/* ^U */ z_killwholeline,
  299. X/* ^V */ z_quotedinsert,
  300. X/* ^W */ z_backwardkillword,
  301. X/* ^X */ z_sequenceleadin,
  302. X/* ^Y */ z_yank,
  303. X/* ^Z */ z_undefinedkey,
  304. X/* ^[ */ z_sequenceleadin,
  305. X/* ^\ */ z_undefinedkey,
  306. X/* ^] */ z_undefinedkey,
  307. X/* ^^ */ z_undefinedkey,
  308. X/* ^_ */ z_undo,
  309. X/*   */ z_selfinsert,
  310. X/* ! */ z_selfinsert,
  311. X/* " */ z_selfinsert,
  312. X/* # */ z_selfinsert,
  313. X/* $ */ z_selfinsert,
  314. X/* % */ z_selfinsert,
  315. X/* & */ z_selfinsert,
  316. X/* ' */ z_selfinsert,
  317. X/* ( */ z_selfinsert,
  318. X/* ) */ z_selfinsert,
  319. X/* * */ z_selfinsert,
  320. X/* + */ z_selfinsert,
  321. X/* , */ z_selfinsert,
  322. X/* - */ z_selfinsert,
  323. X/* . */ z_selfinsert,
  324. X/* / */ z_selfinsert,
  325. X/* 0 */ z_selfinsert,
  326. X/* 1 */ z_selfinsert,
  327. X/* 2 */ z_selfinsert,
  328. X/* 3 */ z_selfinsert,
  329. X/* 4 */ z_selfinsert,
  330. X/* 5 */ z_selfinsert,
  331. X/* 6 */ z_selfinsert,
  332. X/* 7 */ z_selfinsert,
  333. X/* 8 */ z_selfinsert,
  334. X/* 9 */ z_selfinsert,
  335. X/* : */ z_selfinsert,
  336. X/* ; */ z_selfinsert,
  337. X/* < */ z_selfinsert,
  338. X/* = */ z_selfinsert,
  339. X/* > */ z_selfinsert,
  340. X/* ? */ z_selfinsert,
  341. X/* @ */ z_selfinsert,
  342. X/* A */ z_selfinsert,
  343. X/* B */ z_selfinsert,
  344. X/* C */ z_selfinsert,
  345. X/* D */ z_selfinsert,
  346. X/* E */ z_selfinsert,
  347. X/* F */ z_selfinsert,
  348. X/* G */ z_selfinsert,
  349. X/* H */ z_selfinsert,
  350. X/* I */ z_selfinsert,
  351. X/* J */ z_selfinsert,
  352. X/* K */ z_selfinsert,
  353. X/* L */ z_selfinsert,
  354. X/* M */ z_selfinsert,
  355. X/* N */ z_selfinsert,
  356. X/* O */ z_selfinsert,
  357. X/* P */ z_selfinsert,
  358. X/* Q */ z_selfinsert,
  359. X/* R */ z_selfinsert,
  360. X/* S */ z_selfinsert,
  361. X/* T */ z_selfinsert,
  362. X/* U */ z_selfinsert,
  363. X/* V */ z_selfinsert,
  364. X/* W */ z_selfinsert,
  365. X/* X */ z_selfinsert,
  366. X/* Y */ z_selfinsert,
  367. X/* Z */ z_selfinsert,
  368. X/* [ */ z_selfinsert,
  369. X/* \ */ z_selfinsert,
  370. X/* ] */ z_selfinsert,
  371. X/* ^ */ z_selfinsert,
  372. X/* _ */ z_selfinsert,
  373. X/* ` */ z_selfinsert,
  374. X/* a */ z_selfinsert,
  375. X/* b */ z_selfinsert,
  376. X/* c */ z_selfinsert,
  377. X/* d */ z_selfinsert,
  378. X/* e */ z_selfinsert,
  379. X/* f */ z_selfinsert,
  380. X/* g */ z_selfinsert,
  381. X/* h */ z_selfinsert,
  382. X/* i */ z_selfinsert,
  383. X/* j */ z_selfinsert,
  384. X/* k */ z_selfinsert,
  385. X/* l */ z_selfinsert,
  386. X/* m */ z_selfinsert,
  387. X/* n */ z_selfinsert,
  388. X/* o */ z_selfinsert,
  389. X/* p */ z_selfinsert,
  390. X/* q */ z_selfinsert,
  391. X/* r */ z_selfinsert,
  392. X/* s */ z_selfinsert,
  393. X/* t */ z_selfinsert,
  394. X/* u */ z_selfinsert,
  395. X/* v */ z_selfinsert,
  396. X/* w */ z_selfinsert,
  397. X/* x */ z_selfinsert,
  398. X/* y */ z_selfinsert,
  399. X/* z */ z_selfinsert,
  400. X/* { */ z_selfinsert,
  401. X/* | */ z_selfinsert,
  402. X/* } */ z_selfinsert,
  403. X/* ~ */ z_selfinsert,
  404. X/* ^? */ z_backwarddeletechar,
  405. X/* M-^@ */ z_undefinedkey,
  406. X/* M-^A */ z_undefinedkey,
  407. X/* M-^B */ z_undefinedkey,
  408. X/* M-^C */ z_undefinedkey,
  409. X/* M-^D */ z_listchoices,
  410. X/* M-^E */ z_undefinedkey,
  411. X/* M-^F */ z_undefinedkey,
  412. X/* M-^G */ z_undefinedkey,
  413. X/* M-^H */ z_backwardkillword,
  414. X/* M-^I */ z_selfinsertunmeta,
  415. X/* M-^J */ z_selfinsertunmeta,
  416. X/* M-^K */ z_undefinedkey,
  417. X/* M-^L */ z_clearscreen,
  418. X/* M-^M */ z_selfinsertunmeta,
  419. X/* M-^N */ z_undefinedkey,
  420. X/* M-^O */ z_undefinedkey,
  421. X/* M-^P */ z_undefinedkey,
  422. X/* M-^Q */ z_undefinedkey,
  423. X/* M-^R */ z_undefinedkey,
  424. X/* M-^S */ z_undefinedkey,
  425. X/* M-^T */ z_undefinedkey,
  426. X/* M-^U */ z_undefinedkey,
  427. X/* M-^V */ z_undefinedkey,
  428. X/* M-^W */ z_undefinedkey,
  429. X/* M-^X */ z_undefinedkey,
  430. X/* M-^Y */ z_undefinedkey,
  431. X/* M-^Z */ z_undefinedkey,
  432. X/* M-^[ */ z_undefinedkey,
  433. X/* M-^\ */ z_undefinedkey,
  434. X/* M-^] */ z_undefinedkey,
  435. X/* M-^^ */ z_undefinedkey,
  436. X/* M-^_ */ z_copyprevword,
  437. X/* M-  */ z_expandhistory,
  438. X/* M-! */ z_expandhistory,
  439. X/* M-" */ z_quoteregion,
  440. X/* M-# */ z_undefinedkey,
  441. X/* M-$ */ z_spellword,
  442. X/* M-% */ z_undefinedkey,
  443. X/* M-& */ z_undefinedkey,
  444. X/* M-' */ z_quoteline,
  445. X/* M-( */ z_undefinedkey,
  446. X/* M-) */ z_undefinedkey,
  447. X/* M-* */ z_undefinedkey,
  448. X/* M-+ */ z_undefinedkey,
  449. X/* M-, */ z_undefinedkey,
  450. X/* M-- */ z_negargument,
  451. X/* M-. */ z_insertlastword,
  452. X/* M-/ */ z_undefinedkey,
  453. X/* M-0 */ z_digitargument,
  454. X/* M-1 */ z_digitargument,
  455. X/* M-2 */ z_digitargument,
  456. X/* M-3 */ z_digitargument,
  457. X/* M-4 */ z_digitargument,
  458. X/* M-5 */ z_digitargument,
  459. X/* M-6 */ z_digitargument,
  460. X/* M-7 */ z_digitargument,
  461. X/* M-8 */ z_digitargument,
  462. X/* M-9 */ z_digitargument,
  463. X/* M-: */ z_undefinedkey,
  464. X/* M-; */ z_undefinedkey,
  465. X/* M-< */ z_beginningofbufferorhistory,
  466. X/* M-= */ z_undefinedkey,
  467. X/* M-> */ z_endofbufferorhistory,
  468. X/* M-? */ z_whichcommand,
  469. X/* M-@ */ z_undefinedkey,
  470. X/* M-A */ z_acceptandhold,
  471. X/* M-B */ z_backwardword,
  472. X/* M-C */ z_capitalizeword,
  473. X/* M-D */ z_deleteword,
  474. X/* M-E */ z_undefinedkey,
  475. X/* M-F */ z_forwardword,
  476. X/* M-G */ z_getline,
  477. X/* M-H */ z_runhelp,
  478. X/* M-I */ z_undefinedkey,
  479. X/* M-J */ z_undefinedkey,
  480. X/* M-K */ z_undefinedkey,
  481. X/* M-L */ z_downcaseword,
  482. X/* M-M */ z_undefinedkey,
  483. X/* M-N */ z_historysearchforward,
  484. X/* M-O */ z_undefinedkey,
  485. X/* M-P */ z_historysearchbackward,
  486. X/* M-Q */ z_pushline,
  487. X/* M-R */ z_toggleliteralhistory,
  488. X/* M-S */ z_spellword,
  489. X/* M-T */ z_transposewords,
  490. X/* M-U */ z_upcaseword,
  491. X/* M-V */ z_undefinedkey,
  492. X/* M-W */ z_copyregionaskill,
  493. X/* M-X */ z_undefinedkey,
  494. X/* M-Y */ z_undefinedkey,
  495. X/* M-Z */ z_undefinedkey,
  496. X/* M-[ */ z_sequenceleadin,
  497. X/* M-\ */ z_undefinedkey,
  498. X/* M-] */ z_undefinedkey,
  499. X/* M-^ */ z_undefinedkey,
  500. X/* M-_ */ z_insertlastword,
  501. X/* M-` */ z_undefinedkey,
  502. X/* M-a */ z_acceptandhold,
  503. X/* M-b */ z_backwardword,
  504. X/* M-c */ z_capitalizeword,
  505. X/* M-d */ z_deleteword,
  506. X/* M-e */ z_undefinedkey,
  507. X/* M-f */ z_forwardword,
  508. X/* M-g */ z_getline,
  509. X/* M-h */ z_runhelp,
  510. X/* M-i */ z_undefinedkey,
  511. X/* M-j */ z_undefinedkey,
  512. X/* M-k */ z_undefinedkey,
  513. X/* M-l */ z_downcaseword,
  514. X/* M-m */ z_undefinedkey,
  515. X/* M-n */ z_historysearchforward,
  516. X/* M-o */ z_undefinedkey,
  517. X/* M-p */ z_historysearchbackward,
  518. X/* M-q */ z_pushline,
  519. X/* M-r */ z_toggleliteralhistory,
  520. X/* M-s */ z_spellword,
  521. X/* M-t */ z_transposewords,
  522. X/* M-u */ z_upcaseword,
  523. X/* M-v */ z_undefinedkey,
  524. X/* M-w */ z_copyregionaskill,
  525. X/* M-x */ z_executenamedcmd,
  526. X/* M-y */ z_yankpop,
  527. X/* M-z */ z_executelastnamedcmd,
  528. X/* M-{ */ z_undefinedkey,
  529. X/* M-| */ z_vigotocolumn,
  530. X/* M-} */ z_undefinedkey,
  531. X/* M-~ */ z_undefinedkey,
  532. X/* M-^? */ z_backwardkillword,
  533. X};
  534. X
  535. Xint viinsbind[32] = {
  536. X/* ^@ */ z_undefinedkey,
  537. X/* ^A */ z_selfinsert,
  538. X/* ^B */ z_selfinsert,
  539. X/* ^C */ z_sendbreak,
  540. X/* ^D */ z_listchoices,
  541. X/* ^E */ z_selfinsert,
  542. X/* ^F */ z_selfinsert,
  543. X/* ^G */ z_selfinsert,
  544. X/* ^H */ z_vibackwarddeletechar,
  545. X/* ^I */ z_expandorcomplete,
  546. X/* ^J */ z_acceptline,
  547. X/* ^K */ z_killline,
  548. X/* ^L */ z_clearscreen,
  549. X/* ^M */ z_acceptline,
  550. X/* ^N */ z_selfinsert,
  551. X/* ^O */ z_selfinsert,
  552. X/* ^P */ z_selfinsert,
  553. X/* ^Q */ z_selfinsert,
  554. X/* ^R */ z_redisplay,
  555. X/* ^S */ z_selfinsert,
  556. X/* ^T */ z_selfinsert,
  557. X/* ^U */ z_vikillline,
  558. X/* ^V */ z_quotedinsert,
  559. X/* ^W */ z_vibackwardkillword,
  560. X/* ^X */ z_selfinsert,
  561. X/* ^Y */ z_selfinsert,
  562. X/* ^Z */ z_selfinsert,
  563. X/* ^[ */ z_vicmdmode,
  564. X/* ^\ */ z_selfinsert,
  565. X/* ^] */ z_selfinsert,
  566. X/* ^^ */ z_selfinsert,
  567. X/* ^_ */ z_selfinsert,
  568. X};
  569. X
  570. Xint vicmdbind[128] = {
  571. X/* ^@ */ z_undefinedkey,
  572. X/* ^A */ z_beginningofline,
  573. X/* ^B */ z_undefinedkey,
  574. X/* ^C */ z_sendbreak,
  575. X/* ^D */ z_listchoices,
  576. X/* ^E */ z_endofline,
  577. X/* ^F */ z_undefinedkey,
  578. X/* ^G */ z_listexpand,
  579. X/* ^H */ z_backwarddeletechar,
  580. X/* ^I */ z_completeword,
  581. X/* ^J */ z_acceptline,
  582. X/* ^K */ z_killline,
  583. X/* ^L */ z_clearscreen,
  584. X/* ^M */ z_acceptline,
  585. X/* ^N */ z_downhistory,
  586. X/* ^O */ z_undefinedkey,
  587. X/* ^P */ z_uphistory,
  588. X/* ^Q */ z_undefinedkey,
  589. X/* ^R */ z_redisplay,
  590. X/* ^S */ z_undefinedkey,
  591. X/* ^T */ z_undefinedkey,
  592. X/* ^U */ z_killbuffer,
  593. X/* ^V */ z_undefinedkey,
  594. X/* ^W */ z_backwardkillword,
  595. X/* ^X */ z_expandorcomplete,
  596. X/* ^Y */ z_undefinedkey,
  597. X/* ^Z */ z_undefinedkey,
  598. X/* ^[ */ z_sequenceleadin,
  599. X/* ^\ */ z_undefinedkey,
  600. X/* ^] */ z_undefinedkey,
  601. X/* ^^ */ z_undefinedkey,
  602. X/* ^_ */ z_undefinedkey,
  603. X/*   */ z_viforwardchar,
  604. X/* ! */ z_undefinedkey,
  605. X/* " */ z_visetbuffer,
  606. X/* # */ z_poundinsert,
  607. X/* $ */ z_viendofline,
  608. X/* % */ z_vimatchbracket,
  609. X/* & */ z_undefinedkey,
  610. X/* ' */ z_vigotomarkline,
  611. X/* ( */ z_undefinedkey,
  612. X/* ) */ z_undefinedkey,
  613. X/* * */ z_undefinedkey,
  614. X/* + */ z_downlineorhistory,
  615. X/* , */ z_virevrepeatfind,
  616. X/* - */ z_uplineorhistory,
  617. X/* . */ z_virepeatchange,
  618. X/* / */ z_vihistorysearchbackward,
  619. X/* 0 */ z_vidigitorbeginningofline,
  620. X/* 1 */ z_digitargument,
  621. X/* 2 */ z_digitargument,
  622. X/* 3 */ z_digitargument,
  623. X/* 4 */ z_digitargument,
  624. X/* 5 */ z_digitargument,
  625. X/* 6 */ z_digitargument,
  626. X/* 7 */ z_digitargument,
  627. X/* 8 */ z_digitargument,
  628. X/* 9 */ z_digitargument,
  629. X/* : */ z_undefinedkey,
  630. X/* ; */ z_virepeatfind,
  631. X/* < */ z_viunindent,
  632. X/* = */ z_listchoices,
  633. X/* > */ z_viindent,
  634. X/* ? */ z_vihistorysearchforward,
  635. X/* @ */ z_undefinedkey,
  636. X/* A */ z_viaddeol,
  637. X/* B */ z_vibackwardblankword,
  638. X/* C */ z_vichangeeol,
  639. X/* D */ z_killline,
  640. X/* E */ z_viforwardblankwordend,
  641. X/* F */ z_vifindprevchar,
  642. X/* G */ z_vifetchhistory,
  643. X/* H */ z_vicapslockpanic,
  644. X/* I */ z_viinsertbol,
  645. X/* J */ z_historysearchforward,
  646. X/* K */ z_historysearchbackward,
  647. X/* L */ z_undefinedkey,
  648. X/* M */ z_undefinedkey,
  649. X/* N */ z_virevrepeatsearch,
  650. X/* O */ z_viopenlineabove,
  651. X/* P */ z_yank,
  652. X/* Q */ z_undefinedkey,
  653. X/* R */ z_vireplace,
  654. X/* S */ z_vichangewholeline,
  655. X/* T */ z_vifindprevcharskip,
  656. X/* U */ z_undefinedkey,
  657. X/* V */ z_undefinedkey,
  658. X/* W */ z_viforwardblankword,
  659. X/* X */ z_vibackwarddeletechar,
  660. X/* Y */ z_viyankeol,
  661. X/* Z */ z_undefinedkey,
  662. X/* [ */ z_undefinedkey,
  663. X/* \ */ z_completeword,
  664. X/* ] */ z_undefinedkey,
  665. X/* ^ */ z_vifirstnonblank,
  666. X/* _ */ z_undefinedkey,
  667. X/* ` */ z_vigotomark,
  668. X/* a */ z_viaddnext,
  669. X/* b */ z_vibackwardword,
  670. X/* c */ z_vichange,
  671. X/* d */ z_videlete,
  672. X/* e */ z_viforwardwordend,
  673. X/* f */ z_vifindnextchar,
  674. X/* g */ z_undefinedkey,
  675. X/* h */ z_vibackwardchar,
  676. X/* i */ z_viinsert,
  677. X/* j */ z_downlineorhistory,
  678. X/* k */ z_uplineorhistory,
  679. X/* l */ z_viforwardchar,
  680. X/* m */ z_visetmark,
  681. X/* n */ z_virepeatsearch,
  682. X/* o */ z_viopenlinebelow,
  683. X/* p */ z_viputafter,
  684. X/* q */ z_undefinedkey,
  685. X/* r */ z_vireplacechars,
  686. X/* s */ z_visubstitute,
  687. X/* t */ z_vifindnextcharskip,
  688. X/* u */ z_viundochange,
  689. X/* v */ z_undefinedkey,
  690. X/* w */ z_viforwardword,
  691. X/* x */ z_videletechar,
  692. X/* y */ z_viyank,
  693. X/* z */ z_undefinedkey,
  694. X/* { */ z_undefinedkey,
  695. X/* | */ z_vigotocolumn,
  696. X/* } */ z_undefinedkey,
  697. X/* ~ */ z_viswapcase,
  698. X/* ^? */ z_backwarddeletechar,
  699. X};
  700. X
  701. SHAR_EOF
  702. chmod 0644 zsh2.2/src/zle_bindings.c ||
  703. echo 'restore of zsh2.2/src/zle_bindings.c failed'
  704. Wc_c="`wc -c < 'zsh2.2/src/zle_bindings.c'`"
  705. test 17212 -eq "$Wc_c" ||
  706.     echo 'zsh2.2/src/zle_bindings.c: original size 17212, current size' "$Wc_c"
  707. rm -f _shar_wnt_.tmp
  708. fi
  709. # ============= zsh2.2/src/zle_main.c ==============
  710. if test -f 'zsh2.2/src/zle_main.c' -a X"$1" != X"-c"; then
  711.     echo 'x - skipping zsh2.2/src/zle_main.c (File already exists)'
  712.     rm -f _shar_wnt_.tmp
  713. else
  714. > _shar_wnt_.tmp
  715. echo 'x - extracting zsh2.2/src/zle_main.c (Text)'
  716. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/zle_main.c' &&
  717. X/*
  718. X *
  719. X * zle_main.c - main routines for line editor
  720. X *
  721. X * This file is part of zsh, the Z shell.
  722. X *
  723. X * This software is Copyright 1992 by Paul Falstad
  724. X *
  725. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  726. X * use this software as long as: there is no monetary profit gained
  727. X * specifically from the use or reproduction of this software, it is not
  728. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  729. X * included prominently in any copy made. 
  730. X *
  731. X * The author make no claims as to the fitness or correctness of this software
  732. X * for any use whatsoever, and it is provided as is. Any use of this software
  733. X * is at the user's own risk. 
  734. X *
  735. X */
  736. X
  737. X#define ZLEGLOBALS
  738. X#define ZLE
  739. X#include "zsh.h"
  740. X#include <sys/types.h>
  741. X#include <sys/errno.h>
  742. X#ifdef HAS_SYS_SELECT
  743. X#include <sys/select.h>
  744. X#endif
  745. X
  746. Xstatic Key cky;
  747. X
  748. X/* set up terminal */
  749. X
  750. Xvoid setterm() /**/
  751. X{
  752. Xstruct ttyinfo ti;
  753. X#ifdef FIONREAD
  754. Xlong val;
  755. X#endif
  756. X
  757. X#ifdef CLOBBERS_TYPEAHEAD
  758. X#ifdef FIONREAD
  759. X    ioctl(SHTTY, FIONREAD, &val);
  760. X    if (val) return;
  761. X#endif
  762. X#endif
  763. X    inittty();
  764. X    ti = shttyinfo;
  765. X#ifdef TIO
  766. X    ti.tio.c_lflag &= ~(ICANON|ECHO
  767. X#ifdef FLUSHO
  768. X        |FLUSHO
  769. X#endif
  770. X        );
  771. X    ti.tio.c_cc[VQUIT] =
  772. X#ifdef VDISCARD
  773. X        ti.tio.c_cc[VDISCARD] = 
  774. X#endif
  775. X#ifdef VSUSP
  776. X        ti.tio.c_cc[VSUSP] =
  777. X#endif
  778. X#ifdef VDSUSP
  779. X        ti.tio.c_cc[VDSUSP] =
  780. X#endif
  781. X#ifdef VSWTCH
  782. X        ti.tio.c_cc[VSWTCH] =
  783. X#endif
  784. X        VDISABLEVAL;
  785. X    ti.tio.c_cc[VMIN] = 1;
  786. X    ti.tio.c_cc[VTIME] = 0;
  787. X    ti.tio.c_iflag &= ~(INLCR|ICRNL);
  788. X#else
  789. X    ti.sgttyb.sg_flags = (ti.sgttyb.sg_flags | CBREAK) & ~ECHO;
  790. X    ti.lmodes &= ~LFLUSHO;
  791. X    ti.tchars.t_quitc =
  792. X        ti.ltchars.t_suspc =
  793. X        ti.ltchars.t_flushc =
  794. X        ti.ltchars.t_dsuspc = ti.ltchars.t_lnextc = -1;
  795. X#endif
  796. X#ifdef TTY_NEEDS_DRAINING
  797. X    drainoutput();
  798. X#endif
  799. X    settyinfo(&ti);
  800. X}
  801. X
  802. Xvoid unsetterm() /**/
  803. X{
  804. X    settyinfo(&shttyinfo);
  805. X}
  806. X
  807. Xstatic char *kungetbuf;
  808. Xstatic int kungetct,kungetsz;
  809. X
  810. Xvoid ungetkey(ch) /**/
  811. Xint ch;
  812. X{
  813. X    if (kungetct == kungetsz)
  814. X        kungetbuf = realloc(kungetbuf,kungetsz *= 2);
  815. X    kungetbuf[kungetct++] = ch;
  816. X}
  817. X
  818. Xvoid ungetkeys(s,len) /**/
  819. Xchar *s;int len;
  820. X{
  821. X    s += len;
  822. X    while (len--)
  823. X        ungetkey(*--s);
  824. X}
  825. X
  826. Xunsigned int getkey(tmok) /**/
  827. Xint tmok;
  828. X{
  829. Xchar cc;
  830. Xunsigned int ret = 0;
  831. Xint die = 0;
  832. X#ifdef HAS_SELECT
  833. Xfd_set foofd;
  834. X#endif
  835. X
  836. X    if (kungetct)
  837. X        ret = (unsigned int) (unsigned char) kungetbuf[--kungetct];
  838. X    else {
  839. X        while (
  840. X#ifdef HAS_SELECT
  841. X        FD_SET(0,&foofd), select(1,&foofd,NULL,NULL,NULL) != 1 ||
  842. X#endif
  843. X        read(0,&cc,1) != 1)
  844. X            if (errno == EINTR) {
  845. X                if (!errflag)
  846. X                    continue;
  847. X                errflag = 0;
  848. X                if (tmok)
  849. X                    return -1;
  850. X                return 3;
  851. X            } else if (errno == EWOULDBLOCK) {
  852. X                fcntl(0,F_SETFL,0);
  853. X            } else if (errno == EIO && !die) {
  854. X                ret = jobbing;
  855. X                jobbing = 1;
  856. X                attachtty(mypgrp);
  857. X                refresh(); /* kludge! */
  858. X                jobbing = ret;
  859. X                die = 1;
  860. X            } else {
  861. X                zerr("error on TTY read: %e",NULL,errno);
  862. X                exit(1);
  863. X            }
  864. X        ret = (unsigned int) (unsigned char) cc;
  865. X    }
  866. X    if (vichgflag) {
  867. X        if (vichgbufptr == vichgbufsz)
  868. X            vichgbuf = realloc(vichgbuf,vichgbufsz *= 2);
  869. X        vichgbuf[vichgbufptr++] = ret;
  870. X    }
  871. X    return ret;
  872. X}
  873. X
  874. X/* read a line */
  875. X
  876. Xunsigned char *zleread(ppt,ppt2,plen) /**/
  877. Xunsigned char *ppt;unsigned char *ppt2;int plen;
  878. X{
  879. Xint z;
  880. Xlong costmult;
  881. Xunsigned char *s;
  882. X#ifdef HAS_SELECT
  883. Xstruct timeval tv;
  884. Xfd_set foofd;
  885. X
  886. X    tv.tv_sec = 0;
  887. X#endif
  888. X    fflush(stdout);
  889. X    fflush(stderr);
  890. X    intr();
  891. X    costmult = 3840000L/((baud) ? baud : 2400);
  892. X    insmode = unset(OVERSTRIKE); eofsent = 0; resetneeded =0 ;
  893. X    pmpt = (char *)ppt;
  894. X    pmpt2 = (char *)ppt2;
  895. X    permalloc();
  896. X    histline = curhist;
  897. X    pptlen = plen;
  898. X    resetneeded = 1;
  899. X#ifdef HAS_SELECT
  900. X    FD_ZERO(&foofd);
  901. X#endif
  902. X    undoing = 1;
  903. X    line = zalloc(linesz = 256);
  904. X    *line = '\0';
  905. X    virangeflag = lastcmd = done = cs = ll = mark = 0;
  906. X    curhistline = NULL;
  907. X    mult = 1;
  908. X    vibufspec = 0;
  909. X    bindtab = mainbindtab;
  910. X    addedslash = vichgflag = 0;
  911. X    viinsbegin = 0;
  912. X    statusline = NULL;
  913. X    if (s = getnode(bufstack))
  914. X        {
  915. X        setline((char *) s);
  916. X        free(s);
  917. X        if (stackcs != -1)
  918. X            {
  919. X            cs = stackcs;
  920. X            stackcs = -1;
  921. X            if (cs > ll)
  922. X                cs = ll;
  923. X            }
  924. X        if (stackhist != -1)
  925. X            {
  926. X            histline = stackhist;
  927. X            stackhist = -1;
  928. X            }
  929. X        }
  930. X    initundo();
  931. X    if (unset(NOPROMPTCR))
  932. X        putchar('\r');
  933. X    if (tmout)
  934. X        alarm(tmout);
  935. X    refresh();
  936. X    errflag = 0;
  937. X    while (!done && !errflag)
  938. X        {
  939. X        struct zlecmd *zc;
  940. X        
  941. X        statusline = NULL;
  942. X        bindk = getkeycmd();
  943. X        if (c == 4 && !ll)
  944. X            {
  945. X            eofsent = 1;
  946. X            break;
  947. X            }
  948. X        if (bindk != -1)
  949. X            {
  950. X            zc = zlecmds+bindk;
  951. X            if (!(lastcmd & ZLE_ARG))
  952. X                mult = 1;
  953. X            if ((lastcmd & ZLE_UNDO) != (zc->flags & ZLE_UNDO) && undoing)
  954. X                addundo();
  955. X            if (!(zc->flags & ZLE_MENUCMP)) {
  956. X                if (menucmp) freemenu();
  957. X                if (addedslash &&
  958. X                        !((zc->flags & ZLE_INSERT) && c != ' ')) {
  959. X                    backdel(1);
  960. X                }
  961. X                addedslash = 0;
  962. X            }
  963. X            if (zc->func)
  964. X                (*zc->func)();
  965. X            lastcmd = zc->flags;
  966. X            if (!(lastcmd & ZLE_UNDO) && undoing) addundo();
  967. X            }
  968. X        else
  969. X            {
  970. X            errflag = 1;
  971. X            break;
  972. X            }
  973. X#ifdef HAS_SELECT
  974. X        FD_SET(0,&foofd);
  975. X        if ((tv.tv_usec = cost*costmult) > 500000)
  976. X            tv.tv_usec = 500000;
  977. X#endif
  978. X        if (!kungetct
  979. X#ifdef HAS_SELECT
  980. X            && select(1,&foofd,NULL,NULL,&tv) <= 0
  981. X#endif
  982. X            )
  983. X            refresh();
  984. X        }
  985. X    if (menucmp)
  986. X        freemenu();
  987. X    statusline = NULL;
  988. X    trashzle();
  989. X    alarm(0);
  990. X    z = strlen((char *)line);
  991. X    line[z] = '\n';
  992. X    line[z+1] = 0;
  993. X    heapalloc();
  994. X    if (curhistline)
  995. X        free(curhistline);
  996. X    if (eofsent)
  997. X        {
  998. X        free(line);
  999. X        line = NULL;
  1000. X        }
  1001. X    zleactive = 0;
  1002. X    freeundo();
  1003. X    return line;
  1004. X}
  1005. X
  1006. Xint getkeycmd() /**/
  1007. X{
  1008. Xchar buf[10];
  1009. Xint t0,ret;
  1010. XKey ky;
  1011. X
  1012. X    t0 = 1;
  1013. X    cky = NULL;
  1014. X    if ((c = getkey(1)) == -1)
  1015. X        return -1;
  1016. X    if ((ret = bindtab[c]) == z_sequenceleadin)
  1017. X        {
  1018. X        buf[0] = (c) ? c : 0x80;
  1019. X        for (;;)
  1020. X            {
  1021. X            c = getkey(0);
  1022. X            buf[t0++] = (c) ? c : 0x80;
  1023. X            buf[t0] = '\0';
  1024. X            if (!(ky = (Key) gethnode(buf,xbindtab)))
  1025. X                return z_undefinedkey;
  1026. X            if (ky->func != z_sequenceleadin)
  1027. X                {
  1028. X                cky = ky;
  1029. X                ret = ky->func;
  1030. X                break;
  1031. X                }
  1032. X            }
  1033. X        }
  1034. X    if (ret == z_vidigitorbeginningofline)
  1035. X        ret = (lastcmd & ZLE_ARG) ? z_digitargument : z_beginningofline;
  1036. X    else if (ret == z_executenamedcmd)
  1037. X        ret = executenamedcommand();
  1038. X    else if (ret == z_executelastnamedcmd)
  1039. X        ret = lastnamed;
  1040. X    return ret;
  1041. X}
  1042. X
  1043. Xvoid sendstring() /**/
  1044. X{
  1045. Xchar buf[2];
  1046. X
  1047. X    buf[0] = c;
  1048. X    buf[1] = '\0';
  1049. X    if (!cky)
  1050. X        cky = (Key) gethnode(buf,xbindtab);
  1051. X    ungetkeys(cky->str,cky->len);
  1052. X}
  1053. X
  1054. XKey makefunckey(fun) /**/
  1055. Xint fun;
  1056. X{
  1057. XKey ky = zcalloc(sizeof *ky);
  1058. X
  1059. X    ky->func = fun;
  1060. X    return ky;
  1061. X}
  1062. X
  1063. X/* initialize the bindings */
  1064. X
  1065. Xvoid initxbindtab() /**/
  1066. X{
  1067. Xint t0,vi = 0;
  1068. Xchar buf[3],*s;
  1069. X
  1070. X    lastnamed = z_undefinedkey;
  1071. X    if (s = zgetenv("VISUAL")) {
  1072. X        if (ztrstr(s,"vi"))
  1073. X            vi = 1;
  1074. X    }
  1075. X    else if ((s = zgetenv("EDITOR")) && ztrstr(s,"vi"))
  1076. X        vi = 1;
  1077. X    if (vi) {
  1078. X        for (t0 = 0; t0 != 32; t0++)
  1079. X            mainbindtab[t0] = viinsbind[t0];
  1080. X        for (t0 = 32; t0 != 256; t0++)
  1081. X            mainbindtab[t0] = z_selfinsert;
  1082. X        mainbindtab[127] = z_backwarddeletechar;
  1083. X    } else {
  1084. X        for (t0 = 0; t0 != 128; t0++)
  1085. X            mainbindtab[t0] = emacsbind[t0];
  1086. X        for (t0 = 128; t0 != 256; t0++)
  1087. X            mainbindtab[t0] = z_selfinsert;
  1088. X    }
  1089. X    for (t0 = 0200; t0 != 0240; t0++)
  1090. X        mainbindtab[t0] = z_undefinedkey;
  1091. X    for (t0 = 0; t0 != 128; t0++)
  1092. X        altbindtab[t0] = vicmdbind[t0];
  1093. X    for (t0 = 128; t0 != 256; t0++)
  1094. X        altbindtab[t0] = emacsbind[t0];
  1095. X    bindtab = mainbindtab;
  1096. X    kungetbuf = zalloc(kungetsz = 32);
  1097. X    kungetct = 0;
  1098. X    xbindtab = newhtable(67);
  1099. X    addhperm("\33\133C",makefunckey(z_forwardchar),xbindtab,NULL);
  1100. X    addhperm("\33\133D",makefunckey(z_backwardchar),xbindtab,NULL);
  1101. X    addhperm("\33\133A",makefunckey(z_uplineorhistory),xbindtab,NULL);
  1102. X    addhperm("\33\133B",makefunckey(z_downlineorhistory),xbindtab,NULL);
  1103. X    addhperm("\30*",makefunckey(z_expandword),xbindtab,NULL);
  1104. X    addhperm("\30g",makefunckey(z_listexpand),xbindtab,NULL);
  1105. X    addhperm("\30G",makefunckey(z_listexpand),xbindtab,NULL);
  1106. X    addhperm("\30\16",makefunckey(z_infernexthistory),xbindtab,NULL);
  1107. X    addhperm("\30\13",makefunckey(z_killbuffer),xbindtab,NULL);
  1108. X    addhperm("\30\6",makefunckey(z_vifindnextchar),xbindtab,NULL);
  1109. X    addhperm("\30\17",makefunckey(z_overwritemode),xbindtab,NULL);
  1110. X    addhperm("\30\25",makefunckey(z_undo),xbindtab,NULL);
  1111. X    addhperm("\30\26",makefunckey(z_vicmdmode),xbindtab,NULL);
  1112. X    addhperm("\30\12",makefunckey(z_vijoin),xbindtab,NULL);
  1113. X    addhperm("\30\2",makefunckey(z_vimatchbracket),xbindtab,NULL);
  1114. X    addhperm("\30s",makefunckey(z_historyincrementalsearchforward),
  1115. X        xbindtab,NULL);
  1116. X    addhperm("\30r",makefunckey(z_historyincrementalsearchbackward),
  1117. X        xbindtab,NULL);
  1118. X    addhperm("\30u",makefunckey(z_undo),xbindtab,NULL);
  1119. X    addhperm("\30\30",makefunckey(z_exchangepointandmark),
  1120. X        xbindtab,NULL);
  1121. X    addhperm("run-help",mkanode(ztrdup("man"),1),aliastab,NULL);
  1122. X    addhperm("which-command",mkanode(ztrdup("whence"),1),aliastab,NULL);
  1123. X    strcpy(buf,"\33q");
  1124. X    for (t0 = 128; t0 != 256; t0++)
  1125. X        if (emacsbind[t0] != z_undefinedkey) {
  1126. X            buf[1] = t0 & 0x7f;
  1127. X            addhnode(ztrdup(buf),makefunckey(emacsbind[t0]),xbindtab,NULL);
  1128. X        }
  1129. X    for (t0 = 0; t0 != 36; t0++) vibuf[t0] = NULL;
  1130. X    for (t0 = 0; t0 != 26; t0++) vimarkline[t0] = 0;
  1131. X    stackhist = stackcs = -1;
  1132. X    vichgbufsz = 0;
  1133. X    vichgbuf = NULL;
  1134. X}
  1135. X
  1136. Xchar *getkeystring(s,len) /**/
  1137. Xchar *s;int *len;
  1138. X{
  1139. Xstatic char buf[512];
  1140. Xchar *t = buf;
  1141. Xint x,first = 1,metanext = 0;
  1142. X
  1143. X    for (;*s;s++)
  1144. X        {
  1145. X        if (*s == '\\' && s[1])
  1146. X            switch(*++s)
  1147. X                {
  1148. X                case 'a': *t++ = '\07'; break;
  1149. X                case 'n': *t++ = '\n'; break;
  1150. X                case 'b': *t++ = '\010'; break;
  1151. X                case 't': *t++ = '\t'; break;
  1152. X                case 'v': *t++ = '\v'; break;
  1153. X                case 'f': *t++ = '\f'; break;
  1154. X                case 'r': *t++ = '\r'; break;
  1155. X                case 'e': *t++ = '\033'; break;
  1156. X                case 'M':
  1157. X                    if (s[1] == '-')
  1158. X                        s++;
  1159. X                    metanext = 2;
  1160. X                    break;
  1161. X                default:
  1162. X                    if (idigit(*s))
  1163. X                        {
  1164. X                        for (x = 0; idigit(*s); s++)
  1165. X                            x = x*8+(*s-'0');
  1166. X                        s--;
  1167. X                        *t++ = x;
  1168. X                        }
  1169. X                    else
  1170. X                        *t++ = *s;
  1171. X                    break;
  1172. X                }
  1173. X        else if (*s == '^')
  1174. X            if (*++s == '?')
  1175. X                *t++ = 0x7f;
  1176. X            else
  1177. X                *t++ = *s & 0x9f;
  1178. X        else
  1179. X            *t++ = *s;
  1180. X        if (metanext && !(--metanext))
  1181. X            {
  1182. X            t[-1] |= 0x80;
  1183. X            metanext = 0;
  1184. X            }
  1185. X        if (t > buf+500)
  1186. X            break;
  1187. X        first = 0;
  1188. X        }
  1189. X    *t = '\0';
  1190. X    *len = t-buf;
  1191. X    return buf;
  1192. X}
  1193. X
  1194. Xvoid printbind(s,len) /**/
  1195. Xchar *s;int len;
  1196. X{
  1197. Xint ch;
  1198. X
  1199. X    while (len--)
  1200. X        {
  1201. X        ch = (unsigned char) *s++;
  1202. X        if (ch & 0x80)
  1203. X            {
  1204. X            printf("\\M-");
  1205. X            ch &= 0x7f;
  1206. X            }
  1207. X        if (icntrl(ch))
  1208. X            switch(ch)
  1209. X                {
  1210. X                case 0x7f: printf("^?"); break;
  1211. X                default: printf("^%c",(ch|0x40)); break;
  1212. X                }
  1213. X        else
  1214. X            putchar(ch);
  1215. X        }
  1216. X}
  1217. X
  1218. Xvoid printbinding(str,k) /**/
  1219. Xchar *str;Key k;
  1220. X{
  1221. X    if (k->func == z_sequenceleadin)
  1222. X        return;
  1223. X    putchar('\"');
  1224. X    printbind(str,strlen(str));
  1225. X    printf("\"\t");
  1226. X    if (k->func == z_sendstring)
  1227. X        {
  1228. X        putchar('\"');
  1229. X        printbind(k->str,k->len);
  1230. X        printf("\"\n");
  1231. X        }
  1232. X    else
  1233. X        printf("%s\n",zlecmds[k->func].name);
  1234. X}
  1235. X
  1236. Xint bin_bindkey(name,argv,ops,junc) /**/
  1237. Xchar *name;char **argv;char *ops;int junc;
  1238. X{
  1239. Xint t0,len;
  1240. Xchar *s;
  1241. Xint func,*tab;
  1242. X
  1243. X    tab = (ops['a']) ? altbindtab : mainbindtab;
  1244. X    if (ops['v'] || ops['e'] || ops['d'])
  1245. X        {
  1246. X        if (*argv)
  1247. X            {
  1248. X            zerrnam(name,"too many arguments",NULL,0);
  1249. X            return 1;
  1250. X            }
  1251. X        if (ops['d'] || ops['e'])
  1252. X            if (ops['m'])
  1253. X                for (t0 = 0; t0 != 256; t0++)
  1254. X                    tab[t0] = emacsbind[t0];
  1255. X            else
  1256. X                {
  1257. X                for (t0 = 0; t0 != 128; t0++)
  1258. X                    tab[t0] = emacsbind[t0];
  1259. X                for (t0 = 128; t0 != 256; t0++)
  1260. X                    tab[t0] = z_selfinsert;
  1261. X                }
  1262. X        else
  1263. X            {
  1264. X            for (t0 = 0; t0 != 32; t0++)
  1265. X                mainbindtab[t0] = viinsbind[t0];
  1266. X            for (t0 = 32; t0 != 256; t0++)
  1267. X                mainbindtab[t0] = z_selfinsert;
  1268. X            mainbindtab[127] = z_backwarddeletechar;
  1269. X            }
  1270. X        for (t0 = 0; t0 != 128; t0++)
  1271. X            altbindtab[t0] = vicmdbind[t0];
  1272. X        for (t0 = 128; t0 != 256; t0++)
  1273. X            altbindtab[t0] = emacsbind[t0];
  1274. X        for (t0 = 0200; t0 != 0240; t0++)
  1275. X            tab[t0] = z_undefinedkey;
  1276. X        return 0;
  1277. X        }
  1278. X    if (!*argv)
  1279. X        {
  1280. X        char buf[2];
  1281. X        
  1282. X        buf[0] = 'x'; buf[1] = '\0';
  1283. X        for (t0 = 0; t0 != 256; t0++)
  1284. X            {
  1285. X            buf[0] = t0;
  1286. X            putchar('\"');
  1287. X            printbind(buf,1);
  1288. X            if (t0 < 254 && tab[t0] == tab[t0+1] && tab[t0] == tab[t0+2])
  1289. X                {
  1290. X                printf("\" to \"");
  1291. X                while (tab[t0] == tab[t0+1]) t0++;
  1292. X                buf[0] = t0;
  1293. X                printbind(buf,1);
  1294. X                }
  1295. X            printf("\"\t%s\n",zlecmds[tab[t0]].name);
  1296. X            }
  1297. X        listhtable(xbindtab,(HFunc) printbinding);
  1298. X        return 0;
  1299. X        }
  1300. X    while (*argv)
  1301. X        {
  1302. X        s = getkeystring(*argv++,&len);
  1303. X        if (len > 8)
  1304. X            {
  1305. X            zerrnam(name,"in-string too long",NULL,0);
  1306. X            return 1;
  1307. X            }
  1308. X        if (!*argv || ops['r'])
  1309. X            {
  1310. X            Key ky;
  1311. X
  1312. X            ky = gethnode(s,xbindtab);
  1313. X            if (len == 1)
  1314. X                func = tab[(unsigned char) *s];
  1315. X            else
  1316. X                func = (ky) ? ky->func : z_undefinedkey;
  1317. X            if (func == z_undefinedkey)
  1318. X                {
  1319. X                zerrnam(name,"in-string is not bound",NULL,0);
  1320. X                return 1;
  1321. X                }
  1322. X            if (ops['r'])
  1323. X                {
  1324. X                if (len == 1)
  1325. X                    tab[(unsigned char) *s] = z_undefinedkey;
  1326. X                else
  1327. X                    {
  1328. X                    while (strlen(s) > 1)
  1329. X                        {
  1330. X                        free(remhnode(s,xbindtab));
  1331. X                        s[strlen(s)-1] = '\0';
  1332. X                        }
  1333. X                    }
  1334. X                continue;
  1335. X                }
  1336. X            if (func == z_sendstring)
  1337. X                {
  1338. X                printbind(ky->str,ky->len);
  1339. X                putchar('\n');
  1340. X                return 0;
  1341. X                }
  1342. X            printf("%s\n",zlecmds[func].name);
  1343. X            return 0;
  1344. X            }
  1345. X        if (!ops['s'])
  1346. X            {
  1347. X            for (t0 = 0; t0 != ZLECMDCOUNT; t0++)
  1348. X                if (!strcmp(*argv,zlecmds[t0].name))
  1349. X                    break;
  1350. X            if (t0 == ZLECMDCOUNT)
  1351. X                {
  1352. X                zerr("undefined function: %s",*argv,0);
  1353. X                return 1;
  1354. X                }
  1355. X            func = t0;
  1356. X            }
  1357. X        else
  1358. X            func = z_sendstring;
  1359. X        if (len == 1)
  1360. X            {
  1361. X            Key ky;
  1362. X
  1363. X            tab[(unsigned char) *s] = (ops['s']) ? z_sendstring : t0;
  1364. X            if (ops['s'])
  1365. X                {
  1366. X                addhnode(ztrdup(s),ky = makefunckey(z_sendstring),xbindtab,freekey);
  1367. X                ky->str = ztrdup(getkeystring(*argv,&ky->len));
  1368. X                }
  1369. X            }
  1370. X        else
  1371. X            {
  1372. X            int t1;
  1373. X            Key ky;
  1374. X
  1375. X            if (tab[(unsigned char) *s] != z_undefinedkey &&
  1376. X                    tab[(unsigned char) *s] != z_sequenceleadin)
  1377. X                {
  1378. X                zerrnam(name,"in-string has already bound prefix",NULL,0);
  1379. X                return 1;
  1380. X                }
  1381. X            tab[(unsigned char) *s] = z_sequenceleadin;
  1382. X            if (!s[1])
  1383. X                s[1] = 0x80;
  1384. X            for (t1 = 1; t1 != len-1; t1++)
  1385. X                {
  1386. X                char sav;
  1387. X
  1388. X                sav = s[t1+1];
  1389. X                s[t1+1] = '\0';
  1390. X                ky = gethnode(s,xbindtab);
  1391. X                if (ky && ky->func != z_sequenceleadin)
  1392. X                    {
  1393. X                    zerrnam(name,"in-string has already bound prefix",NULL,0);
  1394. X                    return 1;
  1395. X                    }
  1396. X                if (!ky)
  1397. X                    addhnode(ztrdup(s),makefunckey(z_sequenceleadin),xbindtab,
  1398. X                        freekey);
  1399. X                if (!sav)
  1400. X                    sav = 0x80;
  1401. X                s[t1+1] = sav;
  1402. X                }
  1403. X            addhnode(ztrdup(s),ky = makefunckey(func),xbindtab,freekey);
  1404. X            if (ops['s'])
  1405. X                ky->str = ztrdup(getkeystring(*argv,&ky->len));
  1406. X            }
  1407. X        argv++;
  1408. X        }
  1409. X    return 0;
  1410. X}
  1411. X
  1412. Xvoid freekey(x) /**/
  1413. Xvptr x;
  1414. X{
  1415. XKey k = x;
  1416. X
  1417. X    if (k->str)
  1418. X        free(k->str);
  1419. X    free(k);
  1420. X}
  1421. X
  1422. X/* this is mostly stolen from bash's draino() */
  1423. X
  1424. Xvoid drainoutput() /**/
  1425. X{
  1426. Xint n = 0;
  1427. X
  1428. X    if (!baud) return;
  1429. X#ifdef TIOCOUTQ
  1430. X#ifdef HAS_SELECT
  1431. X    while ((ioctl(SHTTY,TIOCOUTQ,&n) >= 0) && n) {
  1432. X        struct timeval tv;
  1433. X        tv.tv_sec = n/baud;
  1434. X        tv.tv_usec = ((n%baud)*1000000)/baud;
  1435. X        select (0,(fd_set *)0,(fd_set *)0,(fd_set *)0,&tv);
  1436. X    }
  1437. X#endif
  1438. X#endif
  1439. X}
  1440. X
  1441. SHAR_EOF
  1442. chmod 0644 zsh2.2/src/zle_main.c ||
  1443. echo 'restore of zsh2.2/src/zle_main.c failed'
  1444. Wc_c="`wc -c < 'zsh2.2/src/zle_main.c'`"
  1445. test 14597 -eq "$Wc_c" ||
  1446.     echo 'zsh2.2/src/zle_main.c: original size 14597, current size' "$Wc_c"
  1447. rm -f _shar_wnt_.tmp
  1448. fi
  1449. # ============= zsh2.2/src/zle_refresh.c ==============
  1450. if test -f 'zsh2.2/src/zle_refresh.c' -a X"$1" != X"-c"; then
  1451.     echo 'x - skipping zsh2.2/src/zle_refresh.c (File already exists)'
  1452.     rm -f _shar_wnt_.tmp
  1453. else
  1454. > _shar_wnt_.tmp
  1455. echo 'x - extracting zsh2.2/src/zle_refresh.c (Text)'
  1456. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/zle_refresh.c' &&
  1457. X/*
  1458. X *
  1459. X * zle_refresh.c - screen update
  1460. X *
  1461. X * This file is part of zsh, the Z shell.
  1462. X *
  1463. X * This software is Copyright 1992 by Paul Falstad
  1464. X *
  1465. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  1466. X * use this software as long as: there is no monetary profit gained
  1467. X * specifically from the use or reproduction of this software, it is not
  1468. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  1469. X * included prominently in any copy made. 
  1470. X *
  1471. X * The author make no claims as to the fitness or correctness of this software
  1472. X * for any use whatsoever, and it is provided as is. Any use of this software
  1473. X * is at the user's own risk. 
  1474. X *
  1475. X */
  1476. X
  1477. X#define ZLE
  1478. X#include "zsh.h"
  1479. X
  1480. Xchar **obuf = NULL,**nbuf = NULL;
  1481. Xint olnct,nlnct;
  1482. Xint winw,winh,winpos;
  1483. X
  1484. Xint vcs,vln,vmaxln;
  1485. X
  1486. Xvoid resetvideo() /**/
  1487. X{
  1488. Xint ln;
  1489. Xstatic int lwinw = -1,lwinh = -1;
  1490. X
  1491. X    setterm();
  1492. X    winw = columns-1;
  1493. X    if (isset(SINGLELINEZLE) || !termok)
  1494. X        winh = 1;
  1495. X    else
  1496. X        winh = (lines < 2) ? 24 : lines;
  1497. X    winpos = vln = vmaxln = 0;
  1498. X    if (lwinw != winw || lwinh != winh)
  1499. X        {
  1500. X        if (nbuf)
  1501. X            {
  1502. X            for (ln = 0; ln != lwinh; ln++)
  1503. X                {
  1504. X                free(nbuf[ln]);
  1505. X                free(obuf[ln]);
  1506. X                }
  1507. X            free(nbuf);
  1508. X            free(obuf);
  1509. X            }
  1510. X        nbuf = (char **) zalloc((winh+1)*sizeof(char *));
  1511. X        obuf = (char **) zalloc((winh+1)*sizeof(char *));
  1512. X        for (ln = 0; ln != winh+1; ln++)
  1513. X            {
  1514. X            nbuf[ln] = zalloc(winw+1);
  1515. X            obuf[ln] = zalloc(winw+1);
  1516. X            }
  1517. X        lwinw = winw;
  1518. X        lwinh = winh;
  1519. X        }
  1520. X    for (ln = 0; ln != winh+1; ln++)
  1521. X        {
  1522. X        *nbuf[ln] = '\0';
  1523. X        *obuf[ln] = '\0';
  1524. X        }
  1525. X    if (!pptlen)
  1526. X        nbuf[0][0] = obuf[0][0] = '\0';
  1527. X    else
  1528. X        {
  1529. X        for (ln = 0; ln != pptlen-1; ln++)
  1530. X            nbuf[0][ln] = obuf[0][ln] = ' ';
  1531. X        nbuf[0][ln] = obuf[0][ln] = '>';
  1532. X        nbuf[0][pptlen] = obuf[0][pptlen] = '\0';
  1533. X        }
  1534. X    vcs = pptlen;
  1535. X    olnct = nlnct = 1;
  1536. X}
  1537. X
  1538. Xint scrollwindow() /**/
  1539. X{
  1540. Xint t0,hwinh = winh/2;
  1541. X
  1542. X    for (t0 = 0; t0 != winh-hwinh; t0++)
  1543. X        {
  1544. X        char *s;
  1545. X
  1546. X        s = nbuf[t0];
  1547. X        nbuf[t0] = nbuf[t0+hwinh];
  1548. X        nbuf[t0+hwinh] = s;
  1549. X        }
  1550. X    for (t0 = 0; t0 != pptlen-1; t0++)
  1551. X        nbuf[0][t0] = ' ';
  1552. X    strcpy(nbuf[0]+t0,"> ...");
  1553. X    return winh-hwinh;
  1554. X}
  1555. X
  1556. X/* this is the messy part. */
  1557. X/* this define belongs where it's used!!! */
  1558. X
  1559. X#define nextline { *s = (unsigned char)'\0'; \
  1560. X    if (winh == ln+1) if (nvln != -1) break; else ln = scrollwindow()-1; \
  1561. X    s = (unsigned char *)nbuf[++ln]; sen = s+winw; \
  1562. X    }
  1563. X
  1564. Xvoid refresh() /**/
  1565. X{
  1566. Xunsigned char *s,*t,*sen,*scs = line+cs; char **qbuf;
  1567. Xint ln = 0,nvcs,nvln = -1,t0;
  1568. X
  1569. X    cost = 0;
  1570. X    if (resetneeded)
  1571. X        {
  1572. X        resetvideo();
  1573. X        resetneeded = 0;
  1574. X        if (isset(SINGLELINEZLE) || !termok)
  1575. X            vcs = 0;
  1576. X        else
  1577. X            printf("%s",pmpt);
  1578. X        }
  1579. X    zleactive = 1;
  1580. X    if (isset(SINGLELINEZLE) || !termok)
  1581. X        {
  1582. X        singlerefresh();
  1583. X        return;
  1584. X        }
  1585. X
  1586. X/* first, we generate the video line buffers so we know what to
  1587. X    put on the screen. 
  1588. X
  1589. X    s = ptr into the video buffer.
  1590. X    t = ptr into the real buffer.
  1591. X    sen = end of the video buffer (eol)
  1592. X*/
  1593. X
  1594. X    s = (unsigned char *)(nbuf[ln = 0]+pptlen);
  1595. X    t = line;
  1596. X    sen = (unsigned char *)(*nbuf+winw);
  1597. X    for (; *t; t++)
  1598. X        {
  1599. X        if (icntrl((char)*t))
  1600. X            if (*t == '\n')
  1601. X                {
  1602. X                if (t == scs)
  1603. X                    {
  1604. X                    nvcs = (char *)s-nbuf[nvln = ln];
  1605. X                    scs = (unsigned char *)NULL;
  1606. X                    }
  1607. X                nextline
  1608. X                }
  1609. X            else if ((char)*t == '\t')
  1610. X                {
  1611. X                int t1 = (char *)s-nbuf[ln];
  1612. X
  1613. X                if ((t1|7)+1 >= winw) nextline
  1614. X                else
  1615. X                    do
  1616. X                        *s++ = ' ';
  1617. X                    while ((++t1) & 7);
  1618. X                }
  1619. X            else
  1620. X                {
  1621. X                if (s == sen) nextline
  1622. X                *s++ = '^';
  1623. X                if (s == sen) nextline
  1624. X                *s++ = (*t == 127) ? '?' : (*t | '@');
  1625. X                }
  1626. X        else
  1627. X            {
  1628. X            if (s == sen) nextline
  1629. X            *s++ = *t;
  1630. X            }
  1631. X/* if the cursor is here, remember it */
  1632. X
  1633. X        if (t == scs)
  1634. X            nvcs = s-(unsigned char *)nbuf[nvln = ln]-1;
  1635. X        }
  1636. X    if (scs == t)
  1637. X        nvcs = s-(unsigned char *)nbuf[nvln = ln];
  1638. X    *s = '\0';
  1639. X    nlnct = ln+1;
  1640. X    if (statusline)
  1641. X        strcpy(nbuf[(nlnct == winh) ? winh-1 : nlnct++],statusline);
  1642. X
  1643. X/* do RPROMPT */
  1644. X
  1645. X    if (pmpt2 && ln == 0 && strlen(nbuf[0])+strlen(pmpt2) < winw)
  1646. X        {
  1647. X        for (t0 = strlen(nbuf[0]); t0 != winw; t0++)
  1648. X            nbuf[0][t0] = ' ';
  1649. X        strcpy(nbuf[0]+winw-strlen(pmpt2),pmpt2);
  1650. X        }
  1651. X    for (ln = 0; ln < nlnct; ln++)
  1652. X        {
  1653. X
  1654. X/* if old line and new line are different,
  1655. X    see if we can insert/delete a line */
  1656. X
  1657. X        if (ln < olnct && strncmp(nbuf[ln],obuf[ln],16))
  1658. X            {
  1659. X            if (tccan(TCDELLINE) && !strncmp(nbuf[ln],obuf[ln+1],16)
  1660. X                    && obuf[ln+1][0] && ln != olnct)
  1661. X                {
  1662. X                int t0;
  1663. X
  1664. X                moveto(ln,0);
  1665. X                tcout(TCDELLINE);
  1666. X                for (t0 = ln; t0 != olnct; t0++)
  1667. X                    strcpy(obuf[t0],obuf[t0+1]);
  1668. X                olnct--;
  1669. X                }
  1670. X
  1671. X/* don't try to insert a line if olnct < vmaxln (vmaxln is the number
  1672. X    of lines that have been displayed by this routine) so that we don't
  1673. X    go off the end of the screen. */
  1674. X
  1675. X            else if (tccan(TCINSLINE) && !strncmp(nbuf[ln+1],obuf[ln],16) &&
  1676. X                    olnct < vmaxln && nbuf[ln+1][0] && ln != olnct)
  1677. X                {
  1678. X                int t0;
  1679. X
  1680. X                moveto(ln,0);
  1681. X                tcout(TCINSLINE);
  1682. X                for (t0 = olnct; t0 != ln; t0--)
  1683. X                    strcpy(obuf[t0],obuf[t0-1]);
  1684. X                *obuf[ln] = '\0';
  1685. X                olnct++;
  1686. X                }
  1687. X            }
  1688. X        refreshline(ln);
  1689. X        }
  1690. X
  1691. X/* if old buffer had extra lines, do a clear-end-of-display if we can,
  1692. X    otherwise, just fill new buffer with blank lines and refresh them */
  1693. X
  1694. X    if (olnct > nlnct)
  1695. X        {
  1696. X        for (ln = nlnct; ln < olnct; ln++)
  1697. X            nbuf[ln][0] = '\0';
  1698. X        if (tccan(TCCLEAREOD))
  1699. X            {
  1700. X            moveto(nlnct,0);
  1701. X            tcout(TCCLEAREOD);
  1702. X            }
  1703. X        else
  1704. X            for (ln = nlnct; ln < olnct; ln++)
  1705. X                refreshline(ln);
  1706. X        }
  1707. X
  1708. X/* move to the new cursor position */
  1709. X
  1710. X    moveto(nvln,nvcs);
  1711. X    qbuf = nbuf;
  1712. X    nbuf = obuf;
  1713. X    obuf = qbuf;
  1714. X    olnct = nlnct;
  1715. X    if (nlnct > vmaxln)
  1716. X        vmaxln = nlnct;
  1717. X    fflush(stdout);
  1718. X}
  1719. X
  1720. X#define tcinscost(X) (tccan(TCMULTINS) ? tclen[TCMULTINS] : (X)*tclen[TCINS])
  1721. X#define tcdelcost(X) (tccan(TCMULTDEL) ? tclen[TCMULTDEL] : (X)*tclen[TCDEL])
  1722. X#define tc_delchars(X) tcmultout(TCDEL,TCMULTDEL,(X))
  1723. X#define tc_inschars(X) tcmultout(TCINS,TCMULTINS,(X))
  1724. X#define tc_upcurs(X) tcmultout(TCUP,TCMULTUP,(X))
  1725. X#define tc_leftcurs(X) tcmultout(TCLEFT,TCMULTLEFT,(X))
  1726. X
  1727. Xvoid refreshline(ln) /**/
  1728. Xint ln;
  1729. X{
  1730. Xchar *nl = nbuf[ln],*ol = obuf[ln];
  1731. Xchar *p1;
  1732. Xchar junk,*truncptr = &junk;
  1733. Xint ccs = 0;
  1734. X
  1735. X    if (ln >= olnct)
  1736. X        *ol = '\0';
  1737. X    for (;;)
  1738. X        {
  1739. X        while (*nl && *nl == *ol)
  1740. X            {
  1741. X            nl++,ol++,ccs++;
  1742. X            }
  1743. X        if (!*nl && !*ol)
  1744. X            { *truncptr = '\0'; return; }
  1745. X
  1746. X/* if this is the end of the new buffer but the old buffer has stuff
  1747. X    here, clear to end of line if we can, otherwise fill the new buffer
  1748. X    with blanks and continue. */
  1749. X
  1750. X        if (!*nl)
  1751. X            {
  1752. X            if (tccan(TCCLEAREOL) && strlen(ol) > tclen[TCCLEAREOL])
  1753. X                {
  1754. X                moveto(ln,ccs);
  1755. X                tcout(TCCLEAREOL);
  1756. X                *ol = '\0';
  1757. X                *truncptr = '\0';
  1758. X                return;
  1759. X                }
  1760. X            else
  1761. X                {
  1762. X                int x = strlen(ol);
  1763. X                char *p = nl;
  1764. X
  1765. X                truncptr = p;
  1766. X                while (x--)
  1767. X                    *p++ = ' ';
  1768. X                *p = '\0';
  1769. X                continue;
  1770. X                }
  1771. X            }
  1772. X
  1773. X/* if this is the end of the old buffer, just dump the rest of the
  1774. X    new buffer. */
  1775. X
  1776. X        if (!*ol)
  1777. X            {
  1778. X            while (*nl == ' ')
  1779. X                nl++,ccs++;
  1780. X            if (*nl)
  1781. X                {
  1782. X                moveto(ln,ccs);
  1783. X                fwrite(nl,strlen(nl),1,stdout);
  1784. X                cost += strlen(nl);
  1785. X                ccs = (vcs += strlen(nl));
  1786. X                }
  1787. X            *truncptr = 0;
  1788. X            return;
  1789. X            }
  1790. X        moveto(ln,ccs);
  1791. X
  1792. X/* try to insert/delete characters */
  1793. X
  1794. X        if (ol[1] != nl[1] && tccan(TCDEL))
  1795. X            {
  1796. X            int ct = 0;
  1797. X
  1798. X            for (p1 = ol; *p1; p1++,ct++)
  1799. X                if (tcdelcost(ct) < streqct(p1,nl))
  1800. X                    {
  1801. X                    tc_delchars(ct);
  1802. X                    ol = p1;
  1803. X                    break;
  1804. X                    }
  1805. X            if (*p1)
  1806. X                continue;
  1807. X            }
  1808. X
  1809. X        if (ol[1] != nl[1] && tccan(TCINS))
  1810. X            {
  1811. X            int ct = 0;
  1812. X
  1813. X            for (p1 = nl; *p1; p1++,ct++)
  1814. X                if (tcinscost(ct) < streqct(p1,ol)+ct)
  1815. X                    {
  1816. X#if 0
  1817. X/* make sure we aren't inserting characters off the end of the screen;
  1818. X    if we are, jump to the end and truncate the line, if we can do
  1819. X    it quickly (gee, clever idea, Paul!) */
  1820. X                    if (ct+ccs+strlen(ol) >= winw-1)
  1821. X                        {
  1822. X                        if (!tccan(TCMULTRIGHT) || ccs > winw-tclen[TCMULTRIGHT])
  1823. X                            continue;
  1824. X                        moveto(ln,winw-1-ct);
  1825. X                        if (!tccan(TCCLEAREOL) || ct < tclen[TCCLEAREOL])
  1826. X                            {
  1827. X                            int x = ct;
  1828. X
  1829. X                            while (vcs++,x--)
  1830. X                                putchar(' ');
  1831. X                            }
  1832. X                        else
  1833. X                            tcout(TCCLEAREOL);
  1834. X                        moveto(ln,ccs);
  1835. X                        }
  1836. X#endif
  1837. X                    if (ct+ccs+strlen(ol) < winw-1)
  1838. X                        {
  1839. X                        tc_inschars(ct = p1-nl);
  1840. X                        ccs = (vcs += p1-nl);
  1841. X                        cost += ct;
  1842. X                        fwrite(nl,ct,1,stdout);
  1843. X                        nl += ct;
  1844. X                        break;
  1845. X                        }
  1846. X                    }
  1847. X            if (*p1)
  1848. X                continue;
  1849. X            }
  1850. X
  1851. X/* if we can't do anything fancy, just write the new character and
  1852. X    keep going. */
  1853. X
  1854. X        putchar(*nl);
  1855. X        cost++;
  1856. X        nl++,ol++,ccs = ++vcs;
  1857. X        }
  1858. X}
  1859. X
  1860. Xvoid moveto(ln,cl) /**/
  1861. Xint ln;int cl;
  1862. X{
  1863. X
  1864. X/* move up */
  1865. X
  1866. X    if (ln < vln)
  1867. X        {
  1868. X        tc_upcurs(vln-ln);
  1869. X        vln = ln;
  1870. X        }
  1871. X
  1872. X/* move down; if we might go off the end of the screen, use newlines
  1873. X    instead of TCDOWN */
  1874. X
  1875. X    while (ln > vln)
  1876. X        if (cl < (vcs/2) || ln >= vmaxln || !tccan(TCLEFT))
  1877. X            {
  1878. X            putchar('\r');
  1879. X            putchar('\n');
  1880. X            cost+=2;
  1881. X            vln++;
  1882. X            vcs = 0;
  1883. X            }
  1884. X        else
  1885. X            {
  1886. X            tc_downcurs(ln-vln);
  1887. X            vln = ln;
  1888. X            }
  1889. X    if (cl < (vcs/2) || !tccan(TCLEFT))
  1890. X        {
  1891. X        putchar('\r');
  1892. X        cost++;
  1893. X        vcs = 0;
  1894. X        }
  1895. X    if (vcs < cl)
  1896. X        tc_rightcurs(cl-vcs);
  1897. X    else if (vcs > cl)
  1898. X        tc_leftcurs(vcs-cl);
  1899. X    vcs = cl;
  1900. X}
  1901. X
  1902. Xvoid tcmultout(cap,multcap,ct) /**/
  1903. Xint cap;int multcap;int ct;
  1904. X{
  1905. X    if (tccan(multcap) && (!tccan(cap) || tclen[multcap] < tclen[cap]*ct))
  1906. X        tcoutarg(multcap,ct);
  1907. X    else while (ct--)
  1908. X        tcout(cap);
  1909. X}
  1910. X
  1911. Xvoid tc_rightcurs(ct) /**/
  1912. Xint ct;
  1913. X{
  1914. X
  1915. X/* do a multright if it's cheaper or if we're walking over the prompt.  */
  1916. X
  1917. X    if (tccan(TCMULTRIGHT) &&
  1918. X            (ct > tclen[TCMULTRIGHT] || vln == 0 && vcs < pptlen))
  1919. X        tcoutarg(TCMULTRIGHT,ct);
  1920. X
  1921. X/* if we're walking over the prompt and we can do a bunch of cursor rights,
  1922. X    do them, even though they're more expensive.  (We can't redraw the
  1923. X    prompt very easily in general.)  */
  1924. X
  1925. X    else if (vln == 0 && vcs < pptlen && tccan(TCRIGHT))
  1926. X        while (ct--)
  1927. X            tcout(TCRIGHT);
  1928. X
  1929. X/* otherwise write the contents of the video buffer. */
  1930. X
  1931. X    else
  1932. X        fwrite(nbuf[vln]+vcs,ct,1,stdout);
  1933. X}
  1934. X
  1935. Xvoid tc_downcurs(ct) /**/
  1936. Xint ct;
  1937. X{
  1938. X    if (tccan(TCMULTDOWN) &&
  1939. X            (!tccan(TCDOWN) || tclen[TCMULTDOWN] < tclen[TCDOWN]*ct))
  1940. X        tcoutarg(TCMULTDOWN,ct);
  1941. X    else if (tccan(TCDOWN))
  1942. X        while (ct--)
  1943. X            tcout(TCDOWN);
  1944. X    else
  1945. X        {
  1946. X        while (ct--)
  1947. X            putchar('\n');
  1948. X        vcs = 0;
  1949. X        }
  1950. X}
  1951. X
  1952. X/* I'm NOT going to worry about padding unless anyone complains. */
  1953. X
  1954. Xvoid tcout(cap) /**/
  1955. Xint cap;
  1956. X{
  1957. X    tputs(tcstr[cap],1,putraw);
  1958. X}
  1959. X
  1960. Xvoid tcoutarg(cap,arg) /**/
  1961. Xint cap;int arg;
  1962. X{
  1963. X    tputs(tgoto(tcstr[cap],arg,arg),1,putraw);
  1964. X}
  1965. X
  1966. Xvoid clearscreen() /**/
  1967. X{
  1968. X    tcout(TCCLEARSCREEN);
  1969. X    resetneeded = 1;
  1970. X}
  1971. X
  1972. Xvoid redisplay() /**/
  1973. X{
  1974. X    trashzle();
  1975. X}
  1976. X
  1977. Xvoid trashzle() /**/
  1978. X{
  1979. X    if (zleactive)
  1980. X        {
  1981. X        refresh();
  1982. X        moveto(nlnct,0);
  1983. X        printf("%s",postedit);
  1984. X        fflush(stdout);
  1985. X        unsetterm();
  1986. X        resetneeded = 1;
  1987. X        }
  1988. X}
  1989. X
  1990. Xvoid singlerefresh() /**/
  1991. X{
  1992. Xchar *vbuf,*vp,**qbuf,*op;
  1993. Xint t0,vsiz,nvcs;
  1994. X
  1995. X    for (vsiz = 1+pptlen, t0 = 0; t0 != ll; t0++,vsiz++)
  1996. X        if (line[t0] == '\t')
  1997. X            vsiz += 7;
  1998. X        else if (icntrl(line[t0]))
  1999. X            vsiz++;
  2000. X    vbuf = zalloc(vsiz);
  2001. X    strcpy(vbuf,pmpt);
  2002. X    vp = vbuf+pptlen;
  2003. X    for (t0 = 0; t0 != ll; t0++)
  2004. X        {
  2005. X        if (line[t0] == '\t')
  2006. X            do
  2007. X                *vp++ = ' ';
  2008. X            while ((vp-vbuf) & 7);
  2009. X        else if (line[t0] == '\n')
  2010. X            {
  2011. X            *vp++ = '\\';
  2012. X            *vp++ = 'n';
  2013. X            }
  2014. X        else if (line[t0] == 0x7f)
  2015. X            {
  2016. X            *vp++ = '^';
  2017. X            *vp++ = '?';
  2018. X            }
  2019. X        else if (icntrl(line[t0]))
  2020. X            {
  2021. X            *vp++ = '^';
  2022. X            *vp++ = line[t0] | '@';
  2023. X            }
  2024. X        else
  2025. X            *vp++ = line[t0];
  2026. X        if (t0 == cs)
  2027. X            nvcs = vp-vbuf-1;
  2028. X        }
  2029. X    if (t0 == cs)
  2030. X        nvcs = vp-vbuf;
  2031. X    *vp = '\0';
  2032. X    if ((winpos && nvcs < winpos+1) || (nvcs > winpos+winw-1))
  2033. X        {
  2034. X        if ((winpos = nvcs-(winw/2)) < 0)
  2035. X            winpos = 0;
  2036. X        }
  2037. X    if (winpos)
  2038. X        vbuf[winpos] = '<';
  2039. X    if (strlen(vbuf+winpos) > winw)
  2040. X        {
  2041. X        vbuf[winpos+winw-1] = '>';
  2042. X        vbuf[winpos+winw] = '\0';
  2043. X        }
  2044. X    strcpy(nbuf[0],vbuf+winpos);
  2045. X    free(vbuf);
  2046. X    nvcs -= winpos;
  2047. X    for (t0 = 0,vp = *nbuf,op = *obuf; *vp; t0++,vp++)
  2048. X        {
  2049. X        if (*vp != *op && !(*vp == ' ' && !*op))
  2050. X            {
  2051. X            singmoveto(t0);
  2052. X            putchar(*vp);
  2053. X            vcs++;
  2054. X            }
  2055. X        if (*op)
  2056. X            op++;
  2057. X        }
  2058. X    if (*op)
  2059. X        {
  2060. X        singmoveto(t0);
  2061. X        for (; *op; op++)
  2062. X            {
  2063. X            putchar(' ');
  2064. X            vcs++;
  2065. X            }
  2066. X        }
  2067. X    singmoveto(nvcs);
  2068. X    qbuf = nbuf;
  2069. X    nbuf = obuf;
  2070. X    obuf = qbuf;
  2071. X    fflush(stdout);
  2072. X}
  2073. X
  2074. Xvoid singmoveto(pos) /**/
  2075. Xint pos;
  2076. X{
  2077. X    while (pos < vcs)
  2078. X        {
  2079. X        vcs--;
  2080. X        putchar('\b');
  2081. X        }
  2082. X    while (pos > vcs)
  2083. X        {
  2084. X        putchar(nbuf[0][vcs]);
  2085. X        vcs++;
  2086. X        }
  2087. X}
  2088. X
  2089. Xint streqct(s,t) /**/
  2090. Xchar *s;char *t;
  2091. X{
  2092. Xint ct = 0;
  2093. X
  2094. X    while (*s && *s == *t) s++,t++,ct++;
  2095. SHAR_EOF
  2096. true || echo 'restore of zsh2.2/src/zle_refresh.c failed'
  2097. fi
  2098. echo 'End of zsh2.2 part 13'
  2099. echo 'File zsh2.2/src/zle_refresh.c is continued in part 14'
  2100. echo 14 > _shar_seq_.tmp
  2101. exit 0
  2102.  
  2103. exit 0 # Just in case...
  2104.