Mapear um comando no Modo Visual resulta no erro E481: Nenhum intervalo permitido

9

Estou tentando criar uma ligação de teclado no Neovim que envie um bloco selecionado para o terminal Neovim aberto. Usei essas respostas como diretrizes https://vi.stackexchange.com/a/3390/3405 https://stackoverflow.com/a/6271254/859391

Embora, quando estou tentando chamar o comando com uma linha visual selecionada, continue recebendo o erro Sem intervalo permitido. Estou perdendo algo óbvio?

function! s:get_visual_selection()
  " Why is this not a built-in Vim script function?!
  let [lnum1, col1] = getpos("'<")[1:2]
  let [lnum2, col2] = getpos("'>")[1:2]
  let lines = getline(lnum1, lnum2)
  let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)]
  let lines[0] = lines[0][col1 - 1:]
  return join(lines, "\n")
endfunction

augroup Terminal
  au!
  au TermOpen * let g:last_terminal_job_id = b:terminal_job_id
augroup END

function! REPLSend(lines)
  call jobsend(g:last_terminal_job_id, lines[0])
  call jobsend(g:last_terminal_job_id, "\r") " needed for the way REPL handles the input
endfunction

command! REPLSendLine call REPLSend([s:get_visual_selection()])
vnoremap <silent> <leader>l :REPLSendLine<cr>
" leader is <Space>
6D65
fonte

Respostas:

9

Não tenho certeza, mas acho que quando você pressiona <leader>lpara ligar :REPLSendLine, o Vim insere automaticamente o intervalo visual '<,'>e, como seu comando não está definido com o atributo -range, gera um erro.

No seu mapeamento visual, você provavelmente deve adicionar o código-chave <C-U>para remover o alcance visual (ele não afetará as marcas '<e '>elas ainda serão válidas por dentro s:get_visual_selection()):

vnoremap <silent> <leader>l :<C-U>REPLSendLine<cr>

Além disso, talvez você possa tentar remover o comentário embutido " needed for the way REPL handles the inpute colocá-lo em uma linha separada e dedicada.

user9433424
fonte
Obrigado. ": <CU>" fez o truque. Além disso, o comentário que eu adicionei apenas para esta pergunta, para deixar mais claro o que eu estava procurando.
6D65