Vimium: Использование vimium для добавления пользовательских команд javascript

Созданный на 30 дек. 2014  ·  17Комментарии  ·  Источник: philc/vimium

С легкостью создания привязок клавиш к конкретным сайтам я хотел бы добавить возможность для пользователя выполнять произвольные однострочные javascript на открытой веб-странице с помощью крючка vimium. Это позволит опытным пользователям быстро улучшить поддержку клавиатуры для уникального сайта и создавать новые команды vimium.

Например, возможно следующее отображение и команда:

map a javascript alert("Hello world!");

Когда пользователь нажимает «a», vimium оценивает javascript, хранящийся под этой командой, и предупреждает пользователя.

Я хотел бы закодировать эту функцию, но сначала я хотел бы спросить несколько вещей:

  1. Эта функция требует настройки, но добавит в vimium много полезности, значительно расширив ее возможный набор функций. Однако будет ли он достаточно применим для включения в основную ветку, или ему придется жить на вилке.
  2. Я новичок в этом проекте и coffeescript, хотя у меня есть опыт веб-разработки на javascript. С чего бы мне начать добавлять эту функцию?
  3. Кто-нибудь еще найдет это полезным?

Спасибо всем.
-Гарретт

Самый полезный комментарий

Я хотел бы иметь возможность расширять vimium путем сопоставления с моими собственными плагинами. Если бы не произвольный JS, sendMessage или меня бы устроила идея

Это помогло бы сохранить основные функции vimium небольшими и в хорошем состоянии, в то же время позволяя людям расширять их по своему вкусу. Разрешение людям расширять vimium не ухудшает его качества, люди могут также устанавливать дерьмовые плагины в vim, но они, как правило, этого не делают ...

Все 17 Комментарий

Это разумное предложение, и мы должны поддержать эту идею. Однако его нужно немного дополнить.

Что Vimium делает хорошо, так это режимы и привязки клавиш. И эти привязки клавиш просто вызывают JavaScript. Поэтому для пользователей естественно захотеть привязать свой собственный JavaScript к ключам. И предлагаемый синтаксис для сопоставления клавиш чистый.

Проблема, на мой взгляд, в том, что пользователи быстро (и разумно) захотят большего:

  • Длинные функции, которые не вписываются в страницу параметров, доступ к библиотекам, достойный редактор JavaScript, возможность сохранять / восстанавливать свой код и так далее.

Текущая страница параметров Vimium не подходит для этих вещей. И расширение его для этого отвлечет от основных целей дизайна Vimium.

Вот недоработанная идея, о которой я думал. Допустить сопоставление клавиш, как предлагает

map a CustomJS.alert

Добавьте опцию в нижней части страницы customJavaScriptUrl (по умолчанию пусто):

customJavaScriptUrl http://www.mysite.com/vimium.js

Если установлено customJavaScriptUrl , то Vimium загружает связанный файл, который должен определять карту имен команд (в примере alert ) для функций и оценивает ее:

window.CustomJS = {
    alert: function() { window.alert("hello"); }
}; /* I can't remember how to write JS! */

Почему это хорошая идея?

  • Он оказывает минимальное влияние на пользовательский интерфейс и пользовательский интерфейс Vimium, но при этом поддерживает функции, предлагаемые
  • Пользователи могут использовать любой редактор / среду для написания своих функций.
  • Практически каждый, кто достаточно фанатичен, чтобы использовать эту функциональность, без проблем разместит где-нибудь JS на веб-сайте.

Почему это плохая идея?

  • Это взлом.
  • Это не совсем соответствует цели Vimium по обеспечению согласованного пользовательского интерфейса Chrome, управляемого клавиатурой.
  • Изменить: мы создаем новые режимы отказа, которые может быть трудно понять пользователю.

Изменить: пользователи также быстро (и разумно) захотят сопоставления клавиш для конкретного сайта. Что-то типа:

map a Custom.alert http://www.example.com/*

Если установлен customJavaScriptUrl, то Vimium загружает связанный файл, который должен определять карту имен команд (в данном примере предупреждение) для функций и оценивать ее.

Мне изначально неудобно запускать удаленный код в нашем привилегированном контексте Vimium. На данный момент я считаю, что самый безопасный способ сделать это - позволить другим расширениям регистрировать свои собственные действия ( отправляя нам сообщения ), возможно, с привязками клавиш по умолчанию, которые мы запрашиваем у пользователя перед включением. Конечно, любой, кто может писать и размещать какой-либо javascript, также может написать 5 строк manifest.json , объявить свои функции на объекте и выполнить

