月別アーカイブ: 2016年4月

Visual Studio Code (Mac, Linux)

Linux で Windows アプリを使おうとする人が理解できない。
郷に入れば郷に従え、せっかく海外に留学したのに日本語しか話さないようなものだ。

なので筆者の愛用テキストエディタは Linux では Gedit。
Mac では Mac ユーザーに人気の高い Atom を。

だったけど Atom に色々不満が。
なんたって今では標準プラグインをこうしているし。

atom_setting

補完機能は全て無効、だって中途半端で邪魔なだけなんだもん。
自動補完は Visual Studio レベルでないとイライラするだけ。
これじゃ単なる色分けできるテキストエディタだ。

再起動で前回開いていたファイルを開き直しするのがウザい。
スマートフォンだとありがたいこの動作がパソコンではイライラ。

Alt(option)+上下矢印キーで行の入れ替えができないとか。
ドラッグアンドドロップ編集ができないとか。

筆者的には拡張子が無いファイルを見分けてくれないのが地味に痛い。
それをなんとかする modeline プラグインを入れたが効果無し。
Fedora で多用していた emacs 形式 modeline のプラグインも見当たらない。
自分で作れって?他の不満がこんなに多いのに嫌だよ。

そんなこんなで、今回は Visual Studio Code を試す。
こんな名前だ、どのくらい本家 Visual Studio のレベルなんだろう?

レビューを探すと仕事でバリバリ使っている凄い人ばかり…
以下はサンデープログラマーのレビューということで。

まず、JavaScript の保管機能は文句のつけようが無い。

array

配列の後にドットを打つと配列のメソッドのみが候補窓に現れる。
選択状態になった時点で return(Enter) で確定。
括弧を打つとパラメーターの解説窓が出る。

括弧関連の自動保管が神がかっている。
自動保管なのに勢いで閉じ括弧をタイプしてしまう場合が多々ある。
すると何事もなかったように保管された閉じ括弧の後ろにカーソルが移動する。
ブレースの後に改行すると当然のようにインデント。

Visual Studio C# での鬼補正や全自動整形はさすがにできない。
しかし Visual Studio C++ と同じレベル、いやもっと凄いかも。

さすが Visual Studio という名前にしただけはある。
これなら補完機能を無効にするほうが馬鹿だと断言できる。

コードスニペットも使えます。
for とか forin とか打ち込んで tab キーを叩いてみてください。

文字列を選択状態にしなくても shift+tab でインデント戻し。
option(Alt)+上下矢印キーで行の入れ替え。
よしよしできる。

文字列を選択状態にしなくても command(Ctrl)+C でカーソル行のコピー。
Visual Studio 以外で見たことがないこの機能もまさか使えるとは。

何故か初期状態では C# 関連は無効になっている。
extension で入れられるみたい、筆者はいらないけど。
Mac で Unity プログラマーも多いだろうけど Unity 関連の保管は無いかと。

さて肝心の modeline は emacs 形式も使えるものが extensions にあった。
あれ、tab 関連は普通に指定できるけど Mode: がスルーされるんですけど。
ソースコードを覗いてみよう、~/.vscode 以下にあるよ。

modeline

editor.language なんて設定は無いよ!
README.md に書いてあったけど現在は不可能らしい、気長に待つか。

褒めてばかりでなく欠点もいくつか。

この文書みたいなのの下書きに使うと保管でウザすぎるwww
ドラッグアンドドロップ編集はできない、残念。
OLE DnD も、筆者はよく使うのになぁ。
TextEdit.app で文字列選択して Safari のアドレスバーにドロップして検索とかで。

結論、Atom ヤメてしばらくコイツを使ってみる。

Fedora にも入れた、ただ Makefile も install.sh も無かった。
~/app に全部放り込んで ~/bin に vscode というファイル名で。
パスは変えてね。

#!/bin/sh

/home/sasakima-nao/app/VSCode-linux-x64/code $@

vscode.desktop を ~/.local/share/applications に。

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=vscode %U
Name=Visual Studio Code
Comment=Visual Studio Code
Icon=/home/sasakima-nao/app/VSCode-linux-x64/resources/app/resources/linux/code.png
StartupNotify=true
Categories=Education;Languages;
MimeType=application/javascript;text/plain;

linux_vscode

最初に書いたことと矛盾しているようでしていない。
本家 Visual Studio がある Windows でコレ使う人いるの?

Gjs new

Gjs のサンプルコードを探していると???となることが多い。
new キーワードの有無がマチマチ、パラメータが JSON か否か。

