Можно ли извлечь файл .wav из буфера в vimscript и сохранить его как .mp3 в локальной папке? - PullRequest
0 голосов
/ 13 апреля 2020

Привет! Я использую плагин vim с именем eblook , который превращает консоль vim в словарь. Текущая реализация плагина заключается в извлечении медиа-данных wav из буфера и сохранении их в локальном временном каталоге как wav-файл, а затем в проигрывателе используется медиаплеер по умолчанию.

Как я использую Ma c, Я хотел бы использовать afplay в качестве медиа-плеера по умолчанию в Ma c, но по какой-то причине он не сможет воспроизвести сохраненный по умолчанию файл с расширением .wav. Я проверил, если я вручную изменю имя извлеченного файла на .mp3, то тот же звуковой файл может быть воспроизведен с помощью afplay.

Но я не знаю синтаксиса vimscripts, поэтому не буду знать, что именно является шагом для извлечения файла мультимедиа из буфера содержимого и каким шагом является его сохранение в локальной папке. Может кто-то знает, что vimscripts может дать мне некоторую подсказку, если возможно извлечь медиа-файл из буфера содержимого и затем сохранить файл с расширением .mp3 в качестве имени расширения вместо .wav?

Я включил исходный код как показано ниже:

if !exists('eblook_viewers')
  if has('win32') || has('win64')

    let eblook_viewers = {
      \'jpeg': ' start ""',
      \'bmp': ' start ""',
      \'pbm': ' start ""',
      \'wav': ' start ""',
      \'mpg': ' start ""',
    \}
  else

    let eblook_viewers = {
      \'jpeg': 'open %s &',
      \'bmp': 'open %s &',
      \'pbm': 'open %s &',
      \'wav': 'open %s &',
      \'mpg': 'open %s &',
    \}
  endif
endif

Я перешел на afplay, но wav не сможет воспроизвести, получил сообщение Воспроизведение файла: /var/folders/lb/8td75nmj645dc8f3tpszyqq00000gn/T/vgc4Sqa/8.wav Ошибка: AudioFileOpen не удалось ('dta?'), так как afplay по какой-то странной причине не может воспроизвести извлеченный файл в расширении 8.wav, но может воспроизвести, если переименовать этот файл в 8.mp3

параметр eblook_viewers используется в следующей функции:

" extract the media file located near the current cursor from content buffer
" and use external program to display/play its content
" @param count [count] index number of the media object to be displayed
function! s:ShowMedia(count)
  if a:count > 0
    let index = a:count
    if a:count > len(b:contentrefsm)
      let index = len(b:contentrefsm)
    endif
  else
    let index = s:GetIndex('<\zs\d\+\ze[〈《]')
    if strlen(index) == 0
      return
    endif
  endif

  let ref = get(b:contentrefsm, index - 1)
  if type(ref) != type([])
    return
  endif
  let ftype = ref[0]
  let refid = ref[1]

  let tmpext = substitute(ftype, ':.*', '', '')
  if tmpext ==# 'mono'
    let tmpext = 'pbm'
  endif
  " mspaint must use '\' as path divide
  let tmpfshell = tempname() . '.' . tmpext
  " eblook cannot use '\' as path divide 
  let tmpfeb = substitute(tmpfshell, '\\', '/', 'g')

  let dictlist = s:GetDictList(b:group)
  let dict = dictlist[b:dictnum]
  execute 'redir! >' . s:cmdfile
    if exists("dict.book")
      silent echo 'book ' . s:MakeBookArgument(dict)
    endif
    silent echo 'select ' . dict.name
    if tmpext ==# 'pbm'
      let m = matchlist(ftype, 'mono:\(\d\+\)x\(\d\+\)')
      silent echo 'pbm ' . refid . ' ' . m[1] . ' ' . m[2]
    elseif tmpext ==# 'wav'
      let m = matchlist(refid, '\(\d\+:\d\+\)-\(\d\+:\d\+\)')
      silent echo 'wav ' . m[1] . ' ' . m[2] . ' "' . tmpfeb . '"'
    elseif tmpext ==# 'mpg'
      let m = matchlist(refid, '\(\d\+\),\(\d\+\),\(\d\+\),\(\d\+\)')
      silent echo printf('mpeg %s %s %s %s "%s"', m[1], m[2], m[3], m[4], tmpfeb)
    else " bmp || jpeg
      silent echo tmpext . ' ' . refid . ' "' . tmpfeb . '"'
    endif
  redir END
  let res = system('"' . g:eblookprg . '" ' . s:eblookopt . ' < "' . s:cmdfile . '"')
  let ngmsg = matchstr(res, 'eblook> \zsNG: .*\ze\n')
  if v:shell_error || strlen(ngmsg) > 0
    echomsg tmpext . 'File extract failed: ' . (v:shell_error ? res : ngmsg)
    return
  endif
  if tmpext ==# 'pbm'
    let pbm = substitute(res, 'Warning: you should specify a book directory first', '', '')
    let pbm = substitute(pbm, 'eblook> ', '', 'g')
    let pbm = substitute(pbm, '\%^\n\n', '', '')
    execute 'redir! > ' . tmpfshell
      silent echon pbm
    redir END
  endif

  let viewer = get(g:eblook_viewers, tmpext, '')
  if strlen(viewer) == 0
    echomsg tmpext . 'no viewer was set in g:eblook_viewers'
    return
  endif
  if match(viewer, '%s') >= 0
    let cmdline = substitute(viewer, '%s', shellescape(tmpfshell), '')
  else
    let cmdline = viewer . ' ' . shellescape(tmpfshell)
  endif
  " hit-enter prompt is unnecessary, thus set to silent
  execute 'silent !' . cmdline
endfunction

Большое спасибо.

The eblook.vim plugin

...