Vimperopera (Vimperator for Opera)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
ishitori
Сообщения: 502
ОС: gentoo -> archlinux

Vimperopera

Сообщение ishitori »

вот. сабж собственно. начну с лирического отступления.

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

а потом прочитал вот эту статью: Vimperator for Opera.

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

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

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

Код: Выделить всё

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 человек их немного подточит напильником. посему привожу скрипт в читабельном виде (в файле конфигурации он хранится одной строкой). также добавил немного своих комментариев:

Код:

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:

У вас нет необходимых прав для просмотра вложений в этом сообщении.
морнинг круассан..
Спасибо сказали:
Аватара пользователя
Snupt
Бывший модератор
Сообщения: 2062
Статус: No Place for RTFM Here…
ОС: Mac OS X

Re: Vimperopera

Сообщение Snupt »

Переношу в почётный раздел Проекты нашего форума.
Спасибо сказали:
Turbid
Сообщения: 175
ОС: Debian

Re: Vimperopera

Сообщение Turbid »

ishitori, отправил вам ЛС.
Спасибо сказали: