" Our private history.
let s:search_literal_hist =
      \ exists('s:search_literal_hist') ? s:search_literal_hist : []

function! searchparty#literal_search#find_literal(...)
  " First, empty the input history.
  call histdel('input')
  " next, add our own history.
  call map(copy(s:search_literal_hist), 'histadd("input", v:val)')
  " Prepare a prompt.
  let prompt = 'Literal Search ' . (a:0 && a:1 ? '/' : '?')
  " Search forward or backward.
  let search_cmd = a:0 && a:1 ? '/' : '?'
  " Get user's input.
  let input = input(prompt)
  "Thanks to \V only slashes and, backslashes or question marks need to be escaped.
  let escaped = a:0 && a:1 ? escape(input, '\/') : escape(input, '\?')
  " Allow control chars.
  call join(map(split(escaped, '\zs'), 'v:val =~# [[:control:]] ? "\<C-V>".v:val : v:val'))
  if empty(input)
    " Nothing to do here.
    return
  endif
  " Perform the search after we're done.
  call feedkeys("\<c-\>\<c-n>" . search_cmd . "\\V" . escaped . "\<CR>", 'n')
  call feedkeys(":call searchparty#mash#mash()\<CR>\<C-L>", 'n')
  "Add current string to our private history.
  call add(s:search_literal_hist, input)
endfunction