LINUX.ORG.RU

как работать в оболочке tclsh?

 


0

1

Здравствуйте всем. Иногда надо в командной строке tclsh проверить свою маленькую конструкцию Однако управление непонятно. Нет таких команд как вызов предыдущей строки, не работает перемещение по строке стрелками (печатает всякую бурду). Скопировать мышой текст тоже не удается. Получается типа этого:

$ tclsh
% puts "Ура!"
Ура!
% ^[[200~puts "Ура!"^[[201~
Буду признателен за любую подсказку.

★★★

По умолчанию tclsh не очень-то годится для интерактивной работы, это верно. Чтобы работало какое-никакое автодополнение и история, можно подключить пакет tclreadline. А чтобы можно было еще и Control-C нажать, не вылетев из интерпретатора, можно использовать Tclx. У меня в ~/.tclshrc есть вот такое:

if {$tcl_interactive} {
    package require Tclx
    signal -restart error SIGINT
    package require tclreadline
    ::tclreadline::Loop
}
В иксах же можно вместо tclsh запускать другую консоль — tkcon.

TeopeTuK ★★★ ()
Последнее исправление: TeopeTuK (всего исправлений: 1)

~/.tclshrc

#!/bin/sh
# FILE: "/home/joze/src/tclreadline/sample.tclshrc"
# LAST MODIFICATION: "Thu, 23 Mar 2000 21:13:08 +0100 (joze)"
# (C) 1998 - 2000 by Johannes Zellner, <johannes@zellner.org>
# $Id: sample.tclshrc,v 1.1 2000/07/02 16:30:25 joze Exp $
# vim:set ft=tcl: \
exec tclsh "$0" "$@"


if {$tcl_interactive} {

    package require tclreadline

    # uncomment the following if block, if you
    # want `ls' executed after every `cd'. (This was
    # the default up to 0.8 == tclreadline_version.)
    #
    # if {"" == [info procs cd]} {
    #     catch {rename ::tclreadline::Cd ""}
    #     rename cd ::tclreadline::Cd
    #     proc cd {args} {
    #         if {[catch {eval ::tclreadline::Cd $args} message]} {
    #             puts stderr "$message"
    #         }
    #         tclreadline::ls
    #     }
    # }

    # uncomment the following line to use
    # tclreadline's fancy ls proc.
    #
    # namespace import tclreadline::ls

    # tclreadline::Print is on (`yes') by default.
    # This mimics the command echoing like in the
    # non-readline interactive tclsh.
    # If you don't like this, uncomment the following
    # line.
    #
    # tclreadline::Print no

    # uncomment the folling line, if you want
    # to change tclreadline's print behaviour
    # frequently with less typing.
    #
    # namespace import tclreadline::Print

    # store maximal this much lines in the history file
    #
    set tclreadline::historyLength 200

    # disable tclreadline's script completer
    #
    # ::tclreadline::readline customcompleter ""

    # go to tclrealdine's main loop.
    #
    tclreadline::Loop
}

futurama ★★★★ ()
Ответ на: комментарий от Bootmen

Ну нет. Суть топика как работать в консоле Без лишних телодвижений.

Какой-то ты привередливый не к месту. Маны читать не хочешь, требуешь чего-то, на дельные советы огрызаешься.

Поставить или rlwrap, или tclreadline — одно и то же телодвижение. Запускать rlwrap tclsh (или сделать alias tclsh="rlwrap tclsh) — телодвижений меньше, чем написать правильный .tclshrc.

В любом случае, я лишь предложил альтернативу и на ней не настаиваю, пользуйся чем тебе удобнее. А вот хамить и требовать, пожалуйста, не надо.

aeralahthu ()

Я пользуюсь tclreadline, но можно брать и rlwrap, хотя там свои недостатки.

Интересно, а есть ли проекты линковать настоящую readline по-нормальному?

Дело в том, что у readline лицензия GPL, и потому её боятся вносить в кодовую базу, вероятно не понимая как она работает.

На самом деле вполне можно так делать, просто тем кто делает проприетарные версии Tcl нужно будет убирать линковку с ней.

Xenius ★★★★★ ()
Ответ на: комментарий от Xenius

На самом деле вполне можно так делать, просто тем кто делает проприетарные версии Tcl нужно будет убирать линковку с ней.

Столман когда-то сказал, что так нельзя. https://github.com/JoshCheek/clisp/blob/master/doc/Why-CLISP-is-under-GPL :

I could provide a libnoreadline.a and let the user choose to link lisp.a
with either GNU's libreadline.a or my libnoreadline.a . Would that convince
you that lisp.a "can be reasonably considered independent and separate work" ?

Bruno Haible

....

No, and I doubt it would convince a judge either.

I'll have to insist that you stop using readline unless you make the
program free.

Richard Stallman

monk ★★★★★ ()
Ответ на: комментарий от monk

Столман когда-то сказал, что так нельзя.

Тут другая ситуация. Tcl изначально свободный. Линковать его с libreadline можно. При этом версия Tcl с readline попадёт под GPL как единое целое, но если убрать линковку с readline совсем (а не так как описано в тексте) то можно.

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

При этом версия Tcl с readline попадёт под GPL как единое целое, но если убрать линковку с readline совсем (а не так как описано в тексте) то можно.

Совсем — это через пачку ifdef'ов на весь ввод-вывод? А это точно удовлетворит людей подобных Столману? Или совсем — через две версии исходников (tclsh под BSD и tclsh-readline под GPL)? Для этого достаточно найти человека, который согласится написать tclsh-readline и поддерживать его в актуальном состоянии. Желающих пока не нашлось.

monk ★★★★★ ()