ラベル PPv の投稿を表示しています。 すべての投稿を表示
ラベル PPv の投稿を表示しています。 すべての投稿を表示

2024年10月5日土曜日

テキストファイル内の画像パスをPPVで表示

テキストファイル中に画像ファイルのパスを書いておけば、それを別IDのPPVで閲覧できるようにする。これで、テキストファイルのメモでも画像や図を扱いたい!という我々の永遠の課題を解決できるかもしれない?

準備

以下をScriptフォルダに保存。

以下を編集して取り込み。

_Command    = {    ; ユーザコマンド・関数
openhalfppv    = *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%*windowrect(,h) %%: *selectppx %n
previewimagepath = *openhalfppv %*script(%0Script\getimagepath.js,1)
    *mapkey use,K_halfppv
    *linecust imgpreview,KV_main:LOADEVENT,*ifmatch %%n,%n %(%: *RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *ifmatch !0,0%*getcust(_User:imgpath) %: *execute VX,%%J"%*getcust(_User:imgpath)"%)
    *linecust quitimgview,KV_main:CLOSEEVENT,*ifmatch %%n,%n %%: *linecust imgpreview,KV_main:LOADEVENT, %%: *linecust quitimgview,KV_main:CLOSEEVENT,
}

K_halfppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2")
	*closeppx "%n,VX"
^N    ,*RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *execute VX,%%J%*getcust(_User:imgpath)
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx VX %: *stop
	*openhalfppv %*script(%0Script\getimagepath.js,1)
}

やり方

画像ファイルパスを書き込んだテキストファイルを用意し、PPVで表示する。

PPV上で以下のコマンドを実行。

*previewimagepath

PPVの大きさが半分になり、空いたスペースにPPV[X]が起動。画像ファイルを表示する。

PPvの表示ファイルが切り替わると、表示画像も切り替わる。以下はPPv中心の連動ビュー(参考:一対一対応 | PPxMemo)と組み合わせたもの。

その他キーバインド

  • [ENTER] 画像表示非表示トグル
  • [Q] 半分になったPPVの大きさをもとに戻してから終了
  • ^[N] テキストファイル内の次の画像ファイルパスを表示

追記 2024-10-14

表示している画像ファイルパスをハイライトする設定は以下。

_Command    = {    ; ユーザコマンド・関数
openhalfppv    = *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%*windowrect(,h) %%: *selectppx %n
previewimagepath = *openhalfppv %*script(%0Script\getimagepath.js,1)
    *mapkey use,K_halfppv
    *highlight %*script(%0Script\getimagepath.js,1)
    *linecust imgpreview,KV_main:LOADEVENT,*ifmatch %%n,%n %(%: *RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *ifmatch !0,0%*getcust(_User:imgpath) %: *execute VX,%%J"%*getcust(_User:imgpath)" %: *highlight %*getcust(_User:imgpath)%)
    *linecust quitimgview,KV_main:CLOSEEVENT,*ifmatch %%n,%n %%: *linecust imgpreview,KV_main:LOADEVENT, %%: *linecust quitimgview,KV_main:CLOSEEVENT,
}

K_halfppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2")
	*closeppx "%n,VX"
^N    ,*RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *execute VX,%%J%*getcust(_User:imgpath) %: *highlight %*getcust(_User:imgpath)
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx VX %: *stop
	*openhalfppv %*script(%0Script\getimagepath.js,1)
}

2024年9月27日金曜日

wgetで取得した画像をPPvで表示

画像をローカルに保存するのが面倒なときのために。 以下を編集して取込。

_Command = {
wget2file = *string o,hoge=%*temp(name,f)
  %Os wget -O %so"hoge" %*arg(1)
  *return %so"hoge"
}

以下のようにして使う。

*ppv %*wget2file("https://pbs.twimg.com/media/F0vVsgTaYAsUHkA?format=jpg")

2024年8月19日月曜日

PPvで前回開いたパスを開く ~まだ俺達はPPvの真の性能を引き出していない~

