Графический интерфейс Vim и matlab - Эмулировать работу Matlab Run (<F5>) с Vim

Я использую linux и gvim/vim в качестве внешнего редактора для matlab.

Используя редактор Matlab, вы можете запустить файл, нажав F5. Я пытаюсь воспроизвести это с помощью gvim-gtk (официальных пакетов debian).

Я знаю, что можно направить имя файла или выбор в matlab в "bash mode", как показано ниже:

execute '!echo "' ."run(\'".expand("%:p")."\')" . '"| matlab -nojvm' 
execute '!matlab -nodisplay < '.expand("%:p") 
noremap <C-CR> :?%%?;/%%/w !matlab -nojvm

Но я хочу использовать Matlab gui (который в моем случае уже открыт). Здесь решение, которое я подумал, может решить для меня:

  • Используйте сопоставление ключей в vim, которое:
    • (a) добавьте в буфер обмена что-то вроде: run ('путь к файлу') или cd ('folder'); run ('filename')
    • (b) вызовите команду оболочки, которая дает фокус графическому интерфейсу matlab
  • В этот момент я должен быть в командном окне Matlab, поэтому я просто нажимаю Ctrl-V, и содержимое буфера обмена должно быть вставлено. (Я использую linux, но matlab с ключевыми словами Windows)

Шаг 1a: Следующее поместит команду run ('filename') в буфер обмена, и Matlab вставляет ее при нажатии CTRL-V

let @+="run(\'".expand("%:p")."')" 

Следующие два будут работать с вставкой средней кнопки linux (но это не то, что я хочу, так как я хочу избежать мыши на этом шаге)

let @*="run(\'".expand("%:p")."')" 

execute '!echo "' . "run(\'".expand("%:p")."\')" . '"| xclip'  

Шаг 1b: Чтобы выделить фокус в окне Matlab, я использую следующую команду:

wmctrl -a MATLAB &

Это хорошо работает, но он также увидит ваш браузер, если вы находитесь на странице со словом matlab внутри заголовка (например, тот, который вы читаете...). (см. также более сложное решение Есть ли команда linux для определения идентификаторов окон, связанных с данным идентификатором процесса?)

Мой (теперь старый) вариант, но CTRL-V не работает! Только вставка мыши:

function! MatRun()
    let @+="run(\'".expand("%:p")."')" 
    let @*="run(\'".expand("%:p")."\')" 
    :call system('xclip', @+)
    !wmctrl -a MAT
endfunction

map <F5> :call MatRun() <cr><cr>

Как бы то ни было, CTRL-V в этом случае не работает в сочетании с wmctrl (см. ниже). Весь смысл для меня заключается в том, чтобы избежать использования мыши для этой операции.

Благодарим вас за помощь.

Редактировать и работать Мой плохой, я использовал xclip, где я должен был использовать xclip -selection c. См. Мой ответ ниже.

Я был бы рад, если бы кто-нибудь нашел лучшее решение, например: вставка непосредственно в командные окна Matlab, убедившись, что вы находитесь в командных окнах (Ctrl-0) или избегаете ловить браузер с помощью wmctrl.

Ответ 1

EDIT: См. Плагин, сделанный из него: https://github.com/elmanuelito/vim-matlab-behave

Извините за ответ на мой вопрос. Это плохо, я использовал xclip, где я должен был использовать xclip -selection c. Я помещаю ниже различные коды, которые работают для меня: он воспроизводит F5 и оценивает поведение ячейки, но вы должны нажать Ctrl-V или использовать мышь для вставки в командное окно Matlab. Если вы не находитесь в командном окне, воспользуйтесь сочетанием клавиш Ctrl + O для перехода к нему. script автоматически переходит от vim к matlab (если у вас нет другого окна с именем "matlab" ). Я добавил метки для возврата к предыдущей позиции курсора.

Чтобы запустить весь script matlab: Это поведение "Run/F5" (идет в правый каталог и исполняет целое script):

function! MatRun()
   normal mm " mark current cursor in mark m"
   let @+="cd('".expand("%:p:h")."\'); run('./".expand("%:f"). "')"
   call system('xclip -selection c ', @+)
   call system('xclip ', @+)
   normal `m "go back to cursor location"
   !wmctrl -a MATLAB 
endfunction
map ,m :call MatRun() <cr><cr>

Чтобы выполнить, оцените только ячейку: Это поведение Ctrl + Enter. В той же строке, что и выше: (edit: теперь я расширил ее так, чтобы она работала с первого восходящего %% ИЛИ начала файла (\% ^) до первого вниз %% OR конец файла (\ ^ $) end edit)

function! MatRunCell()
    normal mm "remember cursor"
    :?%%\|\%^?;/%%\|\%$/w !xclip -selection c  "pipe the cell to xclip"
    normal `m "go back to cursor location"
    !wmctrl -a MATLAB  "go to matlab window"
endfunction
map ,k :call MatRunCell()  <cr><cr>

