Existe-t-il une commande dans Gnome-Terminal, ou tout shell tabable pour ouvrir un nouvel onglet?


11

Je ne cherche pas de raccourci clavier, je veux plutôt des commandes pour:

  • Nouvelle fenetre
  • Nouvel onglet
  • Fermer l'onglet ou la fenêtre actuelle
  • Agrandir la fenêtre du shell
  • Réduire la fenêtre du shell
  • Déplacer Shell vers un autre espace de travail
  • Onglet Switch

Et fondamentalement quelque chose comme ça. Rappelles toi; Je ne veux pas de raccourcis, mais plutôt des commandes réelles. La raison en est que je peux utiliser la fonctionnalité d'alias.


1
Le python vous convient-il?
Sergiy Kolodyazhnyy

4
"Fermer l'onglet actuel" - cette commande est appelée "quitter": D
egmont

"Je ne veux pas de raccourcis [...] pour pouvoir utiliser la fonctionnalité d'alias" - pourriez-vous s'il vous plaît nous en dire plus? Quel est l'avantage exact que vous espérez au lieu des raccourcis bien connus? Quel est le problème ou les fonctionnalités manquantes dans les raccourcis? Je pense qu'ils sont la bonne approche pour ce que vous recherchez.
egmont

@egmont Je suis un Vim Addict, si cela a du sens.
Akiva

