Как реализовать режим ячеек, подобный MATLAB, в Vim

В MATLAB мы можем написать в редактор следующее

%% -- a example cell --

plot(rand(3));

%% -- another cell
A=rand(2^10);
t=linspace(-pi,pi,2^10);
compass(fft(A*sin(t))

и мы можем просто нажать Ctrl+Enter, чтобы запустить ячейку, по которой щелкнули указателем мыши.

Теперь я знаю, что в Vim я могу сделать

:'<,>'w !matlab для запуска визуально выбранного блока кода.

Но как реализовать в Vim/gVim режим ячеек, подобный MATLAB?

Например, какой-нибудь код на питоне

import os
import subprocess
import random

## 1st cell
ps =["python", "-h"]
out = subprocess.Popen(ps).communicate()[0]
print out

## 2nd cell

# import random -sould not be needed if we concatenate the import section and the cell
print random.randint(1,100)

Кто-нибудь может предложить какие-нибудь идеи?


person Jerry Gao    schedule 23.02.2011    source источник
comment
На slime-vim стоит взглянуть. Он использует сеансы screen для отправки частей вашего кода в открытый интерпретатор.   -  person Eelvex    schedule 24.02.2011
comment
это хорошее предложение для вывода кода дисплея вне vim, спасибо   -  person Jerry Gao    schedule 24.02.2011


Ответы (2)


Не уверен, что именно вы спрашиваете, но если вы хотите обработать блок ячеек при двойном щелчке в блоке мышью, вы можете сопоставить двойной щелчок мыши (отображение <2-LeftMouse>) для вызова функции:

nnoremap <buffer> <2-LeftMouse> :call ProcessMouseDoubleClick()<CR>

ProcessMouseDoubleClick() будет функцией, которая (1) визуально выбирает область «ячейки» и (2) выдает '<,>'w !matlab, чтобы Matlab запускал выбранный код.

При вызове ProcessMouseDoubleClick курсор Vim будет расположен в любой точке документа, которую вы щелкнули. Кроме этого, нет ничего особенного для мыши. Таким образом, вы также можете сопоставить любую клавишу с той же функцией, например, мнемоническую команду для «оценки ячейки»:

map <buffer> <Leader>ec :call ProcessMouseDoubleClick()<CR>

Таким образом, на самом деле нет никакой причины иметь имя функции, ссылающееся на мышь, вы можете назвать ее как-то вроде EvaluateMatlabCell().

person Herbert Sitz    schedule 23.02.2011
comment
спасибо за ответ, но визуально выделить область ячейки можно только выделением сплошного блока. если я хочу выбрать как раздел импорта, так и вторую ячейку, как мне это сделать? - person Jerry Gao; 23.02.2011
comment
@jerry: Аааа, если это вопрос, вам просто нужно встроить логику в функцию. Если вы убедитесь, что операторы импорта находятся в одном блоке в буфере, вы можете (1) найти операторы импорта и скопировать их для регистрации, (2) вернуться в ячейку, вставить блок импорта вверху ячейки, (3) выбрать ячейку и обработать в Matlab и (4) удалить операторы импорта, которые вы скопировали в ячейку. Вероятно, есть более простые способы сделать это, но я не совсем уверен, в чем заключается ваш главный камень преткновения. - person Herbert Sitz; 23.02.2011
comment
привет, Герберт, я только что получил кое-что для работы, :?##?;/##/w !python эта команда будет искать до ##, затем вниз до другого ##, а затем передать его в w !python , оно работает :) - person Jerry Gao; 23.02.2011
comment
jerry -- да, это хороший способ выбрать то, что вы называете ячейкой, но он не получит команды импорта, если они вам тоже понадобятся. Вам не нужно выполнять импорт каждый раз, однако, выдача их только один раз в начале сеанса редактирования работает, если вы используете один и тот же сеанс Python на протяжении всего сеанса. Теперь вы можете просто сопоставить составную команду с клавишей (сопоставление с ‹ctrl-enter› работает в gvim, но не во многих терминалах), и все готово. - person Herbert Sitz; 24.02.2011
comment
Герберт - вы знаете, как объединить 2 диапазона? например строки 1,10 и 30,40, я думаю, что w !python - это из буфера в python, но если мы не можем использовать несколько диапазонов, нам нужно объединить 2 диапазона в новый буфер, а затем записать этот буфер в python. - person Jerry Gao; 24.02.2011
comment
jerry -- Почему бы просто (1) не вставить операторы импорта в начало нужной ячейки, (2) выбрать ячейку, (3) выполнить python, а затем (4) удалить вставленные операторы импорта? Это сработает. НО, вы также должны проверить компиляцию поддержки python в свой Vim. В этом случае нет необходимости каждый раз включать операторы импорта, поскольку сеанс Python сохраняется до тех пор, пока открыт экземпляр Vim. Читать :h python. - person Herbert Sitz; 24.02.2011
comment
:h python имеет много хороших вещей, возможно, он сможет получить терминал python в vim в виде отдельного окна. :) - person Jerry Gao; 24.02.2011
comment
Если вы используете Python, у меня есть простой, но полезный небольшой плагин, который превращает Vim в очень гибкий блокнот для Python. Было бы тривиально добавить функцию автоматического выбора блоков кода, я думаю, что сейчас это требует визуального выбора. . . github.com/hsitz/PyScratch - person Herbert Sitz; 25.02.2011

Вот мой вариант для матлаба, но его можно легко адаптировать под питон. Он переключается с vim на окно Matlab, а затем вы вставляете с помощью мыши или сочетания клавиш. Я подробно описал это там: Vim и графический интерфейс Matlab - Эмуляция Matlab Run (‹F5›) с помощью Vim

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

function! MatRunCellAdvanced()
   execute "!echo \"cd(\'".expand("%:p:h")."\')\">/tmp/buff"  
   :?%%?;/%%/w>> /tmp/buff
   execute "!echo \"edit ".expand("%:f")."\">>/tmp/buff"
   !cat /tmp/buff|xclip -selection c
   !cat /tmp/buff|xclip
   !wmctrl -a MATLAB 
endfunction
map ,n :call MatRunCellAdvanced()  <cr><cr>
person e-malito    schedule 21.04.2012
comment
спасибо за ваш ответ, это интересно, но почему бы вам просто не сделать что-то вроде ?%%?;/%%/w !matlab ? - person Jerry Gao; 30.04.2012
comment
Я использую это, чтобы не открывать новый экземпляр Matlab и пользоваться графическим интерфейсом Matlab. Если в моем коде будет ошибка, матлаб выведет в командном окне ссылку, которая по нажатию на нее откроет в gvim нужный файл на правильной строке. Это невозможно без графического интерфейса. Я считаю, что этот вариант стоит кликнуть! - person e-malito; 15.05.2012