Но мне нравится лучше следующий, хотя и более сложный (и, безусловно, можно сделать только vim-only). Следующее, гарантирует, что вы находитесь в правильном каталоге для запуска ячейки, а также возвращается к Vim после оценки ячейки (если вы правильно настроили внешний редактор в matlab.Я использую: gvim --servername MAT --remote-tab -silent).

 function! MatRunCellAdvanced()
     execute "!echo \"cd(\'".expand("%:p:h")."\')\">/tmp/buff"  
     normal mm
     :?%%\|\%^?;/%%\|\%$/w>> /tmp/buff
     execute "!echo \"edit ".expand("%:f")."\">>/tmp/buff"
     !cat /tmp/buff|xclip -selection c
     !cat /tmp/buff|xclip
     normal `m
     !wmctrl -a MATLAB 
 endfunction
map ,n :call MatRunCellAdvanced()  <cr><cr>

Текущая строка: Скопируйте текущую строку в буфер обмена и перейдите в окно Matlab. (еще раз Control + V, чтобы вставить его в matlab, если это короткий вы используете в Matlab)

 function! MatRunLine()
     " write current line and pipe to xclip "
     :.w !xclip -selection c
     !wmctrl -a MATLAB 
 endfunction
 map ,l :call MatRunLine()  <cr><cr>

Выполнить выбор: Эмулирует поведение F9.

  function! MatRunSelect()
     normal mm
     !rm -f /tmp/buff
     :redir > /tmp/buff
     :echo @*
     :redir END
     execute "!echo \" \">>/tmp/buff"
     execute "!echo \"edit ".expand("%:p")."\">>/tmp/buff"
     !cat /tmp/buff|xclip -selection c
      normal `m
     !wmctrl -a MATLAB 
  endfunction

Полужирный титул ячейки Жирный шрифт в заголовке ячейки

 highlight MATCELL cterm=bold term=bold gui=bold
 match MATCELL /%%.*$/

Где разместить эти команды Все эти команды в .vim/after/ftplugin/matlab.vim

изменить Вместо использования:

 run('./".expand("%:f")."')"

Теперь я использую

run('".expand("%:p")."')"

Чтобы иметь дело с случаем, когда vim 'pwd' отличается от каталога script. Я не нашел способ извлечь только имя script, поэтому я использую полный путь. Возможно, кто-то может найти для этого более приятное решение.

Ответ 2

Для тех из вас, кто просто хочет иметь возможность запускать скрипты matlab из vim и не нуждаться в других полезных материалах GUI, вы можете попробовать использовать оболочку командной строки matlab.

:! matlab -nosplash -nodesktop -r %:r запустит новую оболочку matlab и запустит текущий файл как script (или функцию без параметров), аналогичную тому, что F5 в графическом интерфейсе Matlab. Вам нужно будет ввести "exit", чтобы выйти из оболочки Matlab и обратно в vim. И, конечно, это работает только в том случае, если файл, который вы хотите запустить, находится в пути matlab или рабочем каталоге терминала.

Это может быть немного неудобно, и поскольку новый экземпляр matlab запускается все время, запуск script может занять некоторое время. Вы можете попробовать использовать -nojvm, чтобы избежать накладных расходов, вызванных java, но лучшим решением, на мой взгляд, является закрытие оболочки matlab.

Вы можете сделать это с помощью плагина Vim под названием Conque-Shell.
После установки вы можете запустить оболочку matlab с помощью :ConqueTerm matlab -nodesktop, и вы получите буфер, который вы можете использовать, как консоль matlab. Выполнение частей кода будет отлично работать с yank и paste. Или вы можете создать vim-функции, которые сделают это для вас. Поскольку я не очень хорош в этом, я могу предоставить только это уродливое отображение здесь:

:nmap <f5> :let @"=expand('%:r')<cr>:buffer matlab\ -nodesktop<tab><cr>""p<cr>

Ответ 3

Я делаю это в Windows, используя Autohotkey (который я также использую для замены клавиш Esc и Caps Lock). Autohotkey может быть установлен без прав администратора, полезен на корпоративных машинах.

Используя настройку, описанную ниже:

  • В gvim нажатие CTRL-L в нормальном режиме будет оценивать текущую строку в Matlab (затем вернуться к gvim).
  • В визуальном режиме он будет оценивать текущий выбор в Matlab (а также вернуться к Vim).

Режим ячейки может быть достигнут с помощью слегка отличающегося отображения для CTRL-E (см. ниже). (Autohotkey script будет выполнять в Matlab все, что помещается в буфер обмена с помощью отображения CTRL-E в gvim.) Затем вы можете настроить Matlab и gvim бок о бок или на разных экранах, и это отличный способ работы.

В моем файле Autohotkey я использую это сопоставление:

^l::
; execute line or current selection in Matlab
    IfWinActive, ahk_class Vim
    {
        ; CTRL-E is mapped to a Vim shortcut to yank the text you want
        Send, ^e
        WinActivate, ahk_class SunAwtFrame  
        Send, ^0^v{Enter}
        WinActivate, ahk_class ahk_class Vim
    } else if WinActive, ahk_class SunAwtFrame  
    {
        Send, ^0^v{Enter}
    } 
Return 

Затем в vim я использую следующий ярлык:

:nnoremap ^E Y
:vnoremap ^R y

Примечание: ^ E - буква CTRL-E, введенная в vim, нажав CTRL-V CTRL-E или CTRL-Q CTRL-E.

Примечание 2: SunAwtFrame - это то, что Windows вызывает окно Matlab на моей машине. Вы можете использовать Windowspy (который поставляется в комплекте с Autohotkey), чтобы подтвердить, что он называется тем же самым на вашем компьютере.