guake中判断终端是否打开

guake中判断终端是否打开

我需要检查打开.vimrcvim的终端是否在Guake中运行。我怎样才能看到这个?变量$TERM好像不太对……

答案1

没有万无一失的方法。TERM对大多数兼容的模拟器使用相同的值;除了 screen 和 tmux 报告之外,大多数现代终端模拟器xterm

您可以浏览进程列表来查找 Vim 的父进程的父进程。这将告诉您 Vim 在哪个终端仿真器(如果有)中运行,通常情况下,Vim 是从直接在终端仿真器中启动的 shell 启动的。您甚至可以更聪明一点,遍历进程列表,从 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

回应吉尔斯的回答(如果我尝试将其放入评论中,这看起来会很混乱);该脚本在 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

相关内容