एक सरल रेखा संपादक बनाएँ


19

में: लाइन के बिना एक स्ट्रिंग टूटती है *
उपयोगकर्ता को लाइन को संपादित करने और सबमिट करने की अनुमति दें
आउट: संशोधित स्ट्रिंग (वैकल्पिक रूप से एक अनुरेख रेखा के साथ)

लाइन एडिटर को कम से कम उपयोगकर्ता को इसकी अनुमति देनी चाहिए:

  1. बाएँ और दाएँ एक दृश्यमान कर्सर ले जाएँ

  2. कर्सर स्थिति पर वर्ण डालें और / या अधिलेखित करें

  3. कर्सर स्थिति पर वर्ण हटाएं

  4. नया स्ट्रिंग सबमिट करें, अर्थात संघर्ष संपादन कारण संशोधित स्ट्रिंग को वापस / मुद्रित / प्रदर्शित / सहेजा जा सकता है ... (कोई अन्य पाठ नहीं)

सराहना की, लेकिन आवश्यक नहीं:

  • आपके कोड की व्याख्या।

  • एक ऑनलाइन परीक्षण साइट के लिए लिंक जो आपके कार्यक्रम / फ़ंक्शन को प्रदर्शित कर सकता है

  • उदाहरण के लिए एक एनिमेटेड छवि का उपयोग (TIO, उदाहरण के लिए, अन्तरक्रियाशीलता की अनुमति नहीं देता है)

ध्यान दें:

  • की-बाइंडिंग केवल सुझाव हैं

  • GUI या दृश्य स्टाइल की आवश्यकता नहीं है

उदाहरण

निम्नलिखित में, कर्सर के साथ सचित्र है _

में: Just some text
उपयोगकर्ता को संपादित करने की अनुमति दें:
Just some text_  उपयोगकर्ता प्रेस (बाएं तीर कुंजी) नौ बार
Just ̲some text  उपयोगकर्ता दबाता है Delचार बार
Just ̲ text  उपयोगकर्ता दबाता है  उपयोगकर्ता प्रेस बाहर निकलता है :any
Just any_text Enter
Just any text

में: Remove me
उपयोगकर्ता को संपादित करने की अनुमति दें:
Remove me_  उपयोगकर्ता Backspaceनौ बार प्रेस करता है
_  उपयोगकर्ता प्रेस बाहर: (खाली स्ट्रिंग)Enter
 


* तुच्छ संपादक समाधानों को रोकने के लिए, इसे या तो संपादन कमांड की तुलना में एक अलग इनपुट विधि के माध्यम से आपूर्ति की जानी चाहिए, या उन्हें एक नई रेखा या इसी तरह से अलग किया जाना चाहिए।


क्या हमें i / o के लिए उन सटीक keypresses का उपयोग करना है? क्या हम टेक्स्ट को सेव करने के लिए फाइल बना सकते हैं?
R

1
@ रिकर की-बाइंडिंग केवल सुझाव हैं । इनपुट और आउटपुट तरीके पीपीसीजी चूक का पालन करते हैं
एड्म

क्या स्ट्रिंग में न्यूलाइन्स हो सकती हैं? और क्या "सबमिट" करने के लिए एक नई रेखा का उपयोग किया जा सकता है?
कॉनर ओ'ब्रायन

@ कोनोरो ब्रायन नहीं; सरल रेखा संपादक । हाँ; संपादक को कम से कम उपयोगकर्ता को अनुमति देनी चाहिए: (...) 4. नया स्ट्रिंग सबमिट करें
Adám

1
यह अच्छा होगा यदि आप प्रश्न के वास्तविक शरीर में लाइन निर्दिष्ट करते हैं, क्योंकि इस साइट पर शीर्षक बिल्कुल विशिष्ट नहीं हैं ...
कॉनर ओ'ब्रायन

जवाबों:


3

APL (Dyalog) , 5 बाइट्स

⍞←⍞⋄⍞

यह एक परंपरा है, इसलिए इसका उपयोग करना, करना

a
⍞←⍞⋄⍞

और फिर इसका उपयोग करके कॉल करें a, जिसके बाद आप शुरुआती स्ट्रिंग की आपूर्ति करते हैं, और फिर आप स्ट्रिंग को संपादित कर सकते हैं।


