Есть ли в Gnome-Terminal команда или какая-либо оболочка с вкладками для открытия новой вкладки?

11

Я не ищу сочетания клавиш, а хочу команды для:

  • Новое окно
  • Новая вкладка
  • Закрыть текущую вкладку или окно
  • Развернуть окно Shell
  • Свернуть окно оболочки
  • Переместить оболочку в другое рабочее пространство
  • Переключатель

И в принципе что-нибудь подобное. Помнить; Я не хочу ярлыки, а скорее актуальные команды. Причина в том, что я могу использовать псевдонимы.

Акива
источник
1
Питон в порядке с тобой?
Сергей Колодяжный
4
«Закрыть текущую вкладку» - эта команда называется «выход»: D
egmont
«Я не хочу ярлыков [...], чтобы я мог использовать псевдоним» - не могли бы вы уточнить это? На какое именно преимущество вы надеетесь вместо известных ярлыков? В чем проблема или отсутствует функциональность в ярлыках? Я думаю, что они являются правильным подходом для того, что вы ищете.
egmont
@egmont Я Vim Addict, если это имеет смысл.
Акива
Итак, скажем, например, для Maximize, вместо того, чтобы иметь горячую клавишу оконного менеджера, которая работает для всех видов окон (браузер, редактор изображений, текстовый процессор и т. Д.) Во всех состояниях (т.е. что бы вы ни делали внутри них), вы ' Я предпочел бы иметь команду, которая работает только для терминала, а не для другого приложения, и только в том случае, если внутри не выполняется какая-либо команда (кроме оболочки по умолчанию, конечно). Нет, извините, эта идея все еще не имеет большого смысла для меня :(
egmont

Ответы:

14

Вы не можете сделать это по умолчанию в Gnome-Terminal, по крайней мере с необработанными командами.

Тем не менее, вы можете написать сценарии, которые вызывают сочетания клавиш, которые могут сделать это. Обратите внимание, что вам нужно xdotoolдля этого:sudo apt install xdotool

  • Новое окно : Запустите новое окно терминала с помощью « nw
    Мы можем сделать это просто» gnome-terminal.
    Добавить к.bashrc :

    echo "alias nw=gnome-terminal" >> ~/.bashrc
  • Новая вкладка : Запустите новую вкладку с помощью nt
    Мы можем сделать это с помощью xdotool getactivewindow $(xdotool key ctrl+shift+t)
    Добавить в.bashrc :

    echo "alias nt='xdotool getactivewindow $(xdotool key ctrl+shift+t)'" >> .bashrc
  • Закрыть вкладку : ct
    xdotoolснова закрыть текущую вкладку или окно с ударами: xdotool getactivewindow $(xdotool key ctrl+shift+w)
    Добавить к.bashrc :

    echo "alias ct='xdotool getactivewindow $(xdotool key ctrl+shift+w)'" >> .bashrc
  • Развернуть окно : развернуть все окно с помощью maw
    Мы можем использовать wmctrlздесь: wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
    Добавить к.bashrc :

    echo "alias maw='wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz'" >> .bashrc
  • Свернуть окно : сверните все окно с помощью miw
    Мы можем использовать xdotoolснова: xdotool windowminimize $(xdotool getactivewindow)
    Добавить к.bashrc :

    echo "alias miw='xdotool windowminimize $(xdotool getactivewindow)'" >> .bashrc
  • Переместить в рабочую область : переместить окно в другое рабочее пространство с помощью mtw <id>
    Это вряд ли возможно в сценариях оболочки, и это далеко за пределами моего личного опыта. Я бы порекомендовал использовать для этой цели скрипт Серга, потому что он действительно работает на данный момент. Ах, преимущества Compiz.

Каз Вулф
источник
7

Вступление

Сценарий, представленный в этом ответе, позволяет пользователю управлять своим терминальным окном с помощью одной команды и списка опций. Он прост в использовании и совместим с любым эмулятором терминала, который имеет привязку клавиш gnome-terminal. Параметры перемещения можно использовать и с другими терминалами, но открытие вкладок для этих терминалов не гарантируется.

Сценарий охватывает открытие вкладки, открытие окна, перемещение в рабочее пространство вниз, правое рабочее пространство, конкретное рабочее пространство, на которое ссылается целое число, минимизацию, максимизацию и максимизацию окна. Единственное, что не охватывает скрипт, - это закрытие вкладки / окна просто потому, что у каждого эмулятора оболочки / терминала уже есть команда для него - exitили, альтернативно, через CtrlDярлык.

!!! ПРИМЕЧАНИЕ: вам понадобится xdotoolдля переключения рабочей области и открытия вкладки. Установите его через sudo apt-get install xdotool. Если вы предпочитаете не устанавливать дополнительные пакеты, имейте в виду, что переключение между рабочим пространством и вкладками не будет работать , но будут работать другие варианты.

Использование:

Все аргументы to windowctrl.pyявляются необязательными, поэтому их можно использовать отдельно или потенциально вместе. Как показано -hопцией.

