15

Я работаю над небольшим скриптом Python, который требует частого выполнения для отладки и дальнейшего развития.

Могу ли я разделить экран vim и выполнить мой скрипт на одной части нажатием клавиши?

9 ответов9

10

Vim не поддерживает и никогда не будет поддерживать встроенную оболочку, такую как emacs или kate (если вы это имеете в виду), см. Этот вопрос о переполнении стека.

Дэвид Спиллет прав, вы можете запустить vim на экране GNU:

$ screen vim foo.txt

Но это только даст вам нечто, отдаленно напоминающее оконный менеджер в терминале - ОЧЕНЬ полезно, когда используется через ssh или в окне без X, но локально вы также можете открыть другой xterm и переключаться между ними.*

В любом случае, если вы можете согласиться с тем фактом, что вы не увидите редактируемый файл, глядя на вывод, который он производит, совет Джека М хорош, но может быть короче:

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

Для той же цели у меня есть это в моем ~/.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>

Это запускает любой файл, который имеет шебанг (#!) на первой линии. Он использует интерпретатор для запуска файла, поэтому ему не нужно иметь разрешения на выполнение.

*(экран имеет некоторые другие очень удобные функции, такие как копирование и вставка из вывода, мониторинг скрытых окон на активность / отсутствие активности, возможность одновременного использования сеанса с разных терминалов, возможность выхода из всех программ. Бег - это мощный инструмент).

8

Добавьте эту строку в ваш .vimrc:

command R !./%

И тогда вы можете просто набрать ":R" в Vim для запуска скрипта (vim-run-current-file)

5

Наименее подробный способ (который требует, чтобы ваш скрипт был исполняемым):

 :!%
2

Плагин Bexec vim делает именно то, что вы хотите. Сочетания клавиш включены.

2

Возможно, это не разделенный экран, но для меня это работает довольно хорошо:

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

Это отображает ;e записать текущий файл и выполнить его с помощью python (предполагается, что python находится в вашем PATH).

1

Есть похожий вопрос StackOverflow.

0

Поместите этот небольшой фрагмент в ваш .vimrc, чтобы выполнить текущий файл одним нажатием клавиши (например, F5) и отобразить результат в новом буфере разделенной панели.

:! все в порядке, но вам нужно переключиться на свой терминал, чтобы увидеть результат.

Хотя вы можете сделать это с помощью ctrl-z и вернуть vim с помощью fg это все равно означает, что вам нужно много переключать контекст.

Путь этого фрагмент кода работает, сначала угадывание исполняемого файла на основе filetype , а затем запустить его с текущим файлом в качестве аргумента.

Затем удобный полезный метод берет вывод и сбрасывает его в новый буфер.

Это не идеально, но очень быстро для обычных рабочих процессов.

Вот фрагмент, скопированный ниже:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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
map <F5> :w<CR>:exe ":!python " . getreg("%") . "" <CR> 

Это то, что я использовал, пожалуйста (F5 запускает текущий скрипт).

Для превращения vim в мощную Python IDE я рекомендую этот урок:

-1

Я не знаю напрямую о vim, но вы можете разделить экран таким образом, как правило, с помощью утилиты screen . Ctrl+A, S (заметим, что это столица S) будет разделить экран , и вы можете переключаться между ними с Ctrl+A, вкладка (если окно является пустым, используйте сочетание клавиш Ctrl+а, п, чтобы перейти к другому открытому окну или ctrl+a, c, чтобы создать новый).

Вы также можете разделить отображение на более чем два, и изменить размер разбиений с помощью ctrl-a,:resize. Я часто использую экран таким образом, и хотя это не единственное решение, которое вы запрашиваете, оно может быть очень удобным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .