Próbuję uzyskać zachowanie typowych klientów IM, którzy używają Return
, aby wysłać tekst i Shift + Return
, aby wstawić linebreak. Czy istnieje sposób na osiągnięcie tego przy minimalnym wysiłku w Pythonie, przy użyciu np. readline i raw_input
?Shift + Return, aby wstawić linebreak w pythonie
Odpowiedz
Ok, słyszałem, że można to w pewnym sensie osiągnąć również za pomocą readline
.
Możesz ustawić import readline
i ustawić w konfiguracji żądany klucz (Shift + Enter) do makra, które umieszcza znak specjalny na końcu linii i znaku nowej linii. Następnie możesz zadzwonić pod numer raw_input
w pętli.
Jak to:
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)
Wątpię, czy byłbyś w stanie to zrobić za pomocą modułu readline
, ponieważ nie będzie on przechwytywał poszczególnych naciśniętych klawiszy, a jedynie przetwarza odpowiedzi na znak ze sterownika wejściowego.
Można to zrobić z PyHook choć i jeśli zostanie naciśnięty klawisz Shift
wraz z kluczem Enter
wstrzyknąć nową linię do swojego strumienia readline
.
Dzięki, ale chciałbym utrzymać zgodność platformy z * nix! –
Myślę, że przy minimalnym wysiłku można użyć biblioteki urwid dla Python. Niestety, nie spełnia to twojego wymagania użycia readline/raw_input.
Aktualizacja: Patrz również this answer w celu znalezienia innego rozwiązania.
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
Szukasz odpowiedzi zależnej lub niezależnej platformy? – Jiri
Niezależnie od platformy, jeśli to możliwe, ale kompatybilny z nix powinien robić to, co aplikacja i tak jest skierowana do użytkowników linii poleceń. –