Vimium: Usando o vimium para adicionar comandos javascript personalizados

Criado em 30 dez. 2014  ·  17Comentários  ·  Fonte: philc/vimium

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:

  1. Este recurso requer configuração, mas adicionaria uma grande quantidade de utilidade ao vimium, expandindo muito seu possível conjunto de recursos. No entanto, seria aplicável o suficiente para ser incluído no branch master ou teria que viver em uma bifurcação.
  2. Sou novo neste projeto e no coffeescript, embora tenha experiência em desenvolvimento web javascript. Onde eu começaria a adicionar esse recurso?
  3. Alguém mais acharia isso útil?

Obrigado a todos.
-Garrett

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 ...

Todos 17 comentários

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):

  • Funções longas que não se encaixam perfeitamente na página de opções, acesso a bibliotecas, um editor de JavaScript decente, a capacidade de salvar / restaurar seu código e assim por diante.

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?

  • Tem um impacto mínimo na IU e UX do Vimium, ao mesmo tempo que acomoda o tipo de funcionalidade que @GGreenwood propõe.
  • Os usuários podem usar qualquer editor / ambiente que desejem para escrever suas funções.
  • Quase todo mundo que é geek o suficiente para usar essa funcionalidade não terá nenhum problema em colocar um JS em um site em algum lugar.

Por que isso é uma má ideia?

  • É um hack.
  • Não é realmente consistente com o objetivo do Vimium de fornecer um UX de cromo baseado em teclado consistente.
  • Editar: criamos novos modos de falha que podem ser difíceis para o usuário entender.

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 avalia

Estou 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ça

chrome.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
mapeamentos

Sugira 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 ....

  • Crie um marcador para o Facebook.
  • Certifique-se de que o "nome" seja curto, algo como "Facebook (FB)". As correspondências em nomes longos têm pontuação baixa, portanto, seja curto.
  • Use 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:

  • Um script Tampermonkey (ou semelhante), mas ainda temos o problema de como conectar o script à nossa extensão (uma vez que não podemos habilitar mensagens de URLs arbitrários ).
  • Um marcador (chamado pelo Vomnibar), mas polui o omni completer do Vomnibar (e seus marcadores reais!).

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 ...

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Poseiden picture Poseiden  ·  3Comentários

kaldown picture kaldown  ·  3Comentários

vbaruh picture vbaruh  ·  4Comentários

PickRelated picture PickRelated  ·  4Comentários

finalfantasia picture finalfantasia  ·  3Comentários