Com a facilidade de fazer mapeamentos de teclas específicos do site, gostaria de adicionar a capacidade do usuário de executar uma linha javascript arbitrária na página da Web aberta com um gancho de vimium. Isso permitiria que usuários experientes melhorassem rapidamente o suporte ao teclado para um site exclusivo e criassem novos comandos vimium.
Por exemplo, o seguinte mapeamento e comando seria possível:
map a javascript alert("Hello world!");
Quando o usuário pressiona 'a', o vimium avalia o javascript armazenado sob aquele comando e alerta o usuário.
Eu estaria disposto a codificar esse recurso, mas gostaria de perguntar algumas coisas primeiro:
Obrigado a todos.
-Garrett
Esta é uma proposta razoável e devemos considerar a ideia. No entanto, ele precisa ser um pouco mais elaborado.
O que o Vimium faz bem são os modos e as combinações de teclas. E essas combinações de teclas acabam chamando o JavaScript. Portanto, é natural que os usuários queiram vincular seu próprio JavaScript às chaves. E a sintaxe proposta para mapeamentos de teclas é limpa.
O problema, a meu ver, é que os usuários irão querer mais rapidamente (e razoavelmente):
A página de opções atual do Vimium não se presta a essas coisas. E estendê-lo para fazer isso iria desviar a atenção dos principais objetivos de design do Vimium.
Aqui está uma ideia incompleta em que estive pensando. Admita mapeamentos de chave como @GGreenwood propõe:
map a CustomJS.alert
Adicione uma opção abaixo da dobra customJavaScriptUrl
(o padrão é vazio):
customJavaScriptUrl http://www.mysite.com/vimium.js
Se customJavaScriptUrl
estiver definido, então o Vimium baixa o arquivo vinculado, que deve definir um mapa de nomes de comando ( alert
, no exemplo) para funções e o avalia:
window.CustomJS = {
alert: function() { window.alert("hello"); }
}; /* I can't remember how to write JS! */
Por que isso é uma boa ideia?
Por que isso é uma má ideia?
Editar: os usuários também irão querer rapidamente (e razoavelmente) mapeamentos de teclas específicos do site. Algo como:
map a Custom.alert http://www.example.com/*
Se customJavaScriptUrl estiver definido, o Vimium baixa o arquivo vinculado, que deve definir um mapa de nomes de comando (alerta, no exemplo) para funções e avalia-o
Estou intrinsecamente desconfortável em executar código remoto em nosso contexto privilegiado do Vimium. Por enquanto, sinto que a maneira mais segura de fazer isso é permitir que outras extensões registrem suas próprias ações ( enviando uma mensagem para nós ), potencialmente com atalhos de teclado padrão que solicitamos ao usuário antes de habilitar. Certamente qualquer um que pode escrever e hospedar algum javascript também pode escrever 5 linhas manifest.json
, declarar suas funções em um objeto e fazer
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]();
});
});
no final de seu código. (E, claro, carregue a extensão no Chrome.) Isso remove de nós a responsabilidade de gerenciar o código de outra pessoa, o que é uma grande vitória de segurança / estabilidade.
Editar: os usuários também irão querer rapidamente (e razoavelmente) mapeamentos de teclas específicos do site
Sugira discutir isso separadamente (# 1188), uma vez que é um recurso útil para nossos comandos existentes também.
Editar: documentar os comandos também é um problema, as discussões em # 1269, # 1280 são potencialmente relevantes.
Eu tenho algumas idéias, entrarei em breve.
Em 30 de dezembro de 2014 6h44, "Matthew Ryan" [email protected] escreveu:
Se customJavaScriptUrl estiver definido, o Vimium baixa o arquivo vinculado,
que deve definir um mapa de nomes de comandos (alerta, no exemplo) para
funciona e avaliaEstou intrinsecamente desconfortável em executar código remoto em nosso ambiente privilegiado
Contexto Vimium. Por enquanto, sinto que a maneira mais segura de fazer isso é deixar
outras extensões registram suas próprias ações (enviando uma mensagem para nós
https://developer.chrome.com/extensions/messaging), potencialmente com
atalhos de teclado padrão que solicitamos ao usuário antes de ativar. Com certeza qualquer um
quem pode escrever e hospedar algum javascript também pode escrever 5 linhas
manifest.json, declare suas funções em um objeto e façachrome.runtime.sendMessage ("VIMIUM_EXTENSION_ID", {
"objectName": "YOUR_OBJECT_NAME_HERE",
"funções": Object.keys (YOUR_OBJECT_HERE)
"ligações": {"an": "YOUR_OBJECT_NAME_HERE.example",
"e": "YOUR_OBJECT_NAME_HERE.another"}
});
chrome.runtime.onConnectExternal.addListener (function (port) {
if (port.sender.id! = "VIMIUM_EXTENSION_ID")
Retorna;
port.onMessage.addListener (function (msg) {
if (msg.name em YOUR_OBJECT_HERE)
YOUR_OBJECT_HERE msg.name ;
});
});no final de seu código. (E, claro, carregue a extensão no Chrome.)
Isso remove de nós a responsabilidade de gerenciar o código de outra pessoa,
que é uma grande vitória de segurança / estabilidade.Editar: os usuários também desejarão rapidamente (e razoavelmente) a chave específica do site
mapeamentosSugira discutir isso separadamente (# 1188
https://github.com/philc/vimium/issues/1188), uma vez que este é um útil
recurso para ter para nossos comandos existentes também.-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/philc/vimium/issues/1392#issuecomment -68361472.
Eu tenho algumas idéias, entrarei em breve.
@philc , gostaria de começar com minha sugestão aqui, o que você
Teoricamente, a ideia de chamar um código JS personalizado com vimium parece interessante. Você tem em mente algum exemplo concreto? Quais são os snippets que gostaria de vincular?
Estou apenas curioso para saber se alguns fragmentos parecem ser tão úteis , que eventualmente gostaríamos de enviar um conjunto predefinido de fragmentos como parte do vimium.
Quando eu começar a trabalhar nisso, estou planejando implementar todos os comandos abertos como PRs bloqueados # 1269, portanto, essas serão coisas que estamos considerando enviar.
Também gostaria de implementar alguns comandos para mover guias entre janelas, mas vou enviar um PR para isso aqui primeiro.
Estou apenas curioso para saber se alguns fragmentos parecem ser tão úteis, que eventualmente gostaríamos de enviar um conjunto predefinido de fragmentos como parte do vimium.
Sei que gostaria de poder abrir um link predefinido em uma guia nova e atual. Por exemplo, 'bf' poderia abrir o Facebook de qualquer página e 'br' abriria o Reddit.
Outros sites, como fimfiction.net, são bem projetados e consistentes, mas não possuem atalhos de teclado para todas as funcionalidades comuns. Ao chamar as funções javascript da página, eu poderia implementá-las sozinho.
Sei que gostaria de poder abrir um link predefinido em uma guia nova e atual. Por exemplo, 'bf' poderia abrir o Facebook de qualquer página e 'br' abriria o Reddit.
Não estou realmente respondendo à sua pergunta, mas eu faço algo quase assim o tempo todo ....
bfb<Enter>
- então, b
abrir o favorito e, em seguida, fb
.Da forma como o Vimium faz sua pontuação, palavras inteiras têm pontuação mais alta do que correspondências parciais. Portanto, fb
obtém uma pontuação mais alta como uma palavra inteira. Além disso, o Vimium usa recência para classificar favoritos. Esse truque geralmente traz o marcador correto para o topo, para mim.
Se você realmente quer encorajar o Vimium a escolher o seu favorito, use o "Facebook (FB FB)". A pontuação será ainda mais alta.
Seria bom se o Vimium acertasse. Mas esta é uma maneira de ajudar o Vimium a acertar.
Ao chamar as funções javascript da página, eu poderia implementá-las sozinho.
Uma vez que não executamos no escopo javascript da página, nunca realmente obtemos acesso a eles. Isso deixa 2 opções:
Para o contexto da página, reconheço que poderíamos apenas usar um evento personalizado ( VimiumRegisterCommands
/ VimiumRegisterMode
). Quando eu começar a trabalhar nisso e apresentar alguns exemplos, espero escrever um wrapper para que o usuário não precise se preocupar em interagir com esses eventos.
Sugira inspirar-se na contraparte do Firefox verso do Vimium, o VimFx, que tem comandos personalizados bem elaborados. Eles são registrados por outras extensões, que fornecem uma maneira natural de distribuí-los (e permitem que outros addons contribuam com seus próprios comandos / ligações). Estou assumindo, sem verificação, que é possível que uma extensão do Chrome exponha uma API para outras extensões.
Proponho permitir várias maneiras de definir comandos. Eu realmente gosto de onde # 2109 está indo, mas para muitas coisas eu não gostaria de criar uma extensão, já que posso expressá-las em uma linha se usar as funções de vimium existentes.
Exemplo:
map I coffee v ->
v.goToTab url: 'https://inbox.google.com'
Estou imaginando que você pode escrever coffeescript, que será transpilado e, quando executado, receberá uma API de vimium com funções interessantes para chamar. goToTab
neste caso mudaria para a primeira guia que corresponde à pesquisa.
(observe que a API pode ser um parâmetro e this
, de modo que o acima pode ser escrito como coffee -> <strong i="12">@goToTab</strong> ...
e javascript v => v.gotToTab({url:...})
)
Ei pessoal,
Algum progresso neste recurso?
É muito legal, e eu me pergunto isso.
Eu também adoraria ver essa funcionalidade. Além disso, concordo com @wmertens - uma vantagem principal da funcionalidade proposta para mim é que ela é leve. Não quero lidar com a criação e instalação de uma extensão personalizada para escrever algumas funções de conveniência de uma linha em javascript.
FWIW, a funcionalidade que eu gostaria de ter é simplesmente ocultar todas as imagens em uma página. Tenho uma extensão que uso para isso em páginas barulhentas, mas prefiro poder ativá-la com um simples atalho de teclado.
@corbt você pode usar este branch (tecnicamente, você só precisa de 3d23c0a9bc801bf56c44145f20a1b5c62caf1cd8).
Para usar, adicione uma linha semelhante à seguinte aos seus mapeamentos de teclas:
map <keys> js javascript=uricomponentencoded_javascript_code
Por exemplo, eu testei com:
map aa js javascript=alert("Hello%20there!");
Observação: isso nem sempre funciona com o Firefox (por exemplo, no github), pois eles não concedem aos scripts de conteúdo uma isenção da diretiva script-src
CSP.
No meu Chrome 62.0.3202.94 isso não parece estar funcionando. Alguma ideia de como posso depurar isso?
Em meus mapeamentos:
map aa js javascript = alert ("Olá% 20there!");
Mas pressionar 'aa' não parece acioná-lo de forma alguma
Este recurso ainda não foi implementado.
Eu gostaria de poder estender o vimium mapeando meus próprios plug-ins. Se não for um JS arbitrário, um sendMessage ou, eu estaria bem com a ideia de @ mrmr1993 de registrar meu plugin com o vimium. Pontos de bônus se uma contagem puder ser fornecida opcionalmente ao mapeamento.
Isso ajudaria a manter os recursos básicos do vimium pequenos e bem conservados, permitindo que as pessoas os estendessem a seu gosto. Permitir que as pessoas estendam o vimium não diminui sua qualidade, as pessoas podem instalar plug-ins de merda no vim também, mas tendem a não fazer isso ...
Comentários muito úteis
Eu gostaria de poder estender o vimium mapeando meus próprios plug-ins. Se não for um JS arbitrário, um sendMessage ou, eu estaria bem com a ideia de @ mrmr1993 de registrar meu plugin com o vimium. Pontos de bônus se uma contagem puder ser fornecida opcionalmente ao mapeamento.
Isso ajudaria a manter os recursos básicos do vimium pequenos e bem conservados, permitindo que as pessoas os estendessem a seu gosto. Permitir que as pessoas estendam o vimium não diminui sua qualidade, as pessoas podem instalar plug-ins de merda no vim também, mas tendem a não fazer isso ...