シンプルなラインエディターを作成する


19

In:改行なしの文字列*
ユーザーが行を編集および送信できるようにします
Out:変更された文字列(オプションで末尾に改行が付きます)

行エディタは、少なくともユーザーに以下を許可する必要があります。

  1. 表示カーソルを左右に移動します

  2. カーソル位置に文字を挿入および/または上書きする

  3. カーソル位置の文字を削除します

  4. 新しい文字列を送信します。つまり、編集を中止すると、変更された文字列が返される/印刷される/表示される/保存される…(他のテキストなし)

感謝しますが、必須ではありません:

  • コードの説明。

  • プログラム/機能を実証できるオンラインテストサイトへのリンク

  • 使用法を示すアニメーション画像(たとえば、TIOは対話性を許可しません)

注意:

  • キーバインディングは提案のみです

  • GUIまたは視覚的なスタイリングは必要ありません

例

以下では、カーソルはで示されてい_ます。

In: Just some text
ユーザーに編集を許可:
 Just some text_  ユーザーが←(左矢印キー)を9回
 Just ̲some text  押すユーザーがDel4回
 Just ̲ text  押す ユーザーが押すユーザーがOutを押す:any
 Just any_text Enter
Just any text

In: Remove me
ユーザーに編集を許可:
 Remove me_  ユーザーがBackspace9回
 _  押すユーザーがOutを押す:(空の文字列)Enter
 


*些細なエディターソリューションを防ぐために、これは編集コマンドとは異なる入力方法を介して提供されるか、改行などでそれらから分離される必要があります。


I / Oにこれらの正確なキー押下を使用する必要がありますか?また、テキストを保存するファイルを作成できますか?
— Rɪᴋᴇʀ

1
@Rikerのキー割り当ては提案のみです。入出力メソッドはPPCGのデフォルトに従います。
— アダム

文字列に改行を含めることはできますか?改行を使用して「送信」できますか?
— コナーオブライエン

@ ConorO'Brienいいえ; シンプルなラインエディター。はい; 最低でもエディタ必見のユーザーを許可する:(...)4.新しい文字列提出
— アダム

1
あなたが指定した場合、それはいいだろうラインの質問の実際のボディにこのサイト上のタイトルは正確な仕様ではないとして、...
— コナー・オブライエン

回答:


3

APL(Dyalog)、5バイト

⍞←⍞⋄⍞

これはtradfnなので、使用するには

∇a
⍞←⍞⋄⍞
∇

次に、を使用して呼び出しaます。その後、開始文字列を指定してから、文字列を編集できます。


8

JavaScript(ES6)、15 14バイト

なぜこれほど多くの賛成票を得ているのか理解できません!

s=>prompt(s,s)

に元の入力を表示するというAdámの提案のおかげで1バイト節約できましたprompt。


それを試してみてください

f=
s=>prompt(s,s)
console.log(f("Edit this ..."))


1
またはさらに置換""してバイトを保存します(したがって、ユーザーは編集中に元のテキストを表示できます-すてきな機能です)。0s
— アダム

5

Bash 4.x、25文字

read -ei "$*" t
echo "$t"

サンプル実行:

bash-4.3$ bash interactive.sh hello world
hello golfing world
hello golfing world

(上記の2行目はインタラクティブな編集で、3行目は結果のテキストの出力です。)


1
私にとってはうまくいきません-bash: read: -i: invalid optionか?許可されたフラグmanのみersが表示されます。
— Rɪᴋᴇʀ

ええ、私は質問しようとしていた-ei
— アダム

-iBash 4.0(2009年2月にリリース)で導入されました-「-i text Readlineの初期テキストとしてTEXTを使用」。
— マナトワーク

猫はうまくいくのだろうか?
— マシュー

cat着信ストリームを待機するだけで、シェルは編集機能を提供しません。少なくともデフォルトではありません。
— マナトワーク

3

Bash + Vi / Vim、14バイト

echo $1>a;vi a

vivimmacOSのエイリアスであるため、他のOSについては知りません。


たぶん私は何かが欠けていますが、これは変更された文字列を出力する要件を満たしていますか?
— グレイソンケント

1
@GraysonKentを保存して終了するには、:wq!またはを押します:x。OPは、それが何に適格であるかについて少し不明確です。
— Rɪᴋᴇʀ

