From e82d3f0060b91f011c726ad55d9618e4f065a9d8 Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Sun, 17 Apr 2016 14:41:08 +0200 Subject: [PATCH] Add the `` Hints mode command to mark everything --- documentation/api.md | 3 ++ documentation/commands.md | 6 +++ extension/lib/commands-frame.coffee | 7 +++- extension/lib/commands.coffee | 56 ++++++++++++++++++------- extension/lib/defaults.coffee | 1 + extension/lib/modes.coffee | 4 ++ extension/locale/de/vimfx.properties | 1 + extension/locale/en-US/vimfx.properties | 1 + extension/locale/es/vimfx.properties | 1 + extension/locale/fr/vimfx.properties | 1 + extension/locale/id/vimfx.properties | 1 + extension/locale/it/vimfx.properties | 1 + extension/locale/ja/vimfx.properties | 1 + extension/locale/nl/vimfx.properties | 1 + extension/locale/pt-BR/vimfx.properties | 1 + extension/locale/ru/vimfx.properties | 1 + extension/locale/sv-SE/vimfx.properties | 1 + extension/locale/zh-CN/vimfx.properties | 1 + extension/locale/zh-TW/vimfx.properties | 1 + 19 files changed, 73 insertions(+), 17 deletions(-) diff --git a/documentation/api.md b/documentation/api.md index c6c9d36..08eba8d 100644 --- a/documentation/api.md +++ b/documentation/api.md @@ -777,6 +777,9 @@ The available type strings depend on `id`: - focusable: Any focusable element not falling into another category. - scrollable: Like “scrollable” when `id` is “normal” (see above). +The type string can also be `'other'`, regardless of what `id` is. That is the +case for elements for markers added by the `` Hints mode command. + The function must return an object like the `info` parameter (with the `type` and `semantic` properties). diff --git a/documentation/commands.md b/documentation/commands.md index d661b5e..ad6384f 100644 --- a/documentation/commands.md +++ b/documentation/commands.md @@ -281,6 +281,12 @@ like `F`. (Also see the advanced prefs [hints\_toggle\_in\_tab] and [hints\_toggle\_in\_background].) +Finally, if the element you wanted to interact with didn’t get a hint marker you +can try pressing `` while the hints are still shown. That will give hint +markers to _every_ element on screen. Warning: This can be very slow, and result +in an overwhelming amount of hint markers. See this as an escape hatch if you +_really_ want to avoid using the mouse at all costs. + [hint-matcher]: api.md#vimfxhintmatcher [hint chars]: options.md#hint-chars [Styling]: styling.md diff --git a/extension/lib/commands-frame.coffee b/extension/lib/commands-frame.coffee index 1c369be..628b321 100644 --- a/extension/lib/commands-frame.coffee +++ b/extension/lib/commands-frame.coffee @@ -86,13 +86,18 @@ commands.scroll_to_mark = (args) -> element = vim.state.scrollableElements.filterSuitableDefault() utils.scroll(element, args) -helper_follow = ({id, combine = true}, matcher, {vim}) -> +helper_follow = ({id, combine = true}, matcher, args) -> + {vim, markEverything = false} = args hrefs = {} vim.state.markerElements = [] filter = (element, getElementShape) -> {type, semantic} = matcher({vim, element, getElementShape}) + if markEverything and not type + type = 'other' + semantic = false + if vim.hintMatcher {type, semantic} = vim.hintMatcher(id, element, {type, semantic}) diff --git a/extension/lib/commands.coffee b/extension/lib/commands.coffee index 47ff249..6067342 100644 --- a/extension/lib/commands.coffee +++ b/extension/lib/commands.coffee @@ -414,12 +414,7 @@ helper_follow = (name, vim, callback, count = null) -> 'hints', initialMarkers, callback, count, vim.options.hints_sleep ) - vim._run(name, null, ({wrappers, viewport}) -> - # The user might have exited hints mode (and perhaps even entered it again) - # before this callback is invoked. If so, `storage.markers` has been - # cleared, or set to a new value. Only proceed if it is unchanged. - return unless storage.markers == initialMarkers - + setMarkers = ({wrappers, viewport}) -> if wrappers.length > 0 {markers, markerMap} = hints.injectHints( vim.window, wrappers, viewport, vim.options @@ -429,6 +424,19 @@ helper_follow = (name, vim, callback, count = null) -> else vim.notify(translate('notification.follow.none')) vim.enterMode('normal') + + vim._run(name, {}, (result) -> + # The user might have exited hints mode (and perhaps even entered it again) + # before this callback is invoked. If so, `storage.markers` has been + # cleared, or set to a new value. Only proceed if it is unchanged. + return unless storage.markers == initialMarkers + setMarkers(result) + storage.markEverything = -> + lastMarkers = storage.markers + vim._run(name, {markEverything: true}, (newResult) -> + return unless storage.markers == lastMarkers + setMarkers(newResult) + ) ) helper_follow_clickable = (options, {vim, count = 1}) -> @@ -486,7 +494,8 @@ commands.follow_in_focused_tab = commands.follow_in_window = ({vim}) -> callback = (marker) -> vim._focusMarkerElement(marker.wrapper.elementIndex) - vim.window.openLinkIn(marker.wrapper.href, 'window', {}) + {href} = marker.wrapper + vim.window.openLinkIn(href, 'window', {}) if href helper_follow('follow_in_tab', vim, callback) commands.follow_multiple = (args) -> @@ -501,7 +510,7 @@ commands.follow_copy = ({vim}) -> 'href' when 'text' 'value' - when 'contenteditable' + when 'contenteditable', 'other' 'textContent' vim._run('copy_marker_element', {elementIndex, property}) helper_follow('follow_copy', vim, callback) @@ -514,25 +523,31 @@ commands.follow_focus = ({vim}) -> commands.click_browser_element = ({vim}) -> markerElements = [] - filter = (element, getElementShape) -> + filter = ({markEverything}, element, getElementShape) -> document = element.ownerDocument + semantic = true type = switch when vim._state.scrollableElements.has(element) 'scrollable' when utils.isFocusable(element) or (element.onclick and element.localName != 'statuspanel') 'clickable' + + if markEverything and not type + type = 'other' + semantic = false + return unless type return unless shape = getElementShape(element) length = markerElements.push(element) - return {type, semantic: true, shape, elementIndex: length - 1} + return {type, semantic, shape, elementIndex: length - 1} callback = (marker) -> element = markerElements[marker.wrapper.elementIndex] switch marker.wrapper.type when 'scrollable' utils.focusElement(element, {flag: 'FLAG_BYKEY'}) - when 'clickable' + when 'clickable', 'other' sequence = if element.localName == 'tab' ['mousedown'] @@ -541,15 +556,24 @@ commands.click_browser_element = ({vim}) -> utils.focusElement(element) utils.simulateMouseEvents(element, sequence) - {wrappers, viewport} = - hints.getMarkableElementsAndViewport(vim.window, filter) - - if wrappers.length > 0 + createMarkers = ({wrappers, viewport}) -> {markers} = hints.injectHints(vim.window, wrappers, viewport, { hint_chars: vim.options.hint_chars ui: true }) - vim.enterMode('hints', markers, callback) + return markers + + result = hints.getMarkableElementsAndViewport( + vim.window, filter.bind(null, {markEverything: false}) + ) + + if result.wrappers.length > 0 + storage = vim.enterMode('hints', createMarkers(result), callback) + storage.markEverything = -> + newResult = hints.getMarkableElementsAndViewport( + vim.window, filter.bind(null, {markEverything: true}) + ) + storage.markers = createMarkers(newResult) else vim.notify(translate('notification.follow.none')) diff --git a/extension/lib/defaults.coffee b/extension/lib/defaults.coffee index 80aecd5..da46c8d 100644 --- a/extension/lib/defaults.coffee +++ b/extension/lib/defaults.coffee @@ -118,6 +118,7 @@ shortcuts = '': 'rotate_markers_backward' '': 'delete_hint_char' '': 'increase_count' + '': 'mark_everything' 'ignore': '': diff --git a/extension/lib/modes.coffee b/extension/lib/modes.coffee index 2fef01c..5f8e809 100644 --- a/extension/lib/modes.coffee +++ b/extension/lib/modes.coffee @@ -119,6 +119,7 @@ mode('hints', { storage.callback = callback storage.count = count storage.numEnteredChars = 0 + storage.markEverything = null if sleep >= 0 storage.clearInterval = utils.interval(vim.window, sleep, (next) -> @@ -204,6 +205,9 @@ mode('hints', { storage.numEnteredChars -= 1 unless storage.numEnteredChars == 0 increase_count: ({storage}) -> storage.count += 1 + + mark_everything: ({storage}) -> + storage.markEverything?() }) diff --git a/extension/locale/de/vimfx.properties b/extension/locale/de/vimfx.properties index e0660b1..4e031f7 100644 --- a/extension/locale/de/vimfx.properties +++ b/extension/locale/de/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Überlappende Markierungen vorwärts drehen mode.hints.rotate_markers_backward=Überlappende Markierungen rückwärts drehen mode.hints.delete_hint_char=Lösche zuletzt eingegebenes Hinweiszeichen mode.hints.increase_count=Anzahl erhöhen +mode.hints.mark_everything=Mark everything mode.ignore=Ignoriermodus mode.ignore.exit=Zum Normalmodus zurückkehren diff --git a/extension/locale/en-US/vimfx.properties b/extension/locale/en-US/vimfx.properties index ce5f246..1f7518e 100644 --- a/extension/locale/en-US/vimfx.properties +++ b/extension/locale/en-US/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Rotate overlapping markers forward mode.hints.rotate_markers_backward=Rotate overlapping markers backward mode.hints.delete_hint_char=Delete last typed hint character mode.hints.increase_count=Increase count +mode.hints.mark_everything=Mark everything mode.ignore=Ignore mode mode.ignore.exit=Return to Normal mode diff --git a/extension/locale/es/vimfx.properties b/extension/locale/es/vimfx.properties index 83fc7ef..907354f 100644 --- a/extension/locale/es/vimfx.properties +++ b/extension/locale/es/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Rotar indicaciones superpuestas hacia delante mode.hints.rotate_markers_backward=Rotar indicaciones superpuestas hacia atrás mode.hints.delete_hint_char=Borrar último caracter de indicación tecleado mode.hints.increase_count=Incrementar contador +mode.hints.mark_everything=Mark everything mode.ignore=Modo Ignorar mode.ignore.exit=Volver a modo Normal diff --git a/extension/locale/fr/vimfx.properties b/extension/locale/fr/vimfx.properties index 18e4dfb..38bbb65 100644 --- a/extension/locale/fr/vimfx.properties +++ b/extension/locale/fr/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Faire tourner vers l'avant les marqueurs super mode.hints.rotate_markers_backward=Faire tourner en arrière mode.hints.delete_hint_char=Supprimer le dernier caractère frappé lors de la sélection d'un marqueur mode.hints.increase_count= +mode.hints.mark_everything=Mark everything mode.ignore=Mode ignorer mode.ignore.exit=Retourner au mode par défaut diff --git a/extension/locale/id/vimfx.properties b/extension/locale/id/vimfx.properties index a6abfba..3d400ad 100644 --- a/extension/locale/id/vimfx.properties +++ b/extension/locale/id/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Putar maju penanda bertumpukan mode.hints.rotate_markers_backward=Putar mundur penanda bertumpukan mode.hints.delete_hint_char=Hapus karakter petunjuk terakhir diketik mode.hints.increase_count=Naikkan hitungan +mode.hints.mark_everything=Mark everything mode.ignore=Mode Abai mode.ignore.exit=Kembali ke mode Normal diff --git a/extension/locale/it/vimfx.properties b/extension/locale/it/vimfx.properties index bcd9b9b..7aec80b 100644 --- a/extension/locale/it/vimfx.properties +++ b/extension/locale/it/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Ruota i marcatori sovrappossti in avanti mode.hints.rotate_markers_backward=Ruota i marcatori sovrappossti all'indietro mode.hints.delete_hint_char=Cancella l'ultimo carattere di suggerimento digitato mode.hints.increase_count=Aumenta il conteggio +mode.hints.mark_everything=Mark everything mode.ignore=Modalità Ignore mode.ignore.exit=Ritorna al modo normale diff --git a/extension/locale/ja/vimfx.properties b/extension/locale/ja/vimfx.properties index 0a4a67d..66ffdb6 100644 --- a/extension/locale/ja/vimfx.properties +++ b/extension/locale/ja/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=重なったマーカーを前へ入れ替え mode.hints.rotate_markers_backward=重なったマーカーを後へ入れ替え mode.hints.delete_hint_char=最後に入力したヒント文字を削除 mode.hints.increase_count=カウントを増やす +mode.hints.mark_everything=Mark everything mode.ignore=無効モード mode.ignore.exit=ノーマルモードへ戻る diff --git a/extension/locale/nl/vimfx.properties b/extension/locale/nl/vimfx.properties index 76ec9fe..62a70b1 100644 --- a/extension/locale/nl/vimfx.properties +++ b/extension/locale/nl/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Ga vooruit in markervolgorde mode.hints.rotate_markers_backward=Ga achteruit in markervolgorde mode.hints.delete_hint_char=Verwijder het laatst getypte markerkarakter mode.hints.increase_count=Verhoog aantal +mode.hints.mark_everything=Mark everything mode.ignore=Negeermodus mode.ignore.exit=Ga terug naar normale modus diff --git a/extension/locale/pt-BR/vimfx.properties b/extension/locale/pt-BR/vimfx.properties index b8af729..a238873 100644 --- a/extension/locale/pt-BR/vimfx.properties +++ b/extension/locale/pt-BR/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Rotacionar marcadores sobrepostos para frente mode.hints.rotate_markers_backward=Rotacionar marcadores sobrepostos para trás mode.hints.delete_hint_char=Deletar o último caractere digitado da sugestão mode.hints.increase_count=Incrementar contador +mode.hints.mark_everything=Mark everything mode.ignore=Modo Ignore mode.ignore.exit=Voltar ao modo Normal diff --git a/extension/locale/ru/vimfx.properties b/extension/locale/ru/vimfx.properties index b1a4569..32b42a5 100644 --- a/extension/locale/ru/vimfx.properties +++ b/extension/locale/ru/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Переставить перекрывающ mode.hints.rotate_markers_backward=Переставить перекрывающиеся маркеры в обратном порядке mode.hints.delete_hint_char=Удалить последний введённый символ mode.hints.increase_count=Увеличить количество +mode.hints.mark_everything=Mark everything mode.ignore=Режим игнорирования mode.ignore.exit=Вернуться в нормальный режим diff --git a/extension/locale/sv-SE/vimfx.properties b/extension/locale/sv-SE/vimfx.properties index 734757d..0f8e0ab 100644 --- a/extension/locale/sv-SE/vimfx.properties +++ b/extension/locale/sv-SE/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=Rotera överlappande etiketter framåt mode.hints.rotate_markers_backward=Rotera överlappande etiketter bakåt mode.hints.delete_hint_char=Radera senast inmatade tecken mode.hints.increase_count=Öka antal +mode.hints.mark_everything=Ge etiketter till allt mode.ignore=Ignoreringsläge mode.ignore.exit=Återvänd till Normalläge diff --git a/extension/locale/zh-CN/vimfx.properties b/extension/locale/zh-CN/vimfx.properties index cb82564..e8fd61e 100644 --- a/extension/locale/zh-CN/vimfx.properties +++ b/extension/locale/zh-CN/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=向前旋转重叠的标记 mode.hints.rotate_markers_backward=向后旋转重叠的标记 mode.hints.delete_hint_char=删除最后输入的提示符 mode.hints.increase_count=递增计数 +mode.hints.mark_everything=Mark everything mode.ignore=忽略模式 mode.ignore.exit=返回普通模式 diff --git a/extension/locale/zh-TW/vimfx.properties b/extension/locale/zh-TW/vimfx.properties index 99d8dd7..abbecdc 100644 --- a/extension/locale/zh-TW/vimfx.properties +++ b/extension/locale/zh-TW/vimfx.properties @@ -99,6 +99,7 @@ mode.hints.rotate_markers_forward=向前旋轉重疊的標誌 mode.hints.rotate_markers_backward=向後旋轉重疊的標誌 mode.hints.delete_hint_char=刪除最後輸入的提示字元 mode.hints.increase_count=遞增計數 +mode.hints.mark_everything=Mark everything mode.ignore=忽略模式 mode.ignore.exit=回到正常模式 -- 2.39.3