chrome.runtime.sendMessage("VIMIUM_EXTENSION_ID", {
  "objectName": "YOUR_OBJECT_NAME_HERE",
  "functions": Object.keys(YOUR_OBJECT_HERE)
  "bindings": {"an": "YOUR_OBJECT_NAME_HERE.example",
                     "and": "YOUR_OBJECT_NAME_HERE.another"}
});
chrome.runtime.onConnectExternal.addListener(function(port) {
  if (port.sender.id != "VIMIUM_EXTENSION_ID")
    return;
  port.onMessage.addListener(function(msg) {
    if (msg.name in YOUR_OBJECT_HERE)
      YOUR_OBJECT_HERE[msg.name]();
  });
});

в конце их кода. (И, конечно же, загрузите расширение в Chrome.) Это снимает с нас ответственность за управление чужим кодом, что является большой победой в области безопасности / стабильности.

Изменить: пользователи также быстро (и разумно) захотят сопоставления клавиш для конкретного сайта

Предлагаем обсудить это отдельно (# 1188), так как это полезная функция, которую нужно иметь и для наших существующих команд.

Изменить: документирование команд также является проблемой, обсуждения на # 1269, # 1280 потенциально актуальны.

Есть мысли, скоро зайду.
30 декабря 2014 г. в 6:44 «Мэтью Райан» [email protected] написал:

Если установлен customJavaScriptUrl, то Vimium загружает связанный файл,
который должен определять карту имен команд (в примере - alert) для
функции и оценивает его

Мне изначально неудобно запускать удаленный код в нашем привилегированном
Контекст Vimium. На данный момент я считаю, что самый безопасный способ сделать это - позволить
другие расширения регистрируют свои действия (отправляя нам сообщения
https://developer.chrome.com/extensions/messaging), потенциально с
привязки клавиш по умолчанию, которые мы запрашиваем у пользователя перед включением. Наверняка кто-нибудь
кто может писать и размещать некоторый javascript, может также написать 5 строк
manifest.json, объявить свои функции на объекте и выполнить

chrome.runtime.sendMessage ("VIMIUM_EXTENSION_ID", {
"objectName": "YOUR_OBJECT_NAME_HERE",
«функции»: Object.keys (YOUR_OBJECT_HERE)
"bindings": {"an": "YOUR_OBJECT_NAME_HERE.example",
"and": "YOUR_OBJECT_NAME_HERE.another"}
});
chrome.runtime.onConnectExternal.addListener (функция (порт) {
если (port.sender.id! = "VIMIUM_EXTENSION_ID")
возвращение;
port.onMessage.addListener (function (msg) {
if (имя сообщения в ВАШЕМ_ОБЪЕКТЕ_ЗДЕСЬ)
ВАШ_ОБЪЕКТ_ЗДЕСЬ msg.name ;
});
});

в конце их кода. (И, конечно же, загрузите расширение в Chrome.)
Это снимает с нас ответственность за управление чужим кодом,
что является большой победой в области безопасности / стабильности.

Изменить: пользователям также быстро (и разумно) понадобится ключ для конкретного сайта
сопоставления

Предлагаем обсудить это отдельно (# 1188
https://github.com/philc/vimium/issues/1188), поскольку это полезный
возможность иметь и для наших существующих команд.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/philc/vimium/issues/1392#issuecomment -68361472.

Есть мысли, скоро зайду.

@philc Я бы хотел начать с моего предложения здесь, что вы думаете по этому поводу?

Теоретически идея вызова пользовательского JS-кода с помощью vimium звучит интересно. У вас есть какие-то конкретные примеры, какие фрагменты вы бы хотели привязать?

Мне просто любопытно, окажутся ли некоторые сниппеты настолько полезными , что в конечном итоге мы захотим отправить заранее определенный набор сниппетов как часть vimium.

Когда я начну работать над этим, я планирую реализовать все команды, открытые как PR, заблокированные # 1269, так что это будут вещи, которые мы активно рассматриваем.

Я также хотел бы реализовать некоторые команды для перемещения вкладок между окнами, но сначала я отправлю для этого PR.

Мне просто любопытно, окажутся ли некоторые сниппеты настолько полезными, что в конечном итоге мы захотим отправить заранее определенный набор сниппетов как часть vimium.

Я знаю, что хотел бы иметь возможность открывать предопределенную ссылку на новой и текущей вкладке. Например, bf может открывать facebook с любой страницы, а br - Reddit.

Другие веб-сайты, такие как fimfiction.net, хорошо спроектированы и единообразны, но не имеют сочетаний клавиш для всех общих функций. Вызывая функции javascript страницы, я мог бы реализовать их сам.

Я знаю, что хотел бы иметь возможность открывать предопределенную ссылку на новой и текущей вкладке. Например, bf может открывать facebook с любой страницы, а br - Reddit.

Не совсем отвечаю на ваш вопрос, но я почти все время делаю что-то подобное ....

  • Создайте закладку для Facebook.
  • Убедитесь, что «имя» короткое, вроде «Facebook (FB)». Совпадения с длинными названиями плохо оцениваются, так что пусть они будут короткими.
  • Используйте bfb<Enter> - так, b откройте закладку, затем fb .

Как Vimium оценивает, целые слова оцениваются выше, чем частичные совпадения. Итак, fb получает более высокий балл в целом слово. Кроме того, Vimium использует недавность для ранжирования закладок. Для меня этот трюк обычно выводит правильную закладку прямо наверх.

Если вы действительно хотите побудить Vimium выбрать вашу закладку, используйте «Facebook (FB FB)». Он наберет еще больше очков.

Было бы неплохо, если бы Вимиум понял все правильно. Но это один из способов помочь Vimium исправить это.

Вызывая функции javascript страницы, я мог бы реализовать их сам.

Поскольку мы не работаем в области видимости javascript страницы, мы никогда не получаем к ним доступа. Остается 2 варианта:

  • Скрипт Tampermonkey (или аналогичный), но тогда у нас все еще есть проблема, как подключить скрипт к нашему расширению (поскольку мы не можем включить сообщения с произвольных URL-адресов ).
  • Закладка (называемая Вомнибаром), но они загрязняют универсальный комплект для Вомнибара (и ваши настоящие закладки!).

Для контекста страницы, я думаю, мы могли бы просто использовать настраиваемое событие ( VimiumRegisterCommands / VimiumRegisterMode ). Когда я начну работать над этим и соберу несколько примеров, я ожидаю, что напишу оболочку, чтобы пользователю не приходилось беспокоиться о взаимодействии с этими событиями.

Предлагаем почерпнуть вдохновение из аналога Vimium в стиле Firefox, VimFx, в котором пользовательские команды довольно конкретизированы. Они регистрируются другими расширениями, которые обеспечивают естественный способ их распространения (и позволяют другим дополнениям вносить свои собственные команды / привязки). Я предполагаю без проверки, что расширение Chrome может предоставлять API для других расширений.

Я предлагаю разрешить несколько способов определения команд. Мне очень нравится, где идет # 2109, но для многих вещей я бы не хотел создавать расширения, так как я могу выразить их в одной строке, если я использую существующие функции vimium.

Пример:

map I coffee v ->
  v.goToTab url: 'https://inbox.google.com'

Я представляю, что вы можете написать coffeescript, который будет транслироваться, и при запуске он получит vimium api с красивыми функциями для вызова. goToTab в этом случае переключится на первую вкладку, которая соответствует поиску.

(обратите внимание, что API может быть как параметром, так и this , так что оба приведенных выше могут быть записаны как coffee -> <strong i="12">@goToTab</strong> ... и javascript v => v.gotToTab({url:...}) )

Привет, ребята,

Есть ли прогресс по этой функции?
Это действительно круто, и мне это интересно.

Я тоже хотел бы увидеть эту функциональность. Кроме того, я согласен с @wmertens - я

FWIW, я бы хотел просто скрыть все изображения на странице. У меня есть расширение, которое я использую для этого на шумных страницах, но я бы предпочел иметь возможность активировать его с помощью простого сочетания клавиш.

@corbt, вы можете использовать эту ветку (технически вам нужен только 3d23c0a9bc801bf56c44145f20a1b5c62caf1cd8).

Чтобы использовать, добавьте строку, подобную следующей, к вашим сопоставлениям клавиш:
map <keys> js javascript=uricomponentencoded_javascript_code
Например, я тестировал:
map aa js javascript=alert("Hello%20there!");

Примечание: это не всегда работает с Firefox (например, на github), поскольку они не предоставляют сценариям содержимого исключения из директивы script-src CSP.

В моем Chrome 62.0.3202.94 это не работает. Есть идеи, как это отладить?
В моих сопоставлениях:
map aa js javascript = alert ("Здравствуйте,% 20there!");

Но нажатие 'aa', похоже, его вообще не запускает

Эта функция еще не реализована.

Я хотел бы иметь возможность расширять vimium путем сопоставления с моими собственными плагинами. Если бы не произвольный JS, sendMessage или меня бы устроила идея

Это помогло бы сохранить основные функции vimium небольшими и в хорошем состоянии, в то же время позволяя людям расширять их по своему вкусу. Разрешение людям расширять vimium не ухудшает его качества, люди могут также устанавливать дерьмовые плагины в vim, но они, как правило, этого не делают ...

Была ли эта страница полезной?
0 / 5 - 0 рейтинги