我不喜欢打开几十个终端。有没有办法添加在当前终端中打开代替在终端中打开何时使用 Nautilus?
答案1
不管脏不脏,下面的解决方案在我频繁测试的 30 分钟内完美地工作了。只要你能右键单击目录内的文件(任意),该解决方案就有效:
1.
2.
3.
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
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 的获取路径
"NAUTILUS_SCRIPT_CURRENT_URI"
。 - 然后,我们可以在脚本中将此路径加载到剪贴板(使用
xclip
) - 随后,脚本会弹出(第一个找到的)
gnome-terminal
窗口并糊状物路径,前面是cd
命令。由于我们习惯echo
将整行加载到剪贴板中,Return因此也包括在内。
笔记
- 应该清楚的是,终端中不应该运行任何程序,并且如果只打开一个终端窗口,则效果最佳。如果有多个终端窗口,脚本将选择最旧的
gnome-terminal
窗口。 - 该脚本需要在实践中彻底测试。在我运行它时,计时没有任何问题,即使桌面必须“穿越”四五个视口才能到达终端窗口时也是如此。如果会发生错误,但是,只要多写几行,我们就可以让它真正等待以更智能的方式提升终端窗口。让我们看看会发生什么。这似乎没有必要。
- 由于脚本使用真实路径,链接目录也将正常工作。
有关 nautilus 脚本的更多信息这里。
或者,如果您有多个,请选择您自己的终端窗口
如果你想选择哪个您将在终端窗口中打开当前(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)
设置
与第一个脚本一模一样。
解释
该脚本与第一个脚本有一个不同之处:它不是自动提升第一个找到的终端窗口,而是等待第一个终端窗口获得焦点。然后它将 cd 转到该窗口内的目录。
答案2
最简单的方法是这样的:
- 在 nautilus 中,按Ctrl+ L,这将打开地址栏进行编辑。按Ctrl+C
- 切换到终端并输入
cd
、空格,然后输入Shift+Insert (or INS)以粘贴路径。点击Enter。
无需脚本或额外工作。
答案3
我很确定没有办法做到这一点,但是我有一个解决方法可能会有所帮助。
您随时可以将目录从 Nautilus 拖放到终端窗口,Nautilus 将传递该目录并将其粘贴到命令行中,因此您可以执行此操作cd
,然后将文件夹拖到终端上并按回车键。
答案4
在我看来,解决这个问题的唯一优雅的方法是使用终端多路复用器,如tmux并让你的文件管理器
- 在现有会话中打开新的终端窗口或
- 使用新的 tmux 会话启动一个新的终端仿真器。
下面的 shell 脚本实现了这个目的:
#!/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
)以及在仿真器内部执行命令的命令行选项。
您可以像文件管理器中的任何其他文件类型关联一样注册文件处理程序脚本。