お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

prettier-vscodeをPrettier v3に対応させる試みは既にあるのだが、PRがRejectされている。レビューを見た感じtypoが原因っぽいのでtypoを直してみたのだがテストが落ちる

まずテストが通らない原因だが、これはアサーション結果とテストコード、落ちた時の結果を三点比較したときに落ちた時の結果がプラグインを反映せずprettier -wされたものであることに気が付いた。次にこの解決法だが、原因が複数あるため、その切り分けが必要だと考えている。これはテスト走行時に指定されたプラグインが正しく読み込まれていればテストを通すことができるはずだが、package.jsonの指定通りインストールされているのかや、prettier側が正常に読み込めているのかなどが解らないと、真の原因が突き止められないためだ。

見た感じ割と面倒な仕組みなテストを実行してそうだったので一旦私は諦めることにした。これはprettier v3を個別にインストールすることで基本的に解決できるためだ。とはいえ、インストールできない条件だとその回避に苦労するのでネイティブに対応してほしい思いはあるが、検証するにも本家リポジトリにPRを向けないとテスト走行すらままならず、ローカルでの検証が極めて厳しいので、正直やる気が起きない。ぶっちゃけDockerで個別テストケースごとにビルドしてやるのが一番仕組みが単純で安全に思うが、敷くほど遅くなりそうだし、イメージのメンテも大変そうだし、アホほどイメージができるはずなので、容量も食いそうでなかなか微妙そうである。

そもそも論としてmainブランチを引っ張ってきてビルドすると、この時点で型エラーを吐くので、ここからどうにかしていく必要があり、割としんどい作業になりそうだ。

投稿日:
ソフトウェア::VSCode

Nanoで{Ctrl}+{Q}を終了に割り当ててたらVSCodeで終了できなくなったので、それを解消した話

確認環境

Env Ver
Visual Studio Code 1.85.2

方法

基本は"terminal.integrated.allowChords": falseで防げるが、それでも出てくるものについてはキーボードショートカットの設定から{Ctrl}+{Q}などで検索し、該当するコマンドを調べ"terminal.integrated.commandsToSkipShell": []に、頭に-を付加した、"-command"形式で記載すると出てこなくなる。

{
    "terminal.integrated.allowChords": false,
    "terminal.integrated.commandsToSkipShell": [
        "-workbench.action.quickOpenView",
    ],
}
投稿日:
ソフトウェア::VSCode言語::TypeScript

新しくセットアップしたTypeScriptのプロジェクトでauto-importが機能しなかったので原因を調べた。

ここ数年ちまちま起きて、そろそろイラついて我慢の限界を覚えたので…。

確認環境

Env Ver
VSCode 1.83.0
typescript 4.8.4

再現方法

再現用のサンプルリポジトリsrc/index.tsの下図コードに対してauto-importが発動する操作を行う。

auto-importに失敗し、利用可能なコードアクションはありませんと出る

発生条件

恐らく以下を全て満たすときにauto-import操作をしようとした時に発生する。地味にややこしい。

node_modules配下に存在し、@types/モジュールを持たないものでかつ、同一プロジェクト内でimportされておらず、package.jsondependenciesに書かれていない。

因みにhoge/piyo/fugaのようなモジュールはhogeだけがdependenciesにいてもauto-importが動かない。これを全部package.jsondependenciesに書いていくのは目眩がするので正直auto-importを諦めて自分でimportを調べて書くのが無難だと思う。

発生原因

TypeScript 4.0で実装されたSmarter Auto-Importsのせい。

node_modulesをクロールすると重すぎるので@types/だけ読み込んで、あとはpackage.jsondependenciesも見るようにしたよという内容らしい。

解消方法

package.jsondependenciesに全部のモジュールを書いていくというのが解決方法になるが、気が遠くなるので諦めた方がいい。初回だけは苦痛でもimportパスをどうにかして調べて手動で書いて、あとはauto-importされるのを期待するのが良いだろう(そんな何度もimportしないと思うが…)

取り敢えず基本npm iで入れて行き、スラッシュ区切りのやつは諦めるくらいがちょうどいいだろう。

再現用のサンプルリポジトリではpackage.jsondependencies"firebase/app": "^10.4.0"を追加することでsrc/index.tsinitializeAppに対しauto-importが発動する様になるはずだ。

あとがき

早い話、node_modules配下にあって@types/を持たないものはTypeScriptに対応する気がないんだな程度に思っておくのが良いだろうが、TS化で@types/を廃止したライブラリがある当たり、すごく微妙な感じがある。ちょっとなんとかしてほしい。

そもそもpackage.jsondependenciesはnpm packageを公開する時に動作するために必要な依存関係を登録する場所で、型の補助をする場所ではなかったはずだ。

少なくともnpmjsのdevDependenciesには以下の記述がある。つまりモジュールを配布する時に動作に不要な依存関係を含まないようにするためにdevDependenciesがあるということだ。つまりdependenciesには動作に必要なものだけを入れるべきで、モジュールを配布しない場合、このフィールドは不要になるはずである。

If someone is planning on downloading and using your module in their program, then they probably don't want or need to download and build the external test or documentation framework that you use.

In this case, it's best to map these additional items in a devDependencies object.

ただTypeScriptがdependenciesに書かないとauto-importが失敗すると言っているので使うものはdependenciesに入れるというのが良いのだろう。(配布しないモジュールだとしても)

