vimで内容が空のファイルを保存したら自動で削除する

vim/gvimで開いたファイルを削除したい時があります。
:Explore や shellコマンドでも良いのですが、単純にファイルの中身を全削除して保存したらファイル自体も削除するように設定しています。


以下を .vimrcに追加します。

augroup BUFWRITE_POSTDELETE
  au!
  autocmd BufWritePost * call BufWritePostDelete()
augroup END

function! BufWritePostDelete()
  if search('^.\+$', 'ncw') == 0
    call delete(expand('%:p'))
  endif
endfunction


ファイルの中身に関わらず削除してはいけないファイルがある場合は、特定の拡張子の場合(例えば txt)だけ中身のないファイルを削除するようにした方がよいかもしれません。

augroup BUFWRITE_POSTDELETE
  au!
  autocmd BufWritePost *.txt call BufWritePostDelete()
augroup END

QFixGrepとQFixHowmのアップデート(Ver.2)

QFixGrepと QFixHowm Ver.2へのメジャーアップデートを行いました。

詳しいアップデート内容については以下を参照して下さい。
QFixGrep QFixHowm Ver.2


Ver.2ではQuickfix関係の処理を必要最小限(プレビューと絞り込み)のみ行うように変更しました。
Ver.1ではウィンドウの分割をあまり考慮せずに処理されていましたが、Ver.2でのファイルオープンやウィンドウ分割の挙動は vim本来の挙動に修正されているのでウィンドウ分割を柔軟に行えるようになっています。

またVer.2リリースに際して個人的に使用していないコマンドを含めて一通りの動作チェックと、Windows/Linuxの空白を含むパスでの動作チェックを行いました。

JpFormat.vim から外部ビューアを開く

vim/gvim用日本語整形プラグインJpFormat.vimで整形しながら編集しているファイルには連結マーカーが埋め込まれています。
このため青空文庫ビューアのような外部ビューアを起動して縦書き表示で確認するような場合、ルビや制御用スクリプトなどの途中に連結マーカーが挟まれているのが問題になることがあります。
この問題に対応して JpFormat.vim使用中の文書を外部ビューアで開く際に分割行の連結とファイルエンコーディングの変更を行ってから外部ビューアへ渡すコマンドを追加しました。

JpFormat.vim自体については「vimで日本語を禁則処理などの整形をしながら編集する」を参照してください。

続きを読む

vimで日本語を禁則処理などの整形をしながら編集する

JpFormat.vimvim/gvimで日本語の禁則処理を行いながら、規定の原稿形式にフォーマット整形するプラグインです。
vimでのメールの下書きや、青空文庫の小説などの長文を読むような場合に整形してやると読みやすさが結構違ってきます。

JpFormat.vimの大きな特徴は疑似ソフトラップが行える事です。
実際に折り返しを行う際には改行を埋め込みますが、表示上の改行をマーカーで管理するので原稿形式を何回変更しても元の構造は保持され、何度整形しても何時でも元の非整形状態に戻せるために安心して書きかけの原稿に整形を掛ける事が出来ます。
このため未完成原稿でも整形結果を表示しながら、挿入モードで一文字入力する度に自動整形するような使い方もストレス無く実行出来ます。
未完成原稿ではマーカーを使用して整形し、最終原稿ではマーカーを使用しないで整形を実行するか連結するというのが主な使い方になります。


主な機能は以下の通りです。

  • 手動整形
  • 整形結果を表示しながらの編集と自動整形入力
  • 原稿枚数の計算
  • 外部ビューアとの連携


vim単体でも wrapmargin や textwidth などを使用して整形が行えますが、日本語の禁則処理は考慮されていませんし、空行のみを段落の区切りとみなして連結して改行を埋め込んでしまうので本来の構造が失われます。
JpFormat.vim では空白行ではなく改行を段落として扱うので、小説の会話文のように改行に意味のある文書でも整形できます。


JpFormat.vim自体はただのコマンド群ですので gq や他の整形プラグインと併用可能です。

続きを読む

vimで階層付きテキストをアウトラインプロセッサ風に表示する

行頭の . の数で階層を示す、いわゆる「階層付きテキスト」を vim/gvimで閲覧する時に折りたたみを使用するとアウトラインモードっぽく閲覧できて結構便利です。
.vimrcに以下を追加してやると txtファイルで行頭に . や * = がある行の間を折りたたみます。

"デフォルトでは折りたたみを無効にしておく(必要時に zi などで有効にする)
autocmd BufNew,BufRead *.txt setlocal nofoldenable
autocmd BufNew,BufRead *.txt setlocal foldmethod=expr
autocmd BufNew,BufRead *.txt setlocal foldexpr=getline(v:lnum)=~'^[.=*]'?'>1':'1'

Linuxのgvimで日本語入力を使いやすくする

vimで日本語入力する時に一番問題になるのはIMの切替です。
とくにLiunxの場合アプリケーションからの入力モード変更が出来ないIMもあり、vimの挿入モードで日本語入力のためにIMをONにしてから ノーマルモードに戻ると、IMがOFFにならないので切替が面倒な場合もあります。

これを解消するためにノーマルモードへ移動すると自動的にIMをオフにして、ついでに「Windowsのgvimで日本語入力を使いやすくする」でやっているように日本語入力固定モードが使えるようなスクリプトを作成して使用しています。

日本語入力固定モードを使用すると、一時的に日本語を入力したい場合と日本語をメインに入力したい場合とで挿入モード移行時のIMモードを自動で切り替え出来るのでかなり使いやすくなります。

今回の例ではホットキーが使用できれば制御できるので、特にどのIM専用というわけではありません。

続きを読む

vimで縦に連番を入力する

vim/gvimで縦に連続した番号へ置換したいときがあります。

fuga[0]
fuga[0]
fuga[0]

これを次のように変更したりする場合です。

fuga[0]
fuga[1]
fuga[2]


適当なのが見あたらなかったので、適当に作ってみたものを使用しています。
.vimrc(_vimrc) に追加して使います。

nnoremap <silent> co :ContinuousNumber <C-a><CR>
vnoremap <silent> co :ContinuousNumber <C-a><CR>
command! -count -nargs=1 ContinuousNumber let snf=&nf|set nf-=octal|let cl = col('.')|for nc in range(1, <count>?<count>-line('.'):1)|exe 'normal! j' . nc . <q-args>|call cursor('.', cl)|endfor|unlet cl|unlet snf

使い方

カーソルを連番に置換したい数値に合わせて 3co と実行すると、縦に3行分が連番に置換されます。
ビジュアルモードで選択してから co だと選択行が連番に変更されます。
を使用しているので、連番変更の対象になるのはカーソル位置から最も近い右側の数字です。
必ずしも数値の上でなければいけないという事はありません。
ただし対象範囲は全て同じ数字(開始値)にしておく必要があります。
また puyo1, puyo2, ...のような数値にも有効です。

fuga[2][1]
fuga[2][1]
fuga[2][1]

puyo1
puyo1
puyo1


数値が不揃いの場合は

  1. で数値部分を矩形選択
  2. s0 などとして連番の初期値に置換
  3. gvで範囲再選択
  4. co

という感じに、整形してから連番変更すると良いのではないかと思います。


ビジュアルモードでは に割り当てるとそれっぽいかもしれません。

vnoremap <silent> <C-a> :ContinuousNumber <C-a><CR>
vnoremap <silent> <C-x> :ContinuousNumber <C-x><CR>


(注意)
連番処理に を使用しているため、 04 のように最初が0で始まる数値は8進数として扱われます。
8進数処理が必要でない場合は nrformatsから8進数を認識しないよう設定すると良いかもしれません。

set nrformats-=octal