Vim: jalankan script yang sedang saya kerjakan di layar terbagi

16

Saya sedang mengerjakan skrip python kecil, yang perlu sering dieksekusi untuk debug dan mengembangkan lebih lanjut.

Bisakah saya membagi layar vim dan menjalankan skrip saya pada satu bagian dengan penekanan tombol?

Adam Matan
sumber

Jawaban:

8

Tambahkan baris ini ke .vimrc Anda:

command R !./%

Dan kemudian Anda bisa mengetik ": R" saat di Vim untuk menjalankan skrip ( vim-run-current-file )

caleb
sumber
10

Vim tidak, dan tidak akan pernah mendukung shell yang tertanam seperti emacs atau kate (jika Anda maksudkan itu), lihat pertanyaan stackoverflow ini .

David Spillet benar, Anda dapat menjalankan vim Anda di dalam layar gnu:

$ screen vim foo.txt

Tapi itu hanya akan memberi Anda sesuatu yang mirip windowmanager di terminal - SANGAT berguna ketika digunakan lebih dari ssh atau pada kotak tanpa X, tetapi secara lokal Anda juga bisa membuka xterm lain dan beralih di antara mereka. *

Bagaimanapun, jika Anda dapat hidup dengan fakta bahwa Anda tidak akan melihat file yang sedang Anda edit sambil melihat output yang dihasilkannya, tip Jack M baik, tetapi bisa lebih pendek:

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

Untuk tujuan yang sama, saya memiliki ini di ~/.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>

Ini menjalankan file apa pun yang memiliki shebang ( #!) di baris pertama. Menggunakan interpreter untuk menjalankan file, sehingga tidak perlu memiliki izin untuk mengeksekusi.

* (layar memiliki beberapa fitur lain yang sangat rapi seperti salin dan tempel dari output, memantau jendela tersembunyi untuk aktivitas / tidak ada aktivitas, dapat menggunakan sesi dari terminal yang berbeda pada saat yang sama, dapat logout meninggalkan semua program menjalankan - ini adalah alat yang ampuh).

0x89
sumber
Perintah otomatis ini tidak berfungsi untuk saya sampai saya meletakkan baris pertama (dengan \ jika) pada baris yang sama dengan au BufEnter tetapi saya menghapus \
Jason Axelson
Vim mungkin tidak mendukung shell secara asli, tetapi saya hanya ingin menyebutkan plugin shell yang menarik ini: vim.org/scripts/script.php?script_id=2771
Mr Mikkél
:map ;e :w<cr>:!python %<cr>ingin mengulangi hal-hal ke buffer vim saya untuk "mengkonfirmasi" (?) bahwa perintah dijalankan. Bagaimana saya mendapatkannya hanya menjalankan perintah diam-diam? :map <silent> ...tampaknya tidak berfungsi.
Johnny Utahh
5

Cara paling tidak bertele-tele (yang mengharuskan skrip Anda dapat dieksekusi) mungkin:

 :!%
TNT
sumber
Agar ini berfungsi, saya harus memodifikasinya :!./%sehingga skrip akan ditemukan di direktori saat ini.
Paul Wintz
Dan, saya bukan ahli, tetapi tampaknya !memberitahu vim untuk mengeksekusi apa pun yang mengikuti sebagai perintah bash, sehingga Anda dapat melakukannya !echo "Hello". Itu %diperluas menjadi nama file saat ini.
Paul Wintz
2

Mungkin tidak terbagi layar, tapi ini bekerja dengan baik untuk saya:

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

Ini memetakan ;euntuk menulis file saat ini, dan menjalankannya menggunakan python (diasumsikan bahwa python ada di Anda PATH).

Jack M.
sumber
2

The Bexec vim Plugin tidak persis apa yang Anda inginkan. Pintasan keyboard disertakan.

Jmetz
sumber
0

Masukkan potongan kecil ini di .vimrc Anda untuk mengeksekusi file saat ini dengan satu keystroke (seperti F5) dan menampilkan hasilnya dalam buffer split-pane baru.

:! tidak apa-apa tetapi Anda perlu beralih ke terminal Anda untuk melihat hasilnya.

Meskipun Anda dapat melakukannya dengan ctrl-zdan membawa vim kembali dengan fgitu masih berarti Anda perlu banyak mengubah konteks.

Cara potongan ini bekerja adalah dengan terlebih dahulu menebak yang dapat dieksekusi berdasarkan filetypedan kemudian menjalankannya dengan file saat ini sebagai argumennya.

Selanjutnya metode utilitas berguna mengambil output dan membuangnya ke buffer baru.

Itu tidak sempurna, tetapi sangat cepat untuk alur kerja umum.

Berikut cuplikan yang disalin di bawah:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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
Evan
sumber
-1

Saya tidak tahu tentang vim secara langsung, tetapi Anda dapat membagi layar dengan cara ini secara umum dengan screenutilitas. ctrl+ a, S(perhatikan, huruf besar S) akan membagi tampilan dan Anda dapat beralih antara keduanya dengan ctrl+ a, tab(jika jendela kosong, gunakan ctrl+ a, nuntuk pindah ke jendela lain yang terbuka atau ctrl+ a, cuntuk membuat yang baru) .

Anda dapat membagi tampilan menjadi lebih dari dua juga, dan mengubah ukuran split dengan ctrl-a,: resize. Saya sering menggunakan layar dengan cara ini, dan meskipun itu bukan solusi satu-kunci yang Anda minta itu bisa sangat nyaman.

David Spillett
sumber
Apakah Anda yakin itu bekerja untuk Vim? Tampaknya tidak merespons dalam vim saya (saya menggunakan perintah slpit untuk membagi file).
Adam Matan
Ini adalah layar GNU, bukan vim, perintah.
innaM
Ya. Saya berbicara tentang menjalankan vim di dalam layar.
David Spillett
split vim adalah sesuatu yang terjadi di dalam ranah vim window (atau terminal yang menjalankannya).
hasen