Basit bir çizgi editörü oluşturma


19

In: satır sonu olmayan bir dize *
Kullanıcının satırı düzenlemesine ve göndermesine izin ver
Çıkış: değiştirilmiş dize (isteğe bağlı olarak bir satır sonu ile)

Satır düzenleyicisi en azından kullanıcının şunları yapmasına izin vermelidir:

  1. görünür bir imleci sola ve sağa taşıma

  2. imleç konumuna karakter ekleme ve / veya üzerine yazma

  3. imleç konumundaki karakterleri kaldır

  4. yeni dizeyi gönderin, yani düzenlemeyi durdurun, değiştirilen dizenin döndürülmesine / yazdırılmasına / görüntülenmesine / kaydedilmesine neden olur (başka bir metin olmadan)

Takdir edildi, ancak gerekli değil:

  • kodunuzun açıklaması.

  • programınızı / işlevinizi gösterebilecek çevrimiçi bir test sitesine bağlantı

  • kullanımı gösteren animasyonlu bir görüntü (örneğin, TIO etkileşime izin vermez)

Not:

  • anahtar bağlantıları yalnızca öneri niteliğindedir

  • GUI veya görsel stil gerekli değildir

Örnekler

Aşağıda, imleç ile gösterilmiştir _.

In: Just some text
Kullanıcının düzenlemesine izin ver:
Just some text_  Kullanıcı dokuz kez basar (sol ok tuşu)
Just ̲some text  Kullanıcı Deldört kez
Just ̲ text  basar  Kullanıcı basar Kullanıcı basar :any
Just any_text Enter
Just any text

In: Remove me
Kullanıcının düzenlemesine izin ver:
Remove me_  Kullanıcı Backspacedokuz kez
_  basar Kullanıcı Out tuşuna basar : (boş dize)Enter
 


* Önemsiz editör çözümlerini önlemek için, bu düzenleme komutlarından farklı bir giriş yöntemi ile sağlanmalı veya onlardan bir satırsonu veya benzeri ile ayrılmalıdır.


I / o için tam tuş basımlarını kullanmak zorunda mıyız? Ayrıca, metni kaydetmek için bir dosya oluşturabilir miyiz?
R17

1
@Riker anahtar bağlantıları yalnızca öneridir . Giriş ve çıkış yöntemleri PPCG varsayılanlarını takip eder .
Adám

Dize yeni satırlar içerebilir mi? Ve bir yeni satır "göndermek" için kullanılabilir mi?
Conor O'Brien

@ ConorO'Brien No; Basit çizgi editörü . Evet; Editör en azından kullanıcının şunları yapmasına izin vermelidir: (...) 4. yeni dizeyi göndermelidir
Adám

1
Bu sitedeki başlıklar tam olarak teknik özellikler olmadığından, sorunun gerçek gövdesinde satır belirtmeniz güzel olurdu ...
Conor O'Brien

Yanıtlar:


3

APL (Dyalog) , 5 bayt

⍞←⍞⋄⍞

Bu bir tradfn, bu yüzden kullanmak için

a
⍞←⍞⋄⍞

Ve sonra kullanarak çağırın a, sonra başlangıç ​​dizesini sağlayın ve sonra dizeyi düzenleyebilirsiniz.


8

JavaScript (ES6), 15 14 bayt

Bunun neden bu kadar çok oy aldığını anlamıyorum!

s=>prompt(s,s)

Adám 'ın orijinal girdiyi görüntülediğim önerisi sayesinde bir bayt kaydedildi prompt.


Dene

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


1
Veya ""ile değiştirerek bir bayt kaydedin (kullanıcı düzenleme sırasında orijinal metni hala görebilir - düzgün bir özellik). 0s
Adám

5

Bash 4.x, 25 karakter

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

Örnek çalışma:

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

(Yukarıdaki 2. satır etkileşimli düzenleme, 3. satır sonuçlanan metnin çıktısıydı.)


1
Benim için çalışmıyor mu -bash: read: -i: invalid option? mansadece ersbayraklara izin verildiğini söylüyor .
Rɪᴋᴇʀ

Evet, sormak üzereydim-ei
Adám

-iBash 4.0'da tanıtıldı (Şubat 2009'da piyasaya sürüldü) - “-i metin Readline için ilk metin olarak TEXT kullan”.
manatwork

Merak ediyorum, kedi çalışır mı?
Matthew Roh

catkabuğun hiçbir düzenleme işlevselliği sağlamayacağı gelen akışı bekler. En azından varsayılan olarak değil.
manatwork

3

Bash + Vi / Vim, 14 bayt

echo $1>a;vi a

vimacOS'ta takma olarak kullanıldı vim, diğer işletim sistemlerini bilmiyorum.


Belki bir şey eksik, ama bu değiştirilmiş dize çıktı gereksinimi karşılıyor mu?
Grayson Kent

1
@GraysonKent vurarak kaydedebilir ve bırakabilirsiniz :wq!ya da :xöyle düşünüyorum. OP, neyin bu nitelikte olduğu konusunda biraz belirsiz.
Rɪᴋᴇʀ

3

HTML + JavaScript (ES6), 77 66 64 bayt

HTML

<input id=t

JavaScript

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

Jörg Hülsermann sayesinde 10 bayt, Luke sayesinde 2 bayt tasarruf etti.

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

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


2
Element
Jörg Hülsermann

Bunun oninputyerine muhtemelen kullanmalısınız .
Matthew Roh

@SIGSEGV Ben basıldığında oninputyangın olduğunu sanmıyorumEnter
Tom

1
e.which==13?alert(t.value):0-> e.which-13||alert(t.value)iki bayt kaydeder.
Luke

3

Python 2 , 275200 bayt

Kazanan değil, ama işte burada:

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)

Açıklama:

Girdiyi ters çevirerek (ile [::-1]) ve imlecin hareket etmesine gerek kalmayacak şekilde bu ters girdiye karakterler ekleyerek ve ekleyerek çalışır. Yazdırırken tekrar ters çevirir.

Kullanımı:

[Tab] tuşu Sağa taşımak için
[Ctrl + C] Sola taşımak için
[Geri] silmek için
[Return] düzenlemeyi bitirmek için
Başka bir anahtar, metne eklenecek

Misal:

OP örneğini kullanma

In: Just some text
Just some text>
Just some> text  Kullanıcı presleri Ctrl+Cbeş kat
Just > text  Kullanıcı presler Backspacedört kez
Just any> text  Kullanıcı presler  Kullanıcı bastığında Out:any
Just any> text Enter
Just any text

Satır içi düzenleyici sürümü:

Metnin satır içinde düzenlenmesini istiyorsanız ifadenin ,'\r',sonuna ekleyin print:

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

6
+1 Çok hoş. Önceden var olan işlevselliğe dayanmak yerine gerçek bir editör uygulayan ilk cevap. Sadece bunu yapmak için başka bir meydan okuma göndermeyi düşünüyordum.
Adám

Sol ve sağ için diğer tuşları kullanarak bayt kaydedemiyor musunuz?
Adám

Ben gibi karakterler üstlenebileceğini -ve +bunu yapmak için, ama editör sonra bu karakterleri kabul etmemiz mümkün olacaktır
Felipe Nardi Batista

Nasıl hakkında \tve \v?
Adám

1
Bu kullanıcının sorunu değil mi? Control + K, belki?
Adám

3

C + NCURSES, 573 bayt

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

Ölçek

  • Giriş ile derleyin ve çalıştırın Just some text.

enter image description here

enter image description here

  • Sol-Ok düğmesine dokuz kez basın.

enter image description here

  • Sil düğmesine dört kez basın.

enter image description here

  • Basın a, sonra no y.

enter image description here

  • Sonlandırmak Enteriçin tuşuna basın .

enter image description here

Detaylı

#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_*Bazı baytları kaydetmek için ilgili tamsayılarla değiştiremez misiniz ?
sergiol


2

C #, 53 bayt

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

Nerede sdeğiştirmek için bir dizedir ve çıkış yeni değerdir.

SendKeys.SendWait : Verilen tuşları etkin uygulamaya gönderir ve ardından iletilerin işlenmesini bekler.

veya bir Windows Forms bağlamında değilseniz 74 bayt:

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

gif demo


2

Yakut, 9 19 22 84 bayt

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

Bu, metni ekleyen ve sonra yeniden görüntüleyen bir Readline ön giriş kancası oluşturur. Bundan sonra, irb berbat olur, bu yüzden bunu bir dosyadan çalıştırdığınızdan emin olun. Lambda olarak çalıştır, girdi dizesini bağımsız değişken olarak alır ve çıktı dizesini döndürür.

puts Readline.readline

Bu, satır düzenleme gerçekleştirmek için Readline kütüphanesini kullanır. Önceki cevabım sadece arka boşluklara izin verdi.

puts gets

Bu gerçekten, gerçekten kendini açıklayıcı.

Edit: Bir açıklama istendi. Bu eşdeğerdir puts(gets). getssatır düzenleyicisiyle bir dize girer. putsçıktı.


Yöntem çağrılarını zincirleyin: r.insert_text(s).redisplayve aşağıdakileri kaldırın ;. BTW, politikamızı anladığım için, kodunuzun çalıştığından bahsetmelisiniz, irbaksi takdirde Readlinekodunuzda gerekli olmanız gerekir .
manatwork

