2020-05-30

5/30

UbuntuデスクトップのVS Codeでフォント変更

ターミナルで記号が豆腐になってしまったので、Nerdフォントにしたのだが、すぐに反映されないような気がしたら、VS Codeの再起動が必要だった。

キーワード: Visual Studio Code, Powerline Fonts

VS CodeでRustのプラグインがインストールできない

作業環境はUbuntuデスクトップ。
久しぶりにRustを触ったのがいけなかったのか、本来はVS Code上でポップアップ通知に従ってrlsやanalyzerをインストールすればいいはずなのだが、次のエラーで失敗した。

error: toolchain 'stable-x86_64-unknown-linux-gnu' does not contain component 'rls' for target 'x86_64-unknown-linux-gnu'

ググると次のイシューにヒットし、再インストールで解消した。

https://github.com/rust-lang/rls/issues/1273

rustup uninstall stable
rustup install stable

参考:

cargo-editというのがある

2018-02-06更新の記事: Cargo.toml の編集に cargo-edit を使う - Qiita

Rustのパッケージ管理ツールである cargo CLIに以下の機能を追加してくれる:

  • cargo add <Package> … 依存パッケージを追加
  • cargo rm <Package> … 依存パッケージの削除
  • cargo list … 依存パッケージ一覧

絶対必要というほどではないが、便利かも。

RustのCLI作成チュートリアル

A command line app in 15 minutes - Command Line Applications in Rustをやっている。

初めて出くわしたライブラリや言語仕様を都度、調べながらなので遅々として進まないが、いま1.3. First implementationまで来たところ。

わからなかったこと

Nicer error reporting - Command Line Applications in Rust

fn main() -> Result<(), Box<dyn std::error::Error>> {
  :
}

のように、main()でResult型を返すようにしたところ、下のようにコンパイルエラーになってしまう。

error[E0308]: mismatched types
  --> src/main.rs:13:14
   |
13 | fn main() -> Result<(), Box<dyn std::error::Error>> {
   |    ----      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()`
   |    |
   |    implicitly returns `()` as its body has no tail or `return` expression
...
28 |     Ok(());
   |           - help: consider removing this semicolon
   |
   = note:   expected enum `std::result::Result<(), std::boxed::Box<(dyn std::error::Error + 'static)>>`
           found unit type `()`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: could not compile `grrs`.

そういえばエラー情報を見てなかったので、見てみた。

$ rustc --explain E0308 | cat
This error occurs when the compiler was unable to infer the concrete type of a
variable. It can occur for several cases, the most common of which is a
mismatch in the expected type that the compiler inferred for a variable's
initializing expression, and the actual type explicitly assigned to the
variable.

For example:

    let x: i32 = "I am not a number!";
    //     ~~~   ~~~~~~~~~~~~~~~~~~~~
    //      |             |
    //      |    initializing expression;
    //      |    compiler infers type `&str`
    //      |
    //    type `i32` assigned to variable `x`

まあ型のミスマッチが起こっているようだが、動かないコードを初心者向けのサンプルにしないでほしいという気持ちはなきにしもあらず。

また、次のように書き換えたところ、別のエラーが出た。

#[derive(Debug)]
struct CustomError(String);

fn main() -> Result<(), CustomError> {
    let args = Cli::from_args();

    let content = std::fs::read_to_string(&args.path)
        .map_err(|err| CustomError(format!("Error reading `{}`: {}", &args.path, err)))?;
    :
}

エラー:

error[E0277]: `std::path::PathBuf` doesn't implement `std::fmt::Display`
  --> src/main.rs:20:70
   |
20 |         .map_err(|err| CustomError(format!("Error reading `{}`: {}", &args.path, err)))?;
   |                                                                      ^^^^^^^^^^ `std::path::PathBuf` cannot be formatted with the default formatter
   |
   = help: the trait `std::fmt::Display` is not implemented for `std::path::PathBuf`
   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
   = note: required because of the requirements on the impl of `std::fmt::Display` for `&std::path::PathBuf`
   = note: required by `std::fmt::Display::fmt`
   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

rustc --explain E0277 を見ると下のようだった:

You tried to use a type which doesn’t implement some trait in a place which expected that trait.

traitが期待されているところで、traitが実装されていない型を使ってしまった、ということのようだ。

Erroneous code example:

// here we declare the Foo trait with a bar method
trait Foo {
    fn bar(&self);
}

// we now declare a function which takes an object implementing the Foo trait
fn some_func<T: Foo>(foo: T) {
    foo.bar();
}

fn main() {
    // we now call the method with the i32 type, which doesn't implement
    // the Foo trait
    some_func(5i32); // error: the trait bound `i32 : Foo` is not satisfied
}

以下、略。

これはPathBufの型がイカンようなので、format! 氏が期待している型にしてあげれば動きそうな気がする。

&args.path.display() としたら動くようになった🎉

Karabiner-Elementsで「かな」キーでIMEトグル

2019-11-07にも同じことをやったのだけど、いつものMac機では⌘英かなというアプリを使っていた。

「⌘英かな」だと、トグルのキーを押してもまずモーダルウィンドウが表示されて、さくっと「日本語」<->「英数」に切り替わってくれない。
ので、このMac機でもKarabiner-Elementsを使うことにした。

作業時のOSバージョンはmacOS Catalina.

設定は前回と同じで動いた。
dotfiles (myenv)にpushしておいた。

NOTE:

  • メニューバーのアイコンは毎回ちゃんと切り替わってくれるが、実際にはIMEが切り替わっていないことが、2回に1回ぐらい発生する