간단한 라인 편집기 만들기


19

In : 줄 바꿈이없는 문자열 *
사용자가 줄을 편집하고 제출할 수 있도록 허용
Out : 수정 된 문자열 (선택적으로 후행 줄 바꿈 )

라인 편집기는 최소한 사용자가 다음을 수행 할 수 있도록 허용해야합니다.

  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

In : Remove me
사용자가 편집 할 수 있도록 허용 :
 Remove me_  사용자가 Backspace9 번
 _  누름 사용자가 Out을 누름 : (빈 문자열)Enter
 


* 사소한 편집기 솔루션을 방지하려면 편집 명령과 다른 입력 방법을 통해 제공하거나 개행 또는 이와 유사한 형식으로 분리해야합니다.


I / O에 정확한 키 누름을 사용해야합니까? 또한 텍스트를 저장할 파일을 만들 수 있습니까?
— Rɪᴋᴇʀ

1
@Riker 키 바인딩은 제안 일뿐 입니다. 입력 및 출력 방법은 PPCG 기본값을 따릅니다 .
— Adám

문자열에 줄 바꿈이 포함될 수 있습니까? 그리고 개행을 "제출"하는 데 사용할 수 있습니까?
— Conor O'Brien

@ ConorO'Brien 아니오; 간단한 라인 편집기 . 예; 편집자는 최소한 사용자가 다음을 수행 할 수 있도록해야합니다. (...) 4. 새 문자열 제출
— Adám

1
이 사이트의 제목이 정확히 사양이 아니기 때문에 질문의 실제 본문에 줄 을 지정하면 좋을 것입니다 ...
— Conor O'Brien

답변:


3

APL (Dyalog) , 5 바이트

⍞←⍞⋄⍞

이것은 tradfn이므로 사용하려면

∇a
⍞←⍞⋄⍞
∇

그런 다음 a시작 문자열을 제공 한 다음을 사용하여 호출 한 다음 문자열을 편집 할 수 있습니다.


8

자바 스크립트 (ES6), 15 14 바이트

나는 이것이 왜 그렇게 많은지지를 받고 있는지 이해할 수 없습니다!

s=>prompt(s,s)

Adám 의 제안에 따라 원본 입력을에 표시하여 바이트를 절약 했습니다 prompt.


시도 해봐

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


1
대체하여 바이트를 저장 ""하여 0또는 s(- 깔끔한 기능을 사용자가 계속 편집하는 동안 원래의 텍스트를 볼 수 있습니다).
— Adám

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
— 보려고 했어요

-iBash 4.0에 도입되었습니다 (2009 년 2 월에 릴리스) –“-i text Readline의 초기 텍스트로 TEXT를 사용하십시오”.
— manatwork

궁금 해요, 고양이가 작동할까요?
— Matthew Roh

cat쉘이 편집 기능을 제공하지 않는 들어오는 스트림을 기다립니다. 최소한 기본적으로는 아닙니다.
— manatwork

3

배쉬 + Vi / Vim, 14 바이트

echo $1>a;vi a

vivimmacOS에서 별칭으로 사용 되며 다른 OS에 대해서는 모르겠습니다.


어쩌면 내가 누락 된 것이지만 수정 된 문자열을 출력 해야하는 요구 사항을 충족합니까?
— Grayson Kent

1
@GraysonKent :wq!또는을 눌러 저장하고 종료 할 수 :x있으므로 그렇게 생각합니다. 그 자격이 무엇인지 OP는 조금 불분명합니다.
— Rɪᴋᴇʀ

3

HTML + JavaScript (ES6), 77 66 64 바이트

HTML

<input id=t

자바 스크립트

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

Jörg Hülsermann 덕분에 10 바이트를 절약하고 Luke 덕분에 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대신 사용해야 합니다.
— Matthew Roh

@SIGSEGV 눌 렸을 oninput때 불 이 났다고 생각하지 않습니다Enter
— Tom

1
e.which==13?alert(t.value):0-> e.which-13||alert(t.value)2 바이트를 저장합니다.
— Luke

3

파이썬 2 , 275200 바이트

승자는 아니지만 여기 있습니다 :

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의 예제 사용

에서 : 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 아주 좋습니다. 기존 기능에 의존하는 것이 아니라 실제 편집기를 실제로 구현하는 첫 번째 대답. 나는 이것을하기 위해 또 다른 도전을 게시하는 것을 고려하고있었습니다.
— Adám

왼쪽과 오른쪽에 다른 키를 사용하여 바이트를 저장할 수 없습니까?
— Adám

나는 같은 문자를 가정 수 -와 +그렇게하지만, 에디터는 그 문자를 사용할 수없는 것
— 펠리페 나르디 바티스타

어떻 \t와 \v?
— Adám

1
그것은 사용자의 문제입니다. Control + K?
— 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.

enter image description here

enter image description here

  • 왼쪽 화살표 버튼을 9 번 누릅니다.