概要

PPxにおいて、ビューアであるPPvは何枚でも開くことができる。だが、僕は普段は、PPcと紐づけた形(連動ビュー)でしかPPvを使えていない。この場合、使えるPPvの数はPPcの数に規定されることになる。せいぜい3、4枚といったところだ。 これでは、PPvの真の性能を引き出しているとはいえないんじゃないか。PPvをズラッと何枚も並べ、それぞれに異なるファイルを表示して見比べる活用法があるんじゃないか。このような問題意識を、僕はずっと持っていた。

この問題には、過去にも何度か取り組んだことがあるが、あまり成果は出なかった。ここからは「ファイルパスはどこにどの形式で保存するか」「位置関係は保存すべきか」「保存したとしてどう再現するか」「保存したパスをどのIDのPPVで開くか」等の複雑な課題が生じてくる。これを解決しようとすると、スクリプトなり、リストファイルなりを駆使した、運用が複雑なものが出来上がる。そして結局は、その複雑さゆえに使わなくなる。これが今までのパターンだった。 最近、「PPv終了時にIDごとにパスを保存し、次回起動時にはそのパスを開く」という単純な仕組みで、これらの課題は解決するんじゃないか、と思いついた。

実装について

以下の形で実装する。

  • データの保存には、S_xxxを活用する。例えばPPV[F]のパスはS_ppvpath:Fに、PPV[G]のパスはS_ppvpath:Gに保存する、というように
  • PPV[F]~PPV[W]を今回の用途に使う。PPV[A]~PPV[E]は、通常のPPcと紐づけた運用に。PPV[X}~PPV[Z]は他の特殊な用途にとっておく

準備

以下を編集して取込。

KV_main    = {    ; PPvメイン窓
CLOSEEVENT    ,*ifmatch "o:e,a:d-",%FCD %: *setcust S_ppvpath:%*rightstr("%n", 1)=%FCD %: *stop
    *deletecust S_ppvpath:%*rightstr("%n", 1)
FIRSTEVENT    ,*ifmatch "/[a-ex-z]/",%*rightstr("%n", 1) %: *stop
    *ifmatch !0,0%*getcust(S_ppvpath:%*rightstr("%n", 1)) %: %J%*getcust(S_ppvpath:%*rightstr("%n", 1))
    *mapkey use,K_ppvv
}

K_ppvv    = {    ; 紐づけなしPPv
ESC    ,%J"no such file"
^N    ,*script %0Script\open_plural_ppv.js,2
O    ,*openppcv %FCD
}

K_ppcv    = {    ; 紐づけなしPPvから起動したPPc
ENTER    ,*ifmatch "o:e,a:d+",%FCD %: %K"@ENTER" %: *stop
    %Oi *windowsize %*extract(%%NV%*getcust(_User:syncidppcv)),%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx %n %: *stop
Q    ,%Oi *windowsize %*extract(%%NV%*getcust(_User:syncidppcv)),%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx %n
}

_Command    = {    ; ユーザコマンド・関数
openppcv    = *setcust _User:syncidppcv=%*rightstr("%n", 1)
    *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
    *ppc -bootid:%*getcust(_User:syncidppcv) -single -k %%j"%*arg(1)" %%: *mapkey use,K_ppcv %%: *ppvoption sync %*getcust(_User:syncidppcv) %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%*windowrect(,h)
}

以下をScriptフォルダにopen_plural_ppv.jsという名前で保存。今まで僕がつくってきたスクリプトとは違い、ES6で書いているので注意。

やり方

以下のコマンドで、S_ppvpathにパスが保存してあるPPVを一斉に開く。一つもなければ、空の状態のPPvを一つ開く。

*script %0Script\open_plural_ppv.js,1

PPvを新たに一つ開きたい場合は、上のコマンドで開いたPPv上で[^N]を押すか、以下のコマンドを任意の場所で実行する。

*script %0Script\open_plural_ppv.js,2

