-
Notifications
You must be signed in to change notification settings - Fork 0
/
vimjournal.vim
174 lines (157 loc) · 7.13 KB
/
vimjournal.vim
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
"
" vimjournal plugin
"
" to install, save (or symlink) to your $HOME/.vim/ftdetect directory
"
" tagging scheme:
" / category
" + person, duration
" # topic
" = project
" ! problem
" > context
" @ place
" : data
" & skips
"
autocmd BufRead,BufNewFile *.log setl filetype=vimjournal
" presentation and code folding
autocmd FileType vimjournal setl autoindent sw=2 ts=8 nrformats=
autocmd FileType vimjournal setl nowrap linebreak breakindent showbreak=>\
autocmd FileType vimjournal setl foldmethod=manual foldtext=getline(v:foldstart-1) fillchars=fold:\
autocmd FileType vimjournal setl foldexpr=getline(v\:lnum)[15]=='\|'?'0'\:1 " imprecise, but fast
"autocmd FileType vimjournal setl foldexpr=strcharpart(getline(v\:lnum+1),14,2)=~'[-x=+*>]\|'?'<1'\:1
" keyboard shortcuts
autocmd FileType vimjournal nnoremap <TAB> za
autocmd FileType vimjournal nnoremap <S-TAB> :call ToggleWrap()<CR>
autocmd FileType vimjournal nnoremap <C-l> :Explore<CR>
autocmd FileType vimjournal nnoremap <C-o> yyp:s/.\|.*/>\| <CR>A
autocmd FileType vimjournal nnoremap <C-p> yyP:s/.\|.*/>\| <CR>A
autocmd FileType vimjournal nnoremap <C-t> :call AppendRecord()<CR>A
autocmd FileType vimjournal inoremap <C-t> <C-R>=strftime("%Y%m%d_%H%M")<CR>
autocmd FileType vimjournal inoremap <TAB> <C-P>
autocmd FileType vimjournal inoremap <S-TAB> <C-N>
" autocomplete configuration
autocmd FileType vimjournal setl complete=. " search only current buffer (faster)
autocmd FileType vimjournal setl completeopt= " disable autocomplete menu (annoying)
autocmd FileType vimjournal setl iskeyword+=@-@,/,#,=,!,>,:,- " include tag symbols in autocomplete
autocmd FileType vimjournal setl iskeyword-=_ " word navigation inside timestamps
" syntax definition use *.log because using `FileType vimjournal` requires a separate file in .vim/syntax
autocmd BufRead *.log syn keyword Bar │ contained
autocmd BufRead *.log syn match Date `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ].|` contained
autocmd BufRead *.log syn match NoStars `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][> ]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match OneStar `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][x1]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match TwoStar `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][-2]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match ThreeStar `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][=3]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match FourStar `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][+4]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match FiveStar `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ][*5]|.*$` contains=Bar,Date,Tags
autocmd BufRead *.log syn match Heading `^==[^ ].*$`
autocmd BufRead *.log syn match Heading `^## .*$`
autocmd BufRead *.log syn match Comments `^//.*$`
autocmd BufRead *.log syn match Comments ` // .*$`
" space then a tag character followed by a non-space, another tag or the end of line
autocmd BufRead *.log syn match Tags ` [/+#=!>@:&]\([^ |]\| \+[/+#=!>@:&]\| *$\).*` contained
autocmd FileType vimjournal hi Bar ctermfg=darkgrey
autocmd FileType vimjournal hi Date ctermfg=darkgrey
autocmd FileType vimjournal hi Tags ctermfg=darkgrey
autocmd FileType vimjournal hi NoStars ctermfg=darkgrey
autocmd FileType vimjournal hi OneStar ctermfg=darkgrey
autocmd FileType vimjournal hi TwoStar ctermfg=lightgrey
autocmd FileType vimjournal hi ThreeStar ctermfg=darkcyan
autocmd FileType vimjournal hi FourStar ctermfg=cyan
autocmd FileType vimjournal hi FiveStar ctermfg=white
autocmd FileType vimjournal hi Heading ctermfg=white
autocmd FileType vimjournal hi Comments ctermfg=lightgreen
autocmd FileType vimjournal hi Reference ctermfg=lightyellow
autocmd FileType vimjournal hi Folded ctermbg=NONE ctermfg=darkgrey
" jump to the end of the journal when first loaded
function JumpEnd()
if !exists("b:vimjournal_jumped")
normal Gzm
let b:vimjournal_jumped = 1
endif
setl foldmethod=expr
endfunction
autocmd Filetype vimjournal call JumpEnd()
" open a new record at the end of the journal without unfolding existing records
function AppendRecord()
call setreg("t", strftime("%Y%m%d_%H%M >| \n"))
normal G"tp
endfunction
" filter the current file using a regexp and display the results in a separate tab
" if no regexp is supplied, the last search pattern is used
function GrepJournalHeaders(regexp, files)
execute 'vimgrep `^[0-9A-Za-z]\{8\}_[0-9A-Za-z]\{4\}[<! ].|.*'.a:regexp.'`j '.a:files
call DisplayVimjournalQuickfixTab()
endfunction
function GrepJournals(regexp, files)
execute 'vimgrep `'.a:regexp.'`j '.a:files
call DisplayVimjournalQuickfixTab()
endfunction
autocmd FileType vimjournal command! -nargs=? Filter call GrepJournalHeaders(<f-args>, '%')
autocmd FileType vimjournal command! -nargs=? FilterX call GrepJournalHeaders(<f-args>, '%')
autocmd FileType vimjournal command! -nargs=? Find call GrepJournalHeaders(<f-args>, '*.log')
autocmd FileType vimjournal command! -nargs=? FindX call GrepJournals(<f-args>, '*.log')
" display the quickfix list in a tab with no formatting
function DisplayVimjournalQuickfixTab()
if !exists("g:vimjournal_copened")
$tab copen
set switchbuf+=usetab nowrap conceallevel=2 concealcursor=nc
let g:vimjournal_copened = 1
" switchbuf=newtab is ignored when there are no splits, so we use :tab explicitely
" https://vi.stackexchange.com/questions/6996
nnoremap <buffer> <Enter> :-tab .cc<CR>
else
$tabnext
normal 1G
endif
syn match metadata /^.*|[0-9]\+ col [-0-9]\+| / transparent conceal
endfunction
autocmd FileType vimjournal hi QuickFixLine ctermbg=None
" sort the quickfix list by stars and update the view
function SortByStars()
call setqflist(sort(getqflist(), { x, y -> y.text[14]->ToStars() - x.text[14]->ToStars() }))
call DisplayVimjournalQuickfixTab()
endfunction
autocmd FileType vimjournal command! Stars call SortByStars()
" convert a text character to the number of stars represented by that character
function ToStars(char)
if a:char == '*' || a:char == '5' | return 5
elseif a:char == '+' || a:char == '4' | return 4
elseif a:char == '=' || a:char == '3' | return 3
elseif a:char == '-' || a:char == '2' | return 2
elseif a:char == 'x' || a:char == '1' | return 1
else | return 0 | endif
endfunction
" find anacronisms: <C-n> for forward search
function FindNextAnac()
while line(".") != line("$")
if getline(".")[0:12] > getline(line(".") + 1)[0:12]
break
endif
normal j
endwhile
endfunction
autocmd FileType vimjournal nnoremap <C-n> :call FindNextAnac()<CR>
" find anacronisms: <C-h> for reverse search
function FindLastAnac()
while line(".") != 1
let current = getline(".")
if trim(current) != "" && current[0:12] < getline(line(".") - 1)[0:12]
break
endif
normal k
endwhile
endfunction
autocmd FileType vimjournal nnoremap <C-h> :call FindLastAnac()<CR>
" keep the screen fixed on the selected line when changing the wrap mode
function ToggleWrap()
let original_row = winline()
setl invwrap
let offset = winline() - original_row
if offset > 0
execute "normal ".offset."\<C-e>"
elseif offset < 0
execute "normal ".(-1 * offset)."\<C-y>"
endif
endfunction