Added Jeremy's smart_bol to 'line options' (Closes: #1283).
[mp-5.x.git] / mp_templates.mpsl
bloba96d5e88ed543234dc2f9231cd3aab1457132ff8
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     Templates.
8     Copyright (C) 1991-2007 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 /** editor actions **/
30 mp.actions['insert_template']    = sub(d) {
32         local l, t;
34         /* no local templates? do nothing */
35         if ((l = mp.long_op(mp.read_templates_file, d)) == NULL)
36                 return;
38         /* select one */
39         if ((t = mp.form( [
40                 { 'label'       => L("Template to insert:"),
41                   'type'        => 'list',
42                   'list'        => l }
43                 ])) == NULL)
44                 return;
45         t = t[0];
47         mp.store_undo(d);
49         /* insert the template content */
50         mp.insert(d, mp.templates[l[t]]);
53 mp.actions['open_templates_file'] = sub (d) {
54         local templates = glob(HOMEDIR ~ "/.mp_templates/*"); /* Treat as a dir */
56         if (size(templates) == 0) {
57                 mp.open(HOMEDIR ~ ".mp_templates");
58         } else {
59                 if ((t = mp.form( [
60                         { 'label'   => L("Template file to edit:"),
61                           'type'    => 'list',
62                           'list'    => templates }
63                         ])) == NULL)
64                         return;
65                 mp.open(templates[t[0]]);
66         }
69 /** default key bindings **/
71 /** action descriptions **/
73 mp.actdesc['insert_template']           = LL("Insert template...");
74 mp.actdesc['open_templates_file']       = LL("Edit templates file");
76 /** data **/
78 mp.templates = {};
80 /** code **/
82 sub mp.read_templates_file(d)
83 /* reads the $HOME/.mp_templates or $HOME/.mp_templates/{global,syntax.name} file into mp.templates */
85         local f, l, k, v, n;
86         
87         local read_template = sub(filename) {
88                 if ((f = open(filename, "r")) == NULL)
89                         return NULL;
91                 while (l = read(f)) {
92                         if (regex(l, "/^%%/")) {
93                                 /* new template: store previous, if any */
94                                 if (k && v) {
95                                         push(n, k);
96                                         mp.templates[k] = v;
97                                 }
98         
99                                 /* strip prefix */
100                                 k = sregex(mp.chomp(l), "/^%%/");
101                                 v = NULL;
102                         }
103                         else {
104                                 /* add to v */
105                                 v = v ~ l;
106                         }
107                 }
109                 close(f);
110         };
112         k = NULL;
113         v = NULL;
114         n = [];
116         /* reset */
117         mp.templates = {};
119         read_template(HOMEDIR ~ "/.mp_templates");
120         read_template(HOMEDIR ~ "/.mp_templates/global");
121         if (d.syntax != NULL) {
122                 read_template(HOMEDIR ~ "/.mp_templates/" ~ d.syntax.id);
123         }
125         /* store last value */
126         if (k && v) {
127                 push(n, k);
128                 mp.templates[k] = v;
129         }
131         /* returns keys(mp.templates), but in its original order */
132         return n;