about summary refs log tree commit diff stats
path: root/vimrc.vim
blob: bf81ebd2abdda4691604a49c2033c70e9a25c654 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
" Highlighting literate directives in C++ sources.
function! HighlightTangledFile()
  " Tangled comments only make sense in the sources and are stripped out of
  " the generated .cc file. They're highlighted same as regular comments.
  syntax match tangledComment /\/\/:.*/ | highlight link tangledComment Comment
  syntax match tangledSalientComment /\/\/::.*/ | highlight link tangledSalientComment SalientComment
  set comments-=://
  set comments-=n://
  set comments+=n://:,n://

  " Inside tangle scenarios.
  syntax region tangleDirective start=+:(+ skip=+".*"+ end=+)+
  highlight link tangleDirective Delimiter
  syntax match traceContains /^+.*/
  highlight traceContains ctermfg=22
  syntax match traceAbsent /^-.*/
  highlight traceAbsent ctermfg=darkred
  syntax match tangleScenarioSetup /^\s*% .*/ | highlight link tangleScenarioSetup SpecialChar
  highlight Special ctermfg=160

  syntax match subxString %"[^"]*"% | highlight link subxString Constant
  " match globals but not registers like 'EAX'
  syntax match subxGlobal %\<[A-Z][a-z0-9_-]*\>% | highlight link subxGlobal SpecialChar
endfunction
augroup LocalVimrc
  autocmd BufRead,BufNewFile *.cc call HighlightTangledFile()
  autocmd BufRead,BufNewFile *.subx set ft=subx
augroup END

" Scenarios considered:
"   opening or starting vim with a new or existing file without an extension (should interpret as C++)
"   opening or starting vim with a new or existing file with a .mu extension
"   starting vim or opening a buffer without a file name (ok to do nothing)
"   opening a second file in a new or existing window (shouldn't mess up existing highlighting)
"   reloading an existing file (shouldn't mess up existing highlighting)

command! -nargs=1 E call EditSubx("edit", <f-args>)
if exists("&splitvertical")
  command! -nargs=1 S call EditSubx("vert split", <f-args>)
  command! -nargs=1 H call EditSubx("hor split", <f-args>)
else
  command! -nargs=1 S call EditSubx("vert split", <f-args>)
  command! -nargs=1 H call EditSubx("split", <f-args>)
endif

function! EditSubx(cmd, arg)
  exec "silent! " . a:cmd . " " . SubxPath(a:arg)
endfunction

function! SubxPath(arg)
  if a:arg =~ "^ex"
    return "examples/" . a:arg . ".subx"
  else
    return "apps/" . a:arg . ".subx"
  endif
endfunction

" we often want to crib lines of machine code from other files
function! GrepSubX(regex)
  " https://github.com/mtth/scratch.vim
  Scratch!
  silent exec "r !grep -h '".a:regex."' *.subx */*.subx"
endfunction
command! -nargs=1 G call GrepSubX(<q-args>)

if exists("&splitvertical")
  command! -nargs=0 P hor split opcodes
else
  command! -nargs=0 P split opcodes
endif

" useful for inspecting just the control flow in a trace
" see https://github.com/akkartik/mu/blob/master/Readme.md#a-few-hints-for-debugging
" the '-a' is because traces can sometimes contain unprintable characters that bother grep
command! -nargs=0 L exec "%!grep -a label |grep -v clear-stream:loop"

