vim이 bashscript에서 이상한 동작을 보입니다.

vim이 bashscript에서 이상한 동작을 보입니다.
#!/bin/sh

action() {

        screen -X stuff "xdotool key Ctrl+a $1"$(echo '\015')

}

action bar
screen
action 0
action Tab
action 1
action S
screen
action Tab
action 2
action Tab
vim
#action Tab
#vim $2
#action Tab
#vim $3
#action Tab

vim 라인이 주석 처리된 경우 다음 출력이 예상대로 표시됩니다. 중앙에 수직 칸막이가 있고, 그 수직 칸막이 오른쪽에 가로 칸막이가 있습니다.

vim 라인을 포함하는 경우 수평선으로 구분된 두 개의 파티션만 표시됩니다. 첫 번째 파티션은 화면 #1을 표시하고 두 번째 파티션은 화면 #2를 표시합니다.

vim은 화면 #0에서 열리고


l key Ctrl+a bar

다음과 같이 쓰여졌다

여기에 이미지 설명을 입력하세요.

vim이 어떻게 오류를 발생시키는지 이해할 수 없나요? 도와주세요.

답변1

여기서 일어나는 일은 화면의 stuff명령이 문자를 창의 입력 버퍼로 밀어넣지만 일부 프로그램이 문자를 사용할 때까지 그대로 남아 있다는 것입니다.

이 스크립트를 창 #0에서 실행하고 xdotool key Ctrl+a bar해당 창 #0에서 명령을 실행하기 때문에 스크립트가 끝나고 쉘로 돌아오면 쉘은 스크립트를 수락하고 이를 일반 쉘 명령으로 해석합니다.

실제로 첫 번째 스크린샷에서 이러한 문자가 스스로 한 줄을 차지한 다음(입력한 일부 문자와 동일) 입력 보류 상태가 되는 것을 볼 수 있습니다. 스크립트가 종료되고 셸로 돌아오면 스크립트는 이러한 문자를 사용하고 결국 명령을 반복합니다. 결과는 다음과 같습니다.

xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$ xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$

스크립트를 종료하는 대신 Vim을 실행하면 Vim은 동일한 입력을 받아 Vim 명령으로 해석합니다. 그러면 다음과 같은 일련의 명령이 표시됩니다.

  • x: 커서 아래의 문자를 삭제합니다. 버퍼가 비어 있으므로 경고음만 울리고 아무 작업도 수행되지 않습니다.
  • do: 다른 버퍼와의 차이점을 가져옵니다(vimdiff 모드에서 유용함). 여기서는 아무 소용이 없지만 이 경우에도 아무 작업도 수행하지 않습니다.
  • to: o줄의 다음 문자로 이동합니다. 행이 비어 있으므로 이번에도 아무 작업도 수행되지 않습니다.
  • o: 현재 줄 다음 줄에 삽입 모드로 들어갑니다.

따라서 마지막 명령은 삽입 모드로 전환됩니다. 이는 줄의 나머지 부분( l key Ctrl+a bar)과 "Enter"가 두 번째 줄의 버퍼에 입력됨을 의미합니다. Vim은 세 번째 줄의 시작 부분에 남아 있으며 여전히 삽입 모드입니다.

이것은 그것을 완벽하게 설명합니다.

더 간단하게 재현할 수 있는 방법은 다음 명령을 실행하는 것입니다.

$ sleep 30; vim

그런 다음 sleep런타임에 위 줄을 입력합니다.

xdotool key Ctrl+a bar

출력이 소비되지 않으므로 sleep절전 모드가 끝난 후 Vim을 시작할 때마다 입력을 사용할 수 있습니다. "경고음"(터미널에서 활성화된 경우)을 포함하여 위와 동일하게 작동하는 것을 볼 수 있습니다.

관련 정보