Add a quick-complete option.
This moves to the next commandline part when completing if there's only one possible completion.
This commit is contained in:
parent
749e330383
commit
a389b0f688
1
TODO
1
TODO
@ -56,7 +56,6 @@ Improvements / minor features
|
|||||||
- Zoom with ctrl + mousewheel
|
- Zoom with ctrl + mousewheel
|
||||||
- search highlighting
|
- search highlighting
|
||||||
- max height for completion (be smaller if possible)
|
- max height for completion (be smaller if possible)
|
||||||
- tab should directly insert word and space if there's only one option
|
|
||||||
- vertical tabbar
|
- vertical tabbar
|
||||||
- reload config command
|
- reload config command
|
||||||
- config changed signals for sections (optimization)
|
- config changed signals for sections (optimization)
|
||||||
|
@ -266,6 +266,10 @@ DATA = OrderedDict([
|
|||||||
"How many commands to save in the history. 0: no history / -1: "
|
"How many commands to save in the history. 0: no history / -1: "
|
||||||
"unlimited"),
|
"unlimited"),
|
||||||
|
|
||||||
|
('quick-complete',
|
||||||
|
SettingValue(types.Bool(), 'true'),
|
||||||
|
"Whether to move on to the next part when there's only one possible "
|
||||||
|
"completion left."),
|
||||||
)),
|
)),
|
||||||
|
|
||||||
('input', sect.KeyValue(
|
('input', sect.KeyValue(
|
||||||
|
@ -65,7 +65,10 @@ class CompletionView(QTreeView):
|
|||||||
Signals:
|
Signals:
|
||||||
change_completed_part: Text which should be substituted for the word
|
change_completed_part: Text which should be substituted for the word
|
||||||
we're currently completing.
|
we're currently completing.
|
||||||
arg: The text to change to.
|
arg 0: The text to change to.
|
||||||
|
arg 1: True if the text should be set
|
||||||
|
immediately, without continuing
|
||||||
|
completing the current field.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
STYLESHEET = """
|
STYLESHEET = """
|
||||||
@ -100,7 +103,7 @@ class CompletionView(QTreeView):
|
|||||||
|
|
||||||
# FIXME style scrollbar
|
# FIXME style scrollbar
|
||||||
|
|
||||||
change_completed_part = pyqtSignal(str)
|
change_completed_part = pyqtSignal(str, bool)
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
@ -367,9 +370,15 @@ class CompletionView(QTreeView):
|
|||||||
if indexes:
|
if indexes:
|
||||||
data = self._model.data(indexes[0])
|
data = self._model.data(indexes[0])
|
||||||
if data is not None:
|
if data is not None:
|
||||||
self._ignore_change = True
|
if (self._model.rowCount(indexes[0].parent()) == 1 and
|
||||||
self.change_completed_part.emit(data)
|
config.get('completion', 'quick-complete')):
|
||||||
self._ignore_change = False
|
# If we only have one item, we want to apply it immediately
|
||||||
|
# and go on to the next part.
|
||||||
|
self.change_completed_part.emit(data, True)
|
||||||
|
else:
|
||||||
|
self._ignore_change = True
|
||||||
|
self.change_completed_part.emit(data, False)
|
||||||
|
self._ignore_change = False
|
||||||
super().selectionChanged(selected, deselected)
|
super().selectionChanged(selected, deselected)
|
||||||
|
|
||||||
def resizeEvent(self, e):
|
def resizeEvent(self, e):
|
||||||
|
@ -140,19 +140,32 @@ class Command(MinimalLineEdit):
|
|||||||
self.setFocus()
|
self.setFocus()
|
||||||
self.show_cmd.emit()
|
self.show_cmd.emit()
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str, bool)
|
||||||
def on_change_completed_part(self, newtext):
|
def on_change_completed_part(self, newtext, immediate):
|
||||||
"""Change the part we're currently completing in the commandline.
|
"""Change the part we're currently completing in the commandline.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
text: The text to set (string).
|
text: The text to set (string).
|
||||||
|
immediate: True if the text should be completed immediately
|
||||||
|
including a trailing space and we shouldn't continue
|
||||||
|
completing the current item.
|
||||||
"""
|
"""
|
||||||
parts = self.parts[:]
|
parts = self.parts[:]
|
||||||
logger.debug("parts: {}, changing {} to '{}'".format(
|
logger.debug("parts: {}, changing {} to '{}'".format(
|
||||||
parts, self.cursor_part, newtext))
|
parts, self.cursor_part, newtext))
|
||||||
parts[self.cursor_part] = newtext
|
parts[self.cursor_part] = newtext
|
||||||
|
# We want to place the cursor directly after the part we just changed.
|
||||||
cursor_str = self.prefix + ' '.join(parts[:self.cursor_part + 1])
|
cursor_str = self.prefix + ' '.join(parts[:self.cursor_part + 1])
|
||||||
self.setText(self.prefix + ' '.join(parts))
|
if immediate:
|
||||||
|
# If we should complete immediately, we want to move the cursor by
|
||||||
|
# one more char, to get to the next field.
|
||||||
|
cursor_str += ' '
|
||||||
|
text = self.prefix + ' '.join(parts)
|
||||||
|
if immediate and self.cursor_part == len(parts) - 1:
|
||||||
|
# If we should complete immediately and we're completing the last
|
||||||
|
# part in the commandline, we automatically add a space.
|
||||||
|
text += ' '
|
||||||
|
self.setText(text)
|
||||||
logger.debug("Placing cursor after '{}'".format(cursor_str))
|
logger.debug("Placing cursor after '{}'".format(cursor_str))
|
||||||
self.setCursorPosition(len(cursor_str))
|
self.setCursorPosition(len(cursor_str))
|
||||||
self.setFocus()
|
self.setFocus()
|
||||||
|
Loading…
Reference in New Issue
Block a user