Недавно я обнаружил auto-completetion в pinteron interperter: https://docs.python.org/2.7/tutorial/interactive.html. Это потрясающе для ускорения тестов, которые я делаю в интерактивном интерпретаторе. Есть две вещи, которые завершают, и это полезно.
Если я просто поставлю C+f: complete
в моем.inputrc (или используйте readline без rlcompleter), когда я нажимаю Ctl + f, я получаю завершение файлов в каталоге, из которого я начал интерпретатор. Когда я загружаю модули readline
и rlcompleter
и добавляю readline.parse_and_bind('Cn: complete')
в файл.pystartup, он преобразует Ctl + n и Ctl + f в автоматическое заполнение объектов python.
Я хотел бы сделать то и другое, но я не уверен, как сохранить rlcompleter
от переопределения стандартной версии. Есть ли способ запустить два экземпляра readline
: один, который делает, и тот, который не использует rlcompleter
?
Вот мой файл.pystartup
import atexit
import os
import readline
import rlcompleter #removing this does file completion.
readline.parse_and_bind('C-n: complete')
historyPath = os.path.expanduser("~/.pyhistory")
def save_history(historyPath=historyPath):
import readline
readline.write_history_file(historyPath)
if os.path.exists(historyPath):
readline.read_history_file(historyPath)
atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath
Как это устроено:
Когда вы импортируете rlcompleter
, он устанавливает rlcompleter.Completer().complete
readline.set_completer(Completer().complete)
как readline
completeter: readline.set_completer(Completer().complete)
.
Без rlcompleter
, completer
равно None
, поэтому по умолчанию GNU readline lib использует rl_filename_completion_function
.
Логика привязки и завершение логики реализована GNU readline lib, поэтому в Python нечего делать о start up two instances of readline
...
Я не нашел способ вызвать по умолчанию rl_filename_completion_function
в Python (это возможно в расширении C), поэтому, я думаю, вам нужно продублировать логику rl_filename_completion_function
в Python.
Что означает, что вы должны наследовать Completer
и создать свой пользовательский complete
. Но вы все еще не можете разделить эти две логики на Cn
и Cf
:(