8

जावास्क्रिप्ट (ईएस 6), 15 14 बाइट्स

मुझे समझ नहीं आ रहा है कि यह बहुत सारे बदलाव क्यों हो रहे हैं!

s=>prompt(s,s)

Adám के सुझाव के लिए एक बाइट धन्यवाद दिया कि मैं मूल इनपुट को प्रदर्शित करता हूं prompt


कोशिश करो

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


1
के ""साथ 0या यहाँ तक कि s(इसलिए उपयोगकर्ता अभी भी मूल पाठ को देख सकते हैं - एक साफ सुविधा) के साथ बदलकर एक बाइट सहेजें ।
एड्म

5

बैश 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
Adám

-iबश 4.0 (फरवरी 2009 में जारी) में पेश किया गया था - "-i पाठ पाठ के लिए प्रारंभिक पाठ के रूप में पाठ का उपयोग करें"।
11

मैं सोच रहा था, क्या बिल्ली काम करेगी?
मैथ्यू रोह

catबस आने वाली स्ट्रीम का इंतजार कर रहा है, जिसके लिए शेल कोई संपादन कार्यक्षमता प्रदान नहीं करेगा। कम से कम डिफ़ॉल्ट रूप से नहीं।
मैनेटवर्क

3

बैश + वी / विम, 14 बाइट्स

echo $1>a;vi a

viपर एलियास है vimMacOS पर, मैं अन्य OSes के बारे में पता नहीं है।


शायद मुझे कुछ याद आ रहा है, लेकिन क्या यह संशोधित स्ट्रिंग को आउटपुट करने की आवश्यकता को पूरा करता है?
ग्रेसन केंट

1
@GraysonKent आप बचा सकते हैं और मारकर :wq!या छोड़ सकते हैं :x, इसलिए मुझे ऐसा लगता है। ओपी इस बात पर थोड़ा अस्पष्ट है कि वह किस योग्य है।
Rɪᴋᴇʀ

3

HTML + जावास्क्रिप्ट (ES6), 77 66 64 बाइट्स

एचटीएमएल

<input id=t

जावास्क्रिप्ट

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

सहेजे गए 10 बाइट्स Jörg Hülsermann की बदौलत और 2 बाइट्स ल्यूक की बदौलत।

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

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


2
आप इनपुट तत्व के लिए जिम्मेदार प्रकार को हटा सकते हैं
Jörg Hülsermann

आपको शायद oninputइसके बजाय उपयोग करना चाहिए ।
मैथ्यू रोह

@SIGSEGV मुझे नहीं लगता कि oninputजब Enterप्रेस किया जाता है तो आग लगती है
Tom

1
e.which==13?alert(t.value):0-> e.which-13||alert(t.value)दो बाइट्स बचाता है।
ल्यूक

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]) को उल्टा करके काम करता है , और उस उल्टे इनपुट में वर्णों को छोड़कर और सम्मिलित करता है ताकि कर्सर को स्थानांतरित न करना पड़े। छपाई करते समय इसे फिर से उलट दें।

उपयोग:

[टैब] कुंजी को स्थानांतरित करने के लिए राइट
[Ctrl + C] लेफ्ट
[बैकस्पेस] को मिटाने के लिए
[वापसी] संपादन को समाप्त करने के लिए
किसी भी अन्य कुंजी को टेक्स्ट में डाला जाएगा।

उदाहरण:

ओपी के उदाहरण का उपयोग करना

में: Just some text
Just some text>
Just some> text  उपयोगकर्ता Ctrl+Cपांच बार
Just > text  दबाता है उपयोगकर्ता Backspaceचार बार
Just any> text  दबाता है  उपयोगकर्ता दबाता है उपयोगकर्ता दबाता है :any
Just any> text Enter
Just any text

इनलाइन संपादक संस्करण:

यदि आप चाहते हैं कि पाठ को इनलाइन किया जाए, ,'\r',तो printकथन के अंत में संलग्न करें :

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

6
+1 बहुत अच्छा। पहला उत्तर जो वास्तव में एक वास्तविक संपादक को लागू करता है, जैसा कि पहले से मौजूद कार्यक्षमता पर निर्भर करता है। मैं ऐसा करने के लिए एक और चुनौती पोस्ट करने पर विचार कर रहा था।
अदम