3

HTML + JavaScript(ES6)、77 66 64バイト

HTML

<input id=t

JavaScript

onkeyup=e=>e.which-13||alert(t.value);f=a=>t.value=a;

JörgHülsermannのおかげで10バイト、Lukeのおかげで2バイト節約されました。

onkeyup=e=>e.which-13||alert(t.value);f=a=>t.value=a;

f("Remove Me");
<input id=t>


2
入力要素の型属性を削除することができます
— ヨルグヒュルザーマン

おそらくoninput代わりに使用する必要があります。
— マシュー盧

@SIGSEGV 押されたoninputときに発火するEnterとは思わない
— トム

1
e.which==13?alert(t.value):0-> e.which-13||alert(t.value)2バイトを節約します。
— ルーク

3

パイソン2、275の 200バイト

勝者ではありませんが、ここにあります:

from msvcrt import*
s=list(input())[::-1]
c=i=0
def p(a):print''.join(a)[::-1]
while'\r'!=c:p(s[:i]+['<']+s[i:]);c=getch();x=c!='\b';exec["s[i:i+1-x]=c*x","i=(i-1+2*(c<'\\t'))%-~len(s)"][x*' '>c]
p(s)

説明:

入力を反転し(で[::-1])、カーソルを移動する必要がないように、その反転した入力で文字を除外および挿入することで機能します。印刷時に再び元に戻します。

使用法:

[Tab]キーで右に移動
[Ctrl + C]で左に移動
[Backspace]で消去
[Return]で編集を終了
その他のキーは、テキストに挿入されます

例:

OPの例を使用する

In: Just some text
 Just some text>
 Just some> text  ユーザーがCtrl+C5回
 Just > text  押すユーザーがBackspace4回
 Just any> text  押す ユーザーが押すユーザーがOutを押す:any
 Just any> text Enter
Just any text

インラインエディターバージョン:

テキストをインラインで編集する場合,'\r',は、printステートメントの最後に追加します。

def p(a):print''.join(a)[::-1],'\r',

6
+1とてもいい。既存の機能に依存するのではなく、実際のエディターを実際に実装する最初の回答。これを行うための別のチャレンジを投稿することを検討していました。
— アダム

左右に他のキーを使用してバイトを節約できませんか?
— アダム

私は文字を仮定でき-そして+そうすることではなく、編集者は、それらの文字を受け入れることができないであろう
— フェリペ・ナルディバティスタ

どの程度\tと\v?
— アダム

1
それはユーザーの問題ですよね?Control + K、多分?
— アダム

3

C + NCURSES、573バイト

#include <curses.h>
i;j;k;s;c;p;int main(a,b)char**b;{char*q;char t[999];if(a&&(q=b[1]))while(*q)t[s++]=*q++;i=s;initscr();noecho();keypad(stdscr,1);do{for(j=0;j<i;j++)addch(t[j]);addch('|');for(j=i;t[j];j++)addch(t[j]);c=getch();switch(c){case KEY_LEFT:if(i)i--;break;case KEY_RIGHT:if(i<s)i++;break;case 8:case 127:case KEY_BACKSPACE:if(i){for(k=i-1;k<s;k++)t[k]=t[k+1];i--;s--;}break;case KEY_DC:if(i<s){for(k=i;k<s;k++)t[k]=t[k+1];s--;}break;default:if(c>31&c<127){for(k=s;k>i;k--)t[k]=t[k-1];t[i]=c;i++;s++;}}clear();}while(c!=10);printw(t);getch();endwin();return 0;}

テスト

  • 入力を使用してコンパイルおよび実行しますJust some text。

enter image description here

enter image description here

  • 左矢印ボタンを9回押します。

enter image description here

  • [削除]ボタンを4回押します。

enter image description here

  • a次にnを押しyます。

enter image description here

  • を押しEnterて終了します。

enter image description here

詳細

#include <curses.h>

