nvim(init.lua)を使い始めました

neovimをちゃんと使えるようにした

お久しぶりです。

この3連休でVimの棚卸しをしていてとても有意義な休日を過ごすことができました。

本来であればさらっとプラグインの棚卸しをしてあとはダラダラ過ごしていたのですが、今回の休日を利用してさらにneovimを使えるようにしておこうということでluaで設定を書いてみることにしました。

きっかけはUbuntuと同じ.vimrcをMacに対して適用したときに動かないことがありフラストレーションが溜まっていたことです。

最終的にLSPやTelescope、nvim-tree、copilot等の設定をして動かせるようになるところまでいけました。

最終イメージ

書き慣れてないけどなんとなくで設定できる

最近のムーブメントなのか、他のアプリでも同じようにluaで設定する方式を採用していたりします。

例えば最近使い始めたweztermluaで設定します。

私自身luaは全くと行って良いほど書いたことありませんでしたが、javascriptっぽいのでなんとなくで書けてしまいました。

最初にしたこと

1からluaで書きたいと言っても、お作法が一切分からない状態だったのでまずはYoutubeで設定方法を見てやりやすそうなものにしました。

大変参考になったのは以下の動画です。

www.youtube.com

注意点としてはディレクトリ名やGroup名に話者のハンドルネームがちょいちょい入ってくるところと、LSPのところは必要最低限の説明があるだけなのでそこから自分で追加のLSをインストールする必要があるところです。

このチュートリアルの通りに進めてさらにLSをインストールする場合は:Masonを用いてインストールするか、lsp.luaに以下の形で追記する必要が有ります。

lsp.lua

lsp.ensure_installed({
  'cssls',
  'bashls',
  'tsserver',
  'rust_analyzer',
  'lua_ls',
  'jedi_language_server',
  'jsonls',
  'dockerls',
  'docker_compose_language_service',
  'yamlls',
})

サーバー名は以下で確認できます github.com

見た目を弄る上での注意点

私も少しハマったのですが、見た目に変更を加えようとしても反映されないことがあります。(Not Foundとかが起こります)

よく起きるのは:colorschemeを設定するところです。

※上に貼った動画で言えばafter/plugin/colors.lua

これを解決するためにはPackerのコンパイルをしなおす必要が有ります。

.config/nvim/lua/"自身で設定した名前"/packer.lua上で:soの後に:PackerCompileを実行すると上手く行きます。

設定してみて

vimで出来ることは一通り設定できたので、これからしばらく使い倒してみて乗り換えるか検討してみようと思います。

weztermとの出会い

新しいターミナルを探していました

お久しぶりです。

最近、趣味で使用しているターミナル環境に不満を持ち、weztermに変更することにしました。

理由は簡単で、もっと色々設定できてしかも簡単で早くていろんな環境で動くやつを使いたいと改めて思ったためです。

これまではUbuntuMacで開発する上でgnome-terminalterminologyiTerm2を使ってきていました。

ターミナル上で直接画像表示して画像ファイルをさっと見たい用途からterminologyやiTerm2を使っていたのですが、ここに来て不満が爆発しました。

そんな折に出会ったのがweztermです。

wezfurlong.org

最も気に入った点

設定がluaで書けてスッキリすることや設定できる範囲が広いことも利点としてあるのですが、私を惹きつけたのは手厚いドキュメントでした。

普段ドキュメントがしっかりしているかでAPIを選んだりしているのに趣味の開発ではREADME.mdすらロクに書かないのは何故なのだろう。七不思議の一つです。

その点、weztermの作者はドキュメントをしっかり書いていて凄いと思いました。

とにかく分からないことがあっても公式ページを見れば分かるのが有り難いですね。

まだ使いはじめて間もない

結構良さそうだみたいな記事を書いていますが実はまだ使いはじめて間もない(今日)ので、もしかしたら不満に思う部分が今後でてくるかもしれません。

たとえばweztermを起動した状態でsuspendして復帰した後にwezterm上でibus(Mozc)が復帰してこなくて使えなくなるとか。

これについては現状suspend明けに以下を実行するように設定して解決しています。

ibus-daemon -drx

もっとスマートな方法を見つけたら変えていきたいです。