表示ファイルを変えたい場合は、PPV上で[O]を押す。すると、PPCが表示され、PPvが連動ビューの状態になる。目的のファイルを見つけたら、[Enter]か[Q]を押す。 もちろん、単純にドラッグアンドドロップを使うのでもいい。

「もうこのファイルは次回は表示しなくていいや」という場合は、PPV上で[ESC]を押す。すると、存在しないファイルを表示する。この状態で閉じると、保存したパスがリセットされる。

活用案

  • 開きっぱなしにしておきたいテキストを表示する
  • todoを書いたテキストを表示する
  • 見てると落ち着く写真を表示する
  • 見比べたい資料を表示する

といった活用方法がありそう。

2024年8月12日月曜日

PPV単体で書庫内の画像を閲覧

書庫内の画像をPPvで閲覧できるようにする。漫画ビューアでよくあるやつです。 「PPcで書庫に潜ってPPvで連動ビューしたらいいだけじゃん」と言われたらたしかにそうなのだが、PPv単体でできたら便利かもしれないと思いました(小並感)。

準備

以下をgetarchivefiles.jsという名前でスクリプトフォルダに保存。

以下を編集して取込。

K_archiveview    = {
RIGHT    ,*ifmatch 0,0%si"pagenum" %: *string i,pagenum=0
    *string i,pagenum=%*calc("%si"pagenum"+1") %: *string o,name=%%*getcust(S_archivepages:%si"pagenum")
    *ifmatch !0,0%sgo"name" %: %J%sgo"name" %: *stop
    *string i,pagenum=%*calc("%si"pagenum"-1")
LEFT    ,*ifmatch 0,0%si"pagenum" %: *string i,pagenum=0 %: *stop
    *if %*calc(%si"pagenum") == 0 %: *stop
    *string i,pagenum=%*calc("%si"pagenum"-1") %: *string o,name=%%*getcust(S_archivepages:%si"pagenum") %: %J%sgo"name"
}

%si"pagenum"は現在見ているページ番号。左右カーソルで1ずつ増減する。

やり方

PPcで書庫ファイルにカーソルをあわせ、以下のコマンドを実行。

*ppv %*script(%0Script\getarchivefiles.js,%FCD,S_archivepages) -k *mapkey use,K_archiveview

最初の画像が表示される。カーソル左右で表示ファイルを切り替える。

2024年4月7日日曜日

テキストファイルで画像ファイルを扱いたい

MV_click    = {    ; PPv メイン窓
LD_SPC    ,*ifmatch 0,0%*selecttext %: %K"@Q %: *stop
    *ifmatch "o:e,a:d-",%*selecttext %: *ppv %*selecttext %: *stop
    %K"@Q
}

今回は、テキストファイルで画像ファイルを扱う方法のアイデア。

画像ファイルのパスを挿入したテキストファイルをPPvで開き、[I]でキャレットモードに。ファイルパスにキャレットをあわせ、ダブルクリックする。

すると、ファイルパスの内容が別のPPvで表示される。

2024年2月26日月曜日

PPvで簡易漫画ビューア

PPvを二つ並べて、簡易漫画ビューアにする。

準備

以下をScriptフォルダに保存。

以下を編集して取込。

K_mihirakiview 	= {
UP	,*execute C,*cursor 0, -2 %: *ppv -bootid:R -r %*extract(C"%(%*name(CD,"%R","%1")%)") %: %Oa *ppv -bootid:L -r %*extract(C"%(%*script(%0Script\nextentrypath.js)%)")
DOWN	,*execute C,*cursor 0, 2 %: *ppv -bootid:R -r %*extract(C"%(%*name(CD,"%R","%1")%)") %: %Oa *ppv  -bootid:L -r %*extract(C"%(%*script(%0Script\nextentrypath.js)%)")
LEFT	,*execute C,*cursor 0, -1 %: *ppv -bootid:R -r %*extract(C"%(%*name(CD,"%R","%1")%)") %: %Oa *ppv -bootid:L -r %*extract(C"%(%*script(%0Script\nextentrypath.js)%)")
RIGHT	,*execute C%si"ppcid",*cursor 0, 1 %: *ppv -bootid:R -r %*extract(C"%(%*name(CD,"%R","%1")%)") %: %Oa *ppv  -bootid:L -r %*extract(C"%(%*script(%0Script\nextentrypath.js)%)")
Q	,*closeppx "VL,VR"
ENTER	,*closeppx "VL,VR"
W	,*fitwindow %NVR,%NVL,1
}