int main(int argc, char ** argv)
{
    char*q = 0;
    char t[999] = {0};
    int j = 0, k = 0;
    int i = 0; // cursor before first char
    int s = 0; // current size
    int c = 0; // current input
    int p = 0;

    // copy first command-line argument
    if(argc>0 && (q=argv[1]))while(*q)t[s++]=*q++; i=s;

    initscr(); // initiate NCURSES
    noecho(); // input does not echo on entry
    keypad(stdscr,TRUE); // handle all input

    do
    {
        // print current content with cursor
        for(j=0;j<i;j++) addch(t[j]);
        addch('|'); for(j=i;t[j];j++) addch(t[j]);

//      printw("\n\n> key %d pressed",c); // debug

        c = getch(); // read next char

        switch(c)
        {
            case KEY_LEFT: // left arrow; cursor left
            if(i > 0) i--;
            break;

            case KEY_RIGHT: // right arrow; cursor right
            if(i < s) i++;
            break;

            case 8: // backspace; remove previous char
            case 127:
            case KEY_BACKSPACE:
            if(i > 0)
            {
                for(k=i-1; k<s; k++) t[k]=t[k+1];
                i--;s--;
            }
            break;

            case KEY_DC: // delete; remove next char
            if(i < s)
            {
                for(k=i; k<s; k++) t[k]=t[k+1];
                s--;
            }
            break;

            default: // none of the above

            if(c > 31 && c < 127) // printable char
            {
                for(k=s; k>i; k--) t[k]=t[k-1];
                t[i] = c;i++;s++;
            }
        }

        clear(); // clear screen
        if(c == 10) break;
    }
    while(c);

    addch('\n');
    printw(t); // print final result
    getch(); // wait for any input
    endwin();
    return 0;
}

KEY_*いくつかのバイトを節約するためにそれぞれの整数で置き換えることはできませんか?
— セルジオル


2

C#、53バイト

s=>{SendKeys.SendWait(s);return Console.ReadLine();};

s変更する文字列はどこにあり、出力は新しい値です。

SendKeys.SendWait:指定されたキーをアクティブなアプリケーションに送信し、メッセージが処理されるのを待ちます。

またはWindowsフォームコンテキストにない場合は74バイト:

s=>{System.Windows.Forms.SendKeys.SendWait(s);return Console.ReadLine();};

gif demo


2

ルビー、9 19 22 84バイト

->s{r=Readline;r.pre_input_hook=->{r.insert_text s;r.redisplay};r.readline}

これにより、テキストsを挿入して再表示するReadline事前入力フックが作成されます。この後、irbは台無しになりますので、ファイルから実行するようにしてください。ラムダとして実行し、入力文字列を引数として受け取り、出力文字列を返します。

puts Readline.readline

これはReadlineライブラリを使用して行編集を実行します。私の以前の回答では、バックスペースのみが許可されていました。

puts gets

これは、本当に、本当に自明。

編集:説明を求められました。これはと同等puts(gets)です。gets行エディタで文字列を入力します。puts出力します。


メソッド呼び出しをチェーンしr.insert_text(s).redisplay、次を削除します;。ところで、私たちのポリシーを理解しているように、コードはで実行されることに言及irbする必要がありReadlineます。
— マナトワーク

1

PHP + HTML、26バイト

<input value=<?=$_GET[0]?>

ブラウザは自動的に終了タグを追加します

http://example.com?0=input入力としてHTMLで作成するようなURLを使用して$ _GET<input value=input

そして、これは文字列入力の出力です

<input value=input


これが機能すると仮定すべきですか?たぶん、説明、リンク、またはアニメーションを追加できますか?
— アダム

@Adámはい、これを想定することができます。たぶんそれを改善autofocusして、カーソルをその先頭に持つように属性を設定します。その他のHTML要素は、あなたも編集あなたは属性を設定できるかどうかcontenteditable
— イェルクHülsermann

入力=test></input><script>alert("Hi");//some malicious code\n</script>
— ローマングラフ

@RomanGräfバッドボーイ。はい、Javascriptをフィルターする方が良いです
— ヨルグヒュルサーマン

1

Tcl、17

puts [gets stdin]

オンラインインタプリタはそれをデモンストレーションするためにただ吸い込んでから、Windowsコマンドシェルからいくつかの画像を紹介します。

テストケース1

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

テストケース2

enter image description hereenter image description here enter image description here


これを説明できますか?
— アダム

1
Windowsコマンドラインで実行しているイメージを追加できます。
— sergiol

