diakonos 0.8.5 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +15 -0
- data/README +2 -3
- data/diakonos-256-colour.conf +8 -0
- data/diakonos.conf +67 -11
- data/lib/diakonos.rb +563 -267
- data/lib/diakonos/buffer.rb +205 -62
- data/lib/diakonos/readline.rb +229 -193
- data/test/buffer-test.rb +6 -6
- metadata +5 -6
- data/home-on-save.rb +0 -6
data/CHANGELOG
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
Diakonos Changelog
|
2
2
|
------------------
|
3
3
|
|
4
|
+
0.8.6
|
5
|
+
|
6
|
+
- Find-as-you-type added.
|
7
|
+
- Help system added.
|
8
|
+
- print_mapped_function added.
|
9
|
+
- User-definable status line variables added.
|
10
|
+
- :after_open and :after_buffer_switch hooks added.
|
11
|
+
- Sample script for git branch status variable added.
|
12
|
+
- comment_out and uncomment functions added.
|
13
|
+
- comment_string and comment_close_string settings added.
|
14
|
+
- Added -m (--open-matching) command line argument.
|
15
|
+
- wrap_paragraph function and wrap_margin setting added for hard wrapping text.
|
16
|
+
- columnize function and column_delimiter setting added.
|
17
|
+
- Numerous small fixes, adjustments and refactorings.
|
18
|
+
|
4
19
|
0.8.5
|
5
20
|
|
6
21
|
- Added 256 colour support.
|
data/README
CHANGED
@@ -61,9 +61,8 @@ or, for other options and arguments,
|
|
61
61
|
|
62
62
|
diakonos --help
|
63
63
|
|
64
|
-
For
|
65
|
-
|
66
|
-
http://wiki.purepistos.net/doku.php?id=Diakonos:Getting-Started
|
64
|
+
For help using Diakonos, simply press F1 from within the editor to use the
|
65
|
+
interactive help system.
|
67
66
|
|
68
67
|
----------------------------------------------------------------
|
69
68
|
|
data/diakonos-256-colour.conf
CHANGED
@@ -12,6 +12,14 @@ colour 41 15 233 # XML nodes; white on light black
|
|
12
12
|
colour 42 45 233 # XML attributes; light blue on black
|
13
13
|
colour 43 123 233 # XML namespaces; light blue on black
|
14
14
|
|
15
|
+
# Diakonos help files
|
16
|
+
|
17
|
+
lang.dhf.format.default white
|
18
|
+
lang.dhf.format.selection inverse
|
19
|
+
lang.dhf.format.found yellow inverse
|
20
|
+
lang.dhf.tokens.tags.format blue
|
21
|
+
lang.dhf.tokens.title.format 33
|
22
|
+
|
15
23
|
# Ruby
|
16
24
|
|
17
25
|
lang.ruby.format.default white bold
|
data/diakonos.conf
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#suppress_welcome true
|
2
|
+
|
1
3
|
logfile ~/.diakonos/diakonos.log
|
2
4
|
|
3
5
|
# When the cursor is view.margin.y lines or less from the top or
|
@@ -66,7 +68,7 @@ use_magic_file false
|
|
66
68
|
|
67
69
|
# Use "% syntax" as placeholders
|
68
70
|
# e.g. %d for decimal integers, %s for strings
|
69
|
-
status.left -- %s %s%s%s -- (%s)
|
71
|
+
status.left -- %s %s%s%s -- (%s) --%s
|
70
72
|
status.right - Buf %d of %d --- L%3d/%3d C%2d --
|
71
73
|
# The string to use to fill in the space between the left and right sides
|
72
74
|
# of the status line.
|
@@ -77,7 +79,7 @@ status.unnamed_str (unnamed file)
|
|
77
79
|
status.read_only_str (read-only)
|
78
80
|
# status.vars: any subset of:
|
79
81
|
# line row num_lines col filename modified type buffer_number num_buffers selecting read_only
|
80
|
-
status.vars filename modified read_only selecting type buffer_number num_buffers row num_lines col
|
82
|
+
status.vars filename modified read_only selecting type @git_branch buffer_number num_buffers row num_lines col
|
81
83
|
status.format inverse
|
82
84
|
|
83
85
|
# ---------------------------------------------------------------------
|
@@ -145,7 +147,7 @@ key esc [ 4 ~;cursorEOL
|
|
145
147
|
key esc [ 8 ~;cursorEOL
|
146
148
|
key pageup;pageUp
|
147
149
|
key pagedown;pageDown
|
148
|
-
key ctrl+a;cursorBOL
|
150
|
+
#key ctrl+a;cursorBOL
|
149
151
|
key ctrl+e;cursorEOL
|
150
152
|
key alt+<;cursorBOF
|
151
153
|
key esc [ 1 ; 5 H cursorBOF
|
@@ -207,6 +209,8 @@ key ctrl+k;deleteAndStoreLine
|
|
207
209
|
key ctrl+alt+k;deleteToEOL
|
208
210
|
key esc del;collapseWhitespace
|
209
211
|
key esc [ 3 ; 3 ~ collapseWhitespace
|
212
|
+
key alt+w wrap_paragraph
|
213
|
+
key alt+a columnize
|
210
214
|
key enter;carriageReturn
|
211
215
|
key tab;parsedIndent
|
212
216
|
#key tab;indent
|
@@ -264,6 +268,7 @@ key ctrl+space;anchorSelection
|
|
264
268
|
key ctrl+c;copySelection
|
265
269
|
key ctrl+x;cutSelection
|
266
270
|
key alt+u;removeSelection
|
271
|
+
key ctrl+a select_all
|
267
272
|
|
268
273
|
# If you are using KDE, you can uncomment these lines to synchronize
|
269
274
|
# the Diakonos clipboard with the KDE clipboard
|
@@ -278,6 +283,8 @@ key ctrl+b select_block
|
|
278
283
|
key ctrl+alt+d f select_block /^Index: /, /^(Index: |$)/, false
|
279
284
|
# Select a diff hunk in a patch
|
280
285
|
key ctrl+alt+d h select_block /^@@ /, /^(@@ |$)/, false
|
286
|
+
key esc # comment_out
|
287
|
+
key esc @ uncomment
|
281
288
|
|
282
289
|
key ctrl+alt+v;showClips
|
283
290
|
key ctrl+v;paste
|
@@ -300,7 +307,8 @@ key esc [ 1 3 ~;findAgain "down"
|
|
300
307
|
key f15;findAgain "up"
|
301
308
|
key esc [ 2 8 ~ findAgain "up"
|
302
309
|
key esc O 2 R;findAgain "up"
|
303
|
-
key ctrl+r
|
310
|
+
key ctrl+r searchAndReplace
|
311
|
+
key alt+r searchAndReplace CASE_SENSITIVE
|
304
312
|
key ctrl+alt+u;clearMatches
|
305
313
|
key alt+c;close_code
|
306
314
|
|
@@ -310,13 +318,14 @@ key esc [ 1 2 ~ shell
|
|
310
318
|
key esc [ [ B shell
|
311
319
|
key f8;execute
|
312
320
|
key esc F;execute "glark '$i' $F | less"
|
313
|
-
key esc d shell "diff -U 5 -w -b $c $s"
|
321
|
+
key esc d shell "diff -U 5 -w -b $c $s", "clipboard.diff"
|
314
322
|
#key esc F;shell "grep -n '$i' $F"
|
315
323
|
#key esc F;execute "grep -n '$i' $F | less"
|
316
|
-
key
|
317
|
-
key
|
318
|
-
esc
|
319
|
-
key
|
324
|
+
#key esc l execute "aspell check $f"
|
325
|
+
key f14 evaluate
|
326
|
+
key esc O 2 Q evaluate
|
327
|
+
key esc [ 2 6 ~ evaluate
|
328
|
+
key ctrl+alt+c shell "ruby -c $f"
|
320
329
|
|
321
330
|
# To use the following:
|
322
331
|
# 1) Copy to the clipboard some Ruby code which operates on stdin text and outputs to stdout.
|
@@ -330,6 +339,7 @@ key ctrl+alt+p;pasteShellResult "cat $s | ruby $c"
|
|
330
339
|
#key ctrl+alt+p;pasteShellResult "cat $s | awk -f $c"
|
331
340
|
|
332
341
|
key alt+k printKeychain
|
342
|
+
key esc K print_mapped_function
|
333
343
|
key alt+m;toggleMacroRecording
|
334
344
|
key f4 playMacro
|
335
345
|
key esc O S playMacro
|
@@ -407,6 +417,28 @@ lang.text.indent.auto true
|
|
407
417
|
lang.text.indent.roundup false
|
408
418
|
#lang.text.indent.using_tabs true
|
409
419
|
lang.text.tabsize 8
|
420
|
+
lang.text.wrap_margin 80
|
421
|
+
|
422
|
+
# Diakonos help files
|
423
|
+
|
424
|
+
lang.dhf.filemask \.dhf
|
425
|
+
lang.dhf.format.default white
|
426
|
+
lang.dhf.format.selection inverse
|
427
|
+
lang.dhf.format.found yellow inverse
|
428
|
+
lang.dhf.tokens.tags (^Tags: .+)
|
429
|
+
lang.dhf.tokens.tags.format blue
|
430
|
+
lang.dhf.tokens.title (^# .*)
|
431
|
+
lang.dhf.tokens.title.format 8 bold
|
432
|
+
lang.dhf.tokens.subtitle (^## .*)
|
433
|
+
lang.dhf.tokens.subtitle.format cyan bold
|
434
|
+
lang.dhf.tokens.subsubtitle (^### .*)
|
435
|
+
lang.dhf.tokens.subsubtitle.format cyan
|
436
|
+
lang.dhf.tokens.keys <(.+?)>
|
437
|
+
lang.dhf.tokens.keys.format white bold
|
438
|
+
lang.dhf.indent.size 2
|
439
|
+
lang.dhf.indent.auto true
|
440
|
+
lang.dhf.indent.roundup true
|
441
|
+
lang.dhf.wrap_margin 80
|
410
442
|
|
411
443
|
# XML
|
412
444
|
|
@@ -429,6 +461,8 @@ lang.xml.tokens.comments.open (<!--)
|
|
429
461
|
lang.xml.tokens.comments.close (-->)
|
430
462
|
lang.xml.tokens.comments.format 8
|
431
463
|
lang.xml.tokens.comments.change_to xml_comment
|
464
|
+
lang.xml.comment_string <!--
|
465
|
+
lang.xml.comment_close_string " -->"
|
432
466
|
lang.xml.tokens.template.open \[@--
|
433
467
|
lang.xml.tokens.template.close --@\]
|
434
468
|
lang.xml.tokens.template.format brown
|
@@ -495,6 +529,8 @@ lang.html.tokens.comments.open (<!--)
|
|
495
529
|
lang.html.tokens.comments.close (-->)
|
496
530
|
lang.html.tokens.comments.format 8
|
497
531
|
lang.html.tokens.comments.change_to html_comment
|
532
|
+
lang.html.comment_string <!--
|
533
|
+
lang.html.comment_close_string " -->"
|
498
534
|
lang.html.closers.tag.regexp <([^/> ]*)
|
499
535
|
lang.html.closers.tag.closer { |m| "</" + m[ 1 ] + ">" }
|
500
536
|
lang.html_tag.format.default white bold
|
@@ -547,6 +583,8 @@ lang.css.tokens.colours.format yellow bold
|
|
547
583
|
lang.css.tokens.long_comments.open \/\*
|
548
584
|
lang.css.tokens.long_comments.close \*\/
|
549
585
|
lang.css.tokens.long_comments.format 8 bold
|
586
|
+
lang.css.comment_string /*
|
587
|
+
lang.css.comment_close_string " */"
|
550
588
|
lang.css.tokens.numbers \b([0-9]+\.[0-9]+|[0-9]+)
|
551
589
|
lang.css.tokens.numbers.format blue bold
|
552
590
|
lang.css.tokens.units [^A-Za-z](em|pt|px)\b
|
@@ -555,6 +593,7 @@ lang.css.tokens.html_elements.case_insensitive \b(A|ABBR|ACRONYM|ADDRES|APPLET|A
|
|
555
593
|
lang.css.tokens.html_elements.format green
|
556
594
|
lang.css.tokens.values \b(auto|block|inherit|inline|larger|none|smaller|solid)\b
|
557
595
|
lang.css.tokens.values.format blue bold
|
596
|
+
lang.css.column_delimiters :|,
|
558
597
|
|
559
598
|
# Ruby
|
560
599
|
|
@@ -575,6 +614,7 @@ lang.ruby.tokens.instance_variables (@[A-Za-z_][A-Za-z_0-9]*)
|
|
575
614
|
lang.ruby.tokens.instance_variables.format white bold
|
576
615
|
lang.ruby.tokens.comments (#.*)
|
577
616
|
lang.ruby.tokens.comments.format 8 bold
|
617
|
+
lang.ruby.comment_string #
|
578
618
|
lang.ruby.tokens.regular_expressions (\/.+?[^\\]\/)
|
579
619
|
lang.ruby.tokens.regular_expressions.format red bold
|
580
620
|
lang.ruby.tokens.regular_expressions2 (%r\{.+?[^\}]\})
|
@@ -617,11 +657,12 @@ lang.ruby.indent.auto true
|
|
617
657
|
lang.ruby.indent.roundup true
|
618
658
|
#lang.ruby.indent.using_tabs true
|
619
659
|
lang.ruby.tabsize 2
|
620
|
-
lang.ruby.indent.indenters ^\s*(case|def|begin|ensure|when|else|ensure|for|while|elsif|if|class|module|rescue)\b|([{\[(]$|\{\s*\|[\w\s,]*\|\s*$)|\b(do)\b
|
660
|
+
lang.ruby.indent.indenters ^\s*(case|def|begin|ensure|when|else|ensure|for|while|until|elsif|if|class|module|rescue)\b|([{\[(]$|\{\s*\|[\w\s,]*\|\s*$)|\b(do)\b
|
621
661
|
lang.ruby.indent.unindenters ^\s*(end|else|elsif|ensure|when|rescue)\b|(^\s+[\]})])
|
622
662
|
lang.ruby.indent.preventers (\".+?[^\\]\")|('.+?[^\\]')|(`.+?[^\\]`)|(\/.+?[^\\]\/)|(^\s*#.*)|\S\s+if
|
623
663
|
lang.ruby.indent.ignore ^\s*$
|
624
664
|
lang.ruby.context.ignore ^=(begin|end)$
|
665
|
+
lang.ruby.column_delimiters =>?|:|,
|
625
666
|
|
626
667
|
# PHP
|
627
668
|
|
@@ -640,6 +681,7 @@ lang.php.tokens.constants \b([A-Z_]+|[A-Z_][A-Z0-9_]+)\b
|
|
640
681
|
lang.php.tokens.constants.format yellow bold
|
641
682
|
lang.php.tokens.comments (\/\/.*)
|
642
683
|
lang.php.tokens.comments.format 8 bold
|
684
|
+
lang.php.comment_string //
|
643
685
|
lang.php.tokens.preprocessor (^\s*#.*)
|
644
686
|
lang.php.tokens.preprocessor.format yellow bold
|
645
687
|
lang.php.tokens.non_alphanum ([!@#$%\^&*()\[\]{}/?=+\-\\|,<.>;:])
|
@@ -674,6 +716,7 @@ lang.perl.format.selection inverse
|
|
674
716
|
lang.perl.format.found yellow inverse
|
675
717
|
lang.perl.tokens.comments (#.*)
|
676
718
|
lang.perl.tokens.comments.format 8 bold
|
719
|
+
lang.perl.comment_string #
|
677
720
|
lang.perl.tokens.constants \b([A-Z_]+|[A-Z_][A-Z0-9_]+)\b
|
678
721
|
lang.perl.tokens.constants.format yellow bold
|
679
722
|
lang.perl.tokens.non_alphanum [!#^&*()\[\]{}/?=+\-\\|,<.>;:~]
|
@@ -705,6 +748,7 @@ lang.perl.indent.unindenters (case|^\s+[\]})])
|
|
705
748
|
lang.perl.indent.preventers (\".+?[^\\]\")|('.+?[^\\]')|(`.+?[^\\]`)|(\/.+?[^\\]\/)|(^\s*#.*)
|
706
749
|
lang.perl.indent.ignore ^\s*$
|
707
750
|
lang.perl.context.ignore ^(.+:|\s*\{?)$
|
751
|
+
lang.perl.column_delimiters =>?|:|,
|
708
752
|
|
709
753
|
# Python
|
710
754
|
|
@@ -719,6 +763,7 @@ lang.python.tokens.non_alphanum [@!#$%^&*()\[\]{}/?=+\-\\|,<.>;:~]
|
|
719
763
|
lang.python.tokens.non_alphanum.format white
|
720
764
|
lang.python.tokens.comments (#.*)
|
721
765
|
lang.python.tokens.comments.format 8 bold
|
766
|
+
lang.python.comment_string #
|
722
767
|
lang.python.tokens.doublequoted_strings (\".*?[^\\]\")
|
723
768
|
lang.python.tokens.doublequoted_strings.format green bold
|
724
769
|
lang.python.tokens.singlequoted_strings ('.*?[^\\]')
|
@@ -753,6 +798,7 @@ lang.java.tokens.constants \b([A-Z_]+|[A-Z_][A-Z0-9_]+)\b
|
|
753
798
|
lang.java.tokens.constants.format yellow bold
|
754
799
|
lang.java.tokens.comments (\/\/.*)
|
755
800
|
lang.java.tokens.comments.format 8 bold
|
801
|
+
lang.java.comment_string //
|
756
802
|
lang.java.tokens.non_alphanum ([!@#$%\^&*()\[\]{}/?=+\-\\|,<.>;:])
|
757
803
|
lang.java.tokens.non_alphanum.format white
|
758
804
|
lang.java.tokens.long_comments.open \/\*
|
@@ -771,6 +817,7 @@ lang.java.indent.ignore ^(.+:|\s*?)$
|
|
771
817
|
lang.java.context.ignore ^(.+:|\s*\{?)$
|
772
818
|
lang.java.closers.for.regexp for$
|
773
819
|
lang.java.closers.for.closer { |m| "( $i = 0; $i < limit; $i++ ) {\n%_\n}" }
|
820
|
+
lang.java.column_delimiters =|:|,
|
774
821
|
|
775
822
|
# C
|
776
823
|
|
@@ -788,6 +835,7 @@ lang.c.tokens.constants \b([A-Z_]+|[A-Z_][A-Z0-9_]+)\b
|
|
788
835
|
lang.c.tokens.constants.format yellow bold
|
789
836
|
lang.c.tokens.comments (\/\/.*)
|
790
837
|
lang.c.tokens.comments.format 8 bold
|
838
|
+
lang.c.comment_string //
|
791
839
|
lang.c.tokens.preprocessor (^\s*#.*)
|
792
840
|
lang.c.tokens.preprocessor.format yellow bold
|
793
841
|
lang.c.tokens.non_alphanum ([!@#$%\^&*()\[\]{}/?=+\-\\|,<.>;:])
|
@@ -815,6 +863,7 @@ lang.conf.tokens.commands ^\s*([^\s=]+)
|
|
815
863
|
lang.conf.tokens.commands.format cyan bold
|
816
864
|
lang.conf.tokens.comments (^\s*#.*)
|
817
865
|
lang.conf.tokens.comments.format yellow bold
|
866
|
+
lang.conf.comment_string #
|
818
867
|
lang.conf.tokens.doublequoted_strings (\".*?[^\\]\")
|
819
868
|
lang.conf.tokens.doublequoted_strings.format green bold
|
820
869
|
lang.conf.tokens.singlequoted_strings ('.*?[^\\]')
|
@@ -832,6 +881,7 @@ lang.crontab.format.selection inverse
|
|
832
881
|
lang.crontab.format.found yellow inverse
|
833
882
|
lang.crontab.tokens.comments (^\s*#.*)
|
834
883
|
lang.crontab.tokens.comments.format yellow bold
|
884
|
+
lang.crontab.comment_string #
|
835
885
|
lang.crontab.tokens.schedule ^((?:[0-9\/*,-]+\s+){5})
|
836
886
|
lang.crontab.tokens.schedule.format cyan bold
|
837
887
|
lang.crontab.tokens.commands ^(\S+=.+)
|
@@ -847,6 +897,7 @@ lang.fstab.format.selection inverse
|
|
847
897
|
lang.fstab.format.found yellow inverse
|
848
898
|
lang.fstab.tokens.comments (^\s*#.*)
|
849
899
|
lang.fstab.tokens.comments.format yellow bold
|
900
|
+
lang.fstab.comment_string #
|
850
901
|
lang.fstab.indent.size 4
|
851
902
|
lang.fstab.indent.auto true
|
852
903
|
lang.fstab.indent.roundup true
|
@@ -862,7 +913,8 @@ lang.sql.indent.size 4
|
|
862
913
|
lang.sql.indent.auto true
|
863
914
|
lang.sql.indent.roundup true
|
864
915
|
#lang.sql.indent.using_tabs true
|
865
|
-
lang.sql.tokens.reserved_words.case_insensitive \b(ABSOLUTE|ACCESS|ACTION|ADD|ADMIN|AFTER|ALIAS|ALL|ALLOCATE|AND|ANY|ARE|AS|ASC|ASSERTION|AT|AUDIT|AUTHORIZATION|AVG|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BOTH|BREADTH|BY|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR_LENGTH|CHARACTER_LENGTH|CHECK|CLASS|CLOSE|CLUSTER|COALESCE|COBOL|COLLATE|COLLATION|COLUMN|COMPLETION|COMPRESS|COMPUTED|CONCAT|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTINUE|CONVERT|CORRESPONDING|COUNT|CROSS|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURRENT|CURSOR|CYCLE|DATA|DAY|DBHIGH|DBKEY|DBLOW|DBMAC|DEALLOCATE|DECLARE|DECODE|DEFAULT|DEFERRABLE|DEFERRED|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISTINCT|DO|DOMAIN|EACH|ELEMENT|ELSE|ELSEIF|END-EXEC|END|EQUALS|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXISTS|EXTERNAL|EXTERNALLY|EXTRACT|FALSE|FILE|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FROM|FULL|FUNCTION|GENERAL|GET|GLOBAL|GO|GOTO|GROUP|HAVING|HOUR|IDENTIFIED|IDENTITY|IF|IGNORE|IMMEDIATE|IN|INCREMENT|INDEX|INDICATOR|INITIAL|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSTEAD|INTERSECT|INTERVAL|INTO|IS|ISOLATION|JOIN|KEY|LABEL|LANGUAGE|LAST|LEADING|LEAVE|LEFT|LESS|LEVEL|LIKE|LIMIT|LOCAL|LOCK|LOOP|LOWER|MATCH|MAX|MAXEXTENTS|MIN|MINUS|MINUTE|MLSLABEL|MLS_LABEL_FORMAT|MODE|MODIFY|MODULE|MONTH|MOVE|MULTISET|NAMES|NATIONAL|NATURAL|NEW_TABLE|NEXT|NO|NOAUDIT|NOCOMPRESS|NONE|NOT|NOWAIT|NULL|NULLIF|NUMBER|NVL|OCTET_LENGTH|OF|OFF|OFFLINE|OID|OLD|OLD_TABLE|ON|ONLINE|ONLY|OPEN|OPERATION|OPERATORS|OPTION|OR|ORDER|OTHERS|OUT|OUTER|OUTPUT|OVERLAPS|PAD|PARAMETER|PARTIAL|PASCAL|PCTFREE|PENDANT|PLI|POSITION|PRECISION|PREORDER|PRESERVE|PRIMARY|PRIOR|PRIVATE|PRIVILEGES|PROCEDURE|PROTECTED|PUBLIC|RAW|READ|READUP|REAL|RECORD|RECURSIVE|REF|REFERENCES|REFERENCING|RELATIVE|RENAME|REPLACE|REPRESENTATION|RESIGNAL|RESOURCE|RESTRICT|RETURN|RETURNS|RIGHT|ROLE|ROUTINE|ROW|ROWID|ROWNUM|ROWS|SAVEPOINT|SCHEMA|SCROLL|SEARCH|SECOND|SECTION|SENSITIVE|SEQUENCE|SESSION|SESSION_USER|SET|SHARE|SIGNAL|SIMILAR|SIZE|SOME|SPACE|SPECIFIC|SQL|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STRUCTURE|SUBSTRING|SUCCESSFUL|SUM|SYNONYM|SYSDATE|SYSTEM_USER|TABLE|TEMPLATE|TEMPORARY|TEST|THAN|THEN|THERE|SQ92|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TRAILING|TRANSACTION|TRANSLATE|TRANSLATION|TRIGGER|TRIM|TRUE|TUPLE|TYPE|UID|UNDER|UNION|UNIQUE|UNKNOWN|UPPER|USAGE|USER|USING|VALIDATE|VALUE|VALUES|VARIABLE|VARIANT|VIRTUAL|VARYING|VIEW|VISIBLE|VOID|WAIT|WHEN|WHENEVER|WHERE|WHILE|WITH|WITHOUT|WORK|WRITE|WRITEDOWN|WRITEUP|YEAR|ZONE)\b
|
916
|
+
#lang.sql.tokens.reserved_words.case_insensitive \b(ABSOLUTE|ACCESS|ACTION|ADD|ADMIN|AFTER|ALIAS|ALL|ALLOCATE|AND|ANY|ARE|AS|ASC|ASSERTION|AT|AUDIT|AUTHORIZATION|AVG|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BOTH|BREADTH|BY|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR_LENGTH|CHARACTER_LENGTH|CHECK|CLASS|CLOSE|CLUSTER|COALESCE|COBOL|COLLATE|COLLATION|COLUMN|COMPLETION|COMPRESS|COMPUTED|CONCAT|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTINUE|CONVERT|CORRESPONDING|COUNT|CROSS|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURRENT|CURSOR|CYCLE|DATA|DAY|DBHIGH|DBKEY|DBLOW|DBMAC|DEALLOCATE|DECLARE|DECODE|DEFAULT|DEFERRABLE|DEFERRED|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISTINCT|DO|DOMAIN|EACH|ELEMENT|ELSE|ELSEIF|END-EXEC|END|EQUALS|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXISTS|EXTERNAL|EXTERNALLY|EXTRACT|FALSE|FILE|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FROM|FULL|FUNCTION|GENERAL|GET|GLOBAL|GO|GOTO|GROUP|HAVING|HOUR|IDENTIFIED|IDENTITY|IF|IGNORE|IMMEDIATE|IN|INCREMENT|INDEX|INDICATOR|INITIAL|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSTEAD|INTERSECT|INTERVAL|INTO|IS|ISOLATION|JOIN|KEY|LABEL|LANGUAGE|LAST|LEADING|LEAVE|LEFT|LESS|LEVEL|LIKE|LIMIT|LOCAL|LOCK|LOOP|LOWER|MATCH|MAX|MAXEXTENTS|MIN|MINUS|MINUTE|MLSLABEL|MLS_LABEL_FORMAT|MODE|MODIFY|MODULE|MONTH|MOVE|MULTISET|NAMES|NATIONAL|NATURAL|NEW_TABLE|NEXT|NO|NOAUDIT|NOCOMPRESS|NONE|NOT|NOWAIT|NULL|NULLIF|NUMBER|NVL|OCTET_LENGTH|OF|OFF|OFFLINE|OID|OLD|OLD_TABLE|ON|ONLINE|ONLY|OPEN|OPERATION|OPERATORS|OPTION|OR|ORDER|OTHERS|OUT|OUTER|OUTPUT|OVERLAPS|PAD|PARAMETER|PARTIAL|PASCAL|PCTFREE|PENDANT|PLI|POSITION|PRECISION|PREORDER|PRESERVE|PRIMARY|PRIOR|PRIVATE|PRIVILEGES|PROCEDURE|PROTECTED|PUBLIC|RAW|READ|READUP|REAL|RECORD|RECURSIVE|REF|REFERENCES|REFERENCING|RELATIVE|RENAME|REPLACE|REPRESENTATION|RESIGNAL|RESOURCE|RESTRICT|RETURN|RETURNS|RIGHT|ROLE|ROUTINE|ROW|ROWID|ROWNUM|ROWS|SAVEPOINT|SCHEMA|SCROLL|SEARCH|SECOND|SECTION|SENSITIVE|SEQUENCE|SESSION|SESSION_USER|SET|SHARE|SIGNAL|SIMILAR|SIZE|SOME|SPACE|SPECIFIC|SQL|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STRUCTURE|SUBSTRING|SUCCESSFUL|SUM|SYNONYM|SYSDATE|SYSTEM_USER|TABLE|TEMPLATE|TEMPORARY|TEST|THAN|THEN|THERE|SQ92|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TRAILING|TRANSACTION|TRANSLATE|TRANSLATION|TRIGGER|TRIM|TRUE|TUPLE|TYPE|UID|UNDER|UNION|UNIQUE|UNKNOWN|UPPER|USAGE|USER|USING|VALIDATE|VALUE|VALUES|VARIABLE|VARIANT|VIRTUAL|VARYING|VIEW|VISIBLE|VOID|WAIT|WHEN|WHENEVER|WHERE|WHILE|WITH|WITHOUT|WORK|WRITE|WRITEDOWN|WRITEUP|YEAR|ZONE)\b
|
917
|
+
lang.sql.tokens.reserved_words.case_insensitive \b(ALL|AND|ANY|AS|ASC|BEGIN|BY|CASCADE|CASE|CAST|CHECK|COALESCE|COLUMN|CONSTRAINT|COUNT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURSOR|DECLARE|DEFAULT|DESC|DISTINCT|DO|ELSE|ELSEIF|END|EXCEPT|EXISTS|FALSE|FIRST|FOR|FOREIGN|FOUND|FROM|FULL|FUNCTION|GROUP|HAVING|HOUR|IF|IN|INCREMENT|INDEX|INNER|INPUT|INSTEAD|INTERSECT|INTERVAL|INTO|IS|JOIN|KEY|LANGUAGE|LAST|LEFT|LIKE|LIMIT|LOOP|MAX|MIN|NATURAL|NEXT|NO|NONE|NOT|NULL|NUMBER|OF|OFF|OLD|ON|ONLY|OR|ORDER|OUT|OUTER|PARTIAL|PRECISION|PRIMARY|REAL|RECORD|REF|REFERENCES|REPLACE|RESTRICT|RETURN|RETURNS|RIGHT|SCHEMA|SEQUENCE|SET|SUM|TABLE|TEMPORARY|THAN|THEN|TO|TRANSACTION|TRIGGER|TRUE|TYPE|UNION|UNIQUE|UPPER|USING|VALUE|VALUES|VARYING|VIEW|WHEN|WHERE|WHILE|WITH|WITHOUT|WORK)\b
|
866
918
|
lang.sql.tokens.reserved_words.format white
|
867
919
|
lang.sql.tokens.commands.case_insensitive \b(ALTER|COMMENT|COMMIT|CREATE|DELETE|DROP|EXEC|EXECUTE|FETCH|GRANT|INSERT|PERFORM|PREPARE|REVOKE|ROLLBACK|SELECT|UPDATE)\b
|
868
920
|
lang.sql.tokens.commands.format cyan
|
@@ -870,6 +922,7 @@ lang.sql.tokens.data_types.case_insensitive \b(BIT|BOOLEAN|CHAR|CHARACTER|DATE|D
|
|
870
922
|
lang.sql.tokens.data_types.format brown
|
871
923
|
lang.sql.tokens.comments (--.*)
|
872
924
|
lang.sql.tokens.comments.format 8 bold
|
925
|
+
lang.sql.comment_string --
|
873
926
|
lang.sql.tokens.singlequoted_strings ('.*?[^\\]')
|
874
927
|
lang.sql.tokens.singlequoted_strings.format green bold
|
875
928
|
lang.sql.tokens.non_alphanum ([!@#$%\^&*()\[\]{}/?=+\-\\|,<.>;:])
|
@@ -895,6 +948,7 @@ lang.bash.indent.roundup true
|
|
895
948
|
lang.bash.tabsize 4
|
896
949
|
lang.bash.tokens.comments (^\s*#.*)
|
897
950
|
lang.bash.tokens.comments.format 8 bold
|
951
|
+
lang.bash.comment_string #
|
898
952
|
lang.bash.tokens.singlequoted_strings ('.*?[^\\]')
|
899
953
|
lang.bash.tokens.singlequoted_strings.format green bold
|
900
954
|
lang.bash.tokens.doublequoted_strings (\".*?[^\\]\")
|
@@ -920,6 +974,7 @@ lang.tcl.indent.roundup true
|
|
920
974
|
lang.tcl.tabsize 4
|
921
975
|
lang.tcl.tokens.comments (^\s*#.*)
|
922
976
|
lang.tcl.tokens.comments.format 8 bold
|
977
|
+
lang.tcl.comment_string #
|
923
978
|
lang.tcl.tokens.reserved_words \b(encoding|incr|pid|tcl_endOfWord|Tcl|eof|info|tcl_findLibrary|after|error|interp|pkg_mkIndex|tcl_startOfNextWord|append|eval|join|proc|tcl_startOfPreviousWord|array|exec|lappend|puts|tcl_wordBreakAfter|auto_execok|exit|lassign|pwd|tcl_wordBreakBefore|auto_import|expr|lindex|re_syntax|tcltest|auto_load|fblocked|linsert|read|tclvars|auto_mkindex|fconfigure|list|regexp|tell|auto_mkindex_old|fcopy|llength|registry|time|auto_qualify|file|load|regsub|trace|auto_reset|fileevent|lrange|rename|unknown|bgerror|filename|lrepeat|resource|unload|binary|flush|lreplace|return|unset|break|for|lsearch|scan|update|catch|foreach|lset|seek|uplevel|cd|format|lsort|set|upvar|clock|gets|memory|socket|variable|close|glob|msgcat|source|vwait|concat|global|namespace|split|while|continue|history|open|string|dde|http|package|subst|dict|if|parray|switch)\b
|
924
979
|
lang.tcl.tokens.reserved_words.format white
|
925
980
|
lang.tcl.tokens.non_alphanum ([!@#$%\^&*()\[\]{}/?=+\-\\|,<.>;:])
|
@@ -992,6 +1047,7 @@ lang.yaml.tokens.directive_indicator ^(%.*)
|
|
992
1047
|
lang.yaml.tokens.directive_indicator.format 10
|
993
1048
|
lang.yaml.tokens.comment_indicator (#.+)
|
994
1049
|
lang.yaml.tokens.comment_indicator.format 8 bold
|
1050
|
+
lang.yaml.comment_string #
|
995
1051
|
lang.yaml.tokens.anchor_indicator (&\w+)
|
996
1052
|
lang.yaml.tokens.anchor_indicator.format red bold
|
997
1053
|
lang.yaml.tokens.alias_indicator (\*\w+)
|
data/lib/diakonos.rb
CHANGED
@@ -47,8 +47,8 @@ require 'diakonos/readline'
|
|
47
47
|
|
48
48
|
module Diakonos
|
49
49
|
|
50
|
-
VERSION = '0.8.
|
51
|
-
LAST_MODIFIED = '
|
50
|
+
VERSION = '0.8.6'
|
51
|
+
LAST_MODIFIED = 'October 31, 2008'
|
52
52
|
|
53
53
|
DONT_ADJUST_ROW = false
|
54
54
|
ADJUST_ROW = true
|
@@ -56,6 +56,8 @@ module Diakonos
|
|
56
56
|
DONT_PROMPT_OVERWRITE = false
|
57
57
|
DO_REDRAW = true
|
58
58
|
DONT_REDRAW = false
|
59
|
+
QUIET = true
|
60
|
+
NOISY = false
|
59
61
|
|
60
62
|
TAB = 9
|
61
63
|
ENTER = 13
|
@@ -116,6 +118,8 @@ module Diakonos
|
|
116
118
|
'closeFile',
|
117
119
|
'close_code',
|
118
120
|
'collapseWhitespace',
|
121
|
+
'columnize',
|
122
|
+
'comment_out',
|
119
123
|
'copySelection',
|
120
124
|
'copy_selection_to_klipper',
|
121
125
|
'cursorBOF',
|
@@ -172,6 +176,7 @@ module Diakonos
|
|
172
176
|
'paste_from_klipper',
|
173
177
|
'playMacro',
|
174
178
|
'popTag',
|
179
|
+
'print_mapped_function',
|
175
180
|
'printKeychain',
|
176
181
|
'quit',
|
177
182
|
'redraw',
|
@@ -185,6 +190,7 @@ module Diakonos
|
|
185
190
|
'scrollUp',
|
186
191
|
'searchAndReplace',
|
187
192
|
'seek',
|
193
|
+
'select_all',
|
188
194
|
'select_block',
|
189
195
|
'setBufferType',
|
190
196
|
'setReadOnly',
|
@@ -198,9 +204,11 @@ module Diakonos
|
|
198
204
|
'toggleMacroRecording',
|
199
205
|
'toggleSelection',
|
200
206
|
'toggleSessionSetting',
|
207
|
+
'uncomment',
|
201
208
|
'undo',
|
202
209
|
'unindent',
|
203
|
-
'unundo'
|
210
|
+
'unundo',
|
211
|
+
'wrap_paragraph',
|
204
212
|
]
|
205
213
|
LANG_TEXT = 'text'
|
206
214
|
|
@@ -215,16 +223,17 @@ class Diakonos
|
|
215
223
|
|
216
224
|
def initialize( argv = [] )
|
217
225
|
@diakonos_home = ( ( ENV[ 'HOME' ] or '' ) + '/.diakonos' ).subHome
|
218
|
-
|
219
|
-
Dir.mkdir @diakonos_home
|
220
|
-
end
|
226
|
+
mkdir @diakonos_home
|
221
227
|
@script_dir = "#{@diakonos_home}/scripts"
|
222
|
-
|
223
|
-
|
224
|
-
|
228
|
+
mkdir @script_dir
|
229
|
+
|
230
|
+
init_help
|
231
|
+
|
225
232
|
@debug = File.new( "#{@diakonos_home}/debug.log", 'w' )
|
226
233
|
@list_filename = @diakonos_home + '/listing.txt'
|
227
234
|
@diff_filename = @diakonos_home + '/text.diff'
|
235
|
+
@help_filename = "#{@help_dir}/about-help.dhf"
|
236
|
+
@error_filename = "#{@diakonos_home}/diakonos.err"
|
228
237
|
|
229
238
|
@files = Array.new
|
230
239
|
@read_only_files = Array.new
|
@@ -265,46 +274,63 @@ class Diakonos
|
|
265
274
|
@iterated_choice = nil
|
266
275
|
@choice_iterations = 0
|
267
276
|
@there_was_non_movement = false
|
277
|
+
@status_vars = Hash.new
|
268
278
|
|
269
279
|
# Readline histories
|
270
280
|
@rlh_general = Array.new
|
271
281
|
@rlh_files = Array.new
|
272
282
|
@rlh_search = Array.new
|
273
283
|
@rlh_shell = Array.new
|
284
|
+
@rlh_help = Array.new
|
285
|
+
end
|
286
|
+
|
287
|
+
def mkdir( dir )
|
288
|
+
if not FileTest.exists? dir
|
289
|
+
Dir.mkdir dir
|
290
|
+
end
|
274
291
|
end
|
275
292
|
|
276
293
|
def parseOptions( argv )
|
294
|
+
@post_load_script = ""
|
277
295
|
while argv.length > 0
|
278
296
|
arg = argv.shift
|
279
297
|
case arg
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
298
|
+
when '-h', '--help'
|
299
|
+
printUsage
|
300
|
+
exit 1
|
301
|
+
when '-ro'
|
302
|
+
filename = argv.shift
|
303
|
+
if filename == nil
|
304
|
+
printUsage
|
305
|
+
exit 1
|
306
|
+
else
|
307
|
+
@read_only_files.push filename
|
308
|
+
end
|
309
|
+
when '-c', '--config'
|
310
|
+
@config_filename = argv.shift
|
311
|
+
if @config_filename == nil
|
312
|
+
printUsage
|
313
|
+
exit 1
|
314
|
+
end
|
315
|
+
when '-e', '--execute'
|
316
|
+
post_load_script = argv.shift
|
317
|
+
if post_load_script.nil?
|
318
|
+
printUsage
|
319
|
+
exit 1
|
320
|
+
else
|
321
|
+
@post_load_script << "\n#{post_load_script}"
|
322
|
+
end
|
323
|
+
when '-m', '--open-matching'
|
324
|
+
regexp = argv.shift
|
325
|
+
files = `egrep -rl '#{regexp}' *`.split( /\n/ )
|
326
|
+
if files.any?
|
327
|
+
@files.concat files
|
328
|
+
script = "\nfind 'down', CASE_SENSITIVE, '#{regexp}'"
|
329
|
+
@post_load_script << script
|
330
|
+
end
|
331
|
+
else
|
332
|
+
# a name of a file to open
|
333
|
+
@files.push arg
|
308
334
|
end
|
309
335
|
end
|
310
336
|
end
|
@@ -313,12 +339,64 @@ class Diakonos
|
|
313
339
|
def printUsage
|
314
340
|
puts "Usage: #{$0} [options] [file] [file...]"
|
315
341
|
puts "\t--help\tDisplay usage"
|
316
|
-
puts "\t-ro <file>\tLoad file as read-only"
|
317
342
|
puts "\t-c <config file>\tLoad this config file instead of ~/.diakonos/diakonos.conf"
|
318
343
|
puts "\t-e, --execute <Ruby code>\tExecute Ruby code (such as Diakonos commands) after startup"
|
344
|
+
puts "\t-m, --open-matching <regular expression>\tOpen all matching files under current directory"
|
345
|
+
puts "\t-ro <file>\tLoad file as read-only"
|
319
346
|
end
|
320
347
|
protected :printUsage
|
321
348
|
|
349
|
+
def init_help
|
350
|
+
@base_help_dir = "#{@diakonos_home}/help"
|
351
|
+
mkdir @base_help_dir
|
352
|
+
|
353
|
+
@help_dir = "#{@diakonos_home}/help/#{VERSION}"
|
354
|
+
if not File.exist?( @help_dir )
|
355
|
+
puts "Help files for this Diakonos version were not found (#{@help_dir})."
|
356
|
+
|
357
|
+
$stdout.puts "Would you like to download the help files right now from the Diakonos website? (y/n)"; $stdout.flush
|
358
|
+
answer = $stdin.gets
|
359
|
+
case answer
|
360
|
+
when /^y/i
|
361
|
+
if not fetch_help
|
362
|
+
$stderr.puts "Failed to get help for version #{VERSION}."
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
if not FileTest.exists?( @help_dir ) or Dir[ "#{@help_dir}/*" ].size == 0
|
367
|
+
$stderr.puts "Terminating..."
|
368
|
+
exit 1
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
@help_tags = `grep -h Tags #{@help_dir}/* | cut -d ' ' -f 2-`.split.uniq
|
373
|
+
end
|
374
|
+
|
375
|
+
def fetch_help
|
376
|
+
require 'open-uri'
|
377
|
+
success = false
|
378
|
+
puts "Fetching help documents for version #{VERSION}..."
|
379
|
+
|
380
|
+
filename = "diakonos-help-#{VERSION}.tar.gz"
|
381
|
+
uri = "http://purepistos.net/diakonos/#{filename}"
|
382
|
+
tarball = "#{@base_help_dir}/#{filename}"
|
383
|
+
begin
|
384
|
+
open( uri ) do |http|
|
385
|
+
bytes = http.read
|
386
|
+
File.open( tarball, 'w' ) do |f|
|
387
|
+
f.print bytes
|
388
|
+
end
|
389
|
+
end
|
390
|
+
mkdir @help_dir
|
391
|
+
`tar zxf #{tarball} -C #{@base_help_dir}`
|
392
|
+
success = true
|
393
|
+
rescue OpenURI::HTTPError => e
|
394
|
+
$stderr.puts "Failed to fetch from #{uri} ."
|
395
|
+
end
|
396
|
+
|
397
|
+
success
|
398
|
+
end
|
399
|
+
|
322
400
|
def initializeDisplay
|
323
401
|
if @win_main != nil
|
324
402
|
@win_main.close
|
@@ -400,7 +478,7 @@ class Diakonos
|
|
400
478
|
$stderr.puts "Failed to fetch from #{location}."
|
401
479
|
end
|
402
480
|
|
403
|
-
|
481
|
+
found
|
404
482
|
end
|
405
483
|
|
406
484
|
def loadConfiguration
|
@@ -515,13 +593,13 @@ class Diakonos
|
|
515
593
|
keystrokes = Array.new
|
516
594
|
keystrings.split( /\s+/ ).each do |ks_str|
|
517
595
|
code = ks_str.keyCode
|
518
|
-
if code
|
596
|
+
if code
|
519
597
|
keystrokes.concat code
|
520
598
|
else
|
521
599
|
puts "unknown keystring: #{ks_str}"
|
522
600
|
end
|
523
601
|
end
|
524
|
-
if function_and_args
|
602
|
+
if function_and_args.nil?
|
525
603
|
@keychains.deleteKeyPath( keystrokes )
|
526
604
|
else
|
527
605
|
function, function_args = function_and_args.split( /\s+/, 2 )
|
@@ -603,7 +681,8 @@ class Diakonos
|
|
603
681
|
end
|
604
682
|
when "context.visible", "context.combined", "eof_newline", "view.nonfilelines.visible",
|
605
683
|
/^lang\.(.+?)\.indent\.(?:auto|roundup|using_tabs|closers)$/,
|
606
|
-
"found_cursor_start", "convert_tabs", 'delete_newline_on_delete_to_eol'
|
684
|
+
"found_cursor_start", "convert_tabs", 'delete_newline_on_delete_to_eol',
|
685
|
+
'suppress_welcome'
|
607
686
|
@settings[ command ] = arg.to_b
|
608
687
|
when "context.format", "context.separator.format", "status.format"
|
609
688
|
@settings[ command ] = arg.toFormatting
|
@@ -612,12 +691,16 @@ class Diakonos
|
|
612
691
|
when "context.separator", "status.left", "status.right", "status.filler",
|
613
692
|
"status.modified_str", "status.unnamed_str", "status.selecting_str",
|
614
693
|
"status.read_only_str", /^lang\..+?\.indent\.ignore\.charset$/,
|
615
|
-
/^lang\.(.+?)\.tokens\.([^.]+)\.change_to$/,
|
694
|
+
/^lang\.(.+?)\.tokens\.([^.]+)\.change_to$/,
|
695
|
+
/^lang\.(.+?)\.column_delimiters$/,
|
696
|
+
"view.nonfilelines.character",
|
616
697
|
'interaction.blink_string', 'diff_command'
|
617
698
|
@settings[ command ] = arg
|
699
|
+
when /^lang\..+?\.comment_(?:close_)?string$/
|
700
|
+
@settings[ command ] = arg.gsub( /^["']|["']$/, '' )
|
618
701
|
when "status.vars"
|
619
702
|
@settings[ command ] = arg.split( /\s+/ )
|
620
|
-
when /^lang\.(.+?)\.indent\.size$/, /^lang\.(.+?)\.tabsize$/
|
703
|
+
when /^lang\.(.+?)\.indent\.size$/, /^lang\.(.+?)\.(?:tabsize|wrap_margin)$/
|
621
704
|
@settings[ command ] = arg.to_i
|
622
705
|
when "context.max_levels", "context.max_segment_width", "max_clips", "max_undo_lines",
|
623
706
|
"view.margin.x", "view.margin.y", "view.scroll_amount", "view.lookback"
|
@@ -687,8 +770,8 @@ class Diakonos
|
|
687
770
|
@debug.flush
|
688
771
|
end
|
689
772
|
|
690
|
-
def
|
691
|
-
@hooks[ hook_name ] << { :proc =>
|
773
|
+
def register_proc( the_proc, hook_name, priority = 0 )
|
774
|
+
@hooks[ hook_name ] << { :proc => the_proc, :priority => priority }
|
692
775
|
end
|
693
776
|
|
694
777
|
def clearNonMovementFlag
|
@@ -705,7 +788,7 @@ class Diakonos
|
|
705
788
|
if @settings[ "context.visible" ] and not @settings[ "context.combined" ]
|
706
789
|
retval = retval - 1
|
707
790
|
end
|
708
|
-
|
791
|
+
retval
|
709
792
|
end
|
710
793
|
|
711
794
|
def main_window_width
|
@@ -716,8 +799,10 @@ class Diakonos
|
|
716
799
|
initializeDisplay
|
717
800
|
|
718
801
|
@hooks = {
|
719
|
-
|
720
|
-
|
802
|
+
:after_buffer_switch => [],
|
803
|
+
:after_open => [],
|
804
|
+
:after_save => [],
|
805
|
+
:after_startup => [],
|
721
806
|
}
|
722
807
|
Dir[ "#{@script_dir}/*" ].each do |script|
|
723
808
|
begin
|
@@ -751,113 +836,146 @@ class Diakonos
|
|
751
836
|
end
|
752
837
|
|
753
838
|
if num_opened > 0
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
839
|
+
switchToBufferNumber 1
|
840
|
+
|
841
|
+
updateStatusLine
|
842
|
+
updateContextLine
|
843
|
+
|
844
|
+
if @post_load_script != nil
|
845
|
+
eval @post_load_script
|
846
|
+
end
|
847
|
+
|
848
|
+
runHookProcs :after_startup
|
849
|
+
|
850
|
+
if not @settings[ 'suppress_welcome' ]
|
851
|
+
openFile "#{@help_dir}/welcome.dhf"
|
852
|
+
end
|
853
|
+
|
854
|
+
begin
|
855
|
+
# Main keyboard loop.
|
856
|
+
while not @quitting
|
857
|
+
processKeystroke
|
858
|
+
@win_main.refresh
|
859
|
+
end
|
860
|
+
rescue SignalException => e
|
861
|
+
debugLog "Terminated by signal (#{e.message})"
|
862
|
+
end
|
863
|
+
|
864
|
+
@debug.close
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
868
|
+
def capture_keychain( c, context )
|
869
|
+
if c == ENTER
|
870
|
+
@capturing_keychain = false
|
871
|
+
@current_buffer.deleteSelection
|
872
|
+
str = context.to_keychain_s.strip
|
873
|
+
@current_buffer.insertString str
|
874
|
+
cursorRight( Buffer::STILL_TYPING, str.length )
|
875
|
+
else
|
876
|
+
keychain_pressed = context.concat [ c ]
|
877
|
+
|
878
|
+
function_and_args = @keychains.getLeaf( keychain_pressed )
|
879
|
+
|
880
|
+
if function_and_args
|
881
|
+
function, args = function_and_args
|
882
|
+
end
|
883
|
+
|
884
|
+
partial_keychain = @keychains.getNode( keychain_pressed )
|
885
|
+
if partial_keychain
|
886
|
+
setILine( "Part of existing keychain: " + keychain_pressed.to_keychain_s + "..." )
|
887
|
+
else
|
888
|
+
setILine keychain_pressed.to_keychain_s + "..."
|
776
889
|
end
|
890
|
+
processKeystroke( keychain_pressed )
|
891
|
+
end
|
892
|
+
end
|
893
|
+
|
894
|
+
def capture_mapping( c, context )
|
895
|
+
if c == ENTER
|
896
|
+
@capturing_mapping = false
|
897
|
+
@current_buffer.deleteSelection
|
898
|
+
setILine
|
899
|
+
else
|
900
|
+
keychain_pressed = context.concat [ c ]
|
901
|
+
|
902
|
+
function_and_args = @keychains.getLeaf( keychain_pressed )
|
903
|
+
|
904
|
+
if function_and_args
|
905
|
+
function, args = function_and_args
|
906
|
+
setILine "#{keychain_pressed.to_keychain_s.strip} -> #{function}( #{args} )"
|
907
|
+
else
|
908
|
+
partial_keychain = @keychains.getNode( keychain_pressed )
|
909
|
+
if partial_keychain
|
910
|
+
setILine( "Several mappings start with: " + keychain_pressed.to_keychain_s + "..." )
|
911
|
+
processKeystroke( keychain_pressed )
|
912
|
+
else
|
913
|
+
setILine "There is no mapping for " + keychain_pressed.to_keychain_s
|
914
|
+
end
|
915
|
+
end
|
916
|
+
end
|
777
917
|
end
|
778
918
|
|
779
919
|
# context is an array of characters (bytes) which are keystrokes previously
|
780
920
|
# typed (in a chain of keystrokes)
|
781
921
|
def processKeystroke( context = [] )
|
782
|
-
|
922
|
+
c = @win_main.getch
|
783
923
|
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
@current_buffer.insertString str
|
790
|
-
cursorRight( Buffer::STILL_TYPING, str.length )
|
791
|
-
else
|
792
|
-
keychain_pressed = context.concat [ c ]
|
793
|
-
|
794
|
-
function_and_args = @keychains.getLeaf( keychain_pressed )
|
795
|
-
|
796
|
-
if function_and_args != nil
|
797
|
-
function, args = function_and_args
|
798
|
-
end
|
799
|
-
|
800
|
-
partial_keychain = @keychains.getNode( keychain_pressed )
|
801
|
-
if partial_keychain != nil
|
802
|
-
setILine( "Part of existing keychain: " + keychain_pressed.to_keychain_s + "..." )
|
803
|
-
else
|
804
|
-
setILine keychain_pressed.to_keychain_s + "..."
|
805
|
-
end
|
806
|
-
processKeystroke( keychain_pressed )
|
807
|
-
end
|
808
|
-
else
|
924
|
+
if @capturing_keychain
|
925
|
+
capture_keychain c, context
|
926
|
+
elsif @capturing_mapping
|
927
|
+
capture_mapping c, context
|
928
|
+
else
|
809
929
|
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
end
|
822
|
-
keychain_pressed = context.concat [ c ]
|
823
|
-
|
824
|
-
function_and_args = @keychains.getLeaf( keychain_pressed )
|
930
|
+
if context.empty?
|
931
|
+
if c > 31 and c < 255 and c != BACKSPACE
|
932
|
+
if @macro_history
|
933
|
+
@macro_history.push "typeCharacter #{c}"
|
934
|
+
end
|
935
|
+
@there_was_non_movement = true
|
936
|
+
typeCharacter c
|
937
|
+
return
|
938
|
+
end
|
939
|
+
end
|
940
|
+
keychain_pressed = context.concat [ c ]
|
825
941
|
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
942
|
+
function_and_args = @keychains.getLeaf( keychain_pressed )
|
943
|
+
|
944
|
+
if function_and_args
|
945
|
+
function, args = function_and_args
|
946
|
+
setILine if not @settings[ "context.combined" ]
|
947
|
+
|
948
|
+
if args
|
949
|
+
to_eval = "#{function}( #{args} )"
|
950
|
+
else
|
951
|
+
to_eval = function
|
952
|
+
end
|
953
|
+
|
954
|
+
if @macro_history
|
955
|
+
@macro_history.push to_eval
|
956
|
+
end
|
957
|
+
|
958
|
+
begin
|
959
|
+
eval to_eval, nil, "eval"
|
960
|
+
@last_commands << to_eval unless to_eval == "repeatLast"
|
961
|
+
if not @there_was_non_movement
|
962
|
+
@there_was_non_movement = ( not to_eval.movement? )
|
963
|
+
end
|
964
|
+
rescue Exception => e
|
965
|
+
debugLog e.message
|
966
|
+
debugLog e.backtrace.join( "\n\t" )
|
967
|
+
showException e
|
968
|
+
end
|
969
|
+
else
|
970
|
+
partial_keychain = @keychains.getNode( keychain_pressed )
|
971
|
+
if partial_keychain
|
972
|
+
setILine( keychain_pressed.to_keychain_s + "..." )
|
973
|
+
processKeystroke( keychain_pressed )
|
974
|
+
else
|
975
|
+
setILine "Nothing assigned to #{keychain_pressed.to_keychain_s}"
|
976
|
+
end
|
860
977
|
end
|
978
|
+
end
|
861
979
|
end
|
862
980
|
protected :processKeystroke
|
863
981
|
|
@@ -868,7 +986,7 @@ class Diakonos
|
|
868
986
|
@win_interaction.addstr( "%-#{Curses::cols}s" % string )
|
869
987
|
@win_interaction.refresh
|
870
988
|
Curses::curs_set 1
|
871
|
-
|
989
|
+
string.length
|
872
990
|
end
|
873
991
|
|
874
992
|
def showClips
|
@@ -883,22 +1001,27 @@ class Diakonos
|
|
883
1001
|
end
|
884
1002
|
|
885
1003
|
def switchTo( buffer )
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
end
|
892
|
-
@current_buffer = buffer
|
893
|
-
updateStatusLine
|
894
|
-
updateContextLine
|
895
|
-
buffer.display
|
896
|
-
switched = true
|
1004
|
+
switched = false
|
1005
|
+
if buffer
|
1006
|
+
@buffer_stack -= [ @current_buffer ]
|
1007
|
+
if @current_buffer
|
1008
|
+
@buffer_stack.push @current_buffer
|
897
1009
|
end
|
898
|
-
|
899
|
-
|
1010
|
+
@current_buffer = buffer
|
1011
|
+
runHookProcs( :after_buffer_switch, buffer )
|
1012
|
+
updateStatusLine
|
1013
|
+
updateContextLine
|
1014
|
+
buffer.display
|
1015
|
+
switched = true
|
1016
|
+
end
|
1017
|
+
|
1018
|
+
switched
|
900
1019
|
end
|
901
1020
|
protected :switchTo
|
1021
|
+
|
1022
|
+
def set_status_variable( identifier, value )
|
1023
|
+
@status_vars[ identifier ] = value
|
1024
|
+
end
|
902
1025
|
|
903
1026
|
def buildStatusLine( truncation = 0 )
|
904
1027
|
var_array = Array.new
|
@@ -937,6 +1060,8 @@ class Diakonos
|
|
937
1060
|
end
|
938
1061
|
when "type"
|
939
1062
|
var_array.push @current_buffer.original_language
|
1063
|
+
when /^@/
|
1064
|
+
var_array.push @status_vars[ var ]
|
940
1065
|
end
|
941
1066
|
end
|
942
1067
|
str = nil
|
@@ -1027,32 +1152,30 @@ class Diakonos
|
|
1027
1152
|
end
|
1028
1153
|
|
1029
1154
|
def displayDequeue
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
end
|
1155
|
+
@display_queue_mutex.synchronize do
|
1156
|
+
if @display_queue
|
1157
|
+
Thread.new( @display_queue ) do |b|
|
1158
|
+
@display_mutex.lock
|
1159
|
+
@display_mutex.unlock
|
1160
|
+
b.display
|
1161
|
+
end
|
1162
|
+
@display_queue = nil
|
1039
1163
|
end
|
1164
|
+
end
|
1040
1165
|
end
|
1041
1166
|
|
1042
1167
|
# completion_array is the array of strings that tab completion can use
|
1043
|
-
def getUserInput( prompt, history = @rlh_general, initial_text = "", completion_array = nil )
|
1168
|
+
def getUserInput( prompt, history = @rlh_general, initial_text = "", completion_array = nil, &block )
|
1044
1169
|
if @playing_macro
|
1045
1170
|
retval = @macro_input_history.shift
|
1046
1171
|
else
|
1047
|
-
|
1048
|
-
@
|
1049
|
-
retval = Readline.new( self, @win_interaction, initial_text, completion_array, history ).readline
|
1050
|
-
if @macro_history != nil
|
1172
|
+
retval = Readline.new( self, @win_interaction, prompt, initial_text, completion_array, history, &block ).readline
|
1173
|
+
if @macro_history
|
1051
1174
|
@macro_input_history.push retval
|
1052
1175
|
end
|
1053
1176
|
setILine
|
1054
1177
|
end
|
1055
|
-
|
1178
|
+
retval
|
1056
1179
|
end
|
1057
1180
|
|
1058
1181
|
def getLanguageFromName( name )
|
@@ -1063,7 +1186,7 @@ class Diakonos
|
|
1063
1186
|
break
|
1064
1187
|
end
|
1065
1188
|
end
|
1066
|
-
|
1189
|
+
retval
|
1067
1190
|
end
|
1068
1191
|
|
1069
1192
|
def getLanguageFromShaBang( first_line )
|
@@ -1074,12 +1197,12 @@ class Diakonos
|
|
1074
1197
|
break
|
1075
1198
|
end
|
1076
1199
|
end
|
1077
|
-
|
1200
|
+
retval
|
1078
1201
|
end
|
1079
1202
|
|
1080
1203
|
def showException( e, probable_causes = [ "Unknown" ] )
|
1081
1204
|
begin
|
1082
|
-
File.open( @
|
1205
|
+
File.open( @error_filename, "w" ) do |f|
|
1083
1206
|
f.puts "Diakonos Error:"
|
1084
1207
|
f.puts
|
1085
1208
|
f.puts e.message
|
@@ -1096,7 +1219,7 @@ class Diakonos
|
|
1096
1219
|
f.puts "----------------------------------------------------"
|
1097
1220
|
f.puts e.backtrace
|
1098
1221
|
end
|
1099
|
-
openFile( @
|
1222
|
+
openFile( @error_filename )
|
1100
1223
|
rescue Exception => e2
|
1101
1224
|
debugLog "EXCEPTION: #{e.message}"
|
1102
1225
|
debugLog "\t#{e.backtrace}"
|
@@ -1200,7 +1323,7 @@ class Diakonos
|
|
1200
1323
|
retval.gsub!( /\$s/, text_filename )
|
1201
1324
|
end
|
1202
1325
|
|
1203
|
-
|
1326
|
+
retval
|
1204
1327
|
end
|
1205
1328
|
|
1206
1329
|
def showMessage( message, non_interaction_duration = @settings[ 'interaction.choice_delay' ] )
|
@@ -1310,7 +1433,7 @@ class Diakonos
|
|
1310
1433
|
@do_display = false
|
1311
1434
|
end
|
1312
1435
|
|
1313
|
-
|
1436
|
+
retval
|
1314
1437
|
end
|
1315
1438
|
|
1316
1439
|
def startRecordingMacro( name = nil )
|
@@ -1382,6 +1505,9 @@ class Diakonos
|
|
1382
1505
|
def showing_list?
|
1383
1506
|
@list_buffer
|
1384
1507
|
end
|
1508
|
+
def list_item_selected?
|
1509
|
+
@list_buffer and @list_buffer.selecting?
|
1510
|
+
end
|
1385
1511
|
def current_list_item
|
1386
1512
|
if @list_buffer
|
1387
1513
|
@list_buffer.select_current_line
|
@@ -1407,6 +1533,14 @@ class Diakonos
|
|
1407
1533
|
end
|
1408
1534
|
end
|
1409
1535
|
|
1536
|
+
def open_help_buffer
|
1537
|
+
@help_buffer = openFile( @help_filename )
|
1538
|
+
end
|
1539
|
+
def close_help_buffer
|
1540
|
+
closeFile @help_buffer
|
1541
|
+
@help_buffer = nil
|
1542
|
+
end
|
1543
|
+
|
1410
1544
|
def runHookProcs( hook_id, *args )
|
1411
1545
|
@hooks[ hook_id ].each do |hook_proc|
|
1412
1546
|
hook_proc[ :proc ].call( *args )
|
@@ -1567,12 +1701,29 @@ class Diakonos
|
|
1567
1701
|
end
|
1568
1702
|
|
1569
1703
|
def collapseWhitespace
|
1570
|
-
|
1704
|
+
@current_buffer.collapseWhitespace
|
1705
|
+
end
|
1706
|
+
|
1707
|
+
def columnize( delimiter = nil, num_spaces_padding = 0 )
|
1708
|
+
if delimiter.nil?
|
1709
|
+
delimiter = getUserInput(
|
1710
|
+
"Column delimiter (regexp): ",
|
1711
|
+
@rlh_general,
|
1712
|
+
@settings[ "lang.#{@current_buffer.original_language}.column_delimiters" ] || ''
|
1713
|
+
)
|
1714
|
+
end
|
1715
|
+
if delimiter and num_spaces_padding
|
1716
|
+
@current_buffer.columnize Regexp.new( delimiter ), num_spaces_padding
|
1717
|
+
end
|
1718
|
+
end
|
1719
|
+
|
1720
|
+
def comment_out
|
1721
|
+
@current_buffer.comment_out
|
1571
1722
|
end
|
1572
1723
|
|
1573
1724
|
def copySelection
|
1574
|
-
|
1575
|
-
|
1725
|
+
@clipboard.addClip @current_buffer.copySelection
|
1726
|
+
removeSelection
|
1576
1727
|
end
|
1577
1728
|
|
1578
1729
|
def copy_selection_to_klipper
|
@@ -1740,46 +1891,82 @@ class Diakonos
|
|
1740
1891
|
end
|
1741
1892
|
|
1742
1893
|
def find( dir_str = "down", case_sensitive = CASE_INSENSITIVE, regexp_source_ = nil, replacement = nil )
|
1743
|
-
|
1744
|
-
|
1745
|
-
|
1746
|
-
|
1747
|
-
regexp_source = getUserInput( "Search regexp: ", @rlh_search, ( selected_text or "" ) )
|
1748
|
-
else
|
1749
|
-
regexp_source = regexp_source_
|
1894
|
+
direction = dir_str.toDirection
|
1895
|
+
if regexp_source_.nil?
|
1896
|
+
if @current_buffer.changing_selection
|
1897
|
+
selected_text = @current_buffer.copySelection[ 0 ]
|
1750
1898
|
end
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
1756
|
-
|
1757
|
-
|
1758
|
-
|
1759
|
-
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
|
1774
|
-
|
1775
|
-
|
1776
|
-
|
1777
|
-
|
1778
|
-
|
1779
|
-
|
1780
|
-
|
1781
|
-
|
1899
|
+
starting_row, starting_col = @current_buffer.last_row, @current_buffer.last_col
|
1900
|
+
|
1901
|
+
regexp_source = getUserInput(
|
1902
|
+
"Search regexp: ",
|
1903
|
+
@rlh_search,
|
1904
|
+
( selected_text or "" )
|
1905
|
+
) { |input|
|
1906
|
+
if input.length > 1
|
1907
|
+
find_ direction, case_sensitive, input, nil, starting_row, starting_col, QUIET
|
1908
|
+
else
|
1909
|
+
@current_buffer.removeSelection Buffer::DONT_DISPLAY
|
1910
|
+
@current_buffer.clearMatches Buffer::DO_DISPLAY
|
1911
|
+
end
|
1912
|
+
}
|
1913
|
+
else
|
1914
|
+
regexp_source = regexp_source_
|
1915
|
+
end
|
1916
|
+
|
1917
|
+
if regexp_source
|
1918
|
+
find_ direction, case_sensitive, regexp_source, replacement, starting_row, starting_col, NOISY
|
1919
|
+
elsif starting_row and starting_col
|
1920
|
+
@current_buffer.clearMatches
|
1921
|
+
@current_buffer.cursorTo starting_row, starting_col
|
1922
|
+
end
|
1923
|
+
end
|
1924
|
+
|
1925
|
+
# Worker method for find function.
|
1926
|
+
def find_( direction, case_sensitive, regexp_source, replacement, starting_row, starting_col, quiet )
|
1927
|
+
return if( regexp_source.nil? or regexp_source.empty? )
|
1928
|
+
|
1929
|
+
rs_array = regexp_source.newlineSplit
|
1930
|
+
regexps = Array.new
|
1931
|
+
exception_thrown = nil
|
1932
|
+
|
1933
|
+
rs_array.each do |source|
|
1934
|
+
begin
|
1935
|
+
warning_verbosity = $VERBOSE
|
1936
|
+
$VERBOSE = nil
|
1937
|
+
regexps << Regexp.new(
|
1938
|
+
source,
|
1939
|
+
case_sensitive ? nil : Regexp::IGNORECASE
|
1940
|
+
)
|
1941
|
+
$VERBOSE = warning_verbosity
|
1942
|
+
rescue RegexpError => e
|
1943
|
+
if not exception_thrown
|
1944
|
+
exception_thrown = e
|
1945
|
+
source = Regexp.escape( source )
|
1946
|
+
retry
|
1947
|
+
else
|
1948
|
+
raise e
|
1949
|
+
end
|
1782
1950
|
end
|
1951
|
+
end
|
1952
|
+
|
1953
|
+
if replacement == ASK_REPLACEMENT
|
1954
|
+
replacement = getUserInput( "Replace with: ", @rlh_search )
|
1955
|
+
end
|
1956
|
+
|
1957
|
+
if exception_thrown and not quiet
|
1958
|
+
setILine( "Searching literally; #{exception_thrown.message}" )
|
1959
|
+
end
|
1960
|
+
|
1961
|
+
@current_buffer.find(
|
1962
|
+
regexps,
|
1963
|
+
:direction => direction,
|
1964
|
+
:replacement => replacement,
|
1965
|
+
:starting_row => starting_row,
|
1966
|
+
:starting_col => starting_col,
|
1967
|
+
:quiet => quiet
|
1968
|
+
)
|
1969
|
+
@last_search_regexps = regexps
|
1783
1970
|
end
|
1784
1971
|
|
1785
1972
|
def findAgain( dir_str = nil )
|
@@ -1806,8 +1993,8 @@ class Diakonos
|
|
1806
1993
|
end
|
1807
1994
|
if search_term != nil
|
1808
1995
|
direction = dir_str.toDirection
|
1809
|
-
regexp = Regexp.new( Regexp.escape( search_term ) )
|
1810
|
-
@current_buffer.find( regexp, direction )
|
1996
|
+
regexp = [ Regexp.new( Regexp.escape( search_term ) ) ]
|
1997
|
+
@current_buffer.find( regexp, :direction => direction )
|
1811
1998
|
@last_search_regexps = regexp
|
1812
1999
|
end
|
1813
2000
|
end
|
@@ -1909,29 +2096,106 @@ class Diakonos
|
|
1909
2096
|
goToTag @current_buffer.wordUnderCursor
|
1910
2097
|
end
|
1911
2098
|
|
1912
|
-
def
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1916
|
-
|
1917
|
-
|
1918
|
-
|
1919
|
-
|
1920
|
-
|
1921
|
-
|
1922
|
-
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
1931
|
-
|
1932
|
-
|
2099
|
+
def with_list_file
|
2100
|
+
File.open( @list_filename, "w" ) do |f|
|
2101
|
+
yield f
|
2102
|
+
end
|
2103
|
+
end
|
2104
|
+
|
2105
|
+
def matching_help_documents( str )
|
2106
|
+
docs = []
|
2107
|
+
|
2108
|
+
if str =~ %r{^/(.+)$}
|
2109
|
+
regexp = $1
|
2110
|
+
files = Dir[ "#{@help_dir}/*" ].select{ |f|
|
2111
|
+
File.open( f ) { |io| io.grep( /#{regexp}/i ) }.any?
|
2112
|
+
}
|
2113
|
+
else
|
2114
|
+
terms = str.gsub( /[^a-zA-Z0-9-]/, ' ' ).split.join( '|' )
|
2115
|
+
file_grep = `egrep -i -l '^Tags.*\\b(#{terms})\\b' #{@help_dir}/*`
|
2116
|
+
files = file_grep.split( /\s+/ )
|
2117
|
+
end
|
2118
|
+
|
2119
|
+
files.each do |file|
|
2120
|
+
File.open( file ) do |f|
|
2121
|
+
docs << ( "%-300s | %s" % [ f.gets.strip, file ] )
|
1933
2122
|
end
|
1934
|
-
|
2123
|
+
end
|
2124
|
+
|
2125
|
+
docs.sort { |a,b| a.gsub( /^# (?:an?|the) */i, '# ' ) <=> b.gsub( /^# (?:an?|the) */i, '# ' ) }
|
2126
|
+
end
|
2127
|
+
|
2128
|
+
def open_help_document( selected_string )
|
2129
|
+
help_file = selected_string.split( "| " )[ -1 ]
|
2130
|
+
if File.exist? help_file
|
2131
|
+
openFile help_file
|
2132
|
+
end
|
2133
|
+
end
|
2134
|
+
|
2135
|
+
def help( prefill = '' )
|
2136
|
+
open_help_buffer
|
2137
|
+
matching_docs = nil
|
2138
|
+
|
2139
|
+
selected = getUserInput(
|
2140
|
+
"Search terms: ",
|
2141
|
+
@rlh_help,
|
2142
|
+
prefill,
|
2143
|
+
@help_tags
|
2144
|
+
) { |input|
|
2145
|
+
next if input.length < 3 and input[ 0..0 ] != '/'
|
2146
|
+
|
2147
|
+
matching_docs = matching_help_documents( input )
|
2148
|
+
with_list_file do |list|
|
2149
|
+
list.puts matching_docs.join( "\n" )
|
2150
|
+
end
|
2151
|
+
|
2152
|
+
openListBuffer
|
2153
|
+
}
|
2154
|
+
|
2155
|
+
close_help_buffer
|
2156
|
+
|
2157
|
+
case selected
|
2158
|
+
when /\|/
|
2159
|
+
open_help_document selected
|
2160
|
+
when nil
|
2161
|
+
# Help search aborted; do nothing
|
2162
|
+
else
|
2163
|
+
# Not a selected help document
|
2164
|
+
if matching_docs.nil? or matching_docs.empty?
|
2165
|
+
matching_docs = matching_help_documents( selected )
|
2166
|
+
end
|
2167
|
+
|
2168
|
+
case matching_docs.size
|
2169
|
+
when 1
|
2170
|
+
open_help_document matching_docs[ 0 ]
|
2171
|
+
when 0
|
2172
|
+
File.open( @error_filename, 'w' ) do |f|
|
2173
|
+
f.puts "There were no help documents matching your search."
|
2174
|
+
f.puts "(#{selected.strip})"
|
2175
|
+
end
|
2176
|
+
error_file = openFile @error_filename
|
2177
|
+
|
2178
|
+
choice = getChoice(
|
2179
|
+
"Send your search terms to purepistos.net to help improve Diakonos?",
|
2180
|
+
[ CHOICE_YES, CHOICE_NO ]
|
2181
|
+
)
|
2182
|
+
case choice
|
2183
|
+
when CHOICE_YES
|
2184
|
+
require 'net/http'
|
2185
|
+
require 'uri'
|
2186
|
+
|
2187
|
+
res = Net::HTTP.post_form(
|
2188
|
+
URI.parse( 'http://dh.purepistos.net/' ),
|
2189
|
+
{ 'q' => selected }
|
2190
|
+
)
|
2191
|
+
# TODO: let them choose "never" and "always"
|
2192
|
+
end
|
2193
|
+
|
2194
|
+
closeFile error_file
|
2195
|
+
else
|
2196
|
+
help selected
|
2197
|
+
end
|
2198
|
+
end
|
1935
2199
|
end
|
1936
2200
|
|
1937
2201
|
def indent
|
@@ -1970,7 +2234,7 @@ class Diakonos
|
|
1970
2234
|
end
|
1971
2235
|
|
1972
2236
|
def list_buffers
|
1973
|
-
|
2237
|
+
with_list_file do |f|
|
1974
2238
|
f.puts @buffers.keys.map { |name| "#{name}\n" }.sort
|
1975
2239
|
end
|
1976
2240
|
openListBuffer
|
@@ -2084,6 +2348,7 @@ class Diakonos
|
|
2084
2348
|
|
2085
2349
|
if do_open
|
2086
2350
|
buffer = Buffer.new( self, filename, buffer_key, read_only )
|
2351
|
+
runHookProcs( :after_open, buffer )
|
2087
2352
|
@buffers[ buffer_key ] = buffer
|
2088
2353
|
if switchTo( buffer ) and line_number
|
2089
2354
|
@current_buffer.goToLine( line_number, 0 )
|
@@ -2095,17 +2360,23 @@ class Diakonos
|
|
2095
2360
|
end
|
2096
2361
|
|
2097
2362
|
def openFileAsk
|
2098
|
-
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
openFile file
|
2106
|
-
updateStatusLine
|
2107
|
-
updateContextLine
|
2363
|
+
prefill = ''
|
2364
|
+
|
2365
|
+
if @current_buffer
|
2366
|
+
if @current_buffer.current_line =~ %r{/} and @current_buffer.current_line =~ %r{[/\w.]+}
|
2367
|
+
prefill = $&
|
2368
|
+
elsif @current_buffer.name
|
2369
|
+
prefill = File.expand_path( File.dirname( @current_buffer.name ) ) + "/"
|
2108
2370
|
end
|
2371
|
+
end
|
2372
|
+
|
2373
|
+
file = getUserInput( "Filename: ", @rlh_files, prefill )
|
2374
|
+
|
2375
|
+
if file
|
2376
|
+
openFile file
|
2377
|
+
updateStatusLine
|
2378
|
+
updateContextLine
|
2379
|
+
end
|
2109
2380
|
end
|
2110
2381
|
|
2111
2382
|
def operateOnString(
|
@@ -2226,9 +2497,14 @@ class Diakonos
|
|
2226
2497
|
end
|
2227
2498
|
end
|
2228
2499
|
|
2500
|
+
def print_mapped_function
|
2501
|
+
@capturing_mapping = true
|
2502
|
+
setILine "Type any chain of keystrokes or key chords, or press Enter to stop."
|
2503
|
+
end
|
2504
|
+
|
2229
2505
|
def printKeychain
|
2230
|
-
|
2231
|
-
|
2506
|
+
@capturing_keychain = true
|
2507
|
+
setILine "Type any chain of keystrokes or key chords, then press Enter..."
|
2232
2508
|
end
|
2233
2509
|
|
2234
2510
|
def quit
|
@@ -2322,14 +2598,26 @@ class Diakonos
|
|
2322
2598
|
end
|
2323
2599
|
end
|
2324
2600
|
|
2601
|
+
def select_all
|
2602
|
+
@current_buffer.select_all
|
2603
|
+
end
|
2604
|
+
|
2325
2605
|
def select_block( beginning = nil, ending = nil, including_ending = true )
|
2326
2606
|
if beginning.nil?
|
2327
|
-
|
2607
|
+
input = getUserInput( "Start at regexp: " )
|
2608
|
+
if input
|
2609
|
+
beginning = Regexp.new input
|
2610
|
+
end
|
2611
|
+
end
|
2612
|
+
if beginning and ending.nil?
|
2613
|
+
input = getUserInput( "End before regexp: " )
|
2614
|
+
if input
|
2615
|
+
ending = Regexp.new input
|
2616
|
+
end
|
2328
2617
|
end
|
2329
|
-
if ending
|
2330
|
-
|
2618
|
+
if beginning and ending
|
2619
|
+
@current_buffer.select( beginning, ending, including_ending )
|
2331
2620
|
end
|
2332
|
-
@current_buffer.select( beginning, ending, including_ending )
|
2333
2621
|
end
|
2334
2622
|
|
2335
2623
|
def scrollDown
|
@@ -2386,17 +2674,17 @@ class Diakonos
|
|
2386
2674
|
updateStatusLine
|
2387
2675
|
end
|
2388
2676
|
|
2389
|
-
def shell( command_ = nil )
|
2677
|
+
def shell( command_ = nil, result_filename = 'shell-result.txt' )
|
2390
2678
|
if command_ == nil
|
2391
2679
|
command = getUserInput( "Command: ", @rlh_shell )
|
2392
2680
|
else
|
2393
2681
|
command = command_
|
2394
2682
|
end
|
2395
|
-
|
2396
|
-
if command
|
2683
|
+
|
2684
|
+
if command
|
2397
2685
|
command = subShellVariables( command )
|
2398
2686
|
|
2399
|
-
result_file = @diakonos_home
|
2687
|
+
result_file = "#{@diakonos_home}/#{result_filename}"
|
2400
2688
|
File.open( result_file , "w" ) do |f|
|
2401
2689
|
f.puts command
|
2402
2690
|
f.puts
|
@@ -2541,6 +2829,10 @@ class Diakonos
|
|
2541
2829
|
end
|
2542
2830
|
end
|
2543
2831
|
|
2832
|
+
def uncomment
|
2833
|
+
@current_buffer.uncomment
|
2834
|
+
end
|
2835
|
+
|
2544
2836
|
def undo( buffer = @current_buffer )
|
2545
2837
|
buffer.undo
|
2546
2838
|
end
|
@@ -2567,6 +2859,10 @@ class Diakonos
|
|
2567
2859
|
def unundo( buffer = @current_buffer )
|
2568
2860
|
buffer.unundo
|
2569
2861
|
end
|
2862
|
+
|
2863
|
+
def wrap_paragraph
|
2864
|
+
@current_buffer.wrap_paragraph
|
2865
|
+
end
|
2570
2866
|
end
|
2571
2867
|
|
2572
2868
|
end
|