まえがき
理論的には、開発者が本番環境を操作することは許されておらず、ましてや製品や注文のような重要なビジネスデータを操作することはできません。しかし、小さな会社の場合、バックエンドシステムはあまり完璧ではないことが多く、運用やカスタマーサービス部門の同僚が手一杯で、開発者の助けを借りなければならないようなニーズが常にあります。
これらの部門の同僚が、処理が必要なアイテムやオーダーのIDを一括して送ってくることがよくあります。私はそれらをスクリプトに貼り付けて、本番環境のマシンでスクリプトを実行し、ニーズを満たします。IDは通常、Excelファイルやオンラインドキュメントで提供されます。スクリプトのソースに貼り付けた後、使用する言語の構文要件を満たすために、必要な引用符やカンマも追加します。スクリプトのソースコードに貼り付けた後、言語の構文要件を満たすために、必要な引用符とカンマも追加する必要があります。例えば、次の図はVSCodeを直接貼り付けた場合の動作です。
では、この一括IDの前後に引用符を付け、行末にカンマを付ければ、押しつけがましくなくなるのでしょうか?
海を渡り、それぞれの特技を披露する八仙。
これを実現するには、VSCodemulti-cursor機能を使って接頭辞や接尾辞を手動で追加するなど、さまざまな方法があります。
マルチカーソルは、各カーソルにノックも異なる距離の動きの距離に沿った同じ方向にそれぞれの行にすることができ、状況の各行の長さに対処するために適した一貫性がありません。
また、Vimの列編集モード使うこともでき、VSCodeよりも少ないキーで編集できます。
ただし、列編集モードでは、行末に接尾辞を追加することはできません。まず、1行目の行末にスペースをノックし、カーソルを順番に右に移動させてから、列編集モードで接尾辞を一括追加する必要があります。
string-insert-rectangleEmacsにも同じようなカラム編集モードがあり、Vimのコマンドよりも接尾辞の追加が簡単です。しかし、デフォルトのショートカットキーがなく、最初にM-xを押してからコマンド名を入力してEnterする必要があり、少々面倒です。
さまざまなエディターの内蔵機能に加えて、コマンドラインツールもこの種の処理を行うのに適しています。
➜ /tmp cat b
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
5FEB1AE4-239A-4276-8E37-BE913CE6D117
➜ /tmp sed -e "s/^/'/" -i '' b
➜ /tmp sed -e "s/$/',/" -i '' b
➜ /tmp cat b
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
'5FEB1AE4-239A-4276-8E37-BE913CE6D117',
オンライン・ドキュメントからコピーされたIDの中には、2つまたは2つの間に空白行が存在するものがあります。コマンドラインであれば、まずそれらをgrepでふるいにかける必要があるだけで、エディターよりもコンパチブルです。
もしEmacsを使っているのなら、C-x iを使えば、エディターが直接カーソルにファイルの内容を挿入してくれます。
Emacsから少し離れて、シンプルなコマンドやショートカットでこれを実行できたらいいと思いませんか?
自分でやりなさい。
カスタムElisp関数を使用した場合の効果は以下の通りです。
実装の考え方は、実はとてもシンプルです:
- まず、プレフィックスとサフィックスを追加するエリアを選択します;
- buffer-substring-no-propertiesこの領域の文字列をテキストとしてコピーするには、この関数を使用します;
- read-from-minibufferを使用して追加する接頭辞と接尾辞の文字列のユーザー入力を求め、それを読み取ります;
- split-stringを使ってテキストを行に分割し、各行に接頭辞と接尾辞を追加し、mapconcatを使って文字列を綴り返してください;
- delete-regionで選択した内容を削除し、insertで新しい文字列を挿入します。
最後のElisp関数は次のように定義されています。
(defun lt--insert-at-start-end ()
 "TEXTの各行にPREFIX接頭辞とSUFFIX接尾辞を付加する。"
 (interactive)
 (let* ((text (buffer-substring-no-properties (mark) (point)))
 (prefix (read-from-minibuffer "insertのプレフィックス: "))
 (suffix (read-from-minibuffer "接尾辞を挿入する: "))
 (lines (split-string text))
 (decorated-lines
 (mapcar (lambda (line)
 (concat prefix line suffix))
 lines))
 (new-text (mapconcat 'identity decorated-lines "
")))
 (delete-region (mark) (point))
 (insert new-text)))
読者や友人のEmacsユーザーも大歓迎です。)