Donc, disons, par exemple pour Maximize, au lieu d'avoir un raccourci clavier de gestionnaire de fenêtres qui fonctionne pour toutes sortes de fenêtres (navigateur, éditeur d'images, traitement de texte, etc.) dans tous les états (c'est-à-dire tout ce que vous faites en leur sein), vous ' Je préfère avoir une commande qui ne fonctionne que pour le terminal et aucune autre application, et seulement si elle n'exécute aucune commande à l'intérieur (autre que le shell par défaut, bien sûr). Non, désolé, cette idée n'a toujours pas beaucoup de sens pour moi :(
egmont

Réponses:


14

Vous ne pouvez pas le faire par défaut dans Gnome-Terminal, au moins avec des commandes brutes.

Cependant, vous pouvez écrire des scripts qui appellent des raccourcis clavier pour ce faire. Notez que vous avez besoin xdotoolpour cela:sudo apt install xdotool

  • Nouvelle fenêtre : Lancez une nouvelle fenêtre de terminal avec nw
    Nous pouvons le faire avec juste gnome-terminal.
    Ajouter à.bashrc :

    echo "alias nw=gnome-terminal" >> ~/.bashrc
  • Nouvel onglet : lancez un nouvel onglet avec nt
    Nous pouvons le faire avec xdotool getactivewindow $(xdotool key ctrl+shift+t)
    Ajouter à.bashrc :

    echo "alias nt='xdotool getactivewindow $(xdotool key ctrl+shift+t)'" >> .bashrc
  • Fermer l'onglet : Fermer à nouveau l'onglet ou la fenêtre en cours avec des ct
    xdotoolgrèves: xdotool getactivewindow $(xdotool key ctrl+shift+w)
    Ajouter à.bashrc :

    echo "alias ct='xdotool getactivewindow $(xdotool key ctrl+shift+w)'" >> .bashrc
  • Agrandir la fenêtre : Maximisez la fenêtre entière avec maw
    Nous pouvons utiliser wmctrlici: wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
    Ajouter à.bashrc :

    echo "alias maw='wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz'" >> .bashrc
  • Réduire la fenêtre : Réduisez toute la fenêtre avec miw
    Nous pouvons utiliser à xdotoolnouveau: xdotool windowminimize $(xdotool getactivewindow)
    Ajouter à.bashrc :

    echo "alias miw='xdotool windowminimize $(xdotool getactivewindow)'" >> .bashrc
  • Déplacer vers l'espace de travail : déplacer une fenêtre vers un autre espace de travail avec mtw <id>
    Cela serait à peine possible dans les scripts shell, et va bien au-delà de mon expérience personnelle. Je recommanderais d'utiliser le script de Serg à cet effet, car il fonctionne actuellement. Ah, les avantages de Compiz.


7

introduction

Le script présenté dans cette réponse permet à l'utilisateur de contrôler sa fenêtre de terminal via une seule commande et une liste d'options. Il est simple à utiliser et compatible avec tout émulateur de terminal ayant des raccourcis clavier similaires à gnome-terminal. Les options de déplacement peuvent également être utilisées avec d'autres terminaux, mais l'ouverture des onglets n'est pas garantie pour ces terminaux.

Le script couvre l'ouverture des onglets, l'ouverture des fenêtres, le déplacement vers l'espace de travail vers le bas, l'espace de travail vers la droite, l'espace de travail spécifique référencé par un nombre entier, la réduction, la maximisation et la non-maximisation d'une fenêtre. La seule chose que le script ne couvre pas est la fermeture de l'onglet / fenêtre simplement parce que chaque émulateur de shell / terminal a déjà une commande pour cela - exitou alternativement via un CtrlDraccourci.

!!! REMARQUE: vous aurez besoin xdotoolde changer d'espace de travail et d'ouvrir l'onglet. Installez-le via sudo apt-get install xdotool. Si vous préférez ne pas installer de packages supplémentaires, gardez à l'esprit que l'espace de travail et la commutation des onglets ne fonctionneront pas , mais d'autres options le seront.

Usage:

Tous les arguments de windowctrl.pysont facultatifs, ils peuvent donc être utilisés séparément ou potentiellement ensemble. Comme indiqué par l' -hoption.

$ ./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

Code source du script:

Le code source du script est disponible sur GitHub ainsi qu'ici. Les dernières modifications sont susceptibles d'entrer dans le GitHub plutôt qu'ici, donc je suggère fortement de vérifier la dernière version là-bas. Il est également suggéré de publier également des rapports de bogues.

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

Notes annexes

  • Vous avez demandé "Y a-t-il une commande dans Gnome-Terminal, ou un shell tabable pour ouvrir un nouvel onglet?" Le manuel de Gnome Terminal ne répertorie pas une telle option. Les shells sont des utilitaires de ligne de commande. Les onglets font partie des applications GUI. Il existe des multiplexeurs de terminaux comme screenou tmuxqui peuvent avoir des "onglets" ou des fenêtres divisées, qui se rapprochent en quelque sorte du "shell tabable" mais ce n'est pas le même type de comportement que vous demandez. Fondamentalement, la réponse à votre question est "Non". Il y a toujours des alternatives et ma réponse en propose une. Il traite la fenêtre du terminal selon sa nature - fenêtre GUI X11.

  • Quel est le lien entre cette réponse et les alias? Eh bien, tout d'abord, les alias peuvent être un peu compliqués, surtout quand il s'agit de citer et d'analyser plusieurs sorties de plusieurs commandes. Ce script vous donne une commande centralisée avec des indicateurs / commutateurs pour effectuer une tâche discrète sur une fenêtre. Cela simplifie également les alias. Tu pourrais faire alias nw='windowctrl.py --window'. Beaucoup plus court, beaucoup plus net.


Je suis satisfait des terminaux divisés
Akiva

1
@Akiva voulez-vous que je relie une question liée au fractionnement du terminal? avez-vous déjà essayé ce script? Qu'est-ce que tu penses ?
Sergiy Kolodyazhnyy

J'essaierai votre script, car la réponse ci-dessus me pose problème. Cependant, je n'ai peut-être pas autant de chance, car le problème concerne principalement xdotool.
Akiva

@Akiva et quel est le problème xdotool? Peut-être que je pourrais le réparer?
Sergiy Kolodyazhnyy

Je vais devoir vous revenir là-dessus. Je dois peut-être faire avec ma disposition de clavier personnalisée, ou le fait que je suis sur 16.10, ou que je l'essaye sur Guake.
Akiva
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.