답변:
그들은 아마 내장 된 매개 변수 사용 -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
... (내 대답을 참조)하지만 여전히
-W
기본적으로 동일한 문서로 업데이트 할 것 입니다.
나는 그것이 그렇게 간단하지 않다고 생각하지만 루비 코드를 여기서 직접 볼 수 있습니다.
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의 렌더링 형식까지의 직선을 볼 수 있습니다.