режим ввода vi в командной строке Matlab? - PullRequest
19 голосов
/ 04 марта 2010

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

set editing-mode vi 
set keymap vi

Это позволяет мне использовать vi сочетания клавиш в каждой программе, которая использует строки чтения GNU для ввода текста. Примеры: python, irb, sftp, bash, sqlite3 и т. Д. Это облегчает работу с командной строкой. Matlab не не использует readline, но 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

Ответы [ 3 ]

5 голосов
/ 05 марта 2010

Да, это должно быть достаточно просто. Это всего лишь частный случай общей проблемы «открыть процесс и связать его с 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
4 голосов
/ 15 декабря 2010

Вы могли бы использовать 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 голосов
/ 05 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...