8
votes

Shift + retourner pour insertion de la ligne de ligne en python

J'essaie d'obtenir le comportement des clients IM typiques qui utilisent retour pour envoyer un texte et shift + retourner pour insérer une cheviche. Existe-t-il un moyen de réaliser cela avec un effort minimal en Python, par exemple. readline et Raw_Input ?


2 commentaires

Vous recherchez une réponse en fonction de la plate-forme ou une réponse indépendante?


Plate-forme indépendante Si possible, mais * Nix Compatible doit faire en tant que application cible de toute façon les utilisateurs de la ligne de commande.


4 Réponses :


1
votes

Je doute que vous puissiez faire cela simplement en utilisant le module readline car il ne capturera pas les touches individuelles enfoncées et plutôt à traiter simplement les réponses du caractère de votre pilote d'entrée.

Vous pouvez le faire avec Pyhook cependant et si le La touche Shift est enfoncée avec la touche Entrée pour injecter une nouvelle ligne dans votre readline flux.


1 commentaires

Merci, mais j'aimerais gérer la compatibilité de la plate-forme avec * Nix!



1
votes

Je pense que avec un effort minimal Vous pouvez utiliser Urwid bibliothèque pour python . Malheureusement, cela ne satisfait pas à votre condition d'utiliser readline / Raw_Input.

Mise à jour: S'il vous plaît voir aussi Cette réponse < / a> pour une autre solution.


0 commentaires

2
votes

OK, j'ai entendu dire que cela peut être accompli aussi avec le readline code>, d'une manière.

Vous pouvez Importer readline code> et définir la configuration de votre clé souhaitée (décalage + Entrée) à une macro qui met un caractère spécial à la fin de la ligne et la nouvelle ligne. Ensuite, vous pouvez appeler brut_input code> dans une boucle. P>

comme ceci: p>

import readline    
# I am using Ctrl+K to insert line break 
# (dont know what symbol is for shift+enter)
readline.parse_and_bind('C-k: "#\n"')
text = []
line = "#"
while line and line[-1]=='#':
  line = raw_input("> ")
  if line.endswith("#"):
    text.append(line[:-1])
  else:
    text.append(line)

# all lines are in "text" list variable
print "\n".join(text)


0 commentaires

0
votes
import readline
# I am using Ctrl+x to insert line break 
# (dont know the symbols and bindings for meta-key or shift-key,  
# let alone 4 shift+enter)

def startup_hook():
    readline.insert_text('» ') # \033[32m»\033[0m

def prmpt():
try:
    readline.parse_and_bind('tab: complete')
    readline.parse_and_bind('set editing-mode vi')
    readline.parse_and_bind('C-x: "\x16\n"') # \x16 is C-v which writes
    readline.set_startup_hook(startup_hook) # the \n without returning
except Exception as e:                      # thus no need 4 appending
    print (e)                              # '#' 2 write multilines
    return                # simply use ctrl-x or other some other bind
while True:             # instead of shift + enter
    try:
        line = raw_input()
        print '%s' % line
    except EOFError:
        print 'EOF signaled, exiting...'
        break

# It can probably be improved more to use meta+key or maybe even shift enter 
# Anyways sry 4 any errors I probably may have made.. first time answering 

0 commentaires