縦書きの方法は?


22

文書に次のテキストを作成したいとしましょう。

%
%            Not Important
%    O ------------------------->
%    |
%  S |
%  o |
%  m |
%  e |
%    |
%  M |
%  s |
%  g |
%    |
%    V

上記のように、各行に各文字を手動で挿入することなく、「Some Msg」を簡単に縦書きする方法はありますか?


5
あなたは、通常のようにテキストを書き、次に何ができる:s/./% \0\r/追加する%...ないと改行を素晴らしい ...けれども、解決策
マーティンTournoij

素敵な解決策、それはちょっと動作します。今のところ使用します、ありがとう。
長谷川アラン

回答:


16

本当に良い解決策はおそらくもう少しの作業を必要としますが、「悪くない」を達成するのはそれほど難しくありません。

アイディア

必要なのは、各文字の後に1行下に移動することだけです。そのため、InsertCharPre自動コマンドでそれを実行しましょう。

コード

ディレクトリの.vimrc下のいくつかのファイルに入れてくださいplugin/

" enters insert mode to write vertically
function! VertStart()
    augroup Vert
        autocmd!
        " handles each entered character and moves cursor down
        autocmd InsertCharPre * call feedkeys("\<left>\<down>", 'n')
        autocmd InsertLeave * call VertEnd()
    augroup END

    inoremap <BS> <Up><Del>
    startinsert
endfunction

" cleans up on leaving insert mode
function! VertEnd()
    iunmap <BS>
    augroup Vert
        autocmd!
    augroup END
endfunction

" command to start writing vertically
command! Vert call VertStart()

使用法

:Vertコマンドを入力して、垂直方向に書き込みを開始します。挿入モードを終了すると、この「モード」は自動的に無効になります。もちろん、このコマンドを頻繁に使用する必要がある場合は、ショートカットにマップできます。

既知の問題点

  1. を介して挿入モードを終了する場合、縦書きは無効になりませんCtrl-C(これは、起動 Ctrl-CされInsertLeaveないイベントに関して少し奇妙な方法で実装された結果です。したがって、キーを使用するには注意が必要です)。

1
既知の問題#1への反論:で挿入モードを終了しないでください<C-C>
tommcdo

@tommcdo、私はしませんが、それがある場合、誰かがそれを使用します。略語の展開を避けることは実際に役立ちInsertLeaveます。このキーに対してなぜトリガーされないのか疑問に思っています。
xaizek

1
<C-C>挿入モードを終了する良い方法として、拒否の傾向を促進するつもりだと思います。あなたがそれを言及した方法は、それが時々良い方法であることを意味するかもしれません。「警告:コンピューターのプラグを抜いてMicrosoft Wordを閉じると、ドキュメントは保存されません」というようなものです。
tommcdo

@tommcdoこのように聞こえるかもしれないと思いました。<C-C>問題の理由であることに関するメモを追加しました。略語展開を抑制する挿入モードを終了する別の方法を私は知りません。もし<C-C>なければ、少なくとものようなマッピングの一部として有用ですinoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>
-xaizek

私は略語を考えていませんでした、それは良い点です。ヘルプで、<C-C>略語を展開せずに挿入モードを終了すると説明する場所を見つけましたが、InsertLeaveイベントがトリガーされない方法については言及していません。私はそれを行うための組み込みの方法があるかどうか今興味がありますが、今のところあなたのマッピングは素晴らしいアイデアです。
-tommcdo

4

通常どおり入力し、次のようにVimの置換を使用して現在の水平テキストを垂直に変換できます(現在の行に適用されます)。

:s/\(.\)/\1\r/g

または、覚えやすい方法は、次のコマンドのいずれかを実行することです(すべての行に対して):

:%!fold -w1
:%!grep -o .

現在の行またはそれ以上の行にのみ適用するには、を前に付けてV、必要に応じてより多くの行の領域を拡張し、上記を実行します(ただし、なし%)。

Windows上のPowerShellの場合、foldの置換を確認してください。

単純なキーマッピング(例:)を定義するにF2は、次を試してください。

:nnoremap <F2> V:!fold -w1<CR>

次に、何かを入力してを押すF2と、テキストが縦になります。


他の方法は、自動ワードラッピングを設定することです、例えば

:set tw=1 " textwidth
:set formatoptions+=t

空白が許す限り、1文字に近いテキストを自動的に折り返します。欠点は、各文字の後にスペースが必要であるということです(したがって、押すのとほぼ同じです)Enter


1
ではなく、機能的に同じものを:s/\(.\)/\1\r/g使用できます:s/./\0\r/g
ワイルドカード

1

マクロは、ブルームーンで1回しか実行しないことに興味がある場合、異常なことを行うための素晴らしい方法であることがわかります。次の表があるとしましょう:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    V

そして、あなたが交換したいとしましょうSome MsgOther Message。最初に、余分な文字(最後の前の行yy5p

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

私が思いつくマクロは、古いテキストを置き換えながら、テキストを水平から垂直に変換する処理を行います。最初の場所にテキストを入力することから始めます(カーソルはの終わりにありますOther Message):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  SOther Message |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

次のマクロを記録します。

  • qq:という名前のマクロの記録を開始 q
  • ^:行の先頭に移動
  • 3l:テキストが配置される列に移動します
  • x:古いキャラクターを削除する
  • l:右に移動して、古い文字の代わりにメッセージから1文字を残します。
  • v:ビジュアルモードに移動します
  • f|:にジャンプ |
  • 2h:2文字戻る
  • d:選択範囲をカット
  • j: 下に移動
  • P:カーソルの前に貼り付け
  • q:マクロの記録を終了します

この時点で、次のことができます。

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  other Message | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

マクロを十分な回数繰り返します(つまり、文字数ですが、事前に知る必要はありません。過小評価して、推定がどれだけ近いかを確認したら続行します)。で行きましょう10@q。あなたが得る:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%   ge |
%    |
%    |
%    V

OK、もう1つ(@q):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%  g |
%   e |
%    |
%    V

カーソルが最後になりましたe。このマクロは、最後の文字ではうまく機能しません(満足な結果が得られない場合は、試して@qからu(元に戻す)ことができます)。自分で調整するだけです(Xバックスペース用)。


非常に素晴らしい。マクロはvimを使用する方法です。私の素早い試みは基本的にあなたのものと同じでした。qq03lxldt|i ^[jPxq@q
ワイルドカード

@ワイルドカード、私は賛成票を投じることができますか?
シャーバズ

1
ハ!私の心を滑らせた。思った。:)
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.