vimgolf는 모든 키 입력을 어떻게 기록합니까?


10

때때로 나는 한 라운드의 vimgolf 에 참여하고 싶습니다 . 깨달을 수 있습니다.

모든 키 입력을 어떻게 기록 할 수 있습니까? 그것은 vim 기능이어야합니다. 그 방법을 아는 사람은 아무도 없습니다. 특정 상황에서 모든 것을 기록하는 것이 편리 할 수 ​​있습니다.


1
방금 우리가 여기에
statox

답변:


10

그들은 아마 내장 된 매개 변수 사용 -w을 참조하십시오 :h -w:

-w {scriptout}  All the characters that you type are recorded in the file
        "scriptout", until you exit Vim.  This is useful if you want
        to create a script file to be used with "vim -s" or
        ":source!".  When the "scriptout" file already exists, new
        characters are appended.  See also |complex-repeat|.
        {scriptout} cannot start with a digit.
        {not in Vi}

편집 으로는 @B 계층은 실제 코드가 사용하는 지적 -W으로 기본적으로 동일 매개 변수 -w하지만 로그 파일이 대신 (여기에 키 입력을 추가로 덮어 쓰기를 :h -W)

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}

좋은 추측! 그건 -W하지 -w... (내 대답을 참조)하지만 여전히
B 레이어

@ BLayer 잘 연주했는데 코드를보기에는 너무 게으르다 :-) -W기본적으로 동일한 문서로 업데이트 할 것 입니다.
statox

1
네. 그냥 쓰기 대 추가하십시오.
B Layer

(좋은) 추측은 잘 연구되고 사실에 근거한 대답을 능가하고 받아 들여 집니까? 중대한 불의가 이루어졌습니다. :( ... LOL
B Layer

1
'고귀한 몸짓이야. 나는 당신의 투표, 좋은 선생님 또는 부인을 겸손히 받아들입니다. 딜리 딜리
B 레이어

14

나는 그것이 그렇게 간단하지 않다고 생각하지만 루비 코드를 여기서 직접 볼 수 있습니다.

https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf

키 로깅을위한 클래스가 하나 있습니다.

lib / vimgolf / cli.rbvim 에서 실행하는 데 사용되는 명령은 다음과 같습니다 .

 vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin --nofork -i NONE +0 
    -u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}

@statox는 (거의) 거의 그렇습니다 -w outfile... -W outfile실제로 입력 된 문자가 첨부 된 파일이 아닌 파일을 덮어 씁니다. 그러나 내가 말했듯이, "간단한 것"이 아니라 ... 그 파일 중 하나의 내용과 vimgolf 도구에 의해 생성되는 내용을 비교하십시오. 이것은 실제 vimgolf 문제 에서 비롯된 것입니다 ...

-W 복사하여 붙여 넣을 때 출력 :

GI0. ý`gvgý`ZZ

인쇄되지 않은 여러 문자가 "번역에서 잃어 버렸습니다".

-W 화면에 나타나는 출력 :

^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ

글쎄, 그건 못 생겼어.

vimgolf 표시 / 업로드 된 출력 :

<C-V>GI0. <Esc>gvg<C-A>ZZ

아, 더 낫다.


업데이트 : 몇 분 동안 조금 더 자세히 살펴보고 몇 가지 새로운 정보를 얻었습니다.

먼저, 위에서 언급 한 keylogger 클래스 keylog.rb 는 실제로 퍼즐의 주요 부분이지만 실제로는 매우 간단합니다. Vim이 내보내고 -W로그 파일에 저장되는 키코 드는 1 바이트 또는 3 바이트 (첫 번째 바이트 값 0x80으로 표시)이며 두 세트 각각에 대한 해시 맵이 있습니다.

1 바이트 버전은 바이트 값을 키 코드의 문자열 표현 (예 : 0또는)에 매핑합니다 g. 3 바이트 버전은 마찬가지로 문자열 (예 : <Esc>또는 <C-V>)에 매핑 되지만 2와 3 바이트의 결합 된 값을 키로 사용합니다. 다르게 처리되는 예외 / 코너 사례가 있지만 대부분의 키 코드는이 두 맵에서 간단한 조회를 통해 해결됩니다.

키 로거 코드가 얼마나 기본적인지 보았을 때 키 코드 로그 파일에서 볼 수있는 내용 (예 : 위에 붙여 넣은 예)에 문제가 있음을 알 수있었습니다. VimGolf 규칙에 필요한 vimrc 파일을 사용해야 했음이 밝혀졌습니다. 특히이 줄

set t_RV= 

올바른 로깅이 발생합니다. 위의 "화면에 나타나는"예제는 실제로 다음과 같습니다.

^VGI0. ^[gvg^AZZ

이제이 "원시"문자열에서 VimGolf의 렌더링 형식까지의 직선을 볼 수 있습니다.

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