標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

自分の dot-nyagos 公開

わたくしの 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 を読み込むということもやっていて、たまに無限ロードになってしまうことがあるので、こういうのを入れておかないとあぶないのです。2
  • nyagos.prompt=... - これ、たぶん標準品と多分同じはず
  • エイリアスの類。自分でも何を定義したか、ほとんど忘れており使ってません。
  • nyagos.envdel(..) - 環境変数PATHがあまりにも長くなるので、コマンドラインで絶対使わないパスをここで削ってます。ここで削っても nyagos とその子プロセスにしか影響がないので、安全。3
  • nyagos.envadd("PATH",..) - コマンドラインでのみ必要な %PATH% 設定を足してます。が、32bit環境の名残りが…4
  • nyagos.alias.zz … 自分、~\Share 以下をどの物理/仮想マシンからでも共通に参照できる共通ディレクトリとして使えるようにしていて、VMware の中では mklink /D "%USERPROFILE%\Share" "\\vmware-host\Share" とかしています。ところが古い Visual C++ はカレントディレクトリがシンボリックリンクだと internal error を起こしてしまう問題がありまして、それを一時的に回避するコマンドとして定義しています。事前に net use Z: \\vmware-host しておいた上で、zz コマンド一発で Z: ドライブの現在と等価な場所に cd しています。5
  • nyagos.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 とかぶって打鍵数が増えるから

  1. なぜ %USERPROFILE%\OneDrive\share\bin を直接使っていないかというと、OneDrive の他、仕事の都合で DropBox を使ったりしてたこともあったで、後から利用するクラウドストレージの切り替えしやすいようにしたかったからです。
  2. 別に nyagos 本体の不具合ではなく、スクリプトの書き間違えで無限 include とかありえるので
  3. nyagos.envdel は指定した環境変数dir1;dir2;... 形式でディレクトリのリストが指定されている時に、指定したキーワードが含まれているディレクトリ名があったら、それを削除するツール関数。PATHの中に無駄フォルダーがありそうな時にそれをシェル内では除く際に便利なのです。
  4. nyagos.envadd は逆に指定した環境変数ディレクトリを追加するツール関数だが、既に含まれている場合や、存在しないディレクトリの場合は追加しないという機能がある。%PATH% のメンテを先送りできるので便利。~/%環境変数名% の展開も関数がやってくれる。
  5. (事例)ネットワークフォルダーをシンボリックリンクで参照すると Visual C++ が内部エラーを起こす - 標準愚痴出力