mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Edit Book: Add keyboard shortcuts to jumpt to opening and closing tags (Ctrl+{ and Ctrl+})
This commit is contained in:
parent
89eb3a59a4
commit
d387cac871
@ -837,3 +837,12 @@ text. The editor allows you to insert a snippet with only a few key strokes.
|
||||
The snippets are very powerful, with many features, such as placeholders you
|
||||
can jump between, automatic mirroring of repeated text and so on.
|
||||
For more information, see :doc:`snippets`.
|
||||
|
||||
|
||||
Matching tags
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
When editing HTML or XML files, the closest tag containing the current cursor
|
||||
position is automatically highlighted. You can jump to either the opening tag
|
||||
or the closing tag using the keyboard shortcuts, :kbd:`Ctrl+{` and
|
||||
:kbd:`Ctrl+}`.
|
||||
|
@ -311,7 +311,7 @@ class Smarts(NullSmarts):
|
||||
Smarts.self_closing_pat = re.compile(r'/\s*>')
|
||||
Smarts.complete_attr_pat = re.compile(r'''([a-zA-Z0-9_-]+)\s*=\s*(?:'([^']*)|"([^"]*))$''')
|
||||
NullSmarts.__init__(self, *args, **kwargs)
|
||||
self.last_matched_tag = None
|
||||
self.last_matched_tag = self.last_matched_closing_tag = None
|
||||
|
||||
def get_extra_selections(self, editor):
|
||||
ans = []
|
||||
@ -332,13 +332,24 @@ class Smarts(NullSmarts):
|
||||
c = editor.textCursor()
|
||||
block, offset = c.block(), c.positionInBlock()
|
||||
tag = self.last_matched_tag = find_closest_containing_tag(block, offset, max_tags=2000)
|
||||
self.last_matched_closing_tag = None
|
||||
if tag is not None:
|
||||
add_tag(tag)
|
||||
tag = find_closing_tag(tag, max_tags=4000)
|
||||
tag = self.last_matched_closing_tag = find_closing_tag(tag, max_tags=4000)
|
||||
if tag is not None:
|
||||
add_tag(tag)
|
||||
return ans
|
||||
|
||||
def jump_to_enclosing_tag(self, editor, start=True):
|
||||
editor.highlighter.join()
|
||||
tag = self.last_matched_tag if start else self.last_matched_closing_tag
|
||||
if tag is None:
|
||||
return False
|
||||
c = editor.textCursor()
|
||||
c.setPosition(tag.start_block.position() + tag.start_offset + (1 if start else 2))
|
||||
editor.setTextCursor(c)
|
||||
return True
|
||||
|
||||
def rename_block_tag(self, editor, new_name):
|
||||
editor.highlighter.join()
|
||||
c = editor.textCursor()
|
||||
@ -621,6 +632,12 @@ class Smarts(NullSmarts):
|
||||
if key == Qt.Key_Backspace and smart_backspace(editor, ev):
|
||||
return True
|
||||
|
||||
if key in (Qt.Key_BraceLeft, Qt.Key_BraceRight):
|
||||
mods = ev.modifiers()
|
||||
if int(mods & Qt.ControlModifier):
|
||||
if self.jump_to_enclosing_tag(editor, key == Qt.Key_BraceLeft):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def replace_possible_entity(self, editor):
|
||||
|
Loading…
x
Reference in New Issue
Block a user