क्या आप बाएँ और दाएँ के लिए अन्य कुंजियों का उपयोग करके बाइट्स नहीं बचा सकते हैं?
13

मैं पात्रों को ऐसा करने के लिए -और +ऐसा करने के लिए मान सकता था , लेकिन संपादक उन पात्रों को स्वीकार करने में असमर्थ होंगे
फेलिप नारदी बतिस्ता

कैसे \tऔर \v?
एड्म

1
यह उपयोगकर्ता की समस्या है, नहीं? नियंत्रण + के, शायद?
Adám

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

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

  • बायाँ-एरो बटन नौ बार दबाएँ।

यहाँ छवि विवरण दर्ज करें

  • चार बार डिलीट बटन दबाएं।

यहाँ छवि विवरण दर्ज करें

  • aउसके nबाद दबाएँ y

यहाँ छवि विवरण दर्ज करें

  • Enterसमाप्त करने के लिए दबाएँ ।

यहाँ छवि विवरण दर्ज करें

विस्तृत

#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

सी #, 53 बाइट्स

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

जहां sसंशोधित करने के लिए एक स्ट्रिंग है और आउटपुट नया मूल्य है।

SendKeys.SendWait : दी गई कुंजियों को सक्रिय अनुप्रयोग में भेजता है, और फिर संदेशों के संसाधित होने की प्रतीक्षा करता है।

या 74 बाइट्स अगर हम विंडोज फॉर्म के संदर्भ में नहीं हैं:

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

gif डेमो


2

रूबी, २२ by४ बाइट्स

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

यह एक रीडलाइन प्री इनपुट हुक बनाता है जो टेक्स्ट को सम्मिलित करता है और फिर रीडिसप्ले करता है। इसके बाद, irb गड़बड़ हो जाती है, इसलिए इसे किसी फ़ाइल से चलाना सुनिश्चित करें। एक लंबो के रूप में चलाएं, यह इनपुट स्ट्रिंग को एक तर्क के रूप में लेता है और आउटपुट स्ट्रिंग लौटाता है।

puts Readline.readline

यह लाइन संपादन करने के लिए रीडलाइन लाइब्रेरी का उपयोग करता है। मेरे पिछले उत्तर ने केवल बैकस्पेस को अनुमति दी।

puts gets

यह वास्तव में है, वास्तव में आत्म व्याख्यात्मक है।

संपादित करें: मुझे स्पष्टीकरण के लिए कहा गया है। इसके बराबर है puts(gets)getsएक लाइन संपादक के साथ एक स्ट्रिंग इनपुट। putsइसे आउटपुट करता है।


विधि कॉल को चेन करें: r.insert_text(s).redisplayऔर निम्नलिखित को हटा दें ;। BTW, जैसा कि मैं हमारी नीति को समझता हूं, आपको यह उल्लेख करना चाहिए कि आपका कोड अंदर चलता है irb, क्योंकि अन्यथा आपको Readlineअपने कोड में आवश्यकता होगी ।
11

1

PHP + HTML, 26 बाइट्स

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

ब्राउज़र स्वचालित रूप से समापन टैग जोड़ता है

$ _GET जैसे url का उपयोग करनाhttp://example.com?0=input एक HTML में एक इनपुट के रूप में<input value=input

और यह स्ट्रिंग इनपुट के लिए आउटपुट है

<input value=input


क्या मुझे यह काम करना चाहिए? शायद आप एक स्पष्टीकरण, या लिंक, या एनीमेशन जोड़ सकते हैं?
एड्म

@ Adám हाँ आप यह मान सकते हैं कि शायद आप इसमें सुधार करेंगे और autofocusइसमें शुरुआत में ही कर्सर रखने की विशेषता निर्धारित करेंगे। यदि आप विशेषता सेट करते हैं तो अन्य HTML तत्व भी संपादित कर सकते हैंcontenteditable
Jörg Hülsermann

इनपुट =test></input><script>alert("Hi");//some malicious code\n</script>
रोमन ग्रैफ़

@ रोमनग्राफ बैड बॉय। हाँ, जावास्क्रिप्ट को फ़िल्टर करना बेहतर है
Jörg Hülsermann

