3

比較してvimdiffとマージする必要のあるファイルが数十個あります。シェルに何度も戻ってファイルの各ペアを開くのではなく、一度にすべてを開くことができるように、比較のためにファイルのペアをキューに入れる方法はありますか?

これは、各ペアを独自のタブで開くことで実行できますか?私のシェルはBashです。

4

5 に答える 5

2

ディレクトリ内のすべてのファイルをすべての組み合わせで相互に比較する場合は、次の方法でペアを2回(またはファイル自体と)比較しないようにする方法を説明します。

for f1 in *; do 
  for f2 in *; do 
    [[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
  done
done
于 2015-03-13T13:42:11.603 に答える
2

これは、すべてのdiffyオプションをグローバルに設定することで、シェルシェナニガンなしで実行できます(一度に8つ以上のファイルをdiffしようとすると、vimが怒るので、いくつかの自動コマンドもあります)

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が2つのウィンドウに垂直に分割され(-o2水平が必要な場合に使用)、バッファーを切り替えたり新しいファイルを開いたりしても、常に差分モードになります。

すべてのファイルを1つのスーパーファイルにマージする場合は、を使用: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

これらのオプションは、ウィンドウに対してローカルに設定されます。別のファイルを編集すると、それらはグローバル値にリセットされます。

そして、経験的にナンセンスな自動コマンドの必要性を発見しただけです。

于 2018-12-27T06:41:02.160 に答える
1

これは、各ペアを独自のタブで開く別の回答です。以下をファイル(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

実行すると、ペアがそれぞれのタブで開きます。

于 2011-03-25T16:49:35.473 に答える
1

私の知る限り、単一のvimコマンドを使用してそれを行うことはできません。forループ内からvimdiffを開始できます。

または、「meld」を試してくださいhttp://meld.sourceforge.net/

于 2011-03-25T14:17:22.160 に答える
1

StephenPaulgerが提案したように、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

これにより、異なるファイルの差分を実行している間、シェルに何も入力する必要がなくなります。一方のファイルのペアの差分を終了すると、もう一方のファイルがすぐに表示されます。

ここで使用するもう1つの便利なヒントは、.vimrcに次のものを入れることです。

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

次に、変更がない場合はf4を押して終了し、変更がある場合はf5を押します。

于 2011-03-25T16:01:58.067 に答える