간단한 라인 편집기 만들기


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.