English | Русский

Блог о Linux и велосипедах

Vimperator — теперь время императора

Сначала был Навигатор, затем Исследователь. Потом настало время Завоевателя. Теперь время Императора, ВИМператора ;)
:help

Что это такое?

Vimperator представляет собой плагин для Firefox, который практически полностью меняет способ взаимодействия пользователя с браузером. Несмотря на то, что название содержит в себе название текстового редактора Vim, в силу существенных отличий между работой с текстом и просмотром веб-страниц, Vimperator достаточно далеко ушел от концепций Vim. Тем не менее их объединяет достаточно многое: терминология, стандартные сочетания клавиш, способ конфигурирования и множество других концепций. Форк Vimperator'а Pentadactyl старается в большей степени копировать поведение Vim'а. Сразу скажу, что Vimperator может быть интересен куда более широкому кругу пользователей, чем пользователям Vim. В основном это люди, ориентированные на эффективную работу с помощью клавиатуры.

О версиях. Vimperator 3 работает с Firefox 4, а Vimperator 2 — c Firefox 3. Вторая и третья версии Vimperator сильно отличаются1. Заметны изменения и в версии 3.2 по сравнению с 3.0. Здесь я буду говорить о Vimperator 3.2.

Основные сочетания клавиш

В обозначениях клавиш приняты следующие сокращения: <A> — Alt, <C> — Ctrl, <S> — Shift; заглавная буква значит нажатие соответствующего символа при удержании Shift.

  • F1 — показать справку;
  • j, k — прокрутить окно на одну строку вниз/вверх;
  • h, l — прокрутить окно влево/вправо;
  • <Space>, <Backspace> — прокрутить окно на одну страницу вниз/вверх;
  • gg, G — переместиться в начало/конец страницы;
  • 0 (^), $ — прокрутить страницу в крайнюю левую/правую позицию;
  • H, L — пройти назад/вперед по истории текущей вкладки;
  • gt (<C-n>), gT (<C-p>) — перейти на следующую/предыдущую вкладку;
  • C-^, C-6 — перейти на предыдущую вкладку;
  • o, t, w — открыть страницу в текущей вкладке, в новой вкладке и в новом окне;
  • O, T, W — тоже, что и o, t, w, только предварительно поместить в поле ввода текущий адрес;
  • d, D — закрыть вкладку и перейти на следующую/предыдущую;
  • u — восстановить последнюю закрытую вкладку;
  • p, P, gP — открыть адрес, находящийся в буфере обмена (primary selection), в текущей вкладке, в новой вкладке, в новой вкладке в фоне;
  • gu, gU — перейти на одну директорию выше, перейти на главную страницу;
  • y — скопировать адрес текущей страницы;
  • r, R — обновить страницу, обновить страницу минуя кеш;
  • <C-c>, <C-v> — копировать/вставить (clipboard);
  • <C-Insert>, <S-Insert> — копировать/вставить (primary selection);
  • b, B — перейти к буферу, показать буферы;
  • ZZ, ZQ — выйти из браузера с сохранением/без сохранения открытых вкладок;

Многие сочетания клавиш могут принимать численный аргумент. Например, N gt приведет к переходу на вкладку с номером N, а N H приведет к переходу на N страниц назад в истории. Для операций прокрутки страниц аргументом является количество повторов операции. Например, 10 j приведет к прокрутке 10 строк вниз.

Также можно выделить следующие полезные команды:

  • gi — переход на последнее используемое текстовое поле или на первое текстовое поле на странице. Крайне удобная команда, особенно когда приходится выходить в нормальный режим (о нем чуть дальше), а потом возвращаться обратно в режим вставки. N gi переводит в фокус N-ое текстовое поле.
  • [​[, ]​] — перейти на предыдущую/следующую страницу (используется эвристический метод нахождения ссылки на страницу);
  • [f, ]f — перейти на предыдущий/следующий фрейм.
  • zi, zm, zo, zr, zz — увеличить/увеличить сильнее/уменьшить/уменьшить сильнее/восстановить стандартным размер текста;
  • zI, zM, zO, zR, zZ — то же самое, что и выше, только применительно к размеру страницы, а не только к тексту;

Режимы

Vimperator может работать в следующих режимах:

  • normal mode: режим, в котором работают все выше приведенные сочетания клавиш (команды). Чтобы перейти из какого-либо другого режима в нормальный, нужно нажать <Esc>.
  • comand-line mode: вход в режим осуществляется вводом :, после чего следует команда, а затем <CR> (Enter).
  • hints mode: о нем чуть дальше.
  • insert-mode: включается автоматически, когда поле ввода получает фокус. В этом режиме C-i вызывает внешний редактор.
  • caret-mode: активизируется по c. В стандартном Firefox'е эквивалент — F7. В этом режиме появляется каретка, которой можно управлять стрелочками или h, j, k, l. Клавиша v переводит в visual-mode (режим выделения текста), y копирует выделенный текст, ^ переводит каретку в начало строки, $ — в конец.
  • режим поиска текста по странице:
  • /, ? — поиск вперед/назад:
  •  — учитывать регистр;
  • \l — искать только среди ссылок; После введенного запроса вводится <CR>, навигация по результатам осуществляется командами:
  • n — следующее совпадение;
  • N — предыдущее совпадение.

Чтобы послать сочетание клавиш Firefox'у или веб-приложению, необходимо экранировать его нажатием клавиши i. Чтобы отключить обработку клавиатурных сочетаний Vimperator'ом на продолжительное время, можно нажать <Shift-Esc> или Insert. Чтобы покинуть данный режим, нужно повторить одно из этих сочетаний.

Эргономичный Vimperator

Со стандартными сочетаниями клавиш мы познакомились, теперь пора их переопределить. Переопределить их можно командами :nmap, :vmap, :imap, :cmap для нормального, визуального режимов, режима вставки и режима командной строки соответственно. :map определяет сочетания для нормального и визуального одновременно. В качестве параметров данные команды принимают последовательность клавиш, на которое требуется повесить действие, и клавиши, которые уже соответствуют данному действию. В качестве последних команд могут выступать и расширенные команды, например :map x :open vlevit.org<CR>.

Далее следуют мои переопределения и дополнения стандартных клавиш, ориентированные на более высокую эргономичность.

h, l — перемещение между вкладками. По умолчанию здесь находится горизонтальный скролинг — такая редкая операция на таком шикарном месте! Переопределяем:

:nmap h <C-PageUp>
:nmap l <C-PageDown>

Чтоб переместиться на N вкладок вправо нажимаем N l, назад — N h.

C-l, C-h — перенесем горизонтальный скролинг сюда:

:map <C-l> <Right>
:map <C-h> <Left>

J, K — скролинг по j и k бывает слишком скучным:

:map K 10k
:map J 10j

A-j, A-k — да и J, K бывают скучноваты:

:map <A-j> 30j
:map <A-k> 30k

Постранично листаем с помощью Space и Backspace.

A-h, A-l — перемещаем вкладки влево/вправо:

:map <A-h> :tabmove<Space>-1<Return>
:map <A-l> :tabmove<Space>+1<Return>

s, S — выводим или открываем список закладок в текущей и новой вкладке:

:map s :bmarks<Space>
:map S :bmarks!<Space>

A-` — выбрать буфер (вкладку) из списка (по аналогии с Alt-Tab для выбора окон):

:map <A-`> b

В командном режиме:

A-j, A-k — следующее/предыдущее дополнение (вместо <Tab> и <S-Tab>):

:cmap <A-j> <Tab>
:cmap <A-k> <S-Tab>

A-l — выбор (вместо <Return>)

:cmap <A-l> <Return>

<A-n>, <A-p> — следующая/предыдущая строка из истории с таким же началом (например, :open fsf <A-p> подставит :open fsf.org, если такая команда есть в истории). По умолчанию, данные действия повешены на стрелочки:

:cmap <A-n> <Down>
:cmap <A-p> <Up>

<A-u>, <A-i> — следующая/предыдущая строка из истории команд:

:cmap <A-u> <S-Down>
:cmap <A-i> <S-Up>

Теперь мы можем переключать буферы (<A-`>), выбирать среди возможных дополнений (<A-j> | <A-k> & <A-l>), бегать по истории команд (<A-p> | <A-n> | <A-i> | <A-u>) без дополнительных перемещений рук по клавиатуре.

В Firefox по знаку одинарной кавычки производится поиск по ссылкам страницы. Чтоб достичь этого же эффекта в Vimperator, можно кавычку определить следующим образом:

:map \' \/\l

Не забываем сохранить определенные выше биндинги в ~/.vimperatorrc:

:mkv!

Хинтинг

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

По умолчанию хинты составляют цифры. Таким образом, объекты можно выбирать по им соответствующим цифрам или по символам, составляющие текст ссылки. Эти два метода можно комбинировать: например, сначала производить выбор по первой цифре хинта, а затем продолжить отсеивать подсвеченные ссылки по тексту ссылки. Если выбор производить по тексту ссылки, то сопоставление текста, введенного после пробела, и текста ссылки производится заново. То есть, ссылку verylonglink можно выбрать введя link long very. Возможно установить и другие алгоритмы сопоставления, подробнее смотрите :help hintmatching. По подсвеченным ссылкам можно передвигаться с помощью <Tab> и <S-Tab>, активная ссылка имеет другую подсветку. Выбор активной ссылки производится по <Return>. Если кандидат всего один, то выбор объекта произойдет автоматически.

Чтобы перейти в режим хинтинга, необходимо нажать f. Действие будет соответствовать тому, которое бы выполнилось, если бы на него нажали левой кнопкой мыши. Т.е. для ссылки — открытие, для кнопки — нажатие и т.д.

Настройки хинтинга по умолчанию особенно хорошо работают для людей, которые преимущественно посещают ресурсы на языках, основанных на латинском алфавите. Выбор по тексту ссылки обладает тем преимуществом, что когда человек увидел ссылку, он уже знает, какие символы вводить. Для выбора же по номеру, надо сначала войти в режим хинтинга, выдержать задержку отрисовки подсказок, воспринять номер ссылки, и только тогда вводить. В случае, если ссылки содержат, например, только кириллические символы, то необходимо затратить время на переключение раскладки, и выбор ссылки по тексту теряет свою привлекательность. Поэтому, если работа происходит в основном не с англоязычными ресурсами, то я рекомендую заменить символы хинтига с цифр на «домашний ряд» (home row)

:set hintchars=hjklasdf

так как эти клавиши легче нажимать, а ссылки все равно редко содержат латинские символы. В данном случае хинт первой ссылки на экране будет j, второй — k, третьей — l,..., восьмой — jh, девятой — jk и т.д. Вообще в hintchars можно поместить любую строку. Так что если у вас альтернативная раскладка, вы также приглашены на праздник.

Если вы попеременно работаете с ресурсами на разных языках, то можно определить смену значения hintchars по клавиатурным сочетаниям:

:map "<A-\\>" :set<Space>hintchars=0123456789<Return>
:map "\\" :set<Space>hintchars=hjklasdf<Return>

Открытие ссылки в новой вкладке производится по нажатию F. Расширенный хинтинг доступен по ;, после чего следует символ, обозначающий действие. Среди наиболее полезных действий: ; — сфокусировать элемент (для дальнейшего поиска с этой позиции или вызова контекстного меню), F — открыть много ссылок во вкладках (после выбора хинты опять автоматически появляются), y — скопировать ссылку, x — показать название или альтернативный текст. Все доступные расширенные хинты можно узнать по нажатию ;<Tab> (;<A-j>). Плагины Vimperator могут добавлять собственные хинты.

Закладки

В Vimperator есть несколько типов закладок. Первый — quick marks. Такие закладки обозначаются одним символом в диапазоне [0-9a-zA-Z] и сохраняются между сессиями. Чтобы добавить текущую страницу в закладки, достаточно нажать M X, где X — символ, который будет ассоциироваться с закладкой. Чтобы посетить закладку в текущей вкладке, необходимо нажать go X, в новой — gn X. Вручную можно добавить закладку с помощью команды :qmarks. В качестве первого аргумента передается символ закладки, второго — страница или список страниц, разделенных запятой и пробелом. В качестве страницы может быть указан ее адрес, краткое имя, поисковый запрос — все, что и в :open. Например, с помощью следующей закладки можно узнать курс валют сразу для EUR/USD, USD/UAH, UAH/RUB:

:qmark m google 1000 EUR in USD, google 1000 USD in UAH, google 1000 UAH in RUB

Посмотреть существующие быстрые закладки можно с помощью :qmarks, а удалить — с помощью :delqmarks.

Следующий тип — local marks. Они хранят в себе позицию в буфере, обозначаются одним символом [a-zA-Z]. Позиция привязывается к странице и сохраняется между сессиями. Чтобы перейти к закладке x, необходимо нажать `x. Закладки [a-z] могут повторятся сколько угодно раз, если они на разных страницах, а [A-Z] должны быть уникальными. `x приводит к поиску закладки x на текущей странице и перемещению на позицию, которая соответствует закладке x. В то время как `X открывает страницу в новой вкладке, если такая страница еще не открыта, и устанавливается позиция.

Последний тип — bookmarks. Это интерфейс для стандартных закладок Firefox'а. Добавить текущую страницу в закладки можно клавишей a или командой :bmark. При этом автоматически заполняются название закладки (параметр -title) и URL. Также можно указать параметр -keyword (-k) для задания краткого имени и параметр -tags (-T) для указания списка тегов, разделенных запятой. Для открытия существующей закладки используется команда :bmarks, которую мы повесили на s, а открытие закладки в новой выкладке — :bmarks! (S). Здесь также можно указывать теги. Поскольку названия параметров и тегов автоматически подсказываются и дополняются, то работать с данным интерфейсом закладок — одно удовольствие.

Краткие имена (smart keywords) в Vimperator работают так же хорошо, как и в Firefox. И даже лучше! Лучше, потому что краткие имена и ранее введенные запросы автоматически дополняются.

Например, добавив закладку с параметром -keyword yur и заменив место запроса символами %s

:bmark -title="Украинский → Русский (Yandex Словари)" http://lingvo.yandex.ru/%s/с%20украинского/ -keyword yur

можно переводить с украинского на русский Lingvo-словарями таким образом:

:open yur печиво

Или с помощью Google Translate с английского на немецкий после добавления следующего краткого имени

:bmark -title="English → German" (Google Translate) http://translate.google.com.ua/#en|de|%s -keyword teg

можно производить перевод так:

:open teg drainpipe

Если при создании закладок указывать краткое имя без %s, то получается нечто похожее на quick marks, с тем отличием, что краткие имена работают с интерфейсами :open, :tabopen и подобными.

Быстрые закладки сохраняются в ~/.vimperator/info/[profile]/quickmarks, а локальные — в local-marks того же каталога в формате JSON.

Макросы

Клавиатурные макросы записываются по клавише q, затем нажимается клавиша в диапазоне [0-9a-z], на которую будет повешен макрос. Все последующие нажатия на клавиши будут записываться, пока снова не будет нажата q. Чтобы добавить действия к существующим макросам [a-z], после q необходимо нажать [A-Z]. Воспроизведение макросов происходит по @[0-9a-z]. Последний выполненный макрос можно повторить, нажав @@. Перед командой воспроизведения макроса можно задать количество повторов, например 5@a.

Пример макроса. Чтобы, находясь на странице Википедии, перейти к английской версии статьи, со следующим макросом

:qe/\lEnglish<Return><Return>q

достаточно нажать @e. Здесь \l значит, что поиск нужно производить только по ссылкам. Безусловно, существует вероятность, что первая ссылка со словом English будет не на статью в Википедии.

После записи макросов они автоматически сохраняются в ~/.vimperator/info/[profile]/macros.

Группы вкладок

В Firefox 4 появились группы вкладок, позволяющие группировать вкладки подобно тому, как оконные менеджеры группируют окна по рабочим столам. В Vimperator есть интерфейс работы с группами вкладок. Все операции выполняются с помощью одной команды — :tabgroups. После нее следует одна из подкоманд: add (добавить группу), list (вывести список групп), pulltab (перетащить вкладку в текущую группу), pushtab (перетащить текущую вкладку в другую группу), remove (удалить группу вместе со всеми вкладками), switch (переключиться на группу). Из коробки работают сочетания <C-S-n> для переключения на следующую группу и <C-S-p> — на предыдущую. Для более комфортной работы с группами вкладок я добавил следующие сочетания:

Создать новую группу (аналог создания новой вкладки t):

:map <C-S-T> :tabgroups<Space>add<Space>

Сразу же после <C-S-T> можно ввести имя новой группы и нажать <Return>. Если сразу нажать <Return>, создастся группа без имени.

Удалить текущую группу со всеми вкладками по <C-S-D>:

:map <C-S-D> :tabgroups<Space>remove<CR>

Переключиться на определенную группу с помощью <C-S-B> (аналог переключения вкладки b:

:map <C-S-B> :tabgroups<Space>switch<Space>

Перетаскиваем текущую вкладку в существующую группу с помощью <C-S-U>:

:map <C-S-U> :tabgroups<Space>pushtab

Чтобы создать новую группу и перетащить туда текущую вкладку после pushtab ставим знак восклицания !.

Графический интерфейс

С интерфейсом пользователя, который предоставляет Vimperator, практически все стандартные графические элементы Firefox'а перестают быть нужными. Чтобы удалить все панели достаточно установить gui в none:

:set gui=none

Переменная gui содержит в себе список значений, которыми могут быть элементы all, none, addons, bookmarks, menu, navigation, tabs. Каждое значение панели может иметь приставку no (например, noaddons), устанавливаемое с целью удаления элемента, и inv — для его добавления или удаления в зависимости от предыдущего состояния. Например, чтобы отображать все, кроме закладок, можно установить :set gui=all,nobookmarks, а для отображения исключительно вкладок: :set gui=none,tabs. Если изредка необходимо воспользоваться панелью навигации, то можно повесить ее появление/исчезновение на <F9>:

:map <F9> :set<Space>gui=invnavigation<Return>

К сожалению, нет интерфейса по добавлению поисковых движков, основное преимущество которых перед краткими именами в наличии подсказок. Поэтому добавление новых поисковых движков и задание им алиасов (кратких имен) возможно только через стандартный интерфейс Firefox'а (через панель поиска). Для этого мы и определили <F9>.

Чтобы при большом количестве вкладок они не прокручивались, а сжимались, нужно добавить этот код в ~/.vimperatorrc:

:js styles.addSheet(false, "mintabwidth", "chrome://*", ".tabbrowser-tab[fadein]:not([pinned]) { min-width: 16px !important; } .scrollbutton-up, .scrollbutton-down { display:none; }");

Данное поведение было по умолчанию в Vimperator 3.1.

Чтобы легче переключаться между вкладками, можно включить отображение номеров на вкладках:

:set tabnumbers

Доступ к настройкам, расширениям и загрузкам Firefox'а осуществляется командами :preferences, :addons и :downloads соответственно. Все стандартные диалоги Firefox'а (такие как печать, открытие файла, информация о странице) вызываются при помощи команды :dialog. Пункты меню можно вызывать командой :emenu. Отображение боковой панели производится командой :sidebar, а закрытие — :sbclose.

Другие полезные настройки

Тот, кто не любит пищащие программы, как я, могут заменить звуковое оповещение визуальным:

:set visualbell

Внешний редактор можно указать через переменную editor. По умолчанию она установлена в gvim\ -f. Пользователи Emacs, наверное, хотят установить ее примерно в следующее значение:

:set editor=emacsclient\ -c\ -a\ \"\"

Если :open указать нечто, что не похоже ни на URL, ни на краткое имя, ни на поисковый движок, то запрос будет направлен в поисковик, который устанавливается переменной defsearch (google по умолчанию). Чтобы отключить данное поведение, просто сбрасываем эту переменную:

:set defsearch=

За то, из каких источников производить дополнение во время ввода запроса в :open, отвечает переменная complete. По умолчанию она установлена в slf, что соответствует дополнению по поисковым движкам и кратким именам (s), стандартным дополнениям Firefox'а в панели навигации (закладки и история, отсортированные хитрым образом) (l), локальным файлам (f) в указанном порядке. Также в качестве дополнений доступны подсказки из поисковиков, указанные в defsearch (S), история (h), закладки (b) и открытые вкладки (t).

Максимальная длина истории команд составляет 500 по умолчанию. Чтоб изменить данное значение, необходимо установить переменную history. За количество отображаемых элементов в списке отвечает переменная maxitems (20 по умолчанию).

Чтобы посмотреть значение какой-либо переменной, необходимо выполнить :set variable?, а для вывода всех переменных, чье значение отлично от стандартных, достаточно выполнить команду :set без параметров.

Плагины

Vimperator имеет свою систему плагинов. Они имеют расширения *.js и складываются в папку ~/.vimperator/plugin/, откуда автоматически загружаются сразу после ~/.vimperatorrc. Чтобы загрузить новые плагины без перезапуска браузера, достаточно выполнить :loadplugins или :source file.

Здесь можно найти около полторы сотни плагинов с очень краткими описаниями. Мне приглянулись caret-hint и hints-yank-paste, которые позволяют с помощью хинтов перемещать каретку в конец/начало параграфа/заголовка/ пр., выделять, копировать и вставлять текст.

Альтернативы

До Vimperator'а я достаточно долгое время пользовался менее известным расширением для Firefox Keysnail. Данное расширение во многом пытается быть похожим на Emacs. Конфигурируется при помощью кода на JavaScript, имеет систему плагинов. Даже такие базовые вещи, как хинтинг, выделены в отдельные расширения. Для людей, знающих JavaScript и готовых «конфигурировать», а также точно знающих, что они хотят, вариант вовсе неплохой. В то время как Vimperator очень хорошо работает из коробки с изначально хорошо продуманным интерфейсом.

Другая альтернатива — Conkeror. Это полноценный браузер, основанный на XULRunner, написанный на JavaScript, и вдохновленный главным образом Emacs. Конфигуриуется Программируется при помощи JavaScript. Несмотря на то, что это уже не Firefox, некоторые его расширения совместимы с Conkeror, в частности AdBlock Plus. Но, бо́льшая часть плагинов, скорее всего, не заработает в Conkeror. Данный браузер обладает менее эргономичными сочетаниями клавиш по умолчанию (унаследованными от Emacs), чем Vimperator. Например, чтоб удалить текущий буфер (закрыть вкладку), в Vimperator нужно нажать d, а в Conkeror — C-x k RET. Благо, это легко исправить. Некоторым командам можно передавать аргумент по C-u. Также работают C-g, C-n, C-p, C-s, C-r, C-h k, C-h i и много других стандартных сочетаний Emacs.

Несмотря на то, что я Conkeror'ом очень недолго пользовался, некоторые фичи мне успели понравиться. Одна из них — поиск всегда производится с первой строки, которая отображается на экране. Странно, но ни Firefox, ни Vimperator, ни Keysnail еще к этому не пришли. Второе — легкое копирование абзацев и других блоков с помощью хинтинга на основе нодов DOM (**c) (в принципе это доступно и в Vimperator'е посредством плагина hints-yank-paste). Существуют режимы страниц (page mode) для конкретных веб-сайтов. Режимы добавляют дополнительные действия, специфичные для того или иного сайта и вешают их на сочетания клавиш. Но готовых режимов, к сожалению, не так уж много.

Полезные ссылки

Главная страница Vimperator: http://vimperator.org/

Страница для разработчиков: http://code.google.com/p/vimperator-labs/

Плагины и rc-файлы: http://vimpr.github.com/

И не забывайте про :help.


  1. Пожалуй, самое главным изменение — Vimperator 3 стал намного меньше пищать. 

Комментарии

RSS
Здесь можно Markdown