ちなみに現状の設定状況はこんな感じです。

.wezterm.lua

local wezterm = require 'wezterm'

local config = {}

if wezterm.config_builder then
  config = wezterm.config_builder()
end

-- フォント設定
config.font = wezterm.font("Ubuntu Mono", {weight="Medium", stretch="Normal", style="Normal"})
-- ウィンドウタイトルや枠の表示設定 (タイトルは表示しない)
config.window_decorations = "RESIZE"
-- タブが一つしかないときは表示しない
config.hide_tab_bar_if_only_one_tab = true
-- 背景画像がないときの透過率
config.window_background_opacity = 0.8

-- 背景画像の明るさ
local dimmer = { brightness = 0.3 }
config.background = {
  {
    source = {
      File = '画像ファイルへの相対パスまたは絶対パス(~は効かない)',
    },
    -- 背景画像が小さくて折り返すときはミラーリングする
    repeat_x = 'Mirror',
    -- 明るさの適用
    hsb = dimmer,
    -- ビューポートスクロール時の移動量(10%)
    attachment = { Parallax = 0.1 },
    -- 背景画像の透過率
    opacity = 0.90,
  }
}

return config

こういう設定ファイルを育てていくのってテンション上がりますよね。

たまごっちみたいな感じがします。しますよね?

おもったこと

こういうのあるよって話し合える仲間がほしいと思った今日この頃なのでした。

Vimでもエラーメッセージ表示をテキストエリアに表示できるようにする

nvimで出来るのにvimだと出来ない?

coc-nvimを使用したときにnvimではerror/warning文がテキストエリア(window)に表示されるのにvimでは表示されないことがありました。

こんな感じのやつ

