Vim и MATLAB GUI-эмуляция matlab Run () с Vim

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

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

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

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

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

  1. используйте сопоставление ключей в vim, которое:
    • (a) поместите в буфер обмена что-то вроде: run('path-to-file') или cd('folder'); run('filename')
    • (b) вызовите команду оболочки, которая дает фокус на GUI matlab
  2. на данный момент я должен быть в окне команды 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.

3 ответов


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

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

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

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. В той же строке, чем выше: (редактировать: теперь я расширил его, чтобы он работал с первого вверх %% или начала файла ( \ % ^ ) до первого вниз %% или конца файла ( \ ^ $ )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). Следующее гарантирует, что вы находитесь в правильном каталоге для запуска ячейки, а также возвращается к 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.ВИМ

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

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

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

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

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


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

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

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

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

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


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

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

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

режим ячейки может быть достигнут с помощью немного другого отображения для CTRL-E (см. ниже). (Сценарий Autohotkey будет выполняться в 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), чтобы подтвердить, что он называется то же самое на вашем компьютере.