わたくしの dot nyagosとnyagos.d を見たいという声をお聞きしたので。
nyagos.d は標準からまったく変えていません(スクリプトの追加もない)。その一方で dot nyagos は一応それなりに書いてはいるんですが、使ってもない設定も多いので、お目汚しになるとは思いますが…一応、さらしておきます。
~\Share\bin\.nyagos
nyagos は実行ファイルと同じディレクトリの .nyagos を読み込むという仕様も一応残っていて、そちらに結構な分量を書いておりますので、まずそれを引用しておきます。本当は ~\.nyagos だけで良いのですが、複数マシンで同一設定を使いたいので、mklink /J "%USERPROFILE%\share\bin" "%USERPROFILE%\OneDrive\bin"
という感じに OneDrive にジャンクションを張って一部をクラウド経由で共通化させています。1
で、これは 32bit/64bit 共用部分。32bit版nyagos(~\Share\bin\nyagos.exe
)はこれを直接ロードしますが、64bit版nyagos(~\Share\bin64\nyagos.exe
)も間接的にこれをロードします。
if bin_nyagos then return end bin_nyagos = true print("start ~\\share\\bin\\.nyagos") -- Coloring Prompt for NYAGOS.exe nyagos.env.prompt='$L$P$G$_$$$s' -- Coloring Prompt for NYAGOS.exe default_prompt = nyagos.prompt nyagos.prompt = function(this) local wd = nyagos.getwd() local env = nyagos.env local home = env.home or env.userprofile local home_len = home:len() if wd:sub(1,home_len) == home then wd = "~" .. wd:sub(home_len+1) end local title = wd .. " --- NYAGOS" if no_color and no_color ~= '' then return nyagos.default_prompt(this,title) elseif nyagos.elevated() then return default_prompt('$e[60;31;1m'..this..'$e[37;1m',title) else return default_prompt('$e[60;34;1m'..this..'$e[37;1m',title) end end -- Set other environment variable nyagos.completion_hidden = true nyagos.alias.fullpath=function(args) local wd=nyagos.getwd() for i=1,#args do local s=args[i] if string.match(s,"^[A-Za-z]:[/\\]") or string.match(s,"^[/\\]") then print(args[i]) elseif string.match(s,"^[A-Za-z]:") then print( nyagos.pathjoin( nyagos.env["="..string.sub(s,1,2)] or (string.sub(s,1,2).."\\"), string.sub(s,3) ) ) else print( nyagos.pathjoin(wd,args[i]) ) end end end nyagos.alias.chomp=function() local line_ for line in io.lines() do if line_ then print( line_ ) end line_ = line end if line_ then io.write(line_) end end nyagos.alias["print"] = function(args) for _,s in ipairs(args) do assert(loadstring("print("..s..")"))() end end nyagos.alias["sel"] = "explorer.exe /select,$*" nyagos.histsize = 2000 nyagos.envdel("PATH", "Oracle", "Lenovo", "Skype", --"chocolatey", "TypeScript", -- "OpenSSH", "dotnet", "MinGW", "Intel", "HP") nyagos.envadd("PATH", "%ProgramFiles%\\Git\\bin", "%ProgramFiles%\\Git\\cmd", "%ProgramFiles(x86)%\\Git\\bin", "%ProgramFiles(x86)%\\Git\\cmd", "~\\scoop\shims", "~\\Share\\bin", "~\\Share\\cmds") nyagos.envadd("NYAGOSPATH", "~\\", "~\\Share\\Program Files\\idmanager", "~\\Share\\Program Files\\CarotDAV", "~\\go\\bin", "%VBOX_MSI_INSTALL_PATH%", "%ProgramFiles%\\Oracle\\VirtualBox", "%windir%\\Microsoft.NET\\Framework\\v4.0.30319", "~\\.cargo\\bin") nyagos.alias.add=function(args) nyagos.envadd(args[1],args[2]) end nyagos.alias.cont="tmt -editor vim.exe cont" nyagos.alias.t="tmt -editor vim.exe view" nyagos.alias.dc="cd" nyagos.alias.df="diskfree" nyagos.alias.du="diskused" nyagos.alias.post = "tmt -editor vim.exe post" nyagos.alias.ps1="powershell -ExecutionPolicy RemoteSigned -file" nyagos.alias.rm="trash" nyagos.alias.teraterm="%USERPROFILE%\\Share\\Program Files\\teraterm-4.85\\ttermpro.exe" nyagos.alias.timeline = "tmt timeline" nyagos.alias.diff="busybox diff" nyagos.alias.md5sum="busybox md5sum" nyagos.alias.src=function(args) local fd=io.open(args[1]) if fd then fd:close() nyagos.exec(string.format([["%s" "%s" "%s"]],args[1],args[2],args[3])) end end nyagos.env.git_pager="cure.exe" local vim = string.gsub(nyagos.pathjoin(os.getenv("USERPROFILE"), -- "scoop\\apps\\vim-kaoriya\\current\\gvim.exe" "scoop\\apps\\vim\\current\\gvim.exe" ),"\\","/") nyagos.env.git_editor=vim nyagos.env.editor=vim nyagos.env.pager="cure.exe" nyagos.env.term="msys" nyagos.env.tz="JST-9" nyagos.env.hgeditor=nyagos.env.editor nyagos.env.hgmerge="gvim.exe -d" nyagos.env.hgpager=nyagos.env.pager nyagos.env.git_editor=nyagos.env.editor nyagos.env.git_pager=nyagos.env.pager local share1 if nyagos.stat("z:\\Share") then share1 = "z:\\Share\\" else share1 = "~\\Share\\" end nyagos.key.c_u = "KILL_WHOLE_LINE" nyagos.alias["g++"]="g++.exe -std=gnu++17 $*" nyagos.alias.zz = function() local share = nyagos.pathjoin(os.getenv("USERPROFILE"),"Share") local wd = nyagos.getwd() local share_len = string.len(share) if string.sub(string.upper(wd),1,share_len) == string.upper(share) then local newdir = nyagos.pathjoin( "Z:\\Share", string.sub(wd,share_len+1)) nyagos.chdir(newdir) end end nyagos.complete_for["make"] = function(args) local target = {} local fd=io.open("Makefile","r") if fd then for line in fd:lines() do local m =string.match(line,'^([^:\t%s]+)%s*:') if m then target[1+#target] = m end end fd:close() end return target end nyagos.complete_for["nmake"] = nyagos.complete_for["make"] nyagos.alias.wuapp = function() nyagos.shellexecute("open","ms-settings:windowsupdate") end nyagos.env.NYAGOSEXPANDWILDCARD="gorename;gofmt" --- use "subcomplete.lua" --- use "git.lua" -- vim:set ft=lua fenc=utf8:
一見、意味不明な箇所については、以下参照
if bin_nyagos...
- 二重読み込みを防止するため。64bit 版の .nyagos から 32bit 版 .nyagos を読み込むということもやっていて、たまに無限ロードになってしまうことがあるので、こういうのを入れておかないとあぶないのです。2nyagos.prompt=...
- これ、たぶん標準品と多分同じはず- エイリアスの類。自分でも何を定義したか、ほとんど忘れており使ってません。
nyagos.envdel(..)
- 環境変数PATHがあまりにも長くなるので、コマンドラインで絶対使わないパスをここで削ってます。ここで削っても nyagos とその子プロセスにしか影響がないので、安全。3nyagos.envadd("PATH",..)
- コマンドラインでのみ必要な %PATH% 設定を足してます。が、32bit環境の名残りが…4nyagos.alias.zz
… 自分、~\Share 以下をどの物理/仮想マシンからでも共通に参照できる共通ディレクトリとして使えるようにしていて、VMware の中ではmklink /D "%USERPROFILE%\Share" "\\vmware-host\Share"
とかしています。ところが古い Visual C++ はカレントディレクトリがシンボリックリンクだと internal error を起こしてしまう問題がありまして、それを一時的に回避するコマンドとして定義しています。事前にnet use Z: \\vmware-host
しておいた上で、zz
コマンド一発で Z: ドライブの現在と等価な場所に cd しています。5nyagos.complete_for["make"] =
- make コマンドの引数の補完 (標準に入れるべきだったか)nyagos.alias.wuapp
- コマンドラインから WindowsUpdate をしたい気持ち、君にとどけ!nyagos.env.NYAGOSEXPANDWILDCARD="gorename;gofmt"
- 最近追加した機能。gorename とか gofmt って、ワイルドカードの展開をコマンド側でやってくれないので、シェル側でやるようにする指定。こういうの、一種のグローバル変数的なものであまり環境変数ですべきではないんですが、環境変数以外でやると、ユーザの学習コストもかかるので、もういいやになってしまったようです。
~\Share\bin64\.nyagos
64bit版nyagos.exe が直接ロードする設定。先程引用した共用部分( ~\Share\bin\.nyagos )をロードする他、64bit独自の設定を定義する…ということになっていますが… ~\Share\bin64 を %PATH% に追加する以外、ほとんどありませんねぇ
if bin64_nyagos then return end bin64_nyagos = true nyagos.envadd("PATH",nyagos.dirname(nyagos.exe)) local dotnyagos=nyagos.pathjoin(nyagos.env.userprofile,"share\\bin\\.nyagos") local fd=io.open(dotnyagos) if fd then fd:close() print("loadfile " .. dotnyagos) assert(loadfile(dotnyagos))() end nyagos.envadd("PATH","~\\go\\bin") print "done bin64/.nyagos" -- vim:set ft=lua:
%USERPROFILE%\.nyagos
各PC個別の設定を ~/.nyagos に書くということにしていたんですが、最近はかなり適当です。結構、試験用の設定を書くことも多く、コメントアウトだらけです。
nyagos.skk{ user="~/.go-skk-jisyo" , -- ユーザ辞書 "~/Share/Etc/SKK-JISYO.*", -- システム辞書 ctrlj="C-J", -- 日本語切り替えキー(省略可能) export="GOREADLINESKK", -- 環境変数GOREADLINESKK への設定書き出し } local gmnlisp_lua = nyagos.pathjoin(nyagos.env.userprofile,"Share\\etc\\gmnlisp_.lua") local fd=io.open(gmnlisp_lua) if fd then fd:close() print("loadfile " .. gmnlisp_lua) assert(loadfile(gmnlisp_lua))() end if string.find(nyagos.env.PATH,"PowerShell\\7",1,true) then share._setsuffix("ps1","pwsh") end --xdg_config_home = "(xdg_config_home)" --path_sep = ";" --package.path = nyagos.pathjoin(os.getenv("USERPROFILE"),"Share\\etc\\?.lua") --require("env") --require("alias") -- vim:set ft=lua fenc=utf8: --- --require "subcomplete" --require "git" nyagos.alias.nt = '"' .. nyagos.pathjoin(nyagos.env.LOCALAPPDATA,"Microsoft\\WindowsApps\\wt.exe") .. '" --window 0 new-tab -- ' --[[ nyagos.prompt = function(this) local prompt = "" if nyagos.which("starship") then prompt = prompt .. nyagos.eval("starship prompt 2>nul") .. "$e[37;1m " return nyagos.default_prompt(prompt,"") end return nyagos.default_prompt("$e[49;36;1m"..this.."$e[37;1m","") end ]]-- -- vim:set ft=lua: --
nyagos.skk{...}
- NYAGOS内蔵SKKの設定。ほとんど使わないかなーと思ってたんですが、最近、jj desc -m "コミットログ"
という形で使う機会がそこそこ増えました。local gmnlisp_lua =
- 先日にっきに書いた、コマンドライン埋め込み Lisp スクリプトを読み込んでます。いきなり loadfile せずに、一旦 io.open しているのは、スクリプトが存在する時だけロードさせ、無い時は何もしないという動作にしたかったからです。if string.find(nyagos.env.PATH,"PowerShell\\7",1,true) then
- PowerShell 7.x がインストールされていたら、拡張子ps1 に関連付けるインタープリタを PowerShell.exe ではなく、pwsh.exe にしてます。nyagos.alias.nt
- WindowsTerminal の新しいタブでコマンドを起動するために定義したっぽいですが…使ってないですね、これnyagos.alias["sel"] = "explorer.exe /select,$*"
-sel ファイル名
とすると、そのファイルの親フォルダーをエクスプローラーで開いて、ファイル自身を選択状態にするというエイリアス。結構、便利…-- vim:set ft=lua: --
- これ自体はコメント行で何ら評価されないけれども、先頭行もしくは最終行に書いておくと、vim で開く時、Lua モードにしてくれる
まとめ
シェルの開発者のシェルの設定といえども、かなり汚いということが分かりました。
綺麗に書き直さなくちゃという気持ちになりました。
追記
なぜ、SKK の設定が ~/Share/bin/.nyagos ではなく、~/.nyagos の方に書かれていたかというと、~/Share/bin/.nyagos だと開発中の nyagos: ~/src/nyagos/nyagos.exe で SKK をテストする際に読み込まれないせいでした。
その後、dot-nyagos は次のように整理しました。
- エイリアス関数 chomp は削除 - コードゴルフのために、ファイルの EOF 直前の改行を削除する関数でしたが、もうコードゴルフそのものをやらなくなりましたし、今は同じ用途を binview で行うようにして、chomp は存在すら忘れていたので…
- エイリアス関数 print も削除 - 存在を忘れていて
lua_e
ばかり使ってるし、最近は gmnlisp_.lua で使える Lisp 関数も使ってるので nyagos.env.{hgeditor,hgmerge,hgpager}=
を削除 - まぁ、Mercurial も使ってないし…- その他、存在を忘れている設定もぜんぶ削除
- ~/.nyagos の内容は全部 ~/Share/bin/.nyagos 内に移動し、~/.nyagos 自体も削除
- ~/Share/bin64 は ~/Share/amd64 にリネーム - パス名を補完する時 bin64 だと頭文字が bin とかぶって打鍵数が増えるから
-
なぜ
%USERPROFILE%\OneDrive\share\bin
を直接使っていないかというと、OneDrive の他、仕事の都合で DropBox を使ったりしてたこともあったで、後から利用するクラウドストレージの切り替えしやすいようにしたかったからです。↩ - 別に nyagos 本体の不具合ではなく、スクリプトの書き間違えで無限 include とかありえるので↩
-
nyagos.envdel は指定した環境変数に
dir1;dir2;...
形式でディレクトリのリストが指定されている時に、指定したキーワードが含まれているディレクトリ名があったら、それを削除するツール関数。PATHの中に無駄フォルダーがありそうな時にそれをシェル内では除く際に便利なのです。↩ -
nyagos.envadd は逆に指定した環境変数にディレクトリを追加するツール関数だが、既に含まれている場合や、存在しないディレクトリの場合は追加しないという機能がある。%PATH% のメンテを先送りできるので便利。
~/
や%環境変数名%
の展開も関数がやってくれる。↩ - (事例)ネットワークフォルダーをシンボリックリンクで参照すると Visual C++ が内部エラーを起こす - 標準愚痴出力↩