Vimはインクリメンタルラインを書くことができますか?つまり、各行でAはBになり、1は2になります。


8

私はこれを書きたかった:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

結局、LibreCalcを使用して、さまざまな部分をさまざまなセルに配置し、文字と数字を追加し、結果を連結して、ロットをVimに貼り付けました。

私が書いたかったのはひどいコードであることに感謝します。私は現在Pythonを勉強しており、自分がフォローしているコース(http://interactivepython.org/)の後半で取り上げられることがわかっている自分自身の情報を見つけようとはしていません。

vimでこれを行うには、次のように入力するのが一番早い方法でした。

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

vimは非常に強力であることを知っています(数週間使用していて、本当に楽しんでいます)。

いくつかのvimコマンドを使用して、私がやりたいことを書くことは可能でしたか?

回答:


11

スクリプトで実行できますが、Vimの最新バージョン(Arch Linuxのバージョンなど)を使用g Ctrl-aしている場合は、を使用してビジュアルブロックをインクリメントできます。あなたの場合:

  1. 元の行を書きます: A = mapping[0] Esc
  2. 行をヤンクし、その25コピーを下に配置します。 yy25p
  3. 0文字を含む列を視覚的に選択し(ブロック選択、を使用Ctrl-v)、0最初の行からを除いて(最後の25個のゼロを含む列になる)、それらをでインクリメントしますg Ctrl-a
  4. を含む列に同じメソッドを適用しますA

:コメントが示すように、文字をインクリメントできるようにするalphaには、nrformatsオプションに追加する必要がありますset nrformats+=alpha。例:.My vimrcは:set nrformats=hex,alpha、したがって、使用しない8進数と2進数のインクリメントを無効にします)


yyは私のために働いていません。www.vimcheatsheet.comから印刷したチートシートで、これが非常に標準的なコマンドであることがわかります。vim --versionはこれを返します:pastebin.com/DcFxZh1S。なぜ機能しないのかを調査する必要があります...(ビジュアルコマンドと挿入モードで試しました)。また、貼り付けると、すべて同じ行に表示されます。しかし、私はg Ctrl-aを試してみましたが、それは私が望んだとおりに機能します。ありがとうございました:)
Duncan Betts

1
:verbose map yで始まるマッピングがどのようなものyで、どこに設定されたかが表示されます。ただしyy、通常モードで使用する必要があります。
VanLaser 2016


1
どのバージョンのvim意志の増加ABCtrl-a行動?私は間違いなくそうです、そして私はしてい7.4 1-1202ます。
コリークライン

4
@CoryKlein入力してみてください:set nrformats+=alphaalphaオプションに値を追加し、アルファベット文字を「増分」'nrformats'できるようにCtrl-aする必要があります。この動作が気に入った場合は、vimrcに追加できます。それ以外の場合は、演算子を使用してオプションに追加し、+=後で演算子-=:set nrformats-=alpha)を使用して削除できます。
saginaw 2016

6

@VanLaserが使用した視覚的インクリメントソリューションを好みます(を参照:h v_CTRL-A)。ただし、これはマクロでも実行できることを示します。

皮切りに:

A = mapping[0]

次のキープレスを選択したマクロ(例:)に記録しますq

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

これにより、行が複製され、最初の文字(例A:)が増加し、数字の部分が増加します。このマクロを24回実行すれば完了24@qです。

  • qq -レジスタへの記録を開始 q
  • yyp -行を複製します
  • :set nrformats+=alpha<cr>- デフォルトで'nrformatsはありませんalpha
  • <c-a>-これalphaで文字を増やすことができます
  • :set nrformats-=alpha<cr>- alphaから削除'nrformats'
  • <c-a> -次の数値を増やします
  • q -録音を停止
  • 24@q-レジスター内のマクロをq24回再生

詳細については、以下を参照してください。

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A

いいね:) 25?
VanLaser 2016

1
@VanLaser:1(開始ライン)+ 1(記録マクロ)+ 24 = 26
ピーターRincker

4

すでに良い答えが提供されているので、私はそれについてうまくやろうとは思わなかったでしょう。私は1行ですべての文字をタイプアウトし、次にテキストと改行を導入し、式を置換しました(増分番号に行番号を使用)、次のようなものです

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g

とてもかっこいい !(+1)
JJoao 2016

2

ほとんどの場合、このようなことをするときは:substitute、マクロよりも使用することを選択します。特に、で始まるときに置換で式を評価する機能\=は、多くの場合それを可能にします(を参照:h sub-replace-special)。

空の行を配置し25i<Enter><Esc>たら()、コマンドを使用できます

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

必要なシーケンスは'.'、functionによって返される現在の行(引数)番号を使用して生成されline()、nr2char()を使用して10進数を同等のASCIIに変換します(65 = A)。必要な文字列は次を使用して連結されます.


1

あなたはいつでもオペレーティングシステムを使用しようとすることができます...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perlはオペレーティングシステムにはありません。
ダッシュトムバン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.