Это немного шире, чем то, что просил OP, но для людей, не желающих использовать плагины и, возможно, другие системы контроля версий, этот небольшой фрагмент имеет тенденцию работать довольно хорошо:
:new
:r! git show branch:file
:1d
Он создает новое окно и показывает там файл, считывая вывод данной команды в новый буфер. Это, конечно, работает с любой внешней командой, а не только с git.
Пример для bzr (где синтаксис REV может указывать ветку):
:new
:r! bzr cat -r REV file
:1d
Пример для hg (не уверен насчет веток в hg; не используйте его достаточно)
:new
:r! hg cat -r REV file
:1d
Пример для SVN (
:new
:r! svn cat file@REV
:1d
Вы все еще, вероятно, захотите установить тип файла для подсветки синтаксиса, как в сообщениях SO, но, по крайней мере, вам не нужно возиться с трубопроводами.
Открыв его, вы можете сохранить его под новым именем с помощью :w filename
или :saveas filename
, поскольку у Vim еще не будет имени файла. Если вы не хотите иметь возможность редактировать его, вы также можете добавить :setlocal readonly
и и / или :setlocal nomodifiable
.
Редактировать: Автоматический тип файла
Это немного больше работы, но вы можете попросить Vim угадать тип файла с
:filetype detect
Но, поскольку у Vim еще нет имени, это не всегда работает хорошо (например, я вытащил некоторый C-код, и он догадался filtype=conf
.
Мы можем дать ему имя, сохранив его, но мы не хотим перезаписывать возможно существующий файл. Мы также можем просто установить имя файла (Спасибо @PeterRincker!), Но опять же, мы не хотим рисковать коллизиями. Так как маловероятно, что существует файл, который является как отчеством, так и именем файла вместе, мы объединяем их с некоторым произвольным разделителем
:exe "silent file " . "branch" . "-" . "file"
:filetype detect
Где "file"
заменяется фактическим именем файла и "branch"
именем ветви
Конечно, на данный момент мы почти пишем плагин ;-)
Подводя итог всему этому, вот как специфическая функция git, которую вы можете добавить в свой vimrc:
function! GitFile(branch,file)
new
exe "silent r! git show " . a:branch . ":" . a:file
1d
exe "silent file " . a:branch . "-" . a:file
filetype detect
setlocal readonly "don't allow saving
setlocal nomodified "allow easy quitting without saving
setlocal nomodifiable "don't allow modification
endfunction
который вы можете заключить в команду или вызвать непосредственно, например call GitFile("whateverBranch","myfile.c")
. Вы получите новое окно с буфером с именемwhateverBranch-myfile.c