Readline on new line: примеры (PHP)
readline_on_new_line: boolФункция readline_on_new_line() в PHP используется для управления поведением библиотеки Readline при переносе строки ввода. Когда пользовательский ввод достигает конца строки и переносится, эта функция определяет, будет ли приглашение для ввода отображаться на новой строке.
Функция актуальна при работе в интерактивном режиме командной строки (CLI), где важно удобство и читаемость ввода. Она влияет только на визуальное отображение и не изменяет логику обработки данных.
Функция принимает один необязательный параметр:
- $enable (bool, необязательный) — определяет, нужно ли перемещать приглашение на новую строку при переносе ввода. Если параметр равен true, приглашение будет перенесено. Если false — приглашение останется на той же строке. Если параметр не указан, функция вернет текущее значение этой настройки.
<?php
$currentSetting = readline_on_new_line();
var_dump($currentSetting);
?>bool(true) // или bool(false) в зависимости от текущей конфигурации
<?php
readline_on_new_line(true);
// Теперь, если ввод пользователя переносится, приглашение отобразится с новой строки
?><?php
readline_on_new_line(false);
// При переносе ввода приглашение останется на той же строке
?>Библиотека Readline в PHP предлагает другие функции для кастомизации ввода:
- readline_callback_handler_install() — устанавливает обработчик обратного вызова для readline, позволяя асинхронно обрабатывать ввод.
- readline_completion_function() — регистрирует функцию для автодополнения вводимого текста.
- readline_info() — получает или устанавливает различные внутренние переменные readline, что позволяет управлять более широким спектром настроек.
Функцию readline_on_new_line() предпочтительно использовать для точной настройки поведения переноса строки. Если требуется комплексная настройка или автодополнение, применяются другие функции библиотеки.
В языке Python аналогичная функциональность часто реализуется через модуль readline и его метод set_pre_input_hook или путем прямой настройки библиотеки GNU Readline через файл .inputrc. Прямого аналога функции нет, поведение настраивается иначе.
import readline
# Настройка обычно выполняется через переменные библиотеки
readline.parse_and_bind('set show-mode-in-prompt on')
# Прямого аналога readline_on_new_line() в Python нетВ среде Node.js модуль readline предоставляет интерфейс для чтения потока ввода, но не имеет прямой аналогии для управления переносом приглашения. Поведение строки обычно контролируется параметрами создаваемого интерфейса.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> '
});
// Управление переносом не предусмотрено напрямую APIВ Bash поведение переноса настраивается через файл конфигурации .inputrc с использованием переменной enable-meta-key или настройками терминала. Это системный уровень, а не функция языка.
# В файле ~/.inputrc
set enable-meta-key on
# Это влияет на различные аспекты, а не только на переносФункция доступна только при установленном и включенном расширении readline в PHP.
<?php
// Если расширение readline не загружено
readline_on_new_line(true);
?>Fatal error: Uncaught Error: Call to undefined function readline_on_new_line()
Функция ожидает булево значение. Передача других типов может привести к неожиданному поведению из-за неявного приведения типов в PHP.
<?php
readline_on_new_line(1); // Работает, так как 1 преобразуется в true
readline_on_new_line('off'); // Преобразуется в true, что может быть неочевидно
?>Рекомендуется всегда передавать явные булевы значения true или false.
Функция readline_on_new_line() была добавлена в PHP на ранних этапах поддержки расширения Readline. Значительных изменений в ее поведении в последних основных версиях PHP (включая PHP 7.x и PHP 8.x) не произошло. Однако, в PHP 8.0 и выше усилилась строгость типов, поэтому передача небулевых значений может генерировать предупреждения в строгом режиме.
Проверка доступности функции и ее поведения остается стабильной. При миграции на новые версии PHP проблем с этой функцией обычно не возникает.
<?php
// Сохраняем текущую настройку
$originalSetting = readline_on_new_line();
// Включаем перенос для удобства ввода длинной команды
readline_on_new_line(true);
$longInput = readline("Введите длинную команду или текст: ");
// Возвращаем исходную настройку
readline_on_new_line($originalSetting);
echo "Вы ввели: " . $longInput . PHP_EOL;
?><?php
function customCLI() {
readline_on_new_line(false); // Отключаем перенос приглашения
while (true) {
$command = readline("myShell> ");
if (trim($command) === 'exit') {
break;
}
// Обработка команды...
echo "Выполнено: $command" . PHP_EOL;
readline_add_history($command);
}
}
customCLI();
?><?php
function setPromptBehavior($prompt) {
// Если приглашение очень длинное, включаем перенос для читаемости
if (strlen($prompt) > 50) {
readline_on_new_line(true);
} else {
readline_on_new_line(false);
}
return readline($prompt);
}
$input1 = setPromptBehavior("Короткое приглашение> ");
$input2 = setPromptBehavior("Очень длинное приглашение, которое может занимать много места на экране терминала> ");
?><?php
// Эмуляция поведения, при котором приглашение всегда на новой строке (как в некоторых конфигурациях Bash)
readline_on_new_line(true);
// Эмуляция "компактного" режима, где приглашение остается на той же строке
// readline_on_new_line(false);
$user = readline("Пользователь: ");
$pass = readline("Пароль: "); // Визуальное поведение будет разным в зависимости от настройки
?>