diff options
| author | nsfisis <nsfisis@gmail.com> | 2023-03-20 22:03:50 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2023-03-20 22:03:53 +0900 |
| commit | f7ae224f3e2530bb4b05166b6013f8a42432086e (patch) | |
| tree | 32f45300baddc4a8cd4f05382e18a59d6f82ecdb /content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml | |
| parent | 627330f7e80e2eac0f92663bbdaaf39962e97bbe (diff) | |
| download | blog.nsfisis.dev-f7ae224f3e2530bb4b05166b6013f8a42432086e.tar.gz blog.nsfisis.dev-f7ae224f3e2530bb4b05166b6013f8a42432086e.tar.zst blog.nsfisis.dev-f7ae224f3e2530bb4b05166b6013f8a42432086e.zip | |
feat(nuldoc): rename simpara to para
See also: https://tdg.docbook.org/tdg/sdocbook/5.1/para.html
Diffstat (limited to 'content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml')
| -rw-r--r-- | content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml | 124 |
1 files changed, 62 insertions, 62 deletions
diff --git a/content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml b/content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml index f919301..cf1013a 100644 --- a/content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml +++ b/content/posts/2021-10-02/vim-swap-order-of-selected-lines.xml @@ -15,13 +15,13 @@ </revision> </revhistory> </info> - <simpara> + <para> この記事は Qiita から移植してきたものです。 元 URL: <link xl:href="https://qiita.com/nsfisis/items/4fefb361d9a693803520">https://qiita.com/nsfisis/items/4fefb361d9a693803520</link> - </simpara> - <simpara> + </para> + <para> <hr/> - </simpara> + </para> <section xml:id="tl-dr"> <title>TL; DR</title> <programlisting language="vim" linenumbering="unnumbered"> @@ -36,69 +36,69 @@ </section> <section xml:id="version"> <title>バージョン情報</title> - <simpara> + <para> <literal>:version</literal> の一部 - </simpara> + </para> <blockquote> - <simpara> + <para> VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 26 2020 11:30:30) macOS version Included patches: 1-148 Huge version without GUI. - </simpara> + </para> </blockquote> </section> <section xml:id="existing-solution"> <title>よく紹介されている手法</title> <section xml:id="existing-solution--external-commands"> <title><literal>tac</literal> / <literal>tail</literal></title> - <simpara> + <para> <literal>tac</literal> や <literal>tail -r</literal> などの外部コマンドを <literal>!</literal> を使って呼び出し、置き換える。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h v_! - </simpara> + </para> </blockquote> - <simpara> + <para> <literal>tac</literal> コマンドや <literal>tail</literal> の <literal>-r</literal> オプションは環境によって利用できないことがあり、複数の環境を行き来する場合に採用しづらい - </simpara> + </para> </section> <section xml:id="existing-solution--global-command"> <title><literal>:g/^/m0</literal></title> - <simpara> + <para> こちらは外部コマンドに頼らず、Vim の機能のみを使う。<literal>g</literal> は <literal>:global</literal> コマンドの、<literal>m</literal> は <literal>:move</literal> コマンドの略 - </simpara> - <simpara> + </para> + <para> <literal>:global</literal> コマンドは <literal>:[range]global/{pattern}/[command]</literal> のように使い、<literal>[range]</literal> で指定された範囲の行のうち、<literal>{pattern}</literal> で指定された検索パターンにマッチする行に対して、順番に <literal>[command]</literal> で指定された Ex コマンドを呼び出す。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h :global - </simpara> + </para> </blockquote> - <simpara> + <para> <literal>:move</literal> コマンドは <literal>[range]:move {address}</literal> のように使い、<literal>[range]</literal> で指定された範囲の行を <literal>{address}</literal> で指定された位置に移動させる。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h :move - </simpara> + </para> </blockquote> - <simpara> + <para> <literal>:g/^/m0</literal> のように組み合わせると、「すべての行を1行ずつ 0行目(1行目の上)に動かす」という動きをする。これは確かに行の入れ替えになっている。 - </simpara> - <simpara> + </para> + <para> なお、<literal>:g/^/m0</literal> は全ての行を入れ替えるが、<literal>:N,Mg/^/mN-1</literal> とすることで N行目から M行目を処理範囲とするよう拡張できる。手でこれを入力するわけにはいかないので、次のようなコマンドを用意する。 - </simpara> + </para> <programlisting language="vim" linenumbering="unnumbered"> <![CDATA[ command! -bar -range=% @@ -106,36 +106,36 @@ \ <line1>,<line2>g/^/m<line1>-1 ]]> </programlisting> - <simpara> + <para> これは望みの動作をするが、実際に実行してみると全行がハイライトされてしまう。次節で詳細を述べる。 - </simpara> + </para> </section> </section> <section xml:id="problem-of-global-command"> <title><literal>:g/^/m0</literal> の問題点</title> - <simpara> + <para> <literal>:global</literal> コマンドは各行に対してマッチングを行う際、現在の検索パターンを上書きしてしまう。<literal>^</literal> は行の先頭にマッチするため、結果として全ての行がハイライトされてしまう。<literal>'hlsearch'</literal> オプションを無効にしている場合その限りではないが、その場合でも直前の検索パターンが失われてしまうと <literal>n</literal> コマンドなどの際に不便である。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h @/ - </simpara> + </para> </blockquote> </section> <section xml:id="solution"> <title>解決策</title> <blockquote> - <simpara> + <para> [2020/9/28追記] より簡潔な方法を見つけたので次節に追記した - </simpara> + </para> </blockquote> - <simpara> + <para> 前述した <literal>:Reverse</literal> コマンドの定義を少し変えて、次のようにする: - </simpara> + </para> <programlisting language="vim" linenumbering="unnumbered"> <![CDATA[ function! s:reverse_lines(from, to) abort @@ -147,54 +147,54 @@ \ call <SID>reverse_lines(<line1>, <line2>) ]]> </programlisting> - <simpara> + <para> 実行しているコマンドが変わったわけではないが、関数呼び出しを経由するようにした。これだけで前述の問題が解決する。 - </simpara> - <simpara> + </para> + <para> この理由は、ユーザー定義関数を実行する際は検索パターンが一度保存され、実行が終了したあと復元されるため。結果として検索パターンが <literal>^</literal> で上書きされることがなくなる。 - </simpara> - <simpara> + </para> + <para> Vim のヘルプから該当箇所を引用する (強調は筆者による)。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h autocmd-searchpat - </simpara> - <simpara> + </para> + <para> <emphasis role="strong">Autocommands do not change the current search patterns.</emphasis> Vim saves the current search patterns before executing autocommands then restores them after the autocommands finish. This means that autocommands do not affect the strings highlighted with the `hlsearch' option. - </simpara> + </para> </blockquote> - <simpara> + <para> これは autocommand の実行に関しての記述だが、これと同じことがユーザー定義関数の実行時にも適用される。このことは <literal>:nohlsearch</literal> のヘルプにある。同じく該当箇所を引用する (強調は筆者による)。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h :nohlsearch - </simpara> - <simpara> + </para> + <para> (略) This command doesn’t work in an autocommand, because the highlighting state is saved and restored when executing autocommands |autocmd-searchpat|. <emphasis role="strong">Same thing for when invoking a user function.</emphasis> - </simpara> + </para> </blockquote> - <simpara> + <para> この仕様により、<literal>:g/^/m0</literal> の呼び出しをユーザー定義関数に切り出すことで上述の問題を解決できる。 - </simpara> + </para> </section> <section xml:id="solution-revised"> <title>解決策 (改訂版)</title> <blockquote> - <simpara> + <para> [2020/9/28追記] より簡潔な方法を見つけたため追記する - </simpara> + </para> </blockquote> <programlisting language="vim" linenumbering="unnumbered"> <![CDATA[ @@ -203,16 +203,16 @@ \ keeppatterns <line1>,<line2>g/^/m<line1>-1 ]]> </programlisting> - <simpara> + <para> まさにこのための Exコマンド、<literal>:keeppatterns</literal> が存在する。<literal>:keeppatterns {command}</literal> のように使い、読んで字の如く、後ろに続く Exコマンドを「現在の検索パターンを保ったまま」実行する。はるかに分かりやすく意図を表現できる。 - </simpara> + </para> <blockquote> - <simpara> + <para> :h :keeppatterns - </simpara> + </para> </blockquote> </section> </article> |