$ ./windowctrl.py -h                                                                               
usage: windowctrl.py [-h] [-w] [-t] [-m] [-M] [-u] [-v VIEWPORT] [-r] [-d]

Copyright 2016. Sergiy Kolodyazhnyy.

    Window control for terminal emulators. Originally written
    for gnome-terminal under Ubuntu with Unity desktop but can 
    be used with any other terminal emulator that conforms to 
    gnome-terminal keybindings. It can potentially be used for 
    controlling other windows as well via binding this script
    to a keyboard shortcut.

    Note that --viewport and --tab options require xdotool to be
    installed on the system. If you don't have it installed, you 
    can still use the other options. xdotool can be installed via
    sudo apt-get install xdotool.


optional arguments:
  -h, --help            show this help message and exit
  -w, --window          spawns new window
  -t, --tab             spawns new tab
  -m, --minimize        minimizes current window
  -M, --maximize        maximizes window
  -u, --unmaximize      unmaximizes window
  -v VIEWPORT, --viewport VIEWPORT
                        send window to workspace number
  -r, --right           send window to workspace right
  -d, --down            send window to workspace down

Исходный код скрипта:

Исходный код скрипта доступен как на GitHub, так и здесь. Последние изменения, скорее всего, войдут в GitHub, а не здесь, поэтому я настоятельно рекомендую проверить последнюю версию там. Также предлагается публиковать там сообщения об ошибках.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Program name: windowctrl.py
Author: Sergiy Kolodyazhnyy
Date:  Sept 18, 2016
Written for: http://askubuntu.com/q/826310/295286
Tested on Ubuntu 16.04 LTS
"""
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gio,Gdk
import sys
import dbus
import subprocess
import argparse

def gsettings_get(schema,path,key):
    """Get value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.get_value(key)

