diff options
| author | Karl Heuer | 1995-07-07 20:01:01 +0000 |
|---|---|---|
| committer | Karl Heuer | 1995-07-07 20:01:01 +0000 |
| commit | e6b7241010c01a7c802d594cea0b4fbbb6d66e7c (patch) | |
| tree | 337d6214a11e58c87fbfc353ac13893f5cb82105 | |
| parent | 133693bc904830ab88908d7f9806326543264f24 (diff) | |
| download | emacs-e6b7241010c01a7c802d594cea0b4fbbb6d66e7c.tar.gz emacs-e6b7241010c01a7c802d594cea0b4fbbb6d66e7c.zip | |
Symbols renamed to be like mode-line indicator.
Supposed to now also work for Lucid.
(2C-mode-map): New name for `tc-mode-map'. Additionally bound to [f2].
(2C-minor-mode-map) New variable.
(2C-mode): New name for `tc-other'.
(2C-mode-line-format): New name for `tc-mode-line-format'.
(2C-other-buffer-hook): New variable.
(2C-separator): New name for `tc-separator'.
(2C-window-width): New name for `tc-window-width'.
(2C-beyond-fill-column): New name for `tc-beyond-fill-column'.
(2C-autoscroll, 2C-autoscroll-start): New variables.
(2C-other): New name for `tc-other'.
(2C-mode): New name for `tc-mode', `tc-two-columns'.
(2C-two-columns): New function.
(2C-associate-buffer): New name for `tc-associate-buffer'.
(2C-split): New name for `tc-split'.
(2C-dissociate): New name for `tc-dissociate'.
(2C-merge): New name for `tc-merge'.
(2C-associated-buffer): New name for `tc-associated-buffer'.
(2C-toggle-autoscroll, 2C-autoscroll): New functions.
(tc-scroll-line, tc-scroll-up, tc-scroll-down, tc-recenter): Deleted
functions.
| -rw-r--r-- | lisp/textmodes/two-column.el | 829 |
1 files changed, 417 insertions, 412 deletions
diff --git a/lisp/textmodes/two-column.el b/lisp/textmodes/two-column.el index 871eaae015c..7ca3b71a1d7 100644 --- a/lisp/textmodes/two-column.el +++ b/lisp/textmodes/two-column.el | |||
| @@ -1,407 +1,401 @@ | |||
| 1 | ;;; two-column.el --- minor mode for editing of two-column text | 1 | ;;; two-column.el --- minor mode for editing of two-column text |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 1992, 1994 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | ;; Author: Daniel Pfeiffer <pfeiffer@cix.cict.fr> | 5 | ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389 |
| 6 | ;; Adapted-By: ESR | 6 | ;; Adapted-By: ESR, Daniel Pfeiffer |
| 7 | 7 | ||
| 8 | ;; This file is part of GNU Emacs. | 8 | ;; Esperanto: English: |
| 9 | 9 | ||
| 10 | ;; GNU Emacs is free software; you can redistribute it and/or modify | 10 | ;; ^Ci dosiero estas ero de GNU Emacs. This file is part of GNU Emacs. |
| 11 | ;; it under the terms of the GNU General Public License as published by | 11 | |
| 12 | ;; the Free Software Foundation; either version 2, or (at your option) | 12 | ;; GNU Emacs estas libera programaro; GNU Emacs is free software; you can |
| 13 | ;; any later version. | 13 | ;; vi povas disdoni ^gin kaj/a^u modifi redistribute it and/or modify it |
| 14 | 14 | ;; ^gin sub la kondi^coj de la GNU under the terms of the GNU General | |
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, | 15 | ;; ^Generala Publika Licenco kiel pub- Public License as published by the |
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 | ;; likigita far la Liberprogramara Fon- Free Software Foundation; either |
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 17 | ;; da^jo; a^u eldono 2a, a^u (la^u via version 2, or (at your option) any |
| 18 | ;; GNU General Public License for more details. | 18 | ;; elekto) ajna posta eldono. later version. |
| 19 | 19 | ||
| 20 | ;; You should have received a copy of the GNU General Public License | 20 | ;; GNU Emacs estas disdonata en la GNU Emacs is distributed in the hope |
| 21 | ;; along with GNU Emacs; see the file COPYING. If not, write to | 21 | ;; espero ke ^gi estos utila, sed SEN that it will be useful, but WITHOUT |
| 22 | ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 22 | ;; IA GARANTIO; sen e^c la implicita ANY WARRANTY; without even the |
| 23 | 23 | ;; garantio de VENDEBLECO a^u PRETECO implied warranty of MERCHANTABILITY | |
| 24 | ;;; Commentary: | 24 | ;; POR DETERMINITA CELO. Vidu la GNU or FITNESS FOR A PARTICULAR PURPOSE. |
| 25 | 25 | ;; ^Generala Publika Licenco por plenaj See the GNU General Public License | |
| 26 | ;; This package gives you the ability to edit text in a two-column format. | 26 | ;; detaloj. for more details. |
| 27 | 27 | ||
| 28 | ;; --8<---- two-column.el ----8<--------8<--------8<--------8<--------8<------- | 28 | ;; Vi devus ricevinti kopion de la GNU You should have received a copy of |
| 29 | ;; Esperanto: English: | 29 | ;; ^Generala Publika Licenco kune kun the GNU General Public License along |
| 30 | 30 | ;; GNU Emacs; vidu la dosieron COPYING. with GNU Emacs; see the file | |
| 31 | ;; Minora modalo por samtempa dukolumna Minor mode for simultaneous | 31 | ;; Alikaze skribu al la COPYING. If not, write to the |
| 32 | ;; tajpado two-column editing | 32 | |
| 33 | 33 | ;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 34 | ;; Tiu minora modalo ebligas al vi This minor mode allows you to | 34 | |
| 35 | ;; tajpi sendepende en du apudaj independently edit two adjacent | 35 | |
| 36 | ;; bufroj. Vi havas tri eblecojn por buffers. You have three ways to | 36 | ;;; Komentario: Commentary: |
| 37 | ;; eki ^gin. ^Ciu donas al vi start it up. Each gives you a | 37 | |
| 38 | ;; horizontale disigatan fenestron, horizontally split window similar to | 38 | ;; Tiu programaro ebligas vin redakti This package gives you the ability |
| 39 | ;; simila al fina apareco de via the final outcome of your text: | 39 | ;; dukolumnan tekston. to edit text in a two-column format. |
| 40 | ;; teksto: | 40 | |
| 41 | 41 | ||
| 42 | ;; C-x 6 2 asocias novan bufron nomatan associates a new buffer called | 42 | ;; Vi havas tri eblecojn por eki tiun You have three ways to start up this |
| 43 | ;; same, sed kun 2C/ anta^u. the same, but with 2C/ | 43 | ;; mal^cefan modalon. ^Ciu donas al vi minor mode. Each gives you a |
| 44 | ;; prepended. | 44 | ;; horizontale disigatan fenestron, si- horizontally split window similar to |
| 45 | 45 | ;; milan al fina apareco de via teksto: the final outcome of your text: | |
| 46 | ;; C-x 6 b asocias alian bufron. Vi povas associates another buffer. | 46 | |
| 47 | ;; anka^u asocii dataron, se vi This can be used to associate a | 47 | |
| 48 | ;; ^jus anta^ue faris C-x C-f. file if you just did C-x C-f. | 48 | ;; f2 2 asocias novan bufron nomatan associates a new buffer called |
| 49 | 49 | ;; C-x 6 2 same, sed kun 2C/ anta^u. the same, but with 2C/ | |
| 50 | ;; C-x 6 u disigas jam dukolumnan tekston unmerges a two-column text into | 50 | ;; prepended. |
| 51 | ;; en du bufroj ekde la nuna two buffers from the current | 51 | |
| 52 | ;; linio, kaj je la nuna kolumno. line and at the current column. | 52 | ;; f2 b asocias alian bufron. Vi povas associates another buffer. |
| 53 | ;; La anta^uaj signoj (ofte The preceding characters (often | 53 | ;; C-x 6 b anka^u asocii dataron, se vi This can be used to associate a |
| 54 | ;; tabeligilo a^u |) estas la tab or |) are the column | 54 | ;; ^jus anta^ue faris C-x C-f. file if you just did C-x C-f. |
| 55 | ;; kolumna disiganto. Linioj kiuj separator. Lines that don't | 55 | |
| 56 | ;; ne enhavas ilin ne estas have them won't be separated. | 56 | ;; f2 s disigas jam dukolumnan tekston splits a two-column text into |
| 57 | ;; disigitaj. Kiel la kvara kaj Like the fourth and fifth line | 57 | ;; C-x 6 s en du bufroj ekde la nuna two buffers from the current |
| 58 | ;; la kvina linio se vi disigas if you unmerge this file from | 58 | ;; linio, kaj je la nuna kolumno. line and at the current column. |
| 59 | ;; ^ci dataron ekde la unua angla the first english word. | 59 | ;; La anta^uaj signoj (ofte The preceding characters (often |
| 60 | ;; vorto. | 60 | ;; tabeligilo a^u |) estas la tab or |) are the column |
| 61 | 61 | ;; kolumna disiganto. Linioj kiuj separator. Lines that don't | |
| 62 | ;; Je ^cia flanko estas bufro, kiu On each side is a buffer that knows | 62 | ;; ne enhavas ilin ne estas have them won't be separated. |
| 63 | ;; konas la alian. Kun la ordonoj C-x about the other. With the commands | 63 | ;; disigitaj. Kiel la kvara kaj Like the fourth and fifth line |
| 64 | ;; 6 SPC, C-x 6 DEL kaj C-x 6 RET oni C-x 6 SPC, C-x 6 DEL and C-x 6 RET | 64 | ;; la kvina linio se vi disigas if you split this file from |
| 65 | ;; povas suben- a^u supreniri unu you can simultaneously scroll up or | 65 | ;; ^ci dataron ekde la unua angla the first english word. |
| 66 | ;; ekranon, kaj subeniri linion, down by a screenfull and by a line | 66 | ;; vorto. |
| 67 | ;; samtempe en la du bufroj. Al la alia in both buffers. Empty lines are | 67 | |
| 68 | ;; bufro estas aldonataj linioj se added to the other buffer if | 68 | ;; Se vi volas meti longajn liniojn If you include long lines, i.e which |
| 69 | ;; necesas, por ke vi vidu la saman necessary, so that you see the same | 69 | ;; (ekz. programerojn) en la kunigotan will span both columns (eg. source |
| 70 | ;; parton. Per C-x 6 C-l vi povas part. With C-x 6 C-l you can | 70 | ;; tekston, ili devas esti en la code), they should be in what will |
| 71 | ;; recentrigi la linion. Kiam vi nur recenter the line. When you only | 71 | ;; estonte unua kolumno. La alia devas be the first column, with the |
| 72 | ;; plu havas unu el la du bufroj have one of the two buffers onscreen | 72 | ;; havi vakajn linion apud ili. associated buffer having empty lines |
| 73 | ;; surekrane vi revidos la alian per you can get the other back with C-x | 73 | ;; next to them. |
| 74 | ;; denove C-x 6 2. 6 2 once more. | 74 | |
| 75 | 75 | ;; Averto: en Emacs kiam vi ^san^gas la Attention: in Emacs when you change | |
| 76 | ;; Se vi volas meti longajn liniojn If you include long lines, i.e which | 76 | ;; ^cefan modalon, la mal^cefaj modaloj the major mode, the minor modes are |
| 77 | ;; (ekz. programerojn) en la kunigotan will span both columns (eg. source | 77 | ;; estas anka^u elmemorigitaj. Tiu- also purged from memory. In that |
| 78 | ;; tekston, ili devas esti en la code), they should be in what will | 78 | ;; okaze vi devas religi la du bufrojn case you must reassociate the two |
| 79 | ;; estonte unua kolumno. La alia devas be the first column, with the | 79 | ;; per iu C-x 6-ordono, ekz. C-x 6 b. buffers with any C-x 6-command, e.g. |
| 80 | ;; havi malplenajn linion apud ili. associated buffer having empty lines | 80 | ;; C-x 6 b. |
| 81 | ;; next to them. | 81 | |
| 82 | 82 | ;; Kiam vi estos kontenta de la When you have edited both buffers to | |
| 83 | ;; Averto: en Emacs kiam vi ^san^gas la Attention: in Emacs when you change | 83 | ;; rezulto, vi kunmetos la du kolumnojn your content, you merge them with |
| 84 | ;; ma^joran modalon, la minoraj modaloj the major mode, the minor modes are | 84 | ;; per C-x 6 1. Se vi poste vidas C-x 6 1. If you then see a problem, |
| 85 | ;; estas anka^u elmemorigitaj. Tiu- also purged from memory. In that | 85 | ;; problemon, vi neniigu la kunmeton you undo the merge with C-x u and |
| 86 | ;; okaze vi devas religi la du bufrojn case you must reassociate the two | 86 | ;; per C-x u kaj plue modifu la du continue to edit the two buffers. |
| 87 | ;; per iu C-x 6-ordono, ekz. C-x 6 b. buffers with any C-x 6-command, e.g. | 87 | ;; bufrojn. Kiam vi ne plu volas tajpi When you no longer want to edit in |
| 88 | ;; C-x 6 b. | 88 | ;; dukolumne, vi eliru el la mal^cefa two columns, you turn off the minor |
| 89 | 89 | ;; modalo per C-x 6 d. mode with C-x 6 d. | |
| 90 | ;; Kiam vi estos kontenta de la When you have edited both buffers to | 90 | |
| 91 | ;; rezulto, vi kunmetos la du kolumnojn your content, you merge them with | 91 | |
| 92 | ;; per C-x 6 1. Se vi poste vidas C-x 6 1. If you then see a problem, | 92 | ;; Aldone al dukolumna redaktado, ek- In addition to two-column editing of |
| 93 | ;; problemon, vi neniigu la kunmeton you undo the merge with C-x u and | 93 | ;; zemple por skribi dulingvan tekston text, for example for writing a |
| 94 | ;; per C-x u kaj plue modifu la du continue to edit the two buffers. | 94 | ;; flank-al-flanke kiel ^ci tiu, aliaj bilingual text side-by-side as shown |
| 95 | ;; bufrojn. Kiam vi ne plu volas tajpi When you no longer want to edit in | 95 | ;; interesaj uzoj trovitas por tiu mal- here, other interesting uses have |
| 96 | ;; dukolumne, vi eliru el la minora two columns, you turn off the minor | 96 | ;; ^cefa modalo: been found for this minor mode: |
| 97 | ;; modalo per C-x 6 k. mode with C-x 6 k. | 97 | |
| 98 | 98 | ;; Vi povas disigi la kolumnojn per {+} You can separate the columns with | |
| 99 | 99 | ;; ajna pla^ca ^ceno starigante {+} any string that pleases you, by | |
| 100 | ;; An^stata^u tri `autoload' kaj tri | Instead of three `autoload' and | 100 | ;; `2C-separator'. Ekzemple "{+} " {+} setting `2C-separator'. For example |
| 101 | ;; `global-set-key' vi povas uzi la | three `global-set-key' you can use | 101 | ;; por amuzi^gi. f2 s a^u C-x 6 s {+} "{+} " if you'd like to have fun. |
| 102 | ;; jenon en via dataro ~/.emacs, por | the following in your file | 102 | ;; traktas tiujn kun prefiksa {+} f2 s or C-x 6 s handles these with a |
| 103 | ;; memstare ^sar^gi la modalon: | ~/.emacs, to automatically load | 103 | ;; argumento kiu signifas la longon {+} prefix argument that means the |
| 104 | ;; | the mode: | 104 | ;; de tia ^ceno. {+} desired length of such a string. |
| 105 | 105 | ||
| 106 | ;; (global-set-key "\C-x6" | 106 | |
| 107 | ;; '(lambda () (interactive) | 107 | ;; Programistoj eble ^satus la eblecon Programmers might like the ability |
| 108 | ;; (load-library "two-column") | 108 | ;; forspliti la komentarian kolumnon de to split off the comment column of a |
| 109 | ;; (call-interactively | 109 | ;; dosiero kiel la sekvanta. Vi povas file that looks like the following. |
| 110 | ;; (cdr (assq (read-char) tc-mode-map))))) | 110 | ;; rearan^gigi la paragrafon. La pro- You can fill-paragraph the comment. |
| 111 | 111 | ;; blemo estas ke koda^jo tuj lar- The problem is, code quickly gets | |
| 112 | ;; Se vi ^satus havi la dukolumnajn | If you'd like to have the | 112 | ;; ^gi^gas, tiel ke vi bezonas pli rather wide, so you need to use a |
| 113 | ;; ordonojn je funkciklavo <f2>, vi | two-column commands on function | 113 | ;; mallar^gan komentarian kolumnon. narrower comment column. Code lines |
| 114 | ;; povas uzi la jenon en via dataro | key <f2>, you can use the | 114 | ;; Koda^jaj linioj tra `comment-column' that reach beyond `comment-column' |
| 115 | ;; ~/.emacs: | following in your file ~/.emacs: | 115 | ;; ne problemas, krom ke vi ne vidos are no problem, except that you |
| 116 | 116 | ;; iliajn finojn dum redaktado. won't see their end during editing. | |
| 117 | ;; (global-set-key [f2] (function | 117 | |
| 118 | ;; (lambda () | 118 | |
| 119 | ;; (interactive) | ||
| 120 | ;; (load-library "two-column") | ||
| 121 | ;; (global-set-key [f2] tc-mode-map) | ||
| 122 | ;; (call-interactively | ||
| 123 | ;; (cdr (assq (read-char) tc-mode-map)))))) | ||
| 124 | |||
| 125 | ;; In addition to two-column editing of text, for example for writing a | ||
| 126 | ;; bilingual text side-by-side as shown below in the file's prolog, other | ||
| 127 | ;; interesting uses have been found for this minor mode: | ||
| 128 | ;; | ||
| 129 | ;; | ||
| 130 | ;; You can separate the columns with {+} C-x 6 u or <f2> u if you prefer | ||
| 131 | ;; any string that pleases you, by {+} handles these with a prefix argument | ||
| 132 | ;; setting tc-separator. For {+} that enables you to declare the | ||
| 133 | ;; example "{+} " if you like to {+} desired length of such a string. | ||
| 134 | ;; amuse yourself. | ||
| 135 | ;; | ||
| 136 | ;; | ||
| 137 | ;; keyword You can write any text corresponding to a | ||
| 138 | ;; given keyword in a filled paragraph next to | ||
| 139 | ;; it. Note that the width of the first column | ||
| 140 | ;; may be less than window-min-width in the | ||
| 141 | ;; result, but will be displayed at that width. | ||
| 142 | ;; | ||
| 143 | ;; another This is not a three- or multi-column mode. | ||
| 144 | ;; The example in the file's prolog required | ||
| 145 | ;; working on two columns and then treating the | ||
| 146 | ;; result as one column in order to add the | ||
| 147 | ;; third. | ||
| 148 | ;; | ||
| 149 | ;; | ||
| 150 | ;; Programmers might like the ability to split off the comment column of | ||
| 151 | ;; a file that looks like the following. The advantage is that with | ||
| 152 | ;; (setq fill-prefix "-- ") you can run M-q (fill-paragraph) on the | ||
| 153 | ;; comment. The problem is, code quickly gets rather wide, so you need | ||
| 154 | ;; to use a narrower comment column, which is less interesting, unless | ||
| 155 | ;; you have a 132-column screen. Code lines that reach beyond | ||
| 156 | ;; comment-column are no problem, except that you won't always see their | ||
| 157 | ;; end during editing. | ||
| 158 | ;; | ||
| 159 | ;; BEGIN -- This is just some meaningless | 119 | ;; BEGIN -- This is just some meaningless |
| 160 | ;; FOR i IN 1..10 LOOP -- code in Ada, that runs foobar | 120 | ;; FOR i IN 1..10 LOOP -- code in Ada, that runs foobar |
| 161 | ;; foobar( i ); -- once for each argument from one | 121 | ;; foobar( i ); -- once for each argument from one |
| 162 | ;; END LOOP; -- to ten, and then we're already | 122 | ;; END LOOP; -- to ten, and then we're already |
| 163 | ;; END; -- through with it. | 123 | ;; END; -- through with it. |
| 164 | ;; | 124 | |
| 165 | ;; Better yet, you can put the point before "This", type M-3 C-x 6 u | 125 | ;; Pli bone ankora^u, vi povas pozici- Better yet, you can put the point |
| 166 | ;; which makes "-- " the separator between a no-comments Ada buffer, and | 126 | ;; i^gi anta^u "This", tajpi M-3 f2 s before "This", type M-3 f2 s |
| 167 | ;; a plain text comment buffer. When you put them back together, every | 127 | ;; kiu igas "-- " la separigilon inter which makes "-- " the separator |
| 168 | ;; non-empty line of the 2nd column will again be preceded by "-- ". | 128 | ;; senkomentaria Ada bufro kaj nur- between a no-comments Ada buffer, |
| 169 | ;; | 129 | ;; teksta komentaria bufro. Kiam vi and a plain text comment buffer. |
| 170 | ;; | 130 | ;; denove kuni^gos ilin, ^ciu nevaka When you put them back together, |
| 171 | ;; The <f2> function key hack (which is one of the rare times when | 131 | ;; linio de l' dua kolumno denove every non-empty line of the 2nd |
| 172 | ;; function keys are mnemonic) at the end of the file's prolog requires | 132 | ;; anta^uhavos "-- ". column will again be preceded by |
| 173 | ;; that the lisp/term/*.el for your terminal use the standard | 133 | ;; "-- ". |
| 174 | ;; conventions. Too bad that some don't (at least not in version 18.55). | 134 | |
| 175 | ;; The Sun one is hopelessly non-standard, and vt2[024]0 somehow forgot | ||
| 176 | ;; to define <f1> thru <f5>. (It defines <pf1> thru <pf4> instead, but | ||
| 177 | ;; that is not what we need on an X terminal.) If you want to use those, | ||
| 178 | ;; you'll need another hack something like: | ||
| 179 | ;; | ||
| 180 | ;; (if (string= (system-name) "cix") | ||
| 181 | ;; (progn | ||
| 182 | ;; (load-library "term/vt200.el") | ||
| 183 | ;; (define-key CSI-map "12~" (cons function-keymap ?\^b))) | ||
| 184 | ;; (global-unset-key "\e[") | ||
| 185 | ;; (define-key esc-map "[225z" (cons function-keymap ?\^b))) | ||
| 186 | ;; | ||
| 187 | ;; where "cix" is the non-sun machine I use. Actually I use the same X | ||
| 188 | ;; terminal to connect to both machines, and I want to keep my ~/.emacs | ||
| 189 | ;; identical on both. Bother, the two Emacses don't recognize the same | ||
| 190 | ;; keys and assign different sequences to those they do! I sure hope all | ||
| 191 | ;; this nonsense will stop with version 19 (or preferably soon) where I'd | ||
| 192 | ;; like to be able to say (define-key some-map '<f2> some-cmd), and see | ||
| 193 | ;; <f2> rather than some unintelligible ESC-sequence in command key | ||
| 194 | ;; sequences. | ||
| 195 | 135 | ||
| 196 | ;;; Code: | 136 | ;;; Code: |
| 197 | 137 | ||
| 138 | |||
| 139 | ;; Lucid patch | ||
| 140 | (or (fboundp 'frame-width) | ||
| 141 | (fset 'frame-width 'screen-width)) | ||
| 142 | |||
| 143 | |||
| 198 | ;;;;; Set up keymap ;;;;; | 144 | ;;;;; Set up keymap ;;;;; |
| 199 | 145 | ||
| 200 | ;;;###autoload | 146 | (defvar 2C-mode-map |
| 201 | (defvar tc-mode-map nil | 147 | (let ((map (make-sparse-keymap))) |
| 202 | "Keymap for commands for two-column mode.") | 148 | (define-key map "2" '2C-two-columns) |
| 149 | (define-key map [f2] '2C-two-columns) | ||
| 150 | (define-key map "b" '2C-associate-buffer) | ||
| 151 | (define-key map "s" '2C-split) | ||
| 152 | (define-key map "{" 'shrink-window-horizontally) | ||
| 153 | (define-key map "}" 'enlarge-window-horizontally) | ||
| 154 | map) | ||
| 155 | "Keymap for commands for setting up two-column mode.") | ||
| 156 | |||
| 157 | |||
| 158 | |||
| 159 | ;;;###autoload (autoload '2C-command "two-column" () t 'keymap) | ||
| 160 | (fset '2C-command 2C-mode-map) | ||
| 203 | 161 | ||
| 204 | ;;;###autoload | 162 | ;;;###autoload |
| 205 | (if tc-mode-map | 163 | ;; This one is for historical reasons and simple keyboards, it is not |
| 206 | () | 164 | ;; at all mnemonic. All usual sequences containing 2 were used, and |
| 207 | (setq tc-mode-map (make-sparse-keymap)) | 165 | ;; f2 could not be set up in a standard way under Emacs 18. |
| 208 | (define-key tc-mode-map "1" 'tc-merge) | 166 | (global-set-key "\C-x6" '2C-command) |
| 209 | (define-key tc-mode-map "2" 'tc-two-columns) | 167 | |
| 210 | (define-key tc-mode-map "b" 'tc-associate-buffer) | ||
| 211 | (define-key tc-mode-map "d" 'tc-dissociate) | ||
| 212 | (define-key tc-mode-map "\C-l" 'tc-recenter) | ||
| 213 | (define-key tc-mode-map "o" 'tc-associated-buffer) | ||
| 214 | (define-key tc-mode-map "s" 'tc-split) | ||
| 215 | (define-key tc-mode-map "{" 'shrink-window-horizontally) | ||
| 216 | (define-key tc-mode-map "}" 'enlarge-window-horizontally) | ||
| 217 | (define-key tc-mode-map " " 'tc-scroll-up) | ||
| 218 | (define-key tc-mode-map "\^?" 'tc-scroll-down) | ||
| 219 | (define-key tc-mode-map "\C-m" 'tc-scroll-line)) | ||
| 220 | 168 | ||
| 221 | ;;;###autoload | 169 | ;;;###autoload |
| 222 | (global-set-key "\C-x6" tc-mode-map) | 170 | (global-set-key [f2] '2C-command) |
| 171 | |||
| 172 | |||
| 173 | (defvar 2C-minor-mode-map | ||
| 174 | (let ((map (make-sparse-keymap))) | ||
| 175 | (define-key map "1" '2C-merge) | ||
| 176 | (define-key map "d" '2C-dissociate) | ||
| 177 | (define-key map "o" '2C-associated-buffer) | ||
| 178 | (define-key map "|" '2C-toggle-autoscroll) | ||
| 179 | map) | ||
| 180 | "Keymap for commands for use in two-column mode.") | ||
| 181 | |||
| 182 | |||
| 183 | (setq minor-mode-map-alist | ||
| 184 | (cons (cons '2C-mode | ||
| 185 | (let ((map (make-sparse-keymap))) | ||
| 186 | (substitute-key-definition '2C-command 2C-minor-mode-map | ||
| 187 | map (current-global-map)) | ||
| 188 | map)) | ||
| 189 | minor-mode-map-alist)) | ||
| 223 | 190 | ||
| 224 | ;;;;; variable declarations ;;;;; | 191 | ;;;;; variable declarations ;;;;; |
| 225 | 192 | ||
| 226 | ;; markers seem to be the only buffer-id not affected by renaming | 193 | ;; Markers seem to be the only buffer-id not affected by renaming a buffer. |
| 227 | ;; a buffer. This nevertheless loses when a buffer is killed. | 194 | ;; This nevertheless loses when a buffer is killed. The variable-name is |
| 228 | (defvar tc-other nil | 195 | ;; required by `describe-mode'. |
| 196 | (defvar 2C-mode nil | ||
| 229 | "Marker to the associated buffer, if non-nil.") | 197 | "Marker to the associated buffer, if non-nil.") |
| 230 | (make-variable-buffer-local 'tc-other) | 198 | (make-variable-buffer-local '2C-mode) |
| 231 | (put 'tc-other 'permanent-local t) | 199 | (put '2C-mode 'permanent-local t) |
| 200 | |||
| 201 | |||
| 202 | |||
| 203 | (setq minor-mode-alist (cons '(2C-mode " 2C") minor-mode-alist)) | ||
| 204 | |||
| 232 | 205 | ||
| 233 | (setq minor-mode-alist (cons '(tc-other " 2C") minor-mode-alist)) | ||
| 234 | 206 | ||
| 235 | ;; rearranged, so that the pertinent info will show in 40 columns | 207 | ;; rearranged, so that the pertinent info will show in 40 columns |
| 236 | (defvar tc-mode-line-format | 208 | (defvar 2C-mode-line-format |
| 237 | '("-%*- %15b --" (-3 . "%p") "--%[(" mode-name | 209 | '("-%*- %15b --" (-3 . "%p") "--%[(" mode-name |
| 238 | minor-mode-alist mode-line-process "%n" ")%]%-") | 210 | minor-mode-alist "%n" mode-line-process ")%]%-") |
| 239 | "*Value of mode-line-format for a buffer in two-column minor mode.") | 211 | "*Value of mode-line-format for a buffer in two-column minor mode.") |
| 240 | 212 | ||
| 241 | (defvar tc-separator "" | 213 | |
| 214 | (defvar 2C-other-buffer-hook 'text-mode | ||
| 215 | "*Hook run in new buffer when it is associated with current one.") | ||
| 216 | |||
| 217 | |||
| 218 | (defvar 2C-separator "" | ||
| 242 | "*A string inserted between the two columns when merging. | 219 | "*A string inserted between the two columns when merging. |
| 243 | This gets set locally by \\[tc-split].") | 220 | This gets set locally by \\[2C-split].") |
| 244 | (put 'tc-separator 'permanent-local t) | 221 | (put '2C-separator 'permanent-local t) |
| 222 | |||
| 223 | |||
| 245 | 224 | ||
| 246 | (defvar tc-window-width 40 | 225 | (defvar 2C-window-width 40 |
| 247 | "*The width of the first column. (Must be at least `window-min-width') | 226 | "*The width of the first column. (Must be at least `window-min-width') |
| 248 | This value is local for every buffer that sets it.") | 227 | This value is local for every buffer that sets it.") |
| 249 | (make-variable-buffer-local 'tc-window-width) | 228 | (make-variable-buffer-local '2C-window-width) |
| 250 | (put 'tc-window-width 'permanent-local t) | 229 | (put '2C-window-width 'permanent-local t) |
| 251 | 230 | ||
| 252 | (defvar tc-beyond-fill-column 4 | 231 | |
| 232 | |||
| 233 | (defvar 2C-beyond-fill-column 4 | ||
| 253 | "*Base for calculating `fill-column' for a buffer in two-column minor mode. | 234 | "*Base for calculating `fill-column' for a buffer in two-column minor mode. |
| 254 | The value of `fill-column' becomes `tc-window-width' for this buffer | 235 | The value of `fill-column' becomes `2C-window-width' for this buffer |
| 255 | minus this value.") | 236 | minus this value.") |
| 256 | 237 | ||
| 257 | (defvar tc-mode-hook nil | 238 | |
| 258 | "Function called, if non-nil, whenever turning on two-column minor mode. | 239 | |
| 259 | It can get called by \\[tc-two-columns] (tc-two-columns), \\[tc-split] (tc-split) | 240 | (defvar 2C-autoscroll t |
| 260 | and \\[tc-associate-buffer] (tc-associate-buffer), on both buffers.") | 241 | "If this is non-nil, Emacs attempts to keep the two buffers aligned.") |
| 242 | |||
| 243 | |||
| 244 | |||
| 245 | (defvar 2C-autoscroll-start nil) | ||
| 246 | (make-variable-buffer-local '2C-autoscroll-start) | ||
| 261 | 247 | ||
| 262 | ;;;;; base functions ;;;;; | 248 | ;;;;; base functions ;;;;; |
| 263 | 249 | ||
| 264 | ;; the access method for the other buffer. this tries to remedy against | 250 | ;; The access method for the other buffer. This tries to remedy against |
| 265 | ;; lost local variables and lost buffers. | 251 | ;; lost local variables and lost buffers. |
| 266 | (defun tc-other () | 252 | (defun 2C-other () |
| 267 | (if tc-other | 253 | (if 2C-mode |
| 268 | (or (prog1 | 254 | (or (prog1 |
| 269 | (marker-buffer tc-other) | 255 | (marker-buffer 2C-mode) |
| 270 | (setq mode-line-format tc-mode-line-format )) | 256 | (setq mode-line-format 2C-mode-line-format)) |
| 271 | ; The associated buffer somehow got killed. | 257 | ;; The associated buffer somehow got killed. |
| 272 | (progn | 258 | (progn |
| 273 | ; The other variables may later be useful if the user | 259 | ;; The other variables may later be useful if the user |
| 274 | ; reestablishes the association. | 260 | ;; reestablishes the association. |
| 275 | (kill-local-variable 'tc-other) | 261 | (kill-local-variable '2C-mode) |
| 276 | (kill-local-variable 'mode-line-format) | 262 | (kill-local-variable 'mode-line-format) |
| 277 | nil)))) | 263 | nil)))) |
| 278 | 264 | ||
| 279 | ;;;###autoload | ||
| 280 | (defun tc-two-columns (&optional buffer) | ||
| 281 | "Split current window vertically for two-column editing. | ||
| 282 | 265 | ||
| 283 | When called the first time, associates a buffer with the current | ||
| 284 | buffer. Both buffers are put in two-column minor mode and | ||
| 285 | tc-mode-hook gets called on both. These buffers remember | ||
| 286 | about one another, even when renamed. | ||
| 287 | 266 | ||
| 288 | When called again, restores the screen layout with the current buffer | 267 | ;; function for setting up two-column minor mode in a buffer associated |
| 289 | first and the associated buffer to it's right. | 268 | ;; with the buffer pointed to by the marker other. |
| 269 | (defun 2C-mode (other) | ||
| 270 | "Minor mode for independently editing two columns. | ||
| 271 | This is set up for two associated buffers by the three commands bound | ||
| 272 | to \\[2C-two-columns] , \\[2C-associate-buffer] and \\[2C-split]. | ||
| 273 | Turning on two-column mode calls the value of the variable `2C-mode-hook', | ||
| 274 | if that value is non-nil. | ||
| 275 | |||
| 276 | These buffers can be edited separately, for example with `fill-paragraph'. | ||
| 277 | If you want to disable parallel scrolling temporarily, use \\[2C-toggle-autoscroll] . | ||
| 290 | 278 | ||
| 291 | If you include long lines, i.e which will span both columns (eg. | 279 | If you include long lines, i.e which will span both columns (eg. |
| 292 | source code), they should be in what will be the first column, with | 280 | source code), they should be in what will be the first column, with |
| 293 | the associated buffer having empty lines next to them. | 281 | the associated buffer having empty lines next to them. |
| 294 | 282 | ||
| 283 | Potential uses are writing bilingual texts, or editing the comments of a | ||
| 284 | source code. See the file lisp/two-column.el for detailed examples. | ||
| 285 | |||
| 295 | You have the following commands at your disposal: | 286 | You have the following commands at your disposal: |
| 296 | 287 | ||
| 297 | \\[tc-two-columns] Rearrange screen | 288 | \\[2C-two-columns] Rearrange screen with current buffer first |
| 298 | \\[tc-associate-buffer] Reassociate buffer after changing major mode | 289 | \\[2C-associate-buffer] Reassociate buffer after changing major mode |
| 299 | \\[tc-scroll-up] Scroll both buffers up by a screenfull | ||
| 300 | \\[tc-scroll-down] Scroll both buffers down by a screenful | ||
| 301 | \\[tc-scroll-line] Scroll both buffers up by one or more lines | ||
| 302 | \\[tc-recenter] Recenter and realign other buffer | ||
| 303 | \\[shrink-window-horizontally], \\[enlarge-window-horizontally] Shrink, enlarge current column | 290 | \\[shrink-window-horizontally], \\[enlarge-window-horizontally] Shrink, enlarge current column |
| 304 | \\[tc-associated-buffer] Switch to associated buffer | 291 | \\[2C-associated-buffer] Switch to associated buffer |
| 305 | \\[tc-merge] Merge both buffers | 292 | \\[2C-merge] Merge both buffers |
| 293 | \\[2C-dissociate] Dissociate the two buffers | ||
| 306 | 294 | ||
| 307 | These keybindings can be customized in your ~/.emacs by `tc-prefix' | 295 | These keybindings can be customized in your ~/.emacs by `2C-mode-map', |
| 308 | and `tc-mode-map'. | 296 | `2C-minor-mode-map' and by binding `2C-command' to some prefix. |
| 309 | 297 | ||
| 310 | The appearance of the screen can be customized by the variables | 298 | The appearance of the screen can be customized by the variables |
| 311 | `tc-window-width', `tc-beyond-fill-column', | 299 | `2C-window-width', `2C-beyond-fill-column', `2C-mode-line-format' and |
| 312 | `tc-mode-line-format' and `truncate-partial-width-windows'." | 300 | `truncate-partial-width-windows'." |
| 301 | (make-variable-buffer-local 'post-command-hook) | ||
| 302 | (setq fill-column (- 2C-window-width | ||
| 303 | 2C-beyond-fill-column) | ||
| 304 | post-command-hook '2C-autoscroll | ||
| 305 | mode-line-format 2C-mode-line-format | ||
| 306 | 2C-mode other) | ||
| 307 | (run-hooks '2C-mode-hook)) | ||
| 308 | |||
| 309 | |||
| 313 | 310 | ||
| 311 | ;;;###autoload | ||
| 312 | (defun 2C-two-columns (&optional buffer) | ||
| 313 | "Split current window vertically for two-column editing. | ||
| 314 | When called the first time, associates a buffer with the current | ||
| 315 | buffer in two-column minor mode (see \\[describe-mode] ). | ||
| 316 | Runs `2C-other-buffer-hook' in the new buffer. | ||
| 317 | When called again, restores the screen layout with the current buffer | ||
| 318 | first and the associated buffer to it's right." | ||
| 314 | (interactive "P") | 319 | (interactive "P") |
| 315 | ; first go to full width, so that we can certainly split into | 320 | ;; first go to full width, so that we can certainly split into two windows |
| 316 | ; two windows | ||
| 317 | (if (< (window-width) (frame-width)) | 321 | (if (< (window-width) (frame-width)) |
| 318 | (enlarge-window 99999 t)) | 322 | (enlarge-window 99999 t)) |
| 319 | (split-window-horizontally | 323 | (split-window-horizontally |
| 320 | (max window-min-width (min tc-window-width | 324 | (max window-min-width (min 2C-window-width |
| 321 | (- (frame-width) window-min-width)))) | 325 | (- (frame-width) window-min-width)))) |
| 322 | (if (tc-other) | 326 | (if (2C-other) |
| 323 | (progn | 327 | (progn |
| 324 | (other-window 1) | 328 | (other-window 1) |
| 325 | (switch-to-buffer (tc-other)) | 329 | (switch-to-buffer (2C-other)) |
| 326 | (other-window -1) | 330 | (other-window -1) |
| 327 | ; align buffers if necessary | 331 | (if 2C-autoscroll |
| 328 | (tc-scroll-line 0)) | 332 | (2C-toggle-autoscroll t))) |
| 329 | 333 | ||
| 330 | ; set up minor mode linking two buffers | 334 | (2C-mode (prog1 (point-marker) |
| 331 | (setq fill-column (- tc-window-width | 335 | (other-window 1) |
| 332 | tc-beyond-fill-column) | 336 | (switch-to-buffer |
| 333 | mode-line-format tc-mode-line-format) | 337 | (or buffer |
| 334 | (run-hooks tc-mode-hook) | 338 | (generate-new-buffer |
| 335 | (let ((other (point-marker))) | 339 | (concat "2C/" (buffer-name))))) |
| 336 | (other-window 1) | 340 | (or buffer |
| 337 | (switch-to-buffer | 341 | (run-hooks '2C-other-buffer-hook)))) |
| 338 | (or buffer | 342 | |
| 339 | (generate-new-buffer | 343 | (2C-mode (prog1 (point-marker) |
| 340 | (concat "2C/" (buffer-name))))) | 344 | (other-window -1))))) |
| 341 | (or buffer | 345 | |
| 342 | (text-mode)) | 346 | |
| 343 | (setq fill-column (- tc-window-width | ||
| 344 | tc-beyond-fill-column) | ||
| 345 | mode-line-format tc-mode-line-format | ||
| 346 | tc-other other | ||
| 347 | other (point-marker)) | ||
| 348 | (run-hooks tc-mode-hook) | ||
| 349 | (other-window -1) | ||
| 350 | (setq tc-other other)))) | ||
| 351 | |||
| 352 | (defalias 'tc-mode 'tc-two-columns) | ||
| 353 | 347 | ||
| 354 | ;;;###autoload | 348 | ;;;###autoload |
| 355 | (defun tc-associate-buffer () | 349 | (defun 2C-associate-buffer () |
| 356 | "Associate another buffer with this one in two-column minor mode. | 350 | "Associate another buffer with this one in two-column minor mode. |
| 357 | Can also be used to associate a just previously visited file, by | 351 | Can also be used to associate a just previously visited file, by |
| 358 | accepting the proposed default buffer. | 352 | accepting the proposed default buffer. |
| 359 | 353 | ||
| 360 | See \\[tc-two-columns] and `lisp/two-column.el' for further details." | 354 | \(See \\[describe-mode] .)" |
| 361 | (interactive) | 355 | (interactive) |
| 362 | (let ((b1 (current-buffer)) | 356 | (let ((b1 (current-buffer)) |
| 363 | (b2 (or (tc-other) | 357 | (b2 (or (2C-other) |
| 364 | (read-buffer "Associate buffer: " (other-buffer))))) | 358 | (read-buffer "Associate buffer: " (other-buffer))))) |
| 365 | (save-excursion | 359 | (save-excursion |
| 366 | (setq tc-other nil) | 360 | (setq 2C-mode nil) |
| 367 | (set-buffer b2) | 361 | (set-buffer b2) |
| 368 | (and (tc-other) | 362 | (and (2C-other) |
| 369 | (not (eq b1 (tc-other))) | 363 | (not (eq b1 (2C-other))) |
| 370 | (error "Buffer already associated with buffer `%s'." | 364 | (error "Buffer already associated with buffer `%s'." |
| 371 | (buffer-name (tc-other)))) | 365 | (buffer-name (2C-other)))) |
| 372 | (setq b1 (and (assq 'tc-window-width (buffer-local-variables)) | 366 | (setq b1 (and (assq '2C-window-width (buffer-local-variables)) |
| 373 | tc-window-width))) | 367 | 2C-window-width))) |
| 374 | ; if other buffer has a local width, adjust here too | 368 | ; if other buffer has a local width, adjust here too |
| 375 | (if b1 (setq tc-window-width (- (frame-width) b1))) | 369 | (if b1 (setq 2C-window-width (- (frame-width) b1))) |
| 376 | (tc-two-columns b2))) | 370 | (2C-two-columns b2))) |
| 371 | |||
| 372 | |||
| 377 | 373 | ||
| 378 | ;;;###autoload | 374 | ;;;###autoload |
| 379 | (defun tc-split (arg) | 375 | (defun 2C-split (arg) |
| 380 | "Unmerge a two-column text into two buffers in two-column minor mode. | 376 | "Split a two-column text at point, into two buffers in two-column minor mode. |
| 381 | The text is unmerged at the cursor's column which becomes the local | 377 | Point becomes the local value of `2C-window-width'. Only lines that |
| 382 | value of `tc-window-width'. Only lines that have the ARG same | 378 | have the ARG same preceding characters at that column get split. The |
| 383 | preceding characters at that column get split. The ARG preceding | 379 | ARG preceding characters without any leading whitespace become the local |
| 384 | characters without any leading whitespace become the local value for | 380 | value for `2C-separator'. This way lines that continue across both |
| 385 | `tc-separator'. This way lines that continue across both | ||
| 386 | columns remain untouched in the first buffer. | 381 | columns remain untouched in the first buffer. |
| 387 | 382 | ||
| 388 | This function can be used with a prototype line, to set up things as | 383 | This function can be used with a prototype line, to set up things. You |
| 389 | you like them. You write the first line of each column with the | 384 | write the first line of each column and then split that line. E.g.: |
| 390 | separator you like and then unmerge that line. E.g.: | ||
| 391 | 385 | ||
| 392 | First column's text sSs Second columns text | 386 | First column's text sSs Second column's text |
| 393 | \\___/\\ | 387 | \\___/\\ |
| 394 | / \\ | 388 | / \\ |
| 395 | 5 character Separator You type M-5 \\[tc-split] with the point here | 389 | 5 character Separator You type M-5 \\[2C-split] with the point here. |
| 396 | 390 | ||
| 397 | See \\[tc-two-columns] and `lisp/two-column.el' for further details." | 391 | \(See \\[describe-mode] .)" |
| 398 | (interactive "p") | 392 | (interactive "*p") |
| 399 | (and (tc-other) | 393 | (and (2C-other) |
| 400 | (if (y-or-n-p (concat "Overwrite associated buffer `" | 394 | (if (y-or-n-p (concat "Overwrite associated buffer `" |
| 401 | (buffer-name (tc-other)) | 395 | (buffer-name (2C-other)) |
| 402 | "'? ")) | 396 | "'? ")) |
| 403 | (save-excursion | 397 | (save-excursion |
| 404 | (set-buffer (tc-other)) | 398 | (set-buffer (2C-other)) |
| 405 | (erase-buffer)) | 399 | (erase-buffer)) |
| 406 | (signal 'quit nil))) | 400 | (signal 'quit nil))) |
| 407 | (let ((point (point)) | 401 | (let ((point (point)) |
| @@ -414,12 +408,12 @@ See \\[tc-two-columns] and `lisp/two-column.el' for further details." | |||
| 414 | (backward-char arg) | 408 | (backward-char arg) |
| 415 | (setq chars (buffer-substring (point) point)) | 409 | (setq chars (buffer-substring (point) point)) |
| 416 | (skip-chars-forward " \t" point) | 410 | (skip-chars-forward " \t" point) |
| 417 | (make-local-variable 'tc-separator) | 411 | (make-local-variable '2C-separator) |
| 418 | (setq tc-separator (buffer-substring (point) point) | 412 | (setq 2C-separator (buffer-substring (point) point) |
| 419 | tc-window-width (current-column))) | 413 | 2C-window-width (current-column))) |
| 420 | (tc-two-columns) | 414 | (2C-two-columns) |
| 421 | (setq other (tc-other)) | 415 | (setq other (2C-other)) |
| 422 | ; now we're ready to actually unmerge | 416 | ; now we're ready to actually split |
| 423 | (save-excursion | 417 | (save-excursion |
| 424 | (while (not (eobp)) | 418 | (while (not (eobp)) |
| 425 | (if (not (and (= (current-column) goal-column) | 419 | (if (not (and (= (current-column) goal-column) |
| @@ -443,59 +437,60 @@ See \\[tc-two-columns] and `lisp/two-column.el' for further details." | |||
| 443 | (setq n 0)) | 437 | (setq n 0)) |
| 444 | (next-line 1))))) | 438 | (next-line 1))))) |
| 445 | 439 | ||
| 446 | ;;;###autoload | 440 | |
| 447 | (defun tc-dissociate () | 441 | |
| 442 | |||
| 443 | (defun 2C-dissociate () | ||
| 448 | "Turn off two-column minor mode in current and associated buffer. | 444 | "Turn off two-column minor mode in current and associated buffer. |
| 449 | If the associated buffer is unmodified and empty, it is killed." | 445 | If the associated buffer is unmodified and empty, it is killed." |
| 450 | (interactive) | 446 | (interactive) |
| 451 | (let ((buffer (current-buffer))) | 447 | (let ((buffer (current-buffer))) |
| 452 | (save-excursion | 448 | (save-excursion |
| 453 | (and (tc-other) | 449 | (and (2C-other) |
| 454 | (set-buffer (tc-other)) | 450 | (set-buffer (2C-other)) |
| 455 | (or (not (tc-other)) | 451 | (or (not (2C-other)) |
| 456 | (eq buffer (tc-other))) | 452 | (eq buffer (2C-other))) |
| 457 | (if (and (not (buffer-modified-p)) | 453 | (if (and (not (buffer-modified-p)) |
| 458 | (eobp) (bobp)) | 454 | (eobp) (bobp)) |
| 459 | (kill-buffer nil) | 455 | (kill-buffer nil) |
| 460 | (kill-local-variable 'tc-other) | 456 | (kill-local-variable '2C-mode) |
| 461 | (kill-local-variable 'tc-window-width) | 457 | (kill-local-variable '2C-window-width) |
| 462 | (kill-local-variable 'tc-separator) | 458 | (kill-local-variable '2C-separator) |
| 463 | (kill-local-variable 'mode-line-format) | 459 | (kill-local-variable 'mode-line-format) |
| 464 | (kill-local-variable 'fill-column)))) | 460 | (kill-local-variable 'fill-column)))) |
| 465 | (kill-local-variable 'tc-other) | 461 | (kill-local-variable '2C-mode) |
| 466 | (kill-local-variable 'tc-window-width) | 462 | (kill-local-variable '2C-window-width) |
| 467 | (kill-local-variable 'tc-separator) | 463 | (kill-local-variable '2C-separator) |
| 468 | (kill-local-variable 'mode-line-format) | 464 | (kill-local-variable 'mode-line-format) |
| 469 | (kill-local-variable 'fill-column))) | 465 | (kill-local-variable 'fill-column))) |
| 470 | 466 | ||
| 471 | 467 | ||
| 468 | |||
| 472 | ;; this doesn't use yank-rectangle, so that the first column can | 469 | ;; this doesn't use yank-rectangle, so that the first column can |
| 473 | ;; contain long lines | 470 | ;; contain long lines |
| 474 | ;;;###autoload | 471 | (defun 2C-merge () |
| 475 | (defun tc-merge () | ||
| 476 | "Merges the associated buffer with the current buffer. | 472 | "Merges the associated buffer with the current buffer. |
| 477 | They get merged at the column, which is the value of | 473 | They get merged at the column, which is the value of `2C-window-width', |
| 478 | `tc-window-width', i.e. usually at the vertical window | 474 | i.e. usually at the vertical window separator. This separator gets |
| 479 | separator. This separator gets replaced with white space. Beyond | 475 | replaced with white space. Beyond that the value of `2C-separator' gets |
| 480 | that the value of gets inserted on merged lines. The two columns are | 476 | inserted on merged lines. The two columns are thus pasted side by side, |
| 481 | thus pasted side by side, in a single text. If the other buffer is | 477 | in a single text. If the other buffer is not displayed to the left of |
| 482 | not displayed to the left of this one, then this one becomes the left | 478 | this one, then this one becomes the left column. |
| 483 | column. | 479 | |
| 484 | 480 | If you want `2C-separator' on empty lines in the second column, | |
| 485 | If you want `tc-separator' on empty lines in the second column, | ||
| 486 | you should put just one space in them. In the final result, you can strip | 481 | you should put just one space in them. In the final result, you can strip |
| 487 | off trailing spaces with \\[beginning-of-buffer] \\[replace-regexp] [ SPC TAB ] + $ RET RET" | 482 | off trailing spaces with \\[beginning-of-buffer] \\[replace-regexp] [ SPC TAB ] + $ RET RET" |
| 488 | 483 | ||
| 489 | (interactive) | 484 | (interactive) |
| 490 | (or (tc-other) | 485 | (or (2C-other) |
| 491 | (error "You must first set two-column minor mode.")) | 486 | (error "You must first set two-column minor mode.")) |
| 492 | (and (> (car (window-edges)) 0) ; not touching left edge of screen | 487 | (and (> (car (window-edges)) 0) ; not touching left edge of screen |
| 493 | (eq (window-buffer (previous-window)) | 488 | (eq (window-buffer (previous-window)) |
| 494 | (tc-other)) | 489 | (2C-other)) |
| 495 | (other-window -1)) | 490 | (other-window -1)) |
| 496 | (save-excursion | 491 | (save-excursion |
| 497 | (let ((b1 (current-buffer)) | 492 | (let ((b1 (current-buffer)) |
| 498 | (b2 (tc-other)) | 493 | (b2 (2C-other)) |
| 499 | string) | 494 | string) |
| 500 | (goto-char (point-min)) | 495 | (goto-char (point-min)) |
| 501 | (set-buffer b2) | 496 | (set-buffer b2) |
| @@ -509,8 +504,8 @@ off trailing spaces with \\[beginning-of-buffer] \\[replace-regexp] [ SPC TAB ] | |||
| 509 | (if (string= string "") | 504 | (if (string= string "") |
| 510 | () | 505 | () |
| 511 | (end-of-line) | 506 | (end-of-line) |
| 512 | (indent-to-column tc-window-width) | 507 | (indent-to-column 2C-window-width) |
| 513 | (insert tc-separator string)) | 508 | (insert 2C-separator string)) |
| 514 | (next-line 1) ; add one if necessary | 509 | (next-line 1) ; add one if necessary |
| 515 | (set-buffer b2)))) | 510 | (set-buffer b2)))) |
| 516 | (if (< (window-width) (frame-width)) | 511 | (if (< (window-width) (frame-width)) |
| @@ -518,86 +513,96 @@ off trailing spaces with \\[beginning-of-buffer] \\[replace-regexp] [ SPC TAB ] | |||
| 518 | 513 | ||
| 519 | ;;;;; utility functions ;;;;; | 514 | ;;;;; utility functions ;;;;; |
| 520 | 515 | ||
| 521 | ;;;###autoload | 516 | (defun 2C-associated-buffer () |
| 522 | (defun tc-associated-buffer () | ||
| 523 | "Switch to associated buffer." | 517 | "Switch to associated buffer." |
| 524 | (interactive) | 518 | (interactive) |
| 525 | (or (tc-other) | 519 | (or (2C-other) |
| 526 | (error "You must set two-column minor mode.")) | ||
| 527 | (if (get-buffer-window (tc-other)) | ||
| 528 | (select-window (get-buffer-window (tc-other))) | ||
| 529 | (switch-to-buffer (tc-other)))) | ||
| 530 | |||
| 531 | ;; It would be desirable to intercept anything that causes the current | ||
| 532 | ;; window to scroll. Maybe a `scroll-hook'? | ||
| 533 | ;;;###autoload | ||
| 534 | (defun tc-scroll-line (arg) | ||
| 535 | "Scroll current window upward by ARG lines. | ||
| 536 | The associated window gets scrolled to the same line." | ||
| 537 | (interactive "p") | ||
| 538 | (or (tc-other) | ||
| 539 | (error "You must set two-column minor mode.")) | 520 | (error "You must set two-column minor mode.")) |
| 540 | ; scroll-up has a bug on arg 0 at end of buffer | 521 | (if (get-buffer-window (2C-other)) |
| 541 | (or (zerop arg) | 522 | (select-window (get-buffer-window (2C-other))) |
| 542 | (scroll-up arg)) | 523 | (switch-to-buffer (2C-other)))) |
| 543 | (setq arg (count-lines (point-min) (window-start))) | ||
| 544 | ; too bad that pre 18.57 Emacs makes save-window-excursion restore | ||
| 545 | ; the point. When it becomes extinct, we can simplify this. | ||
| 546 | (if (get-buffer-window (tc-other)) | ||
| 547 | (let ((window (selected-window))) | ||
| 548 | (select-window (get-buffer-window (tc-other))) | ||
| 549 | (setq arg (- arg (count-lines (point-min) (window-start)))) | ||
| 550 | ; make sure that other buffer has enough lines | ||
| 551 | (save-excursion | ||
| 552 | (goto-char (point-max)) | ||
| 553 | (insert-char ?\n | ||
| 554 | (- arg (count-lines (window-start) (point-max)) -1))) | ||
| 555 | (or (zerop arg) | ||
| 556 | (scroll-up arg)) | ||
| 557 | (select-window window)))) | ||
| 558 | 524 | ||
| 559 | ;;;###autoload | ||
| 560 | (defun tc-scroll-up (arg) | ||
| 561 | "Scroll current window upward by ARG screens. | ||
| 562 | The associated window gets scrolled to the same line." | ||
| 563 | (interactive "p") | ||
| 564 | (tc-scroll-line (* arg (- (window-height) | ||
| 565 | next-screen-context-lines 1)))) | ||
| 566 | 525 | ||
| 567 | ;;;###autoload | ||
| 568 | (defun tc-scroll-down (arg) | ||
| 569 | "Scroll current window downward by ARG screens. | ||
| 570 | The associated window gets scrolled to the same line." | ||
| 571 | (interactive "p") | ||
| 572 | (tc-scroll-line (* arg (- next-screen-context-lines | ||
| 573 | (window-height) -1)))) | ||
| 574 | 526 | ||
| 575 | ;;;###autoload | 527 | (defun 2C-toggle-autoscroll (arg) |
| 576 | (defun tc-recenter (arg) | 528 | "Toggle autoscrolling, or set it iff prefix ARG is non-nil and positive. |
| 577 | "Center point in window. With ARG, put point on line ARG. | 529 | When autoscrolling is turned on, this also realigns the two buffers." |
| 578 | This counts from bottom if ARG is negative. The associated window | ||
| 579 | gets scrolled to the same line." | ||
| 580 | (interactive "P") | 530 | (interactive "P") |
| 581 | (setq arg (and arg (prefix-numeric-value arg))) | 531 | (setq 2C-autoscroll-start (window-start)) |
| 582 | (tc-scroll-line (- (count-lines (window-start) (point)) | 532 | (if (setq 2C-autoscroll (if arg |
| 583 | (cond ((null arg) (/ (window-height) 2)) | 533 | (>= (prefix-numeric-value arg) 0) |
| 584 | ((< arg 0) (+ (window-height) arg)) | 534 | (not 2C-autoscroll))) |
| 585 | ( arg))))) | 535 | (select-window |
| 536 | (prog1 (selected-window) | ||
| 537 | (message "Autoscrolling is on.") | ||
| 538 | (or (2C-other) | ||
| 539 | (error "You must set two-column minor mode.")) | ||
| 540 | (setq arg (count-lines (point-min) (window-start))) | ||
| 541 | (if (get-buffer-window (2C-other)) | ||
| 542 | (progn | ||
| 543 | (select-window (get-buffer-window (2C-other))) | ||
| 544 | (setq arg (- arg (count-lines (point-min) (window-start)))) | ||
| 545 | ;; make sure that other buffer has enough lines | ||
| 546 | (save-excursion | ||
| 547 | (insert-char ?\n | ||
| 548 | (- arg (count-lines (window-start) | ||
| 549 | (goto-char (point-max))) | ||
| 550 | -1))) | ||
| 551 | (scroll-up arg))))) | ||
| 552 | (message "Autoscrolling is off."))) | ||
| 553 | |||
| 554 | |||
| 555 | |||
| 556 | (defun 2C-autoscroll () | ||
| 557 | (if 2C-autoscroll | ||
| 558 | ;; catch a mouse scroll on non-selected scrollbar | ||
| 559 | (select-window | ||
| 560 | (prog1 (selected-window) | ||
| 561 | (and (consp last-command-char) | ||
| 562 | (not (eq (selected-window) | ||
| 563 | (car (car (cdr last-command-char))))) | ||
| 564 | (select-window (car (car (cdr last-command-char))))) | ||
| 565 | ;; In some cases scrolling causes an error, but post-command-hook | ||
| 566 | ;; shouldn't, and should always stay in the original window | ||
| 567 | (condition-case () | ||
| 568 | (and (or 2C-autoscroll-start (2C-toggle-autoscroll t) nil) | ||
| 569 | (/= (window-start) 2C-autoscroll-start) | ||
| 570 | (2C-other) | ||
| 571 | (get-buffer-window (2C-other)) | ||
| 572 | (let ((lines (count-lines (window-start) | ||
| 573 | 2C-autoscroll-start))) | ||
| 574 | (if (< (window-start) 2C-autoscroll-start) | ||
| 575 | (setq lines (- lines))) | ||
| 576 | (setq 2C-autoscroll-start (window-start)) | ||
| 577 | (select-window (get-buffer-window (2C-other))) | ||
| 578 | ;; make sure that other buffer has enough lines | ||
| 579 | (save-excursion | ||
| 580 | (insert-char | ||
| 581 | ?\n (- lines (count-lines (window-start) | ||
| 582 | (goto-char (point-max))) | ||
| 583 | -1))) | ||
| 584 | (scroll-up lines) | ||
| 585 | (setq 2C-autoscroll-start (window-start)))) | ||
| 586 | (error)))))) | ||
| 587 | |||
| 588 | |||
| 586 | 589 | ||
| 587 | (defun enlarge-window-horizontally (arg) | 590 | (defun enlarge-window-horizontally (arg) |
| 588 | "Make current window ARG columns wider." | 591 | "Make current window ARG columns wider." |
| 589 | (interactive "p") | 592 | (interactive "p") |
| 590 | (enlarge-window arg t) | 593 | (enlarge-window arg t) |
| 591 | (and (tc-other) | 594 | (and (2C-other) |
| 592 | (setq tc-window-width (+ tc-window-width arg)) | 595 | (setq 2C-window-width (+ 2C-window-width arg)) |
| 593 | (set-buffer (tc-other)) | 596 | (set-buffer (2C-other)) |
| 594 | (setq tc-window-width (- tc-window-width arg)))) | 597 | (setq 2C-window-width (- 2C-window-width arg)))) |
| 595 | 598 | ||
| 596 | (defun shrink-window-horizontally (arg) | 599 | (defun shrink-window-horizontally (arg) |
| 597 | "Make current window ARG columns narrower." | 600 | "Make current window ARG columns narrower." |
| 598 | (interactive "p") | 601 | (interactive "p") |
| 599 | (enlarge-window-horizontally (- arg))) | 602 | (enlarge-window-horizontally (- arg))) |
| 600 | 603 | ||
| 604 | |||
| 605 | |||
| 601 | (provide 'two-column) | 606 | (provide 'two-column) |
| 602 | 607 | ||
| 603 | ;;; two-column.el ends here | 608 | ;;; two-column.el ends here |