やり方

以下のコマンドを実行すると、PPV[R]が開く。

*ppv -bootid:R -r %*name(CD,"%R","%1") -k *mapkey use,K_mihirakiview

PPV[R]上でカーソル移動をすると、PPV[L]も起動。漫画ビューアっぽい動作をする。

キーバインドは以下。

  • [UP] 前のページに戻る
  • [DOWN] 次のページに進む
  • [LEFT] 1ページ戻る
  • [RIGHT] 1ページ進む
  • [W] PPV[R]の左にPPV[L]を移動、高さが同じに
  • [Q] 両方の窓を閉じる
  • [ENTER] 両方の窓を閉じる

2023年11月24日金曜日

PPv窓間移動

[Tab]で起動中のPPvに順次フォーカスする。 以下をScriptフォルダにnextppv.jsという名前で保存。

以下を編集して取込。

KV_main    = {    ; PPvメイン窓
TAB    ,*selectppx %*script(%0Script\nextppv.js)
}

参考

十年くらい前に同じ機能のものを作ってたことに今気づいた(^_^;)

2023年8月20日日曜日

PPvの位置を一行編集で保存・再現

PPvの位置を一行編集で保存・再現できるようにする。コメントを付けることで、一行編集での検索をしやすくしている。

準備

以下をScriptフォルダに保存。

seq.js

getwinpos.js

editwinpos.js

以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
savewindowpos	= *setcust %*arg(1):l=%*windowrect(,l)
	*setcust %*arg(1):t=%*windowrect(,t)
	*setcust %*arg(1):w=%*windowrect(,w)
	*setcust %*arg(1):h=%*windowrect(,h)
	*setcust %*arg(1):comment=%*arg(2)
}

やり方

位置の登録

PPvで以下のコマンドを実行する。

*savewindowpos S_ppvpos%*script(%0Script\seq.js,S_ppvpos,l),%"コメントを記入してください"%E

S_ppvpos0に位置と大きさとコメントが保存される。 次にこのコマンドを実行するとS_ppvpos1に、さらにその次はS_ppvpos2に ... と、位置情報はS_ppvpos+連番に保存される。

位置の再現

PPvで以下のコマンドを実行する。

*string o,name=%*input("" -title:"PPvの位置を変更" -mode:e -k:"*completelist /set /file:%%*script(%%0Script\getwinpos.js,S_ppvpos) -match:6 ") %: *windowposition %N,%so"name"

登録したユーザデータを補完候補ファイルにした一行編集が起動する。

登録した情報の編集

以下のコマンドを実行する。

*script %0Script\editwinpos.js,S_ppvpos,%*script(%0Script\getwinpos.js,S_ppvpos)

一行ごとに位置情報が記載されたテキストファイルがPPEで開く。編集、保存してからPPEを閉じると、編集内容がユーザデータに反映される。

2023-08-21追記

色々ミスがあったので全面的に修正。

2023年8月8日火曜日

PPvでPDFのテキストを読む

PDFファイルをtext形式に変換してPPvに表示する。変換にはpdftotextというコマンドラインツールを使用。 なぜこんなことをするかというと、EPWING形式の辞書を引くためです。

準備

Releases ・ oschwartz10612/poppler-windowsからRelease-23.07.0-0.zipをダウンロード。適当な場所に解凍する。

以下を編集して取込。pdftotextのパスは各自読み替えてください。

A_exec	= {	; エイリアス
pdftotext	= D:\bin\poppler\Library\bin\pdftotext.exe
}

