it-swarm-pt.tech

Vim: execute o script em que estou trabalhando em uma tela dividida

Estou trabalhando em um pequeno script python, que precisa de execução frequente para depurar e desenvolver mais.

Posso dividir a tela do vim e executar meu script em uma parte pressionando uma tecla?

16
Adam Matan

Adicione esta linha ao seu .vimrc:

command R !./%

E então você pode simplesmente digitar ": R" enquanto no Vim para executar o script ( vim-run-current-file )

9
caleb

O Vim não oferece e nunca suportará um Shell embutido como emacs ou kate (se você quer dizer isso), consulte esta questão stackoverflow .

David Spillet está certo, você pode executar seu vim dentro da tela do GNU:

$ screen vim foo.txt

Mas isso apenas lhe dará algo remotamente parecido com um gerenciador de janelas em um terminal - MUITO útil quando usado sobre ssh ou em uma caixa sem X, mas localmente você também pode abrir outro xterm e alternar entre eles. *

De qualquer forma, se você consegue conviver com o fato de que não verá o arquivo que está editando enquanto olha a saída que ele produz, a dica de Jack M é boa, mas poderia ser mais curta:

:map ;e :w<cr>:!python %<cr>

Para o mesmo propósito, eu tenho isso em meu ~/.vimrc:

au BufEnter *
\if match( getline(1) , '^\#!') == 0 |
\ execute("let b:interpreter = getline(1)[2:]") |
\endif

fun! CallInterpreter()
    if exists("b:interpreter")
         exec ("!".b:interpreter." %")
    endif
endfun

map <F5> :call CallInterpreter()<CR>

Isso executa qualquer arquivo que tenha um Shebang (#!) na primeira linha. Ele usa o interpretador para executar o arquivo, portanto, não precisa ter permissões de execução.

* (a tela tem alguns outros recursos muito interessantes como copiar e colar da saída, monitorar janelas ocultas quanto a atividade/não atividade, ser capaz de usar a sessão de diferentes terminais ao mesmo tempo, ser capaz de sair de todos os programas em execução - é uma ferramenta poderosa).

10
0x89

A forma menos prolixa (que requer que seu script seja executável) é provavelmente:

 :!%
5
T.N.T.

O plugin Bexec vim faz exatamente o que você deseja. Atalhos de teclado incluídos.

2
jmetz

Pode não ser a tela dividida, mas funciona muito bem para mim:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

Este mapeia ;e para escrever o arquivo atual e executá-lo usando python (ele assume que python está em seu PATH).

2
Jack M.
1
R. Martinho Fernandes

Coloque este pequeno trecho em seu .vimrc para executar o arquivo atual com um toque de tecla (como F5) e exibir o resultado em um novo buffer de painel dividido.

:! está tudo bem, mas você precisa mudar para o seu terminal para ver o resultado.

Embora você possa fazer isso com ctrl-z e trazer o vim de volta com fg ainda significa que você precisa mudar muito o contexto.

A maneira como isso funciona snippet é primeiro adivinhando o executável com base em filetype e depois executando-o com o arquivo atual como seu argumento.

Em seguida, um método utilitário prático pega a saída e a despeja em um novo buffer.

Não é perfeito, mas muito rápido para fluxos de trabalho comuns.

Aqui está o snippet copiado abaixo:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" RUN CURRENT FILE """""""""""""""""""""""""""""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Execute current file
nnoremap <F5> :call ExecuteFile()<CR>

" Will attempt to execute the current file based on the `&filetype`
" You need to manually map the filetypes you use most commonly to the
" correct Shell command.
function! ExecuteFile()
  let filetype_to_command = {
  \   'javascript': 'node',
  \   'coffee': 'coffee',
  \   'python': 'python',
  \   'html': 'open',
  \   'sh': 'sh'
  \ }
  let cmd = get(filetype_to_command, &filetype, &filetype)
  call RunShellCommand(cmd." %s")
endfunction

" Enter any Shell command and have the output appear in a new buffer
" For example, to Word count the current file:
"
"   :Shell wc %s
"
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_Shell_commands_in_new_window
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>)
function! RunShellCommand(cmdline)
  echo a:cmdline
  let expanded_cmdline = a:cmdline
  for part in split(a:cmdline, ' ')
     if part[0] =~ '\v[%#<]'
        let expanded_part = fnameescape(expand(part))
        let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
     endif
  endfor
  botright new
  setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
  call setline(1, 'You entered:    ' . a:cmdline)
  call setline(2, 'Expanded Form:  ' .expanded_cmdline)
  call setline(3,substitute(getline(2),'.','=','g'))
  execute '$read !'. expanded_cmdline
  setlocal nomodifiable
  1
endfunction
0
Evan
map <F5> :w<CR>:exe ":!python " . getreg("%") . "" <CR> 

É o que usei com o please (F5 executa o script atual).

Para transformar o vim em um poderoso python IDE eu recomendo este tutorial:

0
Aymeric