JSON イラネーだろ!と外すと動かないし、もう何がなんだか。
海外でしかサンプルコードが見つからないから英語でよく解らない。

だったけどやっと解決した。

#!/usr/bin/gjs

const Gio  = imports.gi.Gio;

/* After new @ Params ALl */

let uostream = Gio.UnixOutputStream.new(0, false);
let dostream = Gio.DataOutputStream.new(uostream);
dostream.put_string("Enter Some String :", null);

let uistream = Gio.UnixInputStream.new(1, false);
let distream = Gio.DataInputStream.new(uistream);
[txt, len] = distream.read_line_utf8(null);
print(txt);

/* Before new @ Params Json  */

let uostream2 = new Gio.UnixOutputStream({fd: 0});
let dostream2 = new Gio.DataOutputStream({base_stream: uostream2});
dostream2.put_string("Enter Some String :", null);

let uistream2 = new Gio.UnixInputStream({fd: 1});
let distream2 = new Gio.DataInputStream({base_stream: uistream2});
[txt2, len2] = distream2.read_line_utf8(null);
print(txt2);

コレだけのことだったのかYO!

どのオブジェクトも new はキーワードでもメソッドでもいい。
メソッドにしたら C 同様にパラメーターを全部埋める。
キーワードにしたら JSON で、null やゼロなら埋めなくてよし。

どっちも面倒臭い。
new も null パラメーターもいらない、としてくれるのが一番なんだけど。
ついでにセミコロン、ってソレが PyGObject だった。

GTK+/開発 – ArchWiki

GObject Introspection って今はこんなに沢山の言語から使えるのね。
GNOME 自前の Gjs でさえ情報が少ないのに他はどうするんだって感じですが。
結局 Python が一番情報が多いのは GTK2 時代と同じですね。

ところで。
let
Google Chrome, Firefox がいつのまにか let 宣言に対応しているね。
後は Safari だけだな、osascript でも使えないけど。

Mac JavaScript 日本語

osascript にて文字列のファイル保存。
いくら探しても皆アルファベットでしか保存していない。
理由はコレ。

#!/usr/bin/osascript

ObjC.import("Cocoa");

var jstr = "日本語が化ける";
var fname = "/Users/sasakima-nao/ng.txt";

app = Application.currentApplication();
app.includeStandardAdditions = true;

var refno = app.openForAccess(Path(fname), {
    writePermission: true
});
app.write(jstr, {
    to: refno
});
app.closeAccess(refno);

var cmd = "cat " + fname;
app.doShellScript(cmd);

cat_xxx

doShellScript の cat では普通に日本語処理できている。
けど普通に cat すると見事に文字化けするんだなぁこれが。
TextEdit.app で開くと問題無し、だけど別名保存しようとしてみよう。

textedit_jp

日本語(Mac OS) って何だよ?

MacJapanese – Wikipedia

コレらしい、osascript の内部文字列は古い Mac のままなのか…
AppleScript 自体は昔からあるのでそのまんま拡張しただけと憶測。
結果文字列をそのまま保存すると内部文字列のままで出力されると。

Mac 内製アプリは対応しているけど今の $LANG は UTF-8 だよ。
NSString は UTF-16 みたい、Mac も Windows と変わらないカオスだった。
Linux が一番進んでいるって笑えないYO!

とりあえず iconv で変換すればいいのかな?

UTF-8-MAC なんていう文字コードはありません | ものかの

cat ng.txt | iconv -f UTF8-MAC -t UTF8

とやってもエラー、UTF-16 から変換にすると中国語?
手段はあるだろうけどブン投げる、調べるだけ時間の無駄だ。

だって UTF-8 で出力しないと意味無いってば!

#!/usr/bin/osascript

ObjC.import("Cocoa");

var jstr = "コレなら日本語 OK です\n";
var fname = "/Users/sasakima-nao/ok.txt";

var nsstr = $.NSString.alloc.initWithString(jstr);

var data = nsstr.dataUsingEncoding($.NSUTF8StringEncoding);
var res = data.writeToFileAtomically(fname, true);
if (res) {
    app = Application.currentApplication();
    app.includeStandardAdditions = true;
    var cmd = "cat " + fname;
    app.doShellScript(cmd);
}

これでなんとかなった。
NSString に変換して UTF-8 で NSData に変換してバイナリで保存。

cat.ok

Apple が作っている言語なのに何だよこのアホ臭さ。
結論、コンソールアプリはサードパーティの言語でやったほうがいい。

でもこういうことに苦戦するのがプログラミングの楽しみでもあって。
Linux に移行した直後に pygtk と格闘していた頃も楽しかった。