1

Tcl, 17

puts [gets stdin]

ऑनलाइन दुभाषिए सिर्फ इसे प्रदर्शित करने के लिए चूसते हैं, फिर मैं विंडोज कमांड शेल से कुछ छवियां दिखाता हूं:

टेस्ट केस 1

यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें

टेस्ट केस २

यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें


क्या आप इसे समझा सकते हैं?
आदम २४'१

1
मैं विंडोज कमांड लाइन पर चलने वाली छवियों को जोड़ सकता हूं।
सर्गियोल

@ Adám: क्या आप अभी भी मुझे यह बताना चाहते हैं कि कोड क्या कर रहा है या चित्र पर्याप्त हैं?
सर्गियोल

यह काफी है।
अदम

1

एएचके , 32 बाइट्स

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

InputBoxजो कुछ भी चर के रूप में टाइप किया जाता है उसे संग्रहीत करता है sऔर चर 1का पहला संकेत देता है जो पहले पारित पैरामीटर है।
Sendवर्तमान विंडो में कीस्ट्रोक्स भेजता है। इस मामले में, यह सामग्री होगी s
MsgBoxएक विकल्प था, लेकिन गोल्फ के लिए, Send2 बाइट्स छोटा होता है।

एनीमेशन


@ मैं उस हिस्से को गलत मानता हूं। मैंने जवाब अपडेट कर दिया है।
इंजीनियर टोस्ट

अब यह अच्छा है।
एडम

1

एक्सेल VBA तत्काल विंडो कमांड - 22 बाइट्स

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

यहाँ छवि विवरण दर्ज करें


2
यह केवल एक आंशिक समाधान है, क्योंकि आपका प्रारंभिक मूल्य ("हाय") हार्ड-कोडेड है। प्रारंभिक मूल्य कहीं से पढ़ा जाना चाहिए (एक सेल या एक प्रॉम्प्ट या एक फ़ाइल ...) और अंतिम मूल्य कहीं न कहीं (एक सेल, एक संदेश बॉक्स, एक फ़ाइल, ...) डाल दिया जाना चाहिए।
आदम

inputbox(0,,"Hi")एक बाइट बचाता है
फेलिप नारदी बतिस्ता

@ Adám धन्यवाद फिक्स्ड अब यह सेल A1 से पढ़ रहा है
रोहन

मुझे लगता है कि आपको ज़रूरत है [a1]=inputbox(0,,[a1])या कुछ और, अन्यथा, कहाँ जाता है a? एक चर में संग्रह करना एक मान्य आउटपुट विधि नहीं है
आदम

यह वहां जाता है जहां यह सेल A1 से आया था
रोहन

0

जेडएक्स स्पेक्ट्रम बेसिक, 7 बाइट्स

तुच्छता, पूर्णता के लिए शामिल ( INPUTऔर PRINTप्रत्येक एक बाइट टोकन हैं)।

INPUT a$: PRINT a$

1
इसका प्रारंभिक मूल्य कैसे मिलता है a$?
14:14

@ Admm a$को कीबोर्ड इनपुट द्वारा प्रारंभिक मूल्य मिलता है ; कीवर्ड के a$साथ ओवर-लिखा जाएगा INPUT
शॉन बेयबर्स

0

स्माइलबासिक, 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

E1 तर्क और 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

विंडोज कमांड दुभाषिया, 16 बाइट्स

set/pa=
echo %a%

यह बहुत तुच्छ है; कमांड दुभाषिया तुच्छ रूप से एक "लाइन एडिटर" है।


0

कमोडोर BASIC (C64Mini, C64 / 128, VIC-20 आदि ...) 179 टोकन बाइट्स

इसे बिजनेस मोड में टाइप किया जाना चाहिए (अपर / लोअर केस कैरेक्टर)

 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$कमोडोर BASIC में सभी तारों की तरह अधिकतम आकार 255 वर्ण हैं, इसलिए इससे अधिक कोई भी प्रोग्राम क्रैश करेगा। यदि आवश्यक हो तो मुझे> 255 वर्ण करने का एक तरीका मिलेगा।

सरल प्रकार-एम-अप सिम्युलेटर

कार्रवाई में सरल प्रकार-एम-अप सिम्युलेटर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.