enter image description here

  • 삭제 버튼을 네 번 누릅니다.

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_*바이트를 절약하기 위해 각각의 정수로 대체 할 수 없습니까 ?
— sergiol


2

C #, 53 바이트

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

s수정할 문자열은 어디에 있고 출력은 새로운 값입니다.

SendKeys.SendWait : 지정된 키를 활성 응용 프로그램으로 보낸 다음 메시지가 처리 될 때까지 기다립니다.

Windows Forms 컨텍스트에없는 경우 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}

텍스트를 삽입 한 다음 다시 표시하는 Readline 사전 입력 후크가 생성됩니다. 그런 다음 irb가 엉망이되므로 파일에서 실행하십시오. 람다로 실행하면 입력 문자열을 인수로 사용하고 출력 문자열을 반환합니다.

puts Readline.readline

Readline 라이브러리를 사용하여 라인 편집을 수행합니다. 내 이전 답변은 백 스페이스 만 허용했습니다.

puts gets

이건 정말 정말 자기 설명적인.

편집 : 나는 설명을 요청 받았다. 이는에 해당합니다 puts(gets). gets줄 편집기로 문자열을 입력합니다. puts출력합니다.


메소드 호출을 연결 r.insert_text(s).redisplay하고 다음을 제거하십시오 ;. BTW, Google 정책을 이해함에 따라 코드에서이 (가 irb) 실행되어야한다고 언급해야합니다. 그렇지 않으면 코드 가 필요하기 때문 Readline입니다.
— manatwork

1

PHP + HTML, 26 바이트

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

브라우저가 자동으로 닫는 태그를 추가합니다

$ _GET 같은 URL 사용http://example.com?0=input HTML에서 입력<input value=input

그리고 이것은 문자열 입력에 대한 출력입니다

<input value=input


이것이 효과가 있다고 가정해야합니까? 설명, 링크 또는 애니메이션을 추가 할 수 있습니까?
— Adám

@ Adám 예, 이것을 가정 할 수 있습니다. 어쩌면 autofocus커서를 시작 부분에 갖도록 속성 을 개선하고 설정할 것입니다. 속성을 설정하면 편집 할 수있는 다른 HTML 요소contenteditable
— Jörg Hülsermann

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

@ RomanGräf 나쁜 소년. 예, 자바 스크립트를 필터링하는 것이 좋습니다
— Jörg Hülsermann

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


이것을 설명 할 수 있습니까?
— Adám

1
Windows 명령 행에서 실행중인 이미지를 추가 할 수 있습니다.
— sergiol

@ Adám : 여전히 코드가 무엇을하고 있는지 또는 이미지가 충분한 지 설명해 주시겠습니까?
— sergiol

이것으로 충분합니다.
— Adám

1

AHK , 32 바이트

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

InputBox변수로 입력 된 모든 것을 저장 하고 첫 번째 전달 된 매개 s변수 1인 변수의 시작 프롬프트를 제공합니다 .
Send키 입력을 현재 창으로 보냅니다. 이 경우의 내용이 s됩니다.
MsgBox옵션이지만 골프의 경우 Send2 바이트가 더 짧습니다.

Animation


@ Adám 나는 그 부분을 잘못 읽었다. 답변을 업데이트했습니다.
— 엔지니어 토스트

지금은 좋습니다.
— Adám

1

Excel VBA 즉시 창 명령-22 바이트

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

enter image description here


2
초기 값 ( "Hi")이 하드 코딩되어 있기 때문에 이것은 부분적인 해결책 일뿐입니다. 초기 값은 어딘가 (셀 또는 프롬프트 또는 파일 ...)에서 읽어야하고 최종 값은 어딘가 (셀, 메시지 상자, 파일 등)에 있어야합니다.
— Adám

inputbox(0,,"Hi")바이트를 절약
— 펠리페 나디 바티스타

@ Adám 감사합니다. 이제 A1 셀에서 읽었습니다.
— Rohan

나는 당신이 필요하다고 생각 [a1]=inputbox(0,,[a1])하거나 그렇지 않으면 어디로 a가나 요? 변수에 저장하는 것은 유효한 출력 방법이 아닙니다 .
— Adám

A1 셀에서 나온 곳으로갑니다
— Rohan

0

ZX 스펙트럼 기본, 7 바이트

완벽 함을 위해 포함 된 사소한 (INPUT 그리고 PRINT1 바이트마다 토큰이다).

INPUT a$: PRINT a$

1
초기 값은 a$어떻게 얻 습니까?
— Adám

@ 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

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

Windows 명령 인터프리터, 16 바이트

set/pa=
echo %a%

이것은 매우 사소합니다. 명령 인터프리터는 "라인 편집기"입니다.


0

코모도어 베이직 (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$Commodore BASIC의 모든 문자열과 같은 최대 크기 는 255 자이므로 프로그램을 중단시킵니다. 필요한 경우 255자를 초과하는 방법을 찾을 것입니다.

Simple type-em-up simulator

Simple type-em-up simulator in action

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.