Как создать приложение на основе оболочки в ruby ​​[duplicate]

Вы не можете освобождать неуправляемую память от управляемого кода. Вам нужно написать подпрограмму в C, которая называет free указателем, возвращаемым функцией Run , и P / вызывается из .NET.

Another опция состоит в том, чтобы выделить неуправляемую память в .NET, передать указатель на функцию C, которая заполнит ее данными и, наконец, освободит этот указатель:

  IntPtr ptr = Marshal.AllocHGlobal (100 * sizeof (  символ));  SomeUnmanagedFunc (PTR);  Marshal.FreeHGlobal (PTR);   
13
задан davispuh 24 March 2012 в 20:45
поделиться

6 ответов

Вы хотите использовать REPL - Read → Evaluate → Print Loop.

IRB, например, реализует REPL для языка Ruby.

Вот очень простая реализация REPL:

loop do
  Application::Console.prompt.display
  input = gets.chomp
  command, *params = input.split /\s/

  case command
  when /\Ahelp\z/i
    puts Application::Console.help_text
  when /\Aopen\z/i
    Application::Task.open params.first
  when /\Ado\z/i
    Application::Action.perform *params
  else puts 'Invalid command'
  end
end

\A и \z соответствует началу строки и концу строки соответственно.

18
ответ дан Matheus Moreira 16 August 2018 в 00:16
поделиться
  • 1
    хорошо, спасибо, показывая один из способов, как я мог бы реализовать метод класса консоли и начать " :) – davispuh 24 March 2012 в 22:08
  • 2
    @davispuh Я забыл о подсказке - обновленный ответ с улучшенной реализацией. Ваш метод start должен содержать только цикл. – Matheus Moreira 24 March 2012 в 22:28
  • 3
    Я принял этот ответ, потому что он рекомендует сделать это сам, показывая часть реализации, поэтому я создам свой собственный CLI, специально для всех моих потребностей ... – davispuh 26 March 2012 в 23:19
  • 4
    Является ли Console классом, который поставляется с Ruby? Если да, то что мне нужно для его получения? – Liron Yahdav 5 January 2016 в 22:36
  • 5
    @LironYahdav нет, этот класс является частью API, который я составил только для этого ответа. Представьте, что Console содержит весь код вашего приложения, связанный с взаимодействием с эмулятором терминала, и что prompt - это метод чтения, который возвращает настроенное приглашение REPL. – Matheus Moreira 6 January 2016 в 13:02

Вы также можете попробовать ripl . (из документации): Создание и запуск пользовательской оболочки так же просто, как:

require 'ripl'
# Define plugins, load files, etc...
Ripl.start

Существует полный список плагинов для ripl, а также список консольных приложений с использованием ripl на веб-сайте проектов.

5
ответ дан Aleksander Pohl 16 August 2018 в 00:16
поделиться
  • 1
    это выглядит более многообещающим, но по-прежнему необходимо выполнить некоторую конфигурацию, и снова у него есть такие же «функции». Мне не нужно, как pry / irb, также я думаю, что там нужно очень много изменений / конфигурации ... – davispuh 26 March 2012 в 23:15
  • 2
    Честно говоря, я пока не использовал ripl, но писать собственное решение с нуля не представляется лучшей идеей. Просто подумайте о движении с помощью клавиши со стрелкой - без поддержки readline пользователи будут ругаться. – Aleksander Pohl 26 March 2012 в 23:24
  • 3
    в окнах работает командная история (стрелки вверх / вниз), мне просто нужно сделать автозаполнение с вкладкой, но в начале я мог бы даже жить без этого ... – davispuh 27 March 2012 в 02:21
  • 4
    @davispuh Это не только история и завершение. Readline предоставляет вам привязки emacs / vi-like в оболочке, которые многие пользователи очень привыкли и считают само собой разумеющимися, поскольку по умолчанию они доступны в Bash / Zsh. – lorefnon 24 November 2012 в 21:32

TTY - действительно хороший камень для того, чтобы легко делать такие вещи. У вас есть множество инструментов, которые могут работать в одиночку или с полным набором инструментов. Вы можете использовать цвета, подсказки, запускать оболочки, взаимодействовать с экраном, печатать таблицы, progressbars и многие другие полезные элементы командной строки с легкостью apip.

В частности tty-prompt действительно полезен для запроса пользовательского ввода.

Краткий пример для предложенного вами случая:

require 'tty-prompt'
require 'pastel'

prompt = TTY::Prompt.new
loop do
  cmd, parms* = prompt.ask('user@machine$ ').split /\s/
  case cmd
    when "hola"
      puts "Hola amigo " parms
    when "exit"
      break if prompt.yes?('Do you really want to exit?')
  end
end
4
ответ дан David Goitia 16 August 2018 в 00:16
поделиться
  • 1
    Спасибо за комментарий. Я собирался добавить пример. – David Goitia 25 September 2017 в 15:21
  • 2
    Это не совсем то, что я искал, это библиотека, которую можно использовать для реализации такой консоли, как вы показали. Также, кстати, когда я задал этот вопрос, тогда он еще не существовал: D Я реализовал свой CLI-Console с помощью github.com/JEG2/highline , который делает что-то очень похожее. – davispuh 1 October 2017 в 17:56

ok, поэтому я создал эту библиотеку для создания консольных приложений в рубине. На самом деле это было какое-то время назад, но только решило выпустить его. Он поддерживает автозаполнение, если используется с HighLine и Readline.

Когда я его написал, не было никакой документации и тестов / спецификаций, но теперь я сделал некоторые.

Итак, gem cli-console и код находятся в GitHub, вот пример использования

5
ответ дан davispuh 16 August 2018 в 00:16
поделиться

Взгляните на жемчужину cliqr ruby. Это похоже на то, что вам нужно. Вот ссылка github с описательным readme: https://github.com/anshulverma/cliqr

Он может выполнять команды напрямую или внутри встроенной оболочки.

Вот тестовый пример из git repo:

    it 'can execute a sub action from shell' do
      cli = Cliqr.interface do
        name 'my-command'
        handler do
          puts 'base command executed'
        end

        action :foo do
          handler do
            puts 'foo executed'
          end

          action :bar do
            handler do
              puts 'bar executed'
            end
          end
        end
      end

      with_input(['', 'my-command', 'foo', 'foo bar', 'foo bar help']) do
        result = cli.execute %w(my-command shell), output: :buffer
        expect(result[:stdout]).to eq <<-EOS
Starting shell for command "my-command"
my-command > .
base command executed
my-command > my-command.
base command executed
my-command > foo.
foo executed
my-command > foo bar.
bar executed
my-command > foo bar help.
my-command foo bar

USAGE:
    my-command foo bar [actions] [options] [arguments]

Available options:

    --help, -h  :  Get helpful information for action "my-command foo bar" along with its usage information.

Available actions:
[ Type "my-command foo bar help [action-name]" to get more information about that action ]

    help -- The help action for command "my-command foo bar" which provides details and usage information on how to use the command.
my-command > exit.
shell exited with code 0
        EOS
      end
    end
4
ответ дан nuaavee 16 August 2018 в 00:16
поделиться
class MyAPI
  def self.__is__(text)
    @__is__ = text
  end

  def self.method_added(method)
    @__help__ ||= {}
    @__help__[method.to_s] = @__is__
    @__is__ = nil
  end

  def self.help(of)
    @__help__[of]
  end

  __is__ "open file <file>"
  def open(file)
    #...
  end

  __is__ "do X"
  def do(*params)
    #...
  end

  __is__ "calls help, use help <command>"
  def help(*args, &block)
    self.class.help(*args, &block)
  end
end

MyAPI.new(...).pry

Или вы можете использовать команды pry, но это побеждает законность turing. Помощь может быть реализована с использованием команд, так как я не уверен, насколько хорошо работает мой подход. Эти методы должны быть закодированы защитными. Я не помню, как использовать переменные класса: - /

2
ответ дан Reactormonk 16 August 2018 в 00:16
поделиться
  • 1
    он требует много изменений / конфигурации, чтобы заставить его работать, как мне нужно ... также я бы использовал его для задачи, для которой он не был создан, и у него есть «функции». Мне даже не нужно ... – davispuh 26 March 2012 в 22:10
  • 2
    @davispuh, вы дали cliqr (выше) выстрел? Это не требует большой настройки и в значительной степени работает из коробки. – nuaavee 9 February 2018 в 03:25
  • 3
    @nuaavee, когда я написал этот вопрос, он еще не существовал, но, похоже, это похоже на то, что мне было нужно всего на 3 года раньше, чем оно было создано: D – davispuh 9 February 2018 в 19:37
Другие вопросы по тегам:

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