_Command	= {	; ユーザコマンド・関数
pdftoppv	= *string o,tempfile=%*temp(name,f) %: %Oi pdftotext -f %*arg(2) -l %*arg(2) -layout -nopgbrk "%*arg(1)" %so"tempfile" %: *ppv -utf8 %so"tempfile" -k *string i,pagenum=%*arg(2) %%: *string i,name="%*arg(1)" %%: *string i,tempfile=%so"tempfile" %%: *mapkey use,K_forpdftoppv
pdftoppvnext	= %Oi pdftotext -f %*calc("%si"pagenum"+1") -l %*calc("%si"pagenum"+1") -layout -nopgbrk %si"name" %si"tempfile" %: *ppv -utf8 -r -bootid:%*rightstr("%n", 1) %si"tempfile" -k *string i,pagenum=%*calc("%si"pagenum"+1")
pdftoppvprev	= %Oi pdftotext -f %*calc("%si"pagenum"-1") -l %*calc("%si"pagenum"-1") -layout -nopgbrk %si"name" %si"tempfile" %: *ppv -utf8 -r -bootid:%*rightstr("%n", 1) %si"tempfile" -k *string i,pagenum=%*calc("%si"pagenum"-1")
pdftoppvjump	= %Oi pdftotext -f %en %"移動するページ数" %${%si"pagenum"%} -l %${%si"pagenum"%} -layout -nopgbrk %si"name" %si"tempfile" %: *ppv -utf8 -r -bootid:%*rightstr("%n", 1) %si"tempfile" -k *string i,pagenum=%${%si"pagenum"%}
}

K_forpdftoppv    = {
^LEFT    ,*pdftoppvprev
^RIGHT    ,*pdftoppvnext
J    ,*pdftoppvjump
}

やり方

PDFファイルにカーソルをあわせて以下を実行する。第一引数にはファイルパスを、第二引数にはページ数を指定する。

*pdftoppv %FCDN,1

PPvには以下の操作が追加される。

  • ^[←] 前のページ
  • ^[→] 次のページ
  • [J] 指定したページへ移動

おまけ:標準出力の場合

標準出力を利用する場合は以下のようになる。

A_exec	= {	; エイリアス
pdftotext	= D:\bin\poppler\Library\bin\pdftotext.exe
}

_Command	= {	; ユーザコマンド・関数
pdftoppv	= *ppv "%*arg(1)" -esc:on -text -utf8 -document:"pdftotext -f %*arg(2) -l %*arg(2) -layout -nopgbrk %"%*arg(1)" - > %%si'TempFile'" -k *string i,pagenum=%*arg(2) %%: *mapkey use,K_forpdftoppv
pdftoppvnext	= *ppv -r -bootid:%*rightstr("%n", 1) %FCD -esc:on -text -utf8 -document:"pdftotext -f %*calc("%si"pagenum"+1") -l %*calc("%si"pagenum"+1") -layout -nopgbrk %%FCD - > %%si'TempFile'" -k *string i,pagenum=%*calc("%si"pagenum"+1")
pdftoppvprev	= *ppv -r -bootid:%*rightstr("%n", 1) %FCD -esc:on -text -utf8 -document:"pdftotext -f %*calc("%si"pagenum"-1") -l %*calc("%si"pagenum"-1") -layout -nopgbrk %%FCD - > %%si'TempFile'" -k *string i,pagenum=%*calc("%si"pagenum"-1")
pdftoppvjump	= *ppv -r -bootid:%*rightstr("%n", 1) %FCD -esc:on -text -utf8 -document:"pdftotext -f %en %"移動するページ数" %${%si"pagenum"%} -l %${%si"pagenum"%} -layout -nopgbrk %%FCD - > %%si'TempFile'" -k *string i,pagenum=%${%si"pagenum"%}
}

K_forpdftoppv    = {
^LEFT    ,*pdftoppvprev
^RIGHT    ,*pdftoppvnext
J    ,*pdftoppvjump
}

参考

2023年7月30日日曜日

PPvでEPWING形式の辞書を引く

PPvで、カーソル位置の/範囲選択した単語をEPWING形式の辞書で検索し、PPv[X]にその内容を表示する。

必要なもの

EBWIN4には、EPWING形式の辞書をあらかじめ登録しておこう。

準備

以下のファイルをScriptフォルダに保存する。dic.luaのEBWIN4のパスは環境に応じて読み替えてください。

カーソル位置の単語を検索

単語が空白区切りになっている英文等の場合はこちらが便利。 [I]でキャレットモードにして、辞書を引きたい単語上にカーソルを置いてから、以下のコマンドを実行する。

*string o,tempfile=%*temp(name,f) %: %Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %so"tempfile" %: *ppv -utf8 -bootid:x -r %so"tempfile" -k *selectppx %n

一時ファイルが一々つくられるのが嫌な場合は、以下を適当なキーに登録して実行する。

*ifmatch "!o:e,a:d-",%si"tempfile" %: *string i,tempfile=%*temp(name,f)
%Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %si"tempfile"
*ppv -utf8 -bootid:x -r %si"tempfile" -k *selectppx %n

単語を範囲選択して検索

日本語で辞書を引くとき等は、単語の自動取得が難しいので、おそらくこちらの方法を取ることになる。

*string o,tempfile=%*temp(name,f) %: %Oi nyagos -f %0Script\dic.lua %*selecttext %so"tempfile" %: *ppv -utf8 -bootid:x -r %so"tempfile" -k *selectppx %n

参考

2023年7月29日土曜日

PPvで単語を考慮した折り返し

PPvで折り返し表示をしている場合、右端にある英単語が途中で改行される場合がある。 busyboxのfoldコマンドを利用してこれを解決する。

*ppv %C -esc:on -text -utf8 -document:"busybox fold -w 80 -s %%C > %%si'TempFile'"

nkfをかませる場合は以下のようになる。

*ppv %C -esc:on -text -utf8 -document:"nkf -w %%C | busybox fold -w 80 -s > %%si'TempFile'"

2023年7月28日金曜日

PPvでカーソル位置の単語(空白区切り)を取得

外国語の文献を読むとき、カーソル位置の単語を自動で取得できれば、それを辞書ソフトに投げることができて便利そうだなと思い、スクリプトを作った。

PPvをキャレットモードにし、以下のようなコマンドを打つ。

*linemessage %*script(%0Script\selectword.js)

2023年1月26日木曜日

PPvをPPcの中央に順次移動

PPvを起動中のPPcの中央に順次移動できるようにする。

以下をScriptフォルダに保存。

next_ppc_id.js

以下を編集して取込。

KV_main	= {	; PPcメイン窓
^\RIGHT	,*ifmatch 0,0%*getcust(_User:center_id) %: *setcust _User:center_id=%*rightstr("%*extract(C"%%n")", 1)
	*string o,currentid=C_%*getcust(_User:center_id) %: *string o,newid=%*script(%0Script\next_ppc_id.js,%so"currentid") %: *string o,handle=%%NC%*rightstr("%so"newid"", 1) %: *fitwindow %*extract("%so"handle""),%N,20 %: *setcust _User:center_id=%*rightstr("%so"newid"", 1)
^\LEFT	,*ifmatch 0,0%*getcust(_User:center_id) %: *setcust _User:center_id=%*rightstr("%*extract(C"%%n")", 1)
	*string o,currentid=C_%*getcust(_User:center_id) %: *string o,newid=%*script(%0Script\next_ppc_id.js,%so"currentid") %: *string o,handle=%%NC%*rightstr("%so"newid"", 1) %: *fitwindow %*extract("%so"handle""),%N,20 %: *setcust _User:center_id=%*rightstr("%so"newid"", 1)
}

PPc[A] PPc[B] PPc[C]の三つが起動していた場合、PPv上でCtrl+Shift+カーソル左右で、

PPc[A]→PPc[B]→PPc[C]→PPc[A]→…

という順序でPPc中央に移動する。