Подтвердить что ты не робот

Vi в командной строке Matlab?

У меня эти строки в моем ~/.inputrc:

set editing-mode vi 
set keymap vi

Это позволяет мне использовать привязки vi в каждой программе, использующей строки чтения GNU для ввода текста. Примеры: python, irb, sftp, bash, sqlite3 и т.д. Это делает работу с командной строкой легкой. Matlab не использует для чтения, но vi keybindings было бы удивительно иметь при отладке или работе в интерактивном режиме. Существует ли существующее решение?

Я стараюсь использовать matlab -nosplash -nodesktop из командной строки, и это заставило меня подумать: можно ли написать оболочку, которая использует строки чтения и передать вход в matlab? (Если мне нужно это реализовать, я бы предпочел сделать это в Ruby.)

Update:

Спасибо за помощь. Это почти работает:

# 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
4b9b3361

Ответ 1

Да, это должно быть легко. Это просто частный случай общего "открыть процесс и связать его с stdin и stdout", и это не сложно.

Немного исканий в 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

Ответ 2

Вы могли бы использовать rlwrap прямолинейно.

rlwrap is a wrapper that uses the GNU readline library to allow the editing
of keyboard input for any other command. 

http://utopia.knoware.nl/~hlub/rlwrap/#rlwrap

К сожалению, он блокирует контекстно-зависимую вкладку в MATLAB, которая полезна сама по себе.

Ответ 3

На самом деле вам лучше писать это на C, тогда вы можете напрямую вызвать механизм matlab. Это в основном позволяет вам писать свой собственный интерфейс в matlab, если вы так склонны, используя библиотеку GNU Readline.