Buat editor garis sederhana

19

Dalam: string tanpa jeda baris *
Izinkan pengguna untuk mengedit dan mengirimkan baris
Keluar: string yang dimodifikasi (opsional dengan linebreak trailing)

Editor baris minimal harus mengizinkan pengguna untuk:

  1. gerakkan kursor yang terlihat ke kiri dan ke kanan

  2. masukkan dan / atau timpa karakter pada posisi kursor

  3. hapus karakter pada posisi kursor

  4. kirimkan string baru, yaitu berhenti mengedit, menyebabkan string yang dimodifikasi dikembalikan / dicetak / ditampilkan / disimpan ... (tanpa teks lain)

Dihormati, tetapi tidak wajib:

  • penjelasan kode Anda.

  • tautan ke situs pengujian online yang dapat menunjukkan program / fungsi Anda

  • gambar animasi yang menunjukkan penggunaan (TIO, misalnya, tidak memungkinkan interaktivitas)

catatan:

  • binding kunci hanya saran

  • GUI atau gaya visual tidak diperlukan

Contohnya

Berikut ini, kursor diilustrasikan dengan _.

Dalam: Just some text
Izinkan pengguna untuk mengedit:
Just some text_  Pengguna menekan (tombol panah kiri) sembilan kali
Just ̲some text  Pengguna menekan Delempat kali
Just ̲ text  Pengguna menekan  Pengguna menekan Out:any
Just any_text Enter
Just any text

Dalam: Remove me
Izinkan pengguna untuk mengedit:
Remove me_  Pengguna menekan Backspacesembilan kali
_  Pengguna menekan Out: (string kosong)Enter
 


* Untuk mencegah solusi editor sepele, ini harus diberikan melalui metode input yang berbeda dari perintah pengeditan, atau harus dipisahkan dari mereka dengan baris baru atau serupa.

Adm
sumber
Apakah kita harus menggunakan penekanan tombol yang tepat untuk i / o? Bisakah kita membuat file untuk menyimpan teks?
Rɪᴋᴇʀ
1
@Riker key-bindings hanya saran . Metode input dan output mengikuti standar PPCG .
Adám
Bisakah string berisi baris baru? Dan dapatkah baris baru digunakan untuk "mengirim"?
Conor O'Brien
@ ConorO'Brien No; Editor baris sederhana . Iya nih; Editor minimal harus mengizinkan pengguna untuk: (...) 4. mengirimkan string baru
Adám
1
Alangkah baiknya jika Anda menentukan baris dalam badan pertanyaan yang sebenarnya, karena judul di situs ini tidak spesifik spesifikasi ...
Conor O'Brien

Jawaban:

3

APL (Dyalog) , 5 byte

⍞←⍞⋄⍞

Ini adalah tradfn, jadi untuk menggunakannya, lakukan

a
⍞←⍞⋄⍞

Dan kemudian menyebutnya dengan menggunakan a, setelah itu Anda memasok string awal, dan kemudian Anda dapat mengedit string.

Kritixi Lithos
sumber
8

JavaScript (ES6), 15 14 byte

Saya tidak mengerti mengapa ini mendapatkan begitu banyak upvotes!

s=>prompt(s,s)

Menyimpan satu byte berkat saran Adm bahwa saya menampilkan input asli di prompt.


Cobalah

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

Shaggy
sumber
1
Simpan satu byte dengan mengganti ""dengan 0atau bahkan s(sehingga pengguna masih dapat melihat teks asli saat mengedit - fitur yang rapi).
Adám
5

Bash 4.x, 25 karakter

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

Contoh dijalankan:

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

(Baris 2 di atas adalah pengeditan interaktif, baris 3 adalah output dari teks yang dihasilkan.)

manatwork
sumber
1
Tidak berhasil, untuk saya -bash: read: -i: invalid option,? manmengatakan hanya ersdiizinkan bendera.
Rɪᴋᴇʀ
Ya, saya akan bertanya tentang-ei
Adam
-idiperkenalkan di Bash 4.0 (dirilis pada Februari 2009) - “-i teks Gunakan TEXT sebagai teks awal untuk Readline”.
manatwork
Saya bertanya-tanya, apakah kucing akan berhasil?
Matthew Roh
cathanya menunggu aliran masuk, yang shell tidak akan menyediakan fungsionalitas pengeditan. Setidaknya tidak secara default.
manatwork
3

Bash + Vi / Vim, 14 byte

echo $1>a;vi a

vialias vimdi macOS, saya tidak tahu tentang OS lain.

Rɪᴋᴇʀ
sumber
Mungkin saya kehilangan sesuatu, tetapi apakah ini memenuhi persyaratan untuk mengeluarkan string yang dimodifikasi?
Grayson Kent
1
@ GraysonKent Anda dapat menyimpan dan berhenti dengan menekan :wq!atau :x, jadi saya rasa begitu. OP agak tidak jelas tentang apa yang memenuhi syarat itu.
Rɪᴋᴇʀ
3

HTML + JavaScript (ES6), 77 66 64 byte

HTML

<input id=t

JavaScript

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

Disimpan 10 byte berkat Jörg Hülsermann dan 2 byte terima kasih kepada Luke.

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

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

Tom
sumber
2
Anda dapat menghapus jenis atribut untuk Elemen input
Jörg Hülsermann
Anda mungkin harus menggunakan oninputsebagai gantinya.
Matthew Roh
@SIGSEGV Saya tidak berpikir oninputkebakaran saat Enterditekan
Tom
1
e.which==13?alert(t.value):0-> e.which-13||alert(t.value)menyimpan dua byte.
Luke
3

Python 2 , 275 200 byte

Bukan pemenang, tapi ini dia:

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)

Penjelasan:

Ini bekerja dengan membalik input (dengan [::-1]), dan mengecualikan dan memasukkan karakter dalam input terbalik sehingga kursor tidak harus bergerak. Membalikkannya lagi saat mencetak.

Pemakaian:

Tombol [Tab] untuk menggerakkan Kanan
[Ctrl + C] untuk menggerakkan Kiri
[Backspace] untuk menghapus
[Kembali] untuk menyelesaikan pengeditan
Kunci lainnya, akan dimasukkan ke dalam teks

Contoh:

Menggunakan contoh OP

Di: Just some text
Just some text>
Just some> text  Pengguna menekan Ctrl+Clima kali
Just > text  Pengguna menekan Backspaceempat kali
Just any> text  Pengguna menekan  Pengguna menekan Out:any
Just any> text Enter
Just any text

Versi editor sebaris:

Jika Anda ingin teksnya diedit sebaris, tambahkan ,'\r',di akhir printpernyataan:

def p(a):print''.join(a)[::-1],'\r',
Felipe Nardi Batista
sumber
6
+1 Sangat bagus. Jawaban pertama yang benar-benar mengimplementasikan editor sungguhan, dan bukan mengandalkan fungsionalitas yang sudah ada sebelumnya. Saya sedang mempertimbangkan memposting tantangan lain untuk melakukan hal ini.
Adám
Tidak bisakah Anda menyimpan byte dengan menggunakan tombol lain untuk kiri dan kanan?
Adám
Saya dapat mengasumsikan karakter sebagai -dan +untuk melakukannya, tetapi editor tidak akan dapat menerima karakter itu
Felipe Nardi Batista
Bagaimana dengan \tdan \v?
Adám
1
Itu masalah pengguna, bukan? Kontrol + K, mungkin?
Adám
3

C + NCURSES, 573 byte

#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;}

Uji

  • Kompilasi & Jalankan dengan input Just some text.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

  • Tekan tombol Panah Kiri sembilan kali.

masukkan deskripsi gambar di sini

  • Tekan tombol Delete empat kali.

masukkan deskripsi gambar di sini

  • Tekan akemudian nkemudian y.

masukkan deskripsi gambar di sini

  • Tekan Enteruntuk mengakhiri.

masukkan deskripsi gambar di sini

Terperinci

#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;
}
Khaled.K
sumber
Tidak bisakah Anda mengganti KEY_*dengan bilangan bulat masing-masing untuk menghemat beberapa byte?
sergiol
2

VBScript, 23 40 byte

MsgBox InputBox("",,Wscript.Arguments(0))

masukkan deskripsi gambar di sini

Johan du Toit
sumber
2

C #, 53 byte

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

Di mana sstring untuk memodifikasi dan output adalah nilai baru.

SendKeys.SendWait : Mengirim kunci yang diberikan ke aplikasi yang aktif, dan kemudian menunggu pesan untuk diproses.

atau 74 byte jika kita tidak berada dalam konteks Formulir Windows:

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

demo gif

aloisdg kata Reinstate Monica
sumber
2

Ruby, 9 19 22 84 byte

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

Ini menciptakan kait input pra Readline yang menyisipkan teks dan kemudian menampilkan kembali. Setelah ini, irb akan kacau jadi pastikan untuk menjalankan ini dari file. Jalankan sebagai lambda, dibutuhkan string input sebagai argumen dan mengembalikan string output.

puts Readline.readline

Ini menggunakan pustaka Readline untuk melakukan pengeditan baris. Jawaban saya sebelumnya hanya mengizinkan spasi mundur.

puts gets

Ini sangat, sangat jelas.

Sunting: Saya telah dimintai penjelasan. Ini setara dengan puts(gets). getsmemasukkan string dengan editor baris. putskeluaran itu.

dkudriavtsev
sumber
Rantai panggilan metode: r.insert_text(s).redisplaydan hapus berikut ini ;. BTW, seperti yang saya pahami kebijakan kami, Anda harus menyebutkan bahwa kode Anda berjalan irb, karena jika tidak, Anda akan memerlukan Readlinedalam kode Anda.
manatwork
1

PHP + HTML, 26 Bytes

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

Browser menambahkan secara otomatis tag penutup

$ _GET Menggunakan url seperti http://example.com?0=inputsebagai Input Create dalam HTML<input value=input

Dan ini adalah output untuk input string

<input value=input

Jörg Hülsermann
sumber
Haruskah saya menganggap ini berfungsi? Mungkin Anda bisa menambahkan penjelasan, atau tautan, atau animasi?
Adám
@ Adám Ya Anda dapat menganggap ini Mungkin Anda akan meningkatkan dan mengatur atribut autofocusuntuk memiliki kursor di awal di dalamnya. Elemen HTML lain yang juga dapat diedit jika Anda menyetel atributcontenteditable
Jörg Hülsermann
Input =test></input><script>alert("Hi");//some malicious code\n</script>
Roman Gräf
@ RomanGräf Bad Boy. Ya itu lebih baik untuk memfilter Javascript
Jörg Hülsermann
1

Tcl, 17

puts [gets stdin]

Penerjemah online hanya ingin menunjukkannya, lalu saya menampilkan beberapa gambar dari shell perintah Windows:

Test case 1

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sinimasukkan deskripsi gambar di sinimasukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini

Uji kasus 2

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

sergiol
sumber
Bisakah Anda menjelaskan yang ini?
Adám
1
Saya dapat menambahkan gambar itu berjalan pada baris perintah Windows.
sergiol
@ Adám: Apakah Anda masih ingin saya menjelaskan apa yang dilakukan kode atau apakah gambarnya cukup?
sergiol
Ini cukup.
Adám
1

AHK , 32 byte

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

InputBoxmenyimpan apa pun yang diketik sebagai variabel sdan memberikan prompt awal dari variabel 1yang merupakan parameter yang pertama kali dilewati.
Sendmengirim penekanan tombol ke jendela saat ini. Dalam hal ini, itu akan menjadi konten s.
MsgBoxadalah pilihan tetapi, untuk bermain golf, Sendlebih pendek 2 byte.

Animasi

Toast insinyur
sumber
@ Adm saya salah baca bagian itu. Saya sudah memperbarui jawabannya.
Engineer Toast
Sekarang sudah bagus.
Adám
1

Perintah Excel VBA Immediate Window - 22 byte

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

masukkan deskripsi gambar di sini

Rohan
sumber
2
Ini hanya solusi parsial, karena nilai awal Anda ("Hai") adalah kode-keras. Nilai awal harus dibaca dari suatu tempat (sel atau prompt atau file ...) dan nilai akhir harus diletakkan di suatu tempat (sel, kotak pesan, file, ...).
Adám
inputbox(0,,"Hi")menghemat satu byte
Felipe Nardi Batista
@ Adam Terima kasih. Memperbaiki sekarang pembacaan dari sel A1
Rohan
Saya pikir Anda perlu [a1]=inputbox(0,,[a1])atau sesuatu, jika tidak, ke mana perginya a? Menyimpan dalam variabel bukan metode output yang valid .
Adám
Ia pergi dari mana asalnya sel A1
Rohan
0

ZX Spectrum BASIC, 7 byte

Sepele, termasuk untuk kelengkapan ( INPUTdan PRINTmasing-masing satu byte token).

INPUT a$: PRINT a$
Radovan Garabík
sumber
1
Bagaimana cara mendapatkan nilai awal a$?
Adám
@ Adm mendapatkan nilai awal a$dengan input keyboard; a$akan ditulis ulang dengan INPUTkata kunci.
Shaun Bebbers
0

SmileBASIC, 138 byte

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

Membuat fungsi Edengan 1 argumen dan 0 output. (Output ditampilkan di konsol)

Karakter yang lolos harus menjadi simbol yang sebenarnya, tetapi mereka tidak akan muncul di sini.

Kontrol:

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.

Memasukkan / menghapus karakter mundur sehingga sangat mengganggu untuk digunakan (tetapi harus tetap memenuhi persyaratan).

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)
12Me21
sumber
0

Penerjemah perintah Windows, 16 byte

set/pa=
echo %a%

Ini sangat sepele; interpreter perintah sepele adalah "editor baris".

SEBUAH
sumber
0

Commodore BASIC (C64Mini, C64 / 128, VIC-20 dll ...) 179 byte BASIC tokenized

Ini harus diketik dalam mode bisnis (karakter huruf besar / kecil)

 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

Mengizinkan pengeditan teks dasar + hapus + baris baru. Ukuran maksimum a$seperti semua string di Commodore BASIC adalah 255 karakter, jadi lebih dari itu akan merusak program. Saya akan menemukan cara untuk melakukan> 255 karakter jika itu perlu.

Simulator tipe-em-up yang sederhana

Simulator type-em-up sederhana dalam aksi

Shaun Bebbers
sumber