2025/08/02

NoShift.js作ってみた

npm install -g noshift.js
npx nsjs create

自己紹介

前置き

ジョーク言語なので

(実用性は)ないです

制作のきっかけ

小指が疲れる!

大文字とか記号を入力するたびに腱鞘炎になりそうになる。

高校の頃に行った共同開発の未完成品

構想だけは高校の時から存在したが作ってなかった。

仕様

  • 基本的なJSの構文
  • Shiftを押さないと入力できない記号は ^(ハット) をつけて表す
  • ↑は開発者のキーボード準拠(重要)

仕様

!    -->    ^1
"    -->    ^2
$    -->    ^4
%    -->    ^5
&    -->    ^6
'    -->    ^7
(    -->    ^8
)    -->    ^9
=    -->    ^-
~    -->    ^^
|    -->    ^\
`    -->    ^@
{    -->    ^[
}    -->    ^]
+    -->    ^;
*    -->    ^:
<    -->    ^,
>    -->    ^.
?    -->    ^/

仕様

実装

  • 一文字ずつ順に状態を監視しながらjsCode = "";に変換後を追加
// ======
// 各種状態 (State) を定義
// ======
const STATE = {
  NORMAL: "NORMAL", // 普通のコード
  IN_DQ_STRING: "IN_DQ_STRING", // " … " の中
  IN_SQ_STRING: "IN_SQ_STRING", // ' … ' の中
  IN_BT_SINGLE_STRING: "IN_BT_SINGLE_STRING", // ` … ` の中
  IN_BT_MULTI_STRING: "IN_BT_MULTI_STRING", // ``` … ``` の中
  IN_TEMPLATE_EXPRESSION: "IN_TEMPLATE_EXPRESSION", // ${ … } の中
  RAW_DQ_IN_EXPR: "RAW_DQ_IN_EXPR", // テンプレート式内の " … " の中
  RAW_SQ_IN_EXPR: "RAW_SQ_IN_EXPR", // テンプレート式内の ' … ' の中
};

実装

  // ======
  // NoShift.js → JavaScript 置換用マップ
  // ======
  const noShiftMap = {
    "^4^[": "${", // テンプレート式展開開始
    "^1": "!",
    "^2": '"',
    "^4": "$",
    "^5": "%",
    "^6": "&",
    "^7": "'",
    "^8": "(",
    "^9": ")",
    "^-": "=",
    "^^": "~",
    "^\\": "|",
    "^@": "`",
    "^[": "{",
    "^]": "}",
    "^;": "+",
    "^:": "*",
    "^,": "<",
    "^.": ">",
    "^/": "?",
  };

結果

NoShift.js

console.log^8^2Hello World!^2^9;

JavaScript

console.log("Hello World!");

これからやること

VSCodeでのSyntaxHighlightを実装(したい)

これからやること

  • ()の中の先頭に変数が入ったり、true/falseが入るとHighlightが崩れる。
  • VSCodeの拡張機能のDocs読むのがめんどくさいので完全実装はしばらく先になりそう。

Thanks for listening!