diakonos 0.8.5 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|