ただそれにしてもauto-importを動かすためだけに、dependenciesに同一モジュールのスラッシュ違いを大量に入れていくのはバカバカしいと思う。

  "dependencies": {
    "firebase": "^10.4.0",
    "firebase/app": "^10.4.0",
    "firebase/database": "^10.4.0",
    "firebase/analytics": "^10.4.0",
    ...
  }

かといってinitializeAppfirebase/appにあるなんて知らんわけで、全部のパスに総当りしていくのも嫌だし、一々リファレンス漁るのも面倒だし、なんかもうちょっといい具合になって欲しい…。

投稿日:
ソフトウェア::VSCode
{
  "terminal.integrated.defaultProfile.windows": "MSYS2",
  "terminal.integrated.profiles.windows": {
    "MSYS2": {
      "overrideName": true,
      "path": ["C:\\env\\msys64\\msys2_shell.cmd"],
      "args": [
        "-defterm",
        "-here",
        "-use-full-path",
        "-no-start",
        "-mingw64",
        "-shell",
        "zsh"
      ]
    },
    "PowerShell": {
      "source": "PowerShell",
      "icon": "terminal-powershell"
    },
    "Command Prompt": {
      "path": [
        "${env:windir}\\Sysnative\\cmd.exe",
        "${env:windir}\\System32\\cmd.exe"
      ],
      "args": [],
      "icon": "terminal-cmd"
    }
  },
  "terminal.integrated.defaultProfile.linux": "zsh",
  "terminal.integrated.profiles.linux": {
    "zsh": {
      "path": "zsh"
    },
    "bash": {
      "path": "bash"
    }
  },
  "terminal.integrated.automationProfile.windows": {
    "path": "${env:windir}\\System32\\cmd.exe",
    "args": [],
    "icon": "terminal-cmd"
  },
  "terminal.integrated.allowChords": false,
  "terminal.integrated.commandsToSkipShell": [
    "-workbench.action.quickOpenView",
    "-workbench.action.terminal.focusFind"
  ],
  "workbench.startupEditor": "newUntitledFile",
  "workbench.iconTheme": "vscode-icons",
  "workbench.editor.decorations.badges": false,
  "workbench.editor.decorations.colors": false,
  "workbench.tree.enableStickyScroll": false,
  "workbench.layoutControl.enabled": false,
  "workbench.editor.empty.hint": "hidden",
  "files.eol": "\n",
  "files.trimTrailingWhitespace": true,
  "files.insertFinalNewline": true,
  "scm.showIncomingChanges": "never",
  "scm.showOutgoingChanges": "never",
  "git.autorefresh": true,
  "git.autoStash": true,
  "git.suggestSmartCommit": false,
  "git.mergeEditor": false,
  "git.openRepositoryInParentFolders": "never",
  "remote.autoForwardPortsSource": "hybrid",
  "diffEditor.ignoreTrimWhitespace": true,
  "diffEditor.renderGutterMenu": false,
  "explorer.confirmDragAndDrop": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "editor.stickyScroll.enabled": false,
  "[markdown]": {
    "editor.tabSize": 4,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "php.validate.run": "onSave",
  "vsicons.dontShowNewVersionMessage": true,
  "pasteImage.path": "${currentFileDir}/${currentFileNameWithoutExt}.assets",
  "todo-tree.filtering.excludeGlobs": ["**/node_modules/**/*"],
  "todo-tree.highlights.customHighlight": {
    "TODO": {
      "foreground": "#f8ff96",
      "type": "text-and-comment"
    },
    "FIXME": {
      "foreground": "#ff9696",
      "type": "text-and-comment"
    }
  },
  "todo-tree.general.tags": ["TODO", "FIXME"],
  "todo-tree.regex.regex": "(//|#|<!--|/\\*|^\\s*\\*)\\s*($TAGS)",
  "gitlens.currentLine.format": "${author, }${date}${' via 'pullRequest}${ • message|50?}",
  "gitlens.statusBar.format": "${author}, ${date}${' via 'pullRequest}",
  "gitlens.statusBar.tooltipFormat": "${avatar} &nbsp;__${author}__, ${date}${' via 'pullRequest}\n\n${message}${\n\n---\n\nfootnotes}\n\n${commands}",
  "gitlens.hovers.detailsMarkdownFormat": "${avatar} &nbsp;__${author}__, ${date}${' via 'pullRequest}\n\n${message}${\n\n---\n\nfootnotes}\n\n${commands}",
  "gitlens.views.formats.stashes.description": "${date}",
  "gitlens.views.formats.commits.description": "${author, }${date}",
  "gitlens.defaultDateFormat": "YYYY-MM-DD",
  "terminal.integrated.shellIntegration.decorationsEnabled": "never",
  "security.workspace.trust.untrustedFiles": "open",
  "explorer.copyRelativePathSeparator": "/",
  "typescript.tsserver.log": "off",
  "gitlens.ai.experimental.generateCommitMessage.enabled": false,
  "redhat.telemetry.enabled": true
}
投稿日:
言語::PHP::XdebugOS::Windowsソフトウェア::VSCode

環境

Windows 10

Env Ver
PHP 8.0.2
Xdebug 3.0.2

php.ini

zend_extension="xdebug-3.0.2-8.0-vs16-nts-x86_64"
xdebug.start_with_request=yes
xdebug.mode=debug

settings.json

別になくてもデバッグは出来る

"php.validate.executablePath": "C:/path/to/php.exe",

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        }
    ]
}