问题
当我激活 Unity Dash 时,它会记住我使用 Dash 访问的最后一个应用程序、文件或文件夹。如果上一个项目是一个文件夹,而这次我正在寻找一个应用程序,则 Dash 无法找到该应用程序。
如何重现
- 按“super”键启动 Dash
- 输入你的用户名来找到你的主文件夹(其他文件夹名称也可以)
- 按“Enter”启动文件
- 再次启动 Dash
- 输入“firefox”或任何其他应用程序(无需先按“escape”)
解决方法
启动 Dash 后立即按下 Esc 键,从而清除之前的搜索词。
问题
我可以配置 Dash 以忘记上一个搜索词吗?有人知道这是否是预期的行为吗?
答案1
简单的解决方案就是右键单击 Dash 本身并选择您想要搜索的特定类别 - Dash 将自动清除。
我注意到重新打开的 Dash 会突出显示之前的文本。按退格键可以清除并执行新搜索,不会出现任何问题。如果我们可以自动执行此操作就好了……好吧,我们可以使用调用的应用程序xdotool
和一些脚本魔法来实现。
xdotool
通过以下脚本安装apt-get install xdotool
并保存。其基本任务是确定活动窗口是否为 Dash,并自动按 BackSpace 键清除 Dash。python script_name.py
通过将此脚本添加到启动应用程序,这意味着以 身份运行并在用户登录时启动。
#!/usr/bin/env python
import dbus,time,subprocess,os
def run_cmd(cmdlist):
""" utility: reusable function for running external commands """
new_env = dict(os.environ)
new_env['LC_ALL'] = 'C'
try:
stdout = subprocess.check_output(cmdlist, env=new_env)
except subprocess.CalledProcessError:
pass
else:
if stdout:
return stdout
def get_dbus(bus_type, obj, path, interface, method, arg):
""" utility: executes dbus method on specific interface"""
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj, path)
method = proxy.get_dbus_method(method, interface)
try:
if arg:
return method(arg)
else:
return method()
except dbus.exceptions.DBusException:
return None
def active_is_dash():
base = ['session','org.ayatana.bamf']
dbus_call = base + ['/org/ayatana/bamf/matcher', 'org.ayatana.bamf.matcher','ActiveWindow',None]
active_window = str(get_dbus(*dbus_call))
dbus_call = base + [active_window,'org.ayatana.bamf.view','Name',None]
active_name = str(get_dbus(*dbus_call))
if active_name == 'unity-dash': return True
command = 'xdotool key BackSpace'.split()
flag = None
while True:
time.sleep(0.25)
if active_is_dash():
time.sleep(0.25)
if not flag: run_cmd(command)
flag = True
else: flag = False
答案2
我发现通过
设置 > 安全和隐私 > 文件和应用程序
大大改善了 Dash 的性能和行为。它并没有完全解决我遇到的问题,但确实减少了发生这种情况的次数。例如,在步骤 5 中,如果我输入“fire”,然后暂停一秒钟(让 Dash 完成搜索),然后再输入“fox”,那么应用程序就会被找到。
我还发现了一个看似相关的错误报告。