[{"content":"序 最开始是为了有个公网IP，可以让我宿舍的主机通过自建的zerotier-moon节点进行串流，好在空闲时刻摸鱼，(嘿嘿｀・ω・´)，后来又购买了域名，增加了越来越多的服务，加上移动端的zerotier很难完整打洞成功，逐渐发现自己的很多生活组件可以部署在云上，简单的4核服务器其实就可以满足很多日常的基础功能了，后悔当时腾讯云客服给我打电话问我要不要一次买3年，没买啊∑🍺👊😩！，遂开一条帖子记录，以便后续迁移云的时候可以有个参考。\n基础配置 底层操作系统是Linux，一般选择是Ubuntu的LTS版本，这里是22.04LTS，下一次迁移云可以考虑换一下底层系统。安装好系统后，添加运维面板和neovim，这里选择的是1Panel。\n1 2 bash -c \u0026#34;$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)\u0026#34; sudo snap install nvim --classic 安全性配置 首先需要更改SSH连接的端口，禁用密码登陆，同时增加SSH密钥。\n下面是增加SSH密钥的步骤，先生成对应的密钥文件，生成完毕后再复制公钥内容到Vps中。\n1 2 3 4 5 6 7 8 9 10 11 12 # Generate key ssh-keygen -t ed25519 # Get public key cat ~/.ssh/keyname.pub # Copy public key to Vps ssh root@vps cd ~/.ssh nvim authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys 这边测试能使用密钥登陆后，修改登陆配置文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 # copy for the backup sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # modify ssh config sudo nvim /etc/ssh/sshd_config Port xxx PermitRootLogin no PasswordAuthentication no PubkeyAcceptedKeyTypes +ssh-rsa PermitEmptyPasswords no # reload ssh service sudo systemctl restart ssh 服务配置 云服务常用的组件有这几个：zerotier、bitwarden、ezbookkeeping、memos和fast note sync，这些服务通过nginx和通配符域名进行端口转发实现访问。\nzerotier 安装zerotier服务\n1 curl -s https://install.zerotier.com | sudo bash 加入虚拟局域网并配置moon节点。\n1 2 3 4 5 6 7 8 9 cd /var/lib/zerotier-one sudo zerotier-idtool initmoon identity.public \u0026gt;\u0026gt;moon.json nvim moon.json # add ipv4/9993 copy id value sudo zerotier-idtool genmoon moon.json mkdir -p moons.d mv 000000id.moon moons.d/ sudo systemctl restart zerotier-one sudo systemctl enable zerotier-one.service 至此服务端配置完毕，虚拟局域网内的设备需要添加moon可执行以下命令。\n1 zerotier-cli orbit \u0026lt;moon-id\u0026gt; \u0026lt;moon-id\u0026gt; bitwarden、memos \u0026amp; ezbookkeeping 为了后续迁移，这边直接在1Panel的应用商店进行一键安装配置，在防火墙中分别放行对应的端口即可。\nfast note sync 为了多端同步obsidian的笔记信息，利用docker部署。\n1 2 3 cd docker mkdir -p fastnotesync \u0026amp;\u0026amp; cd fastnotesync nvim docker-compose.yaml 其中docker-compose.yaml的内容如下：\n1 2 3 4 5 6 7 8 9 10 11 version: \u0026#39;3\u0026#39; services: fast-note-sync-service: image: haierkeys/fast-note-sync-service:latest container_name: fast-note-sync-service restart: always ports: - \u0026#34;9000:9000\u0026#34; # RESTful API \u0026amp; WebSocket port, where /api/user/sync is the WebSocket endpoint volumes: - ./storage:/fast-note-sync/storage # Data storage - ./config:/fast-note-sync/config # Configuration files PS：镜像源可以换成docker.cnb.cool/haierkeys/fast-note-sync-service:latest\nnginx 重装底层系统后一般不会预装nginx，后面需要利用nginx反向代理云服务组件。\n1 2 3 4 5 6 7 8 9 10 11 sudo apt update sudo apt install nginx -y # 设为开机自启 sudo systemctl enable nginx # 启动服务 sudo systemctl start nginx # 检查状态 sudo systemctl status nginx 除此之外需要配置防火墙放行 80/443 端。\nnginx反向代理 这边通过1Panel自带的证书管理工具申请通配符的证书文件，挂载到nginx的目录下面/etc/nginx/，自动续签时执行脚本nginx -s reload。 在nginx中通过域名进行反向代理并开启https。以Fast Note Sync为例\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 # ================================================================ # Fast Note Sync — sync.example.com # ================================================================ server { listen 443 ssl; listen [::]:443 ssl; server_name sync.example.com; # 文件同步场景 body 可能很大 client_max_body_size 50m; proxy_max_temp_file_size 0; proxy_buffering off; ssl_certificate /etc/nginx/fullchain.pem; ssl_certificate_key /etc/nginx/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; # 主入口 — 普通 HTTP 请求 location / { # TODO: 按实际情况改端口 # - 宿主机暴露端口：http://127.0.0.1:9000 # - nginx 也在同一 Docker 网络：http://fast-note-sync-service:9000 proxy_pass http://127.0.0.1:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # WebSocket 同步端点 — 长连接必须升级协议 location /api/user/sync { proxy_pass http://127.0.0.1:9000/api/user/sync; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # Fast Note Sync HTTP → HTTPS 重定向 server { listen 80; listen [::]:80; server_name sync.example.com; return 301 https://$host$request_uri; } ","date":"2026-07-07T15:08:15+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2026-07-07Vps/vps-cover-2026.png","permalink":"https://blog.christinaxy.top/post/vps/","title":"Vps配置记录"},{"content":"序 最近沉迷配置终端，刷到了yazi这个工具，怎么说呢，感觉很好用啊，也想着以后从GUI的工作模式部分转向类似Terminal的方式，遂开一章记录一下！\nYazi Configuration 所有的相关配置都可以在三咲雅的官方文档里查到，很详细 —\u0026gt; Yazi\nInstall 我这边是Windows系统，Win11 24H2，采用Scoop安装(在此之前确保已安装好Git、starship和Neovim)，版本是：Yazi 26.5.6 (aa52643 2026-05-05)。\n1 2 3 scoop install yazi # Install the optional dependencies (recommended): scoop install ffmpeg 7zip jq poppler fd ripgrep fzf zoxide resvg imagemagick eza 添加环境变量YAZI_FILE_ONE，指向Git/usr/bin/file.exe\nPlugins 安装如下几个插件：\nNum Name 1 eza-preview.yazi 2 full-border.yazi 3 git.yazi 4 smart-enter.yazi 5 starship.yazi yazi.toml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 # A TOML linter such as https://github.com/tombi-toml/tombi can use this schema to validate your config. # If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas. # #:schema https://yazi-rs.github.io/schemas/yazi.json [[plugin.prepend_previewers]] url = \u0026#34;*/\u0026#34; run = \u0026#34;eza-preview\u0026#34; [[plugin.prepend_fetchers]] id = \u0026#34;git\u0026#34; # Remove if Yazi \u0026gt; v26.1.22 url = \u0026#34;*\u0026#34; run = \u0026#34;git\u0026#34; group = \u0026#34;git\u0026#34; [[plugin.prepend_fetchers]] id = \u0026#34;git\u0026#34; # Remove if Yazi \u0026gt; v26.1.22 url = \u0026#34;*/\u0026#34; run = \u0026#34;git\u0026#34; group = \u0026#34;git\u0026#34; [mgr] ratio = [ 1, 4, 3 ] sort_by = \u0026#34;alphabetical\u0026#34; sort_sensitive = false sort_reverse = false sort_dir_first = true sort_translit = false sort_fallback = \u0026#34;alphabetical\u0026#34; linemode = \u0026#34;none\u0026#34; show_hidden = false show_symlink = true scrolloff = 5 mouse_events = [ \u0026#34;click\u0026#34;, \u0026#34;scroll\u0026#34;, \u0026#34;drag\u0026#34; ] [preview] wrap = \u0026#34;no\u0026#34; tab_size = 2 max_width = 600 max_height = 900 cache_dir = \u0026#34;\u0026#34; image_delay = 30 image_filter = \u0026#34;triangle\u0026#34; image_quality = 75 ueberzug_scale = 1 ueberzug_offset = [ 0, 0, 0, 0 ] [opener] edit = [ { run = \u0026#34;${EDITOR:-vi} %s\u0026#34;, desc = \u0026#34;$EDITOR\u0026#34;, for = \u0026#34;unix\u0026#34;, block = true }, { run = \u0026#34;nvim %s\u0026#34;, desc = \u0026#34;nvim\u0026#34;, for = \u0026#34;unix\u0026#34;, block = true }, { run = \u0026#34;nvim %s\u0026#34;, desc = \u0026#34;nvim\u0026#34;, for = \u0026#34;windows\u0026#34;, block = true }, ] play = [ { run = \u0026#34;xdg-open %s1\u0026#34;, desc = \u0026#34;Play\u0026#34;, for = \u0026#34;linux\u0026#34;, orphan = true }, { run = \u0026#34;open %s\u0026#34;, desc = \u0026#34;Play\u0026#34;, for = \u0026#34;macos\u0026#34; }, { run = \u0026#39;start \u0026#34;\u0026#34; %s1\u0026#39;, desc = \u0026#34;Play\u0026#34;, for = \u0026#34;windows\u0026#34;, orphan = true }, { run = \u0026#34;termux-open %s1\u0026#34;, desc = \u0026#34;Play\u0026#34;, for = \u0026#34;android\u0026#34; }, { run = \u0026#34;mediainfo %s1; echo \u0026#39;Press enter to exit\u0026#39;; read _\u0026#34;, block = true, desc = \u0026#34;Show media info\u0026#34;, for = \u0026#34;unix\u0026#34; }, { run = \u0026#34;mediainfo %s1 \u0026amp; pause\u0026#34;, block = true, desc = \u0026#34;Show media info\u0026#34;, for = \u0026#34;windows\u0026#34; }, ] open = [ { run = \u0026#34;xdg-open %s1\u0026#34;, desc = \u0026#34;Open\u0026#34;, for = \u0026#34;linux\u0026#34; }, { run = \u0026#34;open %s\u0026#34;, desc = \u0026#34;Open\u0026#34;, for = \u0026#34;macos\u0026#34; }, { run = \u0026#39;start \u0026#34;\u0026#34; %s1\u0026#39;, desc = \u0026#34;Open\u0026#34;, for = \u0026#34;windows\u0026#34;, orphan = true }, { run = \u0026#34;termux-open %s1\u0026#34;, desc = \u0026#34;Open\u0026#34;, for = \u0026#34;android\u0026#34; }, ] reveal = [ { run = \u0026#34;xdg-open %d1\u0026#34;, desc = \u0026#34;Reveal\u0026#34;, for = \u0026#34;linux\u0026#34; }, { run = \u0026#34;open -R %s1\u0026#34;, desc = \u0026#34;Reveal\u0026#34;, for = \u0026#34;macos\u0026#34; }, { run = \u0026#34;explorer /select,%s1\u0026#34;, desc = \u0026#34;Reveal\u0026#34;, for = \u0026#34;windows\u0026#34;, orphan = true }, { run = \u0026#34;termux-open %d1\u0026#34;, desc = \u0026#34;Reveal\u0026#34;, for = \u0026#34;android\u0026#34; }, { run = \u0026#34;clear; exiftool %s1; echo \u0026#39;Press enter to exit\u0026#39;; read _\u0026#34;, desc = \u0026#34;Show EXIF\u0026#34;, for = \u0026#34;unix\u0026#34;, block = true }, ] extract = [ { run = \u0026#34;ya pub extract --list %s\u0026#34;, desc = \u0026#34;Extract here\u0026#34; }, ] download = [ { run = \u0026#34;ya emit download --open %S\u0026#34;, desc = \u0026#34;Download and open\u0026#34; }, { run = \u0026#34;ya emit download %S\u0026#34;, desc = \u0026#34;Download\u0026#34; }, ] [open] rules = [ # Folder { url = \u0026#34;*/\u0026#34;, use = [ \u0026#34;edit\u0026#34;, \u0026#34;open\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Text { mime = \u0026#34;text/*\u0026#34;, use = [ \u0026#34;edit\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Image { mime = \u0026#34;image/*\u0026#34;, use = [ \u0026#34;open\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Media { mime = \u0026#34;{audio,video}/*\u0026#34;, use = [ \u0026#34;play\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Code { mime = \u0026#34;application/{json,ndjson,javascript,toml,wine-extension-ini}\u0026#34;, use = [ \u0026#34;edit\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Archive { mime = \u0026#34;application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}\u0026#34;, use = [ \u0026#34;extract\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Empty file { mime = \u0026#34;inode/empty\u0026#34;, use = [ \u0026#34;edit\u0026#34;, \u0026#34;reveal\u0026#34; ] }, # Virtual file system { mime = \u0026#34;vfs/{absent,stale}\u0026#34;, use = \u0026#34;download\u0026#34; }, # Fallback { url = \u0026#34;*\u0026#34;, use = [ \u0026#34;open\u0026#34;, \u0026#34;reveal\u0026#34; ] }, ] [tasks] file_workers = 3 plugin_workers = 5 fetch_workers = 5 preload_workers = 2 process_workers = 5 bizarre_retry = 3 image_alloc = 536870912 # 512MB image_bound = [ 10000, 10000 ] suppress_preload = false [plugin] fetchers = [ # MIME-type { url = \u0026#34;*/\u0026#34;, run = \u0026#34;mime.dir\u0026#34;, prio = \u0026#34;high\u0026#34;, group = \u0026#34;mime\u0026#34; }, { url = \u0026#34;local://*\u0026#34;, run = \u0026#34;mime.local\u0026#34;, prio = \u0026#34;high\u0026#34;, group = \u0026#34;mime\u0026#34; }, { url = \u0026#34;remote://*\u0026#34;, run = \u0026#34;mime.remote\u0026#34;, prio = \u0026#34;high\u0026#34;, group = \u0026#34;mime\u0026#34; }, ] spotters = [ # Multi-file { mime = \u0026#34;multi/*\u0026#34;, run = \u0026#34;multi\u0026#34; }, # Folder { url = \u0026#34;*/\u0026#34;, run = \u0026#34;folder\u0026#34; }, # Code { mime = \u0026#34;text/*\u0026#34;, run = \u0026#34;code\u0026#34; }, { mime = \u0026#34;application/{mbox,javascript,wine-extension-ini}\u0026#34;, run = \u0026#34;code\u0026#34; }, # Image { mime = \u0026#34;image/{avif,hei?,jxl}\u0026#34;, run = \u0026#34;magick\u0026#34; }, { mime = \u0026#34;image/svg+xml\u0026#34;, run = \u0026#34;svg\u0026#34; }, { mime = \u0026#34;image/*\u0026#34;, run = \u0026#34;image\u0026#34; }, # Video { mime = \u0026#34;video/*\u0026#34;, run = \u0026#34;video\u0026#34; }, # Virtual file system { mime = \u0026#34;vfs/*\u0026#34;, run = \u0026#34;vfs\u0026#34; }, # Error { mime = \u0026#34;null/*\u0026#34;, run = \u0026#34;null\u0026#34; }, # Fallback { url = \u0026#34;*\u0026#34;, run = \u0026#34;file\u0026#34; }, ] preloaders = [ # Image { mime = \u0026#34;image/{avif,hei?,jxl}\u0026#34;, run = \u0026#34;magick\u0026#34; }, { mime = \u0026#34;image/svg+xml\u0026#34;, run = \u0026#34;svg\u0026#34; }, { mime = \u0026#34;image/*\u0026#34;, run = \u0026#34;image\u0026#34; }, # Video { mime = \u0026#34;video/*\u0026#34;, run = \u0026#34;video\u0026#34; }, # PDF { mime = \u0026#34;application/pdf\u0026#34;, run = \u0026#34;pdf\u0026#34; }, # Font { mime = \u0026#34;font/*\u0026#34;, run = \u0026#34;font\u0026#34; }, { mime = \u0026#34;application/ms-opentype\u0026#34;, run = \u0026#34;font\u0026#34; }, ] previewers = [ { url = \u0026#34;*/\u0026#34;, run = \u0026#34;folder\u0026#34; }, # Code { mime = \u0026#34;text/*\u0026#34;, run = \u0026#34;code\u0026#34; }, { mime = \u0026#34;application/{mbox,javascript,wine-extension-ini}\u0026#34;, run = \u0026#34;code\u0026#34; }, # JSON { mime = \u0026#34;application/{json,ndjson}\u0026#34;, run = \u0026#34;json\u0026#34; }, # Image { mime = \u0026#34;image/{avif,hei?,jxl}\u0026#34;, run = \u0026#34;magick\u0026#34; }, { mime = \u0026#34;image/svg+xml\u0026#34;, run = \u0026#34;svg\u0026#34; }, { mime = \u0026#34;image/*\u0026#34;, run = \u0026#34;image\u0026#34; }, # Video { mime = \u0026#34;video/*\u0026#34;, run = \u0026#34;video\u0026#34; }, # PDF { mime = \u0026#34;application/pdf\u0026#34;, run = \u0026#34;pdf\u0026#34; }, # Archive { mime = \u0026#34;application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}\u0026#34;, run = \u0026#34;archive\u0026#34; }, { mime = \u0026#34;application/{debian*-package,redhat-package-manager,rpm,android.package-archive}\u0026#34;, run = \u0026#34;archive\u0026#34; }, { url = \u0026#34;*.{AppImage,appimage}\u0026#34;, run = \u0026#34;archive\u0026#34; }, # Virtual Disk / Disk Image { mime = \u0026#34;application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}\u0026#34;, run = \u0026#34;archive\u0026#34; }, { mime = \u0026#34;application/virtualbox-{vhd,vhdx}\u0026#34;, run = \u0026#34;archive\u0026#34; }, { url = \u0026#34;*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}\u0026#34;, run = \u0026#34;archive\u0026#34; }, # Font { mime = \u0026#34;font/*\u0026#34;, run = \u0026#34;font\u0026#34; }, { mime = \u0026#34;application/ms-opentype\u0026#34;, run = \u0026#34;font\u0026#34; }, # Empty file { mime = \u0026#34;inode/empty\u0026#34;, run = \u0026#34;empty\u0026#34; }, # Virtual file system { mime = \u0026#34;vfs/*\u0026#34;, run = \u0026#34;vfs\u0026#34; }, # Error { mime = \u0026#34;null/*\u0026#34;, run = \u0026#34;null\u0026#34; }, # Fallback { url = \u0026#34;*\u0026#34;, run = \u0026#34;file\u0026#34; }, ] [input] cursor_blink = false # cd cd_title = \u0026#34;Change directory:\u0026#34; cd_origin = \u0026#34;top-center\u0026#34; cd_offset = [ 0, 2, 50, 3 ] # create create_title = [ \u0026#34;Create:\u0026#34;, \u0026#34;Create (dir):\u0026#34; ] create_origin = \u0026#34;top-center\u0026#34; create_offset = [ 0, 2, 50, 3 ] # rename rename_title = \u0026#34;Rename:\u0026#34; rename_origin = \u0026#34;hovered\u0026#34; rename_offset = [ 0, 1, 50, 3 ] # filter filter_title = \u0026#34;Filter:\u0026#34; filter_origin = \u0026#34;top-center\u0026#34; filter_offset = [ 0, 2, 50, 3 ] # find find_title = [ \u0026#34;Find next:\u0026#34;, \u0026#34;Find previous:\u0026#34; ] find_origin = \u0026#34;top-center\u0026#34; find_offset = [ 0, 2, 50, 3 ] # search search_title = \u0026#34;Search via {n}:\u0026#34; search_origin = \u0026#34;top-center\u0026#34; search_offset = [ 0, 2, 50, 3 ] # shell shell_title = [ \u0026#34;Shell:\u0026#34;, \u0026#34;Shell (block):\u0026#34; ] shell_origin = \u0026#34;top-center\u0026#34; shell_offset = [ 0, 2, 50, 3 ] [confirm] # trash trash_title = \u0026#34;Trash {n} selected file{s}?\u0026#34; trash_origin = \u0026#34;center\u0026#34; trash_offset = [ 0, 0, 70, 20 ] # delete delete_title = \u0026#34;Permanently delete {n} selected file{s}?\u0026#34; delete_origin = \u0026#34;center\u0026#34; delete_offset = [ 0, 0, 70, 20 ] # overwrite overwrite_title = \u0026#34;Overwrite file?\u0026#34; overwrite_body = \u0026#34;Will overwrite the following file:\u0026#34; overwrite_origin = \u0026#34;center\u0026#34; overwrite_offset = [ 0, 0, 50, 15 ] # quit quit_title = \u0026#34;Quit?\u0026#34; quit_body = \u0026#34;There are unfinished tasks, quit anyway?\\n(Open task manager with default key \u0026#39;w\u0026#39;)\u0026#34; quit_origin = \u0026#34;center\u0026#34; quit_offset = [ 0, 0, 50, 15 ] [pick] open_title = \u0026#34;Open with:\u0026#34; open_origin = \u0026#34;hovered\u0026#34; open_offset = [ 0, 1, 50, 7 ] [which] sort_by = \u0026#34;none\u0026#34; sort_sensitive = false sort_reverse = false sort_translit = false keymap.toml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 # A TOML linter such as https://github.com/tombi-toml/tombi can use this schema to validate your config. # If you encounter any problems, please make an issue at https://github.com/yazi-rs/schemas. # #:schema https://yazi-rs.github.io/schemas/keymap.json [mgr] prepend_keymap = [ { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;plugin smart-enter\u0026#34;, desc = \u0026#34;Enter the child directory, or open the file\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;t\u0026#34; ], run = \u0026#34;plugin eza-preview\u0026#34;, desc = \u0026#34;Toggle tree/list dir preview\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;-\u0026#34; ], run = \u0026#34;plugin eza-preview inc-level\u0026#34;, desc = \u0026#34;Increment tree level\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;_\u0026#34; ], run = \u0026#34;plugin eza-preview dec-level\u0026#34;, desc = \u0026#34;Decrement tree level\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;$\u0026#34; ], run = \u0026#34;plugin eza-preview toggle-follow-symlinks\u0026#34;, desc = \u0026#34;Toggle tree follow symlinks\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;*\u0026#34; ], run = \u0026#34;plugin eza-preview toggle-hidden\u0026#34;, desc = \u0026#34;Toggle hidden files\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;g\u0026#34;, \u0026#34;i\u0026#34; ], run = \u0026#34;plugin eza-preview toggle-git-ignore\u0026#34;, desc = \u0026#34;Toggle .gitignore files\u0026#34; }, { on = [ \u0026#34;e\u0026#34;, \u0026#34;g\u0026#34;, \u0026#34;s\u0026#34; ], run = \u0026#34;plugin eza-preview toggle-git-status\u0026#34;, desc = \u0026#34;Toggle showing git status\u0026#34; }, ] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Exit visual mode, clear selection, or cancel search\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Exit visual mode, clear selection, or cancel search\u0026#34; }, { on = \u0026#34;q\u0026#34;, run = \u0026#34;quit\u0026#34;, desc = \u0026#34;Quit the process\u0026#34; }, { on = \u0026#34;Q\u0026#34;, run = \u0026#34;quit --no-cwd-file\u0026#34;, desc = \u0026#34;Quit without outputting cwd-file\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close the current tab, or quit if it\u0026#39;s last\u0026#34; }, { on = \u0026#34;\u0026lt;C-z\u0026gt;\u0026#34;, run = \u0026#34;suspend\u0026#34;, desc = \u0026#34;Suspend the process\u0026#34; }, # Hopping { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous file\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next file\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous file\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next file\u0026#34; }, { on = \u0026#34;\u0026lt;C-u\u0026gt;\u0026#34;, run = \u0026#34;arrow -50%\u0026#34;, desc = \u0026#34;Move cursor up half page\u0026#34; }, { on = \u0026#34;\u0026lt;C-d\u0026gt;\u0026#34;, run = \u0026#34;arrow 50%\u0026#34;, desc = \u0026#34;Move cursor down half page\u0026#34; }, { on = \u0026#34;\u0026lt;C-b\u0026gt;\u0026#34;, run = \u0026#34;arrow -100%\u0026#34;, desc = \u0026#34;Move cursor up one page\u0026#34; }, { on = \u0026#34;\u0026lt;C-f\u0026gt;\u0026#34;, run = \u0026#34;arrow 100%\u0026#34;, desc = \u0026#34;Move cursor down one page\u0026#34; }, { on = \u0026#34;\u0026lt;S-PageUp\u0026gt;\u0026#34;, run = \u0026#34;arrow -50%\u0026#34;, desc = \u0026#34;Move cursor up half page\u0026#34; }, { on = \u0026#34;\u0026lt;S-PageDown\u0026gt;\u0026#34;, run = \u0026#34;arrow 50%\u0026#34;, desc = \u0026#34;Move cursor down half page\u0026#34; }, { on = \u0026#34;\u0026lt;PageUp\u0026gt;\u0026#34;, run = \u0026#34;arrow -100%\u0026#34;, desc = \u0026#34;Move cursor up one page\u0026#34; }, { on = \u0026#34;\u0026lt;PageDown\u0026gt;\u0026#34;, run = \u0026#34;arrow 100%\u0026#34;, desc = \u0026#34;Move cursor down one page\u0026#34; }, { on = [ \u0026#34;g\u0026#34;, \u0026#34;g\u0026#34; ], run = \u0026#34;arrow top\u0026#34;, desc = \u0026#34;Go to top\u0026#34; }, { on = \u0026#34;G\u0026#34;, run = \u0026#34;arrow bot\u0026#34;, desc = \u0026#34;Go to bottom\u0026#34; }, # Navigation { on = \u0026#34;h\u0026#34;, run = \u0026#34;leave\u0026#34;, desc = \u0026#34;Back to the parent directory\u0026#34; }, { on = \u0026#34;l\u0026#34;, run = \u0026#34;enter\u0026#34;, desc = \u0026#34;Enter the child directory\u0026#34; }, { on = \u0026#34;\u0026lt;Left\u0026gt;\u0026#34;, run = \u0026#34;leave\u0026#34;, desc = \u0026#34;Back to the parent directory\u0026#34; }, { on = \u0026#34;\u0026lt;Right\u0026gt;\u0026#34;, run = \u0026#34;enter\u0026#34;, desc = \u0026#34;Enter the child directory\u0026#34; }, { on = \u0026#34;H\u0026#34;, run = \u0026#34;back\u0026#34;, desc = \u0026#34;Back to previous directory\u0026#34; }, { on = \u0026#34;L\u0026#34;, run = \u0026#34;forward\u0026#34;, desc = \u0026#34;Forward to next directory\u0026#34; }, # Toggle { on = \u0026#34;\u0026lt;Space\u0026gt;\u0026#34;, run = [ \u0026#34;toggle\u0026#34;, \u0026#34;arrow 1\u0026#34; ], desc = \u0026#34;Toggle the current selection state\u0026#34; }, { on = \u0026#34;\u0026lt;C-a\u0026gt;\u0026#34;, run = \u0026#34;toggle_all --state=on\u0026#34;, desc = \u0026#34;Select all files\u0026#34; }, { on = \u0026#34;\u0026lt;C-r\u0026gt;\u0026#34;, run = \u0026#34;toggle_all\u0026#34;, desc = \u0026#34;Invert selection of all files\u0026#34; }, # Visual mode { on = \u0026#34;v\u0026#34;, run = \u0026#34;visual_mode\u0026#34;, desc = \u0026#34;Enter visual mode (selection mode)\u0026#34; }, { on = \u0026#34;V\u0026#34;, run = \u0026#34;visual_mode --unset\u0026#34;, desc = \u0026#34;Enter visual mode (unset mode)\u0026#34; }, # Seeking { on = \u0026#34;K\u0026#34;, run = \u0026#34;seek -5\u0026#34;, desc = \u0026#34;Seek up 5 units in the preview\u0026#34; }, { on = \u0026#34;J\u0026#34;, run = \u0026#34;seek 5\u0026#34;, desc = \u0026#34;Seek down 5 units in the preview\u0026#34; }, # Spotting { on = \u0026#34;\u0026lt;Tab\u0026gt;\u0026#34;, run = \u0026#34;spot\u0026#34;, desc = \u0026#34;Spot hovered file\u0026#34; }, # Operation { on = \u0026#34;o\u0026#34;, run = \u0026#34;open\u0026#34;, desc = \u0026#34;Open selected files\u0026#34; }, { on = \u0026#34;O\u0026#34;, run = \u0026#34;open --interactive\u0026#34;, desc = \u0026#34;Open selected files interactively\u0026#34; }, # { on = \u0026#34;E\u0026#34;, run = \u0026#34;plugin open-folder\u0026#34;, desc = \u0026#34;Open folder in Windows Explorer\u0026#34; }, # { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;open\u0026#34;, desc = \u0026#34;Open selected files\u0026#34; }, # { on = \u0026#34;\u0026lt;S-Enter\u0026gt;\u0026#34;, run = \u0026#34;open --interactive\u0026#34;, desc = \u0026#34;Open selected files interactively\u0026#34; }, { on = \u0026#34;y\u0026#34;, run = \u0026#34;yank\u0026#34;, desc = \u0026#34;Yank selected files (copy)\u0026#34; }, { on = \u0026#34;x\u0026#34;, run = \u0026#34;yank --cut\u0026#34;, desc = \u0026#34;Yank selected files (cut)\u0026#34; }, { on = \u0026#34;p\u0026#34;, run = \u0026#34;paste\u0026#34;, desc = \u0026#34;Paste yanked files\u0026#34; }, { on = \u0026#34;P\u0026#34;, run = \u0026#34;paste --force\u0026#34;, desc = \u0026#34;Paste yanked files (overwrite if the destination exists)\u0026#34; }, { on = \u0026#34;-\u0026#34;, run = \u0026#34;link\u0026#34;, desc = \u0026#34;Symlink the absolute path of yanked files\u0026#34; }, { on = \u0026#34;_\u0026#34;, run = \u0026#34;link --relative\u0026#34;, desc = \u0026#34;Symlink the relative path of yanked files\u0026#34; }, { on = \u0026#34;\u0026lt;C--\u0026gt;\u0026#34;, run = \u0026#34;hardlink\u0026#34;, desc = \u0026#34;Hardlink yanked files\u0026#34; }, { on = \u0026#34;Y\u0026#34;, run = \u0026#34;unyank\u0026#34;, desc = \u0026#34;Cancel the yank status\u0026#34; }, { on = \u0026#34;X\u0026#34;, run = \u0026#34;unyank\u0026#34;, desc = \u0026#34;Cancel the yank status\u0026#34; }, { on = \u0026#34;d\u0026#34;, run = \u0026#34;remove\u0026#34;, desc = \u0026#34;Trash selected files\u0026#34; }, { on = \u0026#34;D\u0026#34;, run = \u0026#34;remove --permanently\u0026#34;, desc = \u0026#34;Permanently delete selected files\u0026#34; }, { on = \u0026#34;a\u0026#34;, run = \u0026#34;create\u0026#34;, desc = \u0026#34;Create a file (ends with / for directories)\u0026#34; }, { on = \u0026#34;r\u0026#34;, run = \u0026#34;rename --cursor=before_ext\u0026#34;, desc = \u0026#34;Rename selected file(s)\u0026#34; }, { on = \u0026#34;;\u0026#34;, run = \u0026#34;shell --interactive\u0026#34;, desc = \u0026#34;Run a shell command\u0026#34; }, { on = \u0026#34;:\u0026#34;, run = \u0026#34;shell --block --interactive\u0026#34;, desc = \u0026#34;Run a shell command (block until finishes)\u0026#34; }, { on = \u0026#34;.\u0026#34;, run = \u0026#34;hidden toggle\u0026#34;, desc = \u0026#34;Toggle the visibility of hidden files\u0026#34; }, { on = \u0026#34;s\u0026#34;, run = \u0026#34;search --via=fd\u0026#34;, desc = \u0026#34;Search files by name via fd\u0026#34; }, { on = \u0026#34;S\u0026#34;, run = \u0026#34;search --via=rg\u0026#34;, desc = \u0026#34;Search files by content via ripgrep\u0026#34; }, { on = \u0026#34;\u0026lt;C-s\u0026gt;\u0026#34;, run = \u0026#34;escape --search\u0026#34;, desc = \u0026#34;Cancel the ongoing search\u0026#34; }, { on = \u0026#34;z\u0026#34;, run = \u0026#34;plugin fzf\u0026#34;, desc = \u0026#34;Jump to a file/directory via fzf\u0026#34; }, { on = \u0026#34;Z\u0026#34;, run = \u0026#34;plugin zoxide\u0026#34;, desc = \u0026#34;Jump to a directory via zoxide\u0026#34; }, # Linemode { on = [ \u0026#34;m\u0026#34;, \u0026#34;s\u0026#34; ], run = \u0026#34;linemode size\u0026#34;, desc = \u0026#34;Linemode: size\u0026#34; }, { on = [ \u0026#34;m\u0026#34;, \u0026#34;p\u0026#34; ], run = \u0026#34;linemode permissions\u0026#34;, desc = \u0026#34;Linemode: permissions\u0026#34; }, { on = [ \u0026#34;m\u0026#34;, \u0026#34;b\u0026#34; ], run = \u0026#34;linemode btime\u0026#34;, desc = \u0026#34;Linemode: btime\u0026#34; }, { on = [ \u0026#34;m\u0026#34;, \u0026#34;m\u0026#34; ], run = \u0026#34;linemode mtime\u0026#34;, desc = \u0026#34;Linemode: mtime\u0026#34; }, { on = [ \u0026#34;m\u0026#34;, \u0026#34;o\u0026#34; ], run = \u0026#34;linemode owner\u0026#34;, desc = \u0026#34;Linemode: owner\u0026#34; }, { on = [ \u0026#34;m\u0026#34;, \u0026#34;n\u0026#34; ], run = \u0026#34;linemode none\u0026#34;, desc = \u0026#34;Linemode: none\u0026#34; }, # Copy { on = [ \u0026#34;c\u0026#34;, \u0026#34;c\u0026#34; ], run = \u0026#34;copy path\u0026#34;, desc = \u0026#34;Copy file URL\u0026#34; }, { on = [ \u0026#34;c\u0026#34;, \u0026#34;d\u0026#34; ], run = \u0026#34;copy dirname\u0026#34;, desc = \u0026#34;Copy directory URL\u0026#34; }, { on = [ \u0026#34;c\u0026#34;, \u0026#34;f\u0026#34; ], run = \u0026#34;copy filename\u0026#34;, desc = \u0026#34;Copy filename\u0026#34; }, { on = [ \u0026#34;c\u0026#34;, \u0026#34;n\u0026#34; ], run = \u0026#34;copy name_without_ext\u0026#34;, desc = \u0026#34;Copy filename without extension\u0026#34; }, # Filter { on = \u0026#34;f\u0026#34;, run = \u0026#34;filter --smart\u0026#34;, desc = \u0026#34;Filter files\u0026#34; }, # Find { on = \u0026#34;/\u0026#34;, run = \u0026#34;find --smart\u0026#34;, desc = \u0026#34;Find next file\u0026#34; }, { on = \u0026#34;?\u0026#34;, run = \u0026#34;find --previous --smart\u0026#34;, desc = \u0026#34;Find previous file\u0026#34; }, { on = \u0026#34;n\u0026#34;, run = \u0026#34;find_arrow\u0026#34;, desc = \u0026#34;Next found\u0026#34; }, { on = \u0026#34;N\u0026#34;, run = \u0026#34;find_arrow --previous\u0026#34;, desc = \u0026#34;Previous found\u0026#34; }, # Sorting { on = [ \u0026#34;,\u0026#34;, \u0026#34;m\u0026#34; ], run = [ \u0026#34;sort mtime --reverse=no\u0026#34;, \u0026#34;linemode mtime\u0026#34; ], desc = \u0026#34;Sort by modified time\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;M\u0026#34; ], run = [ \u0026#34;sort mtime --reverse=yes\u0026#34;, \u0026#34;linemode mtime\u0026#34; ], desc = \u0026#34;Sort by modified time (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;b\u0026#34; ], run = [ \u0026#34;sort btime --reverse=no\u0026#34;, \u0026#34;linemode btime\u0026#34; ], desc = \u0026#34;Sort by birth time\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;B\u0026#34; ], run = [ \u0026#34;sort btime --reverse=yes\u0026#34;, \u0026#34;linemode btime\u0026#34; ], desc = \u0026#34;Sort by birth time (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;e\u0026#34; ], run = \u0026#34;sort extension --reverse=no\u0026#34;, desc = \u0026#34;Sort by extension\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;E\u0026#34; ], run = \u0026#34;sort extension --reverse=yes\u0026#34;, desc = \u0026#34;Sort by extension (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;a\u0026#34; ], run = \u0026#34;sort alphabetical --reverse=no\u0026#34;, desc = \u0026#34;Sort alphabetically\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;A\u0026#34; ], run = \u0026#34;sort alphabetical --reverse=yes\u0026#34;, desc = \u0026#34;Sort alphabetically (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;n\u0026#34; ], run = \u0026#34;sort natural --reverse=no\u0026#34;, desc = \u0026#34;Sort naturally\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;N\u0026#34; ], run = \u0026#34;sort natural --reverse=yes\u0026#34;, desc = \u0026#34;Sort naturally (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;s\u0026#34; ], run = [ \u0026#34;sort size --reverse=no\u0026#34;, \u0026#34;linemode size\u0026#34; ], desc = \u0026#34;Sort by size\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;S\u0026#34; ], run = [ \u0026#34;sort size --reverse=yes\u0026#34;, \u0026#34;linemode size\u0026#34; ], desc = \u0026#34;Sort by size (reverse)\u0026#34; }, { on = [ \u0026#34;,\u0026#34;, \u0026#34;r\u0026#34; ], run = \u0026#34;sort random --reverse=no\u0026#34;, desc = \u0026#34;Sort randomly\u0026#34; }, # Goto { on = [ \u0026#34;g\u0026#34;, \u0026#34;h\u0026#34; ], run = \u0026#34;cd ~\u0026#34;, desc = \u0026#34;Go home\u0026#34; }, { on = [ \u0026#34;g\u0026#34;, \u0026#34;c\u0026#34; ], run = \u0026#34;cd ~/.config\u0026#34;, desc = \u0026#34;Go ~/.config\u0026#34; }, { on = [ \u0026#34;g\u0026#34;, \u0026#34;d\u0026#34; ], run = \u0026#34;cd ~/Downloads\u0026#34;, desc = \u0026#34;Go ~/Downloads\u0026#34; }, { on = [ \u0026#34;g\u0026#34;, \u0026#34;\u0026lt;Space\u0026gt;\u0026#34; ], run = \u0026#34;cd --interactive\u0026#34;, desc = \u0026#34;Jump interactively\u0026#34; }, { on = [ \u0026#34;g\u0026#34;, \u0026#34;f\u0026#34; ], run = \u0026#34;follow\u0026#34;, desc = \u0026#34;Follow hovered symlink\u0026#34; }, # Tabs { on = [ \u0026#34;t\u0026#34;, \u0026#34;t\u0026#34; ], run = \u0026#34;tab_create --current\u0026#34;, desc = \u0026#34;Create a new tab in CWD\u0026#34; }, { on = [ \u0026#34;t\u0026#34;, \u0026#34;r\u0026#34; ], run = \u0026#34;tab_rename --interactive\u0026#34;, desc = \u0026#34;Rename current tab\u0026#34; }, { on = \u0026#34;1\u0026#34;, run = \u0026#34;tab_switch 0\u0026#34;, desc = \u0026#34;Switch to first tab\u0026#34; }, { on = \u0026#34;2\u0026#34;, run = \u0026#34;tab_switch 1\u0026#34;, desc = \u0026#34;Switch to second tab\u0026#34; }, { on = \u0026#34;3\u0026#34;, run = \u0026#34;tab_switch 2\u0026#34;, desc = \u0026#34;Switch to third tab\u0026#34; }, { on = \u0026#34;4\u0026#34;, run = \u0026#34;tab_switch 3\u0026#34;, desc = \u0026#34;Switch to fourth tab\u0026#34; }, { on = \u0026#34;5\u0026#34;, run = \u0026#34;tab_switch 4\u0026#34;, desc = \u0026#34;Switch to fifth tab\u0026#34; }, { on = \u0026#34;6\u0026#34;, run = \u0026#34;tab_switch 5\u0026#34;, desc = \u0026#34;Switch to sixth tab\u0026#34; }, { on = \u0026#34;7\u0026#34;, run = \u0026#34;tab_switch 6\u0026#34;, desc = \u0026#34;Switch to seventh tab\u0026#34; }, { on = \u0026#34;8\u0026#34;, run = \u0026#34;tab_switch 7\u0026#34;, desc = \u0026#34;Switch to eighth tab\u0026#34; }, { on = \u0026#34;9\u0026#34;, run = \u0026#34;tab_switch 8\u0026#34;, desc = \u0026#34;Switch to ninth tab\u0026#34; }, { on = \u0026#34;[\u0026#34;, run = \u0026#34;tab_switch -1 --relative\u0026#34;, desc = \u0026#34;Switch to previous tab\u0026#34; }, { on = \u0026#34;]\u0026#34;, run = \u0026#34;tab_switch 1 --relative\u0026#34;, desc = \u0026#34;Switch to next tab\u0026#34; }, { on = \u0026#34;{\u0026#34;, run = \u0026#34;tab_swap -1\u0026#34;, desc = \u0026#34;Swap current tab with previous tab\u0026#34; }, { on = \u0026#34;}\u0026#34;, run = \u0026#34;tab_swap 1\u0026#34;, desc = \u0026#34;Swap current tab with next tab\u0026#34; }, # Tasks { on = \u0026#34;w\u0026#34;, run = \u0026#34;tasks:show\u0026#34;, desc = \u0026#34;Show task manager\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [tasks] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close task manager\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close task manager\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close task manager\u0026#34; }, { on = \u0026#34;w\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close task manager\u0026#34; }, { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous task\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next task\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous task\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next task\u0026#34; }, { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;inspect\u0026#34;, desc = \u0026#34;Inspect the task\u0026#34; }, { on = \u0026#34;x\u0026#34;, run = \u0026#34;cancel\u0026#34;, desc = \u0026#34;Cancel the task\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [spot] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close the spot\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close the spot\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close the spot\u0026#34; }, { on = \u0026#34;\u0026lt;Tab\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Close the spot\u0026#34; }, { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, { on = \u0026#34;h\u0026#34;, run = \u0026#34;swipe prev\u0026#34;, desc = \u0026#34;Swipe to previous file\u0026#34; }, { on = \u0026#34;l\u0026#34;, run = \u0026#34;swipe next\u0026#34;, desc = \u0026#34;Swipe to next file\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, { on = \u0026#34;\u0026lt;Left\u0026gt;\u0026#34;, run = \u0026#34;swipe prev\u0026#34;, desc = \u0026#34;Swipe to previous file\u0026#34; }, { on = \u0026#34;\u0026lt;Right\u0026gt;\u0026#34;, run = \u0026#34;swipe next\u0026#34;, desc = \u0026#34;Swipe to next file\u0026#34; }, # Copy { on = [ \u0026#34;c\u0026#34;, \u0026#34;c\u0026#34; ], run = \u0026#34;copy cell\u0026#34;, desc = \u0026#34;Copy selected cell\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [pick] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel pick\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel pick\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel pick\u0026#34; }, { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;close --submit\u0026#34;, desc = \u0026#34;Submit the pick\u0026#34; }, { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous option\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next option\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous option\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next option\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [input] keymap = [ { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel input\u0026#34; }, { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;close --submit\u0026#34;, desc = \u0026#34;Submit input\u0026#34; }, { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Back to normal mode, or cancel input\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Back to normal mode, or cancel input\u0026#34; }, # Mode { on = \u0026#34;i\u0026#34;, run = \u0026#34;insert\u0026#34;, desc = \u0026#34;Enter insert mode\u0026#34; }, { on = \u0026#34;I\u0026#34;, run = [ \u0026#34;move first-char\u0026#34;, \u0026#34;insert\u0026#34; ], desc = \u0026#34;Move to the BOL, and enter insert mode\u0026#34; }, { on = \u0026#34;a\u0026#34;, run = \u0026#34;insert --append\u0026#34;, desc = \u0026#34;Enter append mode\u0026#34; }, { on = \u0026#34;A\u0026#34;, run = [ \u0026#34;move eol\u0026#34;, \u0026#34;insert --append\u0026#34; ], desc = \u0026#34;Move to the EOL, and enter append mode\u0026#34; }, { on = \u0026#34;v\u0026#34;, run = \u0026#34;visual\u0026#34;, desc = \u0026#34;Enter visual mode\u0026#34; }, { on = \u0026#34;r\u0026#34;, run = \u0026#34;replace\u0026#34;, desc = \u0026#34;Replace a single character\u0026#34; }, # Selection { on = \u0026#34;V\u0026#34;, run = [ \u0026#34;move bol\u0026#34;, \u0026#34;visual\u0026#34;, \u0026#34;move eol\u0026#34; ], desc = \u0026#34;Select from BOL to EOL\u0026#34; }, { on = \u0026#34;\u0026lt;C-A\u0026gt;\u0026#34;, run = [ \u0026#34;move eol\u0026#34;, \u0026#34;visual\u0026#34;, \u0026#34;move bol\u0026#34; ], desc = \u0026#34;Select from EOL to BOL\u0026#34; }, { on = \u0026#34;\u0026lt;C-E\u0026gt;\u0026#34;, run = [ \u0026#34;move bol\u0026#34;, \u0026#34;visual\u0026#34;, \u0026#34;move eol\u0026#34; ], desc = \u0026#34;Select from BOL to EOL\u0026#34; }, # Character-wise movement { on = \u0026#34;h\u0026#34;, run = \u0026#34;move -1\u0026#34;, desc = \u0026#34;Move back a character\u0026#34; }, { on = \u0026#34;l\u0026#34;, run = \u0026#34;move 1\u0026#34;, desc = \u0026#34;Move forward a character\u0026#34; }, { on = \u0026#34;\u0026lt;Left\u0026gt;\u0026#34;, run = \u0026#34;move -1\u0026#34;, desc = \u0026#34;Move back a character\u0026#34; }, { on = \u0026#34;\u0026lt;Right\u0026gt;\u0026#34;, run = \u0026#34;move 1\u0026#34;, desc = \u0026#34;Move forward a character\u0026#34; }, { on = \u0026#34;\u0026lt;C-b\u0026gt;\u0026#34;, run = \u0026#34;move -1\u0026#34;, desc = \u0026#34;Move back a character\u0026#34; }, { on = \u0026#34;\u0026lt;C-f\u0026gt;\u0026#34;, run = \u0026#34;move 1\u0026#34;, desc = \u0026#34;Move forward a character\u0026#34; }, # Word-wise movement { on = \u0026#34;b\u0026#34;, run = \u0026#34;backward\u0026#34;, desc = \u0026#34;Move back to the start of the current or previous word\u0026#34; }, { on = \u0026#34;B\u0026#34;, run = \u0026#34;backward --far\u0026#34;, desc = \u0026#34;Move back to the start of the current or previous WORD\u0026#34; }, { on = \u0026#34;w\u0026#34;, run = \u0026#34;forward\u0026#34;, desc = \u0026#34;Move forward to the start of the next word\u0026#34; }, { on = \u0026#34;W\u0026#34;, run = \u0026#34;forward --far\u0026#34;, desc = \u0026#34;Move forward to the start of the next WORD\u0026#34; }, { on = \u0026#34;e\u0026#34;, run = \u0026#34;forward --end-of-word\u0026#34;, desc = \u0026#34;Move forward to the end of the current or next word\u0026#34; }, { on = \u0026#34;E\u0026#34;, run = \u0026#34;forward --far --end-of-word\u0026#34;, desc = \u0026#34;Move forward to the end of the current or next WORD\u0026#34; }, { on = \u0026#34;\u0026lt;A-b\u0026gt;\u0026#34;, run = \u0026#34;backward\u0026#34;, desc = \u0026#34;Move back to the start of the current or previous word\u0026#34; }, { on = \u0026#34;\u0026lt;A-f\u0026gt;\u0026#34;, run = \u0026#34;forward --end-of-word\u0026#34;, desc = \u0026#34;Move forward to the end of the current or next word\u0026#34; }, { on = \u0026#34;\u0026lt;C-Left\u0026gt;\u0026#34;, run = \u0026#34;backward\u0026#34;, desc = \u0026#34;Move back to the start of the current or previous word\u0026#34; }, { on = \u0026#34;\u0026lt;C-Right\u0026gt;\u0026#34;, run = \u0026#34;forward --end-of-word\u0026#34;, desc = \u0026#34;Move forward to the end of the current or next word\u0026#34; }, # Line-wise movement { on = \u0026#34;0\u0026#34;, run = \u0026#34;move bol\u0026#34;, desc = \u0026#34;Move to the BOL\u0026#34; }, { on = \u0026#34;$\u0026#34;, run = \u0026#34;move eol\u0026#34;, desc = \u0026#34;Move to the EOL\u0026#34; }, { on = \u0026#34;_\u0026#34;, run = \u0026#34;move first-char\u0026#34;, desc = \u0026#34;Move to the first non-whitespace character\u0026#34; }, { on = \u0026#34;^\u0026#34;, run = \u0026#34;move first-char\u0026#34;, desc = \u0026#34;Move to the first non-whitespace character\u0026#34; }, { on = \u0026#34;\u0026lt;C-a\u0026gt;\u0026#34;, run = \u0026#34;move bol\u0026#34;, desc = \u0026#34;Move to the BOL\u0026#34; }, { on = \u0026#34;\u0026lt;C-e\u0026gt;\u0026#34;, run = \u0026#34;move eol\u0026#34;, desc = \u0026#34;Move to the EOL\u0026#34; }, { on = \u0026#34;\u0026lt;Home\u0026gt;\u0026#34;, run = \u0026#34;move bol\u0026#34;, desc = \u0026#34;Move to the BOL\u0026#34; }, { on = \u0026#34;\u0026lt;End\u0026gt;\u0026#34;, run = \u0026#34;move eol\u0026#34;, desc = \u0026#34;Move to the EOL\u0026#34; }, # Delete { on = \u0026#34;\u0026lt;Backspace\u0026gt;\u0026#34;, run = \u0026#34;backspace\u0026#34;, desc = \u0026#34;Delete the character before the cursor\u0026#34; }, { on = \u0026#34;\u0026lt;Delete\u0026gt;\u0026#34;, run = \u0026#34;backspace --under\u0026#34;, desc = \u0026#34;Delete the character under the cursor\u0026#34; }, { on = \u0026#34;\u0026lt;C-h\u0026gt;\u0026#34;, run = \u0026#34;backspace\u0026#34;, desc = \u0026#34;Delete the character before the cursor\u0026#34; }, { on = \u0026#34;\u0026lt;C-d\u0026gt;\u0026#34;, run = \u0026#34;backspace --under\u0026#34;, desc = \u0026#34;Delete the character under the cursor\u0026#34; }, # Kill { on = \u0026#34;\u0026lt;C-u\u0026gt;\u0026#34;, run = \u0026#34;kill bol\u0026#34;, desc = \u0026#34;Kill backwards to the BOL\u0026#34; }, { on = \u0026#34;\u0026lt;C-k\u0026gt;\u0026#34;, run = \u0026#34;kill eol\u0026#34;, desc = \u0026#34;Kill forwards to the EOL\u0026#34; }, { on = \u0026#34;\u0026lt;C-w\u0026gt;\u0026#34;, run = \u0026#34;kill backward\u0026#34;, desc = \u0026#34;Kill backwards to the start of the current word\u0026#34; }, { on = \u0026#34;\u0026lt;A-d\u0026gt;\u0026#34;, run = \u0026#34;kill forward\u0026#34;, desc = \u0026#34;Kill forwards to the end of the current word\u0026#34; }, { on = \u0026#34;\u0026lt;C-Backspace\u0026gt;\u0026#34;, run = \u0026#34;kill backward\u0026#34;, desc = \u0026#34;Kill backwards to the start of the current word\u0026#34; }, { on = \u0026#34;\u0026lt;C-Delete\u0026gt;\u0026#34;, run = \u0026#34;kill forward\u0026#34;, desc = \u0026#34;Kill forwards to the end of the current word\u0026#34; }, # Cut/Yank/Paste { on = \u0026#34;d\u0026#34;, run = \u0026#34;delete --cut\u0026#34;, desc = \u0026#34;Cut selected characters\u0026#34; }, { on = \u0026#34;D\u0026#34;, run = [ \u0026#34;delete --cut\u0026#34;, \u0026#34;move eol\u0026#34; ], desc = \u0026#34;Cut until EOL\u0026#34; }, { on = \u0026#34;c\u0026#34;, run = \u0026#34;delete --cut --insert\u0026#34;, desc = \u0026#34;Cut selected characters, and enter insert mode\u0026#34; }, { on = \u0026#34;C\u0026#34;, run = [ \u0026#34;delete --cut --insert\u0026#34;, \u0026#34;move eol\u0026#34; ], desc = \u0026#34;Cut until EOL, and enter insert mode\u0026#34; }, { on = \u0026#34;s\u0026#34;, run = [ \u0026#34;delete --cut --insert\u0026#34;, \u0026#34;move 1\u0026#34; ], desc = \u0026#34;Cut current character, and enter insert mode\u0026#34; }, { on = \u0026#34;S\u0026#34;, run = [ \u0026#34;move bol\u0026#34;, \u0026#34;delete --cut --insert\u0026#34;, \u0026#34;move eol\u0026#34; ], desc = \u0026#34;Cut from BOL until EOL, and enter insert mode\u0026#34; }, { on = \u0026#34;x\u0026#34;, run = [ \u0026#34;delete --cut\u0026#34;, \u0026#34;move 1 --in-operating\u0026#34; ], desc = \u0026#34;Cut current character\u0026#34; }, { on = \u0026#34;y\u0026#34;, run = \u0026#34;yank\u0026#34;, desc = \u0026#34;Copy selected characters\u0026#34; }, { on = \u0026#34;p\u0026#34;, run = \u0026#34;paste\u0026#34;, desc = \u0026#34;Paste copied characters after the cursor\u0026#34; }, { on = \u0026#34;P\u0026#34;, run = \u0026#34;paste --before\u0026#34;, desc = \u0026#34;Paste copied characters before the cursor\u0026#34; }, # Undo/Redo/Casefy { on = \u0026#34;u\u0026#34;, run = [ \u0026#34;undo\u0026#34;, \u0026#34;casefy lower\u0026#34; ], desc = \u0026#34;Undo, or lowercase if in visual mode\u0026#34; }, { on = \u0026#34;U\u0026#34;, run = \u0026#34;casefy upper\u0026#34;, desc = \u0026#34;Uppercase\u0026#34; }, { on = \u0026#34;\u0026lt;C-r\u0026gt;\u0026#34;, run = \u0026#34;redo\u0026#34;, desc = \u0026#34;Redo the last operation\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [confirm] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel the confirm\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel the confirm\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel the confirm\u0026#34; }, { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = \u0026#34;close --submit\u0026#34;, desc = \u0026#34;Submit the confirm\u0026#34; }, { on = \u0026#34;n\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel the confirm\u0026#34; }, { on = \u0026#34;y\u0026#34;, run = \u0026#34;close --submit\u0026#34;, desc = \u0026#34;Submit the confirm\u0026#34; }, { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [cmp] keymap = [ { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Cancel completion\u0026#34; }, { on = \u0026#34;\u0026lt;Tab\u0026gt;\u0026#34;, run = \u0026#34;close --submit\u0026#34;, desc = \u0026#34;Submit the completion\u0026#34; }, { on = \u0026#34;\u0026lt;Enter\u0026gt;\u0026#34;, run = [ \u0026#34;close --submit\u0026#34;, \u0026#34;input:close --submit\u0026#34; ], desc = \u0026#34;Complete and submit the input\u0026#34; }, { on = \u0026#34;\u0026lt;A-k\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous item\u0026#34; }, { on = \u0026#34;\u0026lt;A-j\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next item\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous item\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next item\u0026#34; }, { on = \u0026#34;\u0026lt;C-p\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous item\u0026#34; }, { on = \u0026#34;\u0026lt;C-n\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next item\u0026#34; }, # Help { on = \u0026#34;~\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, { on = \u0026#34;\u0026lt;F1\u0026gt;\u0026#34;, run = \u0026#34;help\u0026#34;, desc = \u0026#34;Open help\u0026#34; }, ] [help] keymap = [ { on = \u0026#34;\u0026lt;Esc\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Clear the filter, or hide the help\u0026#34; }, { on = \u0026#34;\u0026lt;C-[\u0026gt;\u0026#34;, run = \u0026#34;escape\u0026#34;, desc = \u0026#34;Clear the filter, or hide the help\u0026#34; }, { on = \u0026#34;\u0026lt;C-c\u0026gt;\u0026#34;, run = \u0026#34;close\u0026#34;, desc = \u0026#34;Hide the help\u0026#34; }, # Navigation { on = \u0026#34;k\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;j\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, { on = \u0026#34;\u0026lt;Up\u0026gt;\u0026#34;, run = \u0026#34;arrow prev\u0026#34;, desc = \u0026#34;Previous line\u0026#34; }, { on = \u0026#34;\u0026lt;Down\u0026gt;\u0026#34;, run = \u0026#34;arrow next\u0026#34;, desc = \u0026#34;Next line\u0026#34; }, # Filtering { on = \u0026#34;f\u0026#34;, run = \u0026#34;filter\u0026#34;, desc = \u0026#34;Filter help items\u0026#34; }, ] theme.toml 1 2 3 4 5 # : Flavor {{{ [flavor] dark = \u0026#34;catppuccin-macchiato\u0026#34; light = \u0026#34;\u0026#34; 这里采用的是catppuccin-macchiato主题，可以ya pkg add yazi-rs/flavors:catppuccin-macchiato下载配置\nstarship.toml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 format = \u0026#34;\u0026#34;\u0026#34;\\ (fg:arrow)\\ [](red)\\ $os\\ $username\\ [](red) \\ $git_branch\\ $git_status\\ (\\ [on](fg:dim) \\ $directory\\ )\\ (\\ [via](fg:dim)\\ $python\\ $conda\\ $nodejs\\ $c\\ $rust\\ $java\\ )\\ $fill\\ $time $character\\ \u0026#34;\u0026#34;\u0026#34; # Add the modules you need # [╭╴][╰─](fg:arrow) # Disable the blank line at the start of the prompt add_newline = false palette = \u0026#34;normal\u0026#34; [palettes.normal] arrow = \u0026#34;#77BBDD\u0026#34; os = \u0026#34;#16f4d0\u0026#34; os_admin = \u0026#34;#e4ff1a\u0026#34; directory = \u0026#34;#9ffff5\u0026#34; time = \u0026#34;#bdfffd\u0026#34; node = \u0026#34;#a5e6ba\u0026#34; git = \u0026#34;#f17f29\u0026#34; git_status = \u0026#34;#DFEBED\u0026#34; python = \u0026#34;#edf67d\u0026#34; conda = \u0026#34;#70e000\u0026#34; java = \u0026#34;#F86279\u0026#34; rust = \u0026#34;#ffdac6\u0026#34; clang = \u0026#34;#caf0f8\u0026#34; duration = \u0026#34;#ce4257\u0026#34; text_color = \u0026#34;#EDF2F4\u0026#34; text_light = \u0026#34;#26272A\u0026#34; red = \u0026#34;#f38ba8\u0026#34; peach = \u0026#34;#fab387\u0026#34; crust = \u0026#34;#11111b\u0026#34; dim = \u0026#34;#7aa2f7\u0026#34; # I disabled some modules (Rust, Java...) since some things aren\u0026#39;t installed in my machine, enable them if you need. [username] show_always = true style_user = \u0026#34;bg:red fg:crust\u0026#34; style_root = \u0026#34;bg:red fg:crust\u0026#34; format = \u0026#39;[ $user]($style)\u0026#39; [os] disabled = false style = \u0026#34;bg:red fg:crust\u0026#34; [os.symbols] Windows = \u0026#34;\u0026#34; Ubuntu = \u0026#34;󰕈\u0026#34; SUSE = \u0026#34;\u0026#34; Raspbian = \u0026#34;󰐿\u0026#34; Mint = \u0026#34;󰣭\u0026#34; Macos = \u0026#34;󰀵\u0026#34; Manjaro = \u0026#34;\u0026#34; Linux = \u0026#34;󰌽\u0026#34; Gentoo = \u0026#34;󰣨\u0026#34; Fedora = \u0026#34;󰣛\u0026#34; Alpine = \u0026#34;\u0026#34; Amazon = \u0026#34;\u0026#34; Android = \u0026#34;\u0026#34; AOSC = \u0026#34;\u0026#34; Arch = \u0026#34;󰣇\u0026#34; Artix = \u0026#34;󰣇\u0026#34; CentOS = \u0026#34;\u0026#34; Debian = \u0026#34;󰣚\u0026#34; Redhat = \u0026#34;󱄛\u0026#34; RedHatEnterprise = \u0026#34;󱄛\u0026#34; [character] success_symbol = \u0026#34;[󰍟](fg:arrow)\u0026#34; error_symbol = \u0026#34;[󰍟](fg:red)\u0026#34; [directory] format = \u0026#34;[$path](bold $style)[$read_only]($read_only_style) \u0026#34; truncation_length = 10 style = \u0026#34;fg:directory\u0026#34; read_only_style = \u0026#34;fg:directory\u0026#34; before_repo_root_style = \u0026#34;fg:directory\u0026#34; truncation_symbol = \u0026#34;…/\u0026#34; truncate_to_repo = false read_only = \u0026#34;  \u0026#34; [time] disabled = false format = \u0026#34;[󱑈 $time]($style)\u0026#34; time_format = \u0026#34;%H:%M\u0026#34; style = \u0026#34;bold fg:time\u0026#34; [cmd_duration] format = \u0026#34;took [ $duration]($style) \u0026#34; style = \u0026#34;bold fg:duration\u0026#34; min_time = 500 [git_branch] format = \u0026#34;[$symbol$branch]($style) \u0026#34; style = \u0026#34;bold fg:git\u0026#34; symbol = \u0026#34; \u0026#34; [git_status] style = \u0026#34;fg:git_status\u0026#34; format = \u0026#39;[[($all_status$ahead_behind )](fg:git_status)]($style)\u0026#39; [docker_context] disabled = true symbol = \u0026#34; \u0026#34; [package] disabled = true [fill] symbol = \u0026#34; \u0026#34; [nodejs] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:node\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = false [python] disabled = false format = \u0026#39;[ ${symbol}${pyenv_prefix}(${version})( \\($virtualenv\\)) ]($style)\u0026#39; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; style = \u0026#34;fg:python\u0026#34; [conda] format = \u0026#34;[ $symbol$environment ]($style)\u0026#34; style = \u0026#34;fg:conda\u0026#34; ignore_base = false disabled = false symbol = \u0026#34; \u0026#34; [java] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:java\u0026#34; version_format = \u0026#34;${raw}\u0026#34; symbol = \u0026#34; \u0026#34; disabled = true [c] format = \u0026#34;[ $symbol($version(-$name)) ]($style)\u0026#34; style = \u0026#34;fg:clang\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = true [rust] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:rust\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = true macOS-Configuration 配合使用相关设置进行了针对性的修改，starship的配置文件如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 format = \u0026#34;\u0026#34;\u0026#34;\\ (fg:arrow)\\ [](arrow)\\ $os\\ $username\\ [](arrow) \\ $git_branch\\ $git_status\\ (\\ [on](fg:dim) \\ $directory\\ )\\ (\\ [via](fg:dim)\\ $python\\ $conda\\ $nodejs\\ $c\\ $rust\\ $java\\ )\\ $fill\\ $time $character\\ \u0026#34;\u0026#34;\u0026#34; # Add the modules you need # [╭╴][╰─](fg:arrow) # Disable the blank line at the start of the prompt add_newline = false palette = \u0026#34;normal\u0026#34; [palettes.normal] arrow = \u0026#34;#77BBDD\u0026#34; os = \u0026#34;#16f4d0\u0026#34; os_admin = \u0026#34;#e4ff1a\u0026#34; directory = \u0026#34;#9ffff5\u0026#34; time = \u0026#34;#bdfffd\u0026#34; node = \u0026#34;#a5e6ba\u0026#34; git = \u0026#34;#f17f29\u0026#34; git_status = \u0026#34;#DFEBED\u0026#34; python = \u0026#34;#edf67d\u0026#34; conda = \u0026#34;#70e000\u0026#34; java = \u0026#34;#F86279\u0026#34; rust = \u0026#34;#ffdac6\u0026#34; clang = \u0026#34;#caf0f8\u0026#34; duration = \u0026#34;#ce4257\u0026#34; text_color = \u0026#34;#EDF2F4\u0026#34; text_light = \u0026#34;#26272A\u0026#34; red = \u0026#34;#f38ba8\u0026#34; peach = \u0026#34;#fab387\u0026#34; crust = \u0026#34;#11111b\u0026#34; dim = \u0026#34;#7aa2f7\u0026#34; # I disabled some modules (Rust, Java...) since some things aren\u0026#39;t installed in my machine, enable them if you need. [username] show_always = true style_user = \u0026#34;bg:arrow fg:crust\u0026#34; style_root = \u0026#34;bg:arrow fg:crust\u0026#34; format = \u0026#39;[ Rei]($style)\u0026#39; [os] disabled = false style = \u0026#34;bg:arrow fg:crust\u0026#34; [os.symbols] Windows = \u0026#34;\u0026#34; Ubuntu = \u0026#34;󰕈\u0026#34; SUSE = \u0026#34;\u0026#34; Raspbian = \u0026#34;󰐿\u0026#34; Mint = \u0026#34;󰣭\u0026#34; Macos = \u0026#34;󰀵\u0026#34; Manjaro = \u0026#34;\u0026#34; Linux = \u0026#34;󰌽\u0026#34; Gentoo = \u0026#34;󰣨\u0026#34; Fedora = \u0026#34;󰣛\u0026#34; Alpine = \u0026#34;\u0026#34; Amazon = \u0026#34;\u0026#34; Android = \u0026#34;\u0026#34; AOSC = \u0026#34;\u0026#34; Arch = \u0026#34;󰣇\u0026#34; Artix = \u0026#34;󰣇\u0026#34; CentOS = \u0026#34;\u0026#34; Debian = \u0026#34;󰣚\u0026#34; Redhat = \u0026#34;󱄛\u0026#34; RedHatEnterprise = \u0026#34;󱄛\u0026#34; [character] success_symbol = \u0026#34;[󰍟](fg:arrow)\u0026#34; error_symbol = \u0026#34;[󰍟](fg:red)\u0026#34; [directory] format = \u0026#34;[$path](bold $style)[$read_only]($read_only_style) \u0026#34; truncation_length = 10 style = \u0026#34;fg:directory\u0026#34; read_only_style = \u0026#34;fg:directory\u0026#34; before_repo_root_style = \u0026#34;fg:directory\u0026#34; truncation_symbol = \u0026#34;…/\u0026#34; truncate_to_repo = false read_only = \u0026#34;  \u0026#34; [time] disabled = false format = \u0026#34;[󱑈 $time]($style)\u0026#34; time_format = \u0026#34;%H:%M\u0026#34; style = \u0026#34;bold fg:time\u0026#34; [cmd_duration] format = \u0026#34;took [ $duration]($style) \u0026#34; style = \u0026#34;bold fg:duration\u0026#34; min_time = 500 [git_branch] format = \u0026#34;[$symbol$branch]($style) \u0026#34; style = \u0026#34;bold fg:git\u0026#34; symbol = \u0026#34; \u0026#34; [git_status] style = \u0026#34;fg:git_status\u0026#34; format = \u0026#39;[[($all_status$ahead_behind )](fg:git_status)]($style)\u0026#39; [docker_context] disabled = true symbol = \u0026#34; \u0026#34; [package] disabled = true [fill] symbol = \u0026#34; \u0026#34; [nodejs] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:node\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = false [python] disabled = false format = \u0026#39;[ ${symbol}${pyenv_prefix}(${version})( \\($virtualenv\\)) ]($style)\u0026#39; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; style = \u0026#34;fg:python\u0026#34; [conda] format = \u0026#34;[ $symbol$environment ]($style)\u0026#34; style = \u0026#34;fg:conda\u0026#34; ignore_base = false disabled = false symbol = \u0026#34; \u0026#34; [java] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:java\u0026#34; version_format = \u0026#34;${raw}\u0026#34; symbol = \u0026#34; \u0026#34; disabled = true [c] format = \u0026#34;[ $symbol($version(-$name)) ]($style)\u0026#34; style = \u0026#34;fg:clang\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = true [rust] format = \u0026#34;[ $symbol$version ]($style)\u0026#34; style = \u0026#34;fg:rust\u0026#34; symbol = \u0026#34; \u0026#34; version_format = \u0026#34;${raw}\u0026#34; disabled = true 同样的配置在yazi中出现了点问题，会自动截断starship的配置，所以我暂时重写了yazi里面的starship的配置，也就是starship_yazi.toml，具体配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 # 专为 yazi header 设计的精简版 starship 配置 format = \u0026#34;\u0026#34;\u0026#34;\\ (fg:arrow)\\ [](arrow)\\ $os\\ $username\\ [](arrow) \\ $git_branch\\ $git_status\\ (on [](fg:dim)\\ $directory\\ )\\ \u0026#34;\u0026#34;\u0026#34; add_newline = false palette = \u0026#34;normal\u0026#34; [palettes.normal] arrow = \u0026#34;#77BBDD\u0026#34; os = \u0026#34;#16f4d0\u0026#34; directory = \u0026#34;#9ffff5\u0026#34; git = \u0026#34;#f17f29\u0026#34; git_status = \u0026#34;#DFEBED\u0026#34; dim = \u0026#34;#7aa2f7\u0026#34; crust = \u0026#34;#11111b\u0026#34; [os] disabled = false style = \u0026#34;bg:arrow fg:crust\u0026#34; format = \u0026#34;[$symbol]($style)\u0026#34; [os.symbols] Windows = \u0026#34;\u0026#34; Ubuntu = \u0026#34;󰕈\u0026#34; SUSE = \u0026#34;\u0026#34; Raspbian = \u0026#34;󰐿\u0026#34; Mint = \u0026#34;󰣭\u0026#34; Macos = \u0026#34;󰀵\u0026#34; Manjaro = \u0026#34;\u0026#34; Linux = \u0026#34;󰌽\u0026#34; Gentoo = \u0026#34;󰣨\u0026#34; Fedora = \u0026#34;󰣛\u0026#34; Alpine = \u0026#34;\u0026#34; Amazon = \u0026#34;\u0026#34; Android = \u0026#34;\u0026#34; AOSC = \u0026#34;\u0026#34; Arch = \u0026#34;󰣇\u0026#34; Artix = \u0026#34;󰣇\u0026#34; CentOS = \u0026#34;\u0026#34; Debian = \u0026#34;󰣚\u0026#34; Redhat = \u0026#34;󱄛\u0026#34; RedHatEnterprise = \u0026#34;󱄛\u0026#34; [username] show_always = true style_user = \u0026#34;bg:arrow fg:crust\u0026#34; format = \u0026#39;[ Rei]($style)\u0026#39; [directory] format = \u0026#34;[$path](bold $style)\u0026#34; truncation_length = 0 truncation_symbol = \u0026#34;…/\u0026#34; style = \u0026#34;fg:directory\u0026#34; read_only = \u0026#34;  \u0026#34; read_only_style = \u0026#34;fg:directory\u0026#34; [git_branch] disabled = false format = \u0026#34;[$symbol$branch]($style) \u0026#34; style = \u0026#34;bold fg:git\u0026#34; symbol = \u0026#34; \u0026#34; [git_status] style = \u0026#34;fg:git_status\u0026#34; format = \u0026#39;[[($all_status$ahead_behind )](fg:git_status)]($style)\u0026#39; disabled = false # 禁用不需要的模块 [character] disabled = true [time] disabled = true [fill] disabled = true [cmd_duration] disabled = true [python] disabled = true [conda] disabled = true [nodejs] disabled = true [c] disabled = true [rust] disabled = true [java] disabled = true [package] disabled = true [docker_context] disabled = true 同时，在init.lua针对修改如下：\n1 2 3 require(\u0026#34;starship\u0026#34;):setup({ config_file = \u0026#34;~/.config/yazi/straship_yazi.toml\u0026#34;, }) ","date":"2026-05-07T12:58:52+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2026-05-07Yazi/Yazi-Cover.jpg","permalink":"https://blog.christinaxy.top/post/yazi/","title":"Yazi Configuration"},{"content":"序 第一季度 Timeline 2026-01-01\n元旦南京行~\n在一家烧烤店看到的黄金迪迦，太带派了！！！\n2026-01-03\nWTF，老美1小时22分速通委内瑞拉，把总统马杜罗及其夫人活捉回美国？！什么东西？有点太扯淡了，开玩笑的说，比T1速通TES还快四分钟，简直是奇耻大辱。。。这总统身边敢情全是奸臣啊，悲⊙﹏⊙∥\n联合国越来越像个笑话了，呵呵。\n2026-01-08\n2026年第一次出差 —\u0026gt; 北京\n2026-01-16\n芙莉莲第二季开播啦！！！！\n2026-01-19\n西安终于下了场大雪了，^_^。\n2026-01-25\n爱情怎么翻译? Rating: ★★★ 挺甜的，不能算工业糖精，但是最后几集节奏太奇怪了 Tv 2026-01-27\n2026年第二次出差 —\u0026gt; 北京\n2026-02-19\n镖人：风起大漠 Rating: ★★ WTF，太特么烂了，我居然能在2026年还能看到这种台词：“我是莫家的阿育娅，我就是大沙暴！”，这部剧的逻辑我感觉就是稀碎\u0026#43;稀烂，头号通缉犯\u0026#43;一代大儒居然喊着“知世郎要坐马车，知世郎要坐马车”，群像稀碎，懒得吐槽。 Movie 2026-02-20\n请回答1988 Rating: ★★★★★ 该如何去形容看完这部剧的心情呢？开心、感动、难过、不舍，五味杂陈，就像失去了一群特别要好的朋友，怅然若失，好久没有如此强烈的戒断反应了，这部剧比《苦尽柑来遇到你》后劲更大，这种笑中带泪的观看体验真的太犯规了，结尾伴随着德善的旁白，一帧一帧闪过的回忆，倒放的镜头，真的很感慨，像是在和双门洞的老朋友告别，没有人会不喜欢双门洞4个家庭的友谊，也没有人会不喜欢1988年双门洞的锦瑟年华，再见双门洞≧﹏≦ Tv 2026-02-28\n美以攻打伊朗？伊朗solo高难度副本？！哈梅内伊居然安然无恙！！\n2026-03-01\n一觉醒来，哈梅内伊遇害了，悲{{{(\u0026gt;_\u0026lt;)}}}\n2026-03-15\n最近宝宝来西安玩了，提前帮我过个生日，又犯错了，让宝宝不开心了{{{(\u0026gt;_\u0026lt;)}}}\n2026-03-16\n海岸村恰恰恰 Rating: ★★★★ 洪班长！红豆汁！ Tv 2026-03-29\n最近有点焦虑，也有点不安，或者说没动力，持续好久了，也不知道怎么解决，常常一个人发呆，时间也在指缝中逐渐溜走，也不知道怎么解决，脑袋里装了很多没用的东西，正儿八经该做的却一直没有什么进度，也常常怀疑自己是否真的能做成，马上也要4月了，这种状态肯定不能带到4月，最近在和宝宝看《机智的医生生活》，政源对颂和说了这样句话：”人生就得想做就做，这样才不会生病“，颂和也说了句类似的话：”你最近为你自己做了什么？我买了个柴火架，买它的时候特别幸福。“感觉我也需要在这几天彻底清空一下自己的脑袋，好好提升一下自己的幸福感才行。\n2026-04-06\n2026年第 3 次出差 —\u0026gt; 北京，还是清明节假期出差。\n2026-04-19\n屮，我真的服了，今天重新调整新的服务器，发现Edge一直同步不了，然后我才发现之前的4.15的工作区不见了，然后主工作站的一系列设置在退出登陆后通通不见了，一个大大的6，不管了，我直接转战Chrome，太恶心人了，以后尝试摸索Chrome，气死我了ヽ（≧□≦）ノ\n2026-04-20\n决定彻底弃用Edge，转投Chrome，Chrome的密码同步不是即时的，跨设备之间不能完全一致，于是改成了Vaultwarden，再利用Nginx反代，工作区的快捷键暂时还没发现，不过标签页可以即时进行，打算用这个代替Edge的工作区功能，目前唯一的不爽是腾讯云的域名免费证书只能支持90天，目前先这么使用，后续7.20到期的时候，再试着用“ Let\u0026rsquo;s Encrypt + acme.sh”或者“Certimate”，自动部署SSL证书。\n2026-04-22\n这两天发现跨设备Chrome的书签、标签页组和扩展同步不及时，发现了这个解决办法:chrome://sync-internals/，开启代理后，点击Trigger GetUpdates就ok。\n2026-04-23\nemo，干什么都没干劲，感觉脑子转不起来，心情也一直不太好，我最近也感觉到我颓废的情绪有躯体化的趋势，╮(╯▽╰)╭ 导师说我是一个厉害的人，但我自己心里清楚这只是老师的一套说辞，我不是一个厉害的人，我什么都不是，宝宝最近也不太开心，说工资太少，挣不了大钱，我也不知道怎么安慰，“一定要挣大钱人生才有意义吗？” 我反问自己，也许吧，小时候想要成为厉害的大人，那什么才算是厉害的大人呢？小时候心里想的是“很有钱，想要什么就能买什么，能不让爸妈辛苦工作，幸福生活”，很遗憾的是我现在没有成为很有钱很厉害的大人，加油吧，✨，你要努力成为厉害的大人。\n2026-04-26\n终于补完牙了，就差一颗智齿了。刚补完的牙涨了一晚上了，＞﹏＜\n2026-04-27\nG！剔牙的时候昨天补的牙崩了\u0026hellip;..\n2026-04-28\n重新去补了牙，在排队的时候刷到了一个新的Agent，叫Proma，感觉挺有意思的，比Cherry Studio好看一看，作者也更新挺勤快的，这两个月先用这个试试，DeepSeek V4还打折持续到5月，先用它一个月！\n2026-05-09\n去拔智齿了，远中阻生智齿，crazy，一颗牙拔了接近40min，拔的一身汗。\n2026-05-10\n时隔470天，EDG终于再次拿下了VCTCN第一赛段的冠军，康哥的狙就是diao啊！Smoogy和Jieni一场Bo5玩了4个英雄，球球微风岛屿B包点两个一帧One Tap加上霓虹町11:12那分A2甩枪拿下拖入加时，曼谷球回来了~\n2026-05-12\n用Token替代Password，并尝试更改使用SSH链接。\n2026-05-23\n又一批师弟们毕业了，有点伤感啊，哎\u0026lt;(＿　＿)\u0026gt;\n2026-05-24\n加了好几天的班了，这项目也算要结束了吧\u0026hellip;.\n2026-05-30\n修改了ezbookkeeping的配置，目前的记账稍微合理一点了。\n2026-06-01\n长征12乙发射成功，sy的论文成功上天啦~ 2026-06-02\n终于把这颗牙补好了，剩下就是要等智齿的牙窝长好了再去戴个冠，估计要半年以后了，希望这半年不用再跑医院了。\n2026-06-08\n2026年第 4 次出差 —\u0026gt; 北京。\n2026-06-21\n哎，可惜了，还是倒在了三强，没能更进一步，康康，你会后悔自己没把握住对战Paper Rex裂变峡谷那一个又一个的机会吗？那可能是距离冠军最近的一次了，可惜时间是无法倒流的，真的太可惜了，不过从圣地亚哥被一脚踹飞到现在重新具备了竞争力，相信你们能在上海大师赛取得好成绩，加油！\n2026-06-23\n2026年第 5 次出差 —\u0026gt; 上海，真的看不懂，感觉甲方是纯甩手掌柜，问我要了一堆材料，结果呢？我看到提交的材料里只字未改，何意味啊？然后变动的JF也没提前和我们说，合着没看到就不打算告诉我们吗？\n2026-06-30\n中期答辩顺利通过了～🎉\n2026-07-05\n骑行复健！\n2026-07-10\n今天长十乙火箭🚀网系回收成功了！\n2026-07-10\n今天长十乙火箭🚀网系回收成功了！\n腾讯云的DNS抽风了？？\n","date":"2026-01-03T22:51:27+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Covers/Cover.png","permalink":"https://blog.christinaxy.top/post/2026/","title":"2026"},{"content":"序 又到了回望这一年的日子了，每每这时候都会感叹时间过得也太快了。2024年的年末，给自己总结的是：“垂直活着，水平留恋着”，那2025年的自己呢？我想比起24年稍微前进了一点吧，有的时候放下包袱人是会轻松一点的，回想起2024.12.31号，一个人在工位就着一瓶百威，看着老克的直播跨年，今年身边有人陪伴着跨年，突然觉得生活其实也没那么糟糕，感谢宝宝，当然也感谢张女士，oh，也得感谢『芒果千层』，25年年度Goat还得是anno大笨蛋吧，让我想起了22年追着花瓶看双人成行的日子，生活需要一个调味剂，『芒果千层』就是25年的生活调味剂。\n26年，还需要努力啊，于生活，要健康作息、捡起相机好好拍照；于学业，要好好工作、早发论文；于感情，要珍惜家人、好好呵护，希望在2026年12月31日，回看这则博客的时候，能笑着比个yeah。\nTimeline 2025-01-19\n博客建立，初具人形，开始了一系列的装修。 2025-02-21\n方大同走了。＞︿＜ 2025-02-22\n你的颜色 Rating: ⭐⭐⭐ 山田尚子：“这部作品刻画了那些正准备开始，或已经迈出重要第一步的人的故事，我相信很多人都能共鸣，另外这部作品的live演出也很帅气，希望大家都能去电影院体验。”不讨喜的青春纪录片? 还算比较喜欢 Movie 2025-03-09\n《双影奇境》通关！真好玩吧！ 2025-03-23\n和宝宝第一次认识。\n2025-03-30\n芒果千层梦开始的地方。真怀念了，想起了以前看花瓶的日子，花瓶BE了，芒果千层是HE！！可惜热奶作死，不然我想看5FW完整版。 2025-03-31\nBangDream Ave Mujica Rating: ⭐ 年度最炒作烂番，狗屁不通的逻辑，恶心人的剧情，看破防了！WSD，RNM，退钱！！！避雷啊！！！ Anime 2025-04-04\nGundam GQuuuuuuX Rating: ⭐⭐⭐⭐ 前传的性质，机设我真的不太喜，而且影院效果很一般，观看体验不好，看在骡子和夏亚的份上，勉强好评吧。 Movie 2025-04-10\n年度Goat的视频 2025-04-11\n金牌得主 Rating: ⭐⭐⭐⭐⭐ 经费用在刀刃上的典型！！太好看了！！ Anime 2025-04-13\n北京-徐州出差，哇，北京风是真的大，纪念一下第一次钻地下的矿洞（失联3小时）。 2025-05-01\n和宝宝第一次武汉线下见面，有点紧张。也是第一次来武汉旅游，陌生的城市，陌生的环境，如果当年我来武汉读书，现在又会是在哪里呢？ 2025-05-24\n和宝宝在一起啦！ヾ(≧▽≦*)o\n2025-05-30\n苦尽柑来遇见你 Rating: ⭐⭐⭐⭐⭐ 陪伴是最长情的告白，梁宽植和吴爱纯好甜啊，第一次看韩剧，看的泪目。美好的爱情让人羡慕，也要让我学会珍惜爱护身边最大的麦穗。 Tv 2025-06-12\n豺狼的日子 Rating: ⭐⭐⭐⭐ 谁不喜欢冷酷优雅的杀手呢？ Tv 2025-07-08\n宝宝来西安过生日，( •̀ ω •́ )✧。 2025-07-30\nJKW没日没夜得干，特么被卡二辩，我真的谢谢您，吃了么您！！！(╬▔皿▔)╯ 2025-08-02\n来杭州找宝宝玩，待了10天，要戒断了，好想这么无忧无虑得过日子。 扫赌风暴 Rating: ⭐⭐⭐⭐ 好久没看国产电视剧了，好喜欢看刑侦剧，每次一看就停不下来了，向缉毒警察致敬！ Tv 2025-09-03\n93阅兵！OMG！！ 2025-10-07\n国庆又来杭州找宝宝玩，又要戒断了 奇遇 Rating: ⭐⭐⭐ 哈哈哈哈，死神来了看不下去，还是得看搞笑片。 Movie 2025-11-04\nJKW这破项目可算是通过了。 2025-11-05\n福建舰入列！芜湖！电磁弹射航母来啦！！ 2025-11-27\n矿大这破项目可算是验收了。 2025-12-17\n我真服了矿大的人啊，验收会上通过了跟我说把签过字的技术报告给改了？？？？666！ 2025-12-06\n疯狂动物城2 Rating: ⭐⭐⭐ 买错票了，买成中配了。。。实在想吐槽，宝伯特的声音不像是在同一个录音室录出来的。。。 Movie 2025-12-07\n鬼灭之刃：无限城篇 第一章 猗窝座再袭 Rating: ⭐⭐⭐⭐⭐ 谁会不喜欢大制作呢？！UFO一贯的高制作，我可算看到飞碟社做的火雷神了！ Movie 结 没想到2025年的尾声是在飞机上度过的，hhhh，何尝不是年年岁岁花相似呢。\nUpdate On MU851 2025.12.31 23:24\n2025 End\n","date":"2025-12-23T16:27:51+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Covers/2025.png","permalink":"https://blog.christinaxy.top/post/2025/","title":"2025"},{"content":" 序 最近几天因为导师给的ThinkPad X1 Carbon实在是一言难尽（但是不得不说X1 Carbon是真的精致，碳纤维总成，合格的接口，4K的屏幕，长键程，但是里子真的用的难受，16G的内存配合win11实在是不够用，稍微跑点程序，风扇就呼呼起飞，边缘烫的一，真的难为它这个单风扇单热管了。）还是忍不住换了个新机子，之前用的YOGA玻璃覆盖的A面真的很喜欢，于是在小黄鱼上3900同城买了个YOGA Air 14s 2023，也算是新老交替了，开一篇文记录一下新机子到手的一系列配置，maybe若干年后换新笔电也能做个参考。\n基本配置 系统目前来说win11 24H2专业版已经使用习惯了，已经回不去win10咧，到手激活后把能更新的驱动都更新完毕，然后直接关闭更新：\n进入系统注册表，找到以下路径：HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings，新建DWORDFlightSettingsMaxPauseDays = 10000\n系统组件中安装WMIC组件\n软件配置 具体清单如下：\n软件安装清单 类别 软件名称 备注 办公 office Visio 软件环境 Anaconda Git NodeJs PowerShell7 oh-my-posh配置 Zerotier 添加moon节点 Latex VsCode 配置settings.json 日常生活 微信 百度网盘 腾讯会议 Claunch Everything LocalSend 更改端口+防火墙设置 Mihomo Party Moonlight OBS OneCommander Potpalyer Snipaste TranslucentTB 笔记学习 Obsidian Notion IDE Vs Code Matlab XShell Anaconda配置 在 清华源镜像地址 下载对应系统版本的镜像（Anaconda3-2025.12-1-Windows-x86_64.exe），正常安装即可。\n在系统变量Path里面添加一下内容：\n1 2 3 4 5 C:\\Software\\Anaconda C:\\Software\\Anaconda\\Scripts C:\\Software\\Anaconda\\Library\\bin C:\\Software\\Anaconda\\Library\\usr\\bin C:\\Software\\Anaconda\\Library\\mingw-w64 额外配置一下 Anaconda 仓库与第三方源，参考 清华源使用方法 ：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # create .condarc conda config --set show_channel_urls yes # Add config below channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud Anaconda基本配置结束，包管理和包缓存默认在C盘不做啥改动（( •̀ .̫ •́ )✧），附一些conda的指令。\n1 2 3 4 5 6 7 8 9 10 11 conda info conda create -n env_name python=3.xx conda env list conda activate env_name conda remove --name env_name --all conda remove --name env_name package_name conda list conda install package_name Git配置 Git下载网址，下载对应系统版本的安装包，默认安装即可（其中默认分支的名字个人这边习惯用main，其他不做修改）。\n安装完成，添加以下配置信息：\n1 2 3 4 5 6 7 git config --global user.name \u0026#34;Your Name\u0026#34; git config --global user.email \u0026#34;email@example.com git config --global http.proxy \u0026#39;http://127.0.0.1:7890\u0026#39; git config --global https.proxy \u0026#39;https://127.0.0.1:7890\u0026#39; git config list Node.js配置 PowerShell美化 有几次安装出现过oh-my-posh源文件不在正常路径，这边保险起见在Microsoft Store中安装PowerShell和oh-my-posh。 安装Nerd Fonts，这里我选的是ComicShannsMono Nerd Font和JetBrainsMono Nerd Font Mono。\n1 git clone https://github.com/ryanoasis/nerd-fonts.git 接下来配置oh-my-posh主题，所带的主题非常多，可以浏览这个网址： oh-my-posh主题 进行选择，主题所在的位置：C:\\Users\\用户名\\AppData\\Local\\Programs\\oh-my-posh\\themes\\。确定主题之后，需要对主题的配置文件进行修改，因为大部分主题默认设置下会不显示所在的conda环境，比较不方便，我这边借鉴的是armo主题，并进行了一些自定义修改。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 { \u0026#34;$schema\u0026#34;: \u0026#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json\u0026#34;, \u0026#34;blocks\u0026#34;: [ { \u0026#34;alignment\u0026#34;: \u0026#34;left\u0026#34;, \u0026#34;segments\u0026#34;: [ { \u0026#34;foreground\u0026#34;: \u0026#34;#45F1C2\u0026#34;, \u0026#34;style\u0026#34;: \u0026#34;plain\u0026#34;, \u0026#34;template\u0026#34;: \u0026#34;\\ueb99 {{ .UserName }} on\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;session\u0026#34; }, { \u0026#34;foreground\u0026#34;: \u0026#34;#0CA0D8\u0026#34;, \u0026#34;properties\u0026#34;: { \u0026#34;folder_separator_icon\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;style\u0026#34;: \u0026#34;full\u0026#34; }, \u0026#34;style\u0026#34;: \u0026#34;plain\u0026#34;, \u0026#34;template\u0026#34;: \u0026#34; \\uf07b {{ .Path }} \u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;path\u0026#34; }, { \u0026#34;foreground\u0026#34;: \u0026#34;#14A5AE\u0026#34;, \u0026#34;foreground_templates\u0026#34;: [ \u0026#34;{{ if or (.Working.Changed) (.Staging.Changed) }}#FF8899{{ end }}\u0026#34;, \u0026#34;{{ if gt .Behind 0 }}#FF4500{{ end }}\u0026#34;, \u0026#34;{{ if gt .Ahead 0 }}#61C3E6{{ end }}\u0026#34; ], \u0026#34;powerline_symbol\u0026#34;: \u0026#34;\\ue0b0\u0026#34;, \u0026#34;properties\u0026#34;: { \u0026#34;fetch_status\u0026#34;: true, \u0026#34;fetch_upstream_icon\u0026#34;: true }, \u0026#34;style\u0026#34;: \u0026#34;plain\u0026#34;, \u0026#34;template\u0026#34;: \u0026#34;{{ .UpstreamIcon }}{{ .HEAD }}{{ if .Working.Changed }} o((\u0026gt;w\u0026lt;))o{{ end }}{{ if .Staging.Changed }} (・w・){{ end }}{{ if gt .Ahead 0 }} ヾ(•w•`)o{{ end }}{{ if and (not .Working.Changed) (not .Staging.Changed) (eq .Ahead 0) }} (*^_^*){{ end }}{{ if gt .StashCount 0 }} \\ueb4b {{ .StashCount }}{{ end }} \u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;git\u0026#34; } ], \u0026#34;type\u0026#34;: \u0026#34;prompt\u0026#34; }, { \u0026#34;alignment\u0026#34;: \u0026#34;left\u0026#34;, \u0026#34;newline\u0026#34;: true, \u0026#34;segments\u0026#34;: [ { \u0026#34;foreground\u0026#34;: \u0026#34;#cd5e42\u0026#34;, \u0026#34;style\u0026#34;: \u0026#34;plain\u0026#34;, \u0026#34;template\u0026#34;: \u0026#34;\\ue3bf \u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;root\u0026#34; }, { \u0026#34;foreground\u0026#34;: \u0026#34;#CD4277\u0026#34;, \u0026#34;style\u0026#34;: \u0026#34;plain\u0026#34;, \u0026#34;template\u0026#34;: \u0026#34;# \u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;text\u0026#34; } ], \u0026#34;type\u0026#34;: \u0026#34;prompt\u0026#34; } ], \u0026#34;version\u0026#34;: 3 } 下面配置PowerShell的使用设置。\n1 2 3 4 5 6 7 # 安装scoop（包管理也可以用winget） iwr -useb get.scoop.sh | iex scoop bucket add extras scoop install terminal-icons # winget安装模块 Install-Module -Name Terminal-Icons -Repository PSGallery 这一块补全一下Microsoft.PowerShell_profile.ps1的设置流程\n1 2 # 打开配置文件 notepad $PROFILE 如果配置文件不存在，则根据记事本提示创建新文件，默认位置在：C:\\Users\\用户名\\Documents\\PowerShell\\Microsoft.PowerShell_profile.ps1。\n下面是PowerShell配置文件内容：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 选择自己想要的主题文件 oh-my-posh init pwsh --config \u0026#34;$env:POSH_THEMES_PATH\\xy.omp.json\u0026#34; | Invoke-Expression # 使用 Terminal-Icons Import-Module Terminal-Icons cls # 简单的 Conda 延迟加载 function Invoke-CondaInit { if (-not $script:CondaAlreadyInitialized) { Write-Host \u0026#34;正在初始化 Conda...\u0026#34; -ForegroundColor Yellow If (Test-Path \u0026#34;C:\\Software\\Anaconda\\Scripts\\conda.exe\u0026#34;) { (\u0026amp; \u0026#34;C:\\Software\\Anaconda\\Scripts\\conda.exe\u0026#34; \u0026#34;shell.powershell\u0026#34; \u0026#34;hook\u0026#34;) | Out-String | Where-Object {$_} | Invoke-Expression } $script:CondaAlreadyInitialized = $true } } # 只有在使用 conda 相关命令时才初始化 Set-Alias -Name conda -Value conda-wrapper function conda-wrapper { Invoke-CondaInit conda @args } 配置好PowerShell7后再配置系统自带的终端，让其默认以PowerShell打开。\n终端中的PowerShell外观配置：配色方案Ottosson，字体JetBrainsMono Nerd Font Mono，不透明度70%。\nVsCode中同样配置好终端字体：\u0026lsquo;设置\u0026rsquo;—\u0026gt;\u0026lsquo;Terminal Intergarted Font Family\u0026rsquo;—\u0026gt;\u0026quot;\u0026lsquo;ComicShannsMono Nerd Font\u0026rsquo;, \u0026lsquo;JetBrainsMono Nerd Font Mono\u0026rsquo;\u0026quot;\n一些好用的软件 Raycast 今天在北京出差，偶然间刷到了一个关于Raycast的视频，现在进行windows的内测，感觉挺有意思的，想到了之前用Listary的时候，Listary使用的时候有一个很难受的问题是会自动建立U盘的索引，一旦U盘文件多了以后就会，很长时间内就无法弹出U盘，虽然可以设置Listary不建立索引，但是偶尔偶尔也会产生bug，比较奇葩。Raycast原先是适配MacOs的，之前用Mac的时候command+Q直接进行搜索确实方便，现在有了Raycast直接Alt+Space能做到类似的效果，比较喜欢，开一节记录一下使用感受ヾ(•ω•`)o\n结 基本配置结束，好麻烦啊，要是能一键记忆系统配置就好了＞︿＜。\n2025.12.18 22:03 Update.\n","date":"2025-12-15T16:18:45+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2025-12-15InitializePC/Cover.png","permalink":"https://blog.christinaxy.top/post/initializepc/","title":"新机初始化配置"},{"content":" 序 之前的一个Nas用之前实验室的一台老机子改装的，硬盘位有限而且用的也是老硬盘，加上散热奇差，夏天一到，风扇的声音简直闹心，而且最重要的一点是，这个机子的所有权不是我自己hhh，所以年中的时候搭建了自己的一个DIY Nas，配置单如下：\n硬件 型号/参数 主板 云星B365 ITX CPU 8100T 内存 DDR4 16G 散热 AN400 电源 康舒250W 机箱 优易UE-S6六盘位 硬盘 希捷酷鹰ST4000VX015 4Tx2 内存和散热用的都是之前剩下的，硬盘害，现在涨的这么厉害，早知道多买几块了，不过也是存点电影什么的，8T组Raid0毕业前肯定够用了，系统是飞牛Os，整套下来算上硬盘大约2200块，个人感觉还行，主流的编解码都支持，目前几个月用下来，非常安静。\n内网穿透 飞牛自带的内网穿透2M不太够用，也不是很想花钱，加上学校的小水管网络，买了100M的套餐，下行大约80M，上行30M，有的时候还不太稳定，就拿自己的Vps做了zerotier的内网穿透。详情见Zerotier内网穿透\n虚拟机 安装win11虚拟机（4核心的i3和16GB内存现在用起来发现有点捉襟见肘，但还是能用），使用几个小任务bilidown和抢票软件bypass。实在是太卡了，用起来太膈应了。。\nDocker服务 ezbookkeeping 之前记账用了好多软件，但是都感觉不太好用，多设备也不好同步，还要钱，之后换了notion用了个大半年，但是notion有个问题，服务器响应有点慢，这些数据都不在本地，还是有点担心，最近看到了这个开源的docker服务，就想着个部署一下在nas上，自己也能随时随地访问，正好也拿来练习一下docker。\n先在飞牛的Docker的存储池中新建一个文件夹ezbookkepping，在此目录下创建三个文件夹：data、log和storage，并创建docker-compose文件，docker-compose里内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 services: ezbookkeeping: # EzBookkeeping 服务，用于记账应用 image: mayswind/ezbookkeeping # 使用 mayswind/ezbookkeeping 镜像 container_name: ezbookkeeping # 容器名称为 ezbookkeeping restart: always # 容器总是重启 ports: - 3080:8080 # 将容器的 8080 端口映射到主机的 3080 端口 volumes: - /etc/localtime:/etc/localtime:ro # 将主机的本地时间同步到容器 - ./storage:/ezbookkeeping/storage # 持久化存储到主机的 ./storage 文件夹 - ./log:/ezbookkeeping/log # 持久化日志到主机的 ./log 文件夹 environment: - EBK_DATABASE_TYPE=mysql # 数据库类型为 MySQL - EBK_DATABASE_HOST=mysql:3306 # 数据库主机为 mysql 服务，端口为 3306 - EBK_DATABASE_NAME=ezbookkeeping # 数据库名称为 ezbookkeeping - EBK_DATABASE_USER=ezbookkeeping # 数据库用户名为 ezbookkeeping - EBK_DATABASE_PASSWD=ezbookkeeping # 数据库密码为 ezbookkeeping - EBK_LOG_MODE=file # 日志模式为文件 - EBK_SECURITY_SECRET_KEY=O0rxWj8gH8z2T9O79l8ndUczIHtUgV6bRY3CZfF0beE= #设置随机的安全密钥 - EBK_MCP_ENABLE_MCP=true # 启用 MCP 功能 depends_on: - mysql # 在 mysql 服务启动后再启动 ezbookkeeping 服务 mysql: # MySQL 服务，用于存储 EzBookkeeping 数据 image: mysql:8.0 # 使用官方的 MySQL 8.0 镜像 container_name: ezbookkeeping-mysql # 容器名称为 ezbookkeeping-mysql restart: always # 容器总是重启 volumes: - ./data:/var/lib/mysql # 将主机的 ./data 文件夹映射到容器的 /var/lib/mysql 目录，用于持久化数据库数据 environment: - MYSQL_DATABASE=ezbookkeeping # 默认数据库为 ezbookkeeping - MYSQL_USER=ezbookkeeping # 数据库用户名为 ezbookkeeping - MYSQL_PASSWORD=ezbookkeeping # 数据库密码为 ezbookkeeping - MYSQL_ROOT_PASSWORD=ezbookkeeping # MySQL 根密码为 ezbookkeeping healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;mysqladmin\u0026#34;, \u0026#34;ping\u0026#34;, \u0026#34;-p ezbookkeeping\u0026#34;] # 检查 MySQL 是否正常运行 retries: 3 # 如果健康检查失败，最多重试 3 次 timeout: 5s # 每次健康检查的超时时间为 5 秒 飞牛系统里文件夹的权限已经放开，可以直接运行，待构建完成后，启动容器即可，简单配置以后基本页面如下所示：\nezbookkeeping展示界面 目前使用下来，ezbookkeeping的使用体验还行，亟待后续反馈更新。\n2025.12.12 15:57 Update\n","date":"2025-12-11T17:15:56+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2025-12-11%E6%8A%98%E8%85%BE%E6%8A%98%E8%85%BENas/nas-cover.png","permalink":"https://blog.christinaxy.top/post/nas/","title":"折腾折腾Nas"},{"content":" 追Mujica的这三个月，是疯狂的三个月，特别是7话到11话的这疯狂四星期，让我破防，Mujica的人什么也没有塑造，还把我喜欢的Go团给毁了，为什么要欺负爱音？为什么要演奏春日影？为什么？！！！回答我！Look in my eyes！最后的13话live好看吗？好看啊，但是呢？四不像的饺子寿司会好吃吗？\n哎，完都完结了，现在能怎么样呢？WSD，你能重做吗？诶，不能，但我们有全新的第三季，真特么无语，就盯着MyGo这棵摇钱树使劲薅。\n火力半开的包头，骂是骂爽了，哎，这一季真的让人失望； 拉姐的这个系列我真的很喜欢，很推荐，也让Ob李云龙一世小姐带我忘却这一切吧。 说实话，我其实蛮喜欢这首歌，初见因为旋律和李神的数值，而且初华真的很戳我好球区啊，金发紫瞳，但这首歌的感情也过于深了，高潮处反反复复层层递进的情绪，透露着“I want you”、“I want you to know”和“I need you!”，加上这个歌名歌词和剧里编剧对uika拟人的塑造实在是……诶呀，还有那个经典的《超诗祥ver古风婉约版》流传啊，这首歌就让人听得有点不知所措，但还是每天在宿舍循环，BTW，我觉得这首歌饱含的情感不是什么香草歌就能一笔概括的，只是可惜🍅这个人安排的剧情塑造实在是有些……逆天了，在这个互联网讨论环境下想好好讨论这首歌也比较难，但不管你喜欢与不喜欢母鸡卡的剧情(不太可能喜欢吧)，这首歌的旋律你应该会喜欢吧，那就安静听一会，休息一下叭(｀・ω・´)\n我在23年夏天听春日影，在25年的春天听聿日笺秋，令人感慨。歌名是“一日千秋”的同音借字，“一日不见，如隔三秋”，“聿”为笔的本字，与“笺”一并象征着“写信”。13话的最后，灯大喊着“感谢大家的陪伴”也算是给闹腾的一集的观众一句道别吧。\n这歌我应该会好好学一下吧。\n聿日笺秋歌词 心写す言葉 把描绘心灵的话语 剥がして連れて行って 我将它揭下带走 分かれ道の先へ 向着岔路的两端 僕らは歩き出す 我们迈出了步伐 どうしたらいいのか 究竟该怎么办呢 巡らせてる間に 在犹豫烦恼之间 季節も変わるよ 季节也悄然改变 僕もそうかな 我是否也一样呢 ゆらゆら　今日も曲がり角に立つ 摇摇晃晃的我 今天也立于转角 右左どっちも選べないまま 无论左还是右 我都做不出选择 ふらふらな僕の行方は分からない 晃晃悠悠的我 不知该去向何方 だけどちょっと先へ行く積もりさ 但是我一定会 稍微向前方进发 筋書きのない日々を生きてく僕らは 我们在无剧本的世界生活 慣れない感情に　狼狽たえてる 因陌生的感情而惊慌失措 傷ついても　もしまた　傷つけたとしても 无论受伤 抑或伤害过他人 僕のままで　ここにいたいから 我都想在此 努力坚持自我 自分のことも 明明我对自己 丸で分からないのに 都几乎一无所知 それでも君のこと 即使如此我也想 分かりたかったんだよ 尽可能去了解你 手の平に載せた 捧在手心之中的 便箋は温かい 信纸是多么温暖 君と手繋いでいるみたいで 仿佛和你手牵手 くらくらしては　瞼を閉じてさ 晕晕沉沉的我 不禁合起了双眼 巻き戻し昨日を映す度に 每当眼前浮现 倒带回到的昨天 ぽろぽろと今が零れ落ちるなら 倘若眼中泪水 于此刻簌簌而下 僕は目を開けて見つめなくちゃ 我必须睁开眼 定情注视它 もう戻らない　欠片を集めてみても 物是人非 即使收集碎片 二度と同じ瞬間に　帰れなくて 也无法重回同一个瞬间 足踏みして　進めずいると想ってたけど 本想原地踏步 不再前行 新しい風に吹かれてた 却有崭新的风吹拂着我 逸れた道が　もう一度この先でもしも交わるなら 分离的道路 若能在前方再次交汇 俯かず歌うよ　君を見つけたいから 我会昂首高歌 因为想找到你 日溜まりのように　笑ってて欲しくて　ああ 愿你笑容灿烂 如阳光般温暖 啊啊 僕らにしか迷えないたった今を 此刻唯有我们迷失方向 忘れたくないから　歌っている 我不愿忘记而放声歌唱 優しい君が君のままでいられるように 愿温柔的你能够坚持自我 この声に込めた 倾注于这歌声中 筋書きのない日々を生きてく僕らは 我们在无剧本的世界生活 絶えない不安の中を踏み出してく 在无尽的不安里迈步前行 傷ついても　もしまた　傷つけたとしても 无论受伤 抑或伤害过他人 僕はここで　歌っているから 我都会在此 继续放声歌唱 2025-04-07 02:17 Monday\n\u0026emsp;\u0026emsp;偶然间重新听到了《枝江》这首歌，令人感慨，突然意识到看A-Soul已经是21年，快4年过去了，好久好久没有这么激动得去追番了，就跟本科的时候开始看A，看VTB那时候一样； 从某种意义上，MyGo或者说Crychic就像是510之前的A-Soul，大喵爆完了之后的Mujica像是后来的A-Soul，这可能也是为什么我对大喵喜欢不来的缘由吧\u0026hellip;再看《诗超绊》，突然一下子鸡皮疙瘩起来了，被征服了，也突然明白Soyo那句“我什么都会做的。”\n「执着于过去的人真的很难看，但是铭记过去再走下去的人是值得尊重的。」你懂吗？柿本广大！\n2025-04-07 16:04 Monday\n\u0026emsp;\u0026emsp;看了泛式的吐槽，听到一句「最终话的演唱会堪称最好的精神损失费」，我一下子好像就释怀了，「脸和数值」这两点在Mujica上简直太对了，睦、初华、海玲都是邦邦世界里的美少女，李神的数值让我真的很难不喜欢Ave Mujica里的歌，特别是最后的《天球のmusica》，最后的和声、金色的雨、各种的运镜加上情绪的渲染等等，简直就是妥妥的赛博孟婆汤，让人忘记前12话的各种史，所以啊，Ave Mujica本可以更好的，也才会让人这么的破防。 放张初华的演出照，无关剧情，真的很好看啊\n「循此苦旅 终抵繁星」 再见了 所有的Ave Mujica 来点MyGO!!!!!应援色吧 #3388BB 来点Ave Mujica应援色吧 #881144 Tomorin #77BBDD 三角初华 #BB9955 Anno #FF8899 若叶睦 #779977 Rana #77DD77 八幡海铃 #335566 Soyo #FFDD88 祐天寺若麦 #AA4477 Taki #7777AA 丰川祥子 #7799CC ","date":"2025-03-31T11:19:29+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2025-03-ave-mujica/2025.03.31AveMujicaCover.jpg","permalink":"https://blog.christinaxy.top/post/anime-mujica/","title":"Ave Mujica"},{"content":"序 最初打算用公网服务器+Frp来实现内网穿透，这是稳定的方案，但使用下来会有几个问题。\nmstsc走公网ip+端口号的方式，在我理解里是三根水管相连，数据要通过云服务器上传，不只是端口映射，木桶效应在于云服务器的带宽限制(2~3M过于卡顿). Frp会一直扫公网ip的端口号，尽管可以添加SSL，但是远程桌面走的是tcp服务，stcp不能成功打开udp的远程桌面，也可能是我没配置正确，暂时还在寻找原因. 宿舍用moonlight串流工位电脑，用zerotier会比较方便和管理. 之前不喜欢zerotier的原因是因为planet的服务器在国外，用户多的时候会打洞失败，而且延迟巨高！遇到过好几次了，但是现在我有了国内的云服务器，可以自行添加moon节点，P2P打洞，这样的话就是木桶效应是工位网络的上行带宽。\n服务器配置Zerotier+Moon 安装zerotier 1 2 3 4 5 6 7 8 9 10 11 12 # Linux 下载安装 curl -s https://install.zerotier.com/ | sudo bash # 验证安装情况 zerotier-cli info # 启动并设置开机自启动 systemctl start zerotier-one.service systemctl enable zerotier-one.service # 加入到个人的虚拟局域网 zerotier-cli join Network-ID 安装成功后显示的信息:200 info 39a50xxxxx 1.14.2 ONLINE，其中39a50xxxxx为该设备的zerotier-id，1.14.2是zerotier的版本号。\n配置moon 1 2 3 4 5 # 进入配置目录 cd /var/lib/zerotier-one # 生成初始配置。读取 identity.public 中的公钥信息，生成初始的 moon 节点配置的 JSON 文件: zerotier-idtool initmoon identity.public \u0026gt; moon.json moon.json包含了设备的id信息等等，同时需要额外配置ip地址和节点信息，在stableEndpoints一栏添加公网ip和端口号(默认是9993)，注意格式问题Ipv4 Addr/9993以及在云服务器放开9993端口(udp协议)。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \u0026#34;id\u0026#34;: \u0026#34;39a50xxxxx\u0026#34;, \u0026#34;objtype\u0026#34;: \u0026#34;world\u0026#34;, \u0026#34;roots\u0026#34;: [ { \u0026#34;identity\u0026#34;: \u0026#34;39a50xxxxx:0:90bc7bf3e1d39a2df373f3fcfc5fc103c6b333226f0949d47906b1c613ff6441850ad3217184277b5b65e381b59289d17561978393fd77ee5ff9d36c37xxxxx\u0026#34;, \u0026#34;stableEndpoints\u0026#34;: [\u0026#34;Ipv4 Addr/9993\u0026#34;] } ], \u0026#34;signingKey\u0026#34;: \u0026#34;883bbd62ba065db9879c6bad1ba874b567ff8f7d25349e811669270c0dcb7e4e2989e02cc2ebc6681da2f5b9b7037c3c66a68eb5b6843d5067e4db3c1dxxxxx\u0026#34;, \u0026#34;signingKey_SECRET\u0026#34;: \u0026#34;4a72efbf7da50602ba01e413588badb9294a64f27bdc600c297f2e591d7b437ac856cfa4ded3e5478fb914054df5d96ef2ed4ce667e5603669f4c7799e1xxxxx\u0026#34;, \u0026#34;updatesMustBeSignedBy\u0026#34;: \u0026#34;883bbd62ba065db9879c6bad1ba874b567ff8f7d25349e811669270c0dcb7e4e2989e02cc2ebc6681da2f5b9b7037c3c66a68eb5b6843d5067e4db3c1ddxxxxx\u0026#34;, \u0026#34;worldType\u0026#34;: \u0026#34;moon\u0026#34; } 配置完毕，保存并退出，最后基于moon.json文件生成最终的moon配置文件:\n1 2 3 4 5 6 7 8 9 10 11 # 新建文件夹，方便管理 mkdir moons.d # 生成最终配置文件。基于 moon.json 配置文件，生成最终的 moon 配置文件（通常命名为 000000xxxx.moon）： zerotier-idtool genmoon moon.json # 移动moon配置文件 mv 00000039a50xxxx.moon moons.d/ # 重启服务 systemctl restart zerotier-one 最终会生成带zerotier-id的moon配置文件，文件名就是moon-id，在老版本是16位的，新版本(1.12.2ver后)都是10位的，即不含前面的6个数字0;\n000000xxxx.moon是个二进制文件，不可读，而且带加密签名，将这个文件下载到服务端电脑上。\n客户端添加moon Windows环境 以我的PC为例，Christina - win1123H2 - Zerotier 1.14.2 \u0026amp; moon的配置文件\n进入zerotier的配置路径，默认是C:\\ProgramData\\ZeroTier\\One，新建一个moons.d文件夹并将000000xxxx.moon文件放置其中(需要管理员权限)，在services.msc中重启zerotier服务。\n以管理员身份启动powershell:\n1 2 3 4 cd C:\\ProgramData\\ZeroTier\\One # 检查路由 zerotier-cli listpeers listpeers可以看到虚拟局域网下的各个节点信息和连接情况：\n1 2 3 4 5 6 7 8 200 listpeers \u0026lt;ztaddr\u0026gt; \u0026lt;path\u0026gt; \u0026lt;latency\u0026gt; \u0026lt;version\u0026gt; \u0026lt;role\u0026gt; 200 listpeers 39a50xxxxx 1.95.xxxxxx/9993;2904;2808 96 1.14.2 MOON 200 listpeers 778cdxxxxx - -1 - PLANET 200 listpeers bbd67xxxxx 192.168.5.8/22591;2906;2896 9 1.14.0 LEAF 200 listpeers cafe0xxxxx - -1 - PLANET 200 listpeers cafe8xxxxx - -1 - PLANET 200 listpeers cafefxxxxx - -1 - PLANET 200 listpeers d2f9cxxxxxb 192.168.5.5/9993;8190;8184 5 1.14.2 LEAF 其中，\u0026lt;ztaddr\u0026gt;代表zerotier-id，\u0026lt;path\u0026gt;代表路由，\u0026lt;latency\u0026gt;代表延迟，\u0026lt;role\u0026gt;代表节点的身份信息\nPLANET就是zerotier官方的中转节点，-1基本上就是官方的节点挂了\u0026hellip;. MOON是自建的zerotier的节点，延迟96ms LEAF是虚拟局域网的各个设备节点 一些额外的指令：\n1 2 3 4 5 # 加入moon节点 zerotier-cli orbit \u0026lt;moon-id\u0026gt; \u0026lt;moon-id\u0026gt; # 取消加入moon节点 zerotier-cli deorbit \u0026lt;moon-id\u0026gt; Linux环境 跟windows环境部署类似，以我自己的Nas举例，飞牛nas的底层是debian，通过xshell或者直接在飞牛的终端里进行操作\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 进入root管理 sudo -i # 安装zerotier curl -s https://install.zerotier.com/ | sudo bash # 切换到zerotier路径 cd /var/lib/zerotier-one # 启动zerotier systemctl start zerotier-one.service # 查询状态 zerotier-cli status # 成功挂起后，加入zerotier局域网并添加moon节点 zerotier-cli join \u0026lt;network-id\u0026gt; zerotier-cli orbit \u0026lt;\u0026gt; \u0026lt;\u0026gt; # 重启服务 systemctl restart zerotier-one.service # 启动并设置开机自启动 systemctl enable zerotier-one.service # 查询节点状态 zerotier-cli listpeers 结 这样基本就配置成功了，走虚拟路由也方便异地串流；\nDone\n2025.12.11 14:39 Update\n","date":"2025-02-27T16:38:38+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Articles/2025-02-07Zerotier/%E5%8D%9A%E5%AE%A2%E5%B0%81%E9%9D%A2Cover.png","permalink":"https://blog.christinaxy.top/post/zerotier-moon/","title":"内网穿透-异地组网"},{"content":" 观影插曲 看这部电影的时候发生了一个插曲，影片放映到1/3的时候，影厅的放映机坏了，被迫中止然后换到下一个片场继续看，挺神奇的，这是我长这么大头一次碰到这样的事。 观影后的碎碎念 画面的色彩我很喜欢，高明度，低饱和，亮色调，色彩观感上很舒服。\n但是故事性呢?我觉得用淡水文艺片去形容吧，整部片子给我的感觉是很平淡的，没有什么叙述，淡如水，就像是日记本里稀松平常的一页。\n开头的旁白窦子说的那句\u0026quot;我是什么颜色呢?\u0026quot;，再到最后结尾窦子再花园里起舞，望向蓝天出现的那一抹淡红回答了这个问题外，就几乎没什么故事性了。作永君为什么退学我也不明白，也许是女校的教育？\n很文艺的一部片，很多情绪是难以表述的，只能用色彩去形容，我感觉票房不会很高，能排片期过了不知道能到多少。\n看完之后再来回头回味一下，又好像能抓住点什么了，我很羡慕少年时代的友谊，我时常想对于别人我可能就是个可有可无的存在，所以我看到路易给妈妈打电话说晚上不回去了，要陪窦子和君过夜，最后补了一句\u0026quot;我交到朋友了\u0026quot;，还是有那么点感触的。但是抛开这一层，我感觉窦子和君还是相当的单纯啊，就这么相信路易了，但也从侧面说明了三人间的友谊是可贵的吧。\n青春对于大多数人都是有遗憾的吧，窦子因为先天的因素，对世界的感受不同于常人，影片里也说到\u0026quot;怕被别人当成怪人\u0026quot;，小时候学芭蕾也没有坚持学下去；作永君这个角色是我不太能理解的，应该就是常见的乖乖女类型的角色，说是和哥哥一块被奶奶拉扯大，可能是不想走跟奶奶一样的道路吧，就辍学去玩音乐了；路易应该是子承祖业，平日里在岛上没有什么同龄玩伴，也是典型的乖儿子形象，最后也是选择面对现实，上大学，继承父业这种(剧里我看到有一个合照的特写，路易似乎有一个兄弟，我还以为会有什么别的展开，但没有)，还有其他几个配角，比如女校的日吉子老师，君的奶奶这些\u0026hellip;与常见的家庭矛盾不同，影片里的3位主角都是被爱包围的，窦子犯错回家的时候，妈妈没有责怪，反而会说\u0026quot;本来还会担心窦子晕大巴，修学旅行会不舒服\u0026quot;,走的时候也给窦子买了很多东西带回宿舍；君的奶奶得知君退学后也没有苛责君，相反我觉得奶奶应该很早就知道君不去上学了，有一处奶奶在上班时的特写，这一处的留白我觉得奶奶还是或多或少猜到了；路易的妈妈对待路易也是，没有传统的那种家庭冲突，各自的家庭也都支持他们，在最后庆典每个人都盛装出席。\n情绪流的电影是需要走进去的，最后干巴爹的呐喊，是小君含蓄的爱的表白，但是我旁别的几位没有进去而是觉得破音非常不解，\u0026ldquo;如果有一个人能坚定的选择我，那会让我一辈子都不会忘记的\u0026rdquo;。\n想来结尾有这样一句台词『接受无法改变的事情，尽力改变还能改变的事情』，应该是这么说的吧，这种类鸡汤的定型文居然能给我一定的触动还是让我觉得这场电影没白来，2月的自己相当的颓废，我不知道该干些什么，可能也是时候去迈出第一步了，NF型的人是不是都这么踌躇呢？就像绿皮书的\u0026quot;很多人都害怕迈出第一步\u0026quot;，我不知道我在害怕什么，我在担心什么，我在忧郁什么，我不知道我为什么心情不好，是太多东西想得到没得到，还是很多东西想实现却没能力实现呢？应该是都有吧，也许要收下心?当自己的能力托不起自己的欲望的时候，是要沉下心来好好学习，专心看书了。\n2025.02.24 23:41\nSome videos 看完后刷到了赫萝老师的投稿，从赫萝老师的角度也能看到许多当时观看时没有在意的点:\n小君鞋子特写的低机位镜头出现了很多次，当时没有在意，导演给出的解释是“有时候人们说出不合时宜的话，或者说出自己不是真心想说的话时，会有脚部、手部还有眼球的细微运动，这是把自己关在烦恼之中”，总之就是细节描写啦 日吉子老师有一段话『你已经是毕业生了，在你自己的时间里。』对一定人群这句话是个暴击，对于我，我可能会这样说『在真实的时间里，我已经是毕业生了，但在我自己的时间里，我还没有毕业。』 日吉子老师是新垣结衣配音的，这个我在谢幕的时候看到都惊呆了，完全没听出来，而且看了最近的照片，发现gakki也老了啊。 每个角色的反面情绪，窦子是自卑感，君是撒谎的负罪感，路易是责任感 路易有一个设定，对音乐过耳不忘，拥有着绝对的音感(我就说你小子玩特雷门琴这种，一看就不是普通人的天赋哥!)，路易的父亲在其三岁时出走杳无音讯，亲哥哥在初二的夏天溺海去世(所以才有那个合照的特写)，所以路易身上隐约透露出来的是责任感。 小君的妈妈和奶奶都是单身女性，小君的退学是东京的妈妈盖章签名的，妈妈也没有追问原因(,,ԾㅂԾ,,) 影片的一个属性是乐队，或者说音乐，而这里的音乐不是像mygo或者mujica这种，必须要去演出，武道馆这种目标的，而白猫堂这里的音乐是爱好，是能分享情绪的出口，无功利，是困境中照亮每个人心底的一束光。 山田尚子：“这部作品刻画了那些正准备开始，或已经迈出重要第一步的人的故事，我相信很多人都能共鸣，另外这部作品的live演出也很帅气，希望大家都能去电影院体验。”所以这是青春纪录片吧，记录介于孩子和大人之间少男少女们跨出那一步的瞬间。\n主观评分 🌟🌟🌟⭐\n","date":"2025-02-24T21:06:57+08:00","image":"https://cdn.jsdelivr.net/gh/Rei-XY/Cloud-Image@main/Blog/Movies-TV/你的颜色.jpg","permalink":"https://blog.christinaxy.top/post/2025movie-%E4%BD%A0%E7%9A%84%E9%A2%9C%E8%89%B2/","title":"你的颜色 | 山田尚子"},{"content":"主题修改 字体修改 MacBook上感觉文档的字体渲染挺锐的，怪不得好多人拿Mac办公，确实看的舒服，但是网页上代码块的渲染有点难受，平常的win本一直是用JetBrains Mono，调整一下:\n1 2 3 4 5 6 7 8 9 10 11 12 \u0026lt;!-- assets/scss/variables.scss --\u0026gt; // add fonts api from google fonts @import url(\u0026#39;https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800\u0026amp;display=swap\u0026#39;); :root { --sys-font-family: -apple-system, BlinkMacSystemFont, \u0026#34;Segoe UI\u0026#34;, \u0026#34;Droid Sans\u0026#34;, \u0026#34;Helvetica Neue\u0026#34;; --zh-font-family: \u0026#34;PingFang SC\u0026#34;, \u0026#34;Hiragino Sans GB\u0026#34;, \u0026#34;Droid Sans Fallback\u0026#34;, \u0026#34;Microsoft YaHei\u0026#34;; --base-font-family: \u0026#34;Lato\u0026#34;, var(--sys-font-family), var(--zh-font-family), sans-serif; --code-font-family: \u0026#34;JetBrains Mono\u0026#34;, Menlo, Monaco, Consolas, \u0026#34;Courier New\u0026#34;, var(--zh-font-family), monospace; } 版式修改 1.样式修改:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 // 页面基本配色 :root { // 全局顶部边距 --main-top-padding: 30px; // 全局卡片圆角 --card-border-radius: 25px; // 标签云卡片圆角 --tag-border-radius: 8px; // 卡片间距 --section-separation: 40px; // 全局字体大小 --article-font-size: 1.8rem; // 行内代码背景色 --code-background-color: #f8f8f8; // 行内代码前景色 --code-text-color: #e96900; // 暗色模式下样式 \u0026amp;[data-scheme=\u0026#34;dark\u0026#34;] { // 行内代码背景色 --code-background-color: #ff6d1b17; // 行内代码前景色 --code-text-color: #e96900; } } //选中文本样式美化 ::selection { color: #ffff; background: #977a55; } //------------------------------------------- // 设置选中字体的区域背景颜色 //修改选中颜色 ::selection { color: #fff; background: #34495e; } a { text-decoration: none; color: var(--accent-color); \u0026amp;:hover { color: var(--accent-color-darker); } \u0026amp;.link { color: #4288b9ad; font-weight: 600; padding: 0 2px; text-decoration: none; cursor: pointer; \u0026amp;:hover { text-decoration: underline; } } } 2.布局修改:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 /* 归档页改双栏 */ @media (min-width: 1024px) { .article-list--compact { display: grid; grid-template-columns: 1fr 1fr; background: none; box-shadow: none; gap: 1rem; article { background: var(--card-background); border: none; box-shadow: var(--shadow-l2); margin-bottom: 8px; border-radius: 16px; } } } /* links页面改三栏 */ @media (min-width: 1024px) { .article-list--compact.links { display: grid; grid-template-columns: 1fr 1fr 1fr; //三个1fr即为三栏,两个1fr则为双栏,以此类推即可. background: none; box-shadow: none; gap: 1rem; article { background: var(--card-background); border: none; box-shadow: var(--shadow-l2); margin-bottom: 8px; border-radius: var(--card-border-radius); \u0026amp;:nth-child(odd) { margin-right: 8px; } } } } /* 文章封面高度更改 */ .article-list article .article-image img { width: 100%; height: 150px; object-fit: cover; @include respond(md) { height: 200px; } @include respond(xl) { height: 305px; } } /* 全局页面布局间距调整 */ .main-container { min-height: 100vh; align-items: flex-start; padding: 0 15px; gap: var(--section-separation); padding-top: var(--main-top-padding); @include respond(md) { padding: 0 37px; } } .container { margin-left: auto; margin-right: auto; .left-sidebar { order: -3; max-width: var(--left-sidebar-max-width); } .right-sidebar { order: -1; max-width: var(--right-sidebar-max-width); /// Display right sidebar when min-width: lg @include respond(lg) { display: flex; } } \u0026amp;.extended { @include respond(md) { max-width: 1024px; --left-sidebar-max-width: 25%; --right-sidebar-max-width: 22% !important; } @include respond(lg) { max-width: 1280px; --left-sidebar-max-width: 20%; --right-sidebar-max-width: 30%; } @include respond(xl) { max-width: 1453px; //1536px; --left-sidebar-max-width: 15%; --right-sidebar-max-width: 25%; } } \u0026amp;.compact { @include respond(md) { --left-sidebar-max-width: 25%; max-width: 768px; } @include respond(lg) { max-width: 1024px; --left-sidebar-max-width: 20%; } @include respond(xl) { max-width: 1280px; } } } /* 全局页面小图片样式微调 */ .article-list--compact article .article-image img { width: var(--image-size); height: var(--image-size); object-fit: cover; border-radius: 17%; } 3.代码块样式修改:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 /* blog/assets/scss/custom.scss */ /* CodeBlock settings ⬇ */ .highlight { max-width: 102% !important; background-color: var(--pre-background-color); padding: var(--card-padding); position: relative; border-radius: 20px; margin-left: -7px !important; margin-right: -12px; box-shadow: var(--shadow-l1) !important; \u0026amp;:hover { .copyCodeButton { opacity: 1; } } // keep Codeblocks LTR [dir=\u0026#34;rtl\u0026#34;] \u0026amp; { direction: ltr; } pre { margin: initial; padding: 0; margin: 0; width: auto; } } /* use macos format */ .article-content { .highlight:before { content: \u0026#34;\u0026#34;; display: block; background: url(/img/code-header.svg); height: 32px; width: 100%; background-size: 57px; background-repeat: no-repeat; margin-bottom: 5px; background-position: -1px 2px; } } /* adjust light mode format */ [data-scheme=\u0026#34;light\u0026#34;] .article-content .highlight { background-color: #fff9f3; } [data-scheme=\u0026#34;light\u0026#34;] .chroma { color: #ff6f00; background-color: #fff9f3cc; } /* Codeblock settings completed. */ 添加代码块折叠效果\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \u0026lt;!-- blog/layouts/partials/footer/custom.html --\u0026gt; \u0026lt;style\u0026gt; .highlight { max-height: 300px; overflow: hidden; } .code-show { max-height: none !important; } .code-more-box { width: 100%; padding-top: 78px; background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0)), to(#fff)); position: absolute; left: 0; right: 0; bottom: 0; z-index: 1; } .code-more-btn { display: block; margin: auto; width: 44px; height: 22px; background: #f0f0f5; border-top-left-radius: 8px; border-top-right-radius: 8px; padding-top: 6px; cursor: pointer; } .code-more-img { cursor: pointer !important; display: block; margin: auto; width: 22px; height: 16px; } \u0026lt;/style\u0026gt; \u0026lt;script\u0026gt; function initCodeMoreBox() { let codeBlocks = document.querySelectorAll(\u0026#34;.highlight\u0026#34;); if (!codeBlocks) { return; } codeBlocks.forEach(codeBlock =\u0026gt; { // 校验是否overflow if (codeBlock.scrollHeight \u0026lt;= codeBlock.clientHeight) { return; } // 元素初始化 // codeMoreBox let codeMoreBox = document.createElement(\u0026#39;div\u0026#39;); codeMoreBox.classList.add(\u0026#39;code-more-box\u0026#39;); // codeMoreBtn let codeMoreBtn = document.createElement(\u0026#39;span\u0026#39;); codeMoreBtn.classList.add(\u0026#39;code-more-btn\u0026#39;); codeMoreBtn.addEventListener(\u0026#39;click\u0026#39;, () =\u0026gt; { codeBlock.classList.add(\u0026#39;code-show\u0026#39;); codeMoreBox.style.display = \u0026#39;none\u0026#39;; // 触发resize事件，重新计算目录位置 window.dispatchEvent(new Event(\u0026#39;resize\u0026#39;)) }) // img let img = document.createElement(\u0026#39;img\u0026#39;); img.classList.add(\u0026#39;code-more-img\u0026#39;); img.src = \u0026#34;/icons/arrow.png\u0026#34;; // 元素添加 codeMoreBtn.appendChild(img); codeMoreBox.appendChild(codeMoreBtn); codeBlock.appendChild(codeMoreBox) }) } initCodeMoreBox(); \u0026lt;/script\u0026gt; 4.DIY-添加横幅:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 /* 主页添加横幅 */ /* part 1 */ /* HUGO_SITE_FOLDER/assets/scss/custom.scss */ .welcome { color: var(--card-text-color-main); background: var(--card-background); box-shadow: var(--shadow-l2); border-radius: 30px; display: inline-block; } // 实现字符跳动动画 .jump-text1 { display: inline-block; animation: jump 0.5s 1; } .jump-text2 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.1s; } .jump-text3 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.2s; } @keyframes jump { 0% { transform: translateY(0); } 50% { transform: translateY(-20px); } 100% { transform: translateY(0); } } /* part 2 */ /* blog/layouts/index.html */ \u0026lt;!-- 首页欢迎字幅 --\u0026gt; \u0026lt;div class=\u0026#34;welcome\u0026#34;\u0026gt; \u0026lt;p style=\u0026#34;font-size: 2rem; text-align: center; font-weight: bold\u0026#34;\u0026gt; \u0026lt;!-- \u0026lt;span class=\u0026#34;shake\u0026#34;\u0026gt;👋\u0026lt;/span\u0026gt; --\u0026gt; \u0026lt;span class=\u0026#34;jump-text1\u0026#34;\u0026gt; Welcome\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text2\u0026#34;\u0026gt; Back \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text3\u0026#34; style=\u0026#34;color:#e99312;\u0026#34;\u0026gt;Rei\u0026lt;/span\u0026gt; \u0026lt;!-- \u0026lt;span class=\u0026#34;jump-text4\u0026#34;style=\u0026#34;color:#e99312\u0026#34;\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text5\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;a\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text6\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;o\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text7\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;k\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text8\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;\u0026#39;s\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text9\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;Blog\u0026lt;/span\u0026gt; --\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- 首页欢迎字幅 --\u0026gt; 5.DIY-添加Blog运行时间\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \u0026lt;!-- layouts/partials/footer/custom.html --\u0026gt; \u0026lt;script\u0026gt; let s1 = \u0026#39;2025-1-19\u0026#39;; //website start date s1 = new Date(s1.replace(/-/g, \u0026#34;/\u0026#34;)); let s2 = new Date(); let timeDifference = s2.getTime() - s1.getTime(); let days = Math.floor(timeDifference / (1000 * 60 * 60 * 24)); let hours = Math.floor((timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); let minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)); let result = days + \u0026#34; 天 \u0026#34; + hours + \u0026#34; 小时 \u0026#34; + minutes + \u0026#34; 分钟\u0026#34;; document.getElementById(\u0026#39;runningdays\u0026#39;).innerHTML = result; \u0026lt;/script\u0026gt; \u0026lt;!-- layouts/partials/footer/footer.html --\u0026gt; \u0026lt;!-- Add blog running time --\u0026gt; \u0026lt;section class=\u0026#34;running-time\u0026#34;\u0026gt; 本博客已稳定运行 \u0026lt;span id=\u0026#34;runningdays\u0026#34; class=\u0026#34;running-days\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/section\u0026gt; 内嵌网页视频 Hugo可以通过建立shortcode的方式来内嵌网页视频(读取bilibili内置的iframe代码，2025.03.20还有效)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 \u0026lt;!-- layouts/shortcodes/bilibili.html --\u0026gt; \u0026lt;div style=\u0026#34;position:relative; padding-bottom:56.25%; width:100%; height:0\u0026#34;\u0026gt; \u0026lt;iframe src=\u0026#34;//player.bilibili.com/player.html?bvid={{.Get 0 }}\u0026amp;amp;page={{ if .Get 1 }}{{.Get 1}}{{ else }}1{{end}}\u0026amp;amp;as_wide=1\u0026amp;high_quality=1\u0026amp;amp;autoplay=0\u0026#34; scrolling=\u0026#34;no\u0026#34; border=\u0026#34;0\u0026#34; frameborder=\u0026#34;no\u0026#34; framespacing=\u0026#34;0\u0026#34; allowfullscreen=\u0026#34;true\u0026#34; style=\u0026#34;position:absolute; height: 100%; width: 100%;\u0026#34; \u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/div\u0026gt; 相关说明：创建一个响应式容器，根据视频比例自适应大小。\nposition:relative：为子元素(iframe)的绝对定位提供参考。 padding-bottom:56.25%：通过内边距的百分比(宽度的56.25%)维持容器的宽高比例(16:9)，确保视频高度随宽度变化。 width:100%; height:0：宽度占满父容器，高度由 padding-bottom 动态计算。 嵌入视频的 \u0026lt;iframe\u0026gt;\n1 2 3 4 5 6 7 8 9 10 \u0026lt;iframe src=\u0026#34;//player.bilibili.com/player.html?bvid={{.Get 0 }}\u0026amp;amp;page={{ if .Get 1 }}{{.Get 1}}{{ else }}1{{end}}\u0026amp;amp;as_wide=1\u0026amp;high_quality=1\u0026amp;amp;autoplay=0\u0026#34; scrolling=\u0026#34;no\u0026#34; border=\u0026#34;0\u0026#34; frameborder=\u0026#34;no\u0026#34; framespacing=\u0026#34;0\u0026#34; allowfullscreen=\u0026#34;true\u0026#34; style=\u0026#34;position:absolute; height: 100%; width: 100%;\u0026#34; \u0026gt; \u0026lt;/iframe\u0026gt; 1. src 属性\n1 src=\u0026#34;//player.bilibili.com/player.html?bvid={{.Get 0 }}\u0026amp;amp;page={{ if .Get 1 }}{{.Get 1}}{{ else }}1{{end}}\u0026amp;amp;as_wide=1\u0026amp;high_quality=1\u0026amp;amp;autoplay=0\u0026#34; 说明：指定嵌入的哔哩哔哩播放器地址及参数。 bvid={{.Get 0}}：通过 Hugo Shortcode 的第一个参数（{{.Get 0}}）传入视频的 BV 号（如 BV1xx411x7xx）。 page=...：通过第二个参数（{{.Get 1}}）指定视频的分页（分P），未提供时默认为 1。 as_wide=1：启用宽屏模式。 high_quality=1：默认使用高清画质。 autoplay=0：禁止自动播放（设为 1 可启用）。 2. 其他属性\nscrolling=\u0026quot;no\u0026quot;：禁用 iframe 滚动条。 border=\u0026quot;0\u0026quot;、frameborder=\u0026quot;no\u0026quot;：隐藏 iframe 边框。 framespacing=\u0026quot;0\u0026quot;：移除框架间距。 allowfullscreen=\u0026quot;true\u0026quot;：允许全屏播放。 3. 内联样式\n1 style=\u0026#34;position:absolute; height: 100%; width: 100%;\u0026#34; 作用：让 iframe 填满外层容器。 position:absolute：基于外层容器绝对定位。 height: 100%; width: 100%：占满外层容器的全部空间。 2025-04-09 15:30 Wednesday\n\u0026emsp;\u0026emsp;网易云的内嵌式播放出了问题，无法渲染，看了几个博客都出现了类似的问题，暂时还在找如何替换; 打算用Aplayer+MeetingJs的方式，参考博客：https://blog.ohmykreee.top/article/music-player-in-hugo-page/\n","date":"2025-02-10T22:28:15+08:00","permalink":"https://blog.christinaxy.top/post/hugo-stack-mod/","title":"赛博小屋装修记"}]