Меню:


Поддержка Mercurial в Emacs реализуется несколькими пакетами, обеспечивающих разные уровни поддержки. В поставке Mercurial идет пакет mercurial.el, обеспечивающий родную (native) поддержку системы Mercurial. Кроме того, имеется пакет aHg, который также обеспечивает работу с Mercurial. Оба этих пакета описаны в данном разделе.

Также поддержка Mercurial может обеспечиваться соответствующими модулями из пакетов DVC и VC, которые реализуют единообразный подход к работе с разными системами контроля версий. Эти пакеты описаны в соотствующих разделах данной статьи.

Mercurial.el

Установка и настройка пакета

Для установки пакета необходимо скопировать его из каталога contrib дистрибутива Mercurial в то место, где его сможет найти Emacs, и прописать в файле инициализации следующую команду1:

(require 'mercurial)

Работа с пакетом

Принципы работы mercurial.el во многом аналогичны работе пакета VC (стоит отметить, что поддержка Mercurial имеется и в VC) и используют те же самые привязки клавиш, что и пакет VC. mercurial.el — вспомогательный режим, который добавляет некоторое количество команд для выполнения основных задач при работе с репозиториями.

Часть команд пакета имеет глобальные привязки клавиш (по умолчанию это С-с h, но может быть и изменено в настройке), а часть команд доступна только внутри буфера, в котором включен режим hg-mode. При этом, для многих команд можно также задать префиксный аргумент, который позволит задать дополнительные параметры в интерактивном режиме. Справку по командам и привязкам клавиш пакета можно получить с помощью команды hg-help-overview (С-с h р).

Чтобы просмотреть изменения, сделанные в процессе работы, пользователь может использовать либо команду hg-diff (С-x v =), которая показывает изменения для текущего файла, либо команду hg-diff-repo (С-с h =), которая показывает изменения для всего репозитория. Обе этих команды, открывают дополнительный буфер, в котором и отображаются изменения. Чтобы закрыть этот буфер используйте клавишу q.

Подтверждение изменений осуществляется командой hg-commit-start, которая имеет две привязки клавиш: локальную — С-x v n и глобальную — С-с h c. При выполнении этой команды, mercurial.el создает новый буфер, в котором пользователь может ввести текст сообщения, которое будет записано в журнал изменений. Кроме текста пользователя, в нижней части буфера отображается список файлов, изменения для которых будут подтверждены. По умолчанию, это все файлы, но пользователь может изменить этот список путем перемещения курсора на имя файла и изменения признака выбора (жирный шрифт) с помощью клавиш SPC или RET, или с помощью средней кнопки мыши. На рисунке ниже можно увидеть пример работы с этим буфером, при подтверждении изменений.

В буфере, созданном при выполнении команды hg-commit-start включается отдельный режим, имеющий название hg-commit-mode. Для него определено несколько сочетаний клавиш, которые могут быть использованы пользователем. C-c C-c, так же как и во многих других пакетах, производит операцию подтверждения изменений в репозиторий, используя введенный пользователем текст. Сочетание C-c C-k прерывает процесс подтверждения изменений. А сочетание С-x v = позволяет выполнить просмотр подтверждаемых изменений.

Для отмены сделанных изменений можно также воспользоваться одной из двух команд: hg-revert-buffer (С-x v u) откатывает изменения только для текущего файла, а команда hg-revert (С-с h U) проделывает то же самое для всех измененных файлов в репозитории.

Для добавления файла в репозиторий можно воспользоваться командой hg-add (С-с h a). По умолчанию, она добавляет в репозиторий текущий файл, но если ей задать префиксный аргумент, то она запросит имя файла, который необходимо добавить в репозиторий. Функция hg-forget (С-с h f) (она еще не реализована полностью) предназначена для отмены добавления файла в репозиторий, если вы еще не выполнили команду подтверждения изменений, что бывает полезно в некоторых случаях.

Чтобы посмотреть статус файлов в репозитории, можно воспользоваться командой hg-status (С-с h s), но в отличии от других пакетов, пользователю не разрешается выполнять какие либо операции с полученными данными. Для просмотра истории изменений конкретного файла определена команда hg-log (С-x v l). Аналогичная команда для просмотра истории изменений репозитория называется hg-log-repo (С-с h l). Также, определена и команда hg-annotate (С-с h a), которая должна показывать файл, с указанием того, в какой версии что менялось, но пока эта функция полностью не реализована.

Кроме этих базовых операций, пакет также предоставляет набор основных операций для работы с ветками и удаленными репозиториями. Команда hg-incoming (С-с h ,) позволяет просмотреть список изменений в удаленном репозитории, которые отсутствуют в текущем репозитории, а команды hg-pull (С-с h <) и hg-update (С-с h u), соответственно, скачать изменения, и применить их к текущему репозиторию. Команды hg-outgoing (С-с h .) и hg-push (С-с h >) позволяют просмотреть какие изменения присутствуют в текущем репозитории, но отсутствуют в удаленном, и поместить их туда (push).

Настройка пакета

Настройка пакета осуществляется с помощью стандартных средств Emacs. Группа настройки называется mercurial. Пользователь может, например, изменить префикс для глобальных привязок клавиш, используемых некоторыми командами (по умолчанию — C-c h).

Пользователь для настройки поведения пакета может воспользоваться несколькими хуками, которые будут вызываться в определенные моменты работы пакета. hg-commit-mode-hook будет вызываться после создания буфера, отображаемого пользователю перед подтверждением изменений. В свою очередь hg-pre-commit-hook вызывается после того, как пользователь введет сообщение для журнала изменений, и перед тем, как будет выполнено подтверждение изменений в репозитории. hg-log-mode-hook вызывается после создания буфера, заполненного информацией из журнала изменений при вызове команд hg-log-repo и hg-log. И конечно, пользователь может определить hg-mode-hook, который будет выполнен в процессе включения hg-mode для данного буфера.

Пакет aHg

Пакет aHg, написанный Alberto Griggio, реализует простой, но достаточно мощный интерфейс для работы с Mercurial из Emacs. Пакет реализует поддержку не только основных команд, используемых при работе с Mercurial (commit, diff, log, status и т.д.), но и работу с очередями. Кроме того, пользователь может выполнить произвольную команду Mercurial из Emacs.

Установка и настройка

Установка пакета проста — необходимо скачать исходный текст (достаточно одного файла ahg.el из репозитория), поместить указанный файл в каталог, где его найдет Emacs, и добавить в файл инициализации строку

(require 'ahg)

которая выполнит загрузку пакета при запуске Emacs.

Настройка пакета производится с помощью стандартных средств Emacs (команда customize-group). Группа настройки называется ahg. Пользователь может выполнить настройку начертаний, используемых пакетом, задать различные опции, влияющие на выполнение команд, а также изменить глобальное префиксное сочетание клавиш, используемое для вызова команд ahg (по умолчанию это C-c h g). Однако стоит отметить, что значения по умолчанию достаточно разумны, и в первое время пользователю не потребуется что-то менять.

Для своей работы пакет может создавать новые буфера, в которых действуют специальные режимы, и пользователю предоставляется возможность настройки поведения пакета в этих буферах, используя различные хуки: ahg-status-mode-hook для буфера статуса, ahg-log-mode-hook и ahg-short-log-mode-hook для буферов просмотра журнала изменений, и ahg-diff-mode-hook для буфера, используемого для показа изменений в файле.

Использование пакета

Выполнение команд пакета может производиться различными способами — используя привязки клавиш, прямое выполнение команд через M-x команда, а также через подменю aHg основного меню Tools, которое содержит основные команды, необходимые пользователю. Многие команды создают отдельные буфера, в которых действуют специальные основные режимы, а также имеющие отдельные меню для выполнения основных действий.

Также как и во многих других пакетах для работы с системами управления версиями, основная работа в aHg проводится из буфера статуса, который создается командой ahg-status (C-c h g s). Пользователь может выполнить ее и используя пункт меню Status из меню aHg.

Созданный буфер (он показан на рисунке ниже) имеет название *hg status: путь_к_проекту*, так что вы можете одновременно работать с разными репозиториями. В данном буфере действует режим ahg-status-mode, который определяет некоторое количество команд для работы с объектами в репозитории. Команды могут выполняться используя комбинации клавиш (многие из которых совпадают с клавишами, используемыми в других пакетах), или меню aHg Status, которое появляется при создании буфера.

Операции в буфере статуса могут выполняться как с отдельными файлами, так и с группами отмеченных файлов. Отметка на файл ставится клавишей m (команда ahg-status-mark), а снимается клавишей u (ahg-status-unmark). Кроме того, пользователь может использовать клавишу SPC (ahg-status-toggle-mark) для переключения пометки на текущем файле. А снять пометку со всех файлов можно с помощью сочетания клавиш M-DEL (ahg-status-unmark-all). Обновить буфер статуса можно нажав клавишу g или вызвав команду ahg-status-refresh.

Пользователь может управлять показом содержимого в буфере статуса. Для этого определен достаточно большой набор команд, начинающихся с префисной клавиши s:

сочетание команда действие
s A ahg-status-show-all показать все файлы
s a ahg-status-show-added показать только добавленные файлы
s c ahg-status-show-clean показать неизмененные файлы
s d ahg-status-show-deleted показать удаленные файлы
s i ahg-status-show-ignored показать игнорируемые файлы
s m ahg-status-show-modified показать измененные файлы
s r ahg-status-show-removed показать файлы, отмеченные для удаления
s u ahg-status-show-unknown показать неизвестные файлы

Добавление новых файлов в репозиторий производится с помощью команды ahg-status-add (клавиша a), а удалить файл можно с помощью клавиши r (ahg-status-remove). При этом пользователь может просмотреть текущий файл в текущем окне нажав клавишу RET или f, которые вызывают команду ahg-status-visit-file. А чтобы открыть файл в другом окне, предусмотрена команда ahg-status-visit-file-other-window (клавиша o).

Работа с изменениями

Подтверждение изменений текущего или отмеченных файлов производится с помощью клавиши c (ahg-status-commit), при этом создается новый буфер в котором пользователь может ввести описание изменения, и подтвердить свое решение нажав C-c C-c. Для подтверждения изменений только для текущего файла, пользователь может также использовать команду ahg-commit-cur-file (C-c h g c). Однако отмена сделанных изменений может быть выполнена только из буфера статуса с помощью команды ahg-status-undo (клавиша U).

А для просмотра изменений пакет определяет сразу несколько команд. Для того, чтобы увидеть список изменений для выбранного файла в буфере статуса, вам необходимо нажать клавишу = (ahg-status-diff). А для просмотра всех изменений в репозитории можно воспользоваться командой ahg-status-diff-all (клавиша D). Кроме того, вы можете получить список изменений для текущего буфера с помощью команды ahg-diff-cur-file (C-c h g =).

Все эти команды открывают новый буфер (пример можно увидеть на рисунке ниже) в котором действует специальный режим ahg-diff-mode, который является расширением стандартного режима diff-mode, так что пользователь может воспользоваться всеми его командами для перемещения между отдельными изменениями, перехода к соответствующим изменениям в файле и т.п. Чтобы покинуть этот буфер нужно лишь нажать клавишу q.

Просмотр журнала изменений

Для работы с журналами изменений в пакете aHg определено несколько команд. В основном они отличаются друг от друга форматом выдачи данных. Так, нажатие l в буфере статуса приведет к выполнению команды ahg-status-short-log, которая выводит данные в сжатой форме (пример приведен на рисунке ниже). Аналогичные результаты можно получить выполнив команду ahg-short-log которая связана с глобальным сочетанием клавиш C-c h g l.

Чтобы получить более детальное описание изменений, пользователь может воспользоваться командами ahg-status-log (клавиша L в буфере статуса) или ahg-log (C-c h g L). При использовании этих команд, результаты отображаются более подробно, в стиле вывода команды hg log, но кроме того, включают в себя информацию о тагах, связанных с конкретными изменениями, а также список файлов, измененных в конкретном изменении. Подробный формат вывода информации также используется и командой ahg-log-cur-file (C-c h g C-l), которая выводит журнал изменений для текущего буфера.

Все эти команды создают новые буфера, в которых действуют режимы ahg-short-log — для сжатого формата выдачи информации, и ahg-log — для подробной выдачи информации. Оба режима определяют набор команд, незначительно отличающихся друг от друга2. Клавиши n и p исполшьзуются для перемещения между следующим и предыдущим изменениями, s приводит к созданию буфера статуса, g обновляет журнал изменений, а q приводит к окончанию работы.

Чтобы получить список сделанных изменений пользователь может воспользоваться клавишей =, которая создаст буфер только с изменениями, сделанными в конкретной версии. А чтобы получить список изменений между двумя произвольными версиями, пользователь переместиться на нужное ему изменение, нажать D, и ввести номер другого изменения, относительно которого будет выполняться сравнение.

Работа с очередями патчей

Отдельный набор команд определен для работы с очередями патчей, реализованных в Mercurial. Все команды из этого набора имеют глобальную привязку имеющую префикс C-c h g Q, или, если они выполняются в буфере статуса, то префиксной клавишей является Q. При описании команды я буду давать только локальное сочетание клавиш, но вы всегда можете вызвать нужную команду использовав глобальную привязку для данной команды.

Новый патч создается с помощью команды ahg-qnew (Q n при выполнении из буфера статуса), которая запрашивает у пользователя имя патча и выполняет соответствующую команду Mercurial. Обновить текущий патч можно с помощью команды ahg-qrefresh (Q r). Просмотр содержимого текущего патча можно осуществить с помощью команды ahg-qdiff (Q =). Кроме того, текущий патч можно сконвертировать в набор изменений Mercurial с помощью команды ahg-mq-convert-patch-to-changeset (Q c).

Остальные реализованные команды используются для управления набором примененных патчей и т.п. Команда ahg-mq-list-patches (Q l) выводит список существующих патчей, а с помощью команды ahg-qtop (Q t) можно узнать имя текущего патча. С помощью команды ahg-qgoto (Q g) можно поместить нужный патч на вершину стека патчей, а с помощью команды ahg-qpop-all (Q p) производится очистка стека патчей. Полностью удалить патч из очереди можно с помощью команды ahg-qdelete (Q d).

Прочие команды

Кроме описанных выше команд, пользователь может также выполнить произвольную, не реализованную пакетом, команду Mercurial для текущего репозитория. Это делается с помощью команды ahg-do-command (C-c h g ! или ! в буфере статуса). Пользователю необходимо будет ввести в мини-буфере имя команды (можно воспользоваться механизмом дополнения имен) и он получит результат выполнения в отдельном окне.

Пользователь также может получить справку о конкретной команде Mercurial воспользовавшись командой ahg-command-help (C-c h g h или h в буфере статуса). Как и в предыдущем случае, пользователь может использовать механизмы дополнения для ввода имени команды.


1. Самую последнюю версию пакета mercurial.el можно взять из репозитория, ссылка на который указана на странице Emacs WiKi, посвященной Mercurial.

2. Разница между этими двумя режимами заключается в том, что в режиме вывода краткой информации, пользователь может нажать RET или SPC (ahg-short-log-view-details) для получения списка файлов и прочей информации. А в режиме вывода полной информации, пользователь может использовать клавишу TAB для перемещения к следующему изменению.

Last change: 05.03.2013 16:54

blog comments powered by Disqus