##// END OF EJS Templates
add fullscreen support for QtConsole throught shortcut...
Matthias BUSSONNIER -
Show More
@@ -1,528 +1,529 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Usage information for the main IPython applications.
3 3 """
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2008-2010 The IPython Development Team
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 #
8 8 # Distributed under the terms of the BSD License. The full license is in
9 9 # the file COPYING, distributed as part of this software.
10 10 #-----------------------------------------------------------------------------
11 11
12 12 import sys
13 13 from IPython.core import release
14 14
15 15 cl_usage = """\
16 16 =========
17 17 IPython
18 18 =========
19 19
20 20 Tools for Interactive Computing in Python
21 21 =========================================
22 22
23 23 A Python shell with automatic history (input and output), dynamic object
24 24 introspection, easier configuration, command completion, access to the
25 25 system shell and more. IPython can also be embedded in running programs.
26 26
27 27
28 28 Usage
29 29
30 30 ipython [subcommand] [options] [files]
31 31
32 32 If invoked with no options, it executes all the files listed in sequence
33 33 and exits, use -i to enter interactive mode after running the files. Files
34 34 ending in .py will be treated as normal Python, but files ending in .ipy
35 35 can contain special IPython syntax (magic commands, shell expansions, etc.)
36 36
37 37 Almost all configuration in IPython is available via the command-line. Do
38 38 `ipython --help-all` to see all available options. For persistent
39 39 configuration, look into your `ipython_config.py` configuration file for
40 40 details.
41 41
42 42 This file is typically installed in the `IPYTHON_DIR` directory, and there
43 43 is a separate configuration directory for each profile. The default profile
44 44 directory will be located in $IPYTHON_DIR/profile_default. For Linux users,
45 45 IPYTHON_DIR defaults to `$HOME/.config/ipython`, and for other Unix systems
46 46 to `$HOME/.ipython`. For Windows users, $HOME resolves to C:\\Documents
47 47 and Settings\\YourUserName in most instances.
48 48
49 49 To initialize a profile with the default configuration file, do::
50 50
51 51 $> ipython profile create
52 52
53 53 and start editing `IPYTHON_DIR/profile_default/ipython_config.py`
54 54
55 55 In IPython's documentation, we will refer to this directory as
56 56 `IPYTHON_DIR`, you can change its default location by creating an
57 57 environment variable with this name and setting it to the desired path.
58 58
59 59 For more information, see the manual available in HTML and PDF in your
60 60 installation, or online at http://ipython.org/documentation.html.
61 61 """
62 62
63 63 interactive_usage = """
64 64 IPython -- An enhanced Interactive Python
65 65 =========================================
66 66
67 67 IPython offers a combination of convenient shell features, special commands
68 68 and a history mechanism for both input (command history) and output (results
69 69 caching, similar to Mathematica). It is intended to be a fully compatible
70 70 replacement for the standard Python interpreter, while offering vastly
71 71 improved functionality and flexibility.
72 72
73 73 At your system command line, type 'ipython -h' to see the command line
74 74 options available. This document only describes interactive features.
75 75
76 76 MAIN FEATURES
77 77
78 78 * Access to the standard Python help. As of Python 2.1, a help system is
79 79 available with access to object docstrings and the Python manuals. Simply
80 80 type 'help' (no quotes) to access it.
81 81
82 82 * Magic commands: type %magic for information on the magic subsystem.
83 83
84 84 * System command aliases, via the %alias command or the configuration file(s).
85 85
86 86 * Dynamic object information:
87 87
88 88 Typing ?word or word? prints detailed information about an object. If
89 89 certain strings in the object are too long (docstrings, code, etc.) they get
90 90 snipped in the center for brevity.
91 91
92 92 Typing ??word or word?? gives access to the full information without
93 93 snipping long strings. Long strings are sent to the screen through the less
94 94 pager if longer than the screen, printed otherwise.
95 95
96 96 The ?/?? system gives access to the full source code for any object (if
97 97 available), shows function prototypes and other useful information.
98 98
99 99 If you just want to see an object's docstring, type '%pdoc object' (without
100 100 quotes, and without % if you have automagic on).
101 101
102 102 Both %pdoc and ?/?? give you access to documentation even on things which are
103 103 not explicitely defined. Try for example typing {}.get? or after import os,
104 104 type os.path.abspath??. The magic functions %pdef, %source and %file operate
105 105 similarly.
106 106
107 107 * Completion in the local namespace, by typing TAB at the prompt.
108 108
109 109 At any time, hitting tab will complete any available python commands or
110 110 variable names, and show you a list of the possible completions if there's
111 111 no unambiguous one. It will also complete filenames in the current directory.
112 112
113 113 This feature requires the readline and rlcomplete modules, so it won't work
114 114 if your Python lacks readline support (such as under Windows).
115 115
116 116 * Search previous command history in two ways (also requires readline):
117 117
118 118 - Start typing, and then use Ctrl-p (previous,up) and Ctrl-n (next,down) to
119 119 search through only the history items that match what you've typed so
120 120 far. If you use Ctrl-p/Ctrl-n at a blank prompt, they just behave like
121 121 normal arrow keys.
122 122
123 123 - Hit Ctrl-r: opens a search prompt. Begin typing and the system searches
124 124 your history for lines that match what you've typed so far, completing as
125 125 much as it can.
126 126
127 127 - %hist: search history by index (this does *not* require readline).
128 128
129 129 * Persistent command history across sessions.
130 130
131 131 * Logging of input with the ability to save and restore a working session.
132 132
133 133 * System escape with !. Typing !ls will run 'ls' in the current directory.
134 134
135 135 * The reload command does a 'deep' reload of a module: changes made to the
136 136 module since you imported will actually be available without having to exit.
137 137
138 138 * Verbose and colored exception traceback printouts. See the magic xmode and
139 139 xcolor functions for details (just type %magic).
140 140
141 141 * Input caching system:
142 142
143 143 IPython offers numbered prompts (In/Out) with input and output caching. All
144 144 input is saved and can be retrieved as variables (besides the usual arrow
145 145 key recall).
146 146
147 147 The following GLOBAL variables always exist (so don't overwrite them!):
148 148 _i: stores previous input.
149 149 _ii: next previous.
150 150 _iii: next-next previous.
151 151 _ih : a list of all input _ih[n] is the input from line n.
152 152
153 153 Additionally, global variables named _i<n> are dynamically created (<n>
154 154 being the prompt counter), such that _i<n> == _ih[<n>]
155 155
156 156 For example, what you typed at prompt 14 is available as _i14 and _ih[14].
157 157
158 158 You can create macros which contain multiple input lines from this history,
159 159 for later re-execution, with the %macro function.
160 160
161 161 The history function %hist allows you to see any part of your input history
162 162 by printing a range of the _i variables. Note that inputs which contain
163 163 magic functions (%) appear in the history with a prepended comment. This is
164 164 because they aren't really valid Python code, so you can't exec them.
165 165
166 166 * Output caching system:
167 167
168 168 For output that is returned from actions, a system similar to the input
169 169 cache exists but using _ instead of _i. Only actions that produce a result
170 170 (NOT assignments, for example) are cached. If you are familiar with
171 171 Mathematica, IPython's _ variables behave exactly like Mathematica's %
172 172 variables.
173 173
174 174 The following GLOBAL variables always exist (so don't overwrite them!):
175 175 _ (one underscore): previous output.
176 176 __ (two underscores): next previous.
177 177 ___ (three underscores): next-next previous.
178 178
179 179 Global variables named _<n> are dynamically created (<n> being the prompt
180 180 counter), such that the result of output <n> is always available as _<n>.
181 181
182 182 Finally, a global dictionary named _oh exists with entries for all lines
183 183 which generated output.
184 184
185 185 * Directory history:
186 186
187 187 Your history of visited directories is kept in the global list _dh, and the
188 188 magic %cd command can be used to go to any entry in that list.
189 189
190 190 * Auto-parentheses and auto-quotes (adapted from Nathan Gray's LazyPython)
191 191
192 192 1. Auto-parentheses
193 193 Callable objects (i.e. functions, methods, etc) can be invoked like
194 194 this (notice the commas between the arguments):
195 195 >>> callable_ob arg1, arg2, arg3
196 196 and the input will be translated to this:
197 197 --> callable_ob(arg1, arg2, arg3)
198 198 You can force auto-parentheses by using '/' as the first character
199 199 of a line. For example:
200 200 >>> /globals # becomes 'globals()'
201 201 Note that the '/' MUST be the first character on the line! This
202 202 won't work:
203 203 >>> print /globals # syntax error
204 204
205 205 In most cases the automatic algorithm should work, so you should
206 206 rarely need to explicitly invoke /. One notable exception is if you
207 207 are trying to call a function with a list of tuples as arguments (the
208 208 parenthesis will confuse IPython):
209 209 In [1]: zip (1,2,3),(4,5,6) # won't work
210 210 but this will work:
211 211 In [2]: /zip (1,2,3),(4,5,6)
212 212 ------> zip ((1,2,3),(4,5,6))
213 213 Out[2]= [(1, 4), (2, 5), (3, 6)]
214 214
215 215 IPython tells you that it has altered your command line by
216 216 displaying the new command line preceded by -->. e.g.:
217 217 In [18]: callable list
218 218 -------> callable (list)
219 219
220 220 2. Auto-Quoting
221 221 You can force auto-quoting of a function's arguments by using ',' as
222 222 the first character of a line. For example:
223 223 >>> ,my_function /home/me # becomes my_function("/home/me")
224 224
225 225 If you use ';' instead, the whole argument is quoted as a single
226 226 string (while ',' splits on whitespace):
227 227 >>> ,my_function a b c # becomes my_function("a","b","c")
228 228 >>> ;my_function a b c # becomes my_function("a b c")
229 229
230 230 Note that the ',' MUST be the first character on the line! This
231 231 won't work:
232 232 >>> x = ,my_function /home/me # syntax error
233 233 """
234 234
235 235 interactive_usage_min = """\
236 236 An enhanced console for Python.
237 237 Some of its features are:
238 238 - Readline support if the readline library is present.
239 239 - Tab completion in the local namespace.
240 240 - Logging of input, see command-line options.
241 241 - System shell escape via ! , eg !ls.
242 242 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
243 243 - Keeps track of locally defined variables via %who, %whos.
244 244 - Show object information with a ? eg ?x or x? (use ?? for more info).
245 245 """
246 246
247 247 quick_reference = r"""
248 248 IPython -- An enhanced Interactive Python - Quick Reference Card
249 249 ================================================================
250 250
251 251 obj?, obj?? : Get help, or more help for object (also works as
252 252 ?obj, ??obj).
253 253 ?foo.*abc* : List names in 'foo' containing 'abc' in them.
254 254 %magic : Information about IPython's 'magic' % functions.
255 255
256 256 Magic functions are prefixed by %, and typically take their arguments without
257 257 parentheses, quotes or even commas for convenience.
258 258
259 259 Example magic function calls:
260 260
261 261 %alias d ls -F : 'd' is now an alias for 'ls -F'
262 262 alias d ls -F : Works if 'alias' not a python name
263 263 alist = %alias : Get list of aliases to 'alist'
264 264 cd /usr/share : Obvious. cd -<tab> to choose from visited dirs.
265 265 %cd?? : See help AND source for magic %cd
266 266
267 267 System commands:
268 268
269 269 !cp a.txt b/ : System command escape, calls os.system()
270 270 cp a.txt b/ : after %rehashx, most system commands work without !
271 271 cp ${f}.txt $bar : Variable expansion in magics and system commands
272 272 files = !ls /usr : Capture sytem command output
273 273 files.s, files.l, files.n: "a b c", ['a','b','c'], 'a\nb\nc'
274 274
275 275 History:
276 276
277 277 _i, _ii, _iii : Previous, next previous, next next previous input
278 278 _i4, _ih[2:5] : Input history line 4, lines 2-4
279 279 exec _i81 : Execute input history line #81 again
280 280 %rep 81 : Edit input history line #81
281 281 _, __, ___ : previous, next previous, next next previous output
282 282 _dh : Directory history
283 283 _oh : Output history
284 284 %hist : Command history. '%hist -g foo' search history for 'foo'
285 285
286 286 Autocall:
287 287
288 288 f 1,2 : f(1,2)
289 289 /f 1,2 : f(1,2) (forced autoparen)
290 290 ,f 1 2 : f("1","2")
291 291 ;f 1 2 : f("1 2")
292 292
293 293 Remember: TAB completion works in many contexts, not just file names
294 294 or python names.
295 295
296 296 The following magic functions are currently available:
297 297
298 298 """
299 299
300 300 gui_reference = """\
301 301 ===============================
302 302 The graphical IPython console
303 303 ===============================
304 304
305 305 This console is designed to emulate the look, feel and workflow of a terminal
306 306 environment, while adding a number of enhancements that are simply not possible
307 307 in a real terminal, such as inline syntax highlighting, true multiline editing,
308 308 inline graphics and much more.
309 309
310 310 This quick reference document contains the basic information you'll need to
311 311 know to make the most efficient use of it. For the various command line
312 312 options available at startup, type ``ipython qtconsole --help`` at the command line.
313 313
314 314
315 315 Multiline editing
316 316 =================
317 317
318 318 The graphical console is capable of true multiline editing, but it also tries
319 319 to behave intuitively like a terminal when possible. If you are used to
320 320 IPyhton's old terminal behavior, you should find the transition painless, and
321 321 once you learn a few basic keybindings it will be a much more efficient
322 322 environment.
323 323
324 324 For single expressions or indented blocks, the console behaves almost like the
325 325 terminal IPython: single expressions are immediately evaluated, and indented
326 326 blocks are evaluated once a single blank line is entered::
327 327
328 328 In [1]: print "Hello IPython!" # Enter was pressed at the end of the line
329 329 Hello IPython!
330 330
331 331 In [2]: for i in range(10):
332 332 ...: print i,
333 333 ...:
334 334 0 1 2 3 4 5 6 7 8 9
335 335
336 336 If you want to enter more than one expression in a single input block
337 337 (something not possible in the terminal), you can use ``Control-Enter`` at the
338 338 end of your first line instead of ``Enter``. At that point the console goes
339 339 into 'cell mode' and even if your inputs are not indented, it will continue
340 340 accepting arbitrarily many lines until either you enter an extra blank line or
341 341 you hit ``Shift-Enter`` (the key binding that forces execution). When a
342 342 multiline cell is entered, IPython analyzes it and executes its code producing
343 343 an ``Out[n]`` prompt only for the last expression in it, while the rest of the
344 344 cell is executed as if it was a script. An example should clarify this::
345 345
346 346 In [3]: x=1 # Hit C-Enter here
347 347 ...: y=2 # from now on, regular Enter is sufficient
348 348 ...: z=3
349 349 ...: x**2 # This does *not* produce an Out[] value
350 350 ...: x+y+z # Only the last expression does
351 351 ...:
352 352 Out[3]: 6
353 353
354 354 The behavior where an extra blank line forces execution is only active if you
355 355 are actually typing at the keyboard each line, and is meant to make it mimic
356 356 the IPython terminal behavior. If you paste a long chunk of input (for example
357 357 a long script copied form an editor or web browser), it can contain arbitrarily
358 358 many intermediate blank lines and they won't cause any problems. As always,
359 359 you can then make it execute by appending a blank line *at the end* or hitting
360 360 ``Shift-Enter`` anywhere within the cell.
361 361
362 362 With the up arrow key, you can retrieve previous blocks of input that contain
363 363 multiple lines. You can move inside of a multiline cell like you would in any
364 364 text editor. When you want it executed, the simplest thing to do is to hit the
365 365 force execution key, ``Shift-Enter`` (though you can also navigate to the end
366 366 and append a blank line by using ``Enter`` twice).
367 367
368 368 If you've edited a multiline cell and accidentally navigate out of it with the
369 369 up or down arrow keys, IPython will clear the cell and replace it with the
370 370 contents of the one above or below that you navigated to. If this was an
371 371 accident and you want to retrieve the cell you were editing, use the Undo
372 372 keybinding, ``Control-z``.
373 373
374 374
375 375 Key bindings
376 376 ============
377 377
378 378 The IPython console supports most of the basic Emacs line-oriented keybindings,
379 379 in addition to some of its own.
380 380
381 381 The keybinding prefixes mean:
382 382
383 383 - ``C``: Control
384 384 - ``S``: Shift
385 385 - ``M``: Meta (typically the Alt key)
386 386
387 387 The keybindings themselves are:
388 388
389 389 - ``Enter``: insert new line (may cause execution, see above).
390 390 - ``C-Enter``: *force* new line, *never* causes execution.
391 391 - ``S-Enter``: *force* execution regardless of where cursor is, no newline added.
392 392 - ``Up``: step backwards through the history.
393 393 - ``Down``: step forwards through the history.
394 394 - ``S-Up``: search backwards through the history (like ``C-r`` in bash).
395 395 - ``S-Down``: search forwards through the history.
396 396 - ``C-c``: copy highlighted text to clipboard (prompts are automatically stripped).
397 397 - ``C-S-c``: copy highlighted text to clipboard (prompts are not stripped).
398 398 - ``C-v``: paste text from clipboard.
399 399 - ``C-z``: undo (retrieves lost text if you move out of a cell with the arrows).
400 400 - ``C-S-z``: redo.
401 401 - ``C-o``: move to 'other' area, between pager and terminal.
402 402 - ``C-l``: clear terminal.
403 403 - ``C-a``: go to beginning of line.
404 404 - ``C-e``: go to end of line.
405 405 - ``C-k``: kill from cursor to the end of the line.
406 406 - ``C-y``: yank (paste)
407 407 - ``C-p``: previous line (like up arrow)
408 408 - ``C-n``: next line (like down arrow)
409 409 - ``C-f``: forward (like right arrow)
410 410 - ``C-b``: back (like left arrow)
411 411 - ``C-d``: delete next character.
412 412 - ``M-<``: move to the beginning of the input region.
413 413 - ``M->``: move to the end of the input region.
414 414 - ``M-d``: delete next word.
415 415 - ``M-Backspace``: delete previous word.
416 416 - ``C-.``: force a kernel restart (a confirmation dialog appears).
417 417 - ``C-+``: increase font size.
418 418 - ``C--``: decrease font size.
419 - ``C-M-Space``: toggle full screen. (Command-Control-Space on Mac OS X)
419 420
420 421 The IPython pager
421 422 =================
422 423
423 424 IPython will show long blocks of text from many sources using a builtin pager.
424 425 You can control where this pager appears with the ``--paging`` command-line
425 426 flag:
426 427
427 428 - ``inside`` [default]: the pager is overlaid on top of the main terminal. You
428 429 must quit the pager to get back to the terminal (similar to how a pager such
429 430 as ``less`` or ``more`` works).
430 431
431 432 - ``vsplit``: the console is made double-tall, and the pager appears on the
432 433 bottom area when needed. You can view its contents while using the terminal.
433 434
434 435 - ``hsplit``: the console is made double-wide, and the pager appears on the
435 436 right area when needed. You can view its contents while using the terminal.
436 437
437 438 - ``none``: the console never pages output.
438 439
439 440 If you use the vertical or horizontal paging modes, you can navigate between
440 441 terminal and pager as follows:
441 442
442 443 - Tab key: goes from pager to terminal (but not the other way around).
443 444 - Control-o: goes from one to another always.
444 445 - Mouse: click on either.
445 446
446 447 In all cases, the ``q`` or ``Escape`` keys quit the pager (when used with the
447 448 focus on the pager area).
448 449
449 450 Running subprocesses
450 451 ====================
451 452
452 453 The graphical IPython console uses the ``pexpect`` module to run subprocesses
453 454 when you type ``!command``. This has a number of advantages (true asynchronous
454 455 output from subprocesses as well as very robust termination of rogue
455 456 subprocesses with ``Control-C``), as well as some limitations. The main
456 457 limitation is that you can *not* interact back with the subprocess, so anything
457 458 that invokes a pager or expects you to type input into it will block and hang
458 459 (you can kill it with ``Control-C``).
459 460
460 461 We have provided as magics ``%less`` to page files (aliased to ``%more``),
461 462 ``%clear`` to clear the terminal, and ``%man`` on Linux/OSX. These cover the
462 463 most common commands you'd want to call in your subshell and that would cause
463 464 problems if invoked via ``!cmd``, but you need to be aware of this limitation.
464 465
465 466 Display
466 467 =======
467 468
468 469 The IPython console can now display objects in a variety of formats, including
469 470 HTML, PNG and SVG. This is accomplished using the display functions in
470 471 ``IPython.core.display``::
471 472
472 473 In [4]: from IPython.core.display import display, display_html
473 474
474 475 In [5]: from IPython.core.display import display_png, display_svg
475 476
476 477 Python objects can simply be passed to these functions and the appropriate
477 478 representations will be displayed in the console as long as the objects know
478 479 how to compute those representations. The easiest way of teaching objects how
479 480 to format themselves in various representations is to define special methods
480 481 such as: ``_repr_html_``, ``_repr_svg_`` and ``_repr_png_``. IPython's display formatters
481 482 can also be given custom formatter functions for various types::
482 483
483 484 In [6]: ip = get_ipython()
484 485
485 486 In [7]: html_formatter = ip.display_formatter.formatters['text/html']
486 487
487 488 In [8]: html_formatter.for_type(Foo, foo_to_html)
488 489
489 490 For further details, see ``IPython.core.formatters``.
490 491
491 492 Inline matplotlib graphics
492 493 ==========================
493 494
494 495 The IPython console is capable of displaying matplotlib figures inline, in SVG
495 496 or PNG format. If started with the ``pylab=inline``, then all figures are
496 497 rendered inline automatically (PNG by default). If started with ``--pylab``
497 498 or ``pylab=<your backend>``, then a GUI backend will be used, but IPython's
498 499 ``display()`` and ``getfigs()`` functions can be used to view plots inline::
499 500
500 501 In [9]: display(*getfigs()) # display all figures inline
501 502
502 503 In[10]: display(*getfigs(1,2)) # display figures 1 and 2 inline
503 504 """
504 505
505 506
506 507 quick_guide = """\
507 508 ? -> Introduction and overview of IPython's features.
508 509 %quickref -> Quick reference.
509 510 help -> Python's own help system.
510 511 object? -> Details about 'object', use 'object??' for extra details.
511 512 """
512 513
513 514 gui_note = """\
514 515 %guiref -> A brief reference about the graphical user interface.
515 516 """
516 517
517 518 default_banner_parts = [
518 519 'Python %s\n' % (sys.version.split('\n')[0],),
519 520 'Type "copyright", "credits" or "license" for more information.\n\n',
520 521 'IPython %s -- An enhanced Interactive Python.\n' % (release.version,),
521 522 quick_guide
522 523 ]
523 524
524 525 default_gui_banner_parts = default_banner_parts + [gui_note]
525 526
526 527 default_banner = ''.join(default_banner_parts)
527 528
528 529 default_gui_banner = ''.join(default_gui_banner_parts)
@@ -1,484 +1,497 b''
1 1 """ A minimal application using the Qt console-style IPython frontend.
2 2
3 3 This is not a complete console app, as subprocess will not be able to receive
4 4 input, there is no real readline support, among other limitations.
5 5
6 6 Authors:
7 7
8 8 * Evan Patterson
9 9 * Min RK
10 10 * Erik Tollerud
11 11 * Fernando Perez
12 12
13 13 """
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Imports
17 17 #-----------------------------------------------------------------------------
18 18
19 19 # stdlib imports
20 20 import os
21 21 import signal
22 22 import sys
23 23 from getpass import getpass
24 24
25 25 # System library imports
26 26 from IPython.external.qt import QtGui
27 27 from pygments.styles import get_all_styles
28 28
29 29 # external imports
30 30 from IPython.external.ssh import tunnel
31 31
32 32 # Local imports
33 33 from IPython.config.application import boolean_flag
34 34 from IPython.core.application import BaseIPythonApplication
35 35 from IPython.core.profiledir import ProfileDir
36 36 from IPython.frontend.qt.console.frontend_widget import FrontendWidget
37 37 from IPython.frontend.qt.console.ipython_widget import IPythonWidget
38 38 from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
39 39 from IPython.frontend.qt.console import styles
40 40 from IPython.frontend.qt.kernelmanager import QtKernelManager
41 41 from IPython.parallel.util import select_random_ports
42 42 from IPython.utils.traitlets import (
43 43 Dict, List, Unicode, Int, CaselessStrEnum, CBool, Any
44 44 )
45 45 from IPython.zmq.ipkernel import (
46 46 flags as ipkernel_flags,
47 47 aliases as ipkernel_aliases,
48 48 IPKernelApp
49 49 )
50 50 from IPython.zmq.session import Session
51 51 from IPython.zmq.zmqshell import ZMQInteractiveShell
52 52
53 53
54 54 #-----------------------------------------------------------------------------
55 55 # Network Constants
56 56 #-----------------------------------------------------------------------------
57 57
58 58 from IPython.utils.localinterfaces import LOCALHOST, LOCAL_IPS
59 59
60 60 #-----------------------------------------------------------------------------
61 61 # Globals
62 62 #-----------------------------------------------------------------------------
63 63
64 64 _examples = """
65 65 ipython qtconsole # start the qtconsole
66 66 ipython qtconsole --pylab=inline # start with pylab in inline plotting mode
67 67 """
68 68
69 69 #-----------------------------------------------------------------------------
70 70 # Classes
71 71 #-----------------------------------------------------------------------------
72 72
73 73 class MainWindow(QtGui.QMainWindow):
74 74
75 75 #---------------------------------------------------------------------------
76 76 # 'object' interface
77 77 #---------------------------------------------------------------------------
78 78
79 79 def __init__(self, app, frontend, existing=False, may_close=True,
80 80 confirm_exit=True):
81 81 """ Create a MainWindow for the specified FrontendWidget.
82 82
83 83 The app is passed as an argument to allow for different
84 84 closing behavior depending on whether we are the Kernel's parent.
85 85
86 86 If existing is True, then this Console does not own the Kernel.
87 87
88 88 If may_close is True, then this Console is permitted to close the kernel
89 89 """
90 90 super(MainWindow, self).__init__()
91 91 self._app = app
92 92 self._frontend = frontend
93 93 self._existing = existing
94 94 if existing:
95 95 self._may_close = may_close
96 96 else:
97 97 self._may_close = True
98 98 self._frontend.exit_requested.connect(self.close)
99 99 self._confirm_exit = confirm_exit
100 100 self.setCentralWidget(frontend)
101
101
102 102 #---------------------------------------------------------------------------
103 103 # QWidget interface
104 104 #---------------------------------------------------------------------------
105 105
106 106 def closeEvent(self, event):
107 107 """ Close the window and the kernel (if necessary).
108 108
109 109 This will prompt the user if they are finished with the kernel, and if
110 110 so, closes the kernel cleanly. Alternatively, if the exit magic is used,
111 111 it closes without prompt.
112 112 """
113 113 keepkernel = None #Use the prompt by default
114 114 if hasattr(self._frontend,'_keep_kernel_on_exit'): #set by exit magic
115 115 keepkernel = self._frontend._keep_kernel_on_exit
116 116
117 117 kernel_manager = self._frontend.kernel_manager
118 118
119 119 if keepkernel is None and not self._confirm_exit:
120 120 # don't prompt, just terminate the kernel if we own it
121 121 # or leave it alone if we don't
122 122 keepkernel = not self._existing
123 123
124 124 if keepkernel is None: #show prompt
125 125 if kernel_manager and kernel_manager.channels_running:
126 126 title = self.window().windowTitle()
127 127 cancel = QtGui.QMessageBox.Cancel
128 128 okay = QtGui.QMessageBox.Ok
129 129 if self._may_close:
130 130 msg = "You are closing this Console window."
131 131 info = "Would you like to quit the Kernel and all attached Consoles as well?"
132 132 justthis = QtGui.QPushButton("&No, just this Console", self)
133 133 justthis.setShortcut('N')
134 134 closeall = QtGui.QPushButton("&Yes, quit everything", self)
135 135 closeall.setShortcut('Y')
136 136 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
137 137 title, msg)
138 138 box.setInformativeText(info)
139 139 box.addButton(cancel)
140 140 box.addButton(justthis, QtGui.QMessageBox.NoRole)
141 141 box.addButton(closeall, QtGui.QMessageBox.YesRole)
142 142 box.setDefaultButton(closeall)
143 143 box.setEscapeButton(cancel)
144 144 reply = box.exec_()
145 145 if reply == 1: # close All
146 146 kernel_manager.shutdown_kernel()
147 147 #kernel_manager.stop_channels()
148 148 event.accept()
149 149 elif reply == 0: # close Console
150 150 if not self._existing:
151 151 # Have kernel: don't quit, just close the window
152 152 self._app.setQuitOnLastWindowClosed(False)
153 153 self.deleteLater()
154 154 event.accept()
155 155 else:
156 156 event.ignore()
157 157 else:
158 158 reply = QtGui.QMessageBox.question(self, title,
159 159 "Are you sure you want to close this Console?"+
160 160 "\nThe Kernel and other Consoles will remain active.",
161 161 okay|cancel,
162 162 defaultButton=okay
163 163 )
164 164 if reply == okay:
165 165 event.accept()
166 166 else:
167 167 event.ignore()
168 168 elif keepkernel: #close console but leave kernel running (no prompt)
169 169 if kernel_manager and kernel_manager.channels_running:
170 170 if not self._existing:
171 171 # I have the kernel: don't quit, just close the window
172 172 self._app.setQuitOnLastWindowClosed(False)
173 173 event.accept()
174 174 else: #close console and kernel (no prompt)
175 175 if kernel_manager and kernel_manager.channels_running:
176 176 kernel_manager.shutdown_kernel()
177 177 event.accept()
178 178
179 179 #-----------------------------------------------------------------------------
180 180 # Aliases and Flags
181 181 #-----------------------------------------------------------------------------
182 182
183 183 flags = dict(ipkernel_flags)
184 184 qt_flags = {
185 185 'existing' : ({'IPythonQtConsoleApp' : {'existing' : True}},
186 186 "Connect to an existing kernel."),
187 187 'pure' : ({'IPythonQtConsoleApp' : {'pure' : True}},
188 188 "Use a pure Python kernel instead of an IPython kernel."),
189 189 'plain' : ({'ConsoleWidget' : {'kind' : 'plain'}},
190 190 "Disable rich text support."),
191 191 }
192 192 qt_flags.update(boolean_flag(
193 193 'gui-completion', 'ConsoleWidget.gui_completion',
194 194 "use a GUI widget for tab completion",
195 195 "use plaintext output for completion"
196 196 ))
197 197 qt_flags.update(boolean_flag(
198 198 'confirm-exit', 'IPythonQtConsoleApp.confirm_exit',
199 199 """Set to display confirmation dialog on exit. You can always use 'exit' or 'quit',
200 200 to force a direct exit without any confirmation.
201 201 """,
202 202 """Don't prompt the user when exiting. This will terminate the kernel
203 203 if it is owned by the frontend, and leave it alive if it is external.
204 204 """
205 205 ))
206 206 flags.update(qt_flags)
207 207 # the flags that are specific to the frontend
208 208 # these must be scrubbed before being passed to the kernel,
209 209 # or it will raise an error on unrecognized flags
210 210 qt_flags = qt_flags.keys()
211 211
212 212 aliases = dict(ipkernel_aliases)
213 213
214 214 qt_aliases = dict(
215 215 hb = 'IPythonQtConsoleApp.hb_port',
216 216 shell = 'IPythonQtConsoleApp.shell_port',
217 217 iopub = 'IPythonQtConsoleApp.iopub_port',
218 218 stdin = 'IPythonQtConsoleApp.stdin_port',
219 219 ip = 'IPythonQtConsoleApp.ip',
220 220
221 221 style = 'IPythonWidget.syntax_style',
222 222 stylesheet = 'IPythonQtConsoleApp.stylesheet',
223 223 colors = 'ZMQInteractiveShell.colors',
224 224
225 225 editor = 'IPythonWidget.editor',
226 226 paging = 'ConsoleWidget.paging',
227 227 ssh = 'IPythonQtConsoleApp.sshserver',
228 228 )
229 229 aliases.update(qt_aliases)
230 230 # also scrub aliases from the frontend
231 231 qt_flags.extend(qt_aliases.keys())
232 232
233 233
234 234 #-----------------------------------------------------------------------------
235 235 # IPythonQtConsole
236 236 #-----------------------------------------------------------------------------
237 237
238 238
239 239 class IPythonQtConsoleApp(BaseIPythonApplication):
240 240 name = 'ipython-qtconsole'
241 241 default_config_file_name='ipython_config.py'
242 242
243 243 description = """
244 244 The IPython QtConsole.
245 245
246 246 This launches a Console-style application using Qt. It is not a full
247 247 console, in that launched terminal subprocesses will not be able to accept
248 248 input.
249 249
250 250 The QtConsole supports various extra features beyond the Terminal IPython
251 251 shell, such as inline plotting with matplotlib, via:
252 252
253 253 ipython qtconsole --pylab=inline
254 254
255 255 as well as saving your session as HTML, and printing the output.
256 256
257 257 """
258 258 examples = _examples
259 259
260 260 classes = [IPKernelApp, IPythonWidget, ZMQInteractiveShell, ProfileDir, Session]
261 261 flags = Dict(flags)
262 262 aliases = Dict(aliases)
263 263
264 264 kernel_argv = List(Unicode)
265 265
266 266 # create requested profiles by default, if they don't exist:
267 267 auto_create = CBool(True)
268 268 # connection info:
269 269 ip = Unicode(LOCALHOST, config=True,
270 270 help="""Set the kernel\'s IP address [default localhost].
271 271 If the IP address is something other than localhost, then
272 272 Consoles on other machines will be able to connect
273 273 to the Kernel, so be careful!"""
274 274 )
275 275
276 276 sshserver = Unicode('', config=True,
277 277 help="""The SSH server to use to connect to the kernel.""")
278 278 sshkey = Unicode('', config=True,
279 279 help="""Path to the ssh key to use for logging in to the ssh server.""")
280 280
281 281 hb_port = Int(0, config=True,
282 282 help="set the heartbeat port [default: random]")
283 283 shell_port = Int(0, config=True,
284 284 help="set the shell (XREP) port [default: random]")
285 285 iopub_port = Int(0, config=True,
286 286 help="set the iopub (PUB) port [default: random]")
287 287 stdin_port = Int(0, config=True,
288 288 help="set the stdin (XREQ) port [default: random]")
289 289
290 290 existing = CBool(False, config=True,
291 291 help="Whether to connect to an already running Kernel.")
292 292
293 293 stylesheet = Unicode('', config=True,
294 294 help="path to a custom CSS stylesheet")
295 295
296 296 pure = CBool(False, config=True,
297 297 help="Use a pure Python kernel instead of an IPython kernel.")
298 298 plain = CBool(False, config=True,
299 299 help="Use a plaintext widget instead of rich text (plain can't print/save).")
300 300
301 301 def _pure_changed(self, name, old, new):
302 302 kind = 'plain' if self.plain else 'rich'
303 303 self.config.ConsoleWidget.kind = kind
304 304 if self.pure:
305 305 self.widget_factory = FrontendWidget
306 306 elif self.plain:
307 307 self.widget_factory = IPythonWidget
308 308 else:
309 309 self.widget_factory = RichIPythonWidget
310 310
311 311 _plain_changed = _pure_changed
312 312
313 313 confirm_exit = CBool(True, config=True,
314 314 help="""
315 315 Set to display confirmation dialog on exit. You can always use 'exit' or 'quit',
316 316 to force a direct exit without any confirmation.""",
317 317 )
318 318
319 319 # the factory for creating a widget
320 320 widget_factory = Any(RichIPythonWidget)
321 321
322 322 def parse_command_line(self, argv=None):
323 323 super(IPythonQtConsoleApp, self).parse_command_line(argv)
324 324 if argv is None:
325 325 argv = sys.argv[1:]
326 326
327 327 self.kernel_argv = list(argv) # copy
328 328 # kernel should inherit default config file from frontend
329 329 self.kernel_argv.append("--KernelApp.parent_appname='%s'"%self.name)
330 330 # scrub frontend-specific flags
331 331 for a in argv:
332 332
333 333 if a.startswith('-'):
334 334 key = a.lstrip('-').split('=')[0]
335 335 if key in qt_flags:
336 336 self.kernel_argv.remove(a)
337 337
338 338 def init_ssh(self):
339 339 """set up ssh tunnels, if needed."""
340 340 if not self.sshserver and not self.sshkey:
341 341 return
342 342
343 343 if self.sshkey and not self.sshserver:
344 344 self.sshserver = self.ip
345 345 self.ip=LOCALHOST
346 346
347 347 lports = select_random_ports(4)
348 348 rports = self.shell_port, self.iopub_port, self.stdin_port, self.hb_port
349 349 self.shell_port, self.iopub_port, self.stdin_port, self.hb_port = lports
350 350
351 351 remote_ip = self.ip
352 352 self.ip = LOCALHOST
353 353 self.log.info("Forwarding connections to %s via %s"%(remote_ip, self.sshserver))
354 354
355 355 if tunnel.try_passwordless_ssh(self.sshserver, self.sshkey):
356 356 password=False
357 357 else:
358 358 password = getpass("SSH Password for %s: "%self.sshserver)
359 359
360 360 for lp,rp in zip(lports, rports):
361 361 tunnel.ssh_tunnel(lp, rp, self.sshserver, remote_ip, self.sshkey, password)
362 362
363 363 def init_kernel_manager(self):
364 364 # Don't let Qt or ZMQ swallow KeyboardInterupts.
365 365 signal.signal(signal.SIGINT, signal.SIG_DFL)
366 366
367 367 # Create a KernelManager and start a kernel.
368 368 self.kernel_manager = QtKernelManager(
369 369 shell_address=(self.ip, self.shell_port),
370 370 sub_address=(self.ip, self.iopub_port),
371 371 stdin_address=(self.ip, self.stdin_port),
372 372 hb_address=(self.ip, self.hb_port),
373 373 config=self.config
374 374 )
375 375 # start the kernel
376 376 if not self.existing:
377 377 kwargs = dict(ip=self.ip, ipython=not self.pure)
378 378 kwargs['extra_arguments'] = self.kernel_argv
379 379 self.kernel_manager.start_kernel(**kwargs)
380 380 self.kernel_manager.start_channels()
381 381
382 382
383 383 def init_qt_elements(self):
384 384 # Create the widget.
385 385 self.app = QtGui.QApplication([])
386 386 local_kernel = (not self.existing) or self.ip in LOCAL_IPS
387 387 self.widget = self.widget_factory(config=self.config,
388 388 local_kernel=local_kernel)
389 389 self.widget.kernel_manager = self.kernel_manager
390 390 self.window = MainWindow(self.app, self.widget, self.existing,
391 391 may_close=local_kernel,
392 392 confirm_exit=self.confirm_exit)
393 393 self.window.setWindowTitle('Python' if self.pure else 'IPython')
394 394
395 395 def init_colors(self):
396 396 """Configure the coloring of the widget"""
397 397 # Note: This will be dramatically simplified when colors
398 398 # are removed from the backend.
399 399
400 400 if self.pure:
401 401 # only IPythonWidget supports styling
402 402 return
403 403
404 404 # parse the colors arg down to current known labels
405 405 try:
406 406 colors = self.config.ZMQInteractiveShell.colors
407 407 except AttributeError:
408 408 colors = None
409 409 try:
410 410 style = self.config.IPythonWidget.colors
411 411 except AttributeError:
412 412 style = None
413 413
414 414 # find the value for colors:
415 415 if colors:
416 416 colors=colors.lower()
417 417 if colors in ('lightbg', 'light'):
418 418 colors='lightbg'
419 419 elif colors in ('dark', 'linux'):
420 420 colors='linux'
421 421 else:
422 422 colors='nocolor'
423 423 elif style:
424 424 if style=='bw':
425 425 colors='nocolor'
426 426 elif styles.dark_style(style):
427 427 colors='linux'
428 428 else:
429 429 colors='lightbg'
430 430 else:
431 431 colors=None
432 432
433 433 # Configure the style.
434 434 widget = self.widget
435 435 if style:
436 436 widget.style_sheet = styles.sheet_from_template(style, colors)
437 437 widget.syntax_style = style
438 438 widget._syntax_style_changed()
439 439 widget._style_sheet_changed()
440 440 elif colors:
441 441 # use a default style
442 442 widget.set_default_style(colors=colors)
443 443 else:
444 444 # this is redundant for now, but allows the widget's
445 445 # defaults to change
446 446 widget.set_default_style()
447 447
448 448 if self.stylesheet:
449 449 # we got an expicit stylesheet
450 450 if os.path.isfile(self.stylesheet):
451 451 with open(self.stylesheet) as f:
452 452 sheet = f.read()
453 453 widget.style_sheet = sheet
454 454 widget._style_sheet_changed()
455 455 else:
456 456 raise IOError("Stylesheet %r not found."%self.stylesheet)
457 457
458 458 def initialize(self, argv=None):
459 459 super(IPythonQtConsoleApp, self).initialize(argv)
460 460 self.init_ssh()
461 461 self.init_kernel_manager()
462 462 self.init_qt_elements()
463 463 self.init_colors()
464 self.init_window_shortcut()
465
466 def init_window_shortcut(self):
467 fullScreenAction = QtGui.QAction('Toggle Full Screen', self.window)
468 fullScreenAction.setShortcut('Ctrl+Meta+Space')
469 fullScreenAction.triggered.connect(self.toggleFullScreen)
470 self.window.addAction(fullScreenAction)
471
472 def toggleFullScreen(self):
473 if not self.window.isFullScreen():
474 self.window.showFullScreen()
475 else:
476 self.window.showNormal()
464 477
465 478 def start(self):
466 479
467 480 # draw the window
468 481 self.window.show()
469 482
470 483 # Start the application main loop.
471 484 self.app.exec_()
472 485
473 486 #-----------------------------------------------------------------------------
474 487 # Main entry point
475 488 #-----------------------------------------------------------------------------
476 489
477 490 def main():
478 491 app = IPythonQtConsoleApp()
479 492 app.initialize()
480 493 app.start()
481 494
482 495
483 496 if __name__ == '__main__':
484 497 main()
General Comments 0
You need to be logged in to leave comments. Login now