Como alternar entre o buffer vim e a tela do shell de comando no vim?

3

Eu acho irritante pressionar constantemente Ctrl-Z e, em seguida, fg para ir entre essas telas (onde terminal de comando é a linha de comando que você usou para invocar vim de). Ele também gera fg linhas indesejadas no meu console. Tenho certeza de que isso pode ser feito quando me lembro de quando estava na universidade, mas não me lembro como.

Informações sobre terminais e sua relação com o vim

terminal vt100 e outros têm uma maneira de salvar a tela antes de alterá-lo e, em seguida, ele pode restaurá-lo quando quiser. vim faz isso e pode ser visto se você entrar em vim e depois shell ou Ctrl-Z out. Na maioria das vezes, ele mostrará o que você tinha na tela antes de inserir vim salvando a tela antes de pintar a tela vim . Se o seu terminal não suportar essa funcionalidade, ele apenas colocará a linha de comando diretamente sob a tela vim , rolando-a para cima. Isso pode ser visto exportando para a variável TERM uma emulação de terminal menos funcional ou limpando-a (embora, limpando-a, ela possa colocar vim no modo de linha ou usar o mais básico dos códigos de terminal, dependendo de sua implementação). Para ver mais sobre salvar / restaurar uma tela, consulte Introdução dos códigos de terminal (ANSI / VT100) , sob o título < em> Salvar / restaurar tela .

    
por Adrian 24.03.2015 / 16:48

3 respostas

0

Ok, descobri como posso fazer isso com a ajuda de Gary Johnson nos Grupos do Google vim_use group. Ele ajudou a dizer como executar os comandos tput do vim. Aqui está minha solução final:

  1. Tenha o seguinte script de função na memória vim:

    function! ShowTerm()
        call system(">/dev/tty tput rmcup")
        call input("")
        call system(">/dev/tty tput smcup")
        redraw!
    endfunction
    
  2. Mapeie o script para uma sequência de teclas de comando como esta:

    map [= :call ShowTerm()<CR>
    

Eu usei a sequência [= , mas você pode usar o que quiser.

Agora digite a sequência de teclas e você verá a outra tela. Pressione Enter e você está de volta à tela do vim. O Enter não adiciona um avanço de linha à tela do terminal, então não há linhas de marcha.

Nice! :) Note que provavelmente não é assim que foi feito 15-20 anos atrás, mas funciona.

EDITAR

Para não depender de tput estar disponível, descobri que o @MarkPlotnick inferiu os trabalhos da mesma maneira. Basta substituir a função ShowTerm() acima por:

function! ShowTerm()
    silent !read -sN 1
    redraw!
endfunction

Isso depende do bash sendo usado como o shell (ou outros que possuem uma chamada de leitura semelhante).

2ª edição

Além disso, você pode automatizá-lo colocando um arquivo .vim em sua pasta ~ / .vim / plugins que contém o seguinte:

" Function that allows viewing command line display last time it was seen.
" Note: Will only work on terminals that allow saving/restoring the display.
function! ShowTerm()
    " This will invoke the command shell and call the read function.
    " Will exit when a key is pressed.  This is specific to bash and
    " and may have to be changed if using a different shell.
    silent !read -sN 1
    redraw!
endfunction

" Maps [= sequence to view command line display last time it was seen.
map [= :call ShowTerm()<CR>
    
por 25.03.2015 / 00:28
2

A partir de gvim abre uma nova janela, por isso a janela do terminal fica disponível para comandos. Para "escudos de shell" intermediários eu faço :sh para obter acesso a uma sessão de shell e digite <Ctrl>-D para sair dela; não é necessário fg , mas neste caso é adicionado um prompt ao shell do console. E sem X em execução, inicio dois consoles, um em que o vim está em execução, e o outro em que o shell está em execução, e alterno os consoles por (no meu caso), e. %código%. (Dependendo das necessidades reais, uma dessas opções deve caber; espero.)

    
por 24.03.2015 / 17:20
0

O comando :shell do Vim funciona como você deseja? :shell<return> faz com que o Vim rode seu $ SHELL. Quando você sai do shell, você está de volta em Vim, exatamente onde parou.

    
por 24.03.2015 / 16:56

Tags