Paste into a :term window?

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Paste into a :term window?

Kelvin Lawrence
I'm enjoying the new :term feature in 8.1

I have my code on the left and a job running on the right. The job is a console environment for Groovy. Is there an easy way to copy from the code on the left and paste into the console I have running on the right? I know I cannot turn modifiable on but is there any way to send a paste command to the :term job?

I am using MacVim.

Many thanks in advance
Kelvin

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Paste into a :term window?

Lifepillar
On 25/10/2018 17:32, Kelvin Lawrence wrote:
> I'm enjoying the new :term feature in 8.1
>
> I have my code on the left and a job running on the right. The job is a console environment for Groovy. Is there an easy way to copy from the code on the left and paste into the console I have running on the right? I know I cannot turn modifiable on but is there any way to send a paste command to the :term job?

I use code similar to this:

   nnoremap <silent> <leader>x :<c-u>call TermSend([getline('.')])<cr>
   vnoremap <silent> <leader>x :<c-u>call TermSend(GetSelection())<cr>

   fun! TermSend(lines)
     if empty(get(b:, 'bound_terminal', '')) ||
        \ !bufexists(b:bound_terminal)
       let b:bound_terminal = str2nr(input('Terminal buffer: '))
     endif
     for l:line in a:lines
       call term_sendkeys(b:bound_terminal, l:line . "\r")
     endfor
     call cursor(line('.') + 1, 1) " Move to the next line
   endf

   fun! GetSelection()
     if getpos("'>") != [0, 0, 0, 0]
       let [lnum1, col1] = getpos("'<")[1:2]
       let [lnum2, col2] = getpos("'>")[1:2]
       let l:lines = getline(lnum1, lnum2)
       let l:lines[-1] = lines[-1][:col2-(&selection=='inclusive'?1:2)]
       let l:lines[0] = l:lines[0][col1 - 1:]
       return l:lines
     else
       return []
     end
   endf

Then typing \x will send the current line or the current selection to
a terminal buffer (the first time, you are prompted to choose the
buffer's number). The function sends one line at a time: it is slower
than sending the whole text in one swoop, but I have found it to be more
reliable.

Now, if only there was a simpler way to get the currently selected text…

Enjoy,
Life.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Paste into a :term window?

Marcin Szamotulski-3
Hi,

There's Ctrl-w-" followed by a register name, which puts the register in a terminal. It works only in terminal mode. Check out `:h terminal-typing`.

Best regards,
Marcin

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.

signature.asc (523 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Paste into a :term window?

Kelvin Lawrence
Thanks Marcin, this is just what I needed. Not sure how I missed this when reading the help!

Thanks
Kelvin

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Paste into a :term window?

Kelvin Lawrence
In reply to this post by Lifepillar
On Thursday, October 25, 2018 at 2:33:38 PM UTC-5, Lifepillar wrote:

> On 25/10/2018 17:32, Kelvin Lawrence wrote:
> > I'm enjoying the new :term feature in 8.1
> >
> > I have my code on the left and a job running on the right. The job is a console environment for Groovy. Is there an easy way to copy from the code on the left and paste into the console I have running on the right? I know I cannot turn modifiable on but is there any way to send a paste command to the :term job?
>
> I use code similar to this:
>
>    nnoremap <silent> <leader>x :<c-u>call TermSend([getline('.')])<cr>
>    vnoremap <silent> <leader>x :<c-u>call TermSend(GetSelection())<cr>
>
>    fun! TermSend(lines)
>      if empty(get(b:, 'bound_terminal', '')) ||
>         \ !bufexists(b:bound_terminal)
>        let b:bound_terminal = str2nr(input('Terminal buffer: '))
>      endif
>      for l:line in a:lines
>        call term_sendkeys(b:bound_terminal, l:line . "\r")
>      endfor
>      call cursor(line('.') + 1, 1) " Move to the next line
>    endf
>
>    fun! GetSelection()
>      if getpos("'>") != [0, 0, 0, 0]
>        let [lnum1, col1] = getpos("'<")[1:2]
>        let [lnum2, col2] = getpos("'>")[1:2]
>        let l:lines = getline(lnum1, lnum2)
>        let l:lines[-1] = lines[-1][:col2-(&selection=='inclusive'?1:2)]
>        let l:lines[0] = l:lines[0][col1 - 1:]
>        return l:lines
>      else
>        return []
>      end
>    endf
>
> Then typing \x will send the current line or the current selection to
> a terminal buffer (the first time, you are prompted to choose the
> buffer's number). The function sends one line at a time: it is slower
> than sending the whole text in one swoop, but I have found it to be more
> reliable.
>
> Now, if only there was a simpler way to get the currently selected text…
>
> Enjoy,
> Life.
Thanks for the detailed reply. Very informative,
Cheers
Kelvin

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
For more options, visit https://groups.google.com/d/optout.