import
const Manage = () =>{ // E: Expression expected.  ←コレが出ない

コレは単純に「vimのバージョンが低い」ことが原因でした。

coc-nvimが求めているvimのバージョン

公式で求めているバージョンは以下です。

github.com

Quick Start
Make sure use Vim >= 8.1.1719 or Neovim >= 0.4.0.

Install nodejs >= 14.14:

そしてUbuntuクリップボードを使えるようにするのに一般的?なのがvim-gtkをインストールすることだと思います。

aptで入るのはv8.2です。私はとりあえずこれを使用していました。

このことから取り敢えずプラグインを使えば全部使えるんでしょ?と思い込んでいましたが、一部の機能は使うことが出来ませんでした。

それが最初に話していたエラー文が表示されるやつです。

nvimだといけるのになんで?と試行錯誤

実際のところapt install neovimではいるnvim(v0.6.1)では出来ていて、vimだけ出来ないということで色々調べてみましたが同じ症状の人が見つかりませんでした。

私はMacでも開発をするのでMacでも使用できるようにプラグインを導入してみることにして試してみたところMacだと上手く行っていました。

Macのほうはbrew installしたVim(v9.0)

このことから最終的にVimのバージョンを上げることで解決しました。

ここにたどり着くまでにVimの構成ごと壊してしまい起動できなくなったこともありました。(vim-tinyごと飛ばした)

おかげでnanoの使い方がわかりました(今更)

ですので、同じ状況の人の参考になればと思い書かせていただきました。

ちなみに

立ち上げるたびにエラーが出るようになったんだが?という方はプラグインを一部読まないような形にしながら試していくと原因が見えると思います。

私の場合はindentLineを無効化したらエラーがなくなり、最終的な原因は以下の設定でした

エラー内容

BufWinEnter Autocommands for "*"..function <SNR>147_Setup[6]..<SNR>147_IndentLinesEnable[11]..<SNR>147_SetConcealOption の処理中にエラーが検出されました:

.vimrc

let g:indentLine_concealcursor = 0

これを消したらエラーは消えました。

バージョンのあげかた

最後にVimのバージョンを上げる方法だけさらりと書いて終わります。

まず、リポジトリを追加して

sudo add-apt-repository ppa:jonathonf/vim

次にアップグレードをして完了です

sudo apt upgrade

ちなみにこれ単体ではクリップボードを使えないので、make installしたくないけど使いたい方は以下のようにgvimを入れるとバージョンを維持しながらクリップボードを使えるようになると思います。

sudo apt install vim-gtk3

coc.nvimでPrettierを無効化する

NeoVimへの乗り換え検討中

今まで個人開発においてLSPをほぼ使ってなかったのですが、NeoVimへの検討を進めているうちにVimでも出来ることがわかり触ってみました。

仕事をする上ではVSCodeとかでたまに使っていましたがそれほど参考にしていませんでした。

(そんなに難しい仕事でないので)

しかし最近新たに言語を覚えていこうとしている中で中身を簡単に見られる機能は助かります。

ちなみにLSPとは生成AI(Labs)さん曰く

LSP エディタは、Language Server Protocol (LSP) を使用するエディタです。LSP は、2016年に Microsoft によって発表された開発支援ツールのためのプロトコルです。 LSP は、開発ツールと言語サーバープロセスの間で交換されるメッセージを標準化します。これにより、1つの機能サーバを複数の開発ツールで再利用でき、開発リソースを効率化することができます。 LSP は、VimEmacsVisual Studio Code (VSCode) などの著名なテキストエディタで広く使われています。 LSP は、テキスト補完などの開発支援機能をサーバとクライアント(エディタ)の2つに分けます。サーバは、プログラミング言語ソースコードを解析したときに得られる情報をコードエディターに提供します。

とのことです。

そんな折にReactでtsxを書こうとしているときに「なんかimportとかtsxの部分が赤くなるんだが?」状態になって気になったので原因を調べてみました。

何のことはない問題(?)

coc.nvimを使ってみるとLSPが走るまではよくて、いい感じに動きます。

しかし、同梱されているPrettierという存在がエラーを吐いていました。

恐らくReactの書き方が根本的におかしいのが原因ですかね?

Reactはしっかり作ろうと思ったことがないので何が正しいのか不明です。

平たく言えばファイルを保存するときにいい感じに悪いところを直してくれたり、いい感じに書く方法を教えてくれる機能らしいですが、個人で作る分にはそこまで気にしなくて良い機能なので無効化しました。

設定方法

設定するにはエディタを開いて:CocConfig実行します

設定ファイル(json)が開かれるので以下のように入力します

{
  "languageserver": {},
  "diagnostic.enable": false // これ
}

おわりに

nvimを触ってみたいとかいいつつ、エラーが出たらvimで動作確認してしまうので先にvimが動くようになってしまいますね。

何かきっかけが出来るまではしばらくvimで良いのかもしれないと思いました。

neovimを触って見た感想

インストールして30分だけ触ってみただけの感想

他の会社のエンジニアの人と話す機会があって、なんやかんやあって職場で流行ってるエディタの話になりました。

基本的にVSCodeだよねみたいな話で纏まっていたのですが、vimよりnvimのほうがいいよみたいな事を言われたので試しに使ってみようということで休日を利用して触ってみることにしました。

今日、はじめて触って見た第一印象をメモしておきます。

設定について

私は結構.vimrcを弄っているのですが、移行させるのが面倒くさそうみたいなのが第一印象でした。

init.vimに移せばいけるよみたいな事は調べて出てくるので試してみましたがゴリゴリにエラーを履かれてやる気が削がれました。

(特に自身の定義している関数周りが死亡しました)

これを書き直すのは結構めんどくさいなというのが第一印象でした。

とりあえずエラーが出ない形でプラグインのインストールを一通りして、使えるようになるところまではすぐにいけました。

luaで書き直すのは正直考えたくありませんが、必要が出てきたら書いてみようと思います。

動作について

なんだかとてもスクロールが遅い印象でした。

statusline周りが原因で遅そうな雰囲気を感じ取っている次第です。

30分では正直原因を追いきれませんでした。

Terminalについて

Terminal-Normalモードでバッファ全体に開くのが違和感強すぎて無理でした。

とはいえ、コレについては以下のように設定することでvimの初期状態と同等の動作を実現することが出来ました。

設定方法

" vimと同じ操作感でTerminalを開く
" インサートモードで開始
autocmd TermOpen * :startinsert
" 行番号を表示しない
autocmd TermOpen * setlocal norelativenumber
autocmd TermOpen * setlocal nonumber
nnoremap <silent> <leader>sh <cmd>sp new<CR><cmd>terminal<CR>

こうすることでleader + shで画面分割されてTerminalが表示されます。

最終的な感想

また時間を作って触ってみる機会を設けてみようと思います。

Rustを勉強しようとして参考になったサイト

だんだん勉強が進んできました

先日から少しずつRustの勉強を始めています。

私は基本的に書籍は読まない人で、何か新しいことを始めるときはぐぐりながら勉強しています。

また、公式サイトを読んでいくスタイルではあるのですが、稀に公式が分かりづらいことがあり、Rustの公式の解説はその典型だと思います。(愛が凄い)

今回は私が1からRustを勉強する上で役に立ったサイトを2つ紹介します。

Tour of Rust

tourofrust.com

初学者向けのとても良いサイトだという感想です。

動作させる環境がなくてもサイト上で色々変えて動かしてみたりができて、登場する変数の様々な値をトレースしながら学習が出来ます。

日本語向けのページも用意されているので英語が出来なくても安心です。途中までは。

内容が難しくなってくると日本語化が追いついていないのか、語弊が出てきて上手く訳せないのかは不明ですが完全に英語になります。

それでもブラウザ上で動いているので 右クリック > 日本語に翻訳 でなんとか読めると思います。

残念な点が一点あって、面白くなってきたぜ(瀕死)ないいタイミングでチュートリアルが終わります。

ですので、最初の一歩を歩みだすのに(最初の方だけ)使うと良いと思いました。

Mucrosoft Training

learn.microsoft.com

これの一番最後の項目の「コマンドラインの to-do リスト プログラムを作成する」をやってみました。

私はとにかく動かしてモチベを高めたい派なのでいきなり作成フェーズをやってしまいましたが、他にもテストの書き方やエラー処理などの抑えておきたいポイントを学ぶことが出来ます。

Tour of Rustをやった後であればなんとなく理解できる内容になっているのでオススメです。

今後の私の課題

ここからいい感じにステップアップできそうなサイトを探しつつ、Tauriを通してアプリを作成する中で必要な知識を上手く補完していきたいなと考えています。

tmux.confの設定内容を端末のOSによって変える

設定内容を端末のOSによって変える

設定ファイルの条件文について使い慣れた形式で記載する方法の解説が見当たらなかったので書いておきたいと思います。

version

$tmux -V
tmux 3.2a

マニュアルを見てみると以下のように書いてあります。

$man tmux

 Commands may be parsed conditionally by surrounding them with ‘%if’, ‘%elif’, ‘%else’ and ‘%endif’.  The argument to ‘%if’ and ‘%elif’ is expanded as a format (see FORMATS) and if it evaluates to false (zero or empty), subsequent text is ignored until the
   closing ‘%elif’, ‘%else’ or ‘%endif’.  For example:

   %if "#{==:#{host},myhost}"
   set -g status-style bg=red
   %elif "#{==:#{host},myotherhost}"
   set -g status-style bg=green
   %else
   set -g status-style bg=blue
   %endif

 Will change the status line to red if running on ‘myhost’, green if running on ‘myotherhost’, or blue if running on another host.  Conditionals may be given on one line, for example:

   %if #{==:#{host},myhost} set -g status-style bg=red %endif

つまり以下のように設定することができます。

.tmux.conf

%if "$(uname | grep Linux)"
  ### for Linux (Ubuntu)
  bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
  bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
  bind ] run 'tmux set-buffer -- "$(xsel -b)"; tmux paste-buffer'
%else
  ### for Mac
  bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
  bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
%endif

例ではunameの結果によってクリップボード共有の設定を変えています。

かんたんな説明

シェルの終了ステータスを条件にしています。

grepした結果見つかった場合に0が返ってくるのでこれを利用して読み込む設定を変えています。

Ubuntuで確認してみます(fish)

$uname | grep Linux
Linux #見つかったので0(正常終了)

$uname | grep Darwin
[0|1]$ #unameは正常終了、grepは見つからなかったので1を返す

bashであればこのように確認することができます

$ ls
work

$ ls | grep work
work
$ echo $?
0

$ ls | grep test
$ echo $?
1