def run_cmd(cmdlist):
    """ Reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        print(">>> subprocess:",cmdlist)
        sys.exit(1)
    else:
        if stdout:
            return stdout

def get_dbus(bus_type,obj,path,interface,method,arg):
    # Reusable function for accessing dbus
    # This basically works the same as 
    # dbus-send or qdbus. Just give it
    # all the info, and it will spit out output
    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)
    if arg:
        return method(arg)
    else:
        return method() 

def new_window():
    screen = Gdk.Screen.get_default()
    active_xid = int(screen.get_active_window().get_xid())
    app_path = get_dbus( 'session',
                         'org.ayatana.bamf',
                         '/org/ayatana/bamf/matcher',
                         'org.ayatana.bamf.matcher',
                         'ApplicationForXid',
                         active_xid
                         )

    desk_file  = get_dbus('session',
                          'org.ayatana.bamf',
                          str(app_path),
                          'org.ayatana.bamf.application',
                          'DesktopFile',
                          None
                          )

    # Big credit to Six: http://askubuntu.com/a/664272/295286
    Gio.DesktopAppInfo.new_from_filename(desk_file).launch_uris(None)



def enumerate_viewports():
    """ generates enumerated dictionary of viewports and their
        indexes, counting left to right """
    schema="org.compiz.core"
    path="/org/compiz/profiles/unity/plugins/core/"
    keys=['hsize','vsize']
    screen = Gdk.Screen.get_default()
    screen_size=[ screen.get_width(),screen.get_height()]
    grid=[ int(str(gsettings_get(schema,path,key))) for key in keys]
    x_vals=[ screen_size[0]*x for x in range(0,grid[0]) ]
    y_vals=[screen_size[1]*x for x in range(0,grid[1]) ]

    viewports=[(x,y)  for y in y_vals for x in x_vals ]

    return {vp:ix for ix,vp in enumerate(viewports,1)}


def get_current_viewport():
    """returns tuple representing current viewport, 
       in format (width,height)"""
    vp_string = run_cmd(['xprop', '-root', 
                         '-notype', '_NET_DESKTOP_VIEWPORT'])
    vp_list=vp_string.decode().strip().split('=')[1].split(',')
    return tuple( int(i)  for i in vp_list )

def maximize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.maximize()
    screen.get_active_window()
    window.process_all_updates()

def unmaximize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.unmaximize()
    screen.get_active_window()
    window.process_all_updates()

def minimize():

    screen = Gdk.Screen.get_default()
    window = screen.get_active_window()
    window.iconify()
    window.process_all_updates()

def window_move(viewport):

    # 1. grab window object
    # 2. jump viewport 0 0 so we can move only
    #    in positive plane
    # 3. move the window.
    # 4. set viewport back to what it was

    # Step 1
    screen = Gdk.Screen.get_default()
    screen_size=[ screen.get_width(),screen.get_height()]
    window = screen.get_active_window()

    viewports = enumerate_viewports()
    current = get_current_viewport()
    current_num = viewports[current]
    destination = [ 
                   key for  key,val in viewports.items() 
                   if val == int(viewport)
                   ][0]
    # Step 2.
    run_cmd([
            'xdotool',
            'set_desktop_viewport',
            '0','0'
            ]) 
    # Step 3.
    window.move(destination[0],destination[1])
    window.process_all_updates()

    run_cmd([
            'xdotool',
            'set_desktop_viewport',
            str(current[0]),
            str(current[1])
            ]) 

def move_right():
    sc = Gdk.Screen.get_default()
    width = sc.get_width()
    win = sc.get_active_window()
    pos = win.get_origin()
    win.move(width,pos.y)
    win.process_all_updates()

def move_down():
    sc = Gdk.Screen.get_default()
    height = sc.get_height()
    win = sc.get_active_window()
    pos = win.get_origin()
    win.move(pos.x,height)
    win.process_all_updates()

def new_tab():
    run_cmd(['xdotool','key','ctrl+shift+t'])

def parse_args():
    """ Parse command line arguments"""

    info="""Copyright 2016. Sergiy Kolodyazhnyy.

    Window control for terminal emulators. Originally written
    for gnome-terminal under Ubuntu with Unity desktop but can 
    be used with any other terminal emulator that conforms to 
    gnome-terminal keybindings. It can potentially be used for 
    controlling other windows as well via binding this script
    to a keyboard shortcut.

    Note that --viewport and --tab options require xdotool to be
    installed on the system. If you don't have it installed, you 
    can still use the other options. xdotool can be installed via
    sudo apt-get install xdotool.
    """
    arg_parser = argparse.ArgumentParser(
                 description=info,
                 formatter_class=argparse.RawTextHelpFormatter)
    arg_parser.add_argument(
                '-w','--window', action='store_true',
                help='spawns new window',
                required=False)
    arg_parser.add_argument(
                '-t','--tab',action='store_true',
                help='spawns new tab',
                required=False)
    arg_parser.add_argument(
                '-m','--minimize',action='store_true',
                help='minimizes current window',
                required=False)
    arg_parser.add_argument(
                '-M','--maximize',action='store_true',
                help='maximizes window',
                required=False)
    arg_parser.add_argument(
                '-u','--unmaximize',action='store_true',
                help='unmaximizes window',
                required=False)
    arg_parser.add_argument(
               '-v','--viewport',action='store',
               type=int, help='send window to workspace number',
               required=False)
    arg_parser.add_argument(
               '-r','--right',action='store_true',
               help='send window to workspace right',
               required=False)
    arg_parser.add_argument(
               '-d','--down',action='store_true',
               help='send window to workspace down',
               required=False)
    return arg_parser.parse_args()

def main():

    args = parse_args()

    if args.window:
       new_window()
    if args.tab:
       new_tab()
    if args.down:
       move_down()
    if args.right:
       move_right()       
    if args.viewport:
       window_move(args.viewport)
    if args.minimize:
       minimize()
    if args.maximize:
       maximize()
    if args.unmaximize:
       unmaximize()

if __name__ == '__main__':
    main()

Примечания стороны

  • Вы спросили: «Есть ли в Gnome-Terminal команда или какая-либо оболочка с вкладками для открытия новой вкладки?» В руководстве по Gnome Terminal такой опции нет. Оболочки являются утилитами командной строки. Вкладки - это особенность приложений с графическим интерфейсом. Существуют терминальные мультиплексоры, такие как screenили tmuxкоторые могут иметь «вкладки» или разделенные окна, что похоже на «оболочку с вкладками», но это не тот тип поведения, о котором вы спрашиваете. В основном, ответ на ваш вопрос - «Нет». Всегда есть альтернативы, и мой ответ дает один из них. Он обрабатывает окно терминала в соответствии с его природой - окном X11 GUI.

  • Как этот ответ относится к псевдонимам? Ну, во-первых, псевдонимы могут быть немного беспорядочными, особенно когда дело доходит до цитирования и анализа нескольких выходных данных от нескольких команд. Этот скрипт дает вам одну централизованную команду с флагами / переключателями для выполнения дискретной задачи в окне. Это также упрощает псевдонимы. Вы могли бы сделать alias nw='windowctrl.py --window'. Гораздо короче, намного аккуратнее.

Сергей Колодяжный
источник
Я доволен сплит-терминалами
Акива
1
@ Akiva, вы хотите, чтобы я связал вопрос, связанный с разделением терминала? Вы пробовали этот сценарий, кстати? что вы думаете ?
Сергей Колодяжный
Я буду пробовать ваш сценарий, потому что ответ выше доставляет мне неприятности. Однако, возможно, мне не так повезло из-за проблемы, связанной в основном с xdotool.
Акива
@ Akiva а с чем проблема xdotool? Может быть, я мог бы это исправить?
Сергей Колодяжный
Я должен вернуться к вам по этому вопросу. Возможно, я имею дело с моей собственной раскладкой клавиатуры, или с тем фактом, что я нахожусь на 16.10, или с тем, что я пробую это на guake.
Акива