" run test cursor around cursor
"   if test fails, open trace in split window
"   if test passes, just show output and wait for <CR>
"   don't move cursor in original window
" this solution is unfortunate, but seems forced:
"   can't put initial cursor movement inside function because we rely on <C-r><C-w> to grab word at cursor
"   can't put final cursor movement out of function because that disables the wait for <CR> prompt; function must be final operation of map
"   can't avoid the function because that disables the wait for <CR> prompt
" known issue:
"   cursor on '#' causes error
noremap <Leader>t {j0:call RunTestMoveCursor("<C-r><C-w>")<CR>
function RunTestMoveCursor(arg)
  exec "!run_one_test.sh ".expand("%")." ".a:arg
  exec "normal \<C-o>"
endfunction
function RunTestMoveCursorAndMaybeOpenTrace(arg)
  exec "!run_one_test.sh ".expand("%")." ".a:arg
  exec "normal \<C-o>"
  if v:shell_error
    noautocmd vertical split last_run
  endif
endfunction

set switchbuf=useopen
if exists("&splitvertical")
  command! -nargs=0 T badd last_run | sbuffer last_run
else
  command! -nargs=0 T badd last_run | vert sbuffer last_run
endif
pan> = p_contact_new("bob@server.com", "bob", groups, "both", "is offline", FALSE); gboolean result = p_contact_in_group(contact, "somegroup"); assert_true(result); p_contact_free(contact); // g_slist_free(groups); } void contact_not_in_group(void **state) { GSList *groups = NULL; groups = g_slist_append(groups, strdup("somegroup")); PContact contact = p_contact_new("bob@server.com", "bob", groups, "both", "is offline", FALSE); gboolean result = p_contact_in_group(contact, "othergroup"); assert_false(result); p_contact_free(contact); // g_slist_free(groups); } void contact_name_when_name_exists(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); const char *name = p_contact_name_or_jid(contact); assert_string_equal("bob", name); p_contact_free(contact); } void contact_jid_when_name_not_exists(void **state) { PContact contact = p_contact_new("bob@server.com", NULL, NULL, "both", "is offline", FALSE); const char *jid = p_contact_name_or_jid(contact); assert_string_equal("bob@server.com", jid); p_contact_free(contact); } void contact_string_when_name_exists(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); char *str = p_contact_create_display_string(contact, "laptop"); assert_string_equal("bob (laptop)", str); p_contact_free(contact); free(str); } void contact_string_when_name_not_exists(void **state) { PContact contact = p_contact_new("bob@server.com", NULL, NULL, "both", "is offline", FALSE); char *str = p_contact_create_display_string(contact, "laptop"); assert_string_equal("bob@server.com (laptop)", str); p_contact_free(contact); free(str); } void contact_string_when_default_resource(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); char *str = p_contact_create_display_string(contact, "__prof_default"); assert_string_equal("bob", str); p_contact_free(contact); free(str); } void contact_presence_offline(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); const char *presence = p_contact_presence(contact); assert_string_equal("offline", presence); p_contact_free(contact); } void contact_presence_uses_highest_priority(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource10 = resource_new("resource10", RESOURCE_ONLINE, NULL, 10); Resource *resource20 = resource_new("resource20", RESOURCE_CHAT, NULL, 20); Resource *resource30 = resource_new("resource30", RESOURCE_AWAY, NULL, 30); Resource *resource1 = resource_new("resource1", RESOURCE_XA, NULL, 1); Resource *resource2 = resource_new("resource2", RESOURCE_DND, NULL, 2); p_contact_set_presence(contact, resource10); p_contact_set_presence(contact, resource20); p_contact_set_presence(contact, resource30); p_contact_set_presence(contact, resource1); p_contact_set_presence(contact, resource2); const char *presence = p_contact_presence(contact); assert_string_equal("away", presence); p_contact_free(contact); } void contact_presence_chat_when_same_prioroty(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("chat", presence); p_contact_free(contact); } void contact_presence_online_when_same_prioroty(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("online", presence); p_contact_free(contact); } void contact_presence_away_when_same_prioroty(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("away", presence); p_contact_free(contact); } void contact_presence_xa_when_same_prioroty(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("xa", presence); p_contact_free(contact); } void contact_presence_dnd(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("dnd", presence); p_contact_free(contact); } void contact_subscribed_when_to(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "to", "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_true(result); p_contact_free(contact); } void contact_subscribed_when_both(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "both", "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_true(result); p_contact_free(contact); } void contact_not_subscribed_when_from(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, "from", "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_false(result); p_contact_free(contact); } void contact_not_subscribed_when_no_subscription_value(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_false(result); p_contact_free(contact); } void contact_not_available(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); gboolean result = p_contact_is_available(contact); assert_false(result); p_contact_free(contact); } void contact_not_available_when_highest_priority_away(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 20); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_false(result); p_contact_free(contact); } void contact_not_available_when_highest_priority_xa(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 20); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_false(result); p_contact_free(contact); } void contact_not_available_when_highest_priority_dnd(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 20); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_false(result); p_contact_free(contact); } void contact_available_when_highest_priority_online(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 20); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 10); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_true(result); p_contact_free(contact); } void contact_available_when_highest_priority_chat(void **state) { PContact contact = p_contact_new("bob@server.com", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 20); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_true(result); p_contact_free(contact); }