数十の端末を開くのは好きではありません。 Nautilusを使用するときにターミナルで開くの代わりに現在のターミナルで開くを追加する方法はありますか?
汚れているかどうかに関係なく、以下のソリューションは頻繁にテストした30分で完全に機能しました。このソリューションは、ディレクトリ内のファイル(任意)を右クリックできる限り機能します。
#!/usr/bin/env python3
import subprocess
import os
import time
def replace(path):
for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
("file://", ""), ("%20", " ")]:
path = path.replace(c[0], c[1])
return path
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
t = get(["pgrep", "gnome-terminal"])
if t:
w = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if t in l][0]
# get the current path
current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)
# raise the found terminal window
subprocess.call(["wmctrl", "-ia", w])
time.sleep(0.3)
# copy the cd command to clipboard
c1 = "printf 'cd ' | xclip -in -selection c"
c2 = 'echo "'+"'"+dr+"'"+'" | xclip -in -selection c'
# paste & run it
for c in [c1, c2]:
subprocess.call(["/bin/bash", "-c", c])
subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
time.sleep(0.05)
スクリプトには、wmctrl
、xdotool
、およびxclipが必要です。
Sudo apt-get install wmctrl xdotool xclip
スクリプトを空のファイルにコピーして、open_in_terminal
に~/.local/share/nautilus/scripts
(拡張子なし)として保存します。必要に応じてディレクトリを作成します。 スクリプトを実行可能にする
それでおしまい。ログアウトしてからログインし直すと、画像のようにスクリプトが使用可能になります(2)。
"NAUTILUS_SCRIPT_CURRENT_URI"
を使用してパスを取得できます。xclip
を使用)gnome-terminal
ウィンドウを表示し、pastesをパスします。その前にcd
コマンドを付けます。 echo
を使用して行全体をクリップボードにロードしたため、 Return 含まれています。gnome-terminal
ウィンドウを選択します。Nautilusスクリプトの詳細 here 。
whichターミナルウィンドウで現在の(nautilus)ディレクトリを開くことを選択できるようにするには、以下のスクリプトを使用します。
#!/usr/bin/env python3
import subprocess
import os
import time
def replace(path):
for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
("file://", ""), ("%20", " ")]:
path = path.replace(c[0], c[1])
return path
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
# check if gnome-terminal runs
pid = get(["pgrep", "gnome-terminal"])
if pid:
t = 0
while t < 30:
# see if the frontmost window is a terminam window
active = get(["xdotool", "getactivewindow"])
if pid in get(["xprop", "-id", active]):
# get the current path
current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)
# copy the cd command to clipboard
c1 = "printf 'cd ' | xclip -in -selection c"
c2 = 'echo "'+"'"+dr+"'"+'" | xclip -in -selection c'
# paste & run it
for c in [c1, c2]:
subprocess.call(["/bin/bash", "-c", c])
subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
time.sleep(0.05)
break
else:
t += 1
time.sleep(0.5)
最初のスクリプトとまったく同じです。
このスクリプトには、最初のスクリプトとは1つの違いがあります。最初に見つかったターミナルウィンドウを自動的に上げるのではなく、最初のターミナルウィンドウがフォーカスされるまで待機します。 次に、そのウィンドウ内のディレクトリにcdします。
これを行う方法はないと確信していますが、役立つ可能性のある回避策があります。
いつでもディレクトリをNautilusからターミナルウィンドウにドラッグアンドドロップできます。Nautilusはそのディレクトリを渡してコマンドラインに貼り付けるため、cd
を実行してからフォルダをターミナルにドラッグし、Enterキーを押します。
最も簡単な方法はこれです:
cd
、スペースを入力してから、 Shift + Insert (or INS) パスを貼り付けます。ヒット Enter。スクリプトや追加の作業は必要ありません。
私の意見では、これを回避することなくこれを解決するための唯一のエレガントな方法は、 tmux のようなターミナルマルチプレクサを使用し、ファイルマネージャを使用することです
次のシェルスクリプトは、まさにそれを実現します。
#!/bin/sh
set -e
TMUX=tmux
#TERMINAL_EMULATOR='gnome-terminal -x'
cd "$1"
if $TMUX has-session; then
exec $TMUX new-window
else
exec ${TERMINAL_EMULATOR:-x-terminal-emulator -x} $TMUX
fi
TERMINAL_EMULATOR
は、新しいターミナルウィンドウに必要なターミナルエミュレーター(x-terminal-emulator
が指すもののデフォルトが気に入らない場合)と、エミュレーター内で実行するコマンドのコマンドラインオプションを保持します。
ファイルマネージャで他のファイルタイプの関連付けと同様に、ファイルハンドラスクリプトを登録できます。