У меня есть эти строки в моем ~/.inputrc
:
set editing-mode vi
set keymap vi
Это позволяет мне использовать vi
привязки клавиш в каждой программе, которая использует GNU readlines для ввода текста. Примеры: python
, irb
, sftp
, bash
, sqlite3
, и так далее. Это делает работу с командной строкой бризом. Matlab не использует readlines, но vi
привязки клавиш были бы удивительны, чтобы иметь при отладке или работе в интерактивном режиме. Существует ли существующее решение?
Я склонен использовать matlab -nosplash -nodesktop
из командной строки и это получило меня взгляды: было бы возможно записать обертку, которой действительно использует readlines и передает вход matlab
? (Если бы я должен реализовать это, я, вероятно, предпочел бы делать так в Ruby.)
Обновление:
Спасибо за справку. Это почти работает:
# See also: http://bogojoker.com/readline/
require 'readline'
puts 'Starting Matlab...'
io = IO.popen('matlab -nosplash -nodesktop 2>&1', 'w+')
while input_line = Readline.readline('>> ', true)
io.puts input_line
puts io.gets
end
Но это только читает одну строку из Matlab за один раз (потому что я использую gets
). Какие-либо идеи о том, как получить все до следующего раза, это ожидает входа? Вот то, что происходит (я ввожу материал в >>
подсказка):
Starting Matlab...
>> 1
>> 2
< M A T L A B (R) >
>> 3
Copyright 1984-2009 The MathWorks, Inc.
>> 4
Version 7.8.0.347 (R2009a) 32-bit (glnx86)
>> 5
February 12, 2009
>> 6
>> 7
>> 8
To get started, type one of these: helpwin, helpdesk, or demo.
>> 9
For product information, visit www.mathworks.com.
>> 0
>> 1
>>
>> 2
ans =
>> 3
>> 4
1
>> 5
>> 6
>>
>> 7
ans =
>> 8
>> 9
2
>> 0
>> 1
>>
>> 2
ans =
>> 3
>> 4
3
Да, это должно быть достаточно просто. Это просто частный случай общей проблемы «открыть процесс и привязать к его стандартным вводам и выводам», и это не сложно.
Небольшой поиск в Google обнаружил, что IO.popen ()
- это то, что нужно для этого в Ruby, и в ответах есть немного больше деталей: http: // groups. google.com/group/ruby-talk-google/browse_thread/thread/0bbf0a3f1668184c. Надеюсь, этого достаточно, чтобы вы начали!
Обновление: Похоже, вы почти закончили работу со своей оберткой. Что вам нужно для завершения, так это распознавать, когда Matlab запрашивает ввод, и только тогда запрашивать ввод у пользователя. Я предлагаю попробовать этот псевдокод:
while input_line = Readline.readline('>> ', true)
io.puts input_line
while ((output_line = io.gets) != '>> ') // Loop until we get a prompt.
puts io.gets
end
end
Это не совсем верно, так как вам нужно выполнить внутренний цикл один раз, прежде чем вы запросите первую строку ввода, но он должен дать вам представление. Возможно, вам также потребуется изменить текст приглашения, который он ищет.
Обновление 2: Хорошо, мы также должны учитывать тот факт, что после приглашения нет EOL, поэтому io.gets зависнет.Вот исправленная версия, в которой используется тот факт, что вы можете указать пустую строку в приглашении Matlab, и оно просто выдаст вам другое приглашение, ничего не делая. Я изменил цикл, чтобы сделать вещи немного понятнее, хотя это означает, что теперь вам нужно добавить логику, чтобы выяснить, когда вы закончите.
while [not done] // figure this out somehow
io.puts blank_line // This will answer the first
// prompt we get.
while ((output_line = io.gets) != '>> ') // Loop until we get a prompt.
puts io.gets // This won't hang, since the
end // prompt will get the blank
// line we just sent.
input_line = Readline.readline('>> ', true) // Get something, feed it
io.puts input_line // to the next prompt.
output_line = io.gets // This will eat the prompt that corresponds to
// the line we just fed in.
end
На самом деле, вам может быть лучше если не писать это на C - тогда вы можете напрямую вызвать движок Matlab . Это в основном позволяет вам писать свой собственный интерфейс для Matlab, если вы так склонны, используя библиотеку GNU Readline.