@Adám:コードの実行内容を説明してもらえますか、それとも画像で十分ですか?
— -sergiol

これで十分です。
— アダム

1

AHK、32バイト

InputBox,s,,,,,,,,,,%1%
Send,%s%

InputBox変数として入力されたものはすべて保存し、最初に渡されたパラメーターsである変数の開始プロンプトを表示1します。
Sendキーストロークを現在のウィンドウに送信します。この場合、それはのコンテンツになりsます。
MsgBoxはオプションでしたが、ゴルフでSendは2バイト短くなります。

アニメーション


@Adám私はその部分を読み違えました。答えを更新しました。
— エンジニアトースト

今はいいです。
— アダム

1

Excel VBAイミディエイトウィンドウコマンド-22バイト

[a1]=inputbox(0,,[a1])

ここに画像の説明を入力してください


2
初期値( "Hi")はハードコーディングされているため、これは部分的な解決策にすぎません。初期値はどこか(セル、プロンプト、またはファイル...)から読み取られ、最終値はどこか(セル、メッセージボックス、ファイルなど)に置かれなければなりません。
— アダム

inputbox(0,,"Hi")バイトを保存
— フェリペナルディバティスタ

@Adámありがとう。固定今ではセルA1から読んでいる
— ロハン

私はあなたが必要[a1]=inputbox(0,,[a1])か何か、そうでなければ、どこにa行くと思いますか?変数への保存は有効な出力方法ではありません。
— アダム

それはセルA1から来た場所に行きます
— Rohan

0

ZX Spectrum BASIC、7バイト

些細な、完全性のために含まれています(INPUTおよびPRINT1つのバイトが各トークンです)。

INPUT a$: PRINT a$

1
どのようにして初期値を取得しますa$か?
— アダム

@Adámはa$、キーボード入力によって初期値を取得します。キーワードa$で上書きされINPUTます。
— ショーンビバーズ

0

SmileBASIC、138バイト

DEF E S@L
WAIT
B=BUTTON(1)C=C-(B==4&&C)+(B>7&&C<LEN(S))I$=INKEY$()IF"\u0008"<I$THEN B=I$<"\u000E"S=SUBST$(S,C,B,I$*!B)?S?" "*C;1IF"\u0008"!=I$GOTO@L
END

E引数が1つ、出力が0の関数を作成します。(出力はコンソールに表示されます)

エスケープされた文字は実際のシンボルでなければなりませんが、ここには表示されません。

コントロール:

Normal keys: Insert a character before the cursor.
Enter: Delete the character at the cursor.
Backspace: Submit.
D-pad left: Move cursor left.
All buttons except up, down, and left on the d-pad: Move cursor right.

文字の挿入/削除は逆向きであるため、使用するのは非常に面倒です(ただし、要件を満たす必要があります)。

Just some text
1             
'(press right 5 times)
Just some text
     1
'(press enter 4 times)
Just  text
     1
'(press a)
Just a text
     1
'(press right)
Just a text
      1
'(...)
Just any text
       1
'(press backspace)

0

Windowsコマンドインタープリター、16バイト

set/pa=
echo %a%

これは非常に簡単です。コマンドインタープリターは、ささいな「ラインエディター」です。


0

Commodore BASIC(C64Mini、C64 / 128、VIC-20など)179トークン化されたBASICバイト

これはビジネスモードで入力する必要があります(大文字/小文字)

 0a$="Just some text":?"{SHIFT+CLR/HOME}"a$"_":fOi=0to1step0:getk$:on-(k$<>"")goS2:goS1:nE
 1?"{CTRL+N}{CLR/HOME}"a$"_  ";:return
 2ifasc(k$)<>20thena$=a$+k$:on-(asc(k$)=13)goS4:return
 3if-(len(a$))thena$=leF(a$,len(a$)-1):goS4:return
 4?"{ARROW LEFT}{ARROW LEFT}{ARROW LEFT}  ":return

基本的なテキスト編集+削除+新しい行を許可します。a$Commodore BASICのすべての文字列の最大サイズは255文字なので、それ以上はプログラムをクラッシュさせます。必要であれば、255文字を超える方法を見つけます。

シンプルなタイプEMアップシミュレーター

動作中のシンプルなタイプアップシミュレーター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.