Vim: выполнить скрипт, над которым я работаю, на разделенном экране

16

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

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

Адам Матан
источник

Ответы:

9

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

command R !./%

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

Калеб
источник
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>

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

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

0x89
источник
Эта автокоманда не работала для меня, пока я не поместил первую строку (с \ if) в ту же строку, что и au BufEnter, но я удалил \
Jason Axelson
Vim может не поддерживать оболочку изначально, но я просто хотел упомянуть этот интересный плагин оболочки: vim.org/scripts/script.php?script_id=2771
Мистер Миккель,
:map ;e :w<cr>:!python %<cr>хочет отобразить что-то в моем буфере vim, чтобы «подтвердить» (?), что команда была выполнена Как мне заставить его просто выполнить команду без вывода сообщений? :map <silent> ...не похоже на работу.
Джонни Юта
5

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

 :!%
тротил
источник
Чтобы это работало, мне пришлось изменить его, :!./%чтобы скрипт находился в текущем каталоге.
Пол Винц
И я не эксперт, но похоже, что !vim говорит выполнить все, что следует, как команду bash, так что вы можете это сделать !echo "Hello". %Расширяются , чтобы быть именем текущего файла.
Пол Винц
2

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

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

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

Джек М.
источник
2

Bexec ВИМ плагин делает именно то , что вы хотите. Сочетания клавиш включены.

jmetz
источник
0

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

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

Хотя вы можете сделать это с помощью ctrl-zvim и вернуть его обратно, 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
Evan
источник
-1

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

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

Дэвид Спиллетт
источник
Вы уверены, что это работает на Vim? Кажется, он не отвечает в моем vim (я использую команду slpit для разделения файлов).
Адам Матан
Это команды GNU screen, а не vim.
InnaM
Ага. Я говорю о запуске vim на экране.
Дэвид Спиллетт
разделение vim - это то, что происходит в области окна vim (или терминала, в котором он работает).
hasen