myoperam Vimperator for Opera
ВНИМАНИЕ! ОСТЕРЕГАЙТЕСЬ МОШЕННИКОВ!
Помните, что все браузеры Opera АБСОЛЮТНО БЕСПЛАТНЫ.
Загружайте новые версии ТОЛЬКО С ОФИЦИАЛЬНОГО САЙТА или с ресурсов, которым ДОВЕРЯЕТЕ!


Предыдущее | Следующее | Архив форума | operaman.ru | Поиск
Vimperator for Opera Turbid  10/22/08 09:55 AM

Участник сообщества _//linuxforum.ru_ ishitori _//linuxforum.ru/index.php?showtopic=77854_ свои конфиги, позволяющие управлять браузером Opera с помощью горячих клавиш в стиле редактора Vim:

я на каком-то генетическом уровне не переношу firefox - всегда использовал только оперу. даже несмотря на огромное количество плагинов для ff, которые значительно расширяют его функциональность. всё было бы хорошо, если бы однажды не натолкнулся на vimperator - из-за него несколько недель "пришлось" сидеть на ff

а потом прочитал вот эту статью: _//my.opera.com/Blazeix/blog/2008/07/04/vimperator-for-opera_.

сразу скажу, что vimperator для оперы - это не полноценная замена, а всего лишь набор хоткеев, ставших уже привычными в ff.
тем не менее, я сразу ухватился за эту идею - даже без этой статьи всё равно рано или поздно вернулся бы к опере.

так вот.. хочу поделиться своим конфигом vimperopera.ini, к которому добавил довольно большое количество хоткеев из "нативного" vimperator'а, по тем или иным причинам не включенных в базовый вариант, взятый с указанного сайта.

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

Code:
h, j, k, l   - навигация в соответствующие стороны

d, ^w - закрыть текущую вкладку
t, ^t - открыть новую вкладку
Esс, ^c, s - остановить загрузку страницы
R, r - обновить страницу
F3, M - показать/скрыть меню
^d - прокрутить полстраницы вниз
^u - прокрутить полстраницы вверх
gg - прокрутить к самому началу страницы
G - прокрутить к самому концу страницы
+, zi - увеличить масштаб страницы
-, zo - уменьшить масштаб страницы
1, <, gT - перейти на предыдущую вкладку
2, >, gt - перейти на следующую вкладку
H - назад (на предыдущую посещенную страницу)
L - вперед соответственно
/, ^f - поиск по странице
n/N - повторный поиск вперед/назад по странице (find next)
b - cделать закладку (bookmark)
^b - показать закладки
o, : - сделать активной строку для ввода url'а (aka address bar)
g o number (нажимать поочереди) - открыть в текущей вкладке закладку номер number со страницы быстрого набора оперы (aka speed dial) - у меня их 16, поэтому использую символы [1-9][a-g]
g n number (нажимать поочереди) - открыть в новой вкладке закладку номер number со страницы быстрого набора оперы (aka speed dial) с теми же оговорками
F12 - быстрые настройки (aka quick preferences)
^j - открыть страницу закачек (aka transfers)

может, что-то забыл...
ну и наконец:

f - подсветка всех ссылок с возможностью их открытия в текущей вкладке путем ввода номера (как в vimperator)
F - подсветка всех ссылок с возможностью их открытия в новой вкладке путем ввода номера (как в vimperator)



насчет последних сделаю оговорку - они изначально подсвечивают только ссылки (т.е. тэги <a ...>). были пожелания заставить их подсвечивать ещё и поля для ввода (т.е. тэги <input type="text" ...> или <input type="password" ...> и т.д.). после изучения javascript в течение целого часа - я не веб-программист и раньше никогда его не использовал (поэтому не пинайте сильно) - переделал функции js, чтобы они ещё подсвечивали и поля для ввода с последующей возможностью установки на них фокуса. в большинстве случаев они работают, но почему-то не всегда - буду признателен, если сведующий в js человек их немного подточит напильником. посему привожу скрипт в читабельном виде (в файле конфигурации он хранится одной строкой). также добавил немного своих комментариев:

Code:
var bgcolor = '#FF0';

var bgcolor1 = '#FF5';
var color = '#000';
var hintlist = new Array();
var hintedlinks = new Array();
var hintedinputs = new Array();
var map = new Array();
var mapindex = 0;
var choice = '';
var keycodemapping = {'48':'0','49':'1','50':'2','51':'3','52':'4','53':'5','54':'6','55':'7','56':'8','57':'9','13':'Enter','27':'Esc','8':'Bkspc'};
var originalTitle = document.title;
// store number of links
var nlinks;

function drawHints()
{
document.addEventListener('keypress',interpretKeyStroke,true);
document.title+=' - ';

var allLinks = document.getElementsByTagName('a');
var allInputs = document.getElementsByTagName('input');
var viewportStart = window.pageYOffset - 5;
var viewportEnd = viewportStart + window.innerHeight + 10;

for (var i=0;i<allLinks.length; i++)
{
linkYcoord = getAbsoluteY(allLinks[i]);
if(linkYcoord > viewportStart && linkYcoord < viewportEnd && allLinks[i].href != '')
{
hintedlinks.push(allLinks[i]);
}
}

// get all input elements and store them in array
for (var i=0;i<allInputs.length; i++)
{
linkYcoord = getAbsoluteY(allInputs[i]);
if(linkYcoord > viewportStart && linkYcoord < viewportEnd && allInputs[i].name != '')
{
hintedinputs.push(allInputs[i]);
}
}

for (var i = 0;i<hintedlinks.length; i++)
{
var hint = document.createElement('span');
hintlist.push(hint);
hint.style.backgroundColor=bgcolor;
hint.style.color=color;
hint.style.position='absolute';
hint.innerHTML = mapindex;
map[mapindex]=hintedlinks[i].href;
mapindex++;
hintedlinks[i].appendChild(hint,hintedlinks[i]);
}

// number of links altogether
nlinks = mapindex;

// store name attribute of each input element in a map
for (var i = 0;i<hintedinputs.length; i++)
{
var hint = document.createElement('span');
hintlist.push(hint);
hint.style.backgroundColor=bgcolor1;
hint.style.color=color;
hint.style.position='absolute';
hint.innerHTML = mapindex;
map[mapindex]=hintedinputs[i].name;
mapindex++;
hintedinputs[i].appendChild(hint,hintedinputs[i]);
}
}

function getAbsoluteY(element)
{
var y = 0;
while (element)
{
y += element.offsetTop;
element = element.offsetParent;
}
return y;
}

function removeHints()
{
for (var i=0; i<hintedlinks.length; i++)
{
hintedlinks[i].removeChild(hintlist[i],hintedlinks[i]);
}

for (var i=0; i<hintedinputs.length; i++)
{
hintedinputs[i].removeChild(hintlist[nlinks + i],hintedinputs[i]);
}

choice='';
document.title=originalTitle;
document.removeEventListener('keypress',interpretKeyStroke,true);
delete map;
delete hintlist;
delete hintedlinks;
delete hintedinputs;
}

function getURLchoice()
{
return (map[choice]==undefined) ? False : map[choice];
}

function interpretKeyStroke(e)
{
e.preventDefault();

var key=keycodemapping[(typeof event!='undefined')?window.event.keyCode:e.keyCode];
if(key=='Enter')
{
// this is what I have added to choose between links and input fields
if (choice < nlinks)
{
window.open(getURLchoice());
}
else
{
var allElements = document.getElementsByName(map[choice]);
allElements[0].focus();
}
removeHints();
}
else if(key=='Esc')
{
removeHints();
}
else if(key=='Bkspc')
{
choice=choice.slice(0,-1);
document.title=document.title.slice(0,-1);
}
else if(key == undefined)
{
removeHints();
}
else
{
choice+=key;document.title+=key;
if((''+choice).length>=(''+mapindex).length)
{
if (choice < nlinks)
{
window.open(getURLchoice());
}
else
{
var allElements = document.getElementsByName(map[choice]);
allElements[0].focus();
}
removeHints();
}
}
}

drawHints();



ну и наконец мой файл vimperopera.ini:

_//http://linuxforum.ru/index.php?act=attach&type=post&id=12723_

p.s. (от Turbid): vimperopera.ini надо положить в каталог keyboard вашего профиля (см. Справка => О программе) и выбрать данный конфиг в Инструменты => Настройки => Дополнительно => Управление => Профили клавиатуры.


operaman.ru - Home


Rambler's Top100