режим ввода vi в командной строке Matlab?

У меня есть эти строки в моем ~/.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
19
задан asheeshr 11 March 2013 в 13:40
поделиться

2 ответа

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

Небольшой поиск в 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
5
ответ дан 30 November 2019 в 05:12
поделиться

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

3
ответ дан 30 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: