Pull to refresh

Firefox: сочетания клавиш в стиле Emacs, а также загрузка содержимого clipboard по нажатию средней кнопки мыши

Reading time5 min
Views1.6K
Хочу поделиться с хабросообществом двумя рецептами «приготовления» Firefox для более приятного и удобного его использования в повседневной жизни юниксоида.

Речь будет идти о версии Firefox под FreeBSD. Но всё, описанное ниже, вполне применимо и к версии для Linux. Для Windows всё не так просто и решается другими способами.

Я опишу метод «внедрения» в Firefox сочетаний клавиш в стиле Emacs, а также как заставить Firefox загружать по mouse middleclick любой контент буфера обмена, а не только тот, который похож на ссылку (имеет префикс http:// и т.п.).

Если тема интересна, прошу под кат.

Итак. Каждый из нас, кто в силу разных причин использует shell (в частности bash), наверняка знаком с Emacs-style keybindings. Например:
Ctrl — a: перейти в начало строки
Ctrl — e: перейти в конец строки
Ctrl — u: удалить до начала строки
Ctrl — k: удалить до конца строки
И т.д.

Я настолько привык использовать эти сочетания клавиш, что зачастую по инерции пытаюсь применить их и в других программах. В частности, в Firefox. Однако, это приводит к неожиданным результатам. Например, сочетание «Ctrl — w», вместо удаления слова перед курсором, просто закрывает текущую вкладку.

Когда-то давно мне такое положение дел надоело и я использовал метод, найденный на просторах MozillaZine. И с тех пор использую это решение при каждом обновлении Firefox. Ниже опишу последовательность действий.

Для начала нам нужен установленный Firefox. В FreeBSD его можно установить из коллекции портов (ports/www/firefox). Далее необходимо взять файл toolkit.jar. По умолчанию в FreeBSD он устанавливается в директорию /usr/local/lib/firefox/chrome/. Затем его нужно распаковать. Сделать это можно с помощью утилиты jar из поставки JDK, либо утилиты fastjar (ports/archivers/fastjar), либо обычным unzip:

mkdir /tmp/firefox/ && cd /tmp/firefox/ && cp /usr/local/lib/firefox/chrome/toolkit.jar /tmp/firefox/ && fastjar -xf toolkit.jar

Содержимое архива будет распаковано в текущую директорию. Далее в файл content/global/platformHTMLBindings.xml добавляем следующее:

1) в секцию <handlers> раздела <binding id="inputFields">
<!-- Emacsish single-line motion and delete keys -->
<handler event="keypress" key="a" modifiers="control" command="cmd_beginLine"/>
<handler event="keypress" key="e" modifiers="control" command="cmd_endLine"/>
<handler event="keypress" key="b" modifiers="control" command="cmd_charPrevious"/>
<handler event="keypress" key="f" modifiers="control" command="cmd_charNext"/>
<handler event="keypress" key="h" modifiers="control" command="cmd_deleteCharBackward"/>
<handler event="keypress" key="d" modifiers="control" command="cmd_deleteCharForward"/>
<handler event="keypress" key="w" modifiers="control" command="cmd_deleteWordBackward"/>
<handler event="keypress" key="u" modifiers="control" command="cmd_deleteToBeginningOfLine"/>
<handler event="keypress" key="k" modifiers="control" command="cmd_deleteToEndOfLine"/>


2) в секцию <handlers> разделов <binding id="textAreas"> и <binding id="editor">
<!-- Emacsish single-line motion and delete keys -->
<handler event="keypress" key="a" modifiers="control" command="cmd_beginLine"/>
<handler event="keypress" key="e" modifiers="control" command="cmd_endLine"/>
<handler event="keypress" id="key_left" key="b" modifiers="control" command="cmd_charPrevious"/>
<handler event="keypress" id="key_right" key="f" modifiers="control" command="cmd_charNext"/>
<handler event="keypress" id="key_delback" key="h" modifiers="control" command="cmd_deleteCharBackward"/>
<handler event="keypress" id="key_delforw" key="d" modifiers="control" command="cmd_deleteCharForward"/>
<handler event="keypress" id="key_delwback" key="w" modifiers="control" command="cmd_deleteWordBackward"/>
<handler event="keypress" id="key_del_bol" key="u" modifiers="control" command="cmd_deleteToBeginningOfLine"/>
<handler event="keypress" id="key_del_eol" key="k" modifiers="control" command="cmd_deleteToEndOfLine"/>

<!-- Emacsish multi-line motion and delete keys -->
<handler event="keypress" id="key_linedown" key="n" modifiers="control" command="cmd_lineNext"/>
<handler event="keypress" id="key_lineup" key="p" modifiers="control" command="cmd_linePrevious"/>


После этого запаковываем архив обратно: "fastjar -cf toolkit.jar */" (или с помощью "zip -r"). И перемещаем его в исходную директорию:

mv toolkit.jar /usr/local/lib/firefox/chrome/toolkit.jar

Для этого понадобятся root'овые права. Также, само собой, файл toolkit.jar предварительно нужно забэкапить.
Перезапускаем Firefox и наслаждаемся наличием сочетаний клавиш в стиле Emacs во всех текстовых полях, включая адресную строку броузера.
Чтобы каждый раз при выходе новой версии Firefox руками не копаться в содержимом файла content/global/platformHTMLBindings.xml, я завернул эти изменения в патч.

Идём дальше. Начиная с 4-ой версии Firefox я столкнулся с тем, что по нажатию средней кнопки мыши броузер более не пытается загрузить ссылку из буфера обмена, если у этой ссылки нету соответствующего префикса (http:// и т.п.). Т.е., если я, скажем, из лога веб-сервера копирую имя виртуального хоста, чтобы посмотреть на его веб-сайт в броузере, то вместо привычного middle click в окне броузера, я вынужден поставить курсор в адресную строку, вставить туда контент буфера обмена и нажать Enter. Это, мягко говоря, нововведение настолько повергло меня в уныние, что заставило снова обратиться к поиску решения на просторах Сети. И решение было найдено. Оно предполагает такую же процедуру, что и описанный выше метод. Только файлы редактировать мы будем другие. Берём файл browser.jar из директории /usr/local/lib/firefox/chrome/, бэкапим и распаковываем его. Далее в файле content/browser/browser.js находим вот такой блок:

  try {
    makeURI(url);
  } catch (ex) {
    // Not a valid URI.
    return;
  }


и заменяем его на вот такой:

  var URIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
                           .getService(Components.interfaces.nsIURIFixup);
  url = URIFixup.createFixupURI(url, 1).spec;
  // 1 is FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP


Сохраняем, запаковываем обратно и перемещаем вновьсозданный browser.jar назад в директорию /usr/local/lib/firefox/chrome/. Перезагружаем броузер, убеждаемся, что в about:config опция contentLoadURL имеет значение true и наслаждаемся полученным результатом: теперь при нажатии средней кнопки мыши броузер будет пытаться загрузить любой контент из буфера обмена, а не только тот, который он считает ссылкой.

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

Оба метода используются мною давно и уже проверены на работоспособность в недавно вышедшем FF 10.0.
Один минус этого подхода: патчи нужно применять после каждого обновления Firefox.

Надеюсь, эта статья будет полезной и принесёт кому-то ещё больше удовлетворения и наслаждения от работы в любимом броузере.

В статье были использованы следующие материалы:
1. Emacs Keybindings — Firefox (MozillaZine).
2. Firefox 4: Fixing middlemouse.content load, and hacking jars (ShallowSky.com).
Tags:
Hubs:
Total votes 16: ↑12 and ↓4+8
Comments6

Articles