aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/nohai.vim
blob: 70a8adb05a7e13a1812bcb7d9c7e16297af11356 (plain)
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
" augroup nohai
" 	autocmd!
"
" 	" autocmd CmdlineLeave * call s:Nohai(expand('<afile>'))
" 	autocmd CmdlineEnter [/?] call s:Nohai(expand('<afile>'))
" augroup END

function! s:Nohai(cmdwin_char)
	echom 'called ' . a:cmdwin_char
	if a:cmdwin_char == '/' || a:cmdwin_char == '?'
		" nohlsearch
		" ^ doesn't work because the autocommand executes before leaving the
		" command line window

		call s:AddMapping(a:cmdwin_char)
	" else
	" 	call s:RemoveMapping()
	endif

	" call s:AutocmdOff()
endfunction

function! s:AddMapping(cmdwin_char)
	" silent! cnoremap <CR> <CR>:nohlsearch<CR>
	" silent! cnoremap <expr> <CR> s:CR(a:cmdwin_char)
	" silent! cnoremap <expr> <CR> <SID>CR(a:cmdwin_char)
	" silent! cnoremap <expr> <CR> <SID>CR('/')

	if a:cmdwin_char == '/' || a:cmdwin_char == '?'
		silent! cnoremap <expr> <CR> <SID>CR()
	endif
endfunction

function! s:RemoveMapping()
	silent! cunmap <CR>
endfunction

function! s:Deactivate()
	call s:RemoveMapping()
	call s:AutocmdOff()
endfunction

" function! s:CR(cmdwin_char)
" 	if a:cmdwin_char == '/' || a:cmdwin_char == '?'
" 		return "\<CR>:nohlsearch\<CR>"
" 		" ... and unmap
" 	else
" 		return "\<CR>"
" 	endif
" endfunction

function! s:CR()
	" return "\<CR>:nohlsearch\<CR>"

	" let expr = ''
	" let expr .= "\<CR>:nohlsearch\<CR>"
	" let expr .= ":call s:RemoveMapping()\<CR>"
    "
	" return expr

	" TODO: Use CmdlineLeave instead for e.g. <C-c>
	" call s:RemoveMapping()

	return "\<CR>:nohlsearch\<CR>"
endfunction

function! s:AutocmdOn()
	echom 'Turning on autocmd'
	augroup nohai
		autocmd!

		autocmd CmdlineEnter [/\?] call s:Nohai(expand('<afile>'))
		autocmd CmdlineLeave [/\?] call s:Deactivate()
	augroup END
endfunction

function! s:AutocmdOff()
	autocmd! nohai
endfunction

function! s:Search(command)
	echom 'Searching with ' . a:command
	" let s:on = 1

	" 1. Turn on autocmd
	" 2. Search (find out if this is blocked by function-search-undo)
	" 2.a. Search automatically disables autocmd

	call s:AutocmdOn()

	return a:command

	" let expr = ''
    "
	" let expr .= ":call s:AutocmdOn()\<CR>"
	" let expr .= a:command
    "
	" return expr
endfunction

" Impl idea 2
" autocmd is activated on init
" Search() from g/? mapping sets a script-local flag and exprs to /?
" s:Nohai() 

nnoremap <expr> <Plug>(nohai-search-backward) <SID>Search('?')
nnoremap <expr> <Plug>(nohai-search) <SID>Search('/')

nmap g? <Plug>(nohai-search-backward)
nmap g/ <Plug>(nohai-search)

" Using SID outside of script context?
" nnoremap <expr> g? <SID>Search('?')
" nnoremap <expr> g/ <SID>Search('/')