2

私はロシア語の単語を含むテキストファイルの辞書を編集しています-1行に1つの単語。

一部の名詞には派生語がありません。これらは通常、同じ単語にさらにいくつかの文字が追加されています。このスクリーンショットに示すように、6〜7のバリエーションがあります。

ここに画像の説明を入力してください

Vimでは、カーソルを最初の列に置き、1行ずつ下にスクロールします。そして、名詞を認識したら、いくつかの(できるだけ少ない!)キーストロークを押してその単語を取得し、別の行にコピーして文字を追加したいと思います。

後で発行することで重複を取り除くことができます%sort u

ファイル全体に対してそのコマンドを実行できるとしたら、次のようになります。

%s/\(.\+\)$/\1^M\1а^M\1ам^M\1ами^M\1ах^M\1е^M\1ном^M/

Vimでそのような「マクロ」を作成する方法を教えてください。

4

4 に答える 4

5

これを処理する方法はいくつかあります。マクロを作成することも、マップを作成することもできます。どちらもVIMの実行中に実行できます。どちらかを別のファイル(.vimrcたとえば、またはこのプロジェクトに固有のバインディングを持つファイル)に配置し、必要に応じて調達することができます。

また、正規表現についてもう少しアドバイスします。特に複雑なものを書いている場合は、正規表現を(つまり)\で始めることで、必要なsの数を大幅に減らすことができます。\v:s/\v([0-9a-f]+\s)/0x\1/g

VIMでマクロを作成する

q通常モードで押してから、マクロに使用するキーを押すと、VIMでマクロを開始できます。@次に、を押してからマクロの文字を押すと、マクロを呼び出すことができます。q通常モードでもう一度押すと、録音が​​停止します。

したがって、このマクロは次のように入力できます(qレジスターを使用)。

qq:s/\(.\+\)$/\1\r\1а\r\1ам\r\1ами\r\1ах\r\1е\r\1ном\r/Enterq

次に、回線に接続していてこのコマンドを実行する場合は、@q通常モードから開始します。

マクロをファイルに保存してソーシングする

最後のステップでマクロを作成したとき、実際に行っていたのはqレジスターの設定でした。registersこれは、コマンドモードで確認できます。代わりに、このマクロを.vimrcファイルに次のように設定できます。これにより、VIMを起動するたびに使用できるようになります。

  1. このマクロを保存するファイルを()に作成します:new
  2. 次の行をファイルに追加します。

    let @q=":s/\\(.\\+\\)$/\\1\\r\\1a\\r\\1b\\r\\1ам\\r\\1ами\\r\\1ах\\r\\1е\\r\\1ном\\r/^M"

    (行をヤンクしてVIMに貼り付けると、行の終わりにCtrl+R"適切な^M文字が表示されます。引用符の中にあることを確認するために、手動で編集する必要があります。または、次のように入力Ctrl+VCtrl+Mすることもできます。 ^ M文字を入力してください。)

  3. ファイルを保存します(:w testmacro.vim)。
  4. それを調達します(:so %または:source %)。
  5. @qこれを実行したい行の1つに入力して、マクロをテストします。

後で、を実行してこのマクロをロードできるようになります:so testmacro.vim

マッピングを作成する

代わりに、マッピングを作成できます。次のマッピングは、指定された行の最後の単語をコピーし、それを次の6行に貼り付けてから、指定された各行に追加します。

nnoremap <c-j> yy6pAа<esc>jAам<esc>jAами<esc>jAах<esc>jAе<esc>jAном<esc>j

n「nnoremap」の先頭にあるのは、通常モードでのみ機能することを示しています。
noremapこれは、このコマンドが再帰的な再マッピングを行わないことを意味します(ただし、を使用するとnmap、これが発生する可能性があります)。 <c-j>マップしCtrl+J yy6pて線をヤンクし、6回貼り付けます。 Aa<esc>j現在の行の終わりに追加し、テキスト(この場合a)を入力し、挿入モードを終了して、行を下に移動します。

このコマンドはVIMのコマンドモードで入力するか、ファイルに保存して:sourceコマンドとともにロードすることができます。

レジスタとマッピングの組み合わせ

マッピング内のレジスタにアクセスできます。つまり、特定の置換正規表現を入力すると目的の結果が得られることがわかっている場合は、それをレジスタに保存してから、現在の行にコマンドを入力できます。

これを行うには、ファイルに次のコマンドを入力してから、それを入手します。

nnoremap <c-i> :<c-r>f<cr>
let @f="s/\\(.\\+\\)$/\\1\\r\\1a\\r\\1b\\r\\1ам\\r\\1ами\\r\\1ах\\r\\1е\\r\\1ном\\r/^M"

Ctrl+Iこれで、現在の行のレジスタfで置換正規表現を実行するために入ることができます。

または、目的にいくつかのレジスタを割り当てます。たとえば、afとしましょう。

nnoremap <c-l> yy6p$"apj"bpj"cpj"dpj"epj"fpj
let @a="a"
let @b="ам"
let @c="ами"
let @d="ax"
let @e="e"
let @f="ном

この場合、"貼り付けなど、レジスターを使用するコマンドを押す前に、レジスターの名前を押す機能を使用しています。

于 2013-03-21T20:15:48.937 に答える
4

qモードでを押すと、マクロを記録できescapeます。例えば、

  1. 編集する名詞にカーソルを合わせます。
  2. を押しqaてマクロの記録を開始し、レジスタに保存しますa(他のアルファベットや数字もレジスタに使用できます)。
  3. 実行したい一般的なアクションを実行します(検索文字列に表示しようとした場合と同様に、行のコピー、貼り付け、文字の追加など)。
  4. 変更が完了したら、escapeモードでもう一度を押しqます。

これで、マクロがレジスタに作成されましたa。キーシーケンスを繰り返したいときはいつでも、を押してください@a

recordingあらゆる種類のコマンド、挿入、カーソルの移動など、モード内で何でも実行できることに注意してください。マクロと関連オプションの詳細については、Vimヘルプをご覧ください:h complex-repeat

Vimレジスタは、マクロとヤンクテストの両方のプレースホルダーとして共有されます。この機能を使用すると、マクロをファイルに保存して編集することもできます。詳細については、この質問を参照してください。

于 2013-03-21T20:11:10.753 に答える
1

これがマップソリューションです-行をバッファにコピーしてから、pを使用して貼り付けます。Aは行の終わりに追加します

  map <F2> 0dwpo<esc>pAa<enter><esc>pAam<enter><esc>pAax ...etc
于 2013-03-21T20:36:20.823 に答える
1

目的が、カーソルを特別な単語に置いて何かを押すことである場合、vimはさまざまな「サフィックス」を追加します(正しい単語を使用したことを願っていますが、あなたは私が何を意味するかを知っていました)。マクロ()に行くことができますq。ただし、すでにコマンドを記述しているので、:sそのコマンドを使用してマッピングを作成することもできますが、同じようにすると短くなります。

コマンドラインで、。を押すとカーソルの下の単語を取得できます<c-r><c-w>。だからあなたは試すことができます:

nnoremap <leader>z :s/<c-r><c-w>/& & &..../<cr>

ここで改行を窓の下で使用できる & & &...かどうかわからないので(試したことはありません。窓の下にvimがありません。窓さえありません)、この部分は書きませんでした。一致した部分全体を意味します。この場合は、カーソルの下の単語です。\n&

カーソルを単語に移動するだけで、「vim」と入力<leader>zすると、vimが自動的に機能します。(交換部品が正しい場合:))。

于 2013-03-21T20:54:37.010 に答える