Vim - показывать diff при коммитах в Mercurial; - PullRequest
4 голосов
/ 04 ноября 2011

В моем .hgrc я могу предоставить редактор или команду для запуска редактора с параметрами при фиксации.

Я хочу написать метод или псевдоним, который запускает $ hg ci, он не только открываетсясообщение вверх в Vim, но также разделило бы окно и там распечатало $ hg diff.

Я знаю, что могу дать параметры vim с помощью опции +{command}.Таким образом, запуск $ vim "+vsplit" делает разделение, но любые другие опции идут в первое открытое окно.Поэтому я предполагаю, что мне нужна определенная функция, но у меня нет опыта в написании моих собственных скриптов Vim.

Скрипт должен:

  • Открыть новое вертикальное разбиение с пустым буфером (с vnew возможно)
  • При запуске пустого буфера :.!hg diff
  • Установить тип файла пустого буфера как diff :set ft=diff

Я написал такую ​​функцию:

function! HgCiDiff()
    vnew
    :.!hg diff
    set ft=diff
endfunction

И в .hgrc я добавил опцию: editor = vim "+HgCiDiff()"

Это вроде работает, но я хотел бы, чтобы разделенное окно было в правой части (теперь оно открываетсяв левом) и ртутное сообщение будет сосредоточено окно.Также :wq может быть установлено как временное сочетание клавиш :wq<CR>:q! (при условии, что фокусируется ртутное сообщение).

Есть предложения, чтобы сделать это немного более полезным и менее коротким?

ОБНОВЛЕНИЕ: Я нашел Vim Split Guide , поэтому изменение vnew с помощью rightbelow vnew открывает diff на правой стороне.

Ответы [ 4 ]

5 голосов
/ 04 ноября 2011

Итак, я расширил свой код:

function! HgCiDiff()
    "In .hgrc editor option I call vim "+HgCiDiff()"
    "It opens new split with diff inside
    rightbelow  vnew
    :.!hg diff
    set ft=diff
    saveas! /tmp/hgdiff.txt
    execute "normal \<c-w>w"
endfunction

Все же он пропустил :wq отображение как :wqa, но использование :wqa не так уж сложно.

Источники моего vimrc находятся здесь: http://hg.jackleo.info/vim-configs/src/08df5cb9d143/vimrc
Источники моей hgrc находится здесь: http://hg.jackleo.info/home-configs/src/22f5fb47a7d2/.hgrc

Обновление: по предложению Рэнди Морриса Я обновил свой код и теперь он работает так, как я хотел. Спасибо! Также добавлено несколько дополнительных функций с течением времени.

function! HgCiDiff()
    "In .hgrc editor option I call vim "+HgCiDiff()"
    "It opens new split with diff inside
    rightbelow  vnew
    setlocal buftype=nofile
    :.!hg diff
    setlocal ft=diff
    wincmd p
    setlocal spell spelllang=en_us
    cnoremap wq wqa
    cnoremap q qa
    start
endfunction
3 голосов
/ 04 ноября 2011

Редактировать

Хм, я думаю, что это может быть не тем, что вы после второго чтения. Я так понимаю, вы хотите многофайловую (унифицированную) разн. Я бы действительно использовал инструмент пользовательского интерфейса с поддержкой hg и отдельный редактор vim для сообщения коммита. Извините за это.

Я оставлю «оригинальный» стенд ответов, если вы еще не знали VCSCommand + Hg + Vim:

Мое оружие выбора - абстрагироваться от всего этого

vcscommand.vim: Плагин интеграции CVS / SVN / SVK / git / hg / bzr

Вы бы

:VCSVimDiff

для сравнения с версией репо (также с Leader c v )

:VCSVimDiff <revid>

для сравнения с конкретной ревизией.

1 голос
/ 20 марта 2013

Вот мой вариант, основанный на версиях Мариуса Гедминаса и ДжекЛео:

function! HgCiDiff()
    " find files that were changed (not interested in added or deleted)
    let changed_files = []
    let pattern = '\vHG: changed \zs(.+)\ze'
    while search("HG: changed", "W") > 0
        let line_text = getline(line("."))
        call add(changed_files, matchstr(line_text, pattern))
    endwhile
    let diff_cmd = "hg diff " . join(changed_files, " ")
    " Reset cursor to beginning of the buffer
    call cursor(1, 1)
    rightbelow vnew
    setlocal buftype=nofile
    let diff_output = system(diff_cmd)
    call append(0, split(diff_output, "\n"))
    " Reset cursor to beginning of the buffer
    call cursor(1, 1)
    setlocal ft=diff
    wincmd p
    setlocal spell spelllang=en_us
    cnoremap wq wqa
    cnoremap q qa!
    startinsert
endfunction
1 голос
/ 08 июля 2012

Мое решение состоит из трех файлов vim. Он не требует изменений конфигурации hg, а показывает только разницу для файлов, которые вы фиксируете, если вы использовали hg commit file1 file2:

~ / .vim / ftdetect / hg.vim

au BufRead,BufNewFile /tmp/hg-editor-*.txt set filetype=hg

~ / .vim / синтаксис / hg.vim

" Vim syntax file
" Language: hg commit file
" Maintainer:   Marius Gedminas <marius@gedmin.as>
" Filenames:    /tmp/hg-editor-*.txt
" Last Change:  2012 July 8

" Based on gitcommit.vim by Tim Pope

if exists("b:current_syntax")
  finish
endif

syn case match
syn sync minlines=50

if has("spell")
  syn spell toplevel
endif

syn match   hgComment   "^HG: .*"

hi def link hgComment       Comment

let b:current_syntax = "hg"

~ / .vim / ftplugin / hg.vim

" Show diff while editing a Mercurial commit message
" Inspired by /4485939/vim-pokazyvat-diff-pri-kommitah-v-mercurial
" and Michael Scherer' svn.vim

function! HgCiDiff()
    let i = 0
    let list_of_files = ''

    while i <= line('$') && getline(i) != 'HG: --'
        let i = i + 1
    endwhile
    while i <= line('$')
        let line = getline(i)
        if line =~ '^HG: \(added\|changed\)'
            let file = substitute(line, '^HG: \(added\|changed\) ', '', '')
            let file = "'".substitute(file, "'", "'\''", '')."'"
            let list_of_files = list_of_files . ' '.file
        endif
        let i = i + 1
    endwhile

    if list_of_files == ""
        return
    endif

    pclose
    new
    setlocal ft=diff previewwindow bufhidden=delete nobackup noswf nobuflisted nowrap buftype=nofile
    silent exec ':0r!hg diff ' . list_of_files
    setlocal nomodifiable
    goto 1
    redraw!
    " nooo idea why I have to do this
    syn enable
endfunction

call HgCiDiff()
...