1

PHP + HTML, 26 Bayt

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

Tarayıcı kapanış etiketini otomatik olarak ekler

$ _GEThttp://example.com?0=input Girdi gibi bir url'yi HTML'de oluşturur<input value=input

Ve bu dize girişi için çıktı

<input value=input


Bunun işe yaradığını varsaymalı mıyım? Belki bir açıklama, bağlantı veya animasyon ekleyebilirsiniz?
Adám

@ Adám Evet bunu varsayabilirsin Belki geliştirmek ve autofocusimlecin başlangıcında özelliği ayarlamak . Özelliği ayarlarsanız düzenleyebileceğiniz diğer HTML öğelericontenteditable
Jörg Hülsermann

Girdi =test></input><script>alert("Hi");//some malicious code\n</script>
Roman Gräf

@ RomanGräf Bad Boy. Evet Javascript filtrelemek daha iyidir
Jörg Hülsermann

1

Tcl, 17

puts [gets stdin]

Çevrimiçi tercümanlar bunu göstermek için emiyorlar, sonra bir Windows komut kabuğundan bazı görüntüleri sergiliyorum:

Test durumu 1

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

Test durumu 2

enter image description hereenter image description here enter image description here


Bunu açıklayabilir misin?
Adám

1
Windows komut satırında çalışan görüntüler ekleyebilirim.
sergiol

@ Adám: Hala kodun ne yaptığını açıklamamı istiyor musunuz yoksa görüntüler yeterli mi?
sergiol

Bu yeterli.
Adám

1

AHK , 32 bayt

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

InputBoxdeğişken olarak yazılanları depolar ve ilk geçirilen parametre olan sdeğişkenin başlangıç ​​istemini verir 1.
Sendgeçerli pencereye tuş vuruşlarını gönderir. Bu durumda, içeriği olacaktır s.
MsgBoxbir seçenekti, ancak golf Sendiçin 2 bayt daha kısadır.

Animasyon


@ Adám Bu kısmı yanlış okudum. Cevabı güncelledim.
Mühendis Tost

Şimdi iyi.
Adám

1

Excel VBA Anında Pencere Komutu - 22 bayt

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

resim açıklamasını buraya girin


2
Başlangıç ​​değeriniz ("Merhaba") sabit olarak kodlandığı için bu yalnızca kısmi bir çözümdür. Başlangıç ​​değeri bir yerden okunmalıdır (bir hücre veya bir bilgi istemi veya bir dosya ...) ve son değer bir yere (bir hücre, bir mesaj kutusu, bir dosya, ...) konulmalıdır.
Adám

inputbox(0,,"Hi")kaydeder bir byte
Felipe Nardi Batista

@ Adám Teşekkürler. Şimdi düzeltildi A1 hücresinden okuma
Rohan

Sanırım ihtiyacın [a1]=inputbox(0,,[a1])falan falan, yoksa nereye agidiyor? Değişkende saklamak geçerli bir çıktı yöntemi değildir .
Adám

A1 hücresinden geldiği yere gider
Rohan

0

ZX Spectrum BASIC, 7 bayt

Önemsiz, bütünlük için dahil ( INPUTve PRINTher biri bir bayt belirteci).

INPUT a$: PRINT a$

1
Başlangıç ​​değerini nasıl alır a$?
Adám

@ a$Klavye girişiyle başlangıç ​​değerini alır ; anahtar kelimeyle a$üzerine yazılacak INPUT.
Shaun Bebbers

0

SmileBASIC, 138 bayt

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

Bir işlev oluşturur E1 bağımsız değişken ve 0 çıkışlı . (Çıktı konsolda görüntülenir)

Kaçan karakterler gerçek semboller olmalı, ancak burada görünmezler.

Kontroller:

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.

Karakterleri eklemek / silmek geriye dönüktür, bu yüzden kullanımı çok can sıkıcıdır (ancak yine de gereksinimleri karşılamalıdır).

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 komut yorumlayıcısı, 16 bayt

set/pa=
echo %a%

Bu çok önemsiz; komut yorumlayıcısı önemsiz bir şekilde "satır editörü" dür.


0

Commodore BASIC (C64Mini, C64 / 128, VIC-20 vb ...) 179 tokenize BASIC bayt

Bu iş modunda yazılmalıdır (büyük / küçük harf)

 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

Temel metin düzenlemeye + silme + yeni satıra izin verir. a$Commodore BASIC içindeki tüm dizelerin maksimum boyutu 255 karakterdir, bu nedenle bundan daha fazlası programın çökmesine neden olur. Gerekirse 255 karakterden fazla bir yol bulacağım.

Basit tip-em-up simülatörü

Basit tip em-up simülatörü iş başında

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.