20240407 アプリのアイデア、Thinq V60を外部モニターにつなぐ、Neovimあれこれ

### アプリのアイデア
NeovimからRushRoyaleを操作できるアプリが欲しい

ボタンというか操作できる箇所が非常に多いので、それらをLuaからこつこつ操作するのは大変だと思う

#### まずその前にRRリモコンが欲しい
基本はviモードであれこれ、
* h/lで画面をタブを左右に切り替える
* j/kでスクロール
* タッチできる（？）ところはハイライトする（これはVimiumCっぽい感じで）、そしてキーを割り振る
** HTMLと違ってどこに要素があるかわからない、動的に場所を見つけ出すのかなりムズイ、というか無理かも、なので最初に場所を決めておくしかないと思う
* Escでキャンセル/戻る、これ今でもできるか
* キーアサイン変えられる
* 戦闘モードではなるべく打鍵数すくなくマージ、召喚、
* 画面の大きさによって、ぽちる場所も変わってくるから計算が必要、適正サイズに無理やり画面サイズ変えてもいいけど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/adcbd496-8d13-99c6-d79f-3dc9fb75138f.png)

このリモコンにAPIを持たせるか何かしてNeovimからそれらをコールする、といったアイデア
リモコンはPython+Pyautoguiで作る？
けど画面に枠線や文字を描画することなんてできるのかな

で、Neovimから操作するときはコマンドライン（だっけ）か、専用のRR操作モードバッファを作る、そこから操作

と、できるできないはともかくとりあえずアイデアだけ書き留めといた

### Thnq V60を外部モニターにつなぐ
スマホのスペックはこれ
[LG V60 ThinQ 5G スペック・仕様 - 価格.com](https://kakaku.com/keitai/smartphone/model/M0000000763/spec/)
このスマホはUSB Type-CのAlternateモードには対応している
[DisplayPort Alternate Modeに対応したAndroidスマホ一覧（USB Type-C to HDMI） | Wi-Fiの森](https://wifinomori.com/displayport-alternate-mode/#lg)
Thunderbolt3対応じゃないからつながらないと思うけどダメもとで

モニターはたぶんこれ
[デスクトップ タッチ スクリーン マルチ コンピューター 1080P ディスプレイ FHD モニター – EVICIV モニター](https://www.eviciv.com/collections/%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC/products/%E3%82%BF%E3%83%83%E3%83%81%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC)

HDMIを使えば接続できることはわかってるけど、USB Type-Cでつなぎたい、なぜなら持ってるモニターがマルチタッチ対応らしいので
まずなにも考えず普段充電やデータ通信に使ってるのでつないだ→全然だめ

スマホかケーブルがThunderbolt3.0に未対応だからだと思う

Alternate ModeはHDMIに変換しないとだめっぽい？
参考
* [【規格に注意】USB Type-CでノートPCにPCモニター接続 | ひとり情シス、孤独にあらず](https://notmaverick.com/2020/09/22/type-c-add-display/)
* [Alt Modeとは？—USB-Cが映像出力やThunderbolt 3になる仕組みのお勉強｜8vivid](https://8vivid.net/whats-alt-mode/)
Thunderebolt3ドッキングステーションなんてものがあるのか？！アマゾンで見ると結構高い、、、

Thunderbolt3対応ケーブルとHDMI変換アダプターと両方買って試してみよう、こんど

### Neovimあれこれ
#### NeovimでZoxideしたい
今までNeovim内で訪れたことのあるフォルダに簡単に移動したい
telescope-zoxideというのがあるので導入
本当はこんな使い方しないんだろうけど、 telescope.nvimのdependenciesに'jvgrootveld/telescope-zoxide'を追加
けどなんかちょっと遅い？
#### 過去に開いたファイルを開きたい
telescopeにそれがあった
`:Telescope oldfiles`というのを`        {'<Leader>to',  plug.oldfiles}, `にマッピングして解決
#### Luaのファイルをtelescopeのプレビューで開くとエラー
エラーメッセージをコピーしてなかったけど`treesitter invalid structure at position language_lua`といった感じ
たぶんここで報告されてるのと同じ
* [Error "query: invalid structure at position 1238 for language lua" · Issue #5382 · nvim-treesitter/nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter/issues/5382)

で、直し方も同じで`:TSInstall! lua`でOK

#### cder.nvimというもの
telescopeでcdできる？らしい
便利っぽいんだけど、なんかまったく動かない
Powershellではbat、fdはいってるし、実行コマンドをcmd.exeにしているけどだめ
wslのubuntuでは？とためしたらfd、batなど入ってないから試せない、いれればいいんだけどさ、、、

##### というわけでubuntu on wsl2にfd、batをいれる
```
$ sudo apt install fd-find
$ wget https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb
$ dpkg -i bat_0.24.0_amd64.deb
```

`fd`は`fdfind`という名前で入るのでaliasつけてもよい
参考： [alt cliツール 紹介 【lsd】【difftastic】【bat】 #Rust - Qiita](https://qiita.com/darallium/items/1e5fdede43a0e3138f49)

これで`:Telescope cder`したらちゃんと動いた。ということは、Windowsの問題かと思う

##### 内部的な動作について
`opt`で設定できるものがいくつかあるが大事なのはこんなところ
```
  dir_command = { 'fd', '--type=d', '.', os.getenv('HOME') },
  command_executer = { 'bash', '-c' },
  previewer_command = 'ls -a',
  pager_command = 'bat --plain --paging=always --pager="less -RS"',
```
内部的には`finder`がdir_commandを使っている
`finder`は選択できるのをずらずらするための処理
で選択したものを右側でプレビュー表示するのが`previewer`となる
`previewer`に`command_executer, previewer_command .. ' ' .. (finderで選択したディレクトリ) .. ' ' .. pager_command`となっている
telescopeだかnvimは外部コマンドを呼び出すときにパイプをつけて呼び出すことができないのでcommand_executerに引数の形でコマンドを渡している、ということ

で、finderで選択したディレクトリは次の関数に渡して、ダブルクォートでくくっている

```
  entry_value_fn = function(entry_value)
    return '"' .. entry_value .. '"'
  end,
```

##### 動くようになった！
唐突に解決したような書き方だが、ここに至るまで紆余曲折ありました
結局cder.nvim自体、2か所に「Windowsの場合は・・・する」というパッチが必要だった
```lua:cder.lua
  entry_maker = function(line)
    return {
      value = line,
      display = function(entry)
        if vim.loop.os_uname().sysname == 'Windows_NT' then
          return ' ' .. line:gsub(os.getenv('USERPROFILE') .. "\\", ''),
            { { { 1, 3 }, 'Directory' } }
        else
          return ' ' .. line:gsub(os.getenv('HOME') .. '/', ''),
            { { { 1, 3 }, 'Directory' } }
        end
      end,
      ordinal = line,
    }
  end,
  ：
  ：
  entry_value_fn = function(entry_value)
    if vim.loop.os_uname().sysname == 'Windows_NT' then
      return '"' .. entry_value:gsub("\\$", "") .. '"'
    else
      return '"' .. entry_value .. '"'
    end
  end,
```

で、init.luaにはこんな風な設定をいれた
```lua:init.lua
  {
    'zane-/cder.nvim',
    event = 'VeryLazy', -- lz
    config = function ()
      m = {
        {'<Leader>tc',  ':Telescope cder<CR>'}, -- km
      }
      map_keys(m, vim.keymap.set)
      local fd_param = '--type directory --type symlink --exclude .git'
      if vim.loop.os_uname().sysname == 'Windows_NT' then
        require('telescope').setup({
          extensions = {
            cder = {
              command_executer = { 'cmd.exe', '/c' },
              previewer_command = 'eza -a -F --icons --color -1', -- uutils ls -a',
              pager_commnd = 'bat --plain --paging=always --pager="less -RS"',
              dir_command = { 'fd.exe', '--type=d', '--type=l', '.', },
            }
          },
        })
      else
        require('telescope').setup({
          extensions = {
            cder = {
              dir_command = { 'fdfind', '--type=d', '--type=l', '--exclude=.git', '.', },
              previewer_command = 'exa -a --icons --color=auto -F -1',
            },
          },
        })
      end
      require('telescope').load_extension 'cder'
    end
  },
```
これで動いた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/fcd30d3d-9268-115f-f24b-1e8f536467d2.png)