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