Привет! Я использую плагин 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
Большое спасибо.