##// END OF EJS Templates
Backport PR #2738: Unicode content crashes the pager (console)...
Backport PR #2738: Unicode content crashes the pager (console) We've run into an interesting bug in the astropy project. https://github.com/astropy/astropy/issues/600 When displaying a docstring that contains Unicode and is also long enough that it gets sent to the pager it fails since the docstring can't be sent to the pager as ascii. This crashes in the middle of sending content to the pager, so the shell ends up in an inconsistent state and stops echoing the keyboard etc. The fix (attached) is merely to encode the content sent to the pager in the same encoding as the terminal (`sys.stdout.encoding`). Strictly speaking, this isn't always the right thing to do, since the pager may be configured to expect a different encoding than the terminal, but that is sort of an irrational way to configure a machine... ;) For example, `less`, in the absence of any special environment variables to tell it otherwise, uses the standard `LC*` environment variables to determine what to do, which should be the same mechanism the terminal also uses by default. If anyone can suggest a better fix, I'm all for it. Perhaps it should be configurable, defaulting to `sys.stdout.encoding`?

File last commit:

r4872:34c10438
r9853:7f9a133e
Show More
ipy_completers.py
138 lines | 3.9 KiB | text/x-python | PythonLexer
ville
initialization (no svn history)
r988 """ Implementations for various useful completers
Brian Granger
Renaming Extensions=>extensions in code and imports.
r2064 See extensions/ipy_stock_completers.py on examples of how to enable a completer,
ville
initialization (no svn history)
r988 but the basic idea is to do:
ip.set_hook('complete_command', svn_completer, str_key = 'svn')
Fernando Perez
Removed a lot of code from here, which will be committed next....
r2958 NOTE: some of the completers that used to be here, the ones used always by
default (loaded before by ipy_stock_completers) have been moved into
core.completerlib, where they will be further cleaned up and maintained. The
rest of this file would need to be well commented, cleaned up and tested for
inclusion into the core.
ville
initialization (no svn history)
r988 """
Brian Granger
Continuing a massive refactor of everything.
r2205
ville
initialization (no svn history)
r988 import glob,os,shlex,sys
import inspect
from time import time
Ville M. Vainio
module completer looks inside .egg zip files, close #196.
r1155 from zipimport import zipimporter
ville
initialization (no svn history)
r988
Fernando Perez
Removed a lot of code from here, which will be committed next....
r2958 from IPython.core import ipapi
from IPython.core.error import TryNext
ip = ipapi.get()
ville
initialization (no svn history)
r988
def vcs_completer(commands, event):
""" utility to make writing typical version control app completers easier
VCS command line apps typically have the format:
[sudo ]PROGNAME [help] [command] file file...
"""
cmd_param = event.line.split()
if event.line.endswith(' '):
cmd_param.append('')
if cmd_param[0] == 'sudo':
cmd_param = cmd_param[1:]
if len(cmd_param) == 2 or 'help' in cmd_param:
return commands.split()
Brian Granger
Continuing a massive refactor of everything.
r2205 return ip.Completer.file_matches(event.symbol)
ville
initialization (no svn history)
r988
svn_commands = """\
add blame praise annotate ann cat checkout co cleanup commit ci copy
cp delete del remove rm diff di export help ? h import info list ls
lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
pe propget pget pg proplist plist pl propset pset ps resolved revert
status stat st switch sw unlock update
"""
def svn_completer(self,event):
return vcs_completer(svn_commands, event)
hg_commands = """
add addremove annotate archive backout branch branches bundle cat
clone commit copy diff export grep heads help identify import incoming
init locate log manifest merge outgoing parents paths pull push
qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
qselect qseries qtop qunapplied recover remove rename revert rollback
root serve showconfig status strip tag tags tip unbundle update verify
version
"""
def hg_completer(self,event):
""" Completer for mercurial commands """
return vcs_completer(hg_commands, event)
Ville M. Vainio
bzr completer caches the commands (only runs bzr help commands on the first run)
r1067 __bzr_commands = None
vivainio2
bzr completer now gets commands from 'bzr help commands' (includes all commands provided by exensions also)
r1062 def bzr_commands():
Ville M. Vainio
bzr completer caches the commands (only runs bzr help commands on the first run)
r1067 global __bzr_commands
if __bzr_commands is not None:
return __bzr_commands
vivainio2
bzr completer now gets commands from 'bzr help commands' (includes all commands provided by exensions also)
r1062 out = os.popen('bzr help commands')
Ville M. Vainio
bzr completer caches the commands (only runs bzr help commands on the first run)
r1067 __bzr_commands = [l.split()[0] for l in out]
Bernardo B. Marques
remove all trailling spaces
r4872 return __bzr_commands
ville
initialization (no svn history)
r988
def bzr_completer(self,event):
""" Completer for bazaar commands """
cmd_param = event.line.split()
if event.line.endswith(' '):
cmd_param.append('')
if len(cmd_param) > 2:
cmd = cmd_param[1]
param = cmd_param[-1]
output_file = (param == '--output=')
if cmd == 'help':
vivainio2
bzr completer now gets commands from 'bzr help commands' (includes all commands provided by exensions also)
r1062 return bzr_commands()
ville
initialization (no svn history)
r988 elif cmd in ['bundle-revisions','conflicts',
'deleted','nick','register-branch',
'serve','unbind','upgrade','version',
'whoami'] and not output_file:
return []
else:
# the rest are probably file names
Brian Granger
Continuing a massive refactor of everything.
r2205 return ip.Completer.file_matches(event.symbol)
ville
initialization (no svn history)
r988
vivainio2
bzr completer now gets commands from 'bzr help commands' (includes all commands provided by exensions also)
r1062 return bzr_commands()
ville
initialization (no svn history)
r988
def apt_get_packages(prefix):
out = os.popen('apt-cache pkgnames')
for p in out:
if p.startswith(prefix):
yield p.rstrip()
Bernardo B. Marques
remove all trailling spaces
r4872
ville
initialization (no svn history)
r988 apt_commands = """\
update upgrade install remove purge source build-dep dist-upgrade
dselect-upgrade clean autoclean check"""
def apt_completer(self, event):
""" Completer for apt-get (uses apt-cache internally)
"""
cmd_param = event.line.split()
if event.line.endswith(' '):
cmd_param.append('')
if cmd_param[0] == 'sudo':
cmd_param = cmd_param[1:]
if len(cmd_param) == 2 or 'help' in cmd_param:
return apt_commands.split()
return list(apt_get_packages(event.symbol))