curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

vimでテキストをソートする ひとりぷちアドベントカレンダー2017 20日目

vim内蔵のソートコマンド:sortについてのお話です。

ソート対象

次のテキストをいろいろ並び替えてみます。

bb,100
ccc,03
a,2
ccc,03

ふつうに

しんぷる。

:sort
a,2
bb,100
ccc,03
ccc,03

逆順

!を付けると逆順になります。

:sort!
ccc,03
ccc,03
bb,100
a,2

カンマの後項目で

ソートする際に無視する文字を正規表現で指定できます。 最初の,までを無視する場合はこちら。

:sort /[^,]*,/
ccc,03
ccc,03
bb,100
a,2

文字列としてソートされるのでちょっと残念な結果に...。

数字として見る

先ほどのものにnを追加すると、数字として見て並び替えてくれます。

:sort n /[^,]*,/
a,2
ccc,03
ccc,03
bb,100

そのほか、16進数や、少数を指定する方法もあります。

カンマの後の項目でその2

正規表現の利用としては、無視する、ではなく、該当部分でソート、もできます。rをつけるだけです。

:sort n r /\d\+/
a,2
ccc,03
ccc,03
bb,100

終わりに

内蔵なのでいつでも使えるのがよいですね。 正規表現を頑張るといろいろできます。

vimのdigraphsで遊ぶ ひとりぷちアドベントカレンダー2017 19日目

簡易なIME的機能、digraphsで遊んでみようというお話です。

入力と出力結果の関係性が面白いです。

digraphs

digraphs(ダイグラフ)は、キーボードに無い文字を入力する仕組みのひとつです。 簡易なIME的なものです。

2つのキー入力で、ひとつの文字を入力します。

日本の環境では立派なIMEが常備されているので、お目にかかる事はあまり無いかもしれません。

詳細が知りたい時はこちらをどうぞ。

:help digraph

使い方

入力状態のとき、Ctrl+kを押すと受付状態になり、?が表示されます。 その後に入力した2つキーから1つの文字を入力する事ができます。

f:id:curlune:20171219222513p:plain

一例

入力と出力結果の関係性は様々です。 多くは外見から来るもの、名称由来なものですが、謎な物も多いです。

一覧は:digraphsで確認できます。

外見

  • a:ä
  • -:÷
  • o/ø

名称

  • Co©
  • Ye¥
  • OK

日本語

  • tu
  • Tu
  • tU

終わりに

一覧を見るとなんだかワクワクしますね。

日本語50音そろっているので、頑張ると日本語フォントやIMEが無い環境でも日本語文章をつくれます!直接確認できないのでつらいけれども。

コード登録で少し面倒ですが、自分でオリジナルの組み合わせも利用できます。気になったらぜひヘルプ:help digraphを眺めてみてください。

vimのバックアップやスワップの保存場所を変更する ひとりぷちアドベントカレンダー2017 18日目

vimが自動生成するバックアップやスワップファイルの保存場所の変更方法についてのお話です。

最近は.gitignore等で無視してしまうので気にならない事が多いですが、稀に邪魔になるので別の場所に移してみます。

保存場所の変更

それぞれ次のような設定で保存場所を変更できます。 候補の先頭として任意の場所を指定しています。

" swap
set directory^=/path/to/swap
" backup
set backupdir^=/path/to/backup

ディレクトリは予め用意しておく必要があります。作り忘れると別の候補が利用されます。

単にファイルと同じ場所に作られる事を避けたい場合は次の設定でも大丈夫です。 候補の先頭になっている.(同じ場所)を取り除く事で、$TMP等の他の候補が使われます。

set directory-=.
set backupdir-=.

終わりに

ローカルではこれらのファイルにお世話になる事はあまり無いかもしれません。

リモートでは、通信切れてしまった場合など、たまーに活躍してくれます。

vimのエンコーディングいろいろ ひとりぷちアドベントカレンダー2017 17日目

vimエンコーディング周りのメモです。

エンコーディングを指定して開き直す

化けてしまって別の設定で開き直したい時に使います。 大体はこのあたりのどれかでok。utf-8utf8でも大丈夫です。

:e ++enc=shift_jis
:e ++enc=cp932
:e ++enc=utf-8

場合によっては先に内部エンコーディングを変えておいた方が良いかもしれません。

set encoding=utf-8

エンコーディングを指定して保存する

開くのではなく、今のファイルを別の設定で保存したい時に使います。

:set fileencoding=utf-8

文字化けしにくいようにする

文字エンコーディングの候補を設定すると文字化け確率を減らせます。もちろん、候補に無い物は化けます...。

:set fileencodings=ucs-bom,utf-8,cp932

最初のucs-bomは少し特殊な物で、バイトオーダーマーク(BOM)関係です。最初に入れておくと良いと思います。

候補の指定にはfileencodingsで、最後にsが必要です。fileencodingとは別のものです。

エンコードの判定

そもそもテキストファイルというものは、文字エンコードについての情報を持っていません。

そのため、各種エディタはいろいろ試して(あるいは固定)でエンコードを推測してくれています。

vimの場合は、候補リストのfileencodingsと内部エンコーディングencodingを使って推測してくれます。

  • fileencodingsの先頭の設定で開いてみる。
    • 成功した場合は確定!
    • 失敗した場合は、次の設定で繰り返す。

成功/失敗は、不正なバイト列があるかどうかで決まります。 なので、中身が空の場合や文字が少なく偶然成功した場合は、先頭の方の候補として誤認識される場合もあります。

ゴミが入っている場合も失敗します。utf8なファイルだけど、壊れたバイトが含まれてしまっているという場合は失敗にしてしまいます。 以前にディスクがあふれて途中まで書きこまれ、壊れたバイトを含むため正しく開けない、なんてことがありました。

終わりに

テキストファイルさん、エンコード情報何処かに持っていてほしかったなあ。

vimとxxdでバイナリ情報をみる ひとりぷちアドベントカレンダー2017 16日目

バイナリをちょこっと見るだけならvimでもできるよというお話です。

バイナリ相互変換

次のコマンドで編集中のファイルのバイナリ表現を表示できます。-g1はグループ化単位の数です。なぜか初期値は2ですが、1のほうが使い勝手が良いと思います。

:%!xxd -g1

また、次のコマンドでバイナリ表現の通りのファイルを変換できます。

:%!xxd -r

xxd

xxdvimに付属しているテキスト/バイナリ相互変換をしてくれるコマンドです。githubからvimコードを取ってきてビルドすると、一緒に出来上がっています。

1文字だけ確認したい場合

単に1文字のバイナリ表現を確認したい場合は、内蔵機能で確認する事ができます。 確認したい文字にカーソルを合わせてg8を入力するとバイナリ表現が確認できます。

終わりに

よくわからないファイルのバイナリがお手軽に確認できてたまーに便利です。 増減無しの書き換えのみの場合は-rのバイナリ化は分かりやすくてよいですね。

vimの'backspace'は全部入れておこうというお話 ひとりぷちアドベントカレンダー2017 15日目

vimset backspaceは全項目入れておかないと混乱しやすいよ、というお話です。

変な値になっていると編集動作がだいぶ独特になるのです。

これを設定しておけばオーケー

:set backspace=indent,eol,start
" あるいは こっち(同じ意味)
:set backspace=2

backspaceで変わる事

値が足りないと、消せない物が増えます。 特にstartが入っていない(2以外)時の動作は、独特だなあと思っています。

ざっくりというと入力の開始が、IMEで日本語入力中の未確定の状態、の英語版?物になるのです。

f:id:curlune:20171215235702p:plain

未確定の範囲しか消せず、区切りが表示されないので分かりにくいです。さらにカーソルを移動すると確定され、削除範囲が無くなる、的な動作です。

という訳で全部入れておきましょう。

終わりに

むかーし混乱しました。

今日のvisaレートを確認する ひとりぷちアドベントカレンダー2017 14日目

なんだかんだで海外でのお買い物が増えてきたので、サクッとvisaレートを確認するスクリプトをつくってみました。

今日のvisaレート確認ページを開く

最初のfに為替の手数料(%)を入れます。

javascript:(function(){f=2;d=new Date();window.open('https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=JPY&toCurr=USD&fee='+f+'&exchangedate='+[d.getMonth(),d.getDate(),d.getYear()].join('%2F')+'&submitButton=Calculate+Exchange+Rates')})()

終わりに

いろいろと準備が間に合わない...