guake에서 터미널이 열려 있는지 확인

guake에서 터미널이 열려 있는지 확인

.vimrcvim이 열린 터미널이 Guake에서 실행되고 있는지 확인해야 합니다 . 이것을 어떻게 볼 수 있나요? 변수가 $TERM안맞는거 같은데..

답변1

확실한 방법은 없습니다. TERM대부분의 호환 에뮬레이터에 동일한 값을 사용합니다. screen 및 tmux 보고를 제외한 대부분의 최신 터미널 에뮬레이터입니다 xterm.

프로세스 목록을 탐색하여 Vim 상위 프로세스의 상위 프로세스를 찾을 수 있습니다. 그러면 Vim이 어떤 터미널 에뮬레이터(있는 경우)에서 실행되고 있는지 알 수 있습니다. 일반적으로 Vim은 터미널 에뮬레이터에서 직접 시작된 셸에서 시작됩니다. 좀 더 똑똑하게 프로세스 목록을 Vim에서 상위, 상위의 상위 등으로 반복하면서 하위 프로세스와 동일한 터미널에서 실행되지 않는 프로세스를 발견하면 중지할 수도 있습니다. 터미널 에뮬레이터여야 합니다.

이 경험적 방법은 여러 가지 방법으로 속일 수 있습니다. 특히 어디에서나 프로그램을 시작하고 입력 및 출력을 리디렉션하여 다른 터미널에서 대화형으로 만드는 것이 가능하기 때문에(흔하지는 않지만) 더욱 그렇습니다.

다음은 현재 프로세스가 실행 중인 터미널 에뮬레이터의 명령줄을 표시하는 간단한 테스트를 거친 스크립트입니다. 이때 프로세스는 리디렉션 헛소리 없이 해당 터미널 에뮬레이터의 하위 항목으로 시작되었다고 가정합니다.

#! /bin/sh
set -f
pid=$PPID
my_tty=$(ps -p $$ -o tty=)
while
  [ "$pid" -ne 1 ] &&
  set -- $(ps -p "$pid" -o ppid= -o tty= -o args=) &&
  [ "$2" = "$my_tty" ]
do
  pid=$1
done
shift; shift
printf '%s\n' "$*"

이 스크립트를 호출하십시오 which-terminal-emulator. 당신은 .vimrc추가 할 수 있습니다

let terminal_emulator=system('which-terminal-emulator')
if terminal_emulator =~ '.*guake.*$'
endif

답변2

Giles의 답변에 대한 응답으로(주석에 넣으려고 하면 혼란스러워 보일 것입니다) 스크립트가 tmux에서 작동하지 않습니다. 문제를 해결하려면 마지막 두 줄을 다음으로 바꿀 수 있습니다.

case "$3" in
    *tmux*)
        tmuxpid=$(tmux display-message -p "#{client_pid}")
        printf '%s\n' "$(ps -p $(ps -p $(ps -p $tmuxpid -o sid=) -o ppid=) -o args=)" ;;
    *)
        shift; shift*
        printf '%s\n' "$*";;
esac

관련 정보