Есть ли способ поставить в очередь много пар файлов для сравнения с vimdiff? - PullRequest
1 голос
/ 25 марта 2011

У меня есть несколько десятков файлов, которые мне нужно сравнить и объединить с vimdiff.Есть ли способ поставить в очередь пары файлов для сравнения, чтобы я мог открыть их все сразу, а не возвращаться в оболочку снова и снова, чтобы открывать каждую пару файлов?

Можно ли это сделать, открыв каждыйпара в своей вкладке?Моя оболочка - Баш.

Ответы [ 5 ]

1 голос
/ 27 декабря 2018

Это выполнимо без каких-либо изменений в оболочке, установив все параметры diffy глобально (вместе с некоторыми автокомандами, потому что vim разозлится, если вы попытаетесь разнести более 8 файлов одновременно)

vim -c 'windo set diff scrollbind cursorbind scrollopt+=hor nowrap foldmethod=diff foldcolumn=2 | au BufWinEnter * setlocal diff | au BufWinLeave * setlocal nodiff' -O2 your filenames here

Это будетоткройте все ваши файлы в буферах и разделите по вертикали vim на два окна (используйте -o2, если вы хотите горизонтальный), и всегда переходите в режим сравнения, даже если вы переключаетесь между буферами или открываете новые файлы.

ЕслиВы объединяете все свои файлы в один суперфайл, и тогда вам будет удобно использовать :bn.

Если вы объединяете пары файлов, то вам понадобятся некоторые варианты :windo bn N, где N зависит от того, как вы перечислили свои файлы:

  • Для A1 A2 B1 B2 C1 C2, :windo bn 2 будет действовать правильно
  • Для A1 B1 C1 A2 B2 C2 вам понадобитсясначала перейти в буфер A2, а затем :windo bn 1 сделает все правильно

Я извлек настройки из файла справки :

В каждом из отредактированных файлов установлены следующие параметры:

'diff'    on
'scrollbind'  on
'cursorbind'  on
'scrollopt' includes "hor"
'wrap'    off
'foldmethod'  "diff"
'foldcolumn'  value from 'diffopt', default is 2

Эти параметры устанавливаются локально для окна.При редактировании другого файла они сбрасываются до глобального значения.

И только эмпирически обнаружили необходимость бессмысленной автокоманды.

1 голос
/ 13 марта 2015

Если вы хотите сравнить все файлы в каталоге друг с другом в во всех комбинациях , вот как это сделать, и все же избегайте сравнения пары дважды (или файла с самим собой):

for f1 in *; do 
  for f2 in *; do 
    [[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
  done
done
1 голос
/ 25 марта 2011

Подобно тому, как СтивенПолгер предположил, что цикл for хорошо подойдет для небольшого числа файлов.Я бы хотел создать небольшой скрипт (скажем, do.sh) со следующим содержимым:

#!/bin/bash

files1=( file1.txt file1_.txt )
files2=( file2.txt file2_.txt )
for i in {0..1} ; do
  vimdiff ${files1[i]} ${files2[i]}
done

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

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

if &diff
   map <f4> :qa<cr>
   map <f5> :wqa!<cr>
   map <f6> :qa!<cr>
 endif

затем, если изменений нет, просто нажмите f4 для выхода, если есть изменения, нажмите f5.

1 голос
/ 25 марта 2011

Вот еще один ответ, который открывает каждую пару в отдельной вкладке. Сохраните еще раз в файле (do2.sh):

#!/bin/bash

files1=( file1.txt file2.txt file3.txt )
files2=( file1_.txt file2_.txt file3_.txt )

cmd="vim -c 'set diffopt=filler,vertical' -c 'edit ${files1[0]}' -c 'diffsplit ${files2[0]}' "
echo $cmd
for i in {1..2}; do
  cmd="${cmd} -c 'tabe ${files1[i]}' -c 'diffsplit ${files2[i]}' "
done

eval $cmd

при запуске он откроет пары в своей вкладке.

1 голос
/ 25 марта 2011

Насколько я знаю, вы не можете сделать это с помощью одной команды vim. Вы можете запустить vimdiff из цикла for.

Или попробуйте "meld" http://meld.sourceforge.net/

...