web-dev-qa-db-ja.com

現在のディレクトリで新しいターミナルを開く方法は?

ディレクトリにいるとき、同じディレクトリで別の端末を開きたい場合があります。

たとえば、私は~/code/someproject/src/にいて、新しいターミナルを開きます。デフォルトでは、~で開きます。現在のディレクトリで新しいターミナルを起動するにはどうすればよいですか?

ターミナルとしてurxvtを、ウィンドウマネージャーとしてi3を使用してArchLinuxを実行しています。

3
Richard Hum

この問題に取り組むさまざまなスクリプト/プログラムがあるi3-faqフォーラムには、非常に有益なスレッドがあります。

https://faq.i3wm.org/question/150/how-to-launch-a-terminal-from-here/

私は本当に素晴らしい仕事をするcプログラムxcwdに行きました。また、GUIプログラム内からも機能します。

3
cee

既存の端末内から端末を起動すると、現在の作業ディレクトリや設定したその他の環境変数を含め、元の端末の環境が保持されます。これが理由です urxvt &動作します

2
simotek

私はこれを行うために書いた本当に、本当に、本当に醜いハックを持っています。

https://github.com/RichardHum/bin/blob/master/curdirterm

私のホスト名はbulletMasterで、ホームディレクトリは/ root /です。

0
Richard Hum

Simotekの答えにやや似ています:

st を使用します。これは、他の多くのターミナルエミュレーターと同様に、コマンドラインから実行すると、現在の作業ディレクトリに新しいターミナルを開きます。

alias opennewterm="st >/dev/null 2>&1 & disown"のようなエイリアスは、現在のディレクトリで端末を開き、端末をブロックしません。

zshを使用している場合は、.zshrcに次のように入力することで、キーボードショートカットにバインドできます。

bindkey -s "^[n" "opennewterm\n"

Alt+nが押されたときにopennewtermと改行を入力します。

0

urxvtdを使用すると、私が見た答えはどれも機能しません。この場合、すべてのターミナルウィンドウが同じurxvtdデーモンプロセスに関連付けられ、正しいシェルインスタンスを識別する簡単な方法がないようです。障害者を取得します。

これに対処するために、私は醜いハックを使用しました。 preexecトリックでzshを使用して、ウィンドウタイトルに現在のディレクトリを(現在および最後のコマンド、時刻などとともに)表示します。これはとにかく便利だと思います。私はzshrcで次の形式の何かを使ってそれを行います(完全な最新バージョンについては、それを適応させる必要があります。 このコマンド を参照してください; ここ を参照してください) :

preexec () {
  local WD="$(pwd | sed "s/^\/home\/$USER/~/")"
  export LASTDATE="`date +%T`"
  if [[ "$TERM" == "rxvt-unicode" || "$TERM" == "rxvt-unicode-256color" ]]; then
    export COMMAND="$(echo $1 | tr -d '\n')"
    echo -ne "\e]0;$LOCALNAME $Host:$WD$ $COMMAND ($LASTDATE)\a"
  fi
}

次に、現在のフォーカスされたウィンドウでタイトルを抽出するだけで、フォーカスされたurxvtインスタンスと同じディレクトリで新しいurxvtを実行するスクリプトを作成しました(最新バージョンについては ここ を参照) :

#!/bin/bash

# run ARGV, with -cd FOLDER if FOLDER can be extracted from title of current
# window (see zsh config for how the title gets put in the window)

# http://superuser.com/a/403369/77814
quoted_args="$(printf " %q" "$@")"

# inspired by
# https://faq.i3wm.org/question/150/how-to-launch-a-terminal-from-here/%3C/p%3E.html
ID=$(xdpyinfo | grep focus | cut -d ',' -f1 | rev | cut -d ' ' -f1 | rev)
CLASS=$(xprop -id "$ID" | grep -m1 WM_CLASS | cut -d'"' -f2)

# https://stackoverflow.com/a/19411918
if [ "${CLASS^^}" != "URXVT" ]
then
  # no urxvt focused -- just do the default
  # optionally we could try to extract the pwd with
  # https://github.com/schischi-a/xcwd or something
  exec $quoted_args
fi

TITLE=$(xprop -id "$ID" | grep -m1 WM_NAME)
MYPWD=$(echo "$TITLE" | cut -d'$' -f1 | cut -d'"' -f2- | cut -d':' -f2-)
MYPWD2="${MYPWD/#\~/$HOME}"

if [ ! -z "$MYPWD2" -a -d "$MYPWD2" -a -r "$MYPWD2" -a -x "$MYPWD2" ]
then 
  exec $quoted_args -cd "$MYPWD2"
else
  exec $quoted_args
fi
0
a3nm

私は最近、最後にフォーカスされた端末からのシェルPIDの作業ディレクトリを共有メモリ(IPC)に保持するurxvt拡張機能を開発しました。

完全なドキュメントとコードはここにあります: https://raphael.medaer.me/2019/06/21/urxvt-open-current-wd.html

0
Raphael Medaer