Vim: thực thi tập lệnh tôi đang làm việc trong một màn hình chia nhỏ


16

Tôi đang làm việc với một kịch bản python nhỏ, cần thực thi thường xuyên để gỡ lỗi và phát triển hơn nữa.

Tôi có thể tách màn hình vim và thực thi tập lệnh của mình trên một phần bằng tổ hợp phím không?

Câu trả lời:


8

Thêm dòng này vào .vimrc của bạn:

command R !./%

Và sau đó bạn có thể chỉ cần gõ ": R" trong khi ở Vim để chạy tập lệnh ( vim-run-current-file )


10

Vim không, và sẽ không bao giờ hỗ trợ shell được nhúng như emacs hoặc kate (nếu bạn muốn nói vậy), hãy xem câu hỏi stackoverflow này .

David Spillet đã đúng, bạn có thể chạy vim của mình trong màn hình gnu:

$ screen vim foo.txt

Nhưng điều đó sẽ chỉ cung cấp cho bạn một cái gì đó từ xa giống như một người quản lý cửa sổ trong một thiết bị đầu cuối - RẤT hữu ích khi được sử dụng trên ssh hoặc trên hộp không có X, nhưng tại địa phương bạn cũng có thể mở một xterm khác và chuyển đổi giữa chúng. *

Dù sao, nếu bạn có thể sống với thực tế là bạn sẽ không thấy tệp bạn đang chỉnh sửa trong khi xem đầu ra mà nó tạo ra, mẹo của Jack M là tốt, nhưng có thể ngắn hơn:

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

Với cùng một mục đích, tôi có cái này trong ~/.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>

Điều này chạy bất kỳ tập tin có một shebang ( #!) trên dòng đầu tiên. Nó sử dụng trình thông dịch để chạy tệp, vì vậy nó không cần phải có quyền thực thi.

* (màn hình có một số tính năng rất gọn gàng khác như sao chép và dán từ đầu ra, giám sát các cửa sổ ẩn cho hoạt động / không hoạt động, có thể sử dụng phiên từ các thiết bị đầu cuối khác nhau cùng một lúc, có thể đăng xuất khỏi tất cả các chương trình đang chạy - nó là một công cụ mạnh mẽ).


Chế độ tự động này không hoạt động với tôi cho đến khi tôi đặt dòng đầu tiên (với \ if) trên cùng dòng với au Buf Entry nhưng tôi đã xóa \
Jason Axelson

Vim có thể không hỗ trợ shell một cách tự nhiên, nhưng tôi chỉ muốn đề cập đến plugin shell thú vị này: vim.org/scripts/script.php?script_id=2771
Mr Mikkél

:map ;e :w<cr>:!python %<cr>muốn lặp lại nội dung vào bộ đệm vim của tôi để "xác nhận" (?) rằng lệnh đã chạy. Làm thế nào để tôi có được nó chỉ đơn giản là thực hiện lệnh một cách im lặng? :map <silent> ...không xuất hiện để làm việc
Johnny Utahh

5

Cách ít dài dòng nhất (đòi hỏi tập lệnh của bạn phải được thực thi) có lẽ là:

 :!%

Để làm việc này, tôi phải sửa đổi nó để :!./%kịch bản sẽ được tìm thấy trong thư mục hiện tại.
Paul Wintz

Và, tôi không phải là một chuyên gia, nhưng có vẻ như !vim bảo thực thi bất cứ điều gì theo lệnh bash, vì vậy bạn có thể làm !echo "Hello". Các %được mở rộng là tên của tập tin hiện hành.
Paul Wintz

2

Nó có thể không phải là màn hình chia nhỏ, nhưng điều này hoạt động khá tốt đối với tôi:

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

Bản đồ này ;eđể ghi ra tệp hiện tại và thực thi nó bằng python (nó giả định rằng python nằm trên của bạn PATH).


2

Các Bexec vim Plugin thực hiện chính xác những gì bạn muốn. Phím tắt bao gồm.




0

Đặt đoạn mã nhỏ này vào .vimrc của bạn để thực thi tệp hiện tại bằng một tổ hợp phím (như F5) và hiển thị kết quả trong bộ đệm ngăn chia mới.

:! không sao nhưng bạn cần chuyển sang thiết bị đầu cuối để xem kết quả.

Mặc dù bạn có thể làm điều đó với ctrl-zvà mang vim trở lại với fgnó vẫn có nghĩa là bạn cần phải chuyển đổi bối cảnh rất nhiều.

Cách thức hoạt động của đoạn mã này là bằng cách trước tiên đoán tệp thực thi dựa trên filetypevà sau đó chạy nó với tệp hiện tại làm đối số của nó.

Tiếp theo, một phương thức tiện ích tiện dụng sẽ lấy đầu ra và đưa nó vào một bộ đệm mới.

Nó không hoàn hảo, nhưng thực sự nhanh cho quy trình công việc chung.

Đây là đoạn trích được sao chép dưới đây:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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

-1

Tôi không biết trực tiếp về vim, nhưng bạn có thể chia đôi màn hình theo cách này nói chung với screentiện ích. ctrl+ a, S(lưu ý, đó là chữ S viết hoa) sẽ phân chia màn hình và bạn có thể chuyển đổi giữa hai với ctrl+ a, tab(nếu cửa sổ trống, sử dụng ctrl+ a, nđể di chuyển sang cửa sổ mở khác hoặc ctrl+ a, cđể tạo một cửa sổ mới) .

Bạn cũng có thể chia màn hình thành nhiều hơn hai và thay đổi kích thước của các phần tách bằng ctrl-a ,: thay đổi kích thước. Tôi sử dụng màn hình theo cách này thường xuyên, và mặc dù đó không phải là giải pháp một phím mà bạn yêu cầu, nó có thể rất thuận tiện.


Bạn có chắc là nó hoạt động cho Vim? Nó dường như không đáp ứng trong vim của tôi (tôi sử dụng lệnh slpit để phân chia giữa các tệp).
Adam Matan

Đây là màn hình GNU, không phải vim, lệnh.
innaM

Vâng. Tôi đang nói về việc chạy vim trong màn hình.
David Spillett

phân chia vim là một cái gì đó xảy ra trong vương quốc của cửa sổ vim (hoặc thiết bị đầu cuối mà nó đang chạy).
hasen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.