如何在当前终端中打开Nautilus目录?


Answers:


13

不管是否脏,下面的解决方案在我经常测试的30分钟内都可以正常工作。只要您可以右键单击目录内的文件(任意),该解决方案就可以工作:

1。

在此处输入图片说明

2。

在此处输入图片说明

3。

在此处输入图片说明

鹦鹉螺脚本

#!/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)

如何使用

  1. 该脚本的需求wmctrlxdotool并XCLIP:

    sudo apt-get install wmctrl xdotool xclip
    
  2. 将脚本复制到一个空文件中,然后将其另存为open_in_terminal(无扩展名)~/.local/share/nautilus/scripts。根据需要创建目录。使脚本可执行

而已。注销并重新登录,您将获得如图所示的脚本(2)。

说明

  • 右键单击文件,我们可以使用nautilus'获得路径"NAUTILUS_SCRIPT_CURRENT_URI"
  • 在脚本中,我们可以将该路径加载到剪贴板中(使用xclip
  • 随后,脚本将引发(第一个找到的)gnome-terminal窗口并粘贴路径,并在cd命令之前添加路径。由于我们曾经echo将整行加载到剪贴板中,Return因此包含在内。

笔记

  1. 应该清楚的是,终端中什么也没有运行,如果仅打开一个终端窗口,则效果最佳。如果有多个,脚本将选择最早的gnome-terminal窗口。
  2. 该脚本需要在实践中进行全面测试。在我运行它时,即使一次也没有问题,即使桌面必须“穿越”四个或五个视口才能到达终端窗口也没问题。IF但是会发生错误,用几行代码,我们可以把它实际上等待在智能(ER)的方式进行,以提高终端窗口。让我们看看发生了什么。似乎没有必要。
  3. 由于脚本使用realpath,因此链接目录也将正常工作。

有关nautilus脚本的更多信息,请参见此处


或者,如果您有多个终端窗口,请选择自己的终端窗口

如果要选择在哪个终端窗口中打开当前(鹦鹉螺)目录,请使用以下脚本。

在实践中如何运作

  1. 右键单击目录(在本例中为我的桌面)内的(任何)文件,如下所示:

    在此处输入图片说明

  2. 单击(或以其他方式提高)您要使用的终端窗口,它将CD到目录:

    在此处输入图片说明

剧本

#!/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到该窗口内的目录。


因为无论如何您都使用文件来启动脚本,所以只需从sys.argv [1]路径中删除文件名即可。它会使脚本更短
Sergiy Kolodyazhnyy

1
@TonyLancer创建目录~/.local/share/nautilus/scripts注销后返回菜单::
Jacob Vlijm

1
@Benny,仅在nautilus上单击鼠标右键才能使用。
Jacob Vlijm '16

1
@Benny脚本的环境从父进程中传递下来。在这种情况下,Nautilus是脚本的父进程,它为脚本设置了环境。如果您尝试通过python解释器或脚本执行相同的操作,则它将具有不同的父进程,因此它将返回,None因为没有这样的变量(即在Nautilus之外)。
Sergiy Kolodyazhnyy

1
@JacobVlijm,您很棒。全力以赴!现在,我了解了第二个脚本的工作原理,您对触发器是正确的。对于ubuntu社区来说,这确实是一个不错的工具。当然,对于任何脚本,我们都可以考虑许多改进,但这是可以完成的。只需在您的答案中提及第二个脚本即可与Alt Tab一起使用。
Vitor Abella

8

我很确定没有办法做到这一点,但是我为您提供了一种可能会有所帮助的解决方法。

您始终可以将目录从Nautilus拖放到终端窗口中,Nautilus将传递该目录并将其粘贴到命令行中,因此您可以这样做cd,然后将文件夹拖到终端上并按Enter。


8

最简单的方法是这样的:

  1. 在nautilus中,按Ctrl+ L,这将打开地址栏进行编辑。按下Ctrl +C
  2. 切换到终端并输入cd,空格,然后按Shift+ Insert (or INS)粘贴路径。击中Enter

无需脚本或额外的工作。


我使用Ctrl + Shift + V粘贴路径。
卡图

1
是的,这是另一种方式。Linux实际上有两个剪贴板,所以Ctrl + Shift + V用于主剪贴板,而Shift + Insert用于辅助剪贴板,但是由于第二个仅需要两个键,因此我主要使用它。他们共享的,除非你的东西突出-当东西进入二级剪贴板真实
谢尔盖Kolodyazhnyy

1

在我看来,解决这一问题的唯一优雅方法是使用像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指向的),以及用于在仿真器内部执行的命令的命令行选项。

您可以像在文件管理器中注册任何其他文件类型关联一样注册文件处理程序脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.