diff --git a/README.md b/README.md new file mode 100644 index 0000000..bbca717 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ + + + + +## 使用方法 + +见:[ShorinWiki_一键安装桌面环境](https://github.com/SHORiN-KiWATA/Shorin-ArchLinux-Guide/wiki/%E4%B8%80%E9%94%AE%E9%85%8D%E7%BD%AE%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83) diff --git a/common-applist.txt b/common-applist.txt new file mode 100644 index 0000000..4d4a1de --- /dev/null +++ b/common-applist.txt @@ -0,0 +1,46 @@ +# --- Standard Packages --- +gdu # TUI Disk Usage Analyzer +baobab # GUI Disk Usage Analyzer +mission-center # System Monitor (Task Manager style) +gnome-disk-utility # Disk Management Utility (Disks) +gnome-font-viewer # manage fonts easily +fcitx5-mozc # Japanese Input Method +rime-wubi # wubi input method +firefox # the best browser on linux +transmission-gtk # BitTorrent Client +localsend # send files to other devices +nm-connection-editor # Advanced network editor +opencode # open source ai agent +gnome-calendar # calendar +gnome-clocks # clocks +gamescope # gaming compositor made by Valve +heroic-games-launcher-bin # Playing Epic games +lutris # Gaming outside steam +steam # Gaming Platform (Valve) +protonplus # manage proton +mangohud # OSD tool for gaming (like msi afterburner) +lact # GPU Control Tool (Overclocking/Fan) +wine # run windows exe +virt-manager # KVM qemu virtual machine +lazyvim # Great preset of neovim +neovim # Advanced version of vim +mpv # Minimalist High Performance Video Player +obs-studio # OBS Studio (Streaming & Recording) +upscaler # image upscaler (make it more clear) +yazi # great tui file manager +flatseal # flatpak permission manager +pavucontrol # sound config GUI + +# --- AUR Packages --- +AUR:flclash-bin # Sometimes a detour is necessary to solve a problem +AUR:linuxqq-appimage # Tencent QQ (AppImage) +AUR:wechat-appimage # WeChat (AppImage) +AUR:lsfg-vk-bin # yellow duck frame generator +AUR:mangojuice-bin # GUI for mangohud +AUR:video-downloader # Download youtube or bilibili videos +AUR:visual-studio-code-bin # vscode + +# --- Flatpak Packages --- +flatpak:com.github.wwmm.easyeffects # Audio Effects for PipeWire +flatpak:io.github.fabrialberio.pinapp # PinApp (modify .desktop files) +flatpak:it.mijorus.gearlever # AppImage Manager diff --git a/dms-dotfiles/.config/Thunar/accels.scm b/dms-dotfiles/.config/Thunar/accels.scm new file mode 100644 index 0000000..92c2059 --- /dev/null +++ b/dms-dotfiles/.config/Thunar/accels.scm @@ -0,0 +1,136 @@ +; thunar GtkAccelMap rc-file -*- scheme -*- +; this file is an automated accelerator map dump +; +; (gtk_accel_path "/ThunarStandardView/sort-by-type" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-last-modified" "") +; (gtk_accel_path "/Thunarwindow/menu" "") +; (gtk_accel_path "/ThunarActionManager/cut" "x") +; (gtk_accel_path "/ThunarStandardView/sort-by-size" "") +(gtk_accel_path "/ThunarActions/uca-action-1769427857102992-1" "v") +; (gtk_accel_path "/ThunarWindow/file-menu" "") +; (gtk_accel_path "/ThunarWindow/close-tab" "w") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab-alt" "ISO_Left_Tab") +; (gtk_accel_path "/ThunarStatusBar/toggle-size" "") +; (gtk_accel_path "/ThunarWindow/new-window" "n") +; (gtk_accel_path "/ThunarWindow/clear-directory-specific-settings" "") +; (gtk_accel_path "/ThunarWindow/close-window" "q") +; (gtk_accel_path "/ThunarWindow/open-parent" "Up") +; (gtk_accel_path "/ThunarWindow/view-side-pane-menu" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-size-in-bytes" "") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab" "Page_Up") +; (gtk_accel_path "/ThunarBookmarks/43958e0ed33f21f69df101ad8063a653" "") +; (gtk_accel_path "/ThunarActionManager/open" "o") +; (gtk_accel_path "/ThunarStandardView/sort-ascending" "") +; (gtk_accel_path "/ThunarWindow/toggle-split-view" "F3") +; (gtk_accel_path "/ThunarActionManager/copy-2" "Insert") +; (gtk_accel_path "/ThunarActionManager/trash-delete" "Delete") +; (gtk_accel_path "/ThunarWindow/open-recent" "") +; (gtk_accel_path "/ThunarWindow/view-configure-toolbar" "") +; (gtk_accel_path "/ThunarStandardView/forward" "Right") +; (gtk_accel_path "/ThunarActionManager/restore" "") +; (gtk_accel_path "/ThunarWindow/open-location-alt" "d") +; (gtk_accel_path "/ThunarStandardView/select-by-pattern" "s") +; (gtk_accel_path "/ThunarWindow/zoom-out-alt" "KP_Subtract") +; (gtk_accel_path "/ThunarWindow/contents" "F1") +; (gtk_accel_path "/ThunarWindow/open-file-menu" "F10") +; (gtk_accel_path "/ThunarBookmarks/54761b802eb6de69c74ff01588374999" "") +; (gtk_accel_path "/ThunarWindow/show-highlight" "") +; (gtk_accel_path "/ThunarStandardView/sort-descending" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-name" "") +; (gtk_accel_path "/ThunarStandardView/select-all-files" "a") +; (gtk_accel_path "/ThunarActionManager/execute" "") +; (gtk_accel_path "/ThunarStandardView/properties" "Return") +; (gtk_accel_path "/ThunarActionManager/cut-2" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-dtime" "") +; (gtk_accel_path "/ThunarWindow/open-templates" "") +; (gtk_accel_path "/ThunarActionManager/paste-2" "Insert") +; (gtk_accel_path "/ThunarWindow/switch-next-tab" "Page_Down") +; (gtk_accel_path "/ThunarStatusBar/toggle-filetype" "") +; (gtk_accel_path "/ThunarWindow/close-all-windows" "w") +; (gtk_accel_path "/ThunarStandardView/create-document" "") +; (gtk_accel_path "/ThunarWindow/detach-tab" "") +; (gtk_accel_path "/ThunarWindow/cancel-search" "Escape") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt2" "equal") +; (gtk_accel_path "/ThunarStatusBar/toggle-hidden-count" "") +; (gtk_accel_path "/ThunarShortcutsPane/sendto-shortcuts" "d") +; (gtk_accel_path "/ThunarActionManager/undo" "z") +; (gtk_accel_path "/ThunarWindow/view-location-selector-entry" "") +; (gtk_accel_path "/ThunarStandardView/toggle-sort-order" "") +(gtk_accel_path "/ThunarActions/uca-action-1769429285959977-2" "v") +; (gtk_accel_path "/ThunarBookmarks/974ddf6f60ae0a85b557432c4c4f2cd9" "") +; (gtk_accel_path "/ThunarActionManager/paste" "v") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt1" "KP_Add") +; (gtk_accel_path "/ThunarWindow/view-menubar" "m") +; (gtk_accel_path "/ThunarActionManager/restore-show" "") +; (gtk_accel_path "/ThunarWindow/open-desktop" "") +; (gtk_accel_path "/ThunarWindow/view-as-detailed-list" "2") +; (gtk_accel_path "/ThunarStandardView/back" "Left") +; (gtk_accel_path "/ThunarWindow/zoom-out" "minus") +; (gtk_accel_path "/ThunarStatusBar/toggle-display-name" "") +; (gtk_accel_path "/ThunarWindow/sendto-menu" "") +; (gtk_accel_path "/ThunarWindow/go-menu" "") +; (gtk_accel_path "/ThunarWindow/remove-from-recent" "") +; (gtk_accel_path "/ThunarBookmarks/cfa69549cdb5c4c993b09b04df44c6b4" "") +; (gtk_accel_path "/ThunarActionManager/open-with-other" "") +; (gtk_accel_path "/ThunarStandardView/invert-selection" "i") +; (gtk_accel_path "/ThunarWindow/view-side-pane-shortcuts" "b") +; (gtk_accel_path "/ThunarBookmarks/cab0112e8c7d4b26ba7cf8d0f8b46cc6" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-2" "Reload") +; (gtk_accel_path "/ThunarWindow/view-location-selector-menu" "") +; (gtk_accel_path "/ThunarWindow/edit-menu" "") +; (gtk_accel_path "/ThunarActionManager/copy" "c") +; (gtk_accel_path "/ThunarStandardView/sort-by-mtime" "") +; (gtk_accel_path "/ThunarStandardView/forward-alt" "Forward") +; (gtk_accel_path "/ThunarActionManager/move-to-trash" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-1" "F5") +; (gtk_accel_path "/ThunarActionManager/delete-3" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/unselect-all-files" "Escape") +; (gtk_accel_path "/ThunarStandardView/arrange-items-menu" "") +; (gtk_accel_path "/ThunarWindow/bookmarks-menu" "") +; (gtk_accel_path "/ThunarWindow/reload" "r") +; (gtk_accel_path "/ThunarWindow/open-computer" "") +; (gtk_accel_path "/ThunarWindow/toggle-image-preview" "") +; (gtk_accel_path "/ThunarWindow/toggle-side-pane" "F9") +; (gtk_accel_path "/ThunarWindow/view-as-icons" "1") +; (gtk_accel_path "/ThunarActionManager/delete-2" "Delete") +; (gtk_accel_path "/ThunarWindow/zoom-in" "plus") +; (gtk_accel_path "/ThunarStandardView/rename" "F2") +; (gtk_accel_path "/ThunarWindow/open-location" "l") +; (gtk_accel_path "/ThunarWindow/view-as-compact-list" "3") +; (gtk_accel_path "/ThunarWindow/view-menu" "") +; (gtk_accel_path "/ThunarWindow/search" "f") +; (gtk_accel_path "/ThunarWindow/new-tab" "t") +; (gtk_accel_path "/ThunarWindow/zoom-reset" "0") +; (gtk_accel_path "/ThunarWindow/contents/help-menu" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-tab" "p") +; (gtk_accel_path "/ThunarWindow/view-location-selector-buttons" "") +; (gtk_accel_path "/ThunarStandardView/back-alt2" "Back") +; (gtk_accel_path "/ThunarActionManager/redo" "z") +; (gtk_accel_path "/ThunarWindow/open-trash" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-window" "o") +; (gtk_accel_path "/ThunarWindow/view-statusbar" "") +; (gtk_accel_path "/ThunarActionManager/open-location" "") +; (gtk_accel_path "/ThunarStandardView/duplicate" "") +; (gtk_accel_path "/ThunarActionManager/trash-delete-2" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/back-alt1" "BackSpace") +; (gtk_accel_path "/ThunarBookmarks/8b904a8394ac05541f9a6e2192949ce2" "") +; (gtk_accel_path "/ThunarBookmarks/88b2652848ed389ddc7f23513e177f1d" "") +; (gtk_accel_path "/ThunarStandardView/create-folder" "n") +; (gtk_accel_path "/ThunarWindow/open-home" "Home") +; (gtk_accel_path "/ThunarWindow/switch-focused-split-view-pane" "") +; (gtk_accel_path "/ThunarWindow/show-hidden" "h") +; (gtk_accel_path "/ThunarStandardView/set-default-app" "") +(gtk_accel_path "/ThunarActions/uca-action-1763109685799433-1" "t") +; (gtk_accel_path "/ThunarWindow/empty-trash" "") +; (gtk_accel_path "/ThunarWindow/preferences" "") +; (gtk_accel_path "/ThunarActionManager/delete" "") +; (gtk_accel_path "/ThunarWindow/open-network" "") +; (gtk_accel_path "/ThunarWindow/view-side-pane-tree" "e") +; (gtk_accel_path "/ThunarWindow/open-file-system" "") +; (gtk_accel_path "/ThunarWindow/search-alt" "Search") +; (gtk_accel_path "/ThunarWindow/switch-next-tab-alt" "Tab") +; (gtk_accel_path "/ThunarActionManager/sendto-desktop" "") +; (gtk_accel_path "/ThunarStandardView/make-link" "") +(gtk_accel_path "/ThunarActions/uca-action-1770297188807065-1" "space") +; (gtk_accel_path "/ThunarWindow/zoom-reset-alt" "KP_0") +; (gtk_accel_path "/ThunarWindow/about" "") diff --git a/dms-dotfiles/.config/Thunar/uca.xml b/dms-dotfiles/.config/Thunar/uca.xml new file mode 100644 index 0000000..4b952d5 --- /dev/null +++ b/dms-dotfiles/.config/Thunar/uca.xml @@ -0,0 +1,123 @@ + + + + utilities-terminal + Open Terminal Here + + 1763109685799433-1 + kitty -e fish + Example for a custom action + + * + + + + + + 多媒体信息 + + 1769424941490550-1 + kitty --class "media_info" -e media-info %f + + * + * + + + + + + 粘贴为链接 + + 1769427857102992-1 + sh -c 'wl-paste -t text/uri-list | python3 -c " +import sys, os, urllib.parse +dest_dir = sys.argv[1] + +# 逐行读取剪贴板里的文件 +for line in sys.stdin: + # 1. 清理路径:解码URL并去掉 file:// 前缀 + src = urllib.parse.unquote(line.strip()).replace(\"file://\", \"\") + + # 2. 基础检查 + if not src or not os.path.exists(src): continue + + # 3. 计算目标文件名 + filename = os.path.basename(src) + target = os.path.join(dest_dir, filename) + + # 4. 重名检测循环:如果有同名文件,变成 \"文件名 (1).后缀\" + root, ext = os.path.splitext(filename) + counter = 1 + while os.path.exists(target): + target = os.path.join(dest_dir, f\"{root} ({counter}){ext}\") + counter += 1 + + # 5. 创建链接 + try: os.symlink(src, target) + except: pass +" %f' + + * + * + + + + + 粘贴剪贴板图片 + + 1769429285959977-2 + bash -c 'd="%f";[ -d "$d" ]||d="$(dirname "$d")";cd "$d"||exit;n="img_$(date -Iseconds|cut -d+ -f1|tr T _|tr : -)";t=$(wl-paste -l);if echo "$t"|grep -q "^image/";then wl-paste -t image/png>"$n.png";elif echo "$t"|grep -q "text/uri-list";then u=$(wl-paste -t text/uri-list|head -n1);if [[ "$u" == file://* ]];then p="${u#file://}";f=$(python3 -c "import sys,urllib.parse;print(urllib.parse.unquote(sys.argv[1]))" "$p");[ -f "$f" ]&&cp "$f" "$n.${f##*.}";fi;fi' + + * + * + + + + + 视频转gif + + 1769514623477685-1 + kitty --class="floating-term" -e video2gif %F + + * + * + + + + + 图片转png + + 1769516013413116-2 + bash -c 'exec 1>>/tmp/img_err.log 2>&1; /usr/bin/notify-send "图片转换" "正在后台处理 $# 张图片..."; for f in "$@"; do /usr/bin/magick -background none "$f" -delete 1--1 "$(echo "$f" | sed "s/\.[^.]*$//").png"; done; /usr/bin/notify-send "图片转换" "处理完成"' -- %F + + * + * + + + + + 压缩视频大小 + + 1770021157399945-1 + kitty --class floating-term bash -c 'f="$1"; out="$(echo "$f" | sed "s/\.[^.]*$//")_compressed.mp4"; echo "正在处理: $f"; if ffmpeg -i "$f" -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -crf 26 -preset slow -c:a aac -b:a 128k -pix_fmt yuv420p "$out"; then echo -e "\n✅ 压缩完成!文件已保存为: $out"; else echo -e "\n❌ 压缩失败,请查看上方报错信息。"; fi; read -n 1 -s -r -p "按任意键退出..."' -- %f + + * + * + + + + + 快速查看 + + 1770297188807065-1 + kitty --class="floating-term" -e bash -c "~/.local/bin/preview \"\$1\"; read -n 1 -s -r" -- %f + + * + * + + + + + + + diff --git a/dms-dotfiles/.config/btop/btop.conf b/dms-dotfiles/.config/btop/btop.conf new file mode 100644 index 0000000..418206d --- /dev/null +++ b/dms-dotfiles/.config/btop/btop.conf @@ -0,0 +1,257 @@ +#? Config file for btop v. 1.4.5 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "matugen.theme" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = False + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = True + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = False + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = False + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = True + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem net proc" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 2000 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "cpu direct" + +#* Reverse sorting order, True or False. +proc_reversed = False + +#* Show processes as a tree. +proc_tree = False + +#* Use the cpu graph colors in the process list. +proc_colors = True + +#* Use a darkening gradient in the process list. +proc_gradient = True + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = False + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = True + +#* Show cpu graph for each process. +proc_cpu_graphs = True + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = False + +#* Show proc box on left side of screen instead of right. +proc_left = False + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = False + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = False + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "Auto" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "Auto" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = True + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = False + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = False + +#* Shows the system uptime in the CPU box. +show_uptime = True + +#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. +show_cpu_watts = True + +#* Show cpu temperature. +check_temp = True + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = True + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = False + +#* Show CPU frequency. +show_cpu_freq = True + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = True + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user" +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = True + +#* Show mem box below net box instead of above. +mem_below_net = False + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = True + +#* If swap memory should be shown in memory box. +show_swap = True + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = True + +#* If mem box should be split to also show disks info. +show_disks = True + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = True + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = True + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = False + +#* Set to true to show available disk space for privileged users. +disk_free_priv = False + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = True + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = True + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = False + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = True + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = True + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes. +base_10_bitrate = "Auto" + +#* Show battery stats in top right if battery is present. +show_battery = True + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = True + +#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = True + +#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. +rsmi_measure_pcie_speeds = True + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = false + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" diff --git a/dms-dotfiles/.config/btop/themes/matugen.theme b/dms-dotfiles/.config/btop/themes/matugen.theme new file mode 100644 index 0000000..7f52826 --- /dev/null +++ b/dms-dotfiles/.config/btop/themes/matugen.theme @@ -0,0 +1,89 @@ +# Matugen template for btop + + +# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255" +# example for white: "#ffffff", "#ff" or "255 255 255". + +# All graphs and meters can be gradients +# For single color graphs leave "mid" and "end" variable empty. +# Use "start" and "end" variables for two color gradient +# Use "start", "mid" and "end" for three color gradient + +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="" + +# Main text color +theme[main_fg]="#e6e1e9" + +# Title color for boxes +theme[title]="#cbbeff" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#cac3dc" + +# Background color of selected item in processes box +theme[selected_bg]="#cbbeff" + +# Foreground color of selected item in processes box +theme[selected_fg]="#33275e" + +# Color of inactive/disabled text +theme[inactive_fg]="#cac4cf" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#eeb8cb" + +# Cpu box outline color +theme[cpu_box]="#938f99" + +# Memory/disks box outline color +theme[mem_box]="#938f99" + +# Net up/down box outline color +theme[net_box]="#938f99" + +# Processes box outline color +theme[proc_box]="#938f99" + +# Box divider line and small boxes line color +theme[div_line]="#48454e" + +# Temperature graph colors +theme[temp_start]="#cac3dc" +theme[temp_mid]="#cbbeff" +theme[temp_end]="#ffb4ab" + +# CPU graph colors +theme[cpu_start]="#cac3dc" +theme[cpu_mid]="#cbbeff" +theme[cpu_end]="#ffb4ab" + +# Mem/Disk free meter +theme[free_start]="#cac3dc" +theme[free_mid]="" +theme[free_end]="#484458" + +# Mem/Disk cached meter +theme[cached_start]="#eeb8cb" +theme[cached_mid]="" +theme[cached_end]="#623b4b" + +# Mem/Disk available meter +theme[available_start]="#cbbeff" +theme[available_mid]="" +theme[available_end]="#493e76" + +# Mem/Disk used meter +theme[used_start]="#ffb4ab" +theme[used_mid]="" +theme[used_end]="#93000a" + +# Download graph colors +theme[download_start]="#cac3dc" +theme[download_mid]="#cbbeff" +theme[download_end]="#eeb8cb" + +# Upload graph colors +theme[upload_start]="#cac3dc" +theme[upload_mid]="#cbbeff" +theme[upload_end]="#eeb8cb" diff --git a/dms-dotfiles/.config/cava/config b/dms-dotfiles/.config/cava/config new file mode 100644 index 0000000..3077c35 --- /dev/null +++ b/dms-dotfiles/.config/cava/config @@ -0,0 +1,321 @@ +## Configuration file for CAVA. +# Remove the ; to change parameters. + + +[general] + +# Smoothing mode. Can be 'normal', 'scientific' or 'waves'. DEPRECATED as of 0.6.0 +; mode = normal + +# Accepts only non-negative values. +; framerate = 60 + +# 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off +# new as of 0.6.0 autosens of low values (dynamic range) +# 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. DEPRECATED as of 0.6.0 +; autosens = 1 +; overshoot = 20 + +# Manual sensitivity in %. If autosens is enabled, this will only be the initial value. +# 200 means double height. Accepts only non-negative values. +; sensitivity = 100 + +# The number of bars (0-512). 0 sets it to auto (fill up console). +# Bars' width and space between bars in number of characters. +; bars = 0 +; bar_width = 2 +; bar_spacing = 1 +# bar_height is only used for output in "noritake" format +; bar_height = 32 + +# For SDL width and space between bars is in pixels, defaults are: +; bar_width = 20 +; bar_spacing = 5 + +# sdl_glsl have these default values, they are only used to calculate max number of bars. +; bar_width = 1 +; bar_spacing = 0 + +# ceter bars in terminal, if there is space. +; center_align = 1 + +# max height of bars in terminal, in percent of terminal height. +; max_height = 100 + + +# Lower and higher cutoff frequencies for lowest and highest bars +# the bandwidth of the visualizer. +# Note: there is a minimum total bandwidth of 43Mhz x number of bars. +# Cava will automatically increase the higher cutoff if a too low band is specified. +; lower_cutoff_freq = 50 +; higher_cutoff_freq = 10000 + + +# Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and +# only check for input once per second. Cava will wake up once input is detected. 0 = disable. +; sleep_timer = 0 + + +[input] + +# Audio capturing method. Possible methods are: 'fifo', 'portaudio', 'pipewire', 'alsa', 'pulse', 'sndio', 'oss', 'jack' or 'shmem' +# Defaults to 'oss', 'pipewire', 'sndio', 'jack', 'pulse', 'alsa', 'portaudio' or 'fifo', in that order, dependent on what support cava was built with. +# On Mac it defaults to 'portaudio' or 'fifo' +# On windows this is automatic and no input settings are needed. +# +# All input methods uses the same config variable 'source' +# to define where it should get the audio. +# +# For pulseaudio and pipewire 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink +# (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them). +# +# For pipewire 'source' will be the object name or object.serial of the device to capture from. +# Both input and output devices are supported. To capture the monitor source of a sink node, append '.monitor' to the sink's object name. +# +# For alsa 'source' will be the capture device. +# For fifo 'source' will be the path to fifo-file. +# For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address +# +# For sndio 'source' will be a raw recording audio descriptor or a monitoring sub-device, e.g. 'rsnd/2' or 'snd/1'. Default: 'default'. +# README.md contains further information on how to setup CAVA for sndio. +# +# For oss 'source' will be the path to a audio device, e.g. '/dev/dsp2'. Default: '/dev/dsp', i.e. the default audio device. +# README.md contains further information on how to setup CAVA for OSS on FreeBSD. +# +# For jack 'source' will be the name of the JACK server to connect to, e.g. 'foobar'. Default: 'default'. +# README.md contains further information on how to setup CAVA for JACK. +# +; method = pulse +; source = auto + +; method = pipewire +; source = auto + +; method = alsa +; source = hw:Loopback,1 + +; method = fifo +; source = /tmp/mpd.fifo + +; method = shmem +; source = /squeezelite-AA:BB:CC:DD:EE:FF + +; method = portaudio +; source = auto + +; method = sndio +; source = default + +; method = oss +; source = /dev/dsp + +; method = jack +; source = default + +# The options 'sample_rate', 'sample_bits', 'channels' and 'autoconnect' can be configured for some input methods: +# sample_rate: fifo, pipewire, sndio, oss +# sample_bits: fifo, pipewire, sndio, oss +# channels: sndio, oss, jack +# autoconnect: jack +# Other methods ignore these settings. +# For pipewire, sample_rate will default to 48000, for all other input methods, sample_rate will default to 44100. +# +# For 'sndio' and 'oss' they are only preferred values, i.e. if the values are not supported +# by the chosen audio device, the device will use other supported values instead. +# Example: 48000, 32 and 2, but the device only supports 44100, 16 and 1, then it +# will use 44100, 16 and 1. +# +# +# The 'pipewire' input method has three options to control linking and mixing: +# active: Force the node to always process. Useful for monitoring sources when no other application is active. +# remix: Allow pipewire to remix audio channels to match cava's channel count. Useful for surround sound. +# virtual: Set the node to virtual, to avoid recording notifications from the DE. +# +; sample_rate = 44100 +; sample_bits = 16 +; channels = 2 +; autoconnect = 2 +; active = 0 +; remix = 1 +; virtual = 1 + + +[output] + +# Output method. Can be 'ncurses', 'noncurses', 'raw', 'noritake', 'sdl' +# or 'sdl_glsl'. +# 'noncurses' (default) uses a buffer and cursor movements to only print +# changes from frame to frame in the terminal. Uses less resources and is less +# prone to tearing (vsync issues) than 'ncurses'. +# +# 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data +# stream of the bar heights that can be used to send to other applications. +# 'raw' defaults to 1024 bars stereo (512 bars mono), which can be adjusted in the 'bars' option above. +# +# 'noritake' outputs a bitmap in the format expected by a Noritake VFD display +# in graphic mode. It only support the 3000 series graphical VFDs for now. +# +# 'sdl' uses the Simple DirectMedia Layer to render in a graphical context. +# 'sdl_glsl' uses SDL to create an OpenGL context. Write your own shaders or +# use one of the predefined ones. +; method = noncurses + +# Orientation of the visualization. Can be 'bottom', 'top', 'left', 'right' or +# 'horizontal'. Default is 'bottom'. 'left and 'right' are only supported on sdl +# and ncruses output. 'horizontal' (bars go up and down from center) is only supported +# on noncurses output. +# Note: many fonts have weird or missing glyphs for characters used in orientations +# other than 'bottom', which can make output not look right. +; orientation = bottom + +# Visual channels. Can be 'stereo' or 'mono'. +# 'stereo' mirrors both channels with low frequencies in center. +# 'mono' outputs left to right lowest to highest frequencies. +# 'mono_option' set mono to either take input from 'left', 'right' or 'average'. +# set 'reverse' to 1 to display frequencies the other way around. +; channels = stereo +; mono_option = average +; reverse = 0 + +# Raw output target. +# On Linux, a fifo will be created if target does not exist. +# On Windows, a named pipe will be created if target does not exist. +; raw_target = /dev/stdout + +# Raw data format. Can be 'binary' or 'ascii'. +; data_format = binary + +# Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530). +; bit_format = 16bit + +# Ascii max value. In 'ascii' mode range will run from 0 to value specified here +; ascii_max_range = 1000 + +# Ascii delimiters. In ascii format each bar and frame is separated by a delimiters. +# Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)). +; bar_delimiter = 59 +; frame_delimiter = 10 + +# sdl window size and position. -1,-1 is centered. +; sdl_width = 1024 +; sdl_height = 512 +; sdl_x = -1 +; sdl_y= -1 +; sdl_full_screen = 0 + +# set label on bars on the x-axis. Can be 'frequency' or 'none'. Default: 'none' +# 'frequency' displays the lower cut off frequency of the bar above. +# Only supported on ncurses and noncurses output. +; xaxis = none + +# enable synchronized sync. 1 = on, 0 = off +# removes flickering in alacritty terminal emulator. +# defaults to off since the behaviour in other terminal emulators is unknown +; synchronized_sync = 0 + +# Shaders for sdl_glsl, located in $HOME/.config/cava/shaders +; vertex_shader = pass_through.vert +; fragment_shader = bar_spectrum.frag + +; for glsl output mode, keep rendering even if no audio +; continuous_rendering = 0 + +# disable console blank (screen saver) in tty +# (Not supported on FreeBSD) +; disable_blanking = 0 + +# show a flat bar at the bottom of the screen when idle, 1 = on, 0 = off +; show_idle_bar_heads = 1 + +# show waveform instead of frequency spectrum, 1 = on, 0 = off +; waveform = 0 + +[color] + +# Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow. +# Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires +# a terminal that can change color definitions such as Gnome-terminal or rxvt. +# default is to keep current terminal color +; background = default +; foreground = default + +# SDL and sdl_glsl only support hex code colors, these are the default: +; background = '#111111' +; foreground = '#33ffff' + + +# Gradient mode, only hex defined colors are supported, +# background must also be defined in hex or remain commented out. 1 = on, 0 = off. +# You can define as many as 8 different colors. They range from bottom to top of screen +; gradient = 0 +; gradient_color_1 = '#59cc33' +; gradient_color_2 = '#80cc33' +; gradient_color_3 = '#a6cc33' +; gradient_color_4 = '#cccc33' +; gradient_color_5 = '#cca633' +; gradient_color_6 = '#cc8033' +; gradient_color_7 = '#cc5933' +; gradient_color_8 = '#cc3333' + + +# Horizontal is only supported on noncurses output. +# Only one color will be calculated per bar. +; horizontal_gradient = 0 +; horizontal_gradient_color_1 = '#c45161' +; horizontal_gradient_color_2 = '#e094a0' +; horizontal_gradient_color_3 = '#f2b6c0' +; horizontal_gradient_color_4 = '#f2dde1' +; horizontal_gradient_color_5 = '#cbc7d8' +; horizontal_gradient_color_6 = '#8db7d2' +; horizontal_gradient_color_7 = '#5e62a9' +; horizontal_gradient_color_8 = '#434279' + + +# If both vertical and horizontal gradient is enabled, vertical will be blended in this direction. +# Can be 'up', 'down', 'left' or 'right'. 'up' means the vertical gradient will be blended in from +# bottom to top. I.e. the bottom will be only the horizontal +# and top will be only the color of the vertical gradient. +; blend_direction = 'up' + +# use theme file instead of defining colors in this file +# themes are located in $HOME/.config/cava/themes + theme = 'your-theme' + + +[smoothing] + +# Percentage value for integral smoothing. Takes values from 0 - 100. +# Higher values means smoother, but less precise. 0 to disable. +# DEPRECATED as of 0.8.0, use noise_reduction instead +; integral = 77 + +# Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable. +; monstercat = 0 +; waves = 0 + +# Set gravity percentage for "drop off". Higher values means bars will drop faster. +# Accepts only non-negative values. 50 means half gravity, 200 means double. Set to 0 to disable "drop off". +# DEPRECATED as of 0.8.0, use noise_reduction instead +; gravity = 100 + + +# In bar height, bars that would have been lower that this will not be drawn. +# DEPRECATED as of 0.8.0 +; ignore = 0 + +# Noise reduction, int 0 - 100. default 77 +# the raw visualization is very noisy, this factor adjusts the integral and gravity filters to keep the signal smooth +# 100 will be very slow and smooth, 0 will be fast but noisy. +; noise_reduction = 77 + + +[eq] + +# This one is tricky. You can have as much keys as you want. +# Remember to uncomment more than one key! More keys = more precision. +# Look at readme.md on github for further explanations and examples. +; 1 = 1 # bass +; 2 = 1 +; 3 = 1 # midtone +; 4 = 1 +; 5 = 1 # treble diff --git a/dms-dotfiles/.config/cava/shaders/bar_spectrum.frag b/dms-dotfiles/.config/cava/shaders/bar_spectrum.frag new file mode 100644 index 0000000..e594618 --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/bar_spectrum.frag @@ -0,0 +1,73 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +uniform float shader_time; // shader execution time s (not used here) + +uniform sampler2D inputTexture; // Texture from the last render pass (not used here) + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + // create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + // find which bar to use based on where we are on the x axis + float x = u_resolution.x * fragCoord.x; + int bar = int(bars_count * fragCoord.x); + + // calculate a bar size + float bar_size = u_resolution.x / bars_count; + + // the y coordinate and bar values are the same + float y = bars[bar]; + + // make sure there is a thin line at bottom + if (y * u_resolution.y < 1.0) { + y = 1.0 / u_resolution.y; + } + + // draw the bar up to current height + if (y > fragCoord.y) { + // make some space between bars basen on settings + if (x > (bar + 1) * (bar_size)-bar_spacing) { + fragColor = vec4(bg_color, 1.0); + } else { + if (gradient_count == 0) { + fragColor = vec4(fg_color, 1.0); + } else { + // find which color in the configured gradient we are at + int color = int((gradient_count - 1) * fragCoord.y); + + // find where on y this and next color is supposed to be + float y_min = color / (gradient_count - 1.0); + float y_max = (color + 1.0) / (gradient_count - 1.0); + + // make color + fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color], + gradient_colors[color + 1], y_min, y_max), + 1.0); + } + } + } else { + fragColor = vec4(bg_color, 1.0); + } +} \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/shaders/eye_of_phi.frag b/dms-dotfiles/.config/cava/shaders/eye_of_phi.frag new file mode 100644 index 0000000..e499ee7 --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/eye_of_phi.frag @@ -0,0 +1,117 @@ +#version 330 + +// this shader was stolen from shadertoy user ChunderFPV + +#define SCALE 8.0 +#define PI radians(180.0) +#define TAU (PI * 2.0) +#define CS(a) vec2(cos(a), sin(a)) +#define PT(u, r) smoothstep(0.0, r, r - length(u)) + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform float shader_time; // shader execution time s +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +// gradient map ( color, equation, time, width, shadow, reciprocal ) +vec3 gm(vec3 c, float n, float t, float w, float d, bool i) { + float g = min(abs(n), 1.0 / abs(n)); + float s = abs(sin(n * PI - t)); + if (i) + s = min(s, abs(sin(PI / n + t))); + return (1.0 - pow(abs(s), w)) * c * pow(g, d) * 6.0; +} + +// denominator spiral, use 1/n for numerator +// ( screen xy, spiral exponent, decimal, line width, hardness, rotation ) +float ds(vec2 u, float e, float n, float w, float h, float ro) { + float ur = length(u); // unit radius + float sr = pow(ur, e); // spiral radius + float a = round(sr) * n * TAU; // arc + vec2 xy = CS(a + ro) * ur; // xy coords + float l = PT(u - xy, w); // line + float s = mod(sr + 0.5, 1.0); // gradient smooth + s = min(s, 1.0 - s); // darken filter + return l * s * h; +} + +void main() { + float t = shader_time / PI * 2.0; + vec4 m = vec4(0, 0, 0, 0); // iMouse; + m.xy = m.xy * 2.0 / u_resolution.xy - 1.0; // ±1x, ±1y + if (m.z > 0.0) + t += m.y * SCALE; // move time with mouse y + float z = (m.z > 0.0) ? pow(1.0 - abs(m.y), sign(m.y)) : 1.0; // zoom (+) + float e = (m.z > 0.0) ? pow(1.0 - abs(m.x), -sign(m.x)) + : 1.0; // screen exponent (+) + float se = (m.z > 0.0) ? e * -sign(m.y) : 1.0; // spiral exponent + vec3 bg = vec3(0); // black background + + float aa = 3.0; // anti-aliasing + + for (float j = 0.0; j < aa; j++) + for (float k = 0.0; k < aa; k++) { + vec3 c = vec3(0); + vec2 o = vec2(j, k) / aa; + vec2 uv = (fragCoord * u_resolution.xy - 0.5 * u_resolution.xy + o) / + u_resolution.y * SCALE * z; // apply cartesian, scale and zoom + if (m.z > 0.0) + uv = + exp(log(abs(uv)) * e) * sign(uv); // warp screen space with exponent + + float px = length(fwidth(uv)); // pixel width + float x = uv.x; // every pixel on x + float y = uv.y; // every pixel on y + float l = length(uv); // hypot of xy: sqrt(x*x+y*y) + + float mc = (x * x + y * y - 1.0) / y; // metallic circle at xy + float g = min(abs(mc), 1.0 / abs(mc)); // gradient + vec3 gold = vec3(1.0, 0.6, 0.0) * g * l; + vec3 blue = vec3(0.3, 0.5, 0.9) * (1.0 - g); + vec3 rgb = max(gold, blue); + + float w = 0.1; // line width + float d = 0.4; // shadow depth + c = max(c, gm(rgb, mc, -t, w * bars[0], d, false)); // metallic + c = max(c, gm(rgb, abs(y / x) * sign(y), -t, w * bars[1], d, + false)); // tangent + c = max(c, gm(rgb, (x * x) / (y * y) * sign(y), -t, w * bars[2], d, + false)); // sqrt cotangent + c = max(c, gm(rgb, (x * x) + (y * y), t, w * bars[3], d, + true)); // sqrt circles + + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[4], 2.0, 0.0); // spiral 1a + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[5], 2.0, PI); // spiral 1b + c += + rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[6], 2.0, 0.0); // spiral 2a + c += rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[7], 2.0, PI); // spiral 2b + c = max(c, 0.0); // clear negative color + + c += pow(max(1.0 - l, 0.0), 3.0 / z); // center glow + + if (m.z > 0.0) // display grid on click + { + vec2 xyg = abs(fract(uv + 0.5) - 0.5) / px; // xy grid + c.gb += 0.2 * (1.0 - min(min(xyg.x, xyg.y), 1.0)); + } + bg += c; + } + bg /= aa * aa; + bg *= sqrt(bg) * 1.5; + + fragColor = vec4(bg, 1.0); +} \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/shaders/northern_lights.frag b/dms-dotfiles/.config/cava/shaders/northern_lights.frag new file mode 100644 index 0000000..ecd859a --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/northern_lights.frag @@ -0,0 +1,34 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) + +uniform vec3 u_resolution; // window resolution, not used here + +//colors, configurable in cava config file +uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here +uniform vec3 fg_color; // foreground color, not used here + +void main() +{ + // find which bar to use based on where we are on the x axis + int bar = int(bars_count * fragCoord.x); + + float bar_y = 1.0 - abs((fragCoord.y - 0.5)) * 2.0; + float y = (bars[bar]) * bar_y; + + float bar_x = (fragCoord.x - float(bar) / float(bars_count)) * bars_count; + float bar_r = 1.0 - abs((bar_x - 0.5)) * 2; + + bar_r = bar_r * bar_r * 2; + + // set color + fragColor.r = fg_color.x * y * bar_r; + fragColor.g = fg_color.y * y * bar_r; + fragColor.b = fg_color.z * y * bar_r; +} diff --git a/dms-dotfiles/.config/cava/shaders/pass_through.vert b/dms-dotfiles/.config/cava/shaders/pass_through.vert new file mode 100644 index 0000000..a4f20e5 --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/pass_through.vert @@ -0,0 +1,14 @@ +#version 330 + + +// Input vertex data, different for all executions of this shader. +layout(location = 0) in vec3 vertexPosition_modelspace; + +// Output data ; will be interpolated for each fragment. +out vec2 fragCoord; + +void main() +{ + gl_Position = vec4(vertexPosition_modelspace,1); + fragCoord = (vertexPosition_modelspace.xy+vec2(1,1))/2.0; +} diff --git a/dms-dotfiles/.config/cava/shaders/spectrogram.frag b/dms-dotfiles/.config/cava/shaders/spectrogram.frag new file mode 100644 index 0000000..adce70a --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/spectrogram.frag @@ -0,0 +1,53 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high +// to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +uniform sampler2D inputTexture; // Texture from the last render pass + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + // create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + // find which bar to use based on where we are on the y axis + int bar = int(bars_count * fragCoord.y); + float y = bars[bar]; + float band_size = 1.0 / float(bars_count); + float current_band_min = bar * band_size; + float current_band_max = (bar + 1) * band_size; + + int hist_length = 512; + float win_size = 1.0 / hist_length; + + if (fragCoord.x > 1.0 - win_size) { + + if (fragCoord.y > current_band_min && fragCoord.y < current_band_max) { + + fragColor = vec4(fg_color * y, 1.0); + } + } else { + vec2 offsetCoord = fragCoord; + offsetCoord.x += float(win_size); + fragColor = texture(inputTexture, offsetCoord); + } +} \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/shaders/winamp_line_style_spectrum.frag b/dms-dotfiles/.config/cava/shaders/winamp_line_style_spectrum.frag new file mode 100644 index 0000000..375ff27 --- /dev/null +++ b/dms-dotfiles/.config/cava/shaders/winamp_line_style_spectrum.frag @@ -0,0 +1,112 @@ +#version 330 + +// Emulate the "line style" spectrum analyzer from Winamp 2. +// Try this config for a demonstration: + +/* +[general] +bar_width = 2 +bar_spacing = 0 +higher_cutoff_freq = 22000 + +[output] +method = sdl_glsl +channels = mono +fragment_shader = winamp_line_style_spectrum.frag + +[color] +background = '#000000' +gradient = 1 +gradient_color_1 = '#319C08' +gradient_color_2 = '#29CE10' +gradient_color_3 = '#BDDE29' +gradient_color_4 = '#DEA518' +gradient_color_5 = '#D66600' +gradient_color_6 = '#CE2910' + +[smoothing] +noise_reduction = 10 +*/ + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +//colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +vec3 normalize_C(float y,vec3 col_1, vec3 col_2, float y_min, float y_max) +{ + //create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() +{ + // find which bar to use based on where we are on the x axis + float x = u_resolution.x * fragCoord.x; + int bar = int(bars_count * fragCoord.x); + + //calculate a bar size + float bar_size = u_resolution.x / bars_count; + + //the y coordinate is stretched by 4X to resemble Winamp + float y = min(bars[bar] * 4.0, 1.0); + + // make sure there is a thin line at bottom + if (y * u_resolution.y < 1.0) + { + y = 1.0 / u_resolution.y; + } + + vec4 bar_color; + + if (gradient_count == 0) + { + bar_color = vec4(fg_color,1.0); + } + else + { + //find color in the configured gradient for the top of the bar + int color = int((gradient_count - 1) * y); + + //find where on y this and next color is supposed to be + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + + //make a solid color for the entire bar + bar_color = vec4(normalize_C(y, gradient_colors[color], gradient_colors[color + 1], y_min, y_max), 1.0); + } + + + //draw the bar up to current height + if (y > fragCoord.y) + { + //make some space between bars based on settings + if (x > (bar + 1) * (bar_size) - bar_spacing) + { + fragColor = vec4(bg_color,1.0); + } + else + { + fragColor = bar_color; + } + } + else + { + fragColor = vec4(bg_color,1.0); + } +} \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/themes/solarized_dark b/dms-dotfiles/.config/cava/themes/solarized_dark new file mode 100644 index 0000000..200057c --- /dev/null +++ b/dms-dotfiles/.config/cava/themes/solarized_dark @@ -0,0 +1,15 @@ +[color] +background = '#001e26' +foreground = '#708183' + +gradient = 1 +gradient_color_1 = '#268bd2' +gradient_color_2 = '#6c71c4' +gradient_color_3 = '#cb4b16' + +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#586e75' +horizontal_gradient_color_2 = '#b58900' +horizontal_gradient_color_3 = '#839496' + +blend_direction = 'up' \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/themes/tricolor b/dms-dotfiles/.config/cava/themes/tricolor new file mode 100644 index 0000000..b908137 --- /dev/null +++ b/dms-dotfiles/.config/cava/themes/tricolor @@ -0,0 +1,10 @@ +[color] +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#c45161' +horizontal_gradient_color_2 = '#e094a0' +horizontal_gradient_color_3 = '#f2b6c0' +horizontal_gradient_color_4 = '#f2dde1' +horizontal_gradient_color_5 = '#cbc7d8' +horizontal_gradient_color_6 = '#8db7d2' +horizontal_gradient_color_7 = '#5e62a9' +horizontal_gradient_color_8 = '#434279' \ No newline at end of file diff --git a/dms-dotfiles/.config/cava/themes/your-theme b/dms-dotfiles/.config/cava/themes/your-theme new file mode 100644 index 0000000..e217e19 --- /dev/null +++ b/dms-dotfiles/.config/cava/themes/your-theme @@ -0,0 +1,19 @@ +[color] +background = 'default' +foreground = '#feb0d3' + +; gradient = 0 +gradient = 1 +gradient_color_1 = '#6d3351' +gradient_color_2 = '#feb0d3' +gradient_color_3 = '#ffd8e7' + +horizontal_gradient = 0 +; horizontal_gradient = 1 +horizontal_gradient_color_1 = '#6d3351' +horizontal_gradient_color_2 = '#feb0d3' +horizontal_gradient_color_3 = '#ffd8e7' +horizontal_gradient_color_4 = '#feb0d3' +horizontal_gradient_color_5 = '#6d3351' + + diff --git a/dms-dotfiles/.config/fcitx5/conf/cached_layouts b/dms-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..15ac22b --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3740 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/dms-dotfiles/.config/fcitx5/conf/chttrans.conf b/dms-dotfiles/.config/fcitx5/conf/chttrans.conf new file mode 100644 index 0000000..04476ad --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/chttrans.conf @@ -0,0 +1,12 @@ +# 转换引擎 +Engine=OpenCC +# 启用的输入法 +EnabledIM= +# 简转繁的 OpenCC 配置 +OpenCCS2TProfile=default +# 繁转简的 OpenCC 配置 +OpenCCT2SProfile=default + +[Hotkey] +0=Control+Shift+F + diff --git a/dms-dotfiles/.config/fcitx5/conf/classicui.conf b/dms-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..221db2f --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# 垂直候选列表 +Vertical Candidate List=True +# 使用鼠标滚轮翻页 +WheelForPaging=True +# 字体 +Font="Sans Serif 11" +# 菜单字体 +MenuFont="Sans Serif 10" +# 托盘字体 +TrayFont="Sans Serif 10" +# 托盘标签轮廓颜色 +TrayOutlineColor=#000000 +# 托盘标签文本颜色 +TrayTextColor=#ffffff +# 优先使用文字图标 +PreferTextIcon=False +# 在图标中显示布局名称 +ShowLayoutNameInIcon=True +# 使用输入法的语言来显示文字 +UseInputMethodLanguageToDisplayText=True +# 主题 +Theme=Matugen +# 深色主题 +DarkTheme=Matugen +# 跟随系统浅色/深色设置 +UseDarkTheme=False +# 当被主题和桌面支持时使用系统的重点色 +UseAccentColor=True +# 在 X11 上针对不同屏幕使用单独的 DPI +PerScreenDPI=False +# 固定 Wayland 的字体 DPI +ForceWaylandDPI=0 +# 在 Wayland 下启用分数缩放 +EnableFractionalScale=True + diff --git a/dms-dotfiles/.config/fcitx5/conf/notifications.conf b/dms-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/dms-dotfiles/.config/fcitx5/conf/pinyin.conf b/dms-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/dms-dotfiles/.config/fcitx5/conf/punctuation.conf b/dms-dotfiles/.config/fcitx5/conf/punctuation.conf new file mode 100644 index 0000000..3da1c4c --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/conf/punctuation.conf @@ -0,0 +1,10 @@ +# 字母或者数字之后输入半角标点 +HalfWidthPuncAfterLetterOrNumber=True +# 同时输入成对标点 (例如引号) +TypePairedPunctuationsTogether=False +# Enabled +Enabled=True + +[Hotkey] +0=Control+period + diff --git a/dms-dotfiles/.config/fcitx5/config b/dms-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..b0b1d5c --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# 按住切换键的修饰键时进行轮换切换 +EnumerateWithTriggerKeys=True +# 向前切换输入法 +EnumerateForwardKeys= +# 向后切换输入法 +EnumerateBackwardKeys= +# 轮换输入法时跳过第一个输入法 +EnumerateSkipFirst=False +# 触发修饰键快捷键的时限 (毫秒) +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Super+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# 默认状态为激活 +ActiveByDefault=False +# 重新聚焦时重置状态 +resetStateWhenFocusIn=No +# 共享输入状态 +ShareInputState=No +# 在程序中显示预编辑文本 +PreeditEnabledByDefault=True +# 切换输入法时显示输入法信息 +ShowInputMethodInformation=True +# 在焦点更改时显示输入法信息 +showInputMethodInformationWhenFocusIn=False +# 显示紧凑的输入法信息 +CompactInputMethodInformation=True +# 显示第一个输入法的信息 +ShowFirstInputMethodInformation=True +# 默认页大小 +DefaultPageSize=5 +# 覆盖 XKB 选项 +OverrideXkbOption=False +# 自定义 XKB 选项 +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# 允许在密码框中使用输入法 +AllowInputMethodForPassword=False +# 输入密码时显示预编辑文本 +ShowPreeditForPassword=False +# 保存用户数据的时间间隔(以分钟为单位) +AutoSavePeriod=30 + diff --git a/dms-dotfiles/.config/fcitx5/profile b/dms-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..d264f5e --- /dev/null +++ b/dms-dotfiles/.config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=默认 +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=默认 + diff --git a/dms-dotfiles/.config/fish/config.fish b/dms-dotfiles/.config/fish/config.fish new file mode 100644 index 0000000..a248782 --- /dev/null +++ b/dms-dotfiles/.config/fish/config.fish @@ -0,0 +1,53 @@ +if status is-interactive + # Commands to run in interactive sessions can go here +end +set fish_greeting "" +set -p PATH ~/.local/bin +starship init fish | source +zoxide init fish --cmd cd | source + +function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" +end + +function cat + command bat $argv +end +function ls + command eza --icons $argv +end + +function lt + command eza --icons --tree $argv +end +# grub +abbr grub 'LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 sudo grub-mkconfig -o /boot/grub/grub.cfg' +# 小黄鸭补帧 需要steam安装正版小黄鸭 +abbr lsfg 'LSFG_PROCESS="miyu"' +# fa运行fastfetch +abbr fa fastfetch +abbr reboot 'systemctl reboot' +function sl + command sl | lolcat +end +function 滚 + sysup +end +function raw + command ~/.local/bin/random-anime-wallpaper-dms $argv +end + +function 安装 + command yay -S $argv +end + +function 卸载 + command yay -Rns $argv +end + + diff --git a/dms-dotfiles/.config/fish/functions/apt.fish b/dms-dotfiles/.config/fish/functions/apt.fish new file mode 100644 index 0000000..162d6a1 --- /dev/null +++ b/dms-dotfiles/.config/fish/functions/apt.fish @@ -0,0 +1,171 @@ +# ============================================================================== +# Function: apt (Smart Arch Package Manager Wrapper for Fish) +# Description: Maps common Debian 'apt' commands to an intelligent Arch backend. +# Features: +# - Fallback routing: paru > yay > pacman. +# - Automatic Sudo Handling: Prevents AUR helpers from running as root. +# - Anti-Partial-Upgrade: Merges update/upgrade into a safe -Syu operation. +# - Deep Clean Default: Merges remove/purge into -Rns for a pristine system. +# - UI Integration: Progressive enhancement with 'shorin' for interactive modes. +# - Safe orphan detection and i18n support. +# - Highly readable, colorized, and column-aligned help output. +# Usage: apt {update|upgrade|install [ui]|remove [ui]|search|show|autoremove|clean|help|-h} [pkg...] +# ============================================================================== + +function apt -d "Smart wrapper routing apt commands to paru/yay/pacman" + # 1. 极简的 Locale 探测 + set -l is_zh 0 + if string match -q -r "^zh_" "$LC_ALL" "$LC_MESSAGES" "$LANG" + set is_zh 1 + end + + # 2. 探测 shorin UI 工具是否存在 + set -l has_shorin 0 + if command -q shorin + set has_shorin 1 + end + + set -l action "help" + set -l exit_code 0 + + if test (count $argv) -eq 0 + set exit_code 1 + else + set action $argv[1] + set -e argv[1] + end + + # 3. 帮助信息拦截与本地化 (重构的高颜值排版) + switch $action + case help -h --help + set -l c_cmd (set_color cyan) + set -l c_hl (set_color yellow) + set -l c_rst (set_color normal) + + if test $is_zh -eq 1 + echo "Arch 包管理器包装器 (优先级: "$c_hl"paru > yay > pacman"$c_rst")" + echo "用法: "$c_hl"apt"$c_rst" <命令> [软件包...]" + echo "" + echo "命令:" + echo " "$c_cmd"update(upgrade)"$c_rst" 同步数据库并更新系统 (-Syu)" + echo " "$c_cmd"install "$c_rst" 安装软件包 (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" 打开交互式界面安装 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"remove "$c_rst" 彻底卸载软件包、依赖及配置文件 (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" 打开交互式界面卸载 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"search "$c_rst" 搜索软件包 (-Ss)" + echo " "$c_cmd"show "$c_rst" 显示软件包详细信息 (-Si)" + echo " "$c_cmd"autoremove "$c_rst" 安全地清理系统中的孤立软件包" + echo " "$c_cmd"clean "$c_rst" 清理下载缓存 (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" 显示此帮助信息" + else + echo "Smart Arch Package Wrapper (Routing: "$c_hl"paru > yay > pacman"$c_rst")" + echo "Usage: "$c_hl"apt"$c_rst" [package...]" + echo "" + echo "Commands:" + echo " "$c_cmd"update(upgrade)"$c_rst" Sync databases and update system (Safe -Syu)" + echo " "$c_cmd"install "$c_rst" Install packages (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" Open interactive installation UI (shorin pac)" + end + echo " "$c_cmd"remove "$c_rst" Remove packages, unneeded dependencies, and configs (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" Open interactive removal UI (shorin pacr)" + end + echo " "$c_cmd"search "$c_rst" Search for packages (-Ss)" + echo " "$c_cmd"show "$c_rst" Show package details (-Si)" + echo " "$c_cmd"autoremove "$c_rst" Remove orphaned packages safely" + echo " "$c_cmd"clean "$c_rst" Clean package cache (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" Show this help message" + end + return $exit_code + end + + # 4. 核心路由与提权逻辑 + set -l pkg_mgr + set -l needs_sudo "no" + + if command -q paru + set pkg_mgr "paru" + else if command -q yay + set pkg_mgr "yay" + else + set pkg_mgr "pacman" + set needs_sudo "yes" + end + + set -l cmd + if test "$needs_sudo" = "yes" + set cmd sudo $pkg_mgr + else + set cmd $pkg_mgr + end + + # 5. 预定义基础错误信息 (本地化) + set -l msg_err_pkg "Error: Specify packages." + set -l msg_err_search "Error: Specify search term." + set -l msg_err_show "Error: Specify package to show." + if test $is_zh -eq 1 + set msg_err_pkg "错误:请指定要操作的软件包。" + set msg_err_search "错误:请指定搜索词。" + set msg_err_show "错误:请指定要查看的软件包。" + end + + # 6. 动作映射 (Action Mapping) + switch $action + case update upgrade + $cmd -Syu + case install + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'install ui',条件:且只输入了 ui 一个参数,且系统存在 shorin + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pac + return 0 + end + $cmd -S $argv + case remove + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'remove ui' + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pacr + return 0 + end + $cmd -Rns $argv + case search + if test (count $argv) -eq 0; echo $msg_err_search; return 1; end + $pkg_mgr -Ss $argv + case show + if test (count $argv) -eq 0; echo $msg_err_show; return 1; end + $pkg_mgr -Si $argv + case autoremove + set -l orphans (pacman -Qtdq) + if test (count $orphans) -gt 0 + if test $is_zh -eq 1 + echo "找到 "(count $orphans)" 个孤立的软件包。正在通过 $pkg_mgr 卸载..." + else + echo "Found "(count $orphans)" orphaned package(s). Removing via $pkg_mgr..." + end + $cmd -Rns $orphans + else + if test $is_zh -eq 1 + echo "系统很干净,没有需要清理的孤立软件包。" + else + echo "System is clean. No orphaned packages to remove." + end + end + case clean + $cmd -Sc + case '*' + if test $is_zh -eq 1 + echo "错误:不支持的 apt 命令映射: $action" + echo "运行 'apt -h' 查看可用命令。" + else + echo "Error: Unsupported apt command mapped: $action" + echo "Run 'apt -h' for valid commands." + end + return 1 + end +end diff --git a/dms-dotfiles/.config/fish/functions/f.fish b/dms-dotfiles/.config/fish/functions/f.fish new file mode 100644 index 0000000..8059bc1 --- /dev/null +++ b/dms-dotfiles/.config/fish/functions/f.fish @@ -0,0 +1,252 @@ +function f + # ============================================================================== + # 【脚本功能说明】 + # 1. 结合 Fastfetch,在终端启动时展示随机二次元图片 (支持 SFW / NSFW 模式)。 + # 2. 具备静默后台异步下载机制,库存不足时自动补货,绝不阻塞前台终端的启动。 + # 3. 具备智能缓存管理机制,自动控制待展示区与已使用区 (used) 的图片数量上限。 + # 4. 具备极致的网络环境容错处理,无网或弱网时自动降级 fallback,避免死等。 + # 5. 具备自动清理 Fastfetch 内部生成的图片转换缓存功能,防止磁盘空间无感膨胀。 + # ============================================================================== + + # ================= 配置区域 ================= + + # [开关] 阅后即焚模式 (针对 Fastfetch 内部缓存) + # true = 运行后强力清空 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) + # false = 保留缓存 + set -l CLEAN_CACHE_MODE true + + # 每次补货下载多少张 + set -l DOWNLOAD_BATCH_SIZE 10 + # 最大库存上限 (待展示区) + set -l MAX_CACHE_LIMIT 100 + # 库存少于多少张时开始补货 + set -l MIN_TRIGGER_LIMIT 60 + + # [新增] used 目录最大存放数量 + # 超过此数量将按照时间顺序删除最旧的文件 + set -l MAX_USED_LIMIT 50 + + # =========================================== + + # --- 0. 参数解析与模式设置 --- + + set -l NSFW_MODE false + # 检查环境变量 + if test "$NSFW" = "1" + set NSFW_MODE true + end + + set -l ARGS_FOR_FASTFETCH + for arg in $argv + if test "$arg" = "--nsfw" + set NSFW_MODE true + else + set -a ARGS_FOR_FASTFETCH $arg + end + end + + # --- 1. 目录配置 --- + + # 根据模式区分缓存目录和锁文件 + set -l CACHE_DIR + set -l LOCK_FILE + if test "$NSFW_MODE" = true + set CACHE_DIR "$HOME/.cache/fastfetch_waifu_nsfw" + set LOCK_FILE "/tmp/fastfetch_waifu_nsfw.lock" + else + set CACHE_DIR "$HOME/.cache/fastfetch_waifu" + set LOCK_FILE "/tmp/fastfetch_waifu.lock" + end + + # 定义已使用目录 + set -l USED_DIR "$CACHE_DIR/used" + + mkdir -p "$CACHE_DIR" + mkdir -p "$USED_DIR" + + # --- 2. 核心函数 --- + + # [修复] 抛弃脆弱的 1.1.1.1,使用苹果的全球探针节点,并使用 -I (HEAD请求) 极限提速 + function check_network + curl -sI --connect-timeout 2 "http://captive.apple.com/hotspot-detect.html" >/dev/null 2>&1 + return $status + end + + function get_random_url -V NSFW_MODE + set -l TIMEOUT --connect-timeout 5 --max-time 15 + set -l RAND (math (random) % 3 + 1) + + if test "$NSFW_MODE" = true + # === NSFW API === + switch $RAND + case 1 + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=true" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' + end + else + # === SFW (正常) API === + switch $RAND + case 1 + # [修复] IsNsfwfalse 修正为 IsNsfw=false + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=false" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' + end + end + end + + function download_one_image -V CACHE_DIR + set -l URL (get_random_url) + if string match -qr "^http" -- "$URL" + # 使用带时间戳的随机文件名 + set -l FILENAME "waifu_"(date +%s%N)"_"(random)".jpg" + set -l TARGET_PATH "$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if test -s "$TARGET_PATH" + if command -v file >/dev/null 2>&1 + if not file --mime-type "$TARGET_PATH" | grep -q "image/" + rm -f "$TARGET_PATH" + end + end + else + rm -f "$TARGET_PATH" + end + end + end + + function background_job -V CACHE_DIR -V LOCK_FILE -V MIN_TRIGGER_LIMIT -V DOWNLOAD_BATCH_SIZE -V MAX_CACHE_LIMIT -V NSFW_MODE + # 导出函数定义以便在 fish -c 中使用 + set -l get_random_url_def (functions get_random_url | string collect) + set -l download_one_image_def (functions download_one_image | string collect) + set -l check_network_def (functions check_network | string collect) + + fish -c " + # [核心修复 1] 忽略终端关闭带来的 SIGHUP 信号 + trap '' HUP + + # 重新定义需要的函数 + $get_random_url_def + $download_one_image_def + $check_network_def + + # 使用 flock 防止并发 + flock -n 200 || exit 1 + + # [新增] 网络检查,没网就悄悄退出,不占后台资源 + if not check_network + exit 0 + end + + # 导入变量 + set CACHE_DIR '$CACHE_DIR' + set NSFW_MODE '$NSFW_MODE' + + # 1. 补货检查 + set CURRENT_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + + if test \$CURRENT_COUNT -lt $MIN_TRIGGER_LIMIT + for i in (seq 1 $DOWNLOAD_BATCH_SIZE) + download_one_image + sleep 0.5 + end + end + + # 2. 清理过多库存 (清理的是下载缓存区,不是 used 区) + set FINAL_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + if test \$FINAL_COUNT -gt $MAX_CACHE_LIMIT + set DELETE_START_LINE (math $MAX_CACHE_LIMIT + 1) + ls -tp \$CACHE_DIR/*.jpg 2>/dev/null | tail -n +\$DELETE_START_LINE | xargs -I {} rm -- '{}' + end + " 200>"$LOCK_FILE" & + + # [核心修复 2] 将刚才丢入后台的 fish 子进程剥离终端控制 + disown + end + + # --- 3. 主程序逻辑 --- + + set -l FILES $CACHE_DIR/*.jpg + set -l NUM_FILES (count $FILES) + + # fish 若无匹配文件,$FILES 可能为空或保留模式字符串,需额外判断 + if test "$NUM_FILES" -eq 1; and not test -f "$FILES[1]" + set NUM_FILES 0 + set FILES + end + + set -l SELECTED_IMG "" + + if test "$NUM_FILES" -gt 0 + # 有库存,随机选一张 + set -l RAND_INDEX (math (random) % $NUM_FILES + 1) + set SELECTED_IMG "$FILES[$RAND_INDEX]" + + # 后台补货 + background_job >/dev/null 2>&1 + else + # 没库存,提示语更改并增加网络连通性容错 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + + if check_network + download_one_image + else + echo "网络好像不太通畅,无法下载新图片 QAQ" + end + + set FILES $CACHE_DIR/*.jpg + if test -f "$FILES[1]" + set SELECTED_IMG "$FILES[1]" + background_job >/dev/null 2>&1 + end + end + + # 运行 Fastfetch + if test -n "$SELECTED_IMG"; and test -f "$SELECTED_IMG" + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true $ARGS_FOR_FASTFETCH + + # === 逻辑: 移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 逻辑: 检查 used 目录并清理旧图 === + # 注意:fish 的 glob 展开如果文件太多可能会卡,但这里有 limit 限制所以还好 + set -l used_files $USED_DIR/*.jpg + set -l used_count (count $used_files) + + # 再次确认 count,因为如果没文件 $used_files 可能为空 + if test "$used_count" -gt 0; and not test -f "$used_files[1]" + set used_count 0 + end + + if test "$used_count" -gt "$MAX_USED_LIMIT" + # 计算需要跳过的行数 (保留最新的 N 张) + set -l skip_lines (math "$MAX_USED_LIMIT" + 1) + + # 列出所有文件按时间倒序(tp),取尾部(tail),删除(rm) + # 2>/dev/null 防止目录为空时报错 + set -l files_to_delete (ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$skip_lines) + + if test -n "$files_to_delete" + rm -- $files_to_delete + end + end + + # 检查是否开启清理 Fastfetch 内部缓存 + if test "$CLEAN_CACHE_MODE" = true + # 仅删除缩略图缓存,保留原图 + rm -rf "$HOME/.cache/fastfetch/images" + end + else + # 失败提示语更改 + echo "图片获取失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch $ARGS_FOR_FASTFETCH + end +end diff --git a/dms-dotfiles/.config/fish/functions/fnsfw.fish b/dms-dotfiles/.config/fish/functions/fnsfw.fish new file mode 100644 index 0000000..ef2f45b --- /dev/null +++ b/dms-dotfiles/.config/fish/functions/fnsfw.fish @@ -0,0 +1,3 @@ +function fnsfw + f --nsfw +end diff --git a/dms-dotfiles/.config/fontconfig/fonts.conf b/dms-dotfiles/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..bf57887 --- /dev/null +++ b/dms-dotfiles/.config/fontconfig/fonts.conf @@ -0,0 +1,42 @@ + + + + + + true + true + hintslight + rgb + lcddefault + + + + sans-serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + monospace + + JetBrains Mono + JetBrains Maple Mono + Adwaita Mono + + + + diff --git a/dms-dotfiles/.config/fuzzel/colors.ini b/dms-dotfiles/.config/fuzzel/colors.ini new file mode 100644 index 0000000..3b40d19 --- /dev/null +++ b/dms-dotfiles/.config/fuzzel/colors.ini @@ -0,0 +1,15 @@ +# Fuzzel Colors +# Generated with Matugen + +[colors] +background=1d2024ff +text=e2e2e9ff +prompt=bdc7dcff +placeholder=dcbce1ff +input=a9c7ffff +match=dcbce1ff +selection=bdc7dcff +selection-text=273141ff +selection-match=3e2845ff +counter=bdc7dcff +border=bdc7dcff diff --git a/dms-dotfiles/.config/fuzzel/fuzzel.ini b/dms-dotfiles/.config/fuzzel/fuzzel.ini new file mode 100644 index 0000000..1cc9e56 --- /dev/null +++ b/dms-dotfiles/.config/fuzzel/fuzzel.ini @@ -0,0 +1,128 @@ +[main] +include = "~/.config/fuzzel/colors.ini" +# output= + font=adwaita sans:size=13 +# dpi-aware=auto +# use-bold=yes +# prompt="> " +# placeholder= +# icon-theme=default +# icons-enabled=yes +# hide-before-typing=no +# fields=filename,name,generic +# password-character=* +# filter-desktop=no +# match-mode=fzf +# sort-result=yes +# match-counter=no +# delayed-filter-ms=300 +# delayed-filter-limit=20000 +# show-actions=no + terminal=kitty -e +# launch-prefix= +# list-executables-in-path=no + +# anchor=center +# x-margin=0 +# y-margin=0 + lines=9 +# minimal-lines=no + width=35 + # tabs=8 + horizontal-pad=40 + vertical-pad=15 + inner-pad=5 + +# scaling-filter=box +# imagesize-ratio=0.5 + +# gamma-correct-blending=no + line-height=25 +# letter-spacing=0 + +# layer=overlay +# keyboard-focus=exclusive +# exit-on-keyboard-focus-loss=yes + +# cache= + +# render-workers= +# match-workers= + +# enable-mouse=yes + +[colors] +# background=fdf6e3ff +# text=657b83ff +# prompt=586e75ff +# placeholder=93a1a1ff +# input=657b83ff +# match=cb4b16ff +# selection=eee8d5ff +# selection-text=586e75ff +# selection-match=cb4b16ff +# counter=93a1a1ff +# border=002b36ff + +[border] + width=2 + radius=8 + +[dmenu] +# mode=text # text|index +# exit-immediately-if-empty=no + +[key-bindings] +prev = Control+k Up Control+w +next = Control+j Down Control+s +custom-1 = Control+Return Control+h +# cancel=Escape Control+g Control+c Control+bracketleft +execute=Return KP_Enter Control+l +# execute-or-next=Tab +# execute-input=Shift+Return Shift+KP_Enter +# cursor-left=Left Control+b +# cursor-left-word=Control+Left Mod1+b +# cursor-right=Right Control+f +# cursor-right-word=Control+Right Mod1+f +# cursor-home=Home Control+a +# cursor-end=End Control+e +# delete-line=Control+Shift+BackSpace + delete-prev=BackSpace +delete-prev-word=Mod1+BackSpace Control+BackSpace +# delete-line-backward=Control+u +# delete-next=Delete KP_Delete Control+d +# delete-next-word=Mod1+d Control+Delete Control+KP_Delete + delete-line-forward= none +# prev=Up Control+p +# prev-with-wrap=ISO_Left_Tab +# prev-page=Page_Up KP_Page_Up +# next=Down Control+n +# next-with-wrap=none +# next-page=Page_Down KP_Page_Down +# expunge=Shift+Delete +# clipboard-paste=Control+v XF86Paste +# primary-paste=Shift+Insert Shift+KP_Insert + +# custom-N: *dmenu mode only*. Like execute, but with a non-zero +# exit-code; custom-1 exits with code 10, custom-2 with 11, custom-3 +# with 12, and so on. +# custom-1=Mod1+1 +# custom-2=Mod1+2 +# custom-3=Mod1+3 +# custom-4=Mod1+4 +# custom-5=Mod1+5 +# custom-6=Mod1+6 +# custom-7=Mod1+7 +# custom-8=Mod1+8 +# custom-9=Mod1+9 +# custom-10=Mod1+0 +# custom-11=Mod1+exclam +# custom-12=Mod1+at +# custom-13=Mod1+numbersign +# custom-14=Mod1+dollar +# custom-15=Mod1+percent +# custom-16=Mod1+dead_circumflex +# custom-17=Mod1+ampersand +# custom-18=Mod1+asterix +# custom-19=Mod1+parentleft + diff --git a/dms-dotfiles/.config/gtk-3.0/bookmarks b/dms-dotfiles/.config/gtk-3.0/bookmarks new file mode 100644 index 0000000..b80e22f --- /dev/null +++ b/dms-dotfiles/.config/gtk-3.0/bookmarks @@ -0,0 +1,7 @@ +file:///home/shorin/Documents Documents +file:///home/shorin/Pictures Pictures +file:///home/shorin/Videos Videos +file:///home/shorin/Music Music +file:///home/shorin/Downloads Downloads +file:///home/shorin/.config .config +file:///home/shorin/.local diff --git a/dms-dotfiles/.config/kitty/kitty.conf b/dms-dotfiles/.config/kitty/kitty.conf new file mode 100644 index 0000000..cc1aadf --- /dev/null +++ b/dms-dotfiles/.config/kitty/kitty.conf @@ -0,0 +1,14 @@ +include dank-tabs.conf +include dank-theme.conf +window_padding_width 5 +hide_window_decorations yes +background_opacity 0.8 +font_family JetBrains Maple Mono +font_size 13.5 +remember_window_size no +# confirm_os_window_close 0 +shell fish +cursor_trail 1 +cursor_shape block +shell_integration no-cursor + diff --git a/dms-dotfiles/.config/matugen/config.toml b/dms-dotfiles/.config/matugen/config.toml new file mode 100644 index 0000000..c7cca0d --- /dev/null +++ b/dms-dotfiles/.config/matugen/config.toml @@ -0,0 +1,44 @@ + +[config] + +[templates.pywalfox] +input_path = '~/.config/matugen/templates/pywalfox-colors.json' +output_path = '~/.cache/wal/colors.json' +post_hook = 'pywalfox update &' + +[templates.fcitx5] +input_path = '~/.config/matugen/templates/fcitx5-theme.conf' +output_path = '~/.local/share/fcitx5/themes/Matugen/theme.conf' +post_hook= 'fcitx5 -r & disown ' + +[templates.btop] +input_path = '~/.config/matugen/templates/btop.theme' +output_path = '~/.config/btop/themes/matugen.theme' +post_hook = 'killall -SIGUSR1 btop && killall -SIGUSR2 btop &' + +[templates.cava] +input_path = '~/.config/matugen/templates/cava-colors.ini' +output_path = '~/.config/cava/themes/your-theme' +#post_hook = "pkill -USR1 cava" + +[templates.starship] +input_path = '~/.config/matugen/templates/starship-colors.toml' +output_path = '~/.config/starship.toml' + +[templates.yazi] +input_path = '~/.config/matugen/templates/yazi-theme.toml' +output_path = '~/.config/yazi/theme.toml' + +[templates.gtk-folder] +input_path = '~/.config/matugen/templates/gtk-folder/recolor.sh' +output_path = '~/.cache/matugen/recoloricons.sh' +post_hook = 'bash ~/.cache/matugen/recoloricons.sh &' + +[templates.fastfetch] +input_path = '~/.config/matugen/templates/fastfetch-config.jsonc' +output_path = '~/.config/fastfetch/config.jsonc' + +[templates.fuzzel] +input_path = '~/.config/matugen/templates/fuzzel.ini' +output_path = '~/.config/fuzzel/colors.ini' + diff --git a/dms-dotfiles/.config/matugen/templates/btop.theme b/dms-dotfiles/.config/matugen/templates/btop.theme new file mode 100644 index 0000000..8fc94f6 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/btop.theme @@ -0,0 +1,89 @@ +# Matugen template for btop + + +# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255" +# example for white: "#ffffff", "#ff" or "255 255 255". + +# All graphs and meters can be gradients +# For single color graphs leave "mid" and "end" variable empty. +# Use "start" and "end" variables for two color gradient +# Use "start", "mid" and "end" for three color gradient + +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="" + +# Main text color +theme[main_fg]="{{colors.on_surface.default.hex}}" + +# Title color for boxes +theme[title]="{{colors.primary.default.hex}}" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="{{colors.secondary.default.hex}}" + +# Background color of selected item in processes box +theme[selected_bg]="{{colors.primary.default.hex}}" + +# Foreground color of selected item in processes box +theme[selected_fg]="{{colors.on_primary.default.hex}}" + +# Color of inactive/disabled text +theme[inactive_fg]="{{colors.on_surface_variant.default.hex}}" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="{{colors.tertiary.default.hex}}" + +# Cpu box outline color +theme[cpu_box]="{{colors.outline.default.hex}}" + +# Memory/disks box outline color +theme[mem_box]="{{colors.outline.default.hex}}" + +# Net up/down box outline color +theme[net_box]="{{colors.outline.default.hex}}" + +# Processes box outline color +theme[proc_box]="{{colors.outline.default.hex}}" + +# Box divider line and small boxes line color +theme[div_line]="{{colors.outline_variant.default.hex}}" + +# Temperature graph colors +theme[temp_start]="{{colors.secondary.default.hex}}" +theme[temp_mid]="{{colors.primary.default.hex}}" +theme[temp_end]="{{colors.error.default.hex}}" + +# CPU graph colors +theme[cpu_start]="{{colors.secondary.default.hex}}" +theme[cpu_mid]="{{colors.primary.default.hex}}" +theme[cpu_end]="{{colors.error.default.hex}}" + +# Mem/Disk free meter +theme[free_start]="{{colors.secondary.default.hex}}" +theme[free_mid]="" +theme[free_end]="{{colors.secondary_container.default.hex}}" + +# Mem/Disk cached meter +theme[cached_start]="{{colors.tertiary.default.hex}}" +theme[cached_mid]="" +theme[cached_end]="{{colors.tertiary_container.default.hex}}" + +# Mem/Disk available meter +theme[available_start]="{{colors.primary.default.hex}}" +theme[available_mid]="" +theme[available_end]="{{colors.primary_container.default.hex}}" + +# Mem/Disk used meter +theme[used_start]="{{colors.error.default.hex}}" +theme[used_mid]="" +theme[used_end]="{{colors.error_container.default.hex}}" + +# Download graph colors +theme[download_start]="{{colors.secondary.default.hex}}" +theme[download_mid]="{{colors.primary.default.hex}}" +theme[download_end]="{{colors.tertiary.default.hex}}" + +# Upload graph colors +theme[upload_start]="{{colors.secondary.default.hex}}" +theme[upload_mid]="{{colors.primary.default.hex}}" +theme[upload_end]="{{colors.tertiary.default.hex}}" diff --git a/dms-dotfiles/.config/matugen/templates/cava-colors.ini b/dms-dotfiles/.config/matugen/templates/cava-colors.ini new file mode 100644 index 0000000..f4813b2 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/cava-colors.ini @@ -0,0 +1,19 @@ +[color] +background = 'default' +foreground = '{{colors.primary.default.hex}}' + +; gradient = 0 +gradient = 1 +gradient_color_1 = '{{colors.primary_container.default.hex}}' +gradient_color_2 = '{{colors.primary.default.hex}}' +gradient_color_3 = '{{colors.on_primary_container.default.hex}}' + +horizontal_gradient = 0 +; horizontal_gradient = 1 +horizontal_gradient_color_1 = '{{colors.primary_container.default.hex}}' +horizontal_gradient_color_2 = '{{colors.primary.default.hex}}' +horizontal_gradient_color_3 = '{{colors.on_primary_container.default.hex}}' +horizontal_gradient_color_4 = '{{colors.primary.default.hex}}' +horizontal_gradient_color_5 = '{{colors.primary_container.default.hex}}' + + diff --git a/dms-dotfiles/.config/matugen/templates/fastfetch-config.jsonc b/dms-dotfiles/.config/matugen/templates/fastfetch-config.jsonc new file mode 100644 index 0000000..cab4c6a --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/fastfetch-config.jsonc @@ -0,0 +1,128 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "logo": { + //"type": "kitty", + //"source": "/home/shorin/Pictures/picture.png", + "width": 25, + // "height":20, + "color":{ + "1":"{{colors.primary.default.hex}}", + "2":"{{colors.primary.default.hex}}" + }, + "padding": { + "top": 1, // Top padding + "left": 2, // Left padding + "right": 2 // Right padding + }, + }, + "display": { + "separator": " ", // Separator between keys and values + "color": { + //"keys": "{{colors.secondary.default.hex}}", // Key color module名字的颜色 + "title": "{{colors.on_surface_variant.default.hex}}", // Title color 主机名的颜色 + "output": "{{colors.on_surface_variant.default.hex}}" + }, + }, + "modules": [ + "break", + { + "type": "os", //这是哪个module + "key": "OS", //module名字的显示 + // "keyColor": "#00ff00", //module名字颜色 + // "format": "{name} {version}", //具体内容 + "keyColor": "{{colors.primary.default.hex}}", + + }, + { + "type": "kernel", + "key": " ├  KER ", + "keyColor": "{{colors.primary.default.hex}}", + + }, + { + "type": "packages", + "key": " ├  PAK ", + "format": "{all}", + "keyColor": "{{colors.primary.default.hex}}", + }, + { + "type": "title", + "key": " └  USR ", + "keyColor": "{{colors.primary.default.hex}}", + }, + "break", + "break", + { + "type": "wm", + "key": "WM", + "keyColor": "{{colors.tertiary.default.hex}}", + }, + { + "type": "de", + "key": " ├ 󱈹 DES ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "shell", + "key": " ├  SHE ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "terminal", + "key": " ├  TER ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "terminalfont", + "key": " └  TFO ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + "break", + "break", + { + "type": "host", + "key": "PC ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "cpu", + "key": " ├  CPU ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "memory", + "key": " ├  MEM ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "gpu", + "key": " ├ 󰢮 GPU ", + "format": "{1} {2}", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "display", + "key": " ├  MON ", + "format": "{name} {width}x{height}@{refresh-rate} ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "disk", + "key": " └ 󰋊 DIS ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + "break", + "break", + "colors" + ] +} diff --git a/dms-dotfiles/.config/matugen/templates/fcitx5-theme.conf b/dms-dotfiles/.config/matugen/templates/fcitx5-theme.conf new file mode 100644 index 0000000..3589610 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/fcitx5-theme.conf @@ -0,0 +1,296 @@ +# vim: ft=dosini +[Metadata] +Name=Matugen +Version=0.1 +Author=shorin +Description=WallpaperColorSyncByMatugen +ScaleWithDPI=True + +[InputPanel] +# 改这个:一般文字颜色 +NormalColor={{colors.on_surface.default.hex}} +# 高亮文字颜色 +HighlightColor={{colors.on_primary.default.hex}} +# 高亮背景颜色 +HighlightBackgroundColor={{colors.tertiary.default.hex}} +# 改这个:这个才是被选中的文字颜色 +HighlightCandidateColor={{colors.on_tertiary.default.hex}} +# KWin 下启用模糊 +EnableBlur=False +# 模糊遮罩 +BlurMask= +# 竖排列表时使用所有横向空间高亮 +FullWidthHighlight=True +# 页面按钮垂直对齐 +PageButtonAlignment="Last Candidate" + +[InputPanel/Background] +# 改这个:输入法框整体背景颜色 +Color={{colors.surface_container.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 改这个:边框宽度 +BorderWidth=2 + +[InputPanel/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/Highlight] +# 改这个:高亮背景颜色 +Color={{colors.tertiary.default.hex}} + +[InputPanel/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[InputPanel/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu] +# 一般文字颜色 +NormalColor={{colors.on_surface.default.hex}} +# 选中项文本颜色 +HighlightCandidateColor={{colors.on_surface.default.hex}} + +[Menu/Background] +# 背景图片 +Image= +# 颜色 +Color={{colors.surface_container.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 边框宽度 +BorderWidth=2 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + + +[Menu/Highlight] +# 背景图片 +Image= +# 颜色 +Color={{colors.tertiary.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu/Highlight/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator] +# 背景图片 +Image= +# 颜色 +Color=#c0c0c0 +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Separator/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox] +# 背景图片 +Image=radio.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/CheckBox/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu] +# 背景图片 +Image=arrow.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/SubMenu/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[Menu/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + + diff --git a/dms-dotfiles/.config/matugen/templates/fuzzel.ini b/dms-dotfiles/.config/matugen/templates/fuzzel.ini new file mode 100644 index 0000000..e25854e --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/fuzzel.ini @@ -0,0 +1,15 @@ +# Fuzzel Colors +# Generated with Matugen + +[colors] +background={{colors.surface_container.default.hex_stripped}}cc +text={{colors.on_surface.default.hex_stripped}}ff +prompt={{colors.secondary.default.hex_stripped}}ff +placeholder={{colors.tertiary.default.hex_stripped}}ff +input={{colors.primary.default.hex_stripped}}ff +match={{colors.tertiary.default.hex_stripped}}ff +selection={{colors.secondary.default.hex_stripped}}e6 +selection-text={{colors.on_secondary.default.hex_stripped}}ff +selection-match={{colors.on_tertiary.default.hex_stripped}}ff +counter={{colors.secondary.default.hex_stripped}}ff +border={{colors.secondary.default.hex_stripped}}ff diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/index.theme b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/index.theme new file mode 100644 index 0000000..a143982 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/index.theme @@ -0,0 +1,235 @@ +[Icon Theme] +Name=Adwaita-Matugen +Comment=The Only One +Example=folder +Inherits=Adwaita,AdwaitaLegacy,hicolor +Hidden=true + +# KDE Specific Stuff +DisplayDepth=32 +LinkOverlay=link_overlay +LockOverlay=lock_overlay +ZipOverlay=zip_overlay +DesktopDefault=48 +DesktopSizes=16,22,32,48,64,72,96,128 +ToolbarDefault=22 +ToolbarSizes=16,22,32,48 +MainToolbarDefault=22 +MainToolbarSizes=16,22,32,48 +SmallDefault=16 +SmallSizes=16 +PanelDefault=32 +PanelSizes=16,22,32,48,64,72,96,128 + +# Directory list +Directories=16x16/actions,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/legacy,16x16/mimetypes,16x16/places,16x16/status,16x16/ui,scalable/devices,scalable/mimetypes,scalable/places,scalable/status,scalable/actions,scalable/apps,scalable/categories,scalable/emblems,scalable/emotes,scalable/legacy,scalable/ui,symbolic/actions,symbolic/apps,symbolic/categories,symbolic/devices,symbolic/emblems,symbolic/emotes,symbolic/mimetypes,symbolic/places,symbolic/status,symbolic/legacy,symbolic/ui, + +[16x16/actions] +Context=Actions +Size=16 +Type=Fixed + +[16x16/apps] +Context=Applications +Size=16 +Type=Fixed + +[16x16/categories] +Context=Categories +Size=16 +Type=Fixed + +[16x16/devices] +Context=Devices +Size=16 +Type=Fixed + +[16x16/emblems] +Context=Emblems +Size=16 +Type=Fixed + +[16x16/emotes] +Context=Emotes +Size=16 +Type=Fixed + +[16x16/legacy] +Context=Legacy +Size=16 +Type=Fixed + +[16x16/mimetypes] +Context=MimeTypes +Size=16 +Type=Fixed + +[16x16/places] +Context=Places +Size=16 +Type=Fixed + +[16x16/status] +Context=Status +Size=16 +Type=Fixed + +[16x16/ui] +Context=UI +Size=16 +Type=Fixed + +[scalable/devices] +Context=Devices +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/mimetypes] +Context=MimeTypes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/places] +Context=Places +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/status] +Context=Status +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/actions] +Context=Actions +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/apps] +Context=Applications +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/categories] +Context=Categories +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emblems] +Context=Emblems +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emotes] +Context=Emotes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/legacy] +Context=Legacy +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/ui] +Context=UI +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/actions] +Context=Actions +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/apps] +Context=Applications +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/categories] +Context=Categories +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/devices] +Context=Devices +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emblems] +Context=Emblems +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emotes] +Context=Emotes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/mimetypes] +Context=MimeTypes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/places] +Context=Places +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/status] +Context=Status +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/legacy] +Context=Legacy +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/ui] +Context=UI +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg new file mode 100644 index 0000000..4ee67b4 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg new file mode 100644 index 0000000..a2f038e --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg new file mode 100644 index 0000000..8ce5b1a --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg new file mode 100644 index 0000000..fc93ed9 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg new file mode 100644 index 0000000..296603f --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg new file mode 100644 index 0000000..5efac55 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg new file mode 100644 index 0000000..dd73be1 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg new file mode 100644 index 0000000..41d5d0d --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg new file mode 100644 index 0000000..7fa7030 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg new file mode 100644 index 0000000..f707afa --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg new file mode 100644 index 0000000..115b5c7 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg new file mode 100644 index 0000000..173d777 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg new file mode 100644 index 0000000..163320b --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg new file mode 100644 index 0000000..fb05bea --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg new file mode 100644 index 0000000..e7f0747 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg new file mode 100644 index 0000000..665af73 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg new file mode 100644 index 0000000..fa65381 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg new file mode 100644 index 0000000..92b8866 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg new file mode 100644 index 0000000..af9b0e8 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg new file mode 100644 index 0000000..34d3948 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg new file mode 100644 index 0000000..f036aa1 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg new file mode 100644 index 0000000..f33215b --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg new file mode 100644 index 0000000..a95b170 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg @@ -0,0 +1,1079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/matugen/templates/gtk-folder/recolor.sh b/dms-dotfiles/.config/matugen/templates/gtk-folder/recolor.sh new file mode 100644 index 0000000..fe5719a --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/gtk-folder/recolor.sh @@ -0,0 +1,285 @@ +#!/usr/bin/env bash + +# ============================================================================== +# Adwaita-Matugen Icon Generator V6 (扁平化配置版) +# 逻辑:每一组 SVG 文件的颜色变量直接在顶部定义,方便用户微调。 +# ============================================================================== + +# ============================================================================== +# [一] 颜色变量配置区 (用户修改此处) +# ============================================================================== +MAIN_COLOR="{{colors.secondary_fixed_dim.default.hex}}" +MAIN_SHADOW="{{colors.secondary_container.default.hex}}" +MAIN_DARKER_SHADOW="{{colors.on_secondary.default.hex}}" +MAIN_HILIGHT="{{colors.secondary.default.hex}}" +INVERSE_MAIN_COLOR="{{colors.tertiary_fixed_dim.default.hex}}" +INVERSE_MAIN_HIGHLT="{{colors.tertiary.default.hex}}" +INVERSE_MAIN_SHADOW="{{colors.tertiary_container.default.hex}}" +PAPER_COLOR="#fafafa" +PAPER_FOLE_COLOR="#deddda" +# ------------------------------------------------------------------------------ +# [1] 文件夹 (folder*.svg / user-home.svg ...) +# ------------------------------------------------------------------------------ +# 文件夹保持使用 Secondary (次色系),为了不刺眼使用 dim 版本作为主体 +COLOR_FOLDER_BODY=$MAIN_COLOR # 主体 (原 #a4caee) +COLOR_FOLDER_TOP=$MAIN_HILIGHT # 顶部高光/符号 (原 #afd4ff) +COLOR_FOLDER_SHADOW=$MAIN_SHADOW # 阴影/渐变暗部 (原 #438de6) + +# ------------------------------------------------------------------------------ +# [2] 网络与垃圾桶 (network*.svg / user-trash*.svg) +# ------------------------------------------------------------------------------ +# 使用 Tertiary (第三色系) 作为强调色 +COLOR_ACCENT_BODY=$INVERSE_MAIN_COLOR # 主体 (原 #1c71d8/垃圾桶身) +COLOR_ACCENT_LIGHT=$INVERSE_MAIN_HIGHLT # 亮部 (原 #62a0ea/垃圾桶盖亮面) +COLOR_ACCENT_DARK=$INVERSE_MAIN_SHADOW # 暗部 (原 #1a5fb4/垃圾桶内侧) +COLOR_TRASH_PAPER="{{colors.on_tertiary_container.default.hex}}" # 废纸团颜色 + +# ------------------------------------------------------------------------------ +# [3] 脚本与可执行文件 (text-x-script.svg / application-x-executable.svg) +# ------------------------------------------------------------------------------ +# 重点修正:防止偏淡,主体使用 Primary Default (最鲜艳的主色) +# 对应 Adwaita 原版光影逻辑: +COLOR_SCRIPT_BODY=$MAIN_SHADOW # 主体 (原 #3584e4 - 基准蓝) +COLOR_SCRIPT_HIGHLIGHT=$MAIN_HILIGHT # 高光 (原 #99c1f1 - 亮蓝) +COLOR_SCRIPT_MID="#f0f0f0" # 侧面/次亮 (原 #62a0ea) +COLOR_SCRIPT_SHADOW=$MAIN_SHADOW # 阴影 (原 #1c71d8) +COLOR_SCRIPT_GEAR=$MAIN_DARKER_SHADOW # 齿轮/最深色 +COLOR_SCRIPT_PALE="ffffff" # 极亮部 (原 #d7e8fc) + +# ------------------------------------------------------------------------------ +# [4] 网页地球仪 (text-html.svg) +# ------------------------------------------------------------------------------ +# [新增] 极高光/反光 (原 #b3d3f9, #d7e8fc) +# 建议:使用 secondary_fixed (通常比 dim 更亮) 或 surface_bright +COLOR_HTML_PALE="#f0f0f0" +COLOR_HTML_HIGHLIGHT=$MAIN_HILIGHT # 中间向左上一级左上反光 (原 #99c1f1) +COLOR_HTML_BODY=$MAIN_SHADOW # 球体中间 (原 #62a0ea) +COLOR_HTML_MID=$MAIN_SHADOW # 球体中间向右下一级 (原 #3584e4) +COLOR_HTML_SHADOW=$MAIN_DARKER_SHADOW # 右下 (原 #1c71d8) +COLOR_HTML_DEEP="{{colors.surface_container.default.hex}}" # 最右下 (原 #1a5fb4) +# [新增] 纸张背景 (原 #f6f5f4, #deddda) - +COLOR_DOC_PAPER=$PAPER_COLOR +COLOR_DOC_FOLD=$PAPER_FOLE_COLOR + +# ------------------------------------------------------------------------------ +# [5] 插件图标 (application-x-addon.svg) +# ------------------------------------------------------------------------------ +# 你的要求:必须和 Folder (Secondary) 颜色一致 +COLOR_ADDON_BODY=$MAIN_COLOR # 主体 (原 #3584e4 -> 对应 Folder Body) +COLOR_ADDON_HIGHLIGHT=$MAIN_HILIGHT # 高光 (原 #98c1f1 -> 对应 Folder Top) +COLOR_ADDON_SHADOW=$MAIN_SHADOW # 阴影 (原 #1c71d8 -> 对应 Folder Shadow) +COLOR_ADDON_DEEP=$MAIN_DARKER_SHADOW # 轮廓 (原 #1a5fb4 -> 对应 Folder Deep) + +# ------------------------------------------------------------------------------ +# [6] 字体文件 (font-x-generic.svg) +# ------------------------------------------------------------------------------ +COLOR_FONT_A=$MAIN_SHADOW # 字母 "A" (原 #3584e4) +COLOR_FONT_BASE=$MAIN_DARKER_SHADOW # 底座/阴影 (原 #1a5fb4) + +# ------------------------------------------------------------------------------ +# [7] Office 文档 (x-office-document.svg) +# ------------------------------------------------------------------------------ +COLOR_DOC_PAPER=$PAPER_COLOR # 纸张白 +COLOR_DOC_FOLD=$PAPER_FOLE_COLOR # 折角灰 +# 绿色渐变 -> 映射为 Tertiary (强调色) +COLOR_DOC_GRAD_ACCENT_START=$INVERSE_MAIN_COLOR # 原 #50db81 +COLOR_DOC_GRAD_ACCENT_END=$INVERSE_MAIN_COLOR # 原 #8ff0a4 +# 蓝色阴影 -> 映射为 Primary (主色) +COLOR_DOC_GRAD_SHADE_START=$MAIN_COLOR # 原 #4a86cf +COLOR_DOC_GRAD_SHADE_END=$INVERSE_MAIN_COLOR # 原 #87bae1 + +# ------------------------------------------------------------------------------ +# [8] Office 演示文稿 (x-office-presentation.svg) +# ------------------------------------------------------------------------------ +# 你的要求:饼图蓝色变 Folder 色,绿色变 Accent 色 +COLOR_PRES_CHART_BLUE=$MAIN_COLOR # 饼图-蓝 (Folder Body) +COLOR_PRES_CHART_BLUE_DEEP=$MAIN_SHADOW # 饼图-深蓝 (Folder Shadow) +COLOR_PRES_CHART_GREEN=$INVERSE_MAIN_COLOR # 饼图-绿 (Accent Body) +COLOR_PRES_CHART_GREEN_DEEP=$INVERSE_MAIN_SHADOW # 饼图-深绿 (Accent Dark) +# 支架颜色 (保持中性灰或微调) +COLOR_PRES_STAND_DARK="{{colors.outline.default.hex}}" +COLOR_PRES_STAND_LIGHT="{{colors.outline.default.hex}}" +# ------------------------------------------------------------------------------ +# [10] 音频文件 (audio-x-generic.svg) +# ------------------------------------------------------------------------------ +# 对应之前的光影逻辑,映射到 Tertiary (第三色系) 以保持与其他图标的区别 +# 逻辑:Pale > Highlight > Body > Shadow > Deep +COLOR_AUDIO_PALE="{{colors.tertiary_fixed.default.hex}}" # 最亮高光 (原 #8ff0a4) +COLOR_AUDIO_HIGHLIGHT=$INVERSE_MAIN_HIGHLT # 鲜艳高光 (原 #38ec8b, #38f39d) +COLOR_AUDIO_BODY=$INVERSE_MAIN_COLOR # 主体 (原 #33d17a, #2dbd7d) +COLOR_AUDIO_SHADOW=$INVERSE_MAIN_SHADOW # 阴影/过渡 (原 #26a269) +COLOR_AUDIO_DEEP="{{colors.on_tertiary_container.default.hex}}" # 最深轮廓 (原 #1a6842) + +# ============================================================================== +# [二] 核心逻辑与 Sed 规则生成 +# ============================================================================== + +# 1. 文件夹规则 +CMD_FOLDER=" +s/#a4caee/$COLOR_FOLDER_BODY/g; +s/#438de6/$COLOR_FOLDER_SHADOW/g; +s/#62a0ea/$COLOR_FOLDER_SHADOW/g; +s/#afd4ff/$COLOR_FOLDER_TOP/g; +s/#c0d5ea/$COLOR_FOLDER_TOP/g" + +# 2. 网络规则 +CMD_NETWORK=" +s/#62a0ea/$COLOR_ACCENT_LIGHT/g; +s/#1c71d8/$COLOR_ACCENT_BODY/g; +s/#c0bfbc/$COLOR_ACCENT_BODY/g; +s/#1a5fb4/$COLOR_ACCENT_DARK/g; +s/#14498a/$COLOR_ACCENT_DARK/g; +s/#9a9996/$COLOR_ACCENT_DARK/g; +s/#77767b/$COLOR_FOLDER_SHADOW/g; +s/#241f31/$COLOR_FOLDER_SHADOW/g; +s/#3d3846/$COLOR_FOLDER_SHADOW/g" + + +# 3. 垃圾桶规则 +CMD_TRASH=" +s/#2ec27e/$COLOR_ACCENT_BODY/g; +s/#33d17a/$COLOR_ACCENT_BODY/g; +s/#26a269/$COLOR_ACCENT_DARK/g; +s/#26a168/$COLOR_ACCENT_DARK/g; +s/#9a9996/$COLOR_ACCENT_DARK/g; +s/#c3c2bc/$COLOR_ACCENT_DARK/g; +s/#42d390/$COLOR_ACCENT_LIGHT/g; +s/#ffffff/$COLOR_FOLDER_SHADOW/g; +s/#deddda/$COLOR_TRASH_PAPER/g; +s/#f6f5f4/$COLOR_TRASH_PAPER/g; +s/#77767b/$COLOR_FOLDER_SHADOW/g" + +# 4. 脚本/可执行文件规则 (核心光影修正) +CMD_SCRIPT=" +s/#3584e4/$COLOR_SCRIPT_BODY/g; +s/#99c1f1/$COLOR_SCRIPT_HIGHLIGHT/g; +s/#98c1f1/$COLOR_SCRIPT_HIGHLIGHT/g; +s/#62a0ea/$COLOR_SCRIPT_MID/g; +s/#1c71d8/$COLOR_SCRIPT_SHADOW/g; +s/#1a5fb4/$COLOR_SCRIPT_GEAR/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g; +s/#b3d3f9/$COLOR_SCRIPT_PALE/g" + +# 5. 网页地球仪规则 (已补全所有 Hex) +CMD_HTML=" +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#deddda/$COLOR_DOC_FOLD/g; +s/#b3d3f9/$COLOR_HTML_PALE/g; +s/#d7e8fc/$COLOR_HTML_PALE/g; +s/#62a0ea/$COLOR_HTML_BODY/g; +s/#3584e4/$COLOR_HTML_MID/g; +s/#99c1f1/$COLOR_HTML_HIGHLIGHT/g; +s/#1c71d8/$COLOR_HTML_SHADOW/g; +s/#1a5fb4/$COLOR_HTML_DEEP/g" + +# 6. Addon (拼图) 规则 +CMD_ADDON=" +s/#3584e4/$COLOR_ADDON_BODY/g; +s/#62a0ea/$COLOR_ADDON_HIGHLIGHT/g; +s/#98c1f1/$COLOR_ADDON_HIGHLIGHT/g; +s/#1c71d8/$COLOR_ADDON_SHADOW/g; +s/#1a5fb4/$COLOR_ADDON_DEEP/g" + +# 7. Font (字体) 规则 +CMD_FONT=" +s/#3584e4/$COLOR_FONT_A/g; +s/#1a5fb4/$COLOR_FONT_BASE/g" + +# 8. Document (文档) 规则 +CMD_DOC=" +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#deddda/$COLOR_DOC_FOLD/g; +s/#50db81/$COLOR_DOC_GRAD_ACCENT_START/g; +s/#8ff0a4/$COLOR_DOC_GRAD_ACCENT_END/g; +s/#4a86cf/$COLOR_DOC_GRAD_SHADE_START/g; +s/#87bae1/$COLOR_DOC_GRAD_SHADE_END/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g; +s/#b3d3f9/$COLOR_SCRIPT_PALE/g" + +# 9. Presentation (PPT) 规则 +CMD_PRES=" +s/#4a86cf/$COLOR_PRES_CHART_BLUE/g; +s/#1a5fb4/$COLOR_PRES_CHART_BLUE_DEEP/g; +s/#50db81/$COLOR_PRES_CHART_GREEN/g; +s/#26a269/$COLOR_PRES_CHART_GREEN_DEEP/g; +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#ffffff/$COLOR_DOC_PAPER/g; +s/#414140/$COLOR_PRES_STAND_DARK/g; +s/#949390/$COLOR_PRES_STAND_LIGHT/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g" + +# 10. Audio (音频) 规则 +# 精确映射 audio-x-generic.svg 中的所有绿色阶 +CMD_AUDIO=" +s/#1a6842/$COLOR_AUDIO_DEEP/g; +s/#26a269/$COLOR_AUDIO_SHADOW/g; +s/#2dbd7d/$COLOR_AUDIO_BODY/g; +s/#2dc47e/$COLOR_AUDIO_BODY/g; +s/#33d17a/$COLOR_AUDIO_BODY/g; +s/#38ec8b/$COLOR_AUDIO_HIGHLIGHT/g; +s/#38f39d/$COLOR_AUDIO_HIGHLIGHT/g; +s/#8ff0a4/$COLOR_AUDIO_PALE/g" +# ============================================================================== +# [三] 执行核心流程 +# ============================================================================== + +TEMPLATE_DIR="$HOME/.config/matugen/templates/gtk-folder/Adwaita-Matugen" +CURRENT_THEME=$(gsettings get org.gnome.desktop.interface icon-theme | tr -d "'") + +if [[ "$CURRENT_THEME" == "Adwaita-Matugen-A" ]]; then + TARGET_THEME="Adwaita-Matugen-B" +else + TARGET_THEME="Adwaita-Matugen-A" +fi +TARGET_DIR="$HOME/.local/share/icons/$TARGET_THEME" + +# 1. 准备目录 +mkdir -p "$TARGET_DIR" +cp -rf --reflink=auto --no-preserve=mode,ownership "$TEMPLATE_DIR/"* "$TARGET_DIR/" +sed -i "s/Name=.*/Name=$TARGET_THEME/" "$TARGET_DIR/index.theme" + +# 2. 处理 PNG (统一使用文件夹颜色) +find "$TARGET_DIR" -name "*.png" -print0 | xargs -0 -P0 -I {} magick "{}" \ + -channel RGB -colorspace gray -sigmoidal-contrast 10,50% \ + +level-colors "$COLOR_FOLDER_SHADOW","$COLOR_FOLDER_BODY" \ + +channel "{}" + +# 3. 处理 SVG (分模块并行处理) + +# [Group 1] Folders +find "$TARGET_DIR/scalable" \ + \( -name "folder*.svg" -o -name "user-home*.svg" -o -name "user-desktop*.svg" -o -name "user-bookmarks*.svg" -o -name "inode-directory*.svg" \) \ + -print0 | xargs -0 -P0 sed -i "$CMD_FOLDER" + +# [Group 2] Network +find "$TARGET_DIR/scalable" -name "network*.svg" -print0 | xargs -0 -P0 sed -i --follow-symlinks "$CMD_NETWORK" + +# [Group 3] Trash +find "$TARGET_DIR/scalable" -name "user-trash*.svg" -print0 | xargs -0 -P0 sed -i --follow-symlinks "$CMD_TRASH" + +# [Group 4] Mimetypes - Script & Executable +find "$TARGET_DIR/scalable/mimetypes" \ + \( -name "text-x-script*.svg" -o -name "application-x-executable*.svg" \) \ + -print0 | xargs -0 -P0 sed -i "$CMD_SCRIPT" + +# [Group 5] Mimetypes - Addon +find "$TARGET_DIR/scalable/mimetypes" -name "application-x-addon*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_ADDON" + +# [Group 6] Mimetypes - HTML +find "$TARGET_DIR/scalable/mimetypes" -name "text-html*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_HTML" + +# [Group 7] Mimetypes - Font +find "$TARGET_DIR/scalable/mimetypes" -name "font-x-generic*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_FONT" + +# [Group 8] Mimetypes - Document +find "$TARGET_DIR/scalable/mimetypes" -name "x-office-document*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_DOC" + +# [Group 9] Mimetypes - Presentation +find "$TARGET_DIR/scalable/mimetypes" -name "x-office-presentation*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_PRES" +# [Group 10] Mimetypes - Audio +find "$TARGET_DIR/scalable/mimetypes" -name "audio-x-generic*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_AUDIO" +# 4. 应用变更 +gsettings set org.gnome.desktop.interface icon-theme "$TARGET_THEME" +flatpak override --user --env=ICON_THEME="$TARGET_THEME" 2>/dev/null || true + +exit 0 diff --git a/dms-dotfiles/.config/matugen/templates/pywalfox-colors.json b/dms-dotfiles/.config/matugen/templates/pywalfox-colors.json new file mode 100644 index 0000000..9ddf17f --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/pywalfox-colors.json @@ -0,0 +1,22 @@ +{ + "wallpaper": "{{image}}", + "alpha": "100", + "colors": { + "color0": "{{colors.background.default.hex}}", + "color1": "", + "color2": "", + "color3": "", + "color4": "", + "color5": "", + "color6": "", + "color7": "", + "color8": "", + "color9": "", + "color10": "{{colors.primary.default.hex}}", + "color11": "", + "color12": "", + "color13": "{{colors.surface_bright.default.hex}}", + "color14": "", + "color15": "{{colors.on_surface.default.hex}}" + } +} diff --git a/dms-dotfiles/.config/matugen/templates/starship-colors.toml b/dms-dotfiles/.config/matugen/templates/starship-colors.toml new file mode 100644 index 0000000..59047e6 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/starship-colors.toml @@ -0,0 +1,182 @@ +"$schema" = 'https://starship.rs/config-schema.json' +format = """ +[](color_orange)\ +$os\ +$username\ +[](bg:color_yellow fg:color_orange)\ +$directory\ +[](fg:color_yellow bg:color_aqua)\ +$git_branch\ +$git_status\ +[](fg:color_aqua bg:color_blue)\ +$c\ +$cpp\ +$rust\ +$golang\ +$nodejs\ +$php\ +$java\ +$kotlin\ +$haskell\ +$python\ +[](fg:color_blue bg:color_bg3)\ +$docker_context\ +$conda\ +$pixi\ +[](fg:color_bg3 bg:color_bg1)\ +$time\ +[ ](fg:color_bg1)\ +$line_break$character""" +palette = 'colors' + +[palettes.colors] +mustard = '#af8700' +color_orange = '{{colors.primary_fixed_dim.default.hex}}' +color_fg0 = '{{colors.on_primary.default.hex}}' +color_fg1 = '{{colors.on_surface.default.hex}}' +color_purple = '{{colors.on_tertiary_container.default.hex}}' +color_bg3 = '{{colors.secondary.default.hex}}' +color_green = '{{colors.on_primary.default.hex}}' +color_bg1 = '{{colors.secondary_container.default.hex}}' +color_blue = '{{colors.inverse_primary.default.hex}}' +color_red = '{{colors.primary.default.hex}}' +color_aqua = '{{colors.on_secondary_container.default.hex}}' +color_yellow = '{{colors.tertiary.default.hex}}' + +[os] +disabled = false +style = "bg:color_orange fg:color_fg0" + +[os.symbols] +Windows = "󰍲" +Ubuntu = "󰕈" +SUSE = "" +Raspbian = "󰐿" +Mint = "󰣭" +Macos = "󰀵" +Manjaro = "" +Linux = "󰌽" +Gentoo = "󰣨" +Fedora = "󰣛" +Alpine = "" +Amazon = "" +Android = "" +Arch = "󰣇" +Artix = "󰣇" +CachyOS = "󰣇" +EndeavourOS = "" +CentOS = "" +Debian = "󰣚" +Redhat = "󱄛" +RedHatEnterprise = "󱄛" +Pop = "" + +[username] +show_always = true +style_user = "bg:color_orange fg:color_fg0" +style_root = "bg:color_orange fg:color_fg0" +format = '[ $user ]($style)' + +[directory] +style = "fg:color_fg0 bg:color_yellow" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = "󰝚 " +"Pictures" = " " +"Developer" = "󰲋 " + +[git_branch] +symbol = "" +style = "bg:color_aqua" +format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)' + +[git_status] +style = "bg:color_aqua" +format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)' + +[nodejs] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[c] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[cpp] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[rust] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[golang] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[php] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[java] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[kotlin] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg1 bg:color_blue)]($style)' + +[haskell] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[python] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[docker_context] +symbol = "" +style = "bg:color_bg3" +format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)' + +[conda] +style = "bg:color_bg3" +format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)' + +[pixi] +style = "bg:color_bg3" +format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:color_bg1" +format = '[[  $time ](fg:color_fg1 bg:color_bg1)]($style)' + +[line_break] +disabled = false + +[character] +disabled = false +success_symbol = '[](bold fg:color_green)' +error_symbol = '[](bold fg:color_red)' +vimcmd_symbol = '[](bold fg:color_green)' +vimcmd_replace_one_symbol = '[](bold fg:color_purple)' +vimcmd_replace_symbol = '[](bold fg:color_purple)' +vimcmd_visual_symbol = '[](bold fg:color_yellow)' + diff --git a/dms-dotfiles/.config/matugen/templates/yazi-theme.toml b/dms-dotfiles/.config/matugen/templates/yazi-theme.toml new file mode 100644 index 0000000..9d2def8 --- /dev/null +++ b/dms-dotfiles/.config/matugen/templates/yazi-theme.toml @@ -0,0 +1,278 @@ +# : Manager [[[ + +[mgr] +cwd = { fg = "{{colors.on_surface.default.hex}}" } + +# Find +find_keyword = { fg = "{{colors.error.default.hex}}", bold = true, italic = true, underline = true } +find_position = { fg = "{{colors.error.default.hex}}", bold = true, italic = true } + +# Marker +marker_copied = { fg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 20.0}}", bg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 20.0}}" } +marker_cut = { fg = "{{colors.tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +marker_marked = { fg = "{{colors.error.default.hex}}", bg = "{{colors.error.default.hex}}" } +marker_selected = { fg = "{{colors.tertiary.default.hex}}", bg = "{{colors.tertiary.default.hex}}" } + +# Count +count_copied = { fg = "{{colors.on_tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +count_cut = { fg = "{{colors.on_tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +count_selected = { fg = "{{colors.on_primary.default.hex}}", bg = "{{colors.tertiary.default.hex}}" } + +# Border +border_symbol = "│" +border_style = { fg = "{{colors.surface_tint.default.hex}}" } + +# : ]]] + + +# : Indicator [[[ + +[indicator] +padding = { open = "█", close = "█" } + +# : ]]] + + +# : Tabs [[[ + +[tabs] +active = { fg = "{{colors.primary.default.hex}}", bold = true, bg = "{{colors.surface.default.hex}}" } +inactive = { fg = "{{colors.secondary.default.hex}}", bg = "{{colors.surface.default.hex}}" } +sep_inner = { open = "[", close = "]" } + +# : ]]] + + +# : Mode [[[ + +[mode] +# Mode +normal_main = { bg = "{{colors.primary.default.hex}}", fg = "{{colors.on_primary.default.hex}}", bold = true } +normal_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# Select mode +select_main = { bg = "{{colors.secondary.default.hex}}", fg = "{{colors.on_secondary.default.hex}}", bold = true } +select_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# Unset mode +unset_main = { bg = "{{colors.tertiary.default.hex}}", fg = "{{colors.on_tertiary.default.hex}}", bold = true } +unset_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# : ]]] + + +# : Status [[[ + +[status] +sep_left = { open = "🭁", close = "🭠" } +sep_right = { open = "🭁", close = "🭠" } + +# Permissions +perm_type = { fg = "{{colors.secondary.default.hex | auto_lightness: 30.0}}" } +perm_write = { fg = "{{colors.tertiary.default.hex | auto_lightness: 30.0}}" } +perm_read = { fg = "{{colors.error.default.hex | auto_lightness: 30.0}}" } +perm_exec = { fg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 30.0}}" } +perm_sep = { fg = "{{colors.primary_fixed.default.hex | auto_lightness: 30.0}}" } + +# Progress +progress_label = { bold = true } +progress_normal = { fg = "{{colors.primary.default.hex}}", bg = "{{colors.surface_bright.default.hex}}" } +progress_error = { fg = "{{colors.error.default.hex}}", bg = "{{colors.surface_bright.default.hex}}" } + +# : ]]] + + +# : Which [[[ + +[which] +cols = 3 +mask = { bg = "{{colors.surface_bright.default.hex}}" } +cand = { fg = "{{colors.primary.default.hex}}" } +rest = { fg = "{{colors.on_primary.default.hex}}" } +desc = { fg = "{{colors.on_surface.default.hex}}" } +separator = " ▶ " +separator_style = { fg = "{{colors.on_surface.default.hex}}" } + +# : ]]] + + +# : Notify [[[ + +[notify] +title_info = { fg = "{{colors.tertiary.default.hex}}" } +title_warn = { fg = "{{colors.primary.default.hex}}" } +title_error = { fg = "{{colors.error.default.hex}}" } + +# : ]]] + + +# : Picker [[[ + +[pick] +border = { fg = "{{colors.primary.default.hex}}" } +active = { fg = "{{colors.tertiary.default.hex}}", bold = true } +inactive = {} + +# : ]]] + + +# : Input [[[ + +[input] +border = { fg = "{{colors.primary.default.hex}}" } +value = { fg = "{{colors.on_surface.default.hex}}" } + +# : ]]] + + +# : Completion [[[ + +[cmp] +border = { fg = "{{colors.primary.default.hex}}", bg = "{{colors.on_primary.default.hex}}" } + +# : ]]] + + +# : Tasks [[[ + +[tasks] +border = { fg = "{{colors.primary.default.hex}}" } +title = {} +hovered = { fg = "{{colors.tertiary_fixed.default.hex}}", underline = true } + +# : ]]] + + +# : Help [[[ + +[help] +on = { fg = "{{colors.on_surface.default.hex}}" } +run = { fg = "{{colors.on_surface.default.hex}}" } +footer = { fg = "{{colors.on_secondary.default.hex}}", bg = "{{colors.secondary.default.hex}}" } + +# : ]]] + + +# : File-specific styles [[[ + +[filetype] + +rules = [ + # Images + { mime = "image/*", fg = "#94e2d5" }, + + # Media + { mime = "{audio,video}/*", fg = "#f9e2af" }, + + # Archives + { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#f5c2e7" }, + + # Documents + { mime = "application/{pdf,doc,rtf}", fg = "#a6e3a1" }, + + # Special files + { name = "*", is = "orphan", bg = "{{colors.error_container.default.hex}}" }, + { name = "*", is = "exec", fg = "{{colors.on_error_container.default.hex}}" }, + + # Fallback + { url = "*", fg = "{{colors.on_surface.default.hex}}" }, + { url = "*/", fg = "{{colors.surface_tint.default.hex}}" }, +] + + +# : ]]] +# : Icon [[[ + +[icon] +# ========================================== +# 1. 预设条件 (最高优先级) +# ========================================== +prepend_conds = [ + # 隐藏的文件夹 (半透明或较暗的颜色) + { if = "dir & hidden", text = "", fg = "{{colors.surface_tint.default.hex | auto_lightness: -20.0}}" }, + + # 普通文件夹 - 提到前面来,确保文件夹图标最先被匹配 + { if = "dir", text = "", fg = "{{colors.surface_tint.default.hex}}" }, + + # 损坏的符号链接 (孤儿) - 使用 Error 色 + { if = "orphan", text = "󰌌", fg = "{{colors.error.default.hex}}" }, + # 正常的符号链接 - 使用 Tertiary 固定色 + { if = "link", text = "󰌷", fg = "{{colors.tertiary_fixed.default.hex}}" }, + + # 可执行文件 - 【关键修复:必须排除文件夹 (!dir)】 + { if = "exec & !dir", text = "󰆧", fg = "{{colors.secondary.default.hex}}" }, + + # 普通隐藏文件 (暗淡的文字色) + { if = "hidden", text = "󰈙", fg = "{{colors.on_surface_variant.default.hex}}" }, +] + +# ========================================== +# 2. 预设目录 (特殊文件夹图标与主色调) +# ========================================== +prepend_dirs = [ + # 使用 Primary 颜色高亮常用主目录 + { name = "Desktop", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "Documents", text = "󰈙", fg = "{{colors.primary.default.hex}}" }, + { name = "Downloads", text = "󰇚", fg = "{{colors.primary.default.hex}}" }, + { name = "Pictures", text = "󰉏", fg = "{{colors.primary.default.hex}}" }, + { name = "Music", text = "󰎆", fg = "{{colors.primary.default.hex}}" }, + { name = "Videos", text = "󰕧", fg = "{{colors.primary.default.hex}}" }, + { name = "Public", text = "", fg = "{{colors.primary.default.hex}}" }, + + # 使用 Secondary 颜色标记开发/配置目录 + { name = ".config", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".git", text = "󰊢", fg = "{{colors.secondary.default.hex}}" }, + { name = "Github", text = "󰊢", fg = "{{colors.secondary.default.hex}}" }, + { name = "src", text = "", fg = "{{colors.secondary.default.hex}}" }, +] + +# ========================================== +# 3. 预设文件扩展名 +# ========================================== +prepend_exts = [ + # 图片/媒体 - 使用 Tertiary 颜色 (提供视觉对比) + { name = "png", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "jpg", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "jpeg", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "webp", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "svg", text = "󰜡", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mp4", text = "󰕧", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mkv", text = "󰕧", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mp3", text = "󰎆", fg = "{{colors.tertiary.default.hex}}" }, + { name = "flac", text = "󰎆", fg = "{{colors.tertiary.default.hex}}" }, + + # 档案/压缩包 - 使用 Error Container 相关的颜色 (以示区别,或可选 tertiary_fixed) + { name = "zip", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "tar", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "gz", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "rar", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "7z", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + + # 常用代码/配置文件 - 使用 Primary 或 On Surface 色 + { name = "conf", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "toml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "yaml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "yml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "json", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "sh", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "bash", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "py", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "rs", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "c", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "cpp", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "md", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "txt", text = "󰈙", fg = "{{colors.on_surface.default.hex}}" }, +] + +# ========================================== +# 4. 预设特定文件名 +# ========================================== +prepend_files = [ + { name = "PKGBUILD", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "README.md", text = "󰂺", fg = "{{colors.secondary.default.hex}}" }, + { name = "Makefile", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".bashrc", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".zshrc", text = "", fg = "{{colors.secondary.default.hex}}" }, +] + +# : ]]] diff --git a/dms-dotfiles/.config/mimeapps.list b/dms-dotfiles/.config/mimeapps.list new file mode 100644 index 0000000..120242b --- /dev/null +++ b/dms-dotfiles/.config/mimeapps.list @@ -0,0 +1,45 @@ +[Default Applications] +image/png=imv.desktop +video/webm=mpv.desktop +application/x-shellscript=vim.desktop +inode/directory=org.gnome.Nautilus.desktop +image/jpeg=imv.desktop +image/gif=imv.desktop +image/webp=imv.desktop +image/bmp=imv.desktop +image/tiff=imv.desktop +video/mp4=mpv.desktop +video/x-matroska=mpv.desktop +video/avi=mpv.desktop +video/quicktime=mpv.desktop +text/plain=vim.desktop +application/vnd.microsoft.portable-executable=wine.desktop +x-scheme-handler/clash=clash-verge.desktop; +x-scheme-handler/clash-verge=clash-verge.desktop; +text/x-csrc=vim.desktop +application/json=vim.desktop +application/x-msdownload=wine.desktop +application/x-zerosize=vim.desktop +x-scheme-handler/mihomo=sparkle.desktop +x-scheme-handler/sparkle=sparkle.desktop +application/octet-stream=vim.desktop + +[Added Associations] +image/png=io.gitlab.theevilskeleton.Upscaler.desktop;satty.desktop;imv.desktop; +video/webm=mpv.desktop; +application/x-shellscript=code.desktop;gvim.desktop;code-oss.desktop;vim.desktop; +video/mp4=com.github.huluti.Curtail.desktop;mpv.desktop; +text/plain=vim.desktop; +application/vnd.microsoft.portable-executable=wine.desktop; +x-scheme-handler/clash=clash-verge.desktop; +x-scheme-handler/clash-verge=clash-verge.desktop; +text/x-csrc=org.gnome.TextEditor.desktop;gvim.desktop;vim.desktop; +application/json=vim.desktop; +application/x-msdownload=wine.desktop; +application/x-zerosize=typora.desktop;vim.desktop; +application/x-bittorrent=transmission-gtk.desktop; +application/octet-stream=vim.desktop; +image/svg+xml=vim.desktop; +image/webp=swayimg.desktop; +application/xml=vim.desktop; +text/markdown=vim.desktop; diff --git a/dms-dotfiles/.config/mpv/config b/dms-dotfiles/.config/mpv/config new file mode 100644 index 0000000..c84be6a --- /dev/null +++ b/dms-dotfiles/.config/mpv/config @@ -0,0 +1 @@ +hwdec=auto-safe diff --git a/dms-dotfiles/.config/niri/animations.kdl b/dms-dotfiles/.config/niri/animations.kdl new file mode 100644 index 0000000..94996db --- /dev/null +++ b/dms-dotfiles/.config/niri/animations.kdl @@ -0,0 +1,74 @@ +// Animation settings. +// The wiki explains how to configure individual animations: +// https://yalter.github.io/niri/Configuration:-Animations +// https://yalter.github.io/niri/Configuration:-Animations +animations { + // 禁用全部动画 + //off + + // 总体动画速度,浮点数(带小数点),默认为1,小于1加快,大于1减慢 + slowdown 1.0 + + + // 切换工作区的动画 + workspace-switch { + // 具体动画设置代码块里的off可以单独禁用此动画 + //off + // spring弹簧动画类型 + // damping-ratio 设置阻尼,默认1.0(仅在触摸板快速滑动时产生回弹),小于1.0会产生回弹,大于1.0会导致bug。 + // stiffness 设置刚度,数值越大动画会越硬越生涩,数值调低更容易产生回弹 + // epsilon 当动画运动速度和距离小于这个值的时候会判定动画停止 + spring damping-ratio=0.82 stiffness=523 epsilon=0.0001 + } + + // 左右切换聚焦的动画 + horizontal-view-movement { + spring damping-ratio=0.86 stiffness=450 epsilon=0.0001 + + } + + // 打开窗口的动画 + window-open { + // 动画时长 + duration-ms 150 + // 动画曲线 + curve "ease-out-expo" + + // niri可用的动画曲线: + // ease-out-quad 比较平缓的加速-->减速曲线,不明显,算是更生动的线性动画 + // ease-out-cubic 较快加速后迅速减速 + // ease-out-expo 超快加速后立马减速 + // linear 纯线性 + // cubic-bezier 自定义动画曲线,通过 curve "cubic-bezier" 0.05 0.7 0.1 1 的方式传入参数使用 + // 设计曲线可以使用 https://easings.co/ + // 预览预设曲线效果可以看 https://easings.net/ + } + + // 关闭窗口 + window-close { + duration-ms 150 + curve "ease-out-quad" + } + + // 移动窗口的动画。包括合并列、上下移动窗口、合并/踢出列等。 + window-movement { + spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 + } + + // 按照预设调整窗口大小时的动画 + window-resize { + spring damping-ratio=1.0 stiffness=750 epsilon=0.0001 + } + + // 开启截图UI的动画 + screenshot-ui-open { + duration-ms 300 + curve "ease-out-quad" + } + + // 开关overview的动画 + overview-open-close { + spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 + } + +} diff --git a/dms-dotfiles/.config/niri/config.kdl b/dms-dotfiles/.config/niri/config.kdl new file mode 100644 index 0000000..4f44c71 --- /dev/null +++ b/dms-dotfiles/.config/niri/config.kdl @@ -0,0 +1,164 @@ +// ██████ ██ ██ ██████ ███████ ██ ███ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ███████ ███████ ██ ██ ██████ ██ ██ ██ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ██████ ██ ██ ██████ ██ ██ ██ ██ ████ + +include "layout.kdl" +include "animations.kdl" +// 截图保存位置 +screenshot-path "~/Pictures/Screenshots/Niri-screenshots/%Y-%m-%d_%H-%M-%S.png" +// 环境变量 + +environment { + //LC_CTYPE "zh_CN.UTF-8" 会导致输入法出现漏字 + //LC_MESSAGES "zh_CN.UTF-8" 让系统全局使用英文,仅主要界面为英文时使用这个环境变量 + // 设置界面语言 + LANGUAGE "zh_CN.UTF-8" + LANG "zh_CN.UTF-8" + LC_CTYPE "en_US.UTF-8" //这一项可以解决漏字问题,但是也许会导致steam之类的x11应用无法使用中文输入法 + // 输入法环境变量 + XMODIFIERS "@im=fcitx" + // qt主题 + QT_QPA_PLATFORMTHEME "gtk3" + QT_QPA_PLATFORMTHEME_QT6 "gtk3" + // 解决quickshell图标主题缺失问题 + QS_ICON_THEME "Adwaita" + // GTK软件使用的渲染器,可以解决n卡双显卡导致的GTK应用启动缓慢问题,AMD或Intel单显卡不需要这行设置可以注释掉 + //GSK_RENDERER "gl" + // 默认文本编辑器 + EDITOR "vim" + +} + +input { + keyboard { + xkb { + } + } + + touchpad { + // off + tap + // dwt + // dwtp + // drag false + // drag-lock + // nautural-scroll可以翻转触摸板滚动的方向 + natural-scroll + //accel-speed -0.5 + // accel-profile "flat" + // scroll-method "two-finger" + // disabled-on-external-mouse + } + + mouse { + + // off + // natural-scroll + // 鼠标速度 + accel-speed -0.15 + // 禁用鼠标加速 + accel-profile "flat" + // scroll-method "no-scroll" + //speed of scroll,like: + //scroll-factor horizontal=2.0 vertical=-5.0 + } + + trackpoint { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "on-button-down" + // scroll-button 273 + // scroll-button-lock + // middle-emulation + } +} +// 自动启动 +// 启动dms,同时禁用它自带的polkit +spawn-at-startup "dms" "run" +// 询问管理员权限功能(身份验证) +spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri & /usr/lib/xdg-desktop-portal-gnome" +// GNOME tracker修复 +spawn-sh-at-startup "systemctl --user set-environment XDG_SESSION_CLASS=user" +// 输入法 +spawn-at-startup "fcitx5" +// 截图音效的守护进程 +spawn-at-startup "~/.config/niri/scripts/screenshot-sound.sh" +// 允许root通过用户的xwayland打开窗口 +spawn-at-startup "xhost" "+si:localuser:root" +// dms 搜索 +spawn-at-startup "dsearch" "serve" + +// 取消启动niri时自动开启快捷键教程 +hotkey-overlay { + // Uncomment this line to disable the "Important Hotkeys" pop-up at startup. + skip-at-startup +} + +// 隐藏窗口标题栏 +prefer-no-csd + +// 默认窗口规则 +window-rule { + // This regular expression is intentionally made as specific as possible, + // since this is the default config, and we want no false positives. + // You can get away with just app-id="wezterm" if you want. + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} +window-rule { + match app-id=r#"^org\.gnome\."# + draw-border-with-background false + geometry-corner-radius 12 + clip-to-geometry true +} +window-rule { + match app-id=r#"^gnome-control-center$"# + match app-id=r#"^pavucontrol$"# + match app-id=r#"^nm-connection-editor$"# + default-column-width { proportion 0.5; } + open-floating false +} +window-rule { + match app-id=r#"^gnome-calculator$"# + match app-id=r#"^galculator$"# + match app-id=r#"^blueman-manager$"# + match app-id=r#"^xdg-desktop-portal$"# + open-floating true +} +window-rule { + match app-id=r#"^steam$"# title=r#"^notificationtoasts_\d+_desktop$"# + default-floating-position x=10 y=10 relative-to="bottom-right" + open-focused false +} +window-rule { + match app-id=r#"^org\.wezfurlong\.wezterm$"# + match app-id="Alacritty" + match app-id="zen" + match app-id="com.mitchellh.ghostty" + match app-id="kitty" + draw-border-with-background false +} +window-rule { + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + match app-id="zoom" + open-floating true +} +// Open dms windows as floating by default +window-rule { + match app-id=r#"org.quickshell$"# + open-floating true +} + +include "dms/binds.kdl" +include "dms/alttab.kdl" +include "dms/supertab.kdl" +include "dms/windowrules.kdl" +include "dms/cursor.kdl" +include "dms/outputs.kdl" +include "dms/colors.kdl" + diff --git a/dms-dotfiles/.config/niri/dms/alttab.kdl b/dms-dotfiles/.config/niri/dms/alttab.kdl new file mode 100644 index 0000000..091ea07 --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/alttab.kdl @@ -0,0 +1,10 @@ +// ! DO NOT EDIT ! + // ! AUTO-GENERATED BY DMS ! + // ! CHANGES WILL BE OVERWRITTEN ! + // ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE ! + + recent-windows { + highlight { + corner-radius 12 + } + } diff --git a/dms-dotfiles/.config/niri/dms/binds.kdl b/dms-dotfiles/.config/niri/dms/binds.kdl new file mode 100644 index 0000000..08b48b5 --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/binds.kdl @@ -0,0 +1,301 @@ +// 整合版 binds.kdl:Shorin 核心配置 + DMS 特有功能与媒体控制 + +binds { + // ========================================================= + // 第一部分:Shorin 核心快捷键配置 + // ========================================================= + + // 显示快捷键教程 + Mod+Shift+Slash hotkey-overlay-title="快捷键教程 Keybind tutorial" { spawn "~/.config/niri/scripts/niri-binds"; } + + Mod+F1 hotkey-overlay-title="开关输入法 Toggle fcitx" {spawn-sh "pkill fcitx5 || fcitx5 ";} + Mod+F5 hotkey-overlay-title="快速存档 Quick save" {spawn "quicksave";} + Mod+F8 hotkey-overlay-title="快速读档 Quick load" {spawn "quickload";} + + // 临时开一个浮动终端 + Mod+Slash hotkey-overlay-title="临时终端 Quick Terminal" {spawn "kitty" "--single-instance" "--class" "quickterminal";} + //打开浏览器 + Mod+B hotkey-overlay-title="浏览器 Browser" { spawn "firefox"; } + + // Suggested binds for running programs: terminal, app launcher, screen locker. + Mod+T hotkey-overlay-title="终端 Terminal" { spawn "kitty" "--single-instance"; } + // settings + Mod+F2 hotkey-overlay-title="设置 Settings" { spawn-sh "dms ipc call settings focusOrToggle";} + Mod+F3 hotkey-overlay-title="录屏 Screen record" { spawn "~/.local/bin/screenrec";} + // 文档管理器。如果有thunar的话会优先打开thunar,没有的话会打开nautilus + Mod+E hotkey-overlay-title="文档管理器 Filemanager" { spawn-sh "thunar || env GSK_RENDERER=gl GTK_IM_MODULE=fcitx nautilus"; } + // 另一个打开nautilus的快捷键,主要是为了在同时安装thunar和nautilus的情况下打开naultilus + Mod+Alt+E hotkey-overlay-title=null {spawn "env" "GSK_RENDERER=gl" "GTK_IM_MODULE=fcitx" "nautilus" "--new-window";} + Mod+Z hotkey-overlay-title="程序菜单 Applauncher" { spawn-sh "dms ipc call spotlight toggle || fuzzel"; } + // dms 壁纸选择 + Mod+Alt+W hotkey-overlay-title="壁纸切换 Wallpaper" { spawn "dms" "ipc" "call" "dankdash" "wallpaper";} + // 随机下载壁纸 + Mod+Shift+F10 hotkey-overlay-title="随机下载壁纸 Random wallpaper" { spawn "~/.local/bin/random-anime-wallpaper-dms";} + + Mod+O hotkey-overlay-title="切换总览界面 toggle overview" repeat=false { toggle-overview; } + Mod+G repeat=false { toggle-overview; } + // 关闭聚焦窗口 + Mod+Q hotkey-overlay-title="关闭聚焦窗口 Close focus window" repeat=false { close-window; } + Alt+F4 hotkey-overlay-title=null repeat=false { close-window; } + + // niri-sidebar扩展相关 + // 警告:这是实验性功能 + // 切换 移动聚焦窗口至侧边栏 (建议配合切换浮动聚焦的快捷键使用,我设置的是super+n) + Mod+Alt+S hotkey-overlay-title="收起窗口 Move to Sidebar" { spawn "niri-sidebar" "toggle-window"; } + Mod+M hotkey-overlay-title="收起窗口 Move to Sidebar" { spawn "niri-sidebar" "toggle-window"; } + // 切换 收起/展开侧边栏 + Mod+Alt+Z hotkey-overlay-title="展开/收起侧边栏 Toggle Sidebar" { spawn "niri-sidebar" "toggle-visibility";} + // 反向排序侧边栏 + Mod+Alt+X hotkey-overlay-title=null { spawn "niri-sidebar" "flip";} + // 重新排列侧边栏中的窗口(侧边栏中的窗口本质是一个浮动窗口,你有时候可能会把它移动到别的地方 + // 例如 ctrl+c居中。此时按下此键可以重新排列) + Mod+Alt+R hotkey-overlay-title="重置侧边栏 Reorder Sidebar" { spawn "niri-sidebar" "reorder"; } + + + // mod+鼠标中键 关闭窗口 + Mod+MouseMiddle { close-window; } + + // 切换聚焦 + // super+方向键 + Mod+Left hotkey-overlay-title=null { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + // super+vim key + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + // 移动colume(列) + // super+ctrl+方向键 + Mod+Ctrl+Left hotkey-overlay-title=null { move-column-left; } + Mod+Ctrl+Right hotkey-overlay-title=null { move-column-right; } + // super+ctrl+vimkey + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + // super+ctrl+a/d 向左/右移动列 + Mod+Ctrl+A { move-column-left; } + Mod+Ctrl+D { move-column-right; } + // mod+S/W 上下切换窗口 + Mod+S { move-window-down; } + Mod+W { move-window-up; } + + // 切换到第一个colume + Mod+Home { focus-column-first; } + // 切换到最后一个colume + Mod+End { focus-column-last; } + // 移动colume到第一个 + Mod+Ctrl+Home { move-column-to-first; } + // 移动colume到最后一个 + Mod+Ctrl+End { move-column-to-last; } + + // 切换显示器聚焦 + // mod+shift+方向键 + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + // mod+shift+vimkey + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + // 跨显示器移动colume + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + Mod+Shift+Ctrl+A { move-column-to-monitor-left; } + Mod+Shift+Ctrl+S { move-column-to-monitor-down; } + Mod+Shift+Ctrl+W { move-column-to-monitor-up; } + Mod+Shift+Ctrl+D { move-column-to-monitor-right; } + + // 移动整个工作区 + // mod+shift跨显示器,alt代表移动整个工作区,再加上三组方向键 + Mod+Shift+Alt+W { move-workspace-to-monitor-up; } + Mod+Shift+Alt+S { move-workspace-to-monitor-down; } + Mod+Shift+Alt+D { move-workspace-to-monitor-right; } + Mod+Shift+Alt+A { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+K { move-workspace-to-monitor-up; } + Mod+Shift+Alt+J { move-workspace-to-monitor-down; } + Mod+Shift+Alt+L { move-workspace-to-monitor-right; } + Mod+Shift+Alt+H { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+Up { move-workspace-to-monitor-up; } + Mod+Shift+Alt+Down { move-workspace-to-monitor-down; } + Mod+Shift+Alt+Right { move-workspace-to-monitor-right; } + Mod+Shift+Alt+Left { move-workspace-to-monitor-left; } + + // mod+shitf+滚轮上下切换工作区 + Mod+Shift+WheelScrollDown hotkey-overlay-title="切换工作区 Change workspaces" cooldown-ms=150 { focus-workspace-down; } + Mod+Shift+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + //再加上ctrl移动窗口 + Mod+Ctrl+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + // mod+滚轮上下 左右切换聚焦 + Mod+WheelScrollDown hotkey-overlay-title="滚轮切换聚焦 Change focus with wheel" { focus-column-right; } + Mod+WheelScrollUp { focus-column-left; } + // 再加上ctrl移动colume + Mod+Ctrl+WheelScrollDown { move-column-right; } + Mod+Ctrl+WheelScrollUp { move-column-left; } + + // mod+左右方括号 移动窗口(不是移动colume,是允许移动到另一个colume的窗口移动) + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + // mod+A/D 同效果 + Mod+A hotkey-overlay-title="向左移动窗口 Move window to left between columes" { consume-or-expel-window-left; } + Mod+D hotkey-overlay-title="向右移动窗口 Move window to right between columes" { consume-or-expel-window-right; } + + // mod+逗号/句号 把窗口合并或者踢出当前的colume + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + // mod+shift+A/D 同效果 + Mod+Shift+A { consume-window-into-column; } + Mod+Shift+D { expel-window-from-column; } + + // 开启colume的标签页模式 + Mod+Shift+X { toggle-column-tabbed-display; } + //Mod+X { toggle-column-tabbed-display; } + // mod+鼠标侧键 上下切换聚焦 + Mod+MouseForward { focus-window-up; } + Mod+MouseBack { focus-window-down; } + + // 按照预设切换窗口宽度 + Mod+R hotkey-overlay-title="按预设切换宽度 Switch width " { switch-preset-column-width; } + // 按照预设切换窗口高度 + Mod+Shift+R { switch-preset-window-height; } + // 重置窗口高度 + Mod+Ctrl+R { reset-window-height; } + + Mod+F hotkey-overlay-title="最大化 maximize" { maximize-column; } + Mod+Alt+F hotkey-overlay-title="全屏 fullscreen" { fullscreen-window; } + + // 增加窗口宽度占满空闲空间 + Mod+Ctrl+F { expand-column-to-available-width; } + // 居中当前聚焦的colume + Mod+C { center-column; } + Mod+Ctrl+C { center-visible-columns; } + + // mod+加减号调整窗口宽度 + Mod+Minus { set-column-width "-5%"; } + Mod+Equal { set-column-width "+5%"; } + + // mod+shift+加减号调整窗口高度 + Mod+Shift+Minus { set-window-height "-5%"; } + Mod+Shift+Equal { set-window-height "+5%"; } + + // 切换浮动模式 + Mod+V hotkey-overlay-title="切换浮动 Toggle floating" { toggle-window-floating; } + // 在浮动模式和非浮动模式之间切换聚焦 + Mod+Shift+V hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + Mod+N hotkey-overlay-title="切换浮动聚焦 Change focus to floating" { switch-focus-between-floating-and-tiling; } + Alt+grave hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + Mod+Alt+N hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + + // 截图相关 + Mod+Alt+A hotkey-overlay-title="选取区域截图 Select screenshot" {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Mod+Alt+Ctrl+A hotkey-overlay-title="截取聚焦窗口 Focus-window screenshot" { spawn-sh "niri msg action screenshot-window && pkill -f -USR1 screenshot-sound.sh"; } + Mod+Alt+Ctrl+Shift+A hotkey-overlay-title="截取显示器 Monitor screenshot" { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Print hotkey-overlay-title=null {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Ctrl+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-window --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Shift+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Mod+Shift+S hotkey-overlay-title="截图后按下此键进行编辑 Edit the image after screenshot" { spawn-sh "wl-paste | satty -f -";} + + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + Mod+Shift+E hotkey-overlay-title="退出niri Quit niri" { quit; } + + + // ========================================================= + // 第二部分:DMS 特有组件、工作区导航与媒体/亮度控制 + // ========================================================= + + // === DMS 特有组件 === + // 电源菜单 (Super+X) + Super+X hotkey-overlay-title="Power Menu: Toggle" { spawn "dms" "ipc" "call" "powermenu" "toggle"; } + // 壁纸选择器 (Mod+Y,作为 Mod+Alt+W 的备用) + Mod+Y hotkey-overlay-title="Browse Wallpapers" { spawn "dms" "ipc" "call" "dankdash" "wallpaper"; } + // 剪贴板 + Mod+Alt+V hotkey-overlay-title="剪贴板 Clipboard" {spawn "dms" "ipc" "call" "clipboard" "toggle";} + // 记事本 + Mod+Shift+N hotkey-overlay-title="记事本 Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; } + // 锁屏 + Mod+Alt+L hotkey-overlay-title="锁屏 Lock Screen" { spawn "dms" "ipc" "call" "lock" "lock"; } + // 锁屏、关闭显示器、休眠 + Mod+Alt+P hotkey-overlay-title="挂起 Suspend" { spawn-sh "niri msg action power-off-monitors && dms ipc call lock lock && systemctl suspend";} + // Ctrl+Alt+Del 呼出任务管理器 + Ctrl+Alt+Delete hotkey-overlay-title="任务管理器 Task Manager" { spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; } + // 创建窗口规则 (Mod+Shift+W) + Mod+Shift+W hotkey-overlay-title="Create window rule" { spawn "dms" "ipc" "call" "window-rules" "toggle"; } + + // === 媒体控制 === + XF86AudioRaiseVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "increment" "3"; } + XF86AudioLowerVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "decrement" "3"; } + XF86AudioMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "mute"; } + XF86AudioMicMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "micmute"; } + XF86AudioPause allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "playPause"; } + XF86AudioPlay allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "playPause"; } + XF86AudioPrev allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "previous"; } + XF86AudioNext allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "next"; } + Ctrl+XF86AudioRaiseVolume allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "increment" "3"; } + Ctrl+XF86AudioLowerVolume allow-when-locked=true { spawn "dms" "ipc" "call" "mpris" "decrement" "3"; } + + // === 亮度控制 === + XF86MonBrightnessUp allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "increment" "5" ""; } + XF86MonBrightnessDown allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "decrement" "5" ""; } + + // === 工作区导航补充 (无冲突项) === + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + // 重命名工作区 + Ctrl+Shift+R hotkey-overlay-title="Rename Workspace" { spawn "dms" "ipc" "call" "workspace-rename" "open"; } + + // === 数字工作区 (1-9) === + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + // === 其他备用快捷键 === + // 备用截图键 + XF86Launch1 { screenshot; } + Ctrl+XF86Launch1 { screenshot-screen; } + Alt+XF86Launch1 { screenshot-window; } + + // 关闭显示器备用 + Mod+Shift+P { power-off-monitors; } +} diff --git a/dms-dotfiles/.config/niri/dms/colors.kdl b/dms-dotfiles/.config/niri/dms/colors.kdl new file mode 100644 index 0000000..e69de29 diff --git a/dms-dotfiles/.config/niri/dms/cursor.kdl b/dms-dotfiles/.config/niri/dms/cursor.kdl new file mode 100644 index 0000000..6d73a15 --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/cursor.kdl @@ -0,0 +1,10 @@ + +// 光标配置 +cursor { + // 主题,存放路径在~/.local/share/icons + xcursor-theme "breeze_cursors" + // 大小 + xcursor-size 30 + // 闲置多少毫秒自动隐藏光标 + hide-after-inactive-ms 15000 +} diff --git a/dms-dotfiles/.config/niri/dms/layout.kdl b/dms-dotfiles/.config/niri/dms/layout.kdl new file mode 100644 index 0000000..431afbf --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/layout.kdl @@ -0,0 +1,22 @@ +// ! DO NOT EDIT ! + // ! AUTO-GENERATED BY DMS ! + // ! CHANGES WILL BE OVERWRITTEN ! + // ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE ! + + layout { + gaps 4 + + border { + width 2 + } + + focus-ring { + width 2 + } + } + window-rule { + geometry-corner-radius 12 + clip-to-geometry true + tiled-state true + draw-border-with-background false + } diff --git a/dms-dotfiles/.config/niri/dms/outputs.kdl b/dms-dotfiles/.config/niri/dms/outputs.kdl new file mode 100644 index 0000000..e69de29 diff --git a/dms-dotfiles/.config/niri/dms/supertab.kdl b/dms-dotfiles/.config/niri/dms/supertab.kdl new file mode 100644 index 0000000..b2854d6 --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/supertab.kdl @@ -0,0 +1,30 @@ +// 带缩略图的alt+tab切换窗口功能(但是我设置的是super+tab,更符合逻辑) +recent-windows { + // 取消//off的注释可以禁用 + // off + debounce-ms 750 + open-delay-ms 150 + + highlight { + + // 缩略图背景内间距 + padding 30 + // 缩略图的背景圆角 + corner-radius 12 + } + + //设置缩略图大小 + previews { + max-height 480 + max-scale 0.2 + } + + binds { + // scope可以设置显示的窗口是当前工作区的、还是当前显示器的、或者显示全部窗口 + Mod+Tab { next-window scope="workspace"; } + Mod+Shift+Tab { previous-window scope="workspace"; } + // grave是波浪键,显示当前应用的所有窗口 + Mod+grave { next-window filter="app-id"; } + Mod+Shift+grave { previous-window filter="app-id"; } + } +} diff --git a/dms-dotfiles/.config/niri/dms/windowrules.kdl b/dms-dotfiles/.config/niri/dms/windowrules.kdl new file mode 100644 index 0000000..f850b7c --- /dev/null +++ b/dms-dotfiles/.config/niri/dms/windowrules.kdl @@ -0,0 +1,133 @@ + +// 全局窗口规则 +window-rule { + // 这一行规则可以让niri变成传统桌面那样的堆叠式桌面。 + //open-floating true + // 圆角 + geometry-corner-radius 8 + // 去掉超出圆角的窗口内容 + clip-to-geometry true + // 全局透明度 + opacity 0.99 + // 禁止边框画到背景里 + draw-border-with-background false +} +// 放进overview里的壁纸程序 +layer-rule { + match namespace="dms:blurwallpaper" + place-within-backdrop true +} +// 以浮动模式打开imv(一个轻量化图片预览程序)且不自动聚焦 +window-rule { + match app-id="imv" + open-floating true + } +// steam 好友列表 +window-rule { + match app-id="steam" title="Friends List" + match app-id="steam" title="好友列表" + default-column-width { proportion 0.20; } + +} +//shorinclip剪贴板TUI +window-rule { + match app-id="shorinclip" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + //min-height 800 + open-floating true + default-floating-position x=0 y=18 relative-to="top" +} +// 以浮动模式打开的软件 +window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + match app-id="com.gabm.satty" + match app-id="media_info" + match app-id="video2gif" + match app-id="floating-term" + match app-id="nm-connection-editor" + match app-id="niri-quick-switch" + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + match app-id="steam" title="Friends List" + match app-id="blueberry.py" title="蓝牙" + match app-id="blueman-manager" + match app-id="flameshot" + match app-id="com.github.hluk.copyq" + match app-id="be.alexandervanhee.gradia" + match app-id="org.pulseaudio.pavucontrol" title="音量控制" + match app-id="org.gnome.clocks" title="时钟" + match app-id="fcitx" title="Fcitx5 Input Window" + match app-id="org.gnome.FileRoller" + match app-id="thunar" title="文件操作进度" + match app-id="waypaper" + match app-id="clipse-gui" + match title="群聊的聊天记录" + match title="聊天记录" + match title="日历" + match title="重命名" + match app-id="btrfs-assistant" + match app-id="markpix" + match title="Steam 设置" + match title="另存为" + match app-id="better_control.py" + match app-id="niri-hotkey-menu" + open-floating true +} +//快速终端和笔记 +window-rule { + match app-id="quickterminal" + open-floating true + default-floating-position x=20 y=20 relative-to="top" +} +window-rule { + match app-id="bluetui" + match app-id="impala" +default-column-width { fixed 800; } + default-window-height { fixed 800; } + open-floating true +} +window-rule { + match app-id="clipse" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + open-floating true +} + // waydroid调整 +window-rule { + match title="gsr ui" + match app-id="waydroid" + open-fullscreen true + open-floating true + focus-ring { + off + } + shadow { + off + } +} +// 取消图片预览、视频播放器之类的透明度,并且以浮动模式打开 +window-rule { + match title="图片查看器" + match title="画中画" + match title="图片和视频" + match title="视频播放器" + open-floating true + opacity 1.0 +} +window-rule { + match app-id="mpv" + match app-id="celluloid" + opacity 1.0 +} + + +window-rule { + // This regular expression is intentionally made as specific as possible, + // since this is the default config, and we want no false positives. + // You can get away with just app-id="wezterm" if you want. + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} + diff --git a/dms-dotfiles/.config/niri/layout.kdl b/dms-dotfiles/.config/niri/layout.kdl new file mode 100644 index 0000000..996f1b5 --- /dev/null +++ b/dms-dotfiles/.config/niri/layout.kdl @@ -0,0 +1,161 @@ + +layout { + + //设置工作区背景颜色 + //background-color "transparent" + // Set gaps around windows in logical pixels. + // 窗口和窗口之间的间距 + gaps 12 + //empty-workspace-above-first + // When to center a column when changing focus, options are: + // - "never", default behavior, focusing an off-screen column will keep at the left + // or right edge of the screen. + // - "always", the focused column will always be centered. + // - "on-overflow", focusing a column will center it if it doesn't fit + // together with the previously focused column. + center-focused-column "never" + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + // 预设窗口宽度 + preset-column-widths { + // Proportion sets the width as a fraction of the output width, taking gaps into account. + // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. + // The default preset widths are 1/3, 1/2 and 2/3 of the output. + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + // Fixed sets the width in logical pixels exactly. + // fixed 1920 + } + + // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. + // preset-window-heights { } + + // You can change the default width of the new windows. + // 默认的窗口宽度 + default-column-width { proportion 0.5; } + // If you leave the brackets empty, the windows themselves will decide their initial width. + // default-column-width {} + + // By default focus ring and border are rendered as a solid background rectangle + // behind windows. That is, they will show up through semitransparent windows. + // This is because windows using client-side decorations can have an arbitrary shape. + // + // If you don't like that, you should uncomment `prefer-no-csd` below. + // Niri will draw focus ring and border *around* windows that agree to omit their + // client-side decorations. + // + // Alternatively, you can override it with a window rule called + // `draw-border-with-background`. + + // You can change how the focus ring looks. + // 聚焦窗口边框,这个的颜色设置在我include进来的colors.kdl里 + focus-ring { + // Uncomment this line to disable the focus ring. + // off + // How many logical pixels the ring extends out from the windows. + width 3 + + // Colors can be set in a variety of ways: + // - CSS named colors: "red" + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + // Color of the ring on the active monitor. + //active-color "@primary" + //active-color "#00000000" + // Color of the ring on inactive monitors. + // + // The focus ring only draws around the active window, so the only place + // where you can see its inactive-color is on other monitors. + //inactive-color "#505050" + + // You can also use gradients. They take precedence over solid colors. + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). + // The angle is the same as in linear-gradient, and is optional, + // defaulting to 180 (top-to-bottom gradient). + // You can use any CSS linear-gradient tool on the web to set these up. + // Changing the color space is also supported, check the wiki for more info. + // + // active-gradient from="#80c8ff" to="#c7ff7f" angle=45 + + // You can also color the gradient relative to the entire view + // of the workspace, rather than relative to just the window itself. + // To do that, set relative-to="workspace-view". + // + //inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can also add a border. It's similar to the focus ring, but always visible. + // 窗口边框 + border { + // The settings are the same as for the focus ring. + // If you enable the border, you probably want to disable the focus ring. + off + + width 4 + active-color "#ffc87f" + inactive-color "#505050" + + // Color of the border around windows that request your attention. + urgent-color "#9b0000" + + // Gradients can use a few different interpolation color spaces. + // For example, this is a pastel rainbow gradient via in="oklch longer hue". + // + // active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue" + + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can enable drop shadows for windows. + // 阴影 + shadow { + // Uncomment the next line to enable shadows. + on + + // By default, the shadow draws only around its window, and not behind it. + // Uncomment this setting to make the shadow draw behind its window. + // + // Note that niri has no way of knowing about the CSD window corner + // radius. It has to assume that windows have square corners, leading to + // shadow artifacts inside the CSD rounded corners. This setting fixes + // those artifacts. + // + // However, instead you may want to set prefer-no-csd and/or + // geometry-corner-radius. Then, niri will know the corner radius and + // draw the shadow correctly, without having to draw it behind the + // window. These will also remove client-side shadows if the window + // draws any. + // + //draw-behind-window true + + // You can change how shadows look. The values below are in logical + // pixels and match the CSS box-shadow properties. + + // Softness controls the shadow blur radius. + softness 20 + + // Spread expands the shadow. + spread 2 + + // Offset moves the shadow relative to the window. + offset x=-4 y=-4 + + // You can also change the shadow color and opacity. + color "rgba(0, 0, 0, 0.7)" + } + + // Struts shrink the area occupied by windows, similarly to layer-shell panels. + // You can think of them as a kind of outer gaps. They are set in logical pixels. + // Left and right struts will cause the next window to the side to always be visible. + // Top and bottom struts will simply add outer gaps in addition to the area occupied by + // layer-shell panels and regular gaps. + + //窗口距离屏幕边缘的距离 + struts { + //left 64 + // right 64 + // top 64 + // bottom 64 + } +} diff --git a/dms-dotfiles/.config/niri/scripts/niri-binds b/dms-dotfiles/.config/niri/scripts/niri-binds new file mode 100644 index 0000000..8ea7601 --- /dev/null +++ b/dms-dotfiles/.config/niri/scripts/niri-binds @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +NIRI_DIR="$HOME/.config/niri" + +# === 界面尺寸设置 (在这里微调,下方的所有终端会自动应用) === +MENU_WIDTH=90 +MENU_HEIGHT=20 + +# 检查目录 +if [[ ! -d "$NIRI_DIR" ]]; then + echo "Error: 找不到配置目录 $NIRI_DIR" + exit 1 +fi + +# 提取并使用 column 对齐 +MENU_ITEMS=$(grep -Rh 'hotkey-overlay-title=' "$NIRI_DIR" --include="*.kdl" | \ + grep -v '^[ \t]*//' | \ + sed -n -E 's/^[ \t]*(.*)[ \t]+hotkey-overlay-title="([^"]+)".*/\1|\2/p' | \ + sed -E 's/[ \t]*\|/\|/' | \ + column -t -s '|') + +if [[ -z "$MENU_ITEMS" ]]; then + echo "没有找到有效的快捷键配置。" + exit 1 +fi + +# Fzf 核心命令 +FZF_CMD="echo \"$MENU_ITEMS\" | fzf --reverse --prompt='󰌌 快捷键: ' --info=hidden --border=none > /dev/null" + +# 动态检测终端并使用对应的参数启动 +if command -v kitty >/dev/null 2>&1; then + kitty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o remember_window_size=no -o initial_window_width=${MENU_WIDTH}c -o initial_window_height=${MENU_HEIGHT}c \ + bash -c "$FZF_CMD" + +elif command -v foot >/dev/null 2>&1; then + foot --app-id "niri-hotkey-menu" --title "快捷键菜单" \ + --window-size-chars=${MENU_WIDTH}x${MENU_HEIGHT} \ + bash -c "$FZF_CMD" + +elif command -v alacritty >/dev/null 2>&1; then + alacritty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o window.dimensions.columns=${MENU_WIDTH} -o window.dimensions.lines=${MENU_HEIGHT} \ + -e bash -c "$FZF_CMD" + +elif command -v wezterm >/dev/null 2>&1; then + wezterm start --class "niri-hotkey-menu" -- bash -c "$FZF_CMD" + +elif [[ -n "$TERMINAL" ]]; then + $TERMINAL -e bash -c "$FZF_CMD" + +else + echo "Error: 未检测到支持的终端模拟器。" + if command -v fuzzel >/dev/null 2>&1; then + # Fuzzel 降级方案也会自动读取顶层变量 + echo "$MENU_ITEMS" | fuzzel --dmenu -i -p "󰌌 快捷键: " -w ${MENU_WIDTH} > /dev/null + fi +fi diff --git a/dms-dotfiles/.config/niri/scripts/screenshot-sound.sh b/dms-dotfiles/.config/niri/scripts/screenshot-sound.sh new file mode 100644 index 0000000..c00f1f0 --- /dev/null +++ b/dms-dotfiles/.config/niri/scripts/screenshot-sound.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# =================配置区域================= +SOUND="/usr/share/sounds/freedesktop/stereo/camera-shutter.oga" +# 这是一个“扳机”文件,存于内存中 (/dev/shm),读写极快 +TRIGGER_FILE="/dev/shm/niri_screenshot_armed" +# 有效期:按下截图键后,多少秒内产生了图片才响?(防止你取消截图后,下次复制图片误响) +TIMEOUT_SEC=15 +# ========================================= + +# 环境检查 +if ! command -v pw-play >/dev/null; then + notify-send "错误: 未找到 pw-play" + exit 1 +fi + +# ========================================= +# 1. 定义信号处理 (收到信号 = 上膛) +# ========================================= +arm_trigger() { + # 更新文件的修改时间,或者创建它 + touch "$TRIGGER_FILE" +} + +# 注册信号:收到 USR1 就执行 arm_trigger +trap arm_trigger SIGUSR1 + +# ========================================= +# 2. 启动剪贴板监听 (后台运行) +# ========================================= +# 只有当剪贴板真正发生变化时,这个子进程才会醒来 +wl-paste --watch bash -c " + # A. 检查是不是图片 + if wl-paste --list-types 2>/dev/null | grep -q 'image/'; then + + # B. 检查有没有“上膛” (文件是否存在) + if [ -f \"$TRIGGER_FILE\" ]; then + + # C. 检查“上膛”是否过期 (利用文件修改时间) + # $(date +%s) - stat获取的时间 + NOW=\$(date +%s) + FILE_TIME=\$(stat -c %Y \"$TRIGGER_FILE\") + DIFF=\$((NOW - FILE_TIME)) + + if [ \$DIFF -lt $TIMEOUT_SEC ]; then + # 조건을 满足:是图片 + 已上膛 + 没过期 + pw-play \"$SOUND\" & + + # D. 销毁扳机 (防止连响) + rm -f \"$TRIGGER_FILE\" + fi + fi + fi +" & +# 获取 wl-paste 的 PID,以便脚本退出时杀掉它 +WATCHER_PID=$! + +# ========================================= +# 3. 守护进程主循环 (0 CPU 占用) +# ========================================= +# 这里的 trap 负责在脚本退出时清理子进程 +trap "kill $WATCHER_PID; exit" INT TERM EXIT + +# 写入当前 PID 方便调试 (可选) +# echo $$ > /tmp/niri-sound.pid + +echo "截图音效服务已启动,等待 SIGUSR1 信号..." + +# 无限睡眠,只响应信号 +while true; do + sleep infinity & wait $! +done diff --git a/dms-dotfiles/.config/satty/config.toml b/dms-dotfiles/.config/satty/config.toml new file mode 100644 index 0000000..63194dc --- /dev/null +++ b/dms-dotfiles/.config/satty/config.toml @@ -0,0 +1,15 @@ +[general] +copy-command = "wl-copy" +focus-toggles-toolbars= true +initial-tool = "brush" +zoom-factor=1.1 + +[font] +family = "Roboto" +style = "Regular" +fallback = [ + "Noto Sans CJK SC", + "Noto Sans CJK JP", + "Noto Sans CJK TC", + "Noto Sans CJK KR" +] diff --git a/dms-dotfiles/.config/xdg-desktop-portal/niri-portals.conf b/dms-dotfiles/.config/xdg-desktop-portal/niri-portals.conf new file mode 100644 index 0000000..f1ac31d --- /dev/null +++ b/dms-dotfiles/.config/xdg-desktop-portal/niri-portals.conf @@ -0,0 +1,8 @@ +[preferred] +default=gnome;gtk; +org.freedesktop.impl.portal.Access=gtk; +org.freedesktop.impl.portal.Notification=gtk; +org.freedesktop.impl.portal.FileChooser=gtk; +org.freedesktop.impl.portal.Secret=gnome-keyring; +org.freedesktop.impl.portal.ScreenCast=gnome +org.freedesktop.impl.portal.Screenshot=gnome diff --git a/dms-dotfiles/.config/xfce4/helpers.rc b/dms-dotfiles/.config/xfce4/helpers.rc new file mode 100644 index 0000000..5226528 --- /dev/null +++ b/dms-dotfiles/.config/xfce4/helpers.rc @@ -0,0 +1 @@ +TerminalEmulator=kitty diff --git a/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml b/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml new file mode 100644 index 0000000..e3e9cd4 --- /dev/null +++ b/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml b/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml new file mode 100644 index 0000000..7ef4d8e --- /dev/null +++ b/dms-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.config/yazi/theme.toml b/dms-dotfiles/.config/yazi/theme.toml new file mode 100644 index 0000000..421aedd --- /dev/null +++ b/dms-dotfiles/.config/yazi/theme.toml @@ -0,0 +1,174 @@ +# : Manager [[[ + +[mgr] +cwd = { fg = "#dee4df" } + +# Find +find_keyword = { fg = "#ffb4ab", bold = true, italic = true, underline = true } +find_position = { fg = "#ffb4ab", bold = true, italic = true } + +# Marker +marker_copied = { fg = "#60c1fc", bg = "#60c1fc" } +marker_cut = { fg = "#c4e8fe", bg = "#c4e8fe" } +marker_marked = { fg = "#ffb4ab", bg = "#ffb4ab" } +marker_selected = { fg = "#a8cbe2", bg = "#a8cbe2" } + +# Count +count_copied = { fg = "#001e2c", bg = "#c4e8fe" } +count_cut = { fg = "#001e2c", bg = "#c4e8fe" } +count_selected = { fg = "#00382b", bg = "#a8cbe2" } + +# Border +border_symbol = "│" +border_style = { fg = "#88d6bb" } + +# : ]]] + + +# : Tabs (New Section) [[[ + +[tabs] +active = { fg = "#00382b", bg = "#88d6bb", bold = true } +inactive = { fg = "#a3f2d7", bg = "#002118" } + +# : ]]] + + +# : Mode [[[ + +[mode] +# Mode +normal_main = { bg = "#88d6bb", fg = "#00382b", bold = true } +normal_alt = { bg = "#3f4945", fg = "#bfc9c3" } + +# Select mode +select_main = { bg = "#b2ccc1", fg = "#1e352d", bold = true } +select_alt = { bg = "#3f4945", fg = "#bfc9c3" } + +# Unset mode +unset_main = { bg = "#a8cbe2", fg = "#0d3446", bold = true } +unset_alt = { bg = "#3f4945", fg = "#bfc9c3" } + +# : ]]] + + +# : Status [[[ + +[status] +sep_left = { open = "🭁", close = "🭠" } +sep_right = { open = "🭁", close = "🭠" } + +# Progress +progress_label = { bold = true } +progress_normal = { fg = "#88d6bb", bg = "#343b38" } +progress_error = { fg = "#ffb4ab", bg = "#343b38" } + +# Permissions +perm_type = { fg = "#5b8a76" } +perm_write = { fg = "#3c85b5" } +perm_read = { fg = "#ff2b12" } +perm_exec = { fg = "#2eadfb" } +perm_sep = { fg = "#1fdd9c" } + +# : ]]] + + +# : Picker (Renamed from Select) [[[ + +[pick] +border = { fg = "#88d6bb" } +active = { fg = "#a8cbe2", bold = true } +inactive = {} + +# : ]]] + + +# : Input [[[ + +[input] +border = { fg = "#88d6bb" } +value = { fg = "#dee4df" } + +# : ]]] + + +# : Completion (Renamed from Completion) [[[ + +[cmp] +border = { fg = "#88d6bb", bg = "#00382b" } + +# : ]]] + + +# : Tasks [[[ + +[tasks] +border = { fg = "#88d6bb" } +title = {} +hovered = { fg = "#c4e8fe", underline = true } + +# : ]]] + + +# : Which [[[ + +[which] +cols = 3 +mask = { bg = "#343b38" } +cand = { fg = "#88d6bb" } +rest = { fg = "#00382b" } +desc = { fg = "#dee4df" } +separator = " ▶ " +separator_style = { fg = "#dee4df" } + +# : ]]] + + +# : Help [[[ + +[help] +on = { fg = "#dee4df" } +run = { fg = "#dee4df" } +footer = { fg = "#1e352d", bg = "#b2ccc1" } + +# : ]]] + + +# : Notify [[[ + +[notify] +title_info = { fg = "#a8cbe2" } +title_warn = { fg = "#88d6bb" } +title_error = { fg = "#ffb4ab" } + +# : ]]] + + +# : File-specific styles [[[ + +[filetype] + +rules = [ + # Images + { mime = "image/*", fg = "#94e2d5" }, + + # Media + { mime = "{audio,video}/*", fg = "#f9e2af" }, + + # Archives + { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#f5c2e7" }, + + # Documents + { mime = "application/{pdf,doc,rtf}", fg = "#a6e3a1" }, + + # Special files + { url = "*", is = "orphan", bg = "#93000a" }, + { url = "*", is = "exec", fg = "#ffdad6" }, + + # Fallback + { url = "*", fg = "#dee4df" }, + { url = "*/", fg = "#88d6bb" }, +] + +# : ]]] + diff --git a/dms-dotfiles/.local/bin/niri-binds b/dms-dotfiles/.local/bin/niri-binds new file mode 100644 index 0000000..8ea7601 --- /dev/null +++ b/dms-dotfiles/.local/bin/niri-binds @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +NIRI_DIR="$HOME/.config/niri" + +# === 界面尺寸设置 (在这里微调,下方的所有终端会自动应用) === +MENU_WIDTH=90 +MENU_HEIGHT=20 + +# 检查目录 +if [[ ! -d "$NIRI_DIR" ]]; then + echo "Error: 找不到配置目录 $NIRI_DIR" + exit 1 +fi + +# 提取并使用 column 对齐 +MENU_ITEMS=$(grep -Rh 'hotkey-overlay-title=' "$NIRI_DIR" --include="*.kdl" | \ + grep -v '^[ \t]*//' | \ + sed -n -E 's/^[ \t]*(.*)[ \t]+hotkey-overlay-title="([^"]+)".*/\1|\2/p' | \ + sed -E 's/[ \t]*\|/\|/' | \ + column -t -s '|') + +if [[ -z "$MENU_ITEMS" ]]; then + echo "没有找到有效的快捷键配置。" + exit 1 +fi + +# Fzf 核心命令 +FZF_CMD="echo \"$MENU_ITEMS\" | fzf --reverse --prompt='󰌌 快捷键: ' --info=hidden --border=none > /dev/null" + +# 动态检测终端并使用对应的参数启动 +if command -v kitty >/dev/null 2>&1; then + kitty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o remember_window_size=no -o initial_window_width=${MENU_WIDTH}c -o initial_window_height=${MENU_HEIGHT}c \ + bash -c "$FZF_CMD" + +elif command -v foot >/dev/null 2>&1; then + foot --app-id "niri-hotkey-menu" --title "快捷键菜单" \ + --window-size-chars=${MENU_WIDTH}x${MENU_HEIGHT} \ + bash -c "$FZF_CMD" + +elif command -v alacritty >/dev/null 2>&1; then + alacritty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o window.dimensions.columns=${MENU_WIDTH} -o window.dimensions.lines=${MENU_HEIGHT} \ + -e bash -c "$FZF_CMD" + +elif command -v wezterm >/dev/null 2>&1; then + wezterm start --class "niri-hotkey-menu" -- bash -c "$FZF_CMD" + +elif [[ -n "$TERMINAL" ]]; then + $TERMINAL -e bash -c "$FZF_CMD" + +else + echo "Error: 未检测到支持的终端模拟器。" + if command -v fuzzel >/dev/null 2>&1; then + # Fuzzel 降级方案也会自动读取顶层变量 + echo "$MENU_ITEMS" | fuzzel --dmenu -i -p "󰌌 快捷键: " -w ${MENU_WIDTH} > /dev/null + fi +fi diff --git a/dms-dotfiles/.local/bin/random-anime-wallpaper-dms b/dms-dotfiles/.local/bin/random-anime-wallpaper-dms new file mode 100644 index 0000000..348ec27 --- /dev/null +++ b/dms-dotfiles/.local/bin/random-anime-wallpaper-dms @@ -0,0 +1,161 @@ +#!/bin/bash +set -euo pipefail + +# ============================================================================= +# 功能描述: +# 从指定 API 获取随机壁纸,强制转换为 PNG 格式,并使用 dms IPC 协议设置为桌面壁纸。 +# +# 核心特性: +# 1. 异步下载与长耗时心跳通知。 +# 2. 健壮性检查:校验文件大小与 MIME 类型,剔除损坏/无效文件。 +# 3. 格式转换:自动将下载的图片(无论原格式)转换为 dms 支持的 PNG 格式。 +# 4. 资源自清洁:根据配置自动清理历史壁纸,保持存储整洁。 +# 5. 解耦设计:更新完毕后触发异步的系统 UI 更新钩子 (matugen, niri等)。 +# +# 选项: +# -k: 保留模式,不清理旧壁纸 +# -s: 静默模式,关闭桌面通知 +# -h: 显示帮助信息 +# +# 依赖: +# curl, file, notify-send, ImageMagick (magick 或 convert) +# ============================================================================= + +# ================= 默认配置 ================= +API_URL="https://t.alcy.cc/pc/" +SAVE_DIR="$HOME/Pictures/Wallpapers/api-random-download" + +# 自动清理时保留最近多少张图片 +KEEP_COUNT=40 + +# 默认开关状态 (可被参数覆盖) +ENABLE_CLEANUP=true +SILENT_MODE=false + +# ================= 参数解析 ================= +usage() { + echo "用法: $(basename "$0") [-k] [-s] [-h]" + echo " -k (Keep) 保留模式:不清理旧壁纸" + echo " -s (Silent) 静默模式:不发送任何 notify-send 通知" + echo " -h 帮助信息" + exit 0 +} + +while getopts "ksh" opt; do + case $opt in + k) ENABLE_CLEANUP=false ;; + s) SILENT_MODE=true ;; + h) usage ;; + *) usage ;; + esac +done + +# ================= 辅助函数 ================= + +# 统一通知函数 (兼容 set -u 处理未传递的 $3) +send_notify() { + if [ "$SILENT_MODE" = false ]; then + notify-send "$1" "$2" ${3:-} + fi +} + +# ================= 主逻辑 ================= + +mkdir -p "$SAVE_DIR" +TIMESTAMP=$(date +%s) +RAW_PATH="${SAVE_DIR}/wall_${TIMESTAMP}_raw.tmp" +FINAL_PATH="${SAVE_DIR}/wall_${TIMESTAMP}.png" + +# --- 1. 下载模块 (带心跳通知) --- + +if [ "$SILENT_MODE" = false ]; then + ( + sleep 8 + while true; do + notify-send "Wallpaper" "Downloading is still in progress..." --expire-time=5000 --icon=drive-harddisk --replace-id=999 || true + sleep 8 + done + ) & + NOTIFY_PID=$! +else + NOTIFY_PID="" +fi + +send_notify "Wallpaper" "Downloading from Alcy..." "--expire-time=5000" + +USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" + +# 执行下载并做严格模式下的安全判断 +if ! curl -L -s -A "$USER_AGENT" --connect-timeout 10 -m 120 -o "$RAW_PATH" "$API_URL"; then + [ -n "${NOTIFY_PID:-}" ] && kill "$NOTIFY_PID" 2>/dev/null || true + send_notify "Wallpaper Error" "Download failed (Network/API Error)" + exit 1 +fi + +# 下载结束,杀掉通知进程 +if [ -n "${NOTIFY_PID:-}" ]; then + kill "$NOTIFY_PID" 2>/dev/null || true +fi + +# 校验文件 (大小) +if [ ! -f "$RAW_PATH" ] || [ "$(wc -c < "$RAW_PATH")" -lt 20480 ]; then + send_notify "Wallpaper Error" "Download failed (File too small/Invalid)" + rm -f "$RAW_PATH" + exit 1 +fi + +# 校验文件 (MIME 类型) +FILE_TYPE=$(file --mime-type -b "$RAW_PATH" || echo "unknown") +if [[ "$FILE_TYPE" != image/* ]]; then + send_notify "Wallpaper Error" "Not an image file ($FILE_TYPE)" + rm -f "$RAW_PATH" + exit 1 +fi + +# --- 2. 格式转换模块 (转为 PNG) --- + +# 检查 ImageMagick 是否存在 (兼容新版 magick 和旧版 convert) +if command -v magick > /dev/null 2>&1; then + IMG_TOOL="magick" +elif command -v convert > /dev/null 2>&1; then + IMG_TOOL="convert" +else + send_notify "Wallpaper Error" "ImageMagick not found. Please install it." + rm -f "$RAW_PATH" + exit 1 +fi + +# 执行转换 +if ! $IMG_TOOL "$RAW_PATH" "$FINAL_PATH"; then + send_notify "Wallpaper Error" "Failed to convert image to PNG format" + rm -f "$RAW_PATH" "$FINAL_PATH" + exit 1 +fi + +# 转换成功,清理原始临时文件 +rm -f "$RAW_PATH" + +# --- 3. 应用模块 (dms ipc call) --- + +dms ipc call wallpaper set "$FINAL_PATH" + +# --- 4. 钩子与清理 --- +( + if [ -x "$HOME/.config/scripts/matugen-update.sh" ]; then + "$HOME/.config/scripts/matugen-update.sh" "$FINAL_PATH" > /dev/null || true + fi + + sleep 0.5 + + if [ -x "$HOME/.config/scripts/niri_set_overview_blur_dark_bg.sh" ]; then + "$HOME/.config/scripts/niri_set_overview_blur_dark_bg.sh" > /dev/null || true + fi + + # 动态清理逻辑 + if [ "$ENABLE_CLEANUP" = true ]; then + DELETE_START=$((KEEP_COUNT + 1)) + cd "$SAVE_DIR" && ls -t | tail -n +"$DELETE_START" | xargs -I {} rm -- {} 2>/dev/null || true + fi +) & + +send_notify "Wallpaper Updated" "PNG applied successfully!" diff --git a/dms-dotfiles/.local/bin/wf-recorder-menu b/dms-dotfiles/.local/bin/wf-recorder-menu new file mode 100644 index 0000000..dc4e8de --- /dev/null +++ b/dms-dotfiles/.local/bin/wf-recorder-menu @@ -0,0 +1,791 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# ================== Runtime state & Persistent Config ================== +APP="wf-recorder" + +# --- 运行时状态 (应在每次会话结束时消失, 遵循 XDG_RUNTIME_DIR) --- +RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$UID}" +STATE_DIR="$RUNTIME_DIR/wfrec" + +PIDFILE="$STATE_DIR/pid" +STARTFILE="$STATE_DIR/start" +SAVEPATH_FILE="$STATE_DIR/save_path" +MODEFILE="$STATE_DIR/mode" # full/region -> tooltip +GIF_MARKER="$STATE_DIR/is_gif" # [NEW] 标记当前录制是否为 GIF 模式 +TICKPIDFILE="$STATE_DIR/tickpid" +WAYBAR_PIDS_CACHE="$STATE_DIR/waybar.pids" + + +# --- 持久性配置 (缓存/设置, 存放在 .cache/ 下, 遵循 XDG_CACHE_HOME) --- +XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}" +CONFIG_DIR="$XDG_CACHE_HOME/wf-recorder-sh" # 目标目录 .cache/wf-recorder-sh + +CFG_CODEC="$CONFIG_DIR/codec" +CFG_FPS="$CONFIG_DIR/framerate" +CFG_AUDIO="$CONFIG_DIR/audio" +CFG_DRM="$CONFIG_DIR/drm_device" +CFG_EXT="$CONFIG_DIR/container_ext" # persisted file format (auto/mp4/mkv/webm) + +# 创建所需的目录 +mkdir -p "$STATE_DIR" +mkdir -p "$CONFIG_DIR" + +# Hold chosen mode +MODE_DECIDED="" +IS_GIF_MODE="false" # [NEW] 临时变量 + +# ================== Tunables (ENV overridable) ================== +# defaults — 默认使用 CPU 编码 (libx264) +_DEFAULT_CODEC="libx264" +_DEFAULT_FRAMERATE="" +_DEFAULT_AUDIO="on" +_DEFAULT_SAVE_EXT="auto" # auto/mp4/mkv/webm + +# --- [NEW] GIF 配置区域 --- +GIF_WIDTH=720 +GIF_FPS=30 +GIF_DITHER_MODE="bayer:bayer_scale=5" +GIF_STATS_MODE="diff" +# ------------------------- + +# load persisted settings if exist +codec_from_file=$(cat "$CFG_CODEC" 2>/dev/null || true) +fps_from_file=$(cat "$CFG_FPS" 2>/dev/null || true) +audio_from_file=$(cat "$CFG_AUDIO" 2>/dev/null || true) +drm_from_file=$(cat "$CFG_DRM" 2>/dev/null || true) +ext_from_file=$(cat "$CFG_EXT" 2>/dev/null || true) + +# priority: ENV > persisted > default +CODEC="${CODEC:-${codec_from_file:-$_DEFAULT_CODEC}}" +FRAMERATE="${FRAMERATE:-${fps_from_file:-$_DEFAULT_FRAMERATE}}" +AUDIO="${AUDIO:-${audio_from_file:-$_DEFAULT_AUDIO}}" +DRM_DEVICE="${DRM_DEVICE:-${drm_from_file:-}}" +SAVE_EXT="${SAVE_EXT:-${ext_from_file:-$_DEFAULT_SAVE_EXT}}" + +TITLE="${TITLE:-}" +SAVE_DIR_ENV="${SAVE_DIR:-}" +SAVE_SUBDIR_FS="${SAVE_SUBDIR_FS:-fullscreen}" + +OUTPUT="${OUTPUT:-}" # e.g. eDP-1 / DP-2 +OUTPUT_SELECT="${OUTPUT_SELECT:-auto}" # off|auto|menu +MENU_TITLE_OUTPUT="${MENU_TITLE_OUTPUT:-}" +MENU_BACKEND="${MENU_BACKEND:-auto}" # auto|fuzzel|wofi|rofi|bemenu|fzf|term + +RECORD_MODE="${RECORD_MODE:-ask}" # ask|full|region +MODE_MENU_TITLE="${MODE_MENU_TITLE:-Select recording mode}" +REC_AREA="${REC_AREA:-}" # "x,y WIDTHxHEIGHT" (optional) +GEOM_IN_NAME="${GEOM_IN_NAME:-off}" + +WAYBAR_POKE="${WAYBAR_POKE:-on}" +WAYBAR_SIG="${WAYBAR_SIG:-9}" +ICON_REC="${ICON_REC:-⏺}" +ICON_IDLE="${ICON_IDLE:-}" + +PKILL_AFTER_STOP="${PKILL_AFTER_STOP:-on}" + +# DEBUG: 若设为 on,则在前台运行 wf-recorder,并把输出直接显示到终端(仅终端,不写文件) +DEBUG="${DEBUG:-off}" + +# ================== Utils ================== +has() { command -v "$1" >/dev/null 2>&1; } + +lang_code() { + local l="${LC_MESSAGES:-${LANG:-en}}" + l="${l,,}"; l="${l%%.*}"; l="${l%%-*}"; l="${l%%_*}" + case "$l" in zh|zh-cn|zh-tw|zh-hk) echo zh ;; ja|jp) echo ja ;; *) echo en ;; esac +} + +msg() { + local id="$1"; shift + case "$(lang_code)" in + zh) + case "$id" in + err_wf_not_found) printf "未找到 wf-recorder" ;; + err_need_slurp) printf "需要 slurp 以进行区域选择" ;; + err_need_ffmpeg) printf "GIF 转换需要 ffmpeg,但未找到。" ;; + warn_drm_ignored) printf "警告:DRM_DEVICE=%s 不存在或不可读,将忽略。" "$@" ;; + warn_invalid_fps) printf "警告:FRAMERATE=\"%s\" 非法,已忽略。" "$@" ;; + warn_render_unreadable) printf "警告:无效的 render 节点:%s" "$@" ;; + cancel_no_mode) printf "已取消:未选择录制模式。" ;; + cancel_no_output) printf "已取消:未选择输出。" ;; + cancel_no_region) printf "已取消:未选择区域。" ;; + warn_multi_outputs_cancel) printf "检测到多个输出但未选择,已取消。" ;; + notif_started_full) printf "开始录制(全屏:%s)→ %s" "$@" ;; + notif_started_region) printf "开始录制(区域)→ %s" "$@" ;; + notif_device_suffix) printf "(设备 %s)" "$@" ;; + notif_saved) printf "已保存:%s" "$@" ;; + notif_stopped) printf "已停止录制。" ;; + notif_processing_gif) printf "正在转换为 GIF,请稍候..." ;; + notif_gif_failed) printf "GIF 转换失败,保留原视频。" ;; + notif_copied) printf "文件已复制" ;; + already_running) printf "already running" ;; + not_running) printf "not running" ;; + title_mode) printf "选择录制模式" ;; + title_output) printf "选择输出" ;; + menu_fullscreen) printf "全屏" ;; + menu_region) printf "选择区域" ;; + menu_gif_region) printf "录制 GIF (区域)" ;; + # settings labels -> "标签:值" + title_settings) printf "设置..." ;; + menu_settings) printf "设置..." ;; + menu_set_codec) printf "编码格式:%s" "$@" ;; + menu_set_fps) printf "帧率:%s" "$@" ;; + menu_set_filefmt) printf "文件格式:%s" "$@" ;; + menu_toggle_audio) printf "音频:%s" "$@" ;; + menu_set_render) printf "渲染设备:%s" "$@" ;; + menu_back) printf "返回" ;; + fps_unlimited) printf "不限制" ;; + render_auto) printf "自动" ;; + ext_auto) printf "自动" ;; + title_select_codec) printf "选择编码格式" ;; + title_select_fps) printf "选择帧率" ;; + title_select_filefmt) printf "选择文件格式" ;; + title_select_render) printf "选择渲染设备(/dev/dri/renderD*)" ;; + mode_full) printf "全屏" ;; + mode_region) printf "区域" ;; + prompt_enter_number) printf "输入编号:" ;; + menu_exit) printf "退出" ;; + *) printf "%s" "$id" ;; + esac + ;; + ja) + case "$id" in + err_wf_not_found) printf "wf-recorder が見つかりません" ;; + err_need_slurp) printf "領域選択には slurp が必要です" ;; + err_need_ffmpeg) printf "GIF変換には ffmpeg が必要ですが、見つかりません。" ;; + warn_drm_ignored) printf "警告:DRM_DEVICE=%s は無視されます。" "$@" ;; + warn_invalid_fps) printf "警告:FRAMERATE=\"%s\" は不正です。" "$@" ;; + warn_render_unreadable) printf "警告:無効なレンダー ノード:%s" "$@" ;; + cancel_no_mode) printf "キャンセル:録画モード未選択。" ;; + cancel_no_output) printf "キャンセル:出力未選択。" ;; + cancel_no_region) printf "キャンセル:領域未選択。" ;; + warn_multi_outputs_cancel) printf "出力が複数ですが未選択のため中止。" ;; + notif_started_full) printf "録画開始(全画面:%s)→ %s" "$@" ;; + notif_started_region) printf "録画開始(領域)→ %s" "$@" ;; + notif_device_suffix) printf "(デバイス %s)" "$@" ;; + notif_saved) printf "保存しました:%s" "$@" ;; + notif_stopped) printf "録画を停止しました。" ;; + notif_processing_gif) printf "GIF に変換中、お待ちください..." ;; + notif_gif_failed) printf "GIF 変換に失敗しました。元の動画を保持します。" ;; + notif_copied) printf "ファイルをコピーしました" ;; + already_running) printf "already running" ;; + not_running) printf "not running" ;; + title_mode) printf "録画モードを選択" ;; + title_output) printf "出力を選択" ;; + menu_fullscreen) printf "全画面" ;; + menu_region) printf "領域選択" ;; + menu_gif_region) printf "GIF録画 (領域)" ;; + # settings labels -> "ラベル:値"(全角コロン) + title_settings) printf "設定..." ;; + menu_settings) printf "設定..." ;; + menu_set_codec) printf "コーデック:%s" "$@" ;; + menu_set_fps) printf "フレームレート:%s" "$@" ;; + menu_set_filefmt) printf "ファイル形式:%s" "$@" ;; + menu_toggle_audio) printf "音声:%s" "$@" ;; + menu_set_render) printf "レンダーデバイス:%s" "$@" ;; + menu_back) printf "戻る" ;; + fps_unlimited) printf "無制限" ;; + render_auto) printf "自動" ;; + ext_auto) printf "自動" ;; + title_select_codec) printf "コーデックを選択" ;; + title_select_fps) printf "フレームレートを選択" ;; + title_select_filefmt) printf "ファイル形式を選択" ;; + title_select_render) printf "レンダーデバイスを選択(/dev/dri/renderD*)" ;; + mode_full) printf "全画面" ;; + mode_region) printf "領域" ;; + prompt_enter_number) printf "番号を入力:" ;; + menu_exit) printf "終了" ;; + *) printf "%s" "$id" ;; + esac + ;; + *) + case "$id" in + err_wf_not_found) printf "wf-recorder not found" ;; + err_need_slurp) printf "slurp required for region selection" ;; + err_need_ffmpeg) printf "ffmpeg is required for GIF conversion but not found." ;; + warn_drm_ignored) printf "Warning: DRM_DEVICE=%s ignored." "$@" ;; + warn_invalid_fps) printf "Warning: invalid FRAMERATE=\"%s\"." "$@" ;; + warn_render_unreadable) printf "Warning: invalid render node: %s" "$@" ;; + cancel_no_mode) printf "Canceled: no recording mode selected." ;; + cancel_no_output) printf "Canceled: no output selected." ;; + cancel_no_region) printf "Canceled: no region selected." ;; + warn_multi_outputs_cancel) printf "Multiple outputs but none selected; canceled." ;; + notif_started_full) printf "Recording started (fullscreen: %s) → %s" "$@" ;; + notif_started_region) printf "Recording started (region) → %s" "$@" ;; + notif_device_suffix) printf " (device %s)" "$@" ;; + notif_saved) printf "Saved: %s" "$@" ;; + notif_stopped) printf "Recording stopped." ;; + notif_processing_gif) printf "Converting to GIF, please wait..." ;; + notif_gif_failed) printf "GIF conversion failed. Original video kept." ;; + notif_copied) printf "File copied" ;; + already_running) printf "already running" ;; + not_running) printf "not running" ;; + title_mode) printf "Select recording mode" ;; + title_output) printf "Select output" ;; + menu_fullscreen) printf "Fullscreen" ;; + menu_region) printf "Region" ;; + menu_gif_region) printf "Record GIF (Region)" ;; + # settings labels -> "Label: Value" + title_settings) printf "Settings..." ;; + menu_settings) printf "Settings..." ;; + menu_set_codec) printf "Codec: %s" "$@" ;; + menu_set_fps) printf "Framerate: %s" "$@" ;; + menu_set_filefmt) printf "File Format: %s" "$@" ;; + menu_toggle_audio) printf "Audio: %s" "$@" ;; + menu_set_render) printf "Render Device: %s" "$@" ;; + menu_back) printf "Back" ;; + fps_unlimited) printf "unlimited" ;; + render_auto) printf "Auto" ;; + ext_auto) printf "Auto" ;; + title_select_codec) printf "Select Codec" ;; + title_select_fps) printf "Select Framerate" ;; + title_select_filefmt) printf "Select File Format" ;; + title_select_render) printf "Select Render Device (/dev/dri/renderD*)" ;; + mode_full) printf "Fullscreen" ;; + mode_region) printf "Region" ;; + prompt_enter_number) printf "Enter number: " ;; + menu_exit) printf "Exit" ;; + *) printf "%s" "$id" ;; + esac + ;; + esac +} + +is_running() { + [[ -r "$PIDFILE" ]] || return 1 + local pid; read -r pid <"$PIDFILE" 2>/dev/null || return 1 + [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null +} +notify() { has notify-send && notify-send "wf-recorder" "$1" || true; } + +signal_waybar() { + local pids + if [[ -r "$WAYBAR_PIDS_CACHE" ]]; then + pids="$(tr '\n' ' ' <"$WAYBAR_PIDS_CACHE")" + if [[ -n "$pids" ]]; then kill -RTMIN+"$WAYBAR_SIG" $pids 2>/dev/null && return 0; fi + fi + pids="$(pgrep -x -u "$UID" waybar 2>/dev/null | tr '\n' ' ')" + [[ -n "$pids" ]] && printf '%s\n' $pids >"$WAYBAR_PIDS_CACHE" + [[ -n "$pids" ]] && kill -RTMIN+"$WAYBAR_SIG" $pids 2>/dev/null || true +} +emit_waybar_signal() { [[ "${WAYBAR_POKE,,}" == "off" ]] && return 0; signal_waybar; } + +start_tick() { + if [[ -f "$TICKPIDFILE" ]]; then + local tpid; read -r tpid <"$TICKPIDFILE" 2>/dev/null || true + [[ -n "$tpid" ]] && kill -TERM "$tpid" 2>/dev/null || true + rm -f "$TICKPIDFILE" + fi + ( + while :; do + [[ -r "$PIDFILE" ]] || break + local p; read -r p <"$PIDFILE" 2>/dev/null || p="" + [[ -n "$p" ]] && kill -0 "$p" 2>/dev/null || break + signal_waybar + sleep 1 + done + ) & echo $! >"$TICKPIDFILE" +} +stop_tick() { + if [[ -f "$TICKPIDFILE" ]]; then + local tpid; read -r tpid <"$TICKPIDFILE" 2>/dev/null || true + [[ -n "$tpid" ]] && kill -TERM "$tpid" 2>/dev/null || true + rm -f "$TICKPIDFILE" + fi +} + +get_save_dir() { + local videos + if has xdg-user-dir; then videos="$(xdg-user-dir VIDEOS 2>/dev/null || true)"; fi + videos="${videos:-"$HOME/Videos"}" + echo "${SAVE_DIR_ENV:-"$videos/wf-recorder"}" +} + +# --- render device helpers --- +list_render_nodes() { + local d + for d in /dev/dri/renderD*; do + [[ -r "$d" ]] && printf '%s\n' "$d" + done 2>/dev/null || true +} +render_display() { + local cur="${1:-}" + if [[ -z "$cur" ]]; then + msg render_auto + else + printf "%s" "$cur" + fi +} +pick_render_device() { + local dev="${DRM_DEVICE:-}" + if [[ -n "$dev" && ! -r "$dev" ]]; then + printf '%s\n' "$(msg warn_render_unreadable "$dev")" >&2 + dev="" + fi + echo -n "$dev" +} + +# --- file format helpers --- +ext_for_codec(){ case "${1,,}" in + *h264*|*hevc*) echo mp4 ;; + *vp9*) echo webm ;; + *av1*) echo mkv ;; + *) echo mp4 ;; +esac; } +choose_ext(){ + local e="${SAVE_EXT,,}" + if [[ -z "$e" || "$e" == "auto" ]]; then + ext_for_codec "$CODEC" + else + case "$e" in mp4|mkv|webm) echo "$e" ;; *) echo mp4 ;; esac + fi +} + +# ================== Menus ================== +__norm() { printf '%s' "$1" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'; } + +_pick_menu_backend() { + local pref="${MENU_BACKEND,,}" + case "$pref" in fuzzel|wofi|rofi|bemenu|fzf|term) : ;; auto|"") pref="auto" ;; *) pref="auto" ;; esac + if [[ "$pref" != "auto" ]]; then + if has "$pref"; then echo "$pref"; else [[ -t 0 ]] && echo "term" || echo "none"; fi + return + fi + for b in fuzzel wofi rofi bemenu fzf; do has "$b" && { echo "$b"; return; }; done + [[ -t 0 ]] && echo "term" || echo "none" +} + +menu_pick() { # $1:title; items... + local title="${1:-Select}"; shift + local items=("$@") + ((${#items[@]})) || return 130 + + local backend; backend="$(_pick_menu_backend)" + local sel rc=130 + case "$backend" in + fuzzel) set +e; sel="$(printf '%s\n' "${items[@]}" | fuzzel --dmenu -p "$title")"; rc=$?; set -e ;; + wofi) set +e; sel="$(printf '%s\n' "${items[@]}" | wofi --dmenu --prompt "$title")"; rc=$?; set -e ;; + rofi) set +e; sel="$(printf '%s\n' "${items[@]}" | rofi -dmenu -p "$title")"; rc=$?; set -e ;; + bemenu) set +e; sel="$(printf '%s\n' "${items[@]}" | bemenu -p "$title")"; rc=$?; set -e ;; + fzf) set +e; sel="$(printf '%s\n' "${items[@]}" | fzf --prompt "$title> ")"; rc=$?; set -e ;; + term) + echo "$title" + local i=1; for it in "${items[@]}"; do printf ' %d) %s\n' "$i" "$it"; ((i++)); done + printf "%s" "$(msg prompt_enter_number)" + local idx; set +e; read -r idx; rc=$?; set -e + if [[ $rc -eq 0 && -n "$idx" && "$idx" =~ ^[0-9]+$ ]]; then + if (( idx>=1 && idx<=${#items[@]} )); then sel="${items[$((idx-1))]}"; rc=0; fi + fi + ;; + none) return 130 ;; + esac + [[ $rc -ne 0 || -z "${sel:-}" ]] && return 130 + printf '%s' "$(__norm "$sel")" +} + +# ---------- Outputs ---------- +list_outputs() { + local raw + if raw="$(wf-recorder -L 2>/dev/null)"; then :; elif has wlr-randr; then raw="$(wlr-randr 2>/dev/null | awk '/^[^ ]/{print $1}')"; else raw=""; fi + awk 'BEGIN{RS="[ \t\r\n,]+"} /^[A-Za-z0-9_.:-]+$/ { if ($0 ~ /^(e?DP|HDMI|DVI|VGA|LVDS|Virtual|XWAYLAND)/) seen[$0]=1 } END{for(k in seen) print k}' <<<"$raw" | sort -u +} +decide_output() { + if [[ -n "$OUTPUT" ]]; then printf '%s' "$OUTPUT"; return 0; fi + local -a outs; mapfile -t outs < <(list_outputs || true) + local out_title; out_title="${MENU_TITLE_OUTPUT:-$(msg title_output)}" + if [[ "${OUTPUT_SELECT}" == "menu" ]] || { [[ "${OUTPUT_SELECT}" == "auto" ]] && ((${#outs[@]} > 1)); }; then + local pick; pick="$(menu_pick "$out_title" "${outs[@]}")" || return 130 + printf '%s' "$pick"; return 0 + fi + if ((${#outs[@]} == 1)); then printf '%s' "${outs[0]}"; else printf '%s\n' "$(msg warn_multi_outputs_cancel)" >&2; return 130; fi +} + +# ---------- Settings ---------- +choose_render_menu() { + local -a nodes + mapfile -t nodes < <(list_render_nodes | sort -V || true) + local auto_item; auto_item="$(msg render_auto)" + local pick + if ! pick="$(menu_pick "$(msg title_select_render)" "$auto_item" "${nodes[@]}")"; then + return 0 + fi + if [[ "$pick" == "$auto_item" ]]; then + DRM_DEVICE="" + rm -f "$CFG_DRM" + return 0 + fi + local sel="$pick" + if [[ -n "$sel" && -r "$sel" ]]; then + DRM_DEVICE="$sel" + printf '%s' "$DRM_DEVICE" >"$CFG_DRM" + else + printf '%s\n' "$(msg warn_render_unreadable "$sel")" >&2 + fi +} + +choose_filefmt_menu() { + local auto_item; auto_item="$(msg ext_auto)" + local pick + if ! pick="$(menu_pick "$(msg title_select_filefmt)" "$auto_item" "mp4" "mkv" "webm")"; then + return 0 + fi + if [[ "$pick" == "$auto_item" ]]; then + SAVE_EXT="auto" + rm -f "$CFG_EXT" + else + case "$pick" in + mp4|mkv|webm) SAVE_EXT="$pick"; printf '%s' "$SAVE_EXT" >"$CFG_EXT" ;; + *) : ;; + esac + fi +} + +show_settings_menu() { + while :; do + local fps_display="${FRAMERATE:-$(msg fps_unlimited)}" + local audio_display="${AUDIO}" + local render_display_now; render_display_now="$(render_display "$DRM_DEVICE")" + local ff_display; if [[ -z "$SAVE_EXT" || "${SAVE_EXT,,}" == "auto" ]]; then ff_display="$(msg ext_auto)"; else ff_display="$SAVE_EXT"; fi + + # ORDER: Framerate → Audio → Codec → File Format → Render → Back + local pick; pick="$(menu_pick "$(msg title_settings)" \ + "$(msg menu_set_fps "$fps_display")" \ + "$(msg menu_toggle_audio "$audio_display")" \ + "$(msg menu_set_codec "$CODEC")" \ + "$(msg menu_set_filefmt "$ff_display")" \ + "$(msg menu_set_render "$render_display_now")" \ + "$(msg menu_back)")" || return 0 + + if [[ "$pick" == "$(msg menu_set_fps "$fps_display")" ]]; then + local newf; newf="$(menu_pick "$(msg title_select_fps)" "60" "30" "120" "144" "165" "240" "$(msg fps_unlimited)")" || continue + if [[ "$newf" == "$(msg fps_unlimited)" ]]; then + FRAMERATE=""; rm -f "$CFG_FPS" + else + if [[ "$newf" =~ ^[0-9]+$ && "$newf" -gt 0 ]]; then FRAMERATE="$newf"; printf '%s' "$FRAMERATE" >"$CFG_FPS"; fi + fi + + elif [[ "$pick" == "$(msg menu_toggle_audio "$audio_display")" ]]; then + if [[ "$AUDIO" == "on" ]]; then AUDIO="off"; else AUDIO="on"; fi + printf '%s' "$AUDIO" >"$CFG_AUDIO" + + elif [[ "$pick" == "$(msg menu_set_codec "$CODEC")" ]]; then + # 仅保留 CPU (libx264) 与所有常见 VAAPI 编码选项,CPU 放在首位 + local newc; newc="$(menu_pick "$(msg title_select_codec)" \ + "libx264" "h264_vaapi" "hevc_vaapi" "av1_vaapi" "vp9_vaapi")" || continue + CODEC="$newc"; printf '%s' "$CODEC" >"$CFG_CODEC" + + elif [[ "$pick" == "$(msg menu_set_filefmt "$ff_display")" ]]; then + choose_filefmt_menu + + elif [[ "$pick" == "$(msg menu_set_render "$render_display_now")" ]]; then + choose_render_menu + + elif [[ "$pick" == "$(msg menu_back)" ]]; then + return 0 + fi + # loop to refresh values instantly + done +} + +# ---------- Mode selection ---------- +decide_mode() { + case "${RECORD_MODE,,}" in + full|fullscreen) MODE_DECIDED="full"; return 0 ;; + region|area) MODE_DECIDED="region"; return 0 ;; + *) ;; + esac + local L_FULL L_REGION L_GIF L_SETTINGS L_EXIT + case "$(lang_code)" in + zh) L_FULL="$(msg menu_fullscreen)"; L_REGION="$(msg menu_region)"; L_GIF="$(msg menu_gif_region)"; L_SETTINGS="$(msg menu_settings)"; L_EXIT="$(msg menu_exit)";; + ja) L_FULL="$(msg menu_fullscreen)"; L_REGION="$(msg menu_region)"; L_GIF="$(msg menu_gif_region)"; L_SETTINGS="$(msg menu_settings)"; L_EXIT="$(msg menu_exit)";; + *) L_FULL="Fullscreen"; L_REGION="Region"; L_GIF="$(msg menu_gif_region)"; L_SETTINGS="$(msg menu_settings)"; L_EXIT="$(msg menu_exit)";; + esac + local title; title="$(msg title_mode)" + while :; do + # ORDER: Fullscreen -> Region -> GIF -> Settings -> Exit + # [FIXED] 调整菜单顺序以匹配图片要求:全屏在最前,GIF在区域之后 + local pick; pick="$(menu_pick "$title" "$L_FULL" "$L_REGION" "$L_GIF" "$L_SETTINGS" "$L_EXIT")" || return 130 + if [[ "$pick" == "$L_FULL" ]]; then MODE_DECIDED="full"; return 0 + elif [[ "$pick" == "$L_REGION" ]]; then MODE_DECIDED="region"; return 0 + elif [[ "$pick" == "$L_GIF" ]]; then MODE_DECIDED="region"; IS_GIF_MODE="true"; return 0 + elif [[ "$pick" == "$L_SETTINGS" ]]; then show_settings_menu; continue + elif [[ "$pick" == "$L_EXIT" ]]; then return 130 + else return 130; fi + done +} + +# ---------- Helpers ---------- +geom_token() { + local g="$1" + awk 'NF==2{split($1,a,","); split($2,b,"x"); + if(a[1]!=""){printf "%sx%s@%s,%s",b[1],b[2],a[1],a[2]}}' <<<"$g" +} +pretty_dur() { + local dur="${1:-0}" + [[ "$dur" =~ ^[0-9]+$ ]] || dur=0 + if ((dur>=3600)); then printf "%d:%02d:%02d" $((dur/3600)) $(((dur%3600)/60)) $((dur%60)) + else printf "%02d:%02d" $((dur/60)) $((dur%60)); fi +} +json_escape() { sed ':a;N;$!ba;s/\\/\\\\/g;s/"/\\"/g;s/\n/\\n/g'; } + +# ================== Start / Stop ================== +start_rec() { + if is_running; then echo "$(msg already_running)"; exit 0; fi + has wf-recorder || { echo "$(msg err_wf_not_found)"; exit 1; } + + MODE_DECIDED="" + IS_GIF_MODE="false" + if ! decide_mode; then + echo "$(msg cancel_no_mode)"; emit_waybar_signal; exit 130 + fi + local mode="$MODE_DECIDED" + + # [NEW] GIF 模式检查 + if [[ "$IS_GIF_MODE" == "true" ]]; then + if ! has ffmpeg; then echo "$(msg err_need_ffmpeg)"; emit_waybar_signal; exit 1; fi + # GIF 模式强制使用 mp4 作为中间格式,因为 mp4 兼容性好且编码速度快 + SAVE_EXT="mp4" + touch "$GIF_MARKER" + else + rm -f "$GIF_MARKER" + fi + + local marker="" output="" GEOM="" gtok="" + local -a args + args=( -c "$CODEC" ) + + local ROOT_DIR TARGET_DIR + ROOT_DIR="$(get_save_dir)" + if [[ "$mode" == "full" ]]; then TARGET_DIR="$ROOT_DIR/${SAVE_SUBDIR_FS}"; else TARGET_DIR="$ROOT_DIR"; fi + mkdir -p "$TARGET_DIR" + + if [[ "$mode" == "full" ]]; then + output="$(decide_output)" || { echo "$(msg cancel_no_output)"; emit_waybar_signal; exit 130; } + [[ -n "$output" ]] && args+=( -o "$output" ) + marker="FS${output:+-$output}" + else + if [[ -n "$REC_AREA" ]]; then + GEOM="$REC_AREA" + else + has slurp || { echo "$(msg err_need_slurp)"; emit_waybar_signal; exit 1; } + set +e; GEOM="$(slurp)"; local rc=$?; set -e + if [[ $rc -ne 0 || -z "${GEOM// /}" ]]; then echo "$(msg cancel_no_region)"; emit_waybar_signal; exit 130; fi + fi + GEOM="$(echo -n "$GEOM" | tr -s '[:space:]' ' ')" + args+=( -g "$GEOM" ) + if [[ "${GEOM_IN_NAME,,}" == "on" ]]; then gtok="$(geom_token "$GEOM")"; marker="REGION${gtok:+-$gtok}"; else marker="REGION"; fi + fi + + local ts safe_title base SAVE_PATH ext + ts="$(date +'%Y-%m-%d-%H%M%S')"; safe_title="${TITLE// /_}" + base="$ts${safe_title:+-$safe_title}-${marker}" + ext="$(choose_ext)" + SAVE_PATH="$TARGET_DIR/$base.$ext" + + args=( --file "$SAVE_PATH" "${args[@]}" ) + + # Render device + local dev; dev="$(pick_render_device)"; [[ -n "$dev" ]] && args+=( -d "$dev" ) + + # Audio + case "$AUDIO" in off|OFF|0|false) ;; on|ON|1|true|"") args+=( --audio ) ;; *) args+=( --audio="$AUDIO" ) ;; esac + + # Framerate + if [[ -n "$FRAMERATE" ]]; then + if [[ "$FRAMERATE" =~ ^[0-9]+$ && "$FRAMERATE" -gt 0 ]]; then args+=( --framerate "$FRAMERATE" ) + else printf '%s\n' "$(msg warn_invalid_fps "$FRAMERATE")" >&2; fi + fi + + # Pixel format + if [[ "$CODEC" == *"_vaapi" ]]; then args+=( -F "scale_vaapi=format=nv12:out_range=full:out_color_primaries=bt709" ) + else args+=( -F "format=yuv420p" ); fi + + # === 不保存日志:仅在 DEBUG=on 时将 wf-recorder 输出到终端 === + if [[ "${DEBUG,,}" == "on" ]]; then + echo "DEBUG=on: running wf-recorder in foreground" + echo "Command: wf-recorder ${args[*]}" + wf-recorder "${args[@]}" 2>&1 & + local pid=$! + echo "$pid" >"$PIDFILE" + date +%s >"$STARTFILE" + echo "$SAVE_PATH" >"$SAVEPATH_FILE" + echo "$mode" >"$MODEFILE" + local note; if [[ "$mode" == "full" ]]; then note="$(msg notif_started_full "$output" "$SAVE_PATH")"; else note="$(msg notif_started_region "$SAVE_PATH")"; fi + [[ -n "$dev" ]] && note+="$(msg notif_device_suffix "$dev")" + echo "$note"; + emit_waybar_signal + start_tick + return 0 + fi + + # 非 DEBUG:后台运行,且不保存任何日志(与原脚本行为相近) + setsid nohup wf-recorder "${args[@]}" >/dev/null 2>&1 & + local pid=$! + echo "$pid" >"$PIDFILE" + date +%s >"$STARTFILE" + echo "$SAVE_PATH" >"$SAVEPATH_FILE" + echo "$mode" >"$MODEFILE" + + local note; if [[ "$mode" == "full" ]]; then note="$(msg notif_started_full "$output" "$SAVE_PATH")"; else note="$(msg notif_started_region "$SAVE_PATH")"; fi + [[ -n "$dev" ]] && note+="$(msg notif_device_suffix "$dev")" + echo "$note"; + emit_waybar_signal + start_tick +} + +stop_rec() { + if ! is_running; then echo "$(msg not_running)"; emit_waybar_signal; exit 0; fi + local pid; read -r pid <"$PIDFILE" + + kill -INT "$pid" 2>/dev/null || true + for _ in {1..40}; do sleep 0.1; is_running || break; done + is_running && kill -TERM "$pid" 2>/dev/null || true + sleep 0.2 + is_running && kill -KILL "$pid" 2>/dev/null || true + + # 停止后清理运行时状态文件 + rm -f "$PIDFILE" "$MODEFILE" + stop_tick + + local save_path=""; [[ -r "$SAVEPATH_FILE" ]] && read -r save_path <"$SAVEPATH_FILE" + + # --- [NEW] GIF Conversion Logic --- + if [[ -f "$GIF_MARKER" ]]; then + rm -f "$GIF_MARKER" + if [[ -n "$save_path" && -f "$save_path" ]]; then + notify "$(msg notif_processing_gif)" + + # [FIXED] 确保 GIF 目录存在: .../wf-recorder/gif/ + local gif_dir="$(get_save_dir)/gif" + mkdir -p "$gif_dir" + + local filename=$(basename "$save_path") + local gif_out="$gif_dir/${filename%.*}.gif" + + # 使用您提供的滤镜字符串 + local filters="fps=$GIF_FPS,scale=$GIF_WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=$GIF_STATS_MODE[p];[s1][p]paletteuse=dither=$GIF_DITHER_MODE" + + # 运行转换,如果成功则删除原文件 + if ffmpeg -y -v error -i "$save_path" -vf "$filters" "$gif_out"; then + rm "$save_path" + save_path="$gif_out" + # 更新保存路径以便后续通知使用 + echo "$save_path" > "$SAVEPATH_FILE" + else + notify "$(msg notif_gif_failed)" + fi + fi + fi + # ----------------------------------- + + if [[ -n "$save_path" && -f "$save_path" ]]; then + # 生成不带后缀的 latest(例如:.../latest) + ln -sf "$(basename "$save_path")" "$(dirname "$save_path")/latest" || true + + # --- [NEW] Auto Copy to Clipboard (as File Object) --- + local cp_note="" + if command -v wl-copy >/dev/null; then + # [CRITICAL FIX] 使用 text/uri-list MIME 类型,并添加 file:// 前缀 + # 这会让剪贴板将其视为一个“文件”,允许在文件管理器或聊天软件中直接粘贴 + echo "file://${save_path}" | wl-copy --type text/uri-list + cp_note=" $(msg notif_copied)" + fi + # ------------------------------------ + + local s; s="$(msg notif_saved "$save_path")${cp_note}"; echo "$s"; notify "$s" + else + local s; s="$(msg notif_stopped)"; echo "$s"; notify "$s" + fi + + if [[ "${PKILL_AFTER_STOP,,}" != "off" ]]; then + for sig in INT TERM KILL; do + pgrep -x -u "$UID" "$APP" >/dev/null || break + pkill -"$sig" -x -u "$UID" "$APP" 2>/dev/null || true + sleep 0.1 + done + fi + emit_waybar_signal +} + +# ================== Waybar JSON/status ================== +tooltip_idle_text() { + case "$(lang_code)" in + zh) cat <<'EOF' +屏幕录制(wf-recorder) +左键:打开录制菜单 +右键:强制关闭 +EOF + ;; + ja) cat <<'EOF' +画面録画(wf-recorder) +左クリック:録画メニューを開く +右クリック:強制停止 +EOF + ;; + *) cat <<'EOF' +Screen recording (wf-recorder) +Left click: open recording menu +Right click: force stop +EOF + ;; + esac +} +tooltip_recording_text() { # $1 elapsed, $2 filepath, $3 mode: full|region + local t="$1" p="${2:-}" m="${3:-}" + local mode_label + case "$m" in full|fullscreen) mode_label="$(msg mode_full)";; region|area) mode_label="$(msg mode_region)";; *) mode_label="";; esac + case "$(lang_code)" in + zh) [[ -n "$p" ]] && { [[ -n "$mode_label" ]] && printf "录制中(%s)\n已用时:%s\n文件:%s\n" "$mode_label" "$t" "$p" || printf "录制中\n已用时:%s\n文件:%s\n" "$t" "$p"; } || { [[ -n "$mode_label" ]] && printf "录制中(%s)\n已用时:%s\n" "$mode_label" "$t" || printf "录制中\n已用时:%s\n" "$t"; } ;; + ja) [[ -n "$p" ]] && { [[ -n "$mode_label" ]] && printf "録画中(%s)\n経過時間:%s\nファイル:%s\n" "$mode_label" "$t" "$p" || printf "録画中\n経過時間:%s\nファイル:%s\n" "$t" "$p"; } || { [[ -n "$mode_label" ]] && printf "録画中(%s)\n経過時間:%s\n" "$mode_label" "$t" || printf "録画中\n経過時間:%s\n" "$t"; } ;; + *) [[ -n "$p" ]] && { [[ -n "$mode_label" ]] && printf "Recording (%s)\nElapsed: %s\nFile: %s\n" "$mode_label" "$t" "$p" || printf "Recording\nElapsed: %s\nFile: %s\n" "$t" "$p"; } || { [[ -n "$mode_label" ]] && printf "Recording (%s)\nElapsed: %s\n" "$mode_label" "$t" || printf "Recording\nElapsed: %s\n" "$t"; } ;; + esac +} +pretty_status_json() { + local text tooltip class alt + if is_running; then + local start=0; [[ -r "$STARTFILE" ]] && read -r start <"$STARTFILE" || true + [[ "$start" =~ ^[0-9]+$ ]] || start=0 + local now dur; now="$(date +%s)"; dur=$((now - start)); (( dur < 0 )) && dur=0 + local t; t="$(pretty_dur "$dur")" + local save_path=""; [[ -r "$SAVEPATH_FILE" ]] && read -r save_path <"$SAVEPATH_FILE" || true + local mode=""; [[ -r "$MODEFILE" ]] && read -r mode <"$MODEFILE" || true + text="$ICON_REC$t" + tooltip="$(tooltip_recording_text "$t" "$save_path" "$mode")" + class="recording"; alt="rec" + else + text="$ICON_IDLE"; tooltip="$(tooltip_idle_text)"; class="idle"; alt="idle" + fi + printf '{"text":"%s","tooltip":"%s","class":"%s","alt":"%s"}\n' \ + "$(printf '%s' "$text" | json_escape)" \ + "$(printf '%s' "$tooltip" | json_escape)" \ + "$class" "$alt" +} +status_rec() { + local json="${1:-}" + if [[ "$json" == "--json" ]]; then + pretty_status_json + else + if is_running; then + local start=0; [[ -r "$STARTFILE" ]] && read -r start <"$STARTFILE" || true + [[ "$start" =~ ^[0-9]+$ ]] || start=0 + local now dur; now="$(date +%s)"; dur=$((now - start)); (( dur < 0 )) && dur=0 + printf "%s%s\n" "$ICON_REC" "$(pretty_dur "$dur")" + else + echo "$ICON_IDLE" + fi + fi +} + +# ================== Main ================== +case "${1:-toggle}" in + start) start_rec ;; + stop) stop_rec ;; + status) status_rec ;; + status-json) status_rec --json ;; + waybar) status_rec --json ;; + is-active) if is_running; then exit 0; else exit 1; fi ;; + toggle) is_running && stop_rec || start_rec ;; + settings) show_settings_menu ;; + *) echo "Usage: $0 {start|stop|toggle|status|status-json|waybar|is-active|settings}"; exit 2 ;; +esac diff --git a/dms-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/dms-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/dms-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00000000000000020006000e7e9ffc3f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00000000000000020006000e7e9ffc3f new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00000000000000020006000e7e9ffc3f @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00008160000006810000408080010102 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00008160000006810000408080010102 new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/00008160000006810000408080010102 @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/03b6e0fcb3499374a867c041f52298f0 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/03b6e0fcb3499374a867c041f52298f0 new file mode 100644 index 0000000..031757c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/03b6e0fcb3499374a867c041f52298f0 @@ -0,0 +1 @@ +circle \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/1081e37283d90000800003c07f3ef6bf b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/1081e37283d90000800003c07f3ef6bf new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/1081e37283d90000800003c07f3ef6bf @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3085a0e285430894940527032f8b26df b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3085a0e285430894940527032f8b26df new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3085a0e285430894940527032f8b26df @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3ecb610c1bf2410f44200f48c40d3599 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3ecb610c1bf2410f44200f48c40d3599 new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/3ecb610c1bf2410f44200f48c40d3599 @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/4498f0e0c1937ffe01fd06f973665830 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/4498f0e0c1937ffe01fd06f973665830 new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/4498f0e0c1937ffe01fd06f973665830 @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/6407b0e94181790501fd1e167b474872 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/6407b0e94181790501fd1e167b474872 new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/6407b0e94181790501fd1e167b474872 @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/640fb0e74195791501fd1ed57b41487f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/640fb0e74195791501fd1ed57b41487f new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/640fb0e74195791501fd1ed57b41487f @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9081237383d90e509aa00f00170e968f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9081237383d90e509aa00f00170e968f new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9081237383d90e509aa00f00170e968f @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9d800788f1b08800ae810202380a0822 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9d800788f1b08800ae810202380a0822 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/9d800788f1b08800ae810202380a0822 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/a2a266d0498c3104214a47bd64ab0fc8 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/a2a266d0498c3104214a47bd64ab0fc8 new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/a2a266d0498c3104214a47bd64ab0fc8 @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/alias b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/alias new file mode 100644 index 0000000..c5e1d34 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/alias differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/all-scroll b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/all-scroll new file mode 100644 index 0000000..416be60 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/all-scroll differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/arrow new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/arrow @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/b66166c04f8c3109214a4fbd64a50fc8 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/b66166c04f8c3109214a4fbd64a50fc8 new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/b66166c04f8c3109214a4fbd64a50fc8 @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_left_corner b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_left_corner new file mode 100644 index 0000000..b30f403 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_left_corner differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_right_corner b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_right_corner new file mode 100644 index 0000000..2889d29 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_right_corner differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_side b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_side new file mode 100644 index 0000000..0d9e4cf Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/bottom_side differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cell b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cell new file mode 100644 index 0000000..4a061d5 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cell differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/center_ptr b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/center_ptr new file mode 100644 index 0000000..1a0ce83 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/center_ptr differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/circle b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/circle new file mode 100644 index 0000000..23bfed6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/circle @@ -0,0 +1 @@ +not-allowed \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/closedhand b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/closedhand new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/closedhand @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/col-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/col-resize new file mode 100644 index 0000000..b24c4ed Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/col-resize differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/color-picker b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/color-picker new file mode 100644 index 0000000..9270cfc Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/color-picker differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/context-menu b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/context-menu new file mode 100644 index 0000000..fe4656b Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/context-menu differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/copy b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/copy new file mode 100644 index 0000000..ee8b530 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/copy differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cross b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cross new file mode 100644 index 0000000..67580a7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/cross @@ -0,0 +1 @@ +crosshair \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crossed_circle b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crossed_circle new file mode 100644 index 0000000..23bfed6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crossed_circle @@ -0,0 +1 @@ +not-allowed \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crosshair b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crosshair new file mode 100644 index 0000000..3eefc29 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/crosshair differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/d9ce0ab605698f320427677b458ad60b b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/d9ce0ab605698f320427677b458ad60b new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/d9ce0ab605698f320427677b458ad60b @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/default b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/default new file mode 100644 index 0000000..de256c3 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/default differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-copy b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-copy new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-copy @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-move b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-move new file mode 100644 index 0000000..4f16ab2 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-move differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-no-drop b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-no-drop new file mode 100644 index 0000000..a2544c3 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-no-drop differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-none b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-none new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/dnd-none @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/down-arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/down-arrow new file mode 100644 index 0000000..f802b73 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/down-arrow differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/draft b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/draft new file mode 100644 index 0000000..9d97792 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/draft differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e29285e634086352946a0e7090d73106 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e29285e634086352946a0e7090d73106 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/e29285e634086352946a0e7090d73106 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ew-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ew-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ew-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fleur b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fleur new file mode 100644 index 0000000..498b0aa Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/fleur differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/forbidden b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/forbidden new file mode 100644 index 0000000..226af18 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/forbidden @@ -0,0 +1 @@ +no-drop \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grab b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grab new file mode 100644 index 0000000..0834bff --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grab @@ -0,0 +1 @@ +openhand \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grabbing b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grabbing new file mode 100644 index 0000000..3e94178 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/grabbing @@ -0,0 +1 @@ +closedhand \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/h_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/h_double_arrow new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/h_double_arrow @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/half-busy b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/half-busy new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/half-busy @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand1 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand1 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand1 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand2 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand2 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/hand2 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/help b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/help new file mode 100644 index 0000000..00a576c Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/help differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ibeam b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ibeam new file mode 100644 index 0000000..f3a3485 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ibeam @@ -0,0 +1 @@ +text \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left-arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left-arrow new file mode 100644 index 0000000..e8cbddb Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left-arrow differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_help b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_help new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_help @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_watch b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_watch new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_ptr_watch @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_side b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_side new file mode 100644 index 0000000..69be726 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/left_side differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/link b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/link new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/link @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/move b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/move new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/move @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/n-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/n-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/n-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ne-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ne-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ne-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nesw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nesw-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nesw-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/no-drop b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/no-drop new file mode 100644 index 0000000..18dc9a0 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/no-drop differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/not-allowed b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/not-allowed new file mode 100644 index 0000000..d42f2a4 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/not-allowed differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ns-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ns-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/ns-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nw-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nw-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nwse-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nwse-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/nwse-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/openhand b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/openhand new file mode 100644 index 0000000..4de95d8 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/openhand differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pencil b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pencil new file mode 100644 index 0000000..0cfc5b1 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pencil differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pirate b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pirate new file mode 100644 index 0000000..d51c4dc Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pirate differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/plus b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/plus new file mode 100644 index 0000000..d1b147b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/plus @@ -0,0 +1 @@ +cell \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointer b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointer new file mode 100644 index 0000000..28f794a Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointer differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointing_hand b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointing_hand new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/pointing_hand @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/progress b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/progress new file mode 100644 index 0000000..c327674 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/progress differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/question_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/question_arrow new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/question_arrow @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right-arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right-arrow new file mode 100644 index 0000000..b197bef Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right-arrow differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_ptr b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_ptr new file mode 100644 index 0000000..8816d18 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_ptr differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_side b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_side new file mode 100644 index 0000000..5703fb9 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/right_side differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/row-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/row-resize new file mode 100644 index 0000000..5675435 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/row-resize differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/s-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/s-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/s-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_h_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_h_double_arrow new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_h_double_arrow @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_v_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_v_double_arrow new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sb_v_double_arrow @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/se-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/se-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/se-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-bdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-bdiag new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-bdiag @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-fdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-fdiag new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-fdiag @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-hor b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-hor new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-hor @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-ver b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-ver new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size-ver @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_all b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_all new file mode 100644 index 0000000..147f744 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_all @@ -0,0 +1 @@ +fleur \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_bdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_bdiag new file mode 100644 index 0000000..5490013 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_bdiag differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_fdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_fdiag new file mode 100644 index 0000000..470deb7 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_fdiag differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_hor b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_hor new file mode 100644 index 0000000..8becb12 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_hor differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_ver b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_ver new file mode 100644 index 0000000..eb91508 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/size_ver differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_h b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_h new file mode 100644 index 0000000..3ce0e22 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_h @@ -0,0 +1 @@ +col-resize \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_v b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_v new file mode 100644 index 0000000..93d9c89 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/split_v @@ -0,0 +1 @@ +row-resize \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sw-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/sw-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/tcross b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/tcross new file mode 100644 index 0000000..67580a7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/tcross @@ -0,0 +1 @@ +crosshair \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/text b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/text new file mode 100644 index 0000000..ee0f092 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/text differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_arrow new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_arrow @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_corner b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_corner new file mode 100644 index 0000000..090791e Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_left_corner differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_right_corner b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_right_corner new file mode 100644 index 0000000..fdd30d3 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_right_corner differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_side b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_side new file mode 100644 index 0000000..949f619 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/top_side differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/up-arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/up-arrow new file mode 100644 index 0000000..9b4ad7c Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/up-arrow differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/v_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/v_double_arrow new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/v_double_arrow @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/vertical-text b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/vertical-text new file mode 100644 index 0000000..8791d15 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/vertical-text differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/w-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/w-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/w-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wait b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wait new file mode 100644 index 0000000..d9c1db6 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wait differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/watch b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/watch new file mode 100644 index 0000000..fd80437 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/watch @@ -0,0 +1 @@ +wait \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wayland-cursor b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wayland-cursor new file mode 100644 index 0000000..47071df Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/wayland-cursor differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/whats_this b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/whats_this new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/whats_this @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/x-cursor b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/x-cursor new file mode 100644 index 0000000..4da5889 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/x-cursor differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/xterm b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/xterm new file mode 100644 index 0000000..f3a3485 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/xterm @@ -0,0 +1 @@ +text \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-in b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-in new file mode 100644 index 0000000..c37c184 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-in differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-out b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-out new file mode 100644 index 0000000..3144648 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors/zoom-out differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00000000000000020006000e7e9ffc3f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00000000000000020006000e7e9ffc3f new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00000000000000020006000e7e9ffc3f @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00008160000006810000408080010102 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00008160000006810000408080010102 new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/00008160000006810000408080010102 @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/03b6e0fcb3499374a867c041f52298f0 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/03b6e0fcb3499374a867c041f52298f0 new file mode 100644 index 0000000..031757c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/03b6e0fcb3499374a867c041f52298f0 @@ -0,0 +1 @@ +circle \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/08e8e1c95fe2fc01f976f1e063a24ccd b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/08e8e1c95fe2fc01f976f1e063a24ccd new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/08e8e1c95fe2fc01f976f1e063a24ccd @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/1081e37283d90000800003c07f3ef6bf b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/1081e37283d90000800003c07f3ef6bf new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/1081e37283d90000800003c07f3ef6bf @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3085a0e285430894940527032f8b26df b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3085a0e285430894940527032f8b26df new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3085a0e285430894940527032f8b26df @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3ecb610c1bf2410f44200f48c40d3599 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3ecb610c1bf2410f44200f48c40d3599 new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/3ecb610c1bf2410f44200f48c40d3599 @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/4498f0e0c1937ffe01fd06f973665830 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/4498f0e0c1937ffe01fd06f973665830 new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/4498f0e0c1937ffe01fd06f973665830 @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/5c6cd98b3f3ebcb1f9c7f1c204630408 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/5c6cd98b3f3ebcb1f9c7f1c204630408 new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/5c6cd98b3f3ebcb1f9c7f1c204630408 @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/6407b0e94181790501fd1e167b474872 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/6407b0e94181790501fd1e167b474872 new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/6407b0e94181790501fd1e167b474872 @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/640fb0e74195791501fd1ed57b41487f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/640fb0e74195791501fd1ed57b41487f new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/640fb0e74195791501fd1ed57b41487f @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9081237383d90e509aa00f00170e968f b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9081237383d90e509aa00f00170e968f new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9081237383d90e509aa00f00170e968f @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9d800788f1b08800ae810202380a0822 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9d800788f1b08800ae810202380a0822 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/9d800788f1b08800ae810202380a0822 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/a2a266d0498c3104214a47bd64ab0fc8 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/a2a266d0498c3104214a47bd64ab0fc8 new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/a2a266d0498c3104214a47bd64ab0fc8 @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/alias.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/alias.svg new file mode 100644 index 0000000..a0d595e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/alias.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/metadata.json new file mode 100644 index 0000000..708e997 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/alias/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "alias.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/all-scroll.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/all-scroll.svg new file mode 100644 index 0000000..3d3d23c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/all-scroll.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/metadata.json new file mode 100644 index 0000000..038d569 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/all-scroll/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "all-scroll.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/arrow new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/arrow @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/b66166c04f8c3109214a4fbd64a50fc8 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/b66166c04f8c3109214a4fbd64a50fc8 new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/b66166c04f8c3109214a4fbd64a50fc8 @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/bottom_left_corner.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/bottom_left_corner.svg new file mode 100644 index 0000000..708b014 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/bottom_left_corner.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/metadata.json new file mode 100644 index 0000000..487e23d --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_left_corner/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "bottom_left_corner.svg", + "hotspot_x": 5.15, + "hotspot_y": 26.85, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/bottom_right_corner.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/bottom_right_corner.svg new file mode 100644 index 0000000..d0980de --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/bottom_right_corner.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/metadata.json new file mode 100644 index 0000000..ef34937 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_right_corner/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "bottom_right_corner.svg", + "hotspot_x": 26.85, + "hotspot_y": 26.85, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/bottom_side.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/bottom_side.svg new file mode 100644 index 0000000..ecc6bc0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/bottom_side.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/metadata.json new file mode 100644 index 0000000..38d5fd7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/bottom_side/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "bottom_side.svg", + "hotspot_x": 16.5, + "hotspot_y": 27.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/cell.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/cell.svg new file mode 100644 index 0000000..2851e72 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/cell.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/metadata.json new file mode 100644 index 0000000..f09e6c9 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cell/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "cell.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/center_ptr.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/center_ptr.svg new file mode 100644 index 0000000..09f8f20 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/center_ptr.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/metadata.json new file mode 100644 index 0000000..5454ca0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/center_ptr/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "center_ptr.svg", + "hotspot_x": 16.5, + "hotspot_y": 4.14, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/circle b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/circle new file mode 100644 index 0000000..23bfed6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/circle @@ -0,0 +1 @@ +not-allowed \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/closedhand b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/closedhand new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/closedhand @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/col-resize.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/col-resize.svg new file mode 100644 index 0000000..5271e6f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/col-resize.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/metadata.json new file mode 100644 index 0000000..139721b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/col-resize/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "col-resize.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/color-picker.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/color-picker.svg new file mode 100644 index 0000000..10bec4f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/color-picker.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/metadata.json new file mode 100644 index 0000000..081e4f6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/color-picker/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "color-picker.svg", + "hotspot_x": 3.5, + "hotspot_y": 28.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/context-menu.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/context-menu.svg new file mode 100644 index 0000000..1be7682 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/context-menu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/metadata.json new file mode 100644 index 0000000..70bb3d0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/context-menu/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "context-menu.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/copy.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/copy.svg new file mode 100644 index 0000000..d1e63bc --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/copy.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/metadata.json new file mode 100644 index 0000000..f9ed45c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/copy/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "copy.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cross b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cross new file mode 100644 index 0000000..67580a7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/cross @@ -0,0 +1 @@ +crosshair \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crossed_circle b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crossed_circle new file mode 100644 index 0000000..23bfed6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crossed_circle @@ -0,0 +1 @@ +not-allowed \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/crosshair.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/crosshair.svg new file mode 100644 index 0000000..01c2658 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/crosshair.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/metadata.json new file mode 100644 index 0000000..03a0827 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/crosshair/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "crosshair.svg", + "hotspot_x": 17.5, + "hotspot_y": 17.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/d9ce0ab605698f320427677b458ad60b b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/d9ce0ab605698f320427677b458ad60b new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/d9ce0ab605698f320427677b458ad60b @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/default.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/default.svg new file mode 100644 index 0000000..1a85004 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/default.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/metadata.json new file mode 100644 index 0000000..b92a3e1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/default/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "default.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-copy b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-copy new file mode 100644 index 0000000..88740b2 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-copy @@ -0,0 +1 @@ +copy \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/dnd-move.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/dnd-move.svg new file mode 100644 index 0000000..eb57fe5 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/dnd-move.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/metadata.json new file mode 100644 index 0000000..e717241 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-move/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "dnd-move.svg", + "hotspot_x": 16, + "hotspot_y": 16, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/dnd-no-drop.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/dnd-no-drop.svg new file mode 100644 index 0000000..126725f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/dnd-no-drop.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/metadata.json new file mode 100644 index 0000000..6ddebfc --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-no-drop/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "dnd-no-drop.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-none b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-none new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/dnd-none @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/down-arrow.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/down-arrow.svg new file mode 100644 index 0000000..d7804d6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/down-arrow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/metadata.json new file mode 100644 index 0000000..2dedae1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/down-arrow/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "down-arrow.svg", + "hotspot_x": 16.5, + "hotspot_y": 27.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/draft.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/draft.svg new file mode 100644 index 0000000..89dda5e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/draft.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/metadata.json new file mode 100644 index 0000000..0fd6f39 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/draft/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "draft.svg", + "hotspot_x": 3.5, + "hotspot_y": 28.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e29285e634086352946a0e7090d73106 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e29285e634086352946a0e7090d73106 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/e29285e634086352946a0e7090d73106 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ew-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ew-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ew-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fcf21c00b30f7e3f83fe0dfd12e71cff b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fcf21c00b30f7e3f83fe0dfd12e71cff new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fcf21c00b30f7e3f83fe0dfd12e71cff @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/fleur.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/fleur.svg new file mode 100644 index 0000000..698c192 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/fleur.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/metadata.json new file mode 100644 index 0000000..271cc11 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/fleur/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "fleur.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/forbidden b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/forbidden new file mode 100644 index 0000000..226af18 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/forbidden @@ -0,0 +1 @@ +no-drop \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grab b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grab new file mode 100644 index 0000000..0834bff --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grab @@ -0,0 +1 @@ +openhand \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grabbing b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grabbing new file mode 100644 index 0000000..3e94178 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/grabbing @@ -0,0 +1 @@ +closedhand \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/h_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/h_double_arrow new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/h_double_arrow @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/half-busy b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/half-busy new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/half-busy @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand1 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand1 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand1 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand2 b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand2 new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/hand2 @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/help.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/help.svg new file mode 100644 index 0000000..05f910b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/help.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/metadata.json new file mode 100644 index 0000000..62e711e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/help/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "help.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ibeam b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ibeam new file mode 100644 index 0000000..f3a3485 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ibeam @@ -0,0 +1 @@ +text \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/left-arrow.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/left-arrow.svg new file mode 100644 index 0000000..ccea71d --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/left-arrow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/metadata.json new file mode 100644 index 0000000..2e6a9a0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left-arrow/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "left-arrow.svg", + "hotspot_x": 4.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_help b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_help new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_help @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_watch b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_watch new file mode 100644 index 0000000..a305d5c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_ptr_watch @@ -0,0 +1 @@ +progress \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/left_side.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/left_side.svg new file mode 100644 index 0000000..e3e1b49 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/left_side.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/metadata.json new file mode 100644 index 0000000..5eb739b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/left_side/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "left_side.svg", + "hotspot_x": 4.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/link b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/link new file mode 100644 index 0000000..c4ad821 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/link @@ -0,0 +1 @@ +alias \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/move b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/move new file mode 100644 index 0000000..cbb52c1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/move @@ -0,0 +1 @@ +dnd-move \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/n-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/n-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/n-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ne-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ne-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ne-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nesw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nesw-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nesw-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/metadata.json new file mode 100644 index 0000000..7f4c235 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "no-drop.svg", + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/no-drop.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/no-drop.svg new file mode 100644 index 0000000..c877078 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/no-drop/no-drop.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/metadata.json new file mode 100644 index 0000000..9e749d8 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "not-allowed.svg", + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/not-allowed.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/not-allowed.svg new file mode 100644 index 0000000..7f4d559 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/not-allowed/not-allowed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ns-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ns-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/ns-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nw-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nw-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nwse-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nwse-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/nwse-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/metadata.json new file mode 100644 index 0000000..6e8bcd3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "openhand.svg", + "hotspot_x": 16, + "hotspot_y": 16, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/openhand.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/openhand.svg new file mode 100644 index 0000000..63f37c7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/openhand/openhand.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/metadata.json new file mode 100644 index 0000000..5d53034 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "pencil.svg", + "hotspot_x": 3, + "hotspot_y": 29, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/pencil.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/pencil.svg new file mode 100644 index 0000000..bbe8c8e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pencil/pencil.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/metadata.json new file mode 100644 index 0000000..ecc83cc --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "pirate.svg", + "hotspot_x": 15, + "hotspot_y": 15, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/pirate.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/pirate.svg new file mode 100644 index 0000000..dc67939 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pirate/pirate.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/plus b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/plus new file mode 100644 index 0000000..d1b147b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/plus @@ -0,0 +1 @@ +cell \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/metadata.json new file mode 100644 index 0000000..1cace77 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "pointer.svg", + "hotspot_x": 16.5, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/pointer.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/pointer.svg new file mode 100644 index 0000000..0987bb1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointer/pointer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointing_hand b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointing_hand new file mode 100644 index 0000000..5ba3f42 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/pointing_hand @@ -0,0 +1 @@ +pointer \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/metadata.json new file mode 100644 index 0000000..dfecd37 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/metadata.json @@ -0,0 +1,163 @@ +[ + { + "filename": "progress-01.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-02.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-03.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-04.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-05.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-06.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-07.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-08.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-09.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-10.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-11.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-12.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-13.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-14.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-15.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-16.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-17.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-18.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-19.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-20.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-21.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-22.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + }, + { + "filename": "progress-23.svg", + "delay": 30, + "hotspot_x": 4, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-01.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-01.svg new file mode 100644 index 0000000..bb36243 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-01.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-02.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-02.svg new file mode 100644 index 0000000..07d97f7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-02.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-03.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-03.svg new file mode 100644 index 0000000..cc33d88 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-03.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-04.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-04.svg new file mode 100644 index 0000000..ad11405 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-04.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-05.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-05.svg new file mode 100644 index 0000000..ecad901 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-05.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-06.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-06.svg new file mode 100644 index 0000000..d49ea02 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-06.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-07.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-07.svg new file mode 100644 index 0000000..c378ad5 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-07.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-08.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-08.svg new file mode 100644 index 0000000..a58ef6b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-08.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-09.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-09.svg new file mode 100644 index 0000000..8b306fa --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-09.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-10.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-10.svg new file mode 100644 index 0000000..607f414 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-10.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-11.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-11.svg new file mode 100644 index 0000000..692af33 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-11.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-12.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-12.svg new file mode 100644 index 0000000..ed91162 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-12.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-13.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-13.svg new file mode 100644 index 0000000..59c7ad8 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-13.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-14.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-14.svg new file mode 100644 index 0000000..3bb0f0f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-14.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-15.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-15.svg new file mode 100644 index 0000000..01dac9e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-15.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-16.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-16.svg new file mode 100644 index 0000000..888538e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-16.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-17.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-17.svg new file mode 100644 index 0000000..8f63613 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-17.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-18.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-18.svg new file mode 100644 index 0000000..d1a012a --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-18.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-19.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-19.svg new file mode 100644 index 0000000..f0da7ee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-19.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-20.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-20.svg new file mode 100644 index 0000000..b8fe8b7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-20.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-21.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-21.svg new file mode 100644 index 0000000..5c0ac4b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-21.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-22.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-22.svg new file mode 100644 index 0000000..560502c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-22.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-23.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-23.svg new file mode 100644 index 0000000..31bdb32 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/progress/progress-23.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/question_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/question_arrow new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/question_arrow @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/metadata.json new file mode 100644 index 0000000..cc4af8f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "right-arrow.svg", + "hotspot_x": 27.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/right-arrow.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/right-arrow.svg new file mode 100644 index 0000000..4cd6cac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right-arrow/right-arrow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/metadata.json new file mode 100644 index 0000000..6d3a0ea --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "right_ptr.svg", + "hotspot_x": 28, + "hotspot_y": 4, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/right_ptr.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/right_ptr.svg new file mode 100644 index 0000000..1349ba6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_ptr/right_ptr.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/metadata.json new file mode 100644 index 0000000..47e6b60 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "right_side.svg", + "hotspot_x": 27.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/right_side.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/right_side.svg new file mode 100644 index 0000000..2cc7ce5 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/right_side/right_side.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/metadata.json new file mode 100644 index 0000000..8b0ebdb --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "row-resize.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/row-resize.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/row-resize.svg new file mode 100644 index 0000000..69ddf1b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/row-resize/row-resize.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/s-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/s-resize new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/s-resize @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_h_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_h_double_arrow new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_h_double_arrow @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_v_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_v_double_arrow new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sb_v_double_arrow @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/se-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/se-resize new file mode 100644 index 0000000..913bbc3 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/se-resize @@ -0,0 +1 @@ +size_fdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-bdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-bdiag new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-bdiag @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-fdiag b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-fdiag new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-fdiag @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-hor b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-hor new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-hor @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-ver b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-ver new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size-ver @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_all b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_all new file mode 100644 index 0000000..147f744 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_all @@ -0,0 +1 @@ +fleur \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/metadata.json new file mode 100644 index 0000000..5fa7d0c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "size_bdiag.svg", + "hotspot_x": 16.5003367113, + "hotspot_y": 15.499780617600003, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/size_bdiag.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/size_bdiag.svg new file mode 100644 index 0000000..61179b1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_bdiag/size_bdiag.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/metadata.json new file mode 100644 index 0000000..ca2bf04 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "size_fdiag.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/size_fdiag.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/size_fdiag.svg new file mode 100644 index 0000000..de9ec28 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_fdiag/size_fdiag.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/metadata.json new file mode 100644 index 0000000..9d2150d --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "size_hor.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/size_hor.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/size_hor.svg new file mode 100644 index 0000000..b4400d1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_hor/size_hor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/metadata.json new file mode 100644 index 0000000..ae303b7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "size_ver.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/size_ver.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/size_ver.svg new file mode 100644 index 0000000..5d62794 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/size_ver/size_ver.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_h b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_h new file mode 100644 index 0000000..3ce0e22 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_h @@ -0,0 +1 @@ +col-resize \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_v b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_v new file mode 100644 index 0000000..93d9c89 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/split_v @@ -0,0 +1 @@ +row-resize \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sw-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sw-resize new file mode 100644 index 0000000..e0935e6 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/sw-resize @@ -0,0 +1 @@ +size_bdiag \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/tcross b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/tcross new file mode 100644 index 0000000..67580a7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/tcross @@ -0,0 +1 @@ +crosshair \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/metadata.json new file mode 100644 index 0000000..0ce55ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "text.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/text.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/text.svg new file mode 100644 index 0000000..7a107ba --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/text/text.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_arrow new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_arrow @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/metadata.json new file mode 100644 index 0000000..c2c04a8 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "top_left_corner.svg", + "hotspot_x": 5.5, + "hotspot_y": 4.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/top_left_corner.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/top_left_corner.svg new file mode 100644 index 0000000..1b536ae --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_left_corner/top_left_corner.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/metadata.json new file mode 100644 index 0000000..97c2b38 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "top_right_corner.svg", + "hotspot_x": 26.5, + "hotspot_y": 4.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/top_right_corner.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/top_right_corner.svg new file mode 100644 index 0000000..63bc26d --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_right_corner/top_right_corner.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/metadata.json new file mode 100644 index 0000000..5f7f3df --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "top_side.svg", + "hotspot_x": 16.5, + "hotspot_y": 4.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/top_side.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/top_side.svg new file mode 100644 index 0000000..103fe3a --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/top_side/top_side.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/metadata.json new file mode 100644 index 0000000..445b8dc --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "up-arrow.svg", + "hotspot_x": 15.5, + "hotspot_y": 4.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/up-arrow.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/up-arrow.svg new file mode 100644 index 0000000..18bdca8 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/up-arrow/up-arrow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/v_double_arrow b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/v_double_arrow new file mode 100644 index 0000000..fb54fee --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/v_double_arrow @@ -0,0 +1 @@ +size_ver \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/metadata.json new file mode 100644 index 0000000..66430ef --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "vertical-text.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/vertical-text.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/vertical-text.svg new file mode 100644 index 0000000..f234208 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/vertical-text/vertical-text.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/w-resize b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/w-resize new file mode 100644 index 0000000..e0da659 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/w-resize @@ -0,0 +1 @@ +size_hor \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/metadata.json new file mode 100644 index 0000000..2eb67dd --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/metadata.json @@ -0,0 +1,163 @@ +[ + { + "filename": "wait-01.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-02.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-03.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-04.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-05.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-06.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-07.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-08.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-09.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-10.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-11.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-12.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-13.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-14.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-15.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-16.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-17.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-18.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-19.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-20.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-21.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-22.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + }, + { + "filename": "wait-23.svg", + "delay": 30, + "hotspot_x": 16, + "hotspot_y": 15, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-01.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-01.svg new file mode 100644 index 0000000..5b23ef4 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-01.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-02.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-02.svg new file mode 100644 index 0000000..8592852 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-03.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-03.svg new file mode 100644 index 0000000..0a1e279 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-03.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-04.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-04.svg new file mode 100644 index 0000000..1c5d832 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-04.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-05.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-05.svg new file mode 100644 index 0000000..056687a --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-05.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-06.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-06.svg new file mode 100644 index 0000000..5b601fd --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-06.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-07.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-07.svg new file mode 100644 index 0000000..2cf6fac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-07.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-08.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-08.svg new file mode 100644 index 0000000..42fe4a9 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-08.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-09.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-09.svg new file mode 100644 index 0000000..bc07953 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-09.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-10.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-10.svg new file mode 100644 index 0000000..43b1ad0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-10.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-11.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-11.svg new file mode 100644 index 0000000..701e3dc --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-11.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-12.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-12.svg new file mode 100644 index 0000000..6b1fe58 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-12.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-13.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-13.svg new file mode 100644 index 0000000..88f9c4f --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-13.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-14.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-14.svg new file mode 100644 index 0000000..005f968 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-14.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-15.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-15.svg new file mode 100644 index 0000000..c29ce0e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-15.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-16.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-16.svg new file mode 100644 index 0000000..ebcc23d --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-16.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-17.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-17.svg new file mode 100644 index 0000000..32219d0 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-17.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-18.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-18.svg new file mode 100644 index 0000000..e607492 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-18.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-19.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-19.svg new file mode 100644 index 0000000..09b9c60 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-19.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-20.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-20.svg new file mode 100644 index 0000000..b955656 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-20.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-21.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-21.svg new file mode 100644 index 0000000..9fec175 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-21.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-22.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-22.svg new file mode 100644 index 0000000..81ba574 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-22.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-23.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-23.svg new file mode 100644 index 0000000..a634c40 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wait/wait-23.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/watch b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/watch new file mode 100644 index 0000000..fd80437 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/watch @@ -0,0 +1 @@ +wait \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/metadata.json new file mode 100644 index 0000000..3c4bbb1 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "wayland-cursor.svg", + "hotspot_x": 16, + "hotspot_y": 16, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/wayland-cursor.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/wayland-cursor.svg new file mode 100644 index 0000000..b25ca09 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/wayland-cursor/wayland-cursor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/whats_this b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/whats_this new file mode 100644 index 0000000..4cea3ac --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/whats_this @@ -0,0 +1 @@ +help \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/metadata.json new file mode 100644 index 0000000..0b0ac06 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "x-cursor.svg", + "hotspot_x": 16.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/x-cursor.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/x-cursor.svg new file mode 100644 index 0000000..23da071 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/x-cursor/x-cursor.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/xterm b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/xterm new file mode 100644 index 0000000..f3a3485 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/xterm @@ -0,0 +1 @@ +text \ No newline at end of file diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/metadata.json new file mode 100644 index 0000000..9cbec7c --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "zoom-in.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/zoom-in.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/zoom-in.svg new file mode 100644 index 0000000..ff40687 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-in/zoom-in.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/metadata.json b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/metadata.json new file mode 100644 index 0000000..1f1fed7 --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/metadata.json @@ -0,0 +1,8 @@ +[ + { + "filename": "zoom-out.svg", + "hotspot_x": 15.5, + "hotspot_y": 15.5, + "nominal_size": 24 + } +] diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/zoom-out.svg b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/zoom-out.svg new file mode 100644 index 0000000..b2c652e --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/cursors_scalable/zoom-out/zoom-out.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/icon-theme.cache b/dms-dotfiles/.local/share/icons/breeze_cursors/icon-theme.cache new file mode 100644 index 0000000..0d5bf23 Binary files /dev/null and b/dms-dotfiles/.local/share/icons/breeze_cursors/icon-theme.cache differ diff --git a/dms-dotfiles/.local/share/icons/breeze_cursors/index.theme b/dms-dotfiles/.local/share/icons/breeze_cursors/index.theme new file mode 100644 index 0000000..abb581b --- /dev/null +++ b/dms-dotfiles/.local/share/icons/breeze_cursors/index.theme @@ -0,0 +1,100 @@ +[Icon Theme] +Name=Breeze Dark +Name[ar]=نسيم داكن +Name[az]=Breeze - Tünd +Name[bg]=Breeze Тъмен +Name[bs]=Breeze tamna +Name[ca]=Brisa fosca +Name[ca@valencia]=Brisa fosca +Name[cs]=Breeze Tmavé +Name[da]=Breeze Dark +Name[de]=Breeze Dunkel +Name[el]=Breeze σκούρο +Name[en_GB]=Breeze Dark +Name[eo]=Breeze Dark +Name[es]=Brisa oscuro +Name[et]=Breeze tume +Name[eu]=Breeze iluna +Name[fi]=Tumma Breeze +Name[fr]=Brise sombre +Name[gl]=Brisa escura +Name[he]=בריזה כהה +Name[hi]=ब्रीज़ गहरा +Name[hu]=Breeze Dark +Name[ia]=Brisa obscure +Name[id]=Breeze Gelap +Name[is]=Breeze dökkt +Name[it]=Brezza scuro +Name[ja]=Breeze ダーク +Name[ka]=Breeze მუქი +Name[ko]=어두운 Breeze +Name[lt]=Breeze tamsus +Name[lv]=„Breeze“ tumšais +Name[nb]=Breeze mørk +Name[nl]=Breeze Dark +Name[nn]=Breeze mørk +Name[pa]=ਬਰੀਜ਼ ਗੂੜ੍ਹਾ +Name[pl]=Ciemna Bryza +Name[pt]=Brisa Escura +Name[pt_BR]=Breeze Dark +Name[ro]=Briză, întunecat +Name[ru]=Breeze, тёмный вариант +Name[sa]=वायुः अन्धकारः +Name[sk]=Tmavý vánok +Name[sl]=Sapica, temna +Name[sr]=Поветарац тамни +Name[sr@ijekavian]=Поветарац тамни +Name[sr@ijekavianlatin]=Povetarac tamni +Name[sr@latin]=Povetarac tamni +Name[sv]=Breeze mörk +Name[ta]=கரும் பிரீஸ் +Name[tg]=Насими торик +Name[tr]=Esinti Koyu +Name[uk]=Темна Breeze +Name[zh_CN]=Breeze 微风深色 +Name[zh_TW]=Breeze Dark +Comment=Breeze Dark by the KDE VDG +Comment[ar]=نسيم داكن من من مجموعة تصميم كِيدِي +Comment[az]=Breeze - Tünd - by the KDE VDG +Comment[bg]=Breeze Тъмен от KDE VDG +Comment[ca]=Brisa fosca, creat pel VDG del KDE +Comment[ca@valencia]=Brisa fosca, creat pel VDG de KDE +Comment[cs]=Breeze Dark od KDE VDG +Comment[da]=Breeze Dark af KDE's visuelle designgruppe +Comment[de]=Breeze Dunkel von der KDE VDG +Comment[el]=Breeze σκούρο από το KDE VDG +Comment[en_GB]=Breeze Dark by the KDE VDG +Comment[eo]=Breeze Dark de la KDE VDG +Comment[es]=Brisa oscuro, por KDE VDG +Comment[et]=Breeze tume KDE VDG-lt +Comment[eu]=Breeze iluna, KDE VDGk egina +Comment[fi]=Tumma Breeze KDE VDG:ltä +Comment[fr]=Breeze sombre, par KDE VDG +Comment[gl]=Breeze escuro de KDE VDG +Comment[he]=בריזה כהה מאת צוות העיצוב החזותי של KDE +Comment[hi]=केडीई वीडीजी द्वारा ब्रीज़ गहरा +Comment[hu]=Breeze Dark a KDE VDG-től +Comment[ia]=Breeze Dark (Brisa Obscure) per le KDE VDG +Comment[id]=Breeze Gelap oleh KDE VDG +Comment[is]=Breeze Dark frá KDE VDG +Comment[it]=Brezza scuro a cura del VDG di KDE +Comment[ka]=Breeze Dark "KDE VDG"-სგან +Comment[ko]=KDE 시각 디자인 그룹에서 제작한 어두운 Breeze +Comment[lt]=Breeze tamsus pagal KDE VDG +Comment[lv]=KDE VDG veidotais „Breeze“ tumšais motīvs +Comment[nl]=Breeze Dark door de KDE VDG +Comment[nn]=Breeze Dark frå KDE VDG +Comment[pa]=ਕੇਡੀਈ ਵੀਡੀਜੀ ਵਲੋਂ ਬਰੀਜ਼ ਗੂੜ੍ਹਾ +Comment[pl]=Ciemna Bryza autorstwa KDE VDG +Comment[pt_BR]=Breeze Dark pelo KDE VDG +Comment[ro]=Briză, întunecat, de KDE VDG +Comment[ru]=Тёмный вариант Breeze от KDE VDG +Comment[sk]=Tmavý vánok od KDE VDG +Comment[sl]=Sapica temna; izdelali pri KDE VDG +Comment[sv]=Breeze mörk av KDE:s visuella designgrupp +Comment[ta]=கே.டீ.யீ. VDG வழங்கும் கரும் பிரீஸ் +Comment[tg]=Насими торик аз KDE VDG +Comment[tr]=KDE Görsel Tasarım grubundan Esinti Koyu +Comment[uk]=Темна Breeze, автори — KDE VDG +Comment[zh_CN]=Breeze 微风深色主题,由 KDE VDG (视觉设计团队) 设计制作 +Comment[zh_TW]=由 KDE VDG 製作的 Breeze Dark diff --git a/dms-dotfiles/.vimrc b/dms-dotfiles/.vimrc new file mode 100644 index 0000000..0041270 --- /dev/null +++ b/dms-dotfiles/.vimrc @@ -0,0 +1,35 @@ +"显示行号 +set number +"显示相对行号 +set relativenumber +"高亮当前行 +set cursorline +"语法高亮 +syntax on + +" 开启自动缩进,新的一行会自动与上一行对齐 +set autoindent +" 在输入搜索词时,实时高亮显示匹配项(增量搜索) +set incsearch + +" 高亮显示所有搜索结果 +set hlsearch + +" 搜索时忽略大小写 +set ignorecase + +" 如果搜索词中包含了大写字母,则自动切换为大小写敏感搜索 +set smartcase +" 开启持久化撤销(undo),即使关闭再打开文件,也能撤销之前的更改 +set undofile + +" undo目录 +silent !mkdir -p ~/.cache/vim/undo +set undodir=~/.cache/vim/undo + +" 剪贴板 gvim的功能 +set clipboard=unnamedplus + +" 接管鼠标事件 +set mouse=a + diff --git a/exclude-dotfiles.txt b/exclude-dotfiles.txt new file mode 100644 index 0000000..fdfcbe5 --- /dev/null +++ b/exclude-dotfiles.txt @@ -0,0 +1 @@ +ghostty \ No newline at end of file diff --git a/gnome-dotfiles/.config/fastfetch/config.jsonc b/gnome-dotfiles/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..3363758 --- /dev/null +++ b/gnome-dotfiles/.config/fastfetch/config.jsonc @@ -0,0 +1,124 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "logo": { + "type": "kitty", + //"source": "/home/shorin/Pictures/picture.png", + "width": 25, + // "height":20, + "padding": { + "top": 1, // Top padding + "left": 2, // Left padding + "right": 2 // Right padding + }, + }, + "display": { + "separator": " ", // Separator between keys and values + "color": { + //"keys": "#b7c9d9", // Key color module名字的颜色 + "title": "#c1c7ce", // Title color 主机名的颜色 + "output": "#c1c7ce" + }, + }, + "modules": [ + "break", + { + "type": "os", //这是哪个module + "key": "OS", //module名字的显示 + // "keyColor": "#00ff00", //module名字颜色 + // "format": "{name} {version}", //具体内容 + "keyColor": "#96cdf8", + + }, + { + "type": "kernel", + "key": " ├  KER ", + "keyColor": "#96cdf8", + + }, + { + "type": "packages", + "key": " ├  PAK ", + "format": "{all}", + "keyColor": "#96cdf8", + }, + { + "type": "title", + "key": " └  USR ", + "keyColor": "#96cdf8", + }, + "break", + "break", + { + "type": "wm", + "key": "WM", + "keyColor": "#cfc0e8", + }, + { + "type": "de", + "key": " ├ 󱈹 DES ", + "keyColor": "#cfc0e8", + //"outputColor": "#cfc0e8" + }, + { + "type": "shell", + "key": " ├  SHE ", + "keyColor": "#cfc0e8", + //"outputColor": "#cfc0e8" + }, + { + "type": "terminal", + "key": " ├  TER ", + "keyColor": "#cfc0e8", + //"outputColor": "#cfc0e8" + }, + { + "type": "terminalfont", + "key": " └  TFO ", + "keyColor": "#cfc0e8", + //"outputColor": "#cfc0e8" + }, + "break", + "break", + { + "type": "host", + "key": "PC ", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + { + "type": "cpu", + "key": " ├  CPU ", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + { + "type": "memory", + "key": " ├  MEM ", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + { + "type": "gpu", + "key": " ├ 󰢮 GPU ", + "format": "{1} {2}", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + { + "type": "display", + "key": " ├  MON ", + "format": "{name} {width}x{height}@{refresh-rate} ", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + { + "type": "disk", + "key": " └ 󰋊 DIS ", + "keyColor": "#d3e5f5", + //"outputColor": "#b7c9d9" + }, + "break", + "break", + "colors" + ] +} diff --git a/gnome-dotfiles/.config/fcitx5/conf/cached_layouts b/gnome-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..15ac22b --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3740 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/gnome-dotfiles/.config/fcitx5/conf/chttrans.conf b/gnome-dotfiles/.config/fcitx5/conf/chttrans.conf new file mode 100644 index 0000000..04476ad --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/chttrans.conf @@ -0,0 +1,12 @@ +# 转换引擎 +Engine=OpenCC +# 启用的输入法 +EnabledIM= +# 简转繁的 OpenCC 配置 +OpenCCS2TProfile=default +# 繁转简的 OpenCC 配置 +OpenCCT2SProfile=default + +[Hotkey] +0=Control+Shift+F + diff --git a/gnome-dotfiles/.config/fcitx5/conf/classicui.conf b/gnome-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..ea8a561 --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# Vertical Candidate List +Vertical Candidate List=True +# Use mouse wheel to go to prev or next page +WheelForPaging=True +# Font +Font="Sans Serif 11" +# Menu Font +MenuFont="Sans Serif 10" +# Tray Font +TrayFont="Sans Serif 10" +# Tray Label Outline Color +TrayOutlineColor=#000000 +# Tray Label Text Color +TrayTextColor=#ffffff +# Prefer Text Icon +PreferTextIcon=False +# Show Layout Name In Icon +ShowLayoutNameInIcon=True +# Use input method language to display text +UseInputMethodLanguageToDisplayText=True +# Theme +Theme=default +# Dark Theme +DarkTheme=default-dark +# Follow system light/dark color scheme +UseDarkTheme=False +# Follow system accent color if it is supported by theme and desktop +UseAccentColor=True +# Use Per Screen DPI on X11 +PerScreenDPI=False +# Force font DPI on Wayland +ForceWaylandDPI=0 +# Enable fractional scale under Wayland +EnableFractionalScale=True + diff --git a/gnome-dotfiles/.config/fcitx5/conf/notifications.conf b/gnome-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/gnome-dotfiles/.config/fcitx5/conf/pinyin.conf b/gnome-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/gnome-dotfiles/.config/fcitx5/conf/punctuation.conf b/gnome-dotfiles/.config/fcitx5/conf/punctuation.conf new file mode 100644 index 0000000..3da1c4c --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/conf/punctuation.conf @@ -0,0 +1,10 @@ +# 字母或者数字之后输入半角标点 +HalfWidthPuncAfterLetterOrNumber=True +# 同时输入成对标点 (例如引号) +TypePairedPunctuationsTogether=False +# Enabled +Enabled=True + +[Hotkey] +0=Control+period + diff --git a/gnome-dotfiles/.config/fcitx5/config b/gnome-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..1874f1a --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# 按住切换键的修饰键时进行轮换切换 +EnumerateWithTriggerKeys=True +# 向前切换输入法 +EnumerateForwardKeys= +# 向后切换输入法 +EnumerateBackwardKeys= +# 轮换输入法时跳过第一个输入法 +EnumerateSkipFirst=False +# 触发修饰键快捷键的时限 (毫秒) +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Control+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# 默认状态为激活 +ActiveByDefault=False +# 重新聚焦时重置状态 +resetStateWhenFocusIn=No +# 共享输入状态 +ShareInputState=No +# 在程序中显示预编辑文本 +PreeditEnabledByDefault=True +# 切换输入法时显示输入法信息 +ShowInputMethodInformation=True +# 在焦点更改时显示输入法信息 +showInputMethodInformationWhenFocusIn=False +# 显示紧凑的输入法信息 +CompactInputMethodInformation=True +# 显示第一个输入法的信息 +ShowFirstInputMethodInformation=True +# 默认页大小 +DefaultPageSize=5 +# 覆盖 XKB 选项 +OverrideXkbOption=False +# 自定义 XKB 选项 +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# 允许在密码框中使用输入法 +AllowInputMethodForPassword=False +# 输入密码时显示预编辑文本 +ShowPreeditForPassword=False +# 保存用户数据的时间间隔(以分钟为单位) +AutoSavePeriod=30 + diff --git a/gnome-dotfiles/.config/fcitx5/profile b/gnome-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..d264f5e --- /dev/null +++ b/gnome-dotfiles/.config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=默认 +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=默认 + diff --git a/gnome-dotfiles/.config/fish/config.fish b/gnome-dotfiles/.config/fish/config.fish new file mode 100644 index 0000000..fb5fd92 --- /dev/null +++ b/gnome-dotfiles/.config/fish/config.fish @@ -0,0 +1,56 @@ +if status is-interactive + # Commands to run in interactive sessions can go here +end +set fish_greeting "" +set -p PATH ~/.local/bin +starship init fish | source +zoxide init fish --cmd cd | source + +function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" +end + +function cat + command bat $argv +end +function ls + command eza --icons $argv +end + +function lt + command eza --icons --tree $argv +end +# grub +abbr grub 'LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 sudo grub-mkconfig -o /boot/grub/grub.cfg' +# 小黄鸭补帧 需要steam安装正版小黄鸭 +abbr lsfg 'LSFG_PROCESS="miyu"' +# fa运行fastfetch +abbr fa fastfetch +abbr reboot 'systemctl reboot' +function sl + command sl | lolcat +end +function 滚 + sysup +end +function raw + command ~/.config/scripts/random-anime-wallpaper.sh $argv +end + +function 安装 + command yay -S $argv +end + +function 卸载 + command yay -Rns $argv +end + +# Added by LM Studio CLI (lms) +set -gx PATH $PATH /home/shorin/.lmstudio/bin +# End of LM Studio CLI section + diff --git a/gnome-dotfiles/.config/fish/functions/apt.fish b/gnome-dotfiles/.config/fish/functions/apt.fish new file mode 100644 index 0000000..162d6a1 --- /dev/null +++ b/gnome-dotfiles/.config/fish/functions/apt.fish @@ -0,0 +1,171 @@ +# ============================================================================== +# Function: apt (Smart Arch Package Manager Wrapper for Fish) +# Description: Maps common Debian 'apt' commands to an intelligent Arch backend. +# Features: +# - Fallback routing: paru > yay > pacman. +# - Automatic Sudo Handling: Prevents AUR helpers from running as root. +# - Anti-Partial-Upgrade: Merges update/upgrade into a safe -Syu operation. +# - Deep Clean Default: Merges remove/purge into -Rns for a pristine system. +# - UI Integration: Progressive enhancement with 'shorin' for interactive modes. +# - Safe orphan detection and i18n support. +# - Highly readable, colorized, and column-aligned help output. +# Usage: apt {update|upgrade|install [ui]|remove [ui]|search|show|autoremove|clean|help|-h} [pkg...] +# ============================================================================== + +function apt -d "Smart wrapper routing apt commands to paru/yay/pacman" + # 1. 极简的 Locale 探测 + set -l is_zh 0 + if string match -q -r "^zh_" "$LC_ALL" "$LC_MESSAGES" "$LANG" + set is_zh 1 + end + + # 2. 探测 shorin UI 工具是否存在 + set -l has_shorin 0 + if command -q shorin + set has_shorin 1 + end + + set -l action "help" + set -l exit_code 0 + + if test (count $argv) -eq 0 + set exit_code 1 + else + set action $argv[1] + set -e argv[1] + end + + # 3. 帮助信息拦截与本地化 (重构的高颜值排版) + switch $action + case help -h --help + set -l c_cmd (set_color cyan) + set -l c_hl (set_color yellow) + set -l c_rst (set_color normal) + + if test $is_zh -eq 1 + echo "Arch 包管理器包装器 (优先级: "$c_hl"paru > yay > pacman"$c_rst")" + echo "用法: "$c_hl"apt"$c_rst" <命令> [软件包...]" + echo "" + echo "命令:" + echo " "$c_cmd"update(upgrade)"$c_rst" 同步数据库并更新系统 (-Syu)" + echo " "$c_cmd"install "$c_rst" 安装软件包 (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" 打开交互式界面安装 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"remove "$c_rst" 彻底卸载软件包、依赖及配置文件 (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" 打开交互式界面卸载 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"search "$c_rst" 搜索软件包 (-Ss)" + echo " "$c_cmd"show "$c_rst" 显示软件包详细信息 (-Si)" + echo " "$c_cmd"autoremove "$c_rst" 安全地清理系统中的孤立软件包" + echo " "$c_cmd"clean "$c_rst" 清理下载缓存 (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" 显示此帮助信息" + else + echo "Smart Arch Package Wrapper (Routing: "$c_hl"paru > yay > pacman"$c_rst")" + echo "Usage: "$c_hl"apt"$c_rst" [package...]" + echo "" + echo "Commands:" + echo " "$c_cmd"update(upgrade)"$c_rst" Sync databases and update system (Safe -Syu)" + echo " "$c_cmd"install "$c_rst" Install packages (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" Open interactive installation UI (shorin pac)" + end + echo " "$c_cmd"remove "$c_rst" Remove packages, unneeded dependencies, and configs (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" Open interactive removal UI (shorin pacr)" + end + echo " "$c_cmd"search "$c_rst" Search for packages (-Ss)" + echo " "$c_cmd"show "$c_rst" Show package details (-Si)" + echo " "$c_cmd"autoremove "$c_rst" Remove orphaned packages safely" + echo " "$c_cmd"clean "$c_rst" Clean package cache (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" Show this help message" + end + return $exit_code + end + + # 4. 核心路由与提权逻辑 + set -l pkg_mgr + set -l needs_sudo "no" + + if command -q paru + set pkg_mgr "paru" + else if command -q yay + set pkg_mgr "yay" + else + set pkg_mgr "pacman" + set needs_sudo "yes" + end + + set -l cmd + if test "$needs_sudo" = "yes" + set cmd sudo $pkg_mgr + else + set cmd $pkg_mgr + end + + # 5. 预定义基础错误信息 (本地化) + set -l msg_err_pkg "Error: Specify packages." + set -l msg_err_search "Error: Specify search term." + set -l msg_err_show "Error: Specify package to show." + if test $is_zh -eq 1 + set msg_err_pkg "错误:请指定要操作的软件包。" + set msg_err_search "错误:请指定搜索词。" + set msg_err_show "错误:请指定要查看的软件包。" + end + + # 6. 动作映射 (Action Mapping) + switch $action + case update upgrade + $cmd -Syu + case install + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'install ui',条件:且只输入了 ui 一个参数,且系统存在 shorin + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pac + return 0 + end + $cmd -S $argv + case remove + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'remove ui' + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pacr + return 0 + end + $cmd -Rns $argv + case search + if test (count $argv) -eq 0; echo $msg_err_search; return 1; end + $pkg_mgr -Ss $argv + case show + if test (count $argv) -eq 0; echo $msg_err_show; return 1; end + $pkg_mgr -Si $argv + case autoremove + set -l orphans (pacman -Qtdq) + if test (count $orphans) -gt 0 + if test $is_zh -eq 1 + echo "找到 "(count $orphans)" 个孤立的软件包。正在通过 $pkg_mgr 卸载..." + else + echo "Found "(count $orphans)" orphaned package(s). Removing via $pkg_mgr..." + end + $cmd -Rns $orphans + else + if test $is_zh -eq 1 + echo "系统很干净,没有需要清理的孤立软件包。" + else + echo "System is clean. No orphaned packages to remove." + end + end + case clean + $cmd -Sc + case '*' + if test $is_zh -eq 1 + echo "错误:不支持的 apt 命令映射: $action" + echo "运行 'apt -h' 查看可用命令。" + else + echo "Error: Unsupported apt command mapped: $action" + echo "Run 'apt -h' for valid commands." + end + return 1 + end +end diff --git a/gnome-dotfiles/.config/fish/functions/f.fish b/gnome-dotfiles/.config/fish/functions/f.fish new file mode 100644 index 0000000..8059bc1 --- /dev/null +++ b/gnome-dotfiles/.config/fish/functions/f.fish @@ -0,0 +1,252 @@ +function f + # ============================================================================== + # 【脚本功能说明】 + # 1. 结合 Fastfetch,在终端启动时展示随机二次元图片 (支持 SFW / NSFW 模式)。 + # 2. 具备静默后台异步下载机制,库存不足时自动补货,绝不阻塞前台终端的启动。 + # 3. 具备智能缓存管理机制,自动控制待展示区与已使用区 (used) 的图片数量上限。 + # 4. 具备极致的网络环境容错处理,无网或弱网时自动降级 fallback,避免死等。 + # 5. 具备自动清理 Fastfetch 内部生成的图片转换缓存功能,防止磁盘空间无感膨胀。 + # ============================================================================== + + # ================= 配置区域 ================= + + # [开关] 阅后即焚模式 (针对 Fastfetch 内部缓存) + # true = 运行后强力清空 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) + # false = 保留缓存 + set -l CLEAN_CACHE_MODE true + + # 每次补货下载多少张 + set -l DOWNLOAD_BATCH_SIZE 10 + # 最大库存上限 (待展示区) + set -l MAX_CACHE_LIMIT 100 + # 库存少于多少张时开始补货 + set -l MIN_TRIGGER_LIMIT 60 + + # [新增] used 目录最大存放数量 + # 超过此数量将按照时间顺序删除最旧的文件 + set -l MAX_USED_LIMIT 50 + + # =========================================== + + # --- 0. 参数解析与模式设置 --- + + set -l NSFW_MODE false + # 检查环境变量 + if test "$NSFW" = "1" + set NSFW_MODE true + end + + set -l ARGS_FOR_FASTFETCH + for arg in $argv + if test "$arg" = "--nsfw" + set NSFW_MODE true + else + set -a ARGS_FOR_FASTFETCH $arg + end + end + + # --- 1. 目录配置 --- + + # 根据模式区分缓存目录和锁文件 + set -l CACHE_DIR + set -l LOCK_FILE + if test "$NSFW_MODE" = true + set CACHE_DIR "$HOME/.cache/fastfetch_waifu_nsfw" + set LOCK_FILE "/tmp/fastfetch_waifu_nsfw.lock" + else + set CACHE_DIR "$HOME/.cache/fastfetch_waifu" + set LOCK_FILE "/tmp/fastfetch_waifu.lock" + end + + # 定义已使用目录 + set -l USED_DIR "$CACHE_DIR/used" + + mkdir -p "$CACHE_DIR" + mkdir -p "$USED_DIR" + + # --- 2. 核心函数 --- + + # [修复] 抛弃脆弱的 1.1.1.1,使用苹果的全球探针节点,并使用 -I (HEAD请求) 极限提速 + function check_network + curl -sI --connect-timeout 2 "http://captive.apple.com/hotspot-detect.html" >/dev/null 2>&1 + return $status + end + + function get_random_url -V NSFW_MODE + set -l TIMEOUT --connect-timeout 5 --max-time 15 + set -l RAND (math (random) % 3 + 1) + + if test "$NSFW_MODE" = true + # === NSFW API === + switch $RAND + case 1 + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=true" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' + end + else + # === SFW (正常) API === + switch $RAND + case 1 + # [修复] IsNsfwfalse 修正为 IsNsfw=false + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=false" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' + end + end + end + + function download_one_image -V CACHE_DIR + set -l URL (get_random_url) + if string match -qr "^http" -- "$URL" + # 使用带时间戳的随机文件名 + set -l FILENAME "waifu_"(date +%s%N)"_"(random)".jpg" + set -l TARGET_PATH "$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if test -s "$TARGET_PATH" + if command -v file >/dev/null 2>&1 + if not file --mime-type "$TARGET_PATH" | grep -q "image/" + rm -f "$TARGET_PATH" + end + end + else + rm -f "$TARGET_PATH" + end + end + end + + function background_job -V CACHE_DIR -V LOCK_FILE -V MIN_TRIGGER_LIMIT -V DOWNLOAD_BATCH_SIZE -V MAX_CACHE_LIMIT -V NSFW_MODE + # 导出函数定义以便在 fish -c 中使用 + set -l get_random_url_def (functions get_random_url | string collect) + set -l download_one_image_def (functions download_one_image | string collect) + set -l check_network_def (functions check_network | string collect) + + fish -c " + # [核心修复 1] 忽略终端关闭带来的 SIGHUP 信号 + trap '' HUP + + # 重新定义需要的函数 + $get_random_url_def + $download_one_image_def + $check_network_def + + # 使用 flock 防止并发 + flock -n 200 || exit 1 + + # [新增] 网络检查,没网就悄悄退出,不占后台资源 + if not check_network + exit 0 + end + + # 导入变量 + set CACHE_DIR '$CACHE_DIR' + set NSFW_MODE '$NSFW_MODE' + + # 1. 补货检查 + set CURRENT_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + + if test \$CURRENT_COUNT -lt $MIN_TRIGGER_LIMIT + for i in (seq 1 $DOWNLOAD_BATCH_SIZE) + download_one_image + sleep 0.5 + end + end + + # 2. 清理过多库存 (清理的是下载缓存区,不是 used 区) + set FINAL_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + if test \$FINAL_COUNT -gt $MAX_CACHE_LIMIT + set DELETE_START_LINE (math $MAX_CACHE_LIMIT + 1) + ls -tp \$CACHE_DIR/*.jpg 2>/dev/null | tail -n +\$DELETE_START_LINE | xargs -I {} rm -- '{}' + end + " 200>"$LOCK_FILE" & + + # [核心修复 2] 将刚才丢入后台的 fish 子进程剥离终端控制 + disown + end + + # --- 3. 主程序逻辑 --- + + set -l FILES $CACHE_DIR/*.jpg + set -l NUM_FILES (count $FILES) + + # fish 若无匹配文件,$FILES 可能为空或保留模式字符串,需额外判断 + if test "$NUM_FILES" -eq 1; and not test -f "$FILES[1]" + set NUM_FILES 0 + set FILES + end + + set -l SELECTED_IMG "" + + if test "$NUM_FILES" -gt 0 + # 有库存,随机选一张 + set -l RAND_INDEX (math (random) % $NUM_FILES + 1) + set SELECTED_IMG "$FILES[$RAND_INDEX]" + + # 后台补货 + background_job >/dev/null 2>&1 + else + # 没库存,提示语更改并增加网络连通性容错 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + + if check_network + download_one_image + else + echo "网络好像不太通畅,无法下载新图片 QAQ" + end + + set FILES $CACHE_DIR/*.jpg + if test -f "$FILES[1]" + set SELECTED_IMG "$FILES[1]" + background_job >/dev/null 2>&1 + end + end + + # 运行 Fastfetch + if test -n "$SELECTED_IMG"; and test -f "$SELECTED_IMG" + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true $ARGS_FOR_FASTFETCH + + # === 逻辑: 移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 逻辑: 检查 used 目录并清理旧图 === + # 注意:fish 的 glob 展开如果文件太多可能会卡,但这里有 limit 限制所以还好 + set -l used_files $USED_DIR/*.jpg + set -l used_count (count $used_files) + + # 再次确认 count,因为如果没文件 $used_files 可能为空 + if test "$used_count" -gt 0; and not test -f "$used_files[1]" + set used_count 0 + end + + if test "$used_count" -gt "$MAX_USED_LIMIT" + # 计算需要跳过的行数 (保留最新的 N 张) + set -l skip_lines (math "$MAX_USED_LIMIT" + 1) + + # 列出所有文件按时间倒序(tp),取尾部(tail),删除(rm) + # 2>/dev/null 防止目录为空时报错 + set -l files_to_delete (ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$skip_lines) + + if test -n "$files_to_delete" + rm -- $files_to_delete + end + end + + # 检查是否开启清理 Fastfetch 内部缓存 + if test "$CLEAN_CACHE_MODE" = true + # 仅删除缩略图缓存,保留原图 + rm -rf "$HOME/.cache/fastfetch/images" + end + else + # 失败提示语更改 + echo "图片获取失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch $ARGS_FOR_FASTFETCH + end +end diff --git a/gnome-dotfiles/.config/fish/functions/fnsfw.fish b/gnome-dotfiles/.config/fish/functions/fnsfw.fish new file mode 100644 index 0000000..ef2f45b --- /dev/null +++ b/gnome-dotfiles/.config/fish/functions/fnsfw.fish @@ -0,0 +1,3 @@ +function fnsfw + f --nsfw +end diff --git a/gnome-dotfiles/.config/fontconfig/fonts.conf b/gnome-dotfiles/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..bf57887 --- /dev/null +++ b/gnome-dotfiles/.config/fontconfig/fonts.conf @@ -0,0 +1,42 @@ + + + + + + true + true + hintslight + rgb + lcddefault + + + + sans-serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + monospace + + JetBrains Mono + JetBrains Maple Mono + Adwaita Mono + + + + diff --git a/gnome-dotfiles/.config/ghostty/config b/gnome-dotfiles/.config/ghostty/config new file mode 100644 index 0000000..8b5a001 --- /dev/null +++ b/gnome-dotfiles/.config/ghostty/config @@ -0,0 +1,15 @@ +# 设置主题 +theme = Matugen +command = /usr/bin/fish + +#设置透明度 +background-opacity=0.88 +#设置字体 +font-family= "JetBrains Maple Mono" +font-size = 15 +#取消关闭时的确认 +# confirm-close-surface = false +#设置左右边距 +window-padding-x=10 +#设置上下边距 +window-padding-y=10 diff --git a/gnome-dotfiles/.config/ghostty/themes/Matugen b/gnome-dotfiles/.config/ghostty/themes/Matugen new file mode 100644 index 0000000..5aa1c30 --- /dev/null +++ b/gnome-dotfiles/.config/ghostty/themes/Matugen @@ -0,0 +1,6 @@ +background = #101417 +foreground = #e0e3e8 +cursor-color = #e0e3e8 +cursor-text = #c1c7ce +selection-background = #b7c9d9 +selection-foreground = #22323f diff --git a/gnome-dotfiles/.config/ghostty/themes/catppuccin-frappe.conf b/gnome-dotfiles/.config/ghostty/themes/catppuccin-frappe.conf new file mode 100644 index 0000000..97f8465 --- /dev/null +++ b/gnome-dotfiles/.config/ghostty/themes/catppuccin-frappe.conf @@ -0,0 +1,22 @@ +palette = 0=#51576d +palette = 1=#e78284 +palette = 2=#a6d189 +palette = 3=#e5c890 +palette = 4=#8caaee +palette = 5=#f4b8e4 +palette = 6=#81c8be +palette = 7=#b5bfe2 +palette = 8=#626880 +palette = 9=#e78284 +palette = 10=#a6d189 +palette = 11=#e5c890 +palette = 12=#8caaee +palette = 13=#f4b8e4 +palette = 14=#81c8be +palette = 15=#a5adce +background = 303446 +foreground = c6d0f5 +cursor-color = f2d5cf +cursor-text = 303446 +selection-background = 44495d +selection-foreground = c6d0f5 diff --git a/gnome-dotfiles/.config/ghostty/themes/catppuccin-macchiato.conf b/gnome-dotfiles/.config/ghostty/themes/catppuccin-macchiato.conf new file mode 100644 index 0000000..5b95607 --- /dev/null +++ b/gnome-dotfiles/.config/ghostty/themes/catppuccin-macchiato.conf @@ -0,0 +1,22 @@ +palette = 0=#494d64 +palette = 1=#ed8796 +palette = 2=#a6da95 +palette = 3=#eed49f +palette = 4=#8aadf4 +palette = 5=#f5bde6 +palette = 6=#8bd5ca +palette = 7=#b8c0e0 +palette = 8=#5b6078 +palette = 9=#ed8796 +palette = 10=#a6da95 +palette = 11=#eed49f +palette = 12=#8aadf4 +palette = 13=#f5bde6 +palette = 14=#8bd5ca +palette = 15=#a5adcb +background = 24273a +foreground = cad3f5 +cursor-color = f4dbd6 +cursor-text = 24273a +selection-background = 3a3e53 +selection-foreground = cad3f5 diff --git a/gnome-dotfiles/.config/ghostty/themes/colors.conf b/gnome-dotfiles/.config/ghostty/themes/colors.conf new file mode 100644 index 0000000..501f903 --- /dev/null +++ b/gnome-dotfiles/.config/ghostty/themes/colors.conf @@ -0,0 +1,30 @@ +cursor-color = #eedfe3 +cursor-text = #d4c2c8 +background = #191114 +foreground = #eedfe3 +selection-background = #e0bdcb +selection-foreground = #412a34 + +palette =8=#9d8d92 +palette =0=#4c4c4c + +palette =1=#ac8a8c +palette =9=#c49ea0 + +palette =2=#8aac8b +palette =10=#9ec49f + +palette =3=#aca98a +palette =11=#c4c19e + +palette =4=#feb0d3 +palette =12=#a39ec4 + +palette =5=#ac8aac +palette =13=#c49ec4 + +palette =6=#8aacab +palette =14=#9ec3c4 + +palette =15=#e7e7e7 +palette =7=#f0f0f0 diff --git a/gnome-dotfiles/.config/mpv/config b/gnome-dotfiles/.config/mpv/config new file mode 100644 index 0000000..c84be6a --- /dev/null +++ b/gnome-dotfiles/.config/mpv/config @@ -0,0 +1 @@ +hwdec=auto-safe diff --git a/gnome-dotfiles/.config/scripts/fastfetch-random-wife.sh b/gnome-dotfiles/.config/scripts/fastfetch-random-wife.sh new file mode 100644 index 0000000..92de49a --- /dev/null +++ b/gnome-dotfiles/.config/scripts/fastfetch-random-wife.sh @@ -0,0 +1,187 @@ +# 脚本功能: +# 从随机老婆图片生成 API 下载图片并使用 Fastfetch 展示。 +# 特性:支持 NSFW 模式,支持自动补货,支持已用图片归档与自动清理。 + +# ================= 配置区域 ================= + +# [开关] 强力清理 Fastfetch 内部缓存 +# true = 每次运行后清理 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) +# false = 保留 Fastfetch 内部缓存 +CLEAN_CACHE_MODE=true + +# 每次补货下载多少张 +DOWNLOAD_BATCH_SIZE=10 +# 最大库存上限 (待展示区) +MAX_CACHE_LIMIT=100 +# 库存少于多少张时开始补货 +MIN_TRIGGER_LIMIT=60 + +# [新增] used 目录最大存放数量 +# 超过此数量将按照时间顺序删除最旧的文件 +MAX_USED_LIMIT=50 + +# =========================================== + +# --- 0. 参数解析与模式设置 --- + +NSFW_MODE=false +# 检查环境变量 +if [ "$NSFW" = "1" ]; then + NSFW_MODE=true +fi + +ARGS_FOR_FASTFETCH=() +for arg in "$@"; do + if [ "$arg" == "--nsfw" ]; then + NSFW_MODE=true + else + ARGS_FOR_FASTFETCH+=("$arg") + fi +done + +# --- 1. 目录配置 --- + +# 根据模式区分缓存目录和锁文件 +if [ "$NSFW_MODE" = true ]; then + CACHE_DIR="$HOME/.cache/fastfetch_waifu_nsfw" + LOCK_FILE="/tmp/fastfetch_waifu_nsfw.lock" +else + CACHE_DIR="$HOME/.cache/fastfetch_waifu" + LOCK_FILE="/tmp/fastfetch_waifu.lock" +fi + +# 定义已使用目录 +USED_DIR="$CACHE_DIR/used" + +mkdir -p "$CACHE_DIR" +mkdir -p "$USED_DIR" + +# --- 2. 核心函数 --- + +get_random_url() { + local TIMEOUT="--connect-timeout 5 --max-time 15" + RAND=$(( ( RANDOM % 3 ) + 1 )) + + if [ "$NSFW_MODE" = true ]; then + # === NSFW API === + case $RAND in + 1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=true" | jq -r '.images[0].url' ;; + 2) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' ;; + 3) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' ;; + esac + else + # === SFW (正常) API === + case $RAND in + 1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=false" | jq -r '.images[0].url' ;; + 2) curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' ;; + 3) curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' ;; + esac + fi +} + +download_one_image() { + URL=$(get_random_url) + if [[ "$URL" =~ ^http ]]; then + # 使用带时间戳的随机文件名 + FILENAME="waifu_$(date +%s%N)_$RANDOM.jpg" + TARGET_PATH="$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if [ -s "$TARGET_PATH" ]; then + if command -v file >/dev/null 2>&1; then + if ! file --mime-type "$TARGET_PATH" | grep -q "image/"; then + rm -f "$TARGET_PATH" + fi + fi + else + rm -f "$TARGET_PATH" + fi + fi +} + +background_job() { + ( + flock -n 200 || exit 1 + + # 1. 补货检查 + CURRENT_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + + if [ "$CURRENT_COUNT" -lt "$MIN_TRIGGER_LIMIT" ]; then + for ((i=1; i<=DOWNLOAD_BATCH_SIZE; i++)); do + download_one_image + sleep 0.5 + done + fi + + # 2. 清理过多库存 + FINAL_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + if [ "$FINAL_COUNT" -gt "$MAX_CACHE_LIMIT" ]; then + DELETE_START_LINE=$((MAX_CACHE_LIMIT + 1)) + ls -tp "$CACHE_DIR"/*.jpg 2>/dev/null | tail -n +$DELETE_START_LINE | xargs -I {} rm -- "{}" + fi + + ) 200>"$LOCK_FILE" +} + +# --- 3. 主程序逻辑 --- + +shopt -s nullglob +FILES=("$CACHE_DIR"/*.jpg) +NUM_FILES=${#FILES[@]} +shopt -u nullglob + +SELECTED_IMG="" + +if [ "$NUM_FILES" -gt 0 ]; then + # 有库存,随机选一张 + RAND_INDEX=$(( RANDOM % NUM_FILES )) + SELECTED_IMG="${FILES[$RAND_INDEX]}" + + # 后台补货 + background_job >/dev/null 2>&1 & + +else + # 没库存,提示语更改 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + download_one_image + + shopt -s nullglob + FILES=("$CACHE_DIR"/*.jpg) + shopt -u nullglob + + if [ ${#FILES[@]} -gt 0 ]; then + SELECTED_IMG="${FILES[0]}" + background_job >/dev/null 2>&1 & + fi +fi + +# 运行 Fastfetch +if [ -n "$SELECTED_IMG" ] && [ -f "$SELECTED_IMG" ]; then + + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true "${ARGS_FOR_FASTFETCH[@]}" + + # === 新增逻辑:移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 新增逻辑:检查 used 目录数量并清理 === + USED_COUNT=$(find "$USED_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + + if [ "$USED_COUNT" -gt "$MAX_USED_LIMIT" ]; then + # 计算需要保留的文件行数 (跳过最新的 MAX_USED_LIMIT 个) + SKIP_LINES=$((MAX_USED_LIMIT + 1)) + # ls -tp 按时间倒序排列(新->旧),tail 取出旧文件,xargs 删除 + ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$SKIP_LINES | xargs -I {} rm -- "{}" + fi + + # 检查是否开启清理 Fastfetch 内部缓存 (仅清理缩略图缓存,不删原图) + if [ "$CLEAN_CACHE_MODE" = true ]; then + rm -rf "$HOME/.cache/fastfetch/images" + fi +else + # 失败提示语更改 + echo "呜呜... 图片下载失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch "${ARGS_FOR_FASTFETCH[@]}" +fi diff --git a/gnome-dotfiles/.config/starship.toml b/gnome-dotfiles/.config/starship.toml new file mode 100644 index 0000000..97aa311 --- /dev/null +++ b/gnome-dotfiles/.config/starship.toml @@ -0,0 +1,181 @@ +"$schema" = 'https://starship.rs/config-schema.json' +format = """ +[](color_orange)\ +$os\ +$username\ +[](bg:color_yellow fg:color_orange)\ +$directory\ +[](fg:color_yellow bg:color_aqua)\ +$git_branch\ +$git_status\ +[](fg:color_aqua bg:color_blue)\ +$c\ +$cpp\ +$rust\ +$golang\ +$nodejs\ +$php\ +$java\ +$kotlin\ +$haskell\ +$python\ +[](fg:color_blue bg:color_bg3)\ +$docker_context\ +$conda\ +$pixi\ +[](fg:color_bg3 bg:color_bg1)\ +$time\ +[ ](fg:color_bg1)\ +$line_break$character""" +palette = 'colors' + +[palettes.colors] +mustard = '#af8700' +color_orange = '#96cdf8' +color_fg0 = '#00344e' +color_fg1 = '#e0e3e8' +color_purple = '#ebddff' +color_bg3 = '#b7c9d9' +color_green = '#00344e' +color_bg1 = '#384956' +color_blue = '#27638a' +color_red = '#96cdf8' +color_aqua = '#d3e5f5' +color_yellow = '#cfc0e8' + +[os] +disabled = false +style = "bg:color_orange fg:color_fg0" + +[os.symbols] +Windows = "󰍲" +Ubuntu = "󰕈" +SUSE = "" +Raspbian = "󰐿" +Mint = "󰣭" +Macos = "󰀵" +Manjaro = "" +Linux = "󰌽" +Gentoo = "󰣨" +Fedora = "󰣛" +Alpine = "" +Amazon = "" +Android = "" +Arch = "󰣇" +Artix = "󰣇" +EndeavourOS = "" +CentOS = "" +Debian = "󰣚" +Redhat = "󱄛" +RedHatEnterprise = "󱄛" +Pop = "" + +[username] +show_always = true +style_user = "bg:color_orange fg:color_fg0" +style_root = "bg:color_orange fg:color_fg0" +format = '[ $user ]($style)' + +[directory] +style = "fg:color_fg0 bg:color_yellow" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = "󰝚 " +"Pictures" = " " +"Developer" = "󰲋 " + +[git_branch] +symbol = "" +style = "bg:color_aqua" +format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)' + +[git_status] +style = "bg:color_aqua" +format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)' + +[nodejs] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[c] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[cpp] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[rust] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[golang] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[php] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[java] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[kotlin] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg1 bg:color_blue)]($style)' + +[haskell] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[python] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[docker_context] +symbol = "" +style = "bg:color_bg3" +format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)' + +[conda] +style = "bg:color_bg3" +format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)' + +[pixi] +style = "bg:color_bg3" +format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:color_bg1" +format = '[[  $time ](fg:color_fg1 bg:color_bg1)]($style)' + +[line_break] +disabled = false + +[character] +disabled = false +success_symbol = '[](bold fg:color_green)' +error_symbol = '[](bold fg:color_red)' +vimcmd_symbol = '[](bold fg:color_green)' +vimcmd_replace_one_symbol = '[](bold fg:color_purple)' +vimcmd_replace_symbol = '[](bold fg:color_purple)' +vimcmd_visual_symbol = '[](bold fg:color_yellow)' + diff --git a/gnome-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/gnome-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/gnome-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/gnome-dotfiles/.vimrc b/gnome-dotfiles/.vimrc new file mode 100644 index 0000000..0041270 --- /dev/null +++ b/gnome-dotfiles/.vimrc @@ -0,0 +1,35 @@ +"显示行号 +set number +"显示相对行号 +set relativenumber +"高亮当前行 +set cursorline +"语法高亮 +syntax on + +" 开启自动缩进,新的一行会自动与上一行对齐 +set autoindent +" 在输入搜索词时,实时高亮显示匹配项(增量搜索) +set incsearch + +" 高亮显示所有搜索结果 +set hlsearch + +" 搜索时忽略大小写 +set ignorecase + +" 如果搜索词中包含了大写字母,则自动切换为大小写敏感搜索 +set smartcase +" 开启持久化撤销(undo),即使关闭再打开文件,也能撤销之前的更改 +set undofile + +" undo目录 +silent !mkdir -p ~/.cache/vim/undo +set undodir=~/.cache/vim/undo + +" 剪贴板 gvim的功能 +set clipboard=unnamedplus + +" 接管鼠标事件 +set mouse=a + diff --git a/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_16.pf2 b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_16.pf2 new file mode 100644 index 0000000..5e02c2d Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_16.pf2 differ diff --git a/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_18.pf2 b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_18.pf2 new file mode 100644 index 0000000..b8de2d5 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_18.pf2 differ diff --git a/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_24.pf2 b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_24.pf2 new file mode 100644 index 0000000..0a41922 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_24.pf2 differ diff --git a/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_32.pf2 b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_32.pf2 new file mode 100644 index 0000000..58013c4 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/Rajdhani_Regular_32.pf2 differ diff --git a/grub-themes/1CyberGRUB-2077/background.png b/grub-themes/1CyberGRUB-2077/background.png new file mode 100644 index 0000000..78799dc Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/background.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/4MLinux.png b/grub-themes/1CyberGRUB-2077/icons/4MLinux.png new file mode 100644 index 0000000..9f72c0f Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/4MLinux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/AlpineLinux.png b/grub-themes/1CyberGRUB-2077/icons/AlpineLinux.png new file mode 100644 index 0000000..cfde641 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/AlpineLinux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/alma.png b/grub-themes/1CyberGRUB-2077/icons/alma.png new file mode 100644 index 0000000..3f4cf92 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/alma.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/antergos.png b/grub-themes/1CyberGRUB-2077/icons/antergos.png new file mode 100644 index 0000000..d1eb425 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/antergos.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/antix.png b/grub-themes/1CyberGRUB-2077/icons/antix.png new file mode 100644 index 0000000..febe267 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/antix.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/arch.png b/grub-themes/1CyberGRUB-2077/icons/arch.png new file mode 100644 index 0000000..5428368 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/arch.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/archlinux.png b/grub-themes/1CyberGRUB-2077/icons/archlinux.png new file mode 100644 index 0000000..5428368 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/archlinux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/arco.png b/grub-themes/1CyberGRUB-2077/icons/arco.png new file mode 100644 index 0000000..fd2fdfb Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/arco.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/artix.png b/grub-themes/1CyberGRUB-2077/icons/artix.png new file mode 100644 index 0000000..5974d76 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/artix.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/bedrock.png b/grub-themes/1CyberGRUB-2077/icons/bedrock.png new file mode 100644 index 0000000..342aa7c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/bedrock.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/bluestar.png b/grub-themes/1CyberGRUB-2077/icons/bluestar.png new file mode 100644 index 0000000..98c7040 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/bluestar.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/bodhi.png b/grub-themes/1CyberGRUB-2077/icons/bodhi.png new file mode 100644 index 0000000..cf26a2e Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/bodhi.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/bunsenlabs.png b/grub-themes/1CyberGRUB-2077/icons/bunsenlabs.png new file mode 100644 index 0000000..a843a74 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/bunsenlabs.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/cachyos.png b/grub-themes/1CyberGRUB-2077/icons/cachyos.png new file mode 100644 index 0000000..ebc899d Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/cachyos.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/centos.png b/grub-themes/1CyberGRUB-2077/icons/centos.png new file mode 100644 index 0000000..c3f8807 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/centos.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/cinnamon.png b/grub-themes/1CyberGRUB-2077/icons/cinnamon.png new file mode 100644 index 0000000..77b70b5 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/cinnamon.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/clear.png b/grub-themes/1CyberGRUB-2077/icons/clear.png new file mode 100644 index 0000000..73beca4 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/clear.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/debian.png b/grub-themes/1CyberGRUB-2077/icons/debian.png new file mode 100644 index 0000000..8466d0c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/debian.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/deepin.png b/grub-themes/1CyberGRUB-2077/icons/deepin.png new file mode 100644 index 0000000..1729cac Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/deepin.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/elementary.png b/grub-themes/1CyberGRUB-2077/icons/elementary.png new file mode 100644 index 0000000..e063350 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/elementary.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/endeavouros.png b/grub-themes/1CyberGRUB-2077/icons/endeavouros.png new file mode 100644 index 0000000..7ebee1b Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/endeavouros.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/endless.png b/grub-themes/1CyberGRUB-2077/icons/endless.png new file mode 100644 index 0000000..b537c36 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/endless.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/fedora.png b/grub-themes/1CyberGRUB-2077/icons/fedora.png new file mode 100644 index 0000000..2910d2a Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/fedora.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/feren.png b/grub-themes/1CyberGRUB-2077/icons/feren.png new file mode 100644 index 0000000..873e2c9 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/feren.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/freebsd.png b/grub-themes/1CyberGRUB-2077/icons/freebsd.png new file mode 100644 index 0000000..a30006c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/freebsd.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/garuda.png b/grub-themes/1CyberGRUB-2077/icons/garuda.png new file mode 100644 index 0000000..2d6f312 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/garuda.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/gentoo.png b/grub-themes/1CyberGRUB-2077/icons/gentoo.png new file mode 100644 index 0000000..47839ee Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/gentoo.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/gnu-linux.png b/grub-themes/1CyberGRUB-2077/icons/gnu-linux.png new file mode 100644 index 0000000..652efc1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/gnu-linux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/gnu.png b/grub-themes/1CyberGRUB-2077/icons/gnu.png new file mode 100644 index 0000000..1b6049b Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/gnu.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/kali.png b/grub-themes/1CyberGRUB-2077/icons/kali.png new file mode 100644 index 0000000..d63c1a4 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/kali.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/kaos.png b/grub-themes/1CyberGRUB-2077/icons/kaos.png new file mode 100644 index 0000000..b98f1aa Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/kaos.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/knoppix.png b/grub-themes/1CyberGRUB-2077/icons/knoppix.png new file mode 100644 index 0000000..465c3b9 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/knoppix.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/kubuntu.png b/grub-themes/1CyberGRUB-2077/icons/kubuntu.png new file mode 100644 index 0000000..a144268 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/kubuntu.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/lfs.png b/grub-themes/1CyberGRUB-2077/icons/lfs.png new file mode 100644 index 0000000..652efc1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/lfs.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/linux.png b/grub-themes/1CyberGRUB-2077/icons/linux.png new file mode 100644 index 0000000..652efc1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/linux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/linuxmint.png b/grub-themes/1CyberGRUB-2077/icons/linuxmint.png new file mode 100644 index 0000000..6c576c2 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/linuxmint.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/lite.png b/grub-themes/1CyberGRUB-2077/icons/lite.png new file mode 100644 index 0000000..42dcf93 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/lite.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/lubuntu.png b/grub-themes/1CyberGRUB-2077/icons/lubuntu.png new file mode 100644 index 0000000..348538d Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/lubuntu.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/mabox.png b/grub-themes/1CyberGRUB-2077/icons/mabox.png new file mode 100644 index 0000000..b3c5ace Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/mabox.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/macosx.png b/grub-themes/1CyberGRUB-2077/icons/macosx.png new file mode 100644 index 0000000..64d04ac Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/macosx.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/mageia.png b/grub-themes/1CyberGRUB-2077/icons/mageia.png new file mode 100644 index 0000000..6ba3df1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/mageia.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/manjaro.png b/grub-themes/1CyberGRUB-2077/icons/manjaro.png new file mode 100644 index 0000000..aaaf760 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/manjaro.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/manjarolinux.png b/grub-themes/1CyberGRUB-2077/icons/manjarolinux.png new file mode 100644 index 0000000..aaaf760 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/manjarolinux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/mate.png b/grub-themes/1CyberGRUB-2077/icons/mate.png new file mode 100644 index 0000000..1a611eb Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/mate.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/memtest.png b/grub-themes/1CyberGRUB-2077/icons/memtest.png new file mode 100644 index 0000000..a9ef6a1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/memtest.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/memtest86.png b/grub-themes/1CyberGRUB-2077/icons/memtest86.png new file mode 100644 index 0000000..a9ef6a1 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/memtest86.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/mx-linux.png b/grub-themes/1CyberGRUB-2077/icons/mx-linux.png new file mode 100644 index 0000000..1e458ea Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/mx-linux.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/neon.png b/grub-themes/1CyberGRUB-2077/icons/neon.png new file mode 100644 index 0000000..88263e5 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/neon.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/netrunner.png b/grub-themes/1CyberGRUB-2077/icons/netrunner.png new file mode 100644 index 0000000..31b6d15 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/netrunner.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/nixos.png b/grub-themes/1CyberGRUB-2077/icons/nixos.png new file mode 100644 index 0000000..511a0fd Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/nixos.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/openmandriva.png b/grub-themes/1CyberGRUB-2077/icons/openmandriva.png new file mode 100644 index 0000000..5153a15 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/openmandriva.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/opensuse.png b/grub-themes/1CyberGRUB-2077/icons/opensuse.png new file mode 100644 index 0000000..352508c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/opensuse.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/parrot.png b/grub-themes/1CyberGRUB-2077/icons/parrot.png new file mode 100644 index 0000000..df18a72 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/parrot.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/pc.png b/grub-themes/1CyberGRUB-2077/icons/pc.png new file mode 100644 index 0000000..5409ef0 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/pc.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/peppermint.png b/grub-themes/1CyberGRUB-2077/icons/peppermint.png new file mode 100644 index 0000000..25e9aa6 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/peppermint.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/pop.png b/grub-themes/1CyberGRUB-2077/icons/pop.png new file mode 100644 index 0000000..81bf32c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/pop.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/power.png b/grub-themes/1CyberGRUB-2077/icons/power.png new file mode 100644 index 0000000..d4a5e05 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/power.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/puppy.png b/grub-themes/1CyberGRUB-2077/icons/puppy.png new file mode 100644 index 0000000..edd557b Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/puppy.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/q4os.png b/grub-themes/1CyberGRUB-2077/icons/q4os.png new file mode 100644 index 0000000..1ff9717 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/q4os.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/qubes.png b/grub-themes/1CyberGRUB-2077/icons/qubes.png new file mode 100644 index 0000000..f7ce02c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/qubes.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/raspios.png b/grub-themes/1CyberGRUB-2077/icons/raspios.png new file mode 100644 index 0000000..40b6590 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/raspios.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/reborn.png b/grub-themes/1CyberGRUB-2077/icons/reborn.png new file mode 100644 index 0000000..a8b27ba Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/reborn.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/redhat.png b/grub-themes/1CyberGRUB-2077/icons/redhat.png new file mode 100644 index 0000000..72c4587 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/redhat.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/restart.png b/grub-themes/1CyberGRUB-2077/icons/restart.png new file mode 100644 index 0000000..1791f04 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/restart.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/rosa.png b/grub-themes/1CyberGRUB-2077/icons/rosa.png new file mode 100644 index 0000000..b31684d Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/rosa.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/septor.png b/grub-themes/1CyberGRUB-2077/icons/septor.png new file mode 100644 index 0000000..88ee8c8 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/septor.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/shutdown.png b/grub-themes/1CyberGRUB-2077/icons/shutdown.png new file mode 100644 index 0000000..d4a5e05 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/shutdown.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/slackware.png b/grub-themes/1CyberGRUB-2077/icons/slackware.png new file mode 100644 index 0000000..d2d4d57 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/slackware.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/solus.png b/grub-themes/1CyberGRUB-2077/icons/solus.png new file mode 100644 index 0000000..2f0b96b Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/solus.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/tails.png b/grub-themes/1CyberGRUB-2077/icons/tails.png new file mode 100644 index 0000000..c5e01be Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/tails.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/tinycore.png b/grub-themes/1CyberGRUB-2077/icons/tinycore.png new file mode 100644 index 0000000..d4240eb Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/tinycore.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/ubuntu.png b/grub-themes/1CyberGRUB-2077/icons/ubuntu.png new file mode 100644 index 0000000..b439ae6 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/ubuntu.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/ubuntuDDE.png b/grub-themes/1CyberGRUB-2077/icons/ubuntuDDE.png new file mode 100644 index 0000000..7353f5f Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/ubuntuDDE.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/uefi.png b/grub-themes/1CyberGRUB-2077/icons/uefi.png new file mode 100644 index 0000000..da79fb4 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/uefi.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/unity.png b/grub-themes/1CyberGRUB-2077/icons/unity.png new file mode 100644 index 0000000..28104f5 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/unity.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/void.png b/grub-themes/1CyberGRUB-2077/icons/void.png new file mode 100644 index 0000000..ba43060 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/void.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/windows.png b/grub-themes/1CyberGRUB-2077/icons/windows.png new file mode 100644 index 0000000..afc2a5b Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/windows.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/xubuntu.png b/grub-themes/1CyberGRUB-2077/icons/xubuntu.png new file mode 100644 index 0000000..0401276 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/xubuntu.png differ diff --git a/grub-themes/1CyberGRUB-2077/icons/zorin.png b/grub-themes/1CyberGRUB-2077/icons/zorin.png new file mode 100644 index 0000000..622b9a3 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/icons/zorin.png differ diff --git a/grub-themes/1CyberGRUB-2077/img/background.png b/grub-themes/1CyberGRUB-2077/img/background.png new file mode 100644 index 0000000..78799dc Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/img/background.png differ diff --git a/grub-themes/1CyberGRUB-2077/img/background_f.png b/grub-themes/1CyberGRUB-2077/img/background_f.png new file mode 100644 index 0000000..443eafa Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/img/background_f.png differ diff --git a/grub-themes/1CyberGRUB-2077/img/label.png b/grub-themes/1CyberGRUB-2077/img/label.png new file mode 100644 index 0000000..833de1e Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/img/label.png differ diff --git a/grub-themes/1CyberGRUB-2077/img/progress_c.png b/grub-themes/1CyberGRUB-2077/img/progress_c.png new file mode 100644 index 0000000..7ae7ca9 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/img/progress_c.png differ diff --git a/grub-themes/1CyberGRUB-2077/item/highlight_c.png b/grub-themes/1CyberGRUB-2077/item/highlight_c.png new file mode 100644 index 0000000..260ad9c Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/item/highlight_c.png differ diff --git a/grub-themes/1CyberGRUB-2077/label.png b/grub-themes/1CyberGRUB-2077/label.png new file mode 100644 index 0000000..833de1e Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/label.png differ diff --git a/grub-themes/1CyberGRUB-2077/logo.png b/grub-themes/1CyberGRUB-2077/logo.png new file mode 100644 index 0000000..85816ba Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/logo.png differ diff --git a/grub-themes/1CyberGRUB-2077/progress_c.png b/grub-themes/1CyberGRUB-2077/progress_c.png new file mode 100644 index 0000000..7ae7ca9 Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/progress_c.png differ diff --git a/grub-themes/1CyberGRUB-2077/terminus-ttf-16.pf2 b/grub-themes/1CyberGRUB-2077/terminus-ttf-16.pf2 new file mode 100644 index 0000000..ce560de Binary files /dev/null and b/grub-themes/1CyberGRUB-2077/terminus-ttf-16.pf2 differ diff --git a/grub-themes/1CyberGRUB-2077/theme.txt b/grub-themes/1CyberGRUB-2077/theme.txt new file mode 100644 index 0000000..2704330 --- /dev/null +++ b/grub-themes/1CyberGRUB-2077/theme.txt @@ -0,0 +1,142 @@ +# No Copyright + +# general settings +title-text: "" +desktop-image: "background.png" +desktop-color: "#000000" +terminal-font: "Terminus (TTF) Regular 16" +terminal-left: "0" +terminal-top: "0" +terminal-width: "100%" +terminal-height: "100%" +terminal-border: "0" + ++ label { + font = "Rajdhani Regular 32" + left = 0% + top = 8 + width = 100% + align = "center" + color = "#842624" + text = "GNU GRAND UNIFIED BOOTLOADER VER. 2.2" +} + ++ label { + font = "Rajdhani Regular 24" + left = 0% + top = 42 + width = 100% + align = "center" + color = "#f75d54" + text = "[DISPLAY 1]" +} + ++ image { + file = "logo.png" + top = 0 + left = 100%-200 +} + ++ image { + file = "label.png" + top = 8 + left = 8 +} + ++ label { + font = "Rajdhani Regular 16" + left = 8 + top = 48 + width = 100% + color = "#842624" + text = "[ >> ] SELECT OPERATING SYSTEM" +} + ++ label { + font = "Rajdhani Regular 16" + left = 8 + top = 66 + width = 100% + color = "#842624" + text = "[ ] LOAD OPERATING SYSTEM" +} + ++ label { + font = "Rajdhani Regular 16" + left = 8 + top = 84 + width = 100% + color = "#842624" + text = "[ ] LOAD INITRAMFS" +} + +# boot menu ++ boot_menu { + left = 35% + width = 35% + top = 30% + height = 40% + item_font = "Rajdhani Regular 24" + item_color = "#74d6cf" + selected_item_font = "Rajdhani Regular 24" + selected_item_color = "#74d6cf" + icon_width = 24 + icon_height = 24 + item_height = 35 + item_padding = 20 + item_icon_space = 5 + item_spacing = 5 + menu_pixmap_style = "item/no_*.png" + selected_item_pixmap_style = "item/highlight_*.png" +} + +# Show progress ++ progress_bar { + left = 0% + top = 100%-30 + width = 100% + height = 30 + id = "__timeout__" + text = "@TIMEOUT_NOTIFICATION_LONG@" + font = "Rajdhani Regular 18" + fg_color = "#ffffff" + bg_color = "#ffffff" + border_color = "#f75d54" + highlight_style = "progress_*.png" +} + ++ label { + font = "Rajdhani Regular 24" + left = 8 + top = 100%-136 + width = 100% + color = "#842624" + text = " ↑↓ - NAVIGATE" +} + ++ label { + font = "Rajdhani Regular 24" + left = 8 + top = 100%-112 + width = 100% + color = "#842624" + text = "<-' - CONFIRM" +} + ++ label { + font = "Rajdhani Regular 24" + left = 8 + top = 100%-86 + width = 100% + color = "#842624" + text = " E - OPTIONS" +} + ++ label { + font = "Rajdhani Regular 24" + left = 8 + top = 100%-60 + width = 100% + color = "#842624" + text = " C - COMMAND LINE" +} diff --git a/grub-themes/Crossgrub/Monocraft22.pf2 b/grub-themes/Crossgrub/Monocraft22.pf2 new file mode 100644 index 0000000..be68248 Binary files /dev/null and b/grub-themes/Crossgrub/Monocraft22.pf2 differ diff --git a/grub-themes/Crossgrub/PixelFont30.pf2 b/grub-themes/Crossgrub/PixelFont30.pf2 new file mode 100644 index 0000000..f24de13 Binary files /dev/null and b/grub-themes/Crossgrub/PixelFont30.pf2 differ diff --git a/grub-themes/Crossgrub/background.png b/grub-themes/Crossgrub/background.png new file mode 100644 index 0000000..02e0cfc Binary files /dev/null and b/grub-themes/Crossgrub/background.png differ diff --git a/grub-themes/Crossgrub/item_c.png b/grub-themes/Crossgrub/item_c.png new file mode 100644 index 0000000..3bcb945 Binary files /dev/null and b/grub-themes/Crossgrub/item_c.png differ diff --git a/grub-themes/Crossgrub/item_e.png b/grub-themes/Crossgrub/item_e.png new file mode 100644 index 0000000..2187f4b Binary files /dev/null and b/grub-themes/Crossgrub/item_e.png differ diff --git a/grub-themes/Crossgrub/item_n.png b/grub-themes/Crossgrub/item_n.png new file mode 100644 index 0000000..5030c00 Binary files /dev/null and b/grub-themes/Crossgrub/item_n.png differ diff --git a/grub-themes/Crossgrub/item_ne.png b/grub-themes/Crossgrub/item_ne.png new file mode 100644 index 0000000..a0da258 Binary files /dev/null and b/grub-themes/Crossgrub/item_ne.png differ diff --git a/grub-themes/Crossgrub/item_nw.png b/grub-themes/Crossgrub/item_nw.png new file mode 100644 index 0000000..2f0e0dd Binary files /dev/null and b/grub-themes/Crossgrub/item_nw.png differ diff --git a/grub-themes/Crossgrub/item_s.png b/grub-themes/Crossgrub/item_s.png new file mode 100644 index 0000000..bfa4df7 Binary files /dev/null and b/grub-themes/Crossgrub/item_s.png differ diff --git a/grub-themes/Crossgrub/item_se.png b/grub-themes/Crossgrub/item_se.png new file mode 100644 index 0000000..98413d6 Binary files /dev/null and b/grub-themes/Crossgrub/item_se.png differ diff --git a/grub-themes/Crossgrub/item_sw.png b/grub-themes/Crossgrub/item_sw.png new file mode 100644 index 0000000..3d2d3ef Binary files /dev/null and b/grub-themes/Crossgrub/item_sw.png differ diff --git a/grub-themes/Crossgrub/item_w.png b/grub-themes/Crossgrub/item_w.png new file mode 100644 index 0000000..643b691 Binary files /dev/null and b/grub-themes/Crossgrub/item_w.png differ diff --git a/grub-themes/Crossgrub/selected_item_c.png b/grub-themes/Crossgrub/selected_item_c.png new file mode 100644 index 0000000..8a54665 Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_c.png differ diff --git a/grub-themes/Crossgrub/selected_item_e.png b/grub-themes/Crossgrub/selected_item_e.png new file mode 100644 index 0000000..a976947 Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_e.png differ diff --git a/grub-themes/Crossgrub/selected_item_n.png b/grub-themes/Crossgrub/selected_item_n.png new file mode 100644 index 0000000..2ad43a8 Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_n.png differ diff --git a/grub-themes/Crossgrub/selected_item_ne.png b/grub-themes/Crossgrub/selected_item_ne.png new file mode 100644 index 0000000..6350b9d Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_ne.png differ diff --git a/grub-themes/Crossgrub/selected_item_nw.png b/grub-themes/Crossgrub/selected_item_nw.png new file mode 100644 index 0000000..536681d Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_nw.png differ diff --git a/grub-themes/Crossgrub/selected_item_s.png b/grub-themes/Crossgrub/selected_item_s.png new file mode 100644 index 0000000..972cd1b Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_s.png differ diff --git a/grub-themes/Crossgrub/selected_item_se.png b/grub-themes/Crossgrub/selected_item_se.png new file mode 100644 index 0000000..b93b3c9 Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_se.png differ diff --git a/grub-themes/Crossgrub/selected_item_sw.png b/grub-themes/Crossgrub/selected_item_sw.png new file mode 100644 index 0000000..48033fb Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_sw.png differ diff --git a/grub-themes/Crossgrub/selected_item_w.png b/grub-themes/Crossgrub/selected_item_w.png new file mode 100644 index 0000000..691e93e Binary files /dev/null and b/grub-themes/Crossgrub/selected_item_w.png differ diff --git a/grub-themes/Crossgrub/term_e.png b/grub-themes/Crossgrub/term_e.png new file mode 100644 index 0000000..4405cce Binary files /dev/null and b/grub-themes/Crossgrub/term_e.png differ diff --git a/grub-themes/Crossgrub/term_n.png b/grub-themes/Crossgrub/term_n.png new file mode 100644 index 0000000..5bce1a4 Binary files /dev/null and b/grub-themes/Crossgrub/term_n.png differ diff --git a/grub-themes/Crossgrub/term_ne.png b/grub-themes/Crossgrub/term_ne.png new file mode 100644 index 0000000..7b7e7ca Binary files /dev/null and b/grub-themes/Crossgrub/term_ne.png differ diff --git a/grub-themes/Crossgrub/term_nw.png b/grub-themes/Crossgrub/term_nw.png new file mode 100644 index 0000000..8bce39a Binary files /dev/null and b/grub-themes/Crossgrub/term_nw.png differ diff --git a/grub-themes/Crossgrub/term_s.png b/grub-themes/Crossgrub/term_s.png new file mode 100644 index 0000000..26e9879 Binary files /dev/null and b/grub-themes/Crossgrub/term_s.png differ diff --git a/grub-themes/Crossgrub/term_se.png b/grub-themes/Crossgrub/term_se.png new file mode 100644 index 0000000..f7093b8 Binary files /dev/null and b/grub-themes/Crossgrub/term_se.png differ diff --git a/grub-themes/Crossgrub/term_sw.png b/grub-themes/Crossgrub/term_sw.png new file mode 100644 index 0000000..eddefe9 Binary files /dev/null and b/grub-themes/Crossgrub/term_sw.png differ diff --git a/grub-themes/Crossgrub/term_w.png b/grub-themes/Crossgrub/term_w.png new file mode 100644 index 0000000..1e918bd Binary files /dev/null and b/grub-themes/Crossgrub/term_w.png differ diff --git a/grub-themes/Crossgrub/theme.txt b/grub-themes/Crossgrub/theme.txt new file mode 100644 index 0000000..17fdf1f --- /dev/null +++ b/grub-themes/Crossgrub/theme.txt @@ -0,0 +1,79 @@ +# Global + +title-text: "" +desktop-image: "background.png" + +# Terminal for Console and Options +terminal-border: "20" +terminal-left: "20%" +terminal-top: "20%+23" +terminal-width: "60%" +terminal-height: "60%" +terminal-box: "term_*.png" +terminal-font: "Monocraft Regular 22" + +# SHADOW ++ boot_menu { + left = 2%-1 + top = 60%-1 + width = 600 + height = 500 + + item_font = "PixelHallfeticaJP10P Regular 30" + item_color = white + selected_item_color = white + item_height = 30 + item_icon_space = -20 + item_spacing = 45 + scrollbar = false +} + ++ boot_menu { + left = 2% + top = 60% + width = 600 + height = 500 + + item_font = "PixelHallfeticaJP10P Regular 30" + item_color = black + selected_item_color = black + item_height = 30 + item_padding = 0 + item_icon_space = -20 + item_spacing = 45 + item_pixmap_style = "item_*.png" + selected_item_pixmap_style = "selected_item_*.png" + scrollbar = false +} + +# TEXT ++ label { + id = "__timeout__" + + left = 50% + top = 100%-50 + height = 24 + width = 50%-6 + + text = "Executing selected entry in %d seconds" + align = "right" + font = "PixelHallfeticaJP10P Regular 30" + color = "white" +} + +# SHADOW ++ label { + id = "__timeout__" + + left = 50%+3 + top = 100%-47 + height = 24 + width = 50%-6 + + text = "Executing selected entry in %d seconds" + align = "right" + font = "PixelHallfeticaJP10P Regular 30" + color = "#3f3f3f" +} + + diff --git a/grub-themes/Mesugaki-bsol/background.png b/grub-themes/Mesugaki-bsol/background.png new file mode 100644 index 0000000..1feae88 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/background.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/4MLinux.png b/grub-themes/Mesugaki-bsol/icons/4MLinux.png new file mode 100644 index 0000000..1c6fe5e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/4MLinux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/AlpineLinux.png b/grub-themes/Mesugaki-bsol/icons/AlpineLinux.png new file mode 100644 index 0000000..6212a1f Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/AlpineLinux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/Manjaro.i686.png b/grub-themes/Mesugaki-bsol/icons/Manjaro.i686.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/Manjaro.i686.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/Manjaro.x86_64.png b/grub-themes/Mesugaki-bsol/icons/Manjaro.x86_64.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/Manjaro.x86_64.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/SystemRescueCD.png b/grub-themes/Mesugaki-bsol/icons/SystemRescueCD.png new file mode 100644 index 0000000..7c41182 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/SystemRescueCD.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/alma.png b/grub-themes/Mesugaki-bsol/icons/alma.png new file mode 100644 index 0000000..ef56f3e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/alma.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/android.png b/grub-themes/Mesugaki-bsol/icons/android.png new file mode 100644 index 0000000..dad066f Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/android.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/anonymous.png b/grub-themes/Mesugaki-bsol/icons/anonymous.png new file mode 100644 index 0000000..7d165b6 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/anonymous.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/antergos.png b/grub-themes/Mesugaki-bsol/icons/antergos.png new file mode 100644 index 0000000..32e3a3a Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/antergos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/arch.png b/grub-themes/Mesugaki-bsol/icons/arch.png new file mode 100644 index 0000000..f6cd870 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/arch.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/archcraft.png b/grub-themes/Mesugaki-bsol/icons/archcraft.png new file mode 100644 index 0000000..82e5026 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/archcraft.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/archlinux.png b/grub-themes/Mesugaki-bsol/icons/archlinux.png new file mode 100644 index 0000000..f6cd870 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/archlinux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/arcolinux.png b/grub-themes/Mesugaki-bsol/icons/arcolinux.png new file mode 100644 index 0000000..c5e5e5e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/arcolinux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/artix.png b/grub-themes/Mesugaki-bsol/icons/artix.png new file mode 100644 index 0000000..0cbeb11 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/artix.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/bedrock.png b/grub-themes/Mesugaki-bsol/icons/bedrock.png new file mode 100644 index 0000000..58ff48a Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/bedrock.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/cancel.png b/grub-themes/Mesugaki-bsol/icons/cancel.png new file mode 100644 index 0000000..fca2ac9 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/cancel.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/centos.png b/grub-themes/Mesugaki-bsol/icons/centos.png new file mode 100644 index 0000000..23fe2fa Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/centos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/chakra.png b/grub-themes/Mesugaki-bsol/icons/chakra.png new file mode 100644 index 0000000..6f63a95 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/chakra.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/chromeos.png b/grub-themes/Mesugaki-bsol/icons/chromeos.png new file mode 100644 index 0000000..5aff9c5 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/chromeos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/debian.png b/grub-themes/Mesugaki-bsol/icons/debian.png new file mode 100644 index 0000000..20bea8c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/debian.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/deepin.png b/grub-themes/Mesugaki-bsol/icons/deepin.png new file mode 100644 index 0000000..61c92fb Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/deepin.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/devuan.png b/grub-themes/Mesugaki-bsol/icons/devuan.png new file mode 100644 index 0000000..ff65401 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/devuan.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/driver.png b/grub-themes/Mesugaki-bsol/icons/driver.png new file mode 100644 index 0000000..1621ee7 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/driver.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/edit.png b/grub-themes/Mesugaki-bsol/icons/edit.png new file mode 100644 index 0000000..6a43bd9 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/edit.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/efi.png b/grub-themes/Mesugaki-bsol/icons/efi.png new file mode 100644 index 0000000..4ecf3b9 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/efi.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/elementary.png b/grub-themes/Mesugaki-bsol/icons/elementary.png new file mode 100644 index 0000000..2840354 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/elementary.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/endeavouros.png b/grub-themes/Mesugaki-bsol/icons/endeavouros.png new file mode 100644 index 0000000..6b1e530 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/endeavouros.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/fedora.png b/grub-themes/Mesugaki-bsol/icons/fedora.png new file mode 100644 index 0000000..926b56d Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/fedora.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/find.efi.png b/grub-themes/Mesugaki-bsol/icons/find.efi.png new file mode 100644 index 0000000..0e32321 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/find.efi.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/find.none.png b/grub-themes/Mesugaki-bsol/icons/find.none.png new file mode 100644 index 0000000..87d4d0e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/find.none.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/freebsd.png b/grub-themes/Mesugaki-bsol/icons/freebsd.png new file mode 100644 index 0000000..fb9408c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/freebsd.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/garuda.png b/grub-themes/Mesugaki-bsol/icons/garuda.png new file mode 100644 index 0000000..f699718 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/garuda.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/gentoo.png b/grub-themes/Mesugaki-bsol/icons/gentoo.png new file mode 100644 index 0000000..bc0ed70 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/gentoo.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/gnu-linux.png b/grub-themes/Mesugaki-bsol/icons/gnu-linux.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/gnu-linux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/haiku.png b/grub-themes/Mesugaki-bsol/icons/haiku.png new file mode 100644 index 0000000..ce7f818 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/haiku.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/help.png b/grub-themes/Mesugaki-bsol/icons/help.png new file mode 100644 index 0000000..d8b5a17 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/help.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/kali.png b/grub-themes/Mesugaki-bsol/icons/kali.png new file mode 100644 index 0000000..900dc82 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/kali.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/kaos.png b/grub-themes/Mesugaki-bsol/icons/kaos.png new file mode 100644 index 0000000..9fd4e89 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/kaos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/kbd.png b/grub-themes/Mesugaki-bsol/icons/kbd.png new file mode 100644 index 0000000..6ace3ac Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/kbd.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/korora.png b/grub-themes/Mesugaki-bsol/icons/korora.png new file mode 100644 index 0000000..456e876 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/korora.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/kubuntu.png b/grub-themes/Mesugaki-bsol/icons/kubuntu.png new file mode 100644 index 0000000..7a79ff3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/kubuntu.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/lang.png b/grub-themes/Mesugaki-bsol/icons/lang.png new file mode 100644 index 0000000..3c9c1d7 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/lang.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/lfs.png b/grub-themes/Mesugaki-bsol/icons/lfs.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/lfs.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/linux.png b/grub-themes/Mesugaki-bsol/icons/linux.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/linux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/linuxlite.png b/grub-themes/Mesugaki-bsol/icons/linuxlite.png new file mode 100644 index 0000000..42ab8d1 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/linuxlite.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/linuxmint.png b/grub-themes/Mesugaki-bsol/icons/linuxmint.png new file mode 100644 index 0000000..7d9da81 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/linuxmint.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/lubuntu.png b/grub-themes/Mesugaki-bsol/icons/lubuntu.png new file mode 100644 index 0000000..0ead7d8 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/lubuntu.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/macosx.png b/grub-themes/Mesugaki-bsol/icons/macosx.png new file mode 100644 index 0000000..ea03e77 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/macosx.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/mageia.png b/grub-themes/Mesugaki-bsol/icons/mageia.png new file mode 100644 index 0000000..79afa76 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/mageia.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/manjaro.png b/grub-themes/Mesugaki-bsol/icons/manjaro.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/manjaro.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/mate.png b/grub-themes/Mesugaki-bsol/icons/mate.png new file mode 100644 index 0000000..b2fc22a Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/mate.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/memtest.png b/grub-themes/Mesugaki-bsol/icons/memtest.png new file mode 100644 index 0000000..1621ee7 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/memtest.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/mx-linux.png b/grub-themes/Mesugaki-bsol/icons/mx-linux.png new file mode 100644 index 0000000..49f1133 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/mx-linux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/neon.png b/grub-themes/Mesugaki-bsol/icons/neon.png new file mode 100644 index 0000000..e41906e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/neon.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/nix.png b/grub-themes/Mesugaki-bsol/icons/nix.png new file mode 100644 index 0000000..dcf33a0 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/nix.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/nixos.png b/grub-themes/Mesugaki-bsol/icons/nixos.png new file mode 100644 index 0000000..dcf33a0 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/nixos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/nobara.png b/grub-themes/Mesugaki-bsol/icons/nobara.png new file mode 100644 index 0000000..9f9bb5b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/nobara.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/opensuse.png b/grub-themes/Mesugaki-bsol/icons/opensuse.png new file mode 100644 index 0000000..d844fd5 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/opensuse.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/parabola.png b/grub-themes/Mesugaki-bsol/icons/parabola.png new file mode 100644 index 0000000..2a7804b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/parabola.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/parrot.png b/grub-themes/Mesugaki-bsol/icons/parrot.png new file mode 100644 index 0000000..3333de9 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/parrot.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/pop-os.png b/grub-themes/Mesugaki-bsol/icons/pop-os.png new file mode 100644 index 0000000..014d9f3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/pop-os.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/pop.png b/grub-themes/Mesugaki-bsol/icons/pop.png new file mode 100644 index 0000000..014d9f3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/pop.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/recovery.png b/grub-themes/Mesugaki-bsol/icons/recovery.png new file mode 100644 index 0000000..7b69b14 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/recovery.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/regolith.png b/grub-themes/Mesugaki-bsol/icons/regolith.png new file mode 100644 index 0000000..5ece07b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/regolith.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/restart.png b/grub-themes/Mesugaki-bsol/icons/restart.png new file mode 100644 index 0000000..9715302 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/restart.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/rocky.png b/grub-themes/Mesugaki-bsol/icons/rocky.png new file mode 100644 index 0000000..be144f6 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/rocky.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/shutdown.png b/grub-themes/Mesugaki-bsol/icons/shutdown.png new file mode 100644 index 0000000..fc9cf16 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/shutdown.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/siduction.png b/grub-themes/Mesugaki-bsol/icons/siduction.png new file mode 100644 index 0000000..d16549b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/siduction.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/silverblue.png b/grub-themes/Mesugaki-bsol/icons/silverblue.png new file mode 100644 index 0000000..3c20839 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/silverblue.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/slackware.png b/grub-themes/Mesugaki-bsol/icons/slackware.png new file mode 100644 index 0000000..4c31a3f Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/slackware.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/solus.png b/grub-themes/Mesugaki-bsol/icons/solus.png new file mode 100644 index 0000000..338718b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/solus.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/steamos.png b/grub-themes/Mesugaki-bsol/icons/steamos.png new file mode 100644 index 0000000..df28bcc Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/steamos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/type.png b/grub-themes/Mesugaki-bsol/icons/type.png new file mode 100644 index 0000000..5c48476 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/type.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/tz.png b/grub-themes/Mesugaki-bsol/icons/tz.png new file mode 100644 index 0000000..220b29b Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/tz.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/ubuntu.png b/grub-themes/Mesugaki-bsol/icons/ubuntu.png new file mode 100644 index 0000000..352fbe0 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/ubuntu.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/ultramarine.png b/grub-themes/Mesugaki-bsol/icons/ultramarine.png new file mode 100644 index 0000000..ef307fd Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/ultramarine.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/unknown.png b/grub-themes/Mesugaki-bsol/icons/unknown.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/unknown.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/unset.png b/grub-themes/Mesugaki-bsol/icons/unset.png new file mode 100644 index 0000000..15e3d3c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/unset.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/vanillaos.png b/grub-themes/Mesugaki-bsol/icons/vanillaos.png new file mode 100644 index 0000000..4bce88c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/vanillaos.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/ventoy.png b/grub-themes/Mesugaki-bsol/icons/ventoy.png new file mode 100644 index 0000000..7abdc6c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/ventoy.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/void.png b/grub-themes/Mesugaki-bsol/icons/void.png new file mode 100644 index 0000000..01cc2f3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/void.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/windows.png b/grub-themes/Mesugaki-bsol/icons/windows.png new file mode 100644 index 0000000..d5c7cc3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/windows.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/windows11.png b/grub-themes/Mesugaki-bsol/icons/windows11.png new file mode 100644 index 0000000..fe97d9f Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/windows11.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/xero.png b/grub-themes/Mesugaki-bsol/icons/xero.png new file mode 100644 index 0000000..2221c73 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/xero.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/xerolinux.png b/grub-themes/Mesugaki-bsol/icons/xerolinux.png new file mode 100644 index 0000000..2221c73 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/xerolinux.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/xubuntu.png b/grub-themes/Mesugaki-bsol/icons/xubuntu.png new file mode 100644 index 0000000..f43abc7 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/xubuntu.png differ diff --git a/grub-themes/Mesugaki-bsol/icons/zorin.png b/grub-themes/Mesugaki-bsol/icons/zorin.png new file mode 100644 index 0000000..c1506c4 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/icons/zorin.png differ diff --git a/grub-themes/Mesugaki-bsol/select_c.png b/grub-themes/Mesugaki-bsol/select_c.png new file mode 100644 index 0000000..b1f8d58 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/select_c.png differ diff --git a/grub-themes/Mesugaki-bsol/select_e.png b/grub-themes/Mesugaki-bsol/select_e.png new file mode 100644 index 0000000..9332368 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/select_e.png differ diff --git a/grub-themes/Mesugaki-bsol/select_w.png b/grub-themes/Mesugaki-bsol/select_w.png new file mode 100644 index 0000000..28f6424 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/select_w.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_c.png b/grub-themes/Mesugaki-bsol/terminal_box_c.png new file mode 100644 index 0000000..d0dd52a Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_c.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_e.png b/grub-themes/Mesugaki-bsol/terminal_box_e.png new file mode 100644 index 0000000..394cbe4 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_e.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_n.png b/grub-themes/Mesugaki-bsol/terminal_box_n.png new file mode 100644 index 0000000..476f8bc Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_n.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_ne.png b/grub-themes/Mesugaki-bsol/terminal_box_ne.png new file mode 100644 index 0000000..9e26959 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_ne.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_nw.png b/grub-themes/Mesugaki-bsol/terminal_box_nw.png new file mode 100644 index 0000000..5c3cba8 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_nw.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_s.png b/grub-themes/Mesugaki-bsol/terminal_box_s.png new file mode 100644 index 0000000..85a8901 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_s.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_se.png b/grub-themes/Mesugaki-bsol/terminal_box_se.png new file mode 100644 index 0000000..d8627ee Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_se.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_sw.png b/grub-themes/Mesugaki-bsol/terminal_box_sw.png new file mode 100644 index 0000000..67c600c Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_sw.png differ diff --git a/grub-themes/Mesugaki-bsol/terminal_box_w.png b/grub-themes/Mesugaki-bsol/terminal_box_w.png new file mode 100644 index 0000000..d066e2d Binary files /dev/null and b/grub-themes/Mesugaki-bsol/terminal_box_w.png differ diff --git a/grub-themes/Mesugaki-bsol/theme.txt b/grub-themes/Mesugaki-bsol/theme.txt new file mode 100644 index 0000000..6bc8fd3 --- /dev/null +++ b/grub-themes/Mesugaki-bsol/theme.txt @@ -0,0 +1,46 @@ +# Global options +title-text: "" +desktop-image: "background.png" +desktop-color: "#000000" +terminal-font: "Victor Mono Italic 20" +terminal-box: "terminal_box_*.png" +terminal-left: "0" +terminal-top: "0" +terminal-width: "100%" +terminal-height: "100%" +terminal-border: "0" + +# Boot menu ++ boot_menu { + left = 17% + top = 53% + width = 47% + height = 65% + item_font = "Victor Mono Bold Italic 24" + item_color = "#cccccc" + selected_item_color = "#ffffff" + icon_width = 50 + icon_height = 50 + item_icon_space = 20 + item_height = 40 + item_padding = 2 + item_spacing = 10 + selected_item_pixmap_style = "select_*.png" +} + + +# Countdown ++ label { + # [修改] 距离左侧 0,占满全宽,并使用 center 居中对齐,保证在不同分辨率下绝对居中 + left = 0 + width = 100% + align = "center" + + # [修改] 垂直位置,90% 代表距离屏幕顶部 90% 的位置,即屏幕底部区域 (可根据需求微调为 85% 或 95%) + top = 90% + + id = "__timeout__" + text = "Selected OS will start in %d seconds" + color = "#cccccc" + font = "Victor Mono Bold Italic 28" +} diff --git a/grub-themes/Mesugaki-bsol/vmi20.pf2 b/grub-themes/Mesugaki-bsol/vmi20.pf2 new file mode 100644 index 0000000..f2b2fb6 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/vmi20.pf2 differ diff --git a/grub-themes/Mesugaki-bsol/vmi24b.pf2 b/grub-themes/Mesugaki-bsol/vmi24b.pf2 new file mode 100644 index 0000000..94cfd86 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/vmi24b.pf2 differ diff --git a/grub-themes/Mesugaki-bsol/vmi28b.pf2 b/grub-themes/Mesugaki-bsol/vmi28b.pf2 new file mode 100644 index 0000000..839bf4e Binary files /dev/null and b/grub-themes/Mesugaki-bsol/vmi28b.pf2 differ diff --git a/grub-themes/Mesugaki-bsol/vmr16.pf2 b/grub-themes/Mesugaki-bsol/vmr16.pf2 new file mode 100644 index 0000000..4aa00b3 Binary files /dev/null and b/grub-themes/Mesugaki-bsol/vmr16.pf2 differ diff --git a/grub-themes/OldBIOS/f/mbytepc230_regular_16.pf2 b/grub-themes/OldBIOS/f/mbytepc230_regular_16.pf2 new file mode 100644 index 0000000..cd5497c Binary files /dev/null and b/grub-themes/OldBIOS/f/mbytepc230_regular_16.pf2 differ diff --git a/grub-themes/OldBIOS/frame_n.png b/grub-themes/OldBIOS/frame_n.png new file mode 100644 index 0000000..7e1c8da Binary files /dev/null and b/grub-themes/OldBIOS/frame_n.png differ diff --git a/grub-themes/OldBIOS/frame_ne.png b/grub-themes/OldBIOS/frame_ne.png new file mode 100644 index 0000000..0fb2223 Binary files /dev/null and b/grub-themes/OldBIOS/frame_ne.png differ diff --git a/grub-themes/OldBIOS/frame_nw.png b/grub-themes/OldBIOS/frame_nw.png new file mode 100644 index 0000000..48385f4 Binary files /dev/null and b/grub-themes/OldBIOS/frame_nw.png differ diff --git a/grub-themes/OldBIOS/frame_s.png b/grub-themes/OldBIOS/frame_s.png new file mode 100644 index 0000000..5402576 Binary files /dev/null and b/grub-themes/OldBIOS/frame_s.png differ diff --git a/grub-themes/OldBIOS/frame_se.png b/grub-themes/OldBIOS/frame_se.png new file mode 100644 index 0000000..3d66a61 Binary files /dev/null and b/grub-themes/OldBIOS/frame_se.png differ diff --git a/grub-themes/OldBIOS/frame_sw.png b/grub-themes/OldBIOS/frame_sw.png new file mode 100644 index 0000000..d37754e Binary files /dev/null and b/grub-themes/OldBIOS/frame_sw.png differ diff --git a/grub-themes/OldBIOS/inbox_c.png b/grub-themes/OldBIOS/inbox_c.png new file mode 100644 index 0000000..6bf7e35 Binary files /dev/null and b/grub-themes/OldBIOS/inbox_c.png differ diff --git a/grub-themes/OldBIOS/inbox_e.png b/grub-themes/OldBIOS/inbox_e.png new file mode 100644 index 0000000..02f320a Binary files /dev/null and b/grub-themes/OldBIOS/inbox_e.png differ diff --git a/grub-themes/OldBIOS/inbox_w.png b/grub-themes/OldBIOS/inbox_w.png new file mode 100644 index 0000000..8cc5c54 Binary files /dev/null and b/grub-themes/OldBIOS/inbox_w.png differ diff --git a/grub-themes/OldBIOS/selected_blob_c.png b/grub-themes/OldBIOS/selected_blob_c.png new file mode 100644 index 0000000..5664fa3 Binary files /dev/null and b/grub-themes/OldBIOS/selected_blob_c.png differ diff --git a/grub-themes/OldBIOS/theme.txt b/grub-themes/OldBIOS/theme.txt new file mode 100644 index 0000000..9177593 --- /dev/null +++ b/grub-themes/OldBIOS/theme.txt @@ -0,0 +1,67 @@ +title-text: "" +desktop-color: "#000000" +terminal-font: "VGA Regular 16" + +#menu ++ boot_menu { + left = 50%-284 + top = 50%-62 + width = 568 + height = 124 + item_font = "MBytePC230 Regular 16" + selected_item_font = "MBytePC230 Regular 16" + icon_width = 4 + item_height = 20 + item_padding = 0 + item_icon_space = 0 + item_spacing = 1 + selected_item_pixmap_style = "selected_blob_*.png" + scrollbar = true + scrollbar_width = 0 + item_color = "#ffffff" + selected_item_color = "#ffffff" + + menu_pixmap_style = "inbox_*.png" +} + +# "Please select boot device:" ++ canvas { + + left = 50%-284 + top = 50%-62-56 + width = 568 + height = 56 + + + label { left = 0 top = 22 width = 100% height = 16 color = "white" align = "center" text = "Please select boot device:" font = "Mbytepc230 Regular 16" } + + + image { file = "frame_s.png" left = 8 top = 100%-12 width = 100%-16 height = 12 } + + image { file = "frame_nw.png" left = 0 top = 0 } + + image { file = "frame_n.png" left = 8 top = 0 width = 100%-16 height = 12 } + + image { file = "frame_ne.png" left = 100%-8 top = 0 } + + image { file = "inbox_e.png" left = 100%-16 top = 12 width = 16 height = 100%-12 } + + image { file = "inbox_w.png" left = 0 top = 12 width = 16 height = 100%-12 } + + image { file = "inbox_c.png" left = 16 top = 12 width = 100%-32 height = 100%-24 } +} + +# "↑ and ↓ to move selection ..." ++ canvas { + + left = 50%-284 + top = 50%+62 + width = 568 + height = 91 + + + label { left = 0 top = 21 width = 100% height = 16 color = "white" align = "center" text = "↑ and ↓ to move selection" font = "MBytePC230 Regular 16" } + + label { left = 0 top = 39 width = 100% height = 16 color = "white" align = "center" text = "ENTER to select boot device" font = "MBytePC230 Regular 16" } + + label { left = 0 top = 57 width = 100% height = 16 color = "white" align = "center" text = "ESC to boot using defaults" font = "MBytePC230 Regular 16" } + + + image { file = "frame_n.png" left = 8 top = 0 width = 100%-16 height = 12 } + + image { file = "inbox_e.png" left = 100%-16 top = 0 width = 16 height = 100%-12 } + + image { file = "frame_se.png" left = 100%-8 top = 100%-12 } + + image { file = "frame_s.png" left = 8 top = 100%-12 width = 100%-16 height = 12 } + + image { file = "frame_sw.png" left = 0 top = 100%-12 } + + image { file = "inbox_w.png" left = 0 top = 0 width = 16 height = 100%-12 } + + image { file = "inbox_c.png" left = 16 top = 12 width = 100%-32 height = 100%-24 } + +} + diff --git a/grub-themes/bsol/background.png b/grub-themes/bsol/background.png new file mode 100644 index 0000000..8e14c61 Binary files /dev/null and b/grub-themes/bsol/background.png differ diff --git a/grub-themes/bsol/icons/4MLinux.png b/grub-themes/bsol/icons/4MLinux.png new file mode 100644 index 0000000..1c6fe5e Binary files /dev/null and b/grub-themes/bsol/icons/4MLinux.png differ diff --git a/grub-themes/bsol/icons/AlpineLinux.png b/grub-themes/bsol/icons/AlpineLinux.png new file mode 100644 index 0000000..6212a1f Binary files /dev/null and b/grub-themes/bsol/icons/AlpineLinux.png differ diff --git a/grub-themes/bsol/icons/Manjaro.i686.png b/grub-themes/bsol/icons/Manjaro.i686.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/bsol/icons/Manjaro.i686.png differ diff --git a/grub-themes/bsol/icons/Manjaro.x86_64.png b/grub-themes/bsol/icons/Manjaro.x86_64.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/bsol/icons/Manjaro.x86_64.png differ diff --git a/grub-themes/bsol/icons/SystemRescueCD.png b/grub-themes/bsol/icons/SystemRescueCD.png new file mode 100644 index 0000000..7c41182 Binary files /dev/null and b/grub-themes/bsol/icons/SystemRescueCD.png differ diff --git a/grub-themes/bsol/icons/alma.png b/grub-themes/bsol/icons/alma.png new file mode 100644 index 0000000..ef56f3e Binary files /dev/null and b/grub-themes/bsol/icons/alma.png differ diff --git a/grub-themes/bsol/icons/android.png b/grub-themes/bsol/icons/android.png new file mode 100644 index 0000000..dad066f Binary files /dev/null and b/grub-themes/bsol/icons/android.png differ diff --git a/grub-themes/bsol/icons/anonymous.png b/grub-themes/bsol/icons/anonymous.png new file mode 100644 index 0000000..7d165b6 Binary files /dev/null and b/grub-themes/bsol/icons/anonymous.png differ diff --git a/grub-themes/bsol/icons/antergos.png b/grub-themes/bsol/icons/antergos.png new file mode 100644 index 0000000..32e3a3a Binary files /dev/null and b/grub-themes/bsol/icons/antergos.png differ diff --git a/grub-themes/bsol/icons/arch.png b/grub-themes/bsol/icons/arch.png new file mode 100644 index 0000000..f6cd870 Binary files /dev/null and b/grub-themes/bsol/icons/arch.png differ diff --git a/grub-themes/bsol/icons/archcraft.png b/grub-themes/bsol/icons/archcraft.png new file mode 100644 index 0000000..82e5026 Binary files /dev/null and b/grub-themes/bsol/icons/archcraft.png differ diff --git a/grub-themes/bsol/icons/archlinux.png b/grub-themes/bsol/icons/archlinux.png new file mode 100644 index 0000000..f6cd870 Binary files /dev/null and b/grub-themes/bsol/icons/archlinux.png differ diff --git a/grub-themes/bsol/icons/arcolinux.png b/grub-themes/bsol/icons/arcolinux.png new file mode 100644 index 0000000..c5e5e5e Binary files /dev/null and b/grub-themes/bsol/icons/arcolinux.png differ diff --git a/grub-themes/bsol/icons/artix.png b/grub-themes/bsol/icons/artix.png new file mode 100644 index 0000000..0cbeb11 Binary files /dev/null and b/grub-themes/bsol/icons/artix.png differ diff --git a/grub-themes/bsol/icons/bedrock.png b/grub-themes/bsol/icons/bedrock.png new file mode 100644 index 0000000..58ff48a Binary files /dev/null and b/grub-themes/bsol/icons/bedrock.png differ diff --git a/grub-themes/bsol/icons/cancel.png b/grub-themes/bsol/icons/cancel.png new file mode 100644 index 0000000..fca2ac9 Binary files /dev/null and b/grub-themes/bsol/icons/cancel.png differ diff --git a/grub-themes/bsol/icons/centos.png b/grub-themes/bsol/icons/centos.png new file mode 100644 index 0000000..23fe2fa Binary files /dev/null and b/grub-themes/bsol/icons/centos.png differ diff --git a/grub-themes/bsol/icons/chakra.png b/grub-themes/bsol/icons/chakra.png new file mode 100644 index 0000000..6f63a95 Binary files /dev/null and b/grub-themes/bsol/icons/chakra.png differ diff --git a/grub-themes/bsol/icons/chromeos.png b/grub-themes/bsol/icons/chromeos.png new file mode 100644 index 0000000..5aff9c5 Binary files /dev/null and b/grub-themes/bsol/icons/chromeos.png differ diff --git a/grub-themes/bsol/icons/debian.png b/grub-themes/bsol/icons/debian.png new file mode 100644 index 0000000..20bea8c Binary files /dev/null and b/grub-themes/bsol/icons/debian.png differ diff --git a/grub-themes/bsol/icons/deepin.png b/grub-themes/bsol/icons/deepin.png new file mode 100644 index 0000000..61c92fb Binary files /dev/null and b/grub-themes/bsol/icons/deepin.png differ diff --git a/grub-themes/bsol/icons/devuan.png b/grub-themes/bsol/icons/devuan.png new file mode 100644 index 0000000..ff65401 Binary files /dev/null and b/grub-themes/bsol/icons/devuan.png differ diff --git a/grub-themes/bsol/icons/driver.png b/grub-themes/bsol/icons/driver.png new file mode 100644 index 0000000..1621ee7 Binary files /dev/null and b/grub-themes/bsol/icons/driver.png differ diff --git a/grub-themes/bsol/icons/edit.png b/grub-themes/bsol/icons/edit.png new file mode 100644 index 0000000..6a43bd9 Binary files /dev/null and b/grub-themes/bsol/icons/edit.png differ diff --git a/grub-themes/bsol/icons/efi.png b/grub-themes/bsol/icons/efi.png new file mode 100644 index 0000000..4ecf3b9 Binary files /dev/null and b/grub-themes/bsol/icons/efi.png differ diff --git a/grub-themes/bsol/icons/elementary.png b/grub-themes/bsol/icons/elementary.png new file mode 100644 index 0000000..2840354 Binary files /dev/null and b/grub-themes/bsol/icons/elementary.png differ diff --git a/grub-themes/bsol/icons/endeavouros.png b/grub-themes/bsol/icons/endeavouros.png new file mode 100644 index 0000000..6b1e530 Binary files /dev/null and b/grub-themes/bsol/icons/endeavouros.png differ diff --git a/grub-themes/bsol/icons/fedora.png b/grub-themes/bsol/icons/fedora.png new file mode 100644 index 0000000..926b56d Binary files /dev/null and b/grub-themes/bsol/icons/fedora.png differ diff --git a/grub-themes/bsol/icons/find.efi.png b/grub-themes/bsol/icons/find.efi.png new file mode 100644 index 0000000..0e32321 Binary files /dev/null and b/grub-themes/bsol/icons/find.efi.png differ diff --git a/grub-themes/bsol/icons/find.none.png b/grub-themes/bsol/icons/find.none.png new file mode 100644 index 0000000..87d4d0e Binary files /dev/null and b/grub-themes/bsol/icons/find.none.png differ diff --git a/grub-themes/bsol/icons/freebsd.png b/grub-themes/bsol/icons/freebsd.png new file mode 100644 index 0000000..fb9408c Binary files /dev/null and b/grub-themes/bsol/icons/freebsd.png differ diff --git a/grub-themes/bsol/icons/garuda.png b/grub-themes/bsol/icons/garuda.png new file mode 100644 index 0000000..f699718 Binary files /dev/null and b/grub-themes/bsol/icons/garuda.png differ diff --git a/grub-themes/bsol/icons/gentoo.png b/grub-themes/bsol/icons/gentoo.png new file mode 100644 index 0000000..bc0ed70 Binary files /dev/null and b/grub-themes/bsol/icons/gentoo.png differ diff --git a/grub-themes/bsol/icons/gnu-linux.png b/grub-themes/bsol/icons/gnu-linux.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/bsol/icons/gnu-linux.png differ diff --git a/grub-themes/bsol/icons/haiku.png b/grub-themes/bsol/icons/haiku.png new file mode 100644 index 0000000..ce7f818 Binary files /dev/null and b/grub-themes/bsol/icons/haiku.png differ diff --git a/grub-themes/bsol/icons/help.png b/grub-themes/bsol/icons/help.png new file mode 100644 index 0000000..d8b5a17 Binary files /dev/null and b/grub-themes/bsol/icons/help.png differ diff --git a/grub-themes/bsol/icons/kali.png b/grub-themes/bsol/icons/kali.png new file mode 100644 index 0000000..900dc82 Binary files /dev/null and b/grub-themes/bsol/icons/kali.png differ diff --git a/grub-themes/bsol/icons/kaos.png b/grub-themes/bsol/icons/kaos.png new file mode 100644 index 0000000..9fd4e89 Binary files /dev/null and b/grub-themes/bsol/icons/kaos.png differ diff --git a/grub-themes/bsol/icons/kbd.png b/grub-themes/bsol/icons/kbd.png new file mode 100644 index 0000000..6ace3ac Binary files /dev/null and b/grub-themes/bsol/icons/kbd.png differ diff --git a/grub-themes/bsol/icons/korora.png b/grub-themes/bsol/icons/korora.png new file mode 100644 index 0000000..456e876 Binary files /dev/null and b/grub-themes/bsol/icons/korora.png differ diff --git a/grub-themes/bsol/icons/kubuntu.png b/grub-themes/bsol/icons/kubuntu.png new file mode 100644 index 0000000..7a79ff3 Binary files /dev/null and b/grub-themes/bsol/icons/kubuntu.png differ diff --git a/grub-themes/bsol/icons/lang.png b/grub-themes/bsol/icons/lang.png new file mode 100644 index 0000000..3c9c1d7 Binary files /dev/null and b/grub-themes/bsol/icons/lang.png differ diff --git a/grub-themes/bsol/icons/lfs.png b/grub-themes/bsol/icons/lfs.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/bsol/icons/lfs.png differ diff --git a/grub-themes/bsol/icons/linux.png b/grub-themes/bsol/icons/linux.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/bsol/icons/linux.png differ diff --git a/grub-themes/bsol/icons/linuxlite.png b/grub-themes/bsol/icons/linuxlite.png new file mode 100644 index 0000000..42ab8d1 Binary files /dev/null and b/grub-themes/bsol/icons/linuxlite.png differ diff --git a/grub-themes/bsol/icons/linuxmint.png b/grub-themes/bsol/icons/linuxmint.png new file mode 100644 index 0000000..7d9da81 Binary files /dev/null and b/grub-themes/bsol/icons/linuxmint.png differ diff --git a/grub-themes/bsol/icons/lubuntu.png b/grub-themes/bsol/icons/lubuntu.png new file mode 100644 index 0000000..0ead7d8 Binary files /dev/null and b/grub-themes/bsol/icons/lubuntu.png differ diff --git a/grub-themes/bsol/icons/macosx.png b/grub-themes/bsol/icons/macosx.png new file mode 100644 index 0000000..ea03e77 Binary files /dev/null and b/grub-themes/bsol/icons/macosx.png differ diff --git a/grub-themes/bsol/icons/mageia.png b/grub-themes/bsol/icons/mageia.png new file mode 100644 index 0000000..79afa76 Binary files /dev/null and b/grub-themes/bsol/icons/mageia.png differ diff --git a/grub-themes/bsol/icons/manjaro.png b/grub-themes/bsol/icons/manjaro.png new file mode 100644 index 0000000..611a6fb Binary files /dev/null and b/grub-themes/bsol/icons/manjaro.png differ diff --git a/grub-themes/bsol/icons/mate.png b/grub-themes/bsol/icons/mate.png new file mode 100644 index 0000000..b2fc22a Binary files /dev/null and b/grub-themes/bsol/icons/mate.png differ diff --git a/grub-themes/bsol/icons/memtest.png b/grub-themes/bsol/icons/memtest.png new file mode 100644 index 0000000..1621ee7 Binary files /dev/null and b/grub-themes/bsol/icons/memtest.png differ diff --git a/grub-themes/bsol/icons/mx-linux.png b/grub-themes/bsol/icons/mx-linux.png new file mode 100644 index 0000000..49f1133 Binary files /dev/null and b/grub-themes/bsol/icons/mx-linux.png differ diff --git a/grub-themes/bsol/icons/neon.png b/grub-themes/bsol/icons/neon.png new file mode 100644 index 0000000..e41906e Binary files /dev/null and b/grub-themes/bsol/icons/neon.png differ diff --git a/grub-themes/bsol/icons/nix.png b/grub-themes/bsol/icons/nix.png new file mode 100644 index 0000000..dcf33a0 Binary files /dev/null and b/grub-themes/bsol/icons/nix.png differ diff --git a/grub-themes/bsol/icons/nixos.png b/grub-themes/bsol/icons/nixos.png new file mode 100644 index 0000000..dcf33a0 Binary files /dev/null and b/grub-themes/bsol/icons/nixos.png differ diff --git a/grub-themes/bsol/icons/nobara.png b/grub-themes/bsol/icons/nobara.png new file mode 100644 index 0000000..9f9bb5b Binary files /dev/null and b/grub-themes/bsol/icons/nobara.png differ diff --git a/grub-themes/bsol/icons/opensuse.png b/grub-themes/bsol/icons/opensuse.png new file mode 100644 index 0000000..d844fd5 Binary files /dev/null and b/grub-themes/bsol/icons/opensuse.png differ diff --git a/grub-themes/bsol/icons/parabola.png b/grub-themes/bsol/icons/parabola.png new file mode 100644 index 0000000..2a7804b Binary files /dev/null and b/grub-themes/bsol/icons/parabola.png differ diff --git a/grub-themes/bsol/icons/parrot.png b/grub-themes/bsol/icons/parrot.png new file mode 100644 index 0000000..3333de9 Binary files /dev/null and b/grub-themes/bsol/icons/parrot.png differ diff --git a/grub-themes/bsol/icons/pop-os.png b/grub-themes/bsol/icons/pop-os.png new file mode 100644 index 0000000..014d9f3 Binary files /dev/null and b/grub-themes/bsol/icons/pop-os.png differ diff --git a/grub-themes/bsol/icons/pop.png b/grub-themes/bsol/icons/pop.png new file mode 100644 index 0000000..014d9f3 Binary files /dev/null and b/grub-themes/bsol/icons/pop.png differ diff --git a/grub-themes/bsol/icons/recovery.png b/grub-themes/bsol/icons/recovery.png new file mode 100644 index 0000000..7b69b14 Binary files /dev/null and b/grub-themes/bsol/icons/recovery.png differ diff --git a/grub-themes/bsol/icons/regolith.png b/grub-themes/bsol/icons/regolith.png new file mode 100644 index 0000000..5ece07b Binary files /dev/null and b/grub-themes/bsol/icons/regolith.png differ diff --git a/grub-themes/bsol/icons/restart.png b/grub-themes/bsol/icons/restart.png new file mode 100644 index 0000000..9715302 Binary files /dev/null and b/grub-themes/bsol/icons/restart.png differ diff --git a/grub-themes/bsol/icons/rocky.png b/grub-themes/bsol/icons/rocky.png new file mode 100644 index 0000000..be144f6 Binary files /dev/null and b/grub-themes/bsol/icons/rocky.png differ diff --git a/grub-themes/bsol/icons/shutdown.png b/grub-themes/bsol/icons/shutdown.png new file mode 100644 index 0000000..fc9cf16 Binary files /dev/null and b/grub-themes/bsol/icons/shutdown.png differ diff --git a/grub-themes/bsol/icons/siduction.png b/grub-themes/bsol/icons/siduction.png new file mode 100644 index 0000000..d16549b Binary files /dev/null and b/grub-themes/bsol/icons/siduction.png differ diff --git a/grub-themes/bsol/icons/silverblue.png b/grub-themes/bsol/icons/silverblue.png new file mode 100644 index 0000000..3c20839 Binary files /dev/null and b/grub-themes/bsol/icons/silverblue.png differ diff --git a/grub-themes/bsol/icons/slackware.png b/grub-themes/bsol/icons/slackware.png new file mode 100644 index 0000000..4c31a3f Binary files /dev/null and b/grub-themes/bsol/icons/slackware.png differ diff --git a/grub-themes/bsol/icons/solus.png b/grub-themes/bsol/icons/solus.png new file mode 100644 index 0000000..338718b Binary files /dev/null and b/grub-themes/bsol/icons/solus.png differ diff --git a/grub-themes/bsol/icons/steamos.png b/grub-themes/bsol/icons/steamos.png new file mode 100644 index 0000000..df28bcc Binary files /dev/null and b/grub-themes/bsol/icons/steamos.png differ diff --git a/grub-themes/bsol/icons/type.png b/grub-themes/bsol/icons/type.png new file mode 100644 index 0000000..5c48476 Binary files /dev/null and b/grub-themes/bsol/icons/type.png differ diff --git a/grub-themes/bsol/icons/tz.png b/grub-themes/bsol/icons/tz.png new file mode 100644 index 0000000..220b29b Binary files /dev/null and b/grub-themes/bsol/icons/tz.png differ diff --git a/grub-themes/bsol/icons/ubuntu.png b/grub-themes/bsol/icons/ubuntu.png new file mode 100644 index 0000000..352fbe0 Binary files /dev/null and b/grub-themes/bsol/icons/ubuntu.png differ diff --git a/grub-themes/bsol/icons/ultramarine.png b/grub-themes/bsol/icons/ultramarine.png new file mode 100644 index 0000000..ef307fd Binary files /dev/null and b/grub-themes/bsol/icons/ultramarine.png differ diff --git a/grub-themes/bsol/icons/unknown.png b/grub-themes/bsol/icons/unknown.png new file mode 100644 index 0000000..326b659 Binary files /dev/null and b/grub-themes/bsol/icons/unknown.png differ diff --git a/grub-themes/bsol/icons/unset.png b/grub-themes/bsol/icons/unset.png new file mode 100644 index 0000000..15e3d3c Binary files /dev/null and b/grub-themes/bsol/icons/unset.png differ diff --git a/grub-themes/bsol/icons/vanillaos.png b/grub-themes/bsol/icons/vanillaos.png new file mode 100644 index 0000000..4bce88c Binary files /dev/null and b/grub-themes/bsol/icons/vanillaos.png differ diff --git a/grub-themes/bsol/icons/ventoy.png b/grub-themes/bsol/icons/ventoy.png new file mode 100644 index 0000000..7abdc6c Binary files /dev/null and b/grub-themes/bsol/icons/ventoy.png differ diff --git a/grub-themes/bsol/icons/void.png b/grub-themes/bsol/icons/void.png new file mode 100644 index 0000000..01cc2f3 Binary files /dev/null and b/grub-themes/bsol/icons/void.png differ diff --git a/grub-themes/bsol/icons/windows.png b/grub-themes/bsol/icons/windows.png new file mode 100644 index 0000000..d5c7cc3 Binary files /dev/null and b/grub-themes/bsol/icons/windows.png differ diff --git a/grub-themes/bsol/icons/windows11.png b/grub-themes/bsol/icons/windows11.png new file mode 100644 index 0000000..fe97d9f Binary files /dev/null and b/grub-themes/bsol/icons/windows11.png differ diff --git a/grub-themes/bsol/icons/xero.png b/grub-themes/bsol/icons/xero.png new file mode 100644 index 0000000..2221c73 Binary files /dev/null and b/grub-themes/bsol/icons/xero.png differ diff --git a/grub-themes/bsol/icons/xerolinux.png b/grub-themes/bsol/icons/xerolinux.png new file mode 100644 index 0000000..2221c73 Binary files /dev/null and b/grub-themes/bsol/icons/xerolinux.png differ diff --git a/grub-themes/bsol/icons/xubuntu.png b/grub-themes/bsol/icons/xubuntu.png new file mode 100644 index 0000000..f43abc7 Binary files /dev/null and b/grub-themes/bsol/icons/xubuntu.png differ diff --git a/grub-themes/bsol/icons/zorin.png b/grub-themes/bsol/icons/zorin.png new file mode 100644 index 0000000..c1506c4 Binary files /dev/null and b/grub-themes/bsol/icons/zorin.png differ diff --git a/grub-themes/bsol/select_c.png b/grub-themes/bsol/select_c.png new file mode 100644 index 0000000..b1f8d58 Binary files /dev/null and b/grub-themes/bsol/select_c.png differ diff --git a/grub-themes/bsol/select_e.png b/grub-themes/bsol/select_e.png new file mode 100644 index 0000000..9332368 Binary files /dev/null and b/grub-themes/bsol/select_e.png differ diff --git a/grub-themes/bsol/select_w.png b/grub-themes/bsol/select_w.png new file mode 100644 index 0000000..28f6424 Binary files /dev/null and b/grub-themes/bsol/select_w.png differ diff --git a/grub-themes/bsol/terminal_box_c.png b/grub-themes/bsol/terminal_box_c.png new file mode 100644 index 0000000..d0dd52a Binary files /dev/null and b/grub-themes/bsol/terminal_box_c.png differ diff --git a/grub-themes/bsol/terminal_box_e.png b/grub-themes/bsol/terminal_box_e.png new file mode 100644 index 0000000..394cbe4 Binary files /dev/null and b/grub-themes/bsol/terminal_box_e.png differ diff --git a/grub-themes/bsol/terminal_box_n.png b/grub-themes/bsol/terminal_box_n.png new file mode 100644 index 0000000..476f8bc Binary files /dev/null and b/grub-themes/bsol/terminal_box_n.png differ diff --git a/grub-themes/bsol/terminal_box_ne.png b/grub-themes/bsol/terminal_box_ne.png new file mode 100644 index 0000000..9e26959 Binary files /dev/null and b/grub-themes/bsol/terminal_box_ne.png differ diff --git a/grub-themes/bsol/terminal_box_nw.png b/grub-themes/bsol/terminal_box_nw.png new file mode 100644 index 0000000..5c3cba8 Binary files /dev/null and b/grub-themes/bsol/terminal_box_nw.png differ diff --git a/grub-themes/bsol/terminal_box_s.png b/grub-themes/bsol/terminal_box_s.png new file mode 100644 index 0000000..85a8901 Binary files /dev/null and b/grub-themes/bsol/terminal_box_s.png differ diff --git a/grub-themes/bsol/terminal_box_se.png b/grub-themes/bsol/terminal_box_se.png new file mode 100644 index 0000000..d8627ee Binary files /dev/null and b/grub-themes/bsol/terminal_box_se.png differ diff --git a/grub-themes/bsol/terminal_box_sw.png b/grub-themes/bsol/terminal_box_sw.png new file mode 100644 index 0000000..67c600c Binary files /dev/null and b/grub-themes/bsol/terminal_box_sw.png differ diff --git a/grub-themes/bsol/terminal_box_w.png b/grub-themes/bsol/terminal_box_w.png new file mode 100644 index 0000000..d066e2d Binary files /dev/null and b/grub-themes/bsol/terminal_box_w.png differ diff --git a/grub-themes/bsol/theme.txt b/grub-themes/bsol/theme.txt new file mode 100644 index 0000000..836f33b --- /dev/null +++ b/grub-themes/bsol/theme.txt @@ -0,0 +1,41 @@ +# Global options +title-text: "" +desktop-image: "background.png" +desktop-color: "#000000" +terminal-font: "Victor Mono Italic 20" +terminal-box: "terminal_box_*.png" +terminal-left: "0" +terminal-top: "0" +terminal-width: "100%" +terminal-height: "100%" +terminal-border: "0" + +# Boot menu ++ boot_menu { + left = 17% + top = 53% + width = 47% + height = 65% + item_font = "Victor Mono Bold Italic 24" + item_color = "#cccccc" + selected_item_color = "#ffffff" + icon_width = 50 + icon_height = 50 + item_icon_space = 20 + item_height = 40 + item_padding = 2 + item_spacing = 10 + selected_item_pixmap_style = "select_*.png" +} + + +# Countdown ++ label { + left = 25% + top = 30% + align = "left" + id = "__timeout__" + text = "Selected OS will start in %d seconds" + color = "#cccccc" + font = "Victor Mono Bold Italic 28" +} diff --git a/grub-themes/bsol/vmi20.pf2 b/grub-themes/bsol/vmi20.pf2 new file mode 100644 index 0000000..f2b2fb6 Binary files /dev/null and b/grub-themes/bsol/vmi20.pf2 differ diff --git a/grub-themes/bsol/vmi24b.pf2 b/grub-themes/bsol/vmi24b.pf2 new file mode 100644 index 0000000..94cfd86 Binary files /dev/null and b/grub-themes/bsol/vmi24b.pf2 differ diff --git a/grub-themes/bsol/vmi28b.pf2 b/grub-themes/bsol/vmi28b.pf2 new file mode 100644 index 0000000..839bf4e Binary files /dev/null and b/grub-themes/bsol/vmi28b.pf2 differ diff --git a/grub-themes/bsol/vmr16.pf2 b/grub-themes/bsol/vmr16.pf2 new file mode 100644 index 0000000..4aa00b3 Binary files /dev/null and b/grub-themes/bsol/vmr16.pf2 differ diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..dd0d335 --- /dev/null +++ b/install.sh @@ -0,0 +1,557 @@ +#!/bin/bash + +export SHELL=$(command -v bash) + +# ============================================================================== +# Shorin Arch Setup - Main Installer (v1.2) +# ============================================================================== + +BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCRIPTS_DIR="$BASE_DIR/scripts" +STATE_FILE="$BASE_DIR/.install_progress" + +# --- Source Visual Engine --- +if [ -f "$SCRIPTS_DIR/00-utils.sh" ]; then + source "$SCRIPTS_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +# --- Global Cleanup on Exit --- +cleanup() { + rm -f "/tmp/shorin_install_user" +} +trap cleanup EXIT + +# --- Global Trap (Restore Cursor on Exit) --- +cleanup_on_exit() { + tput cnorm +} +trap cleanup_on_exit EXIT + +# --- Environment --- +export DEBUG=${DEBUG:-0} +export CN_MIRROR=${CN_MIRROR:-0} + +check_root +chmod +x "$SCRIPTS_DIR"/*.sh + +# --- ASCII Banners --- +banner1() { +cat << "EOF" + ██████ ██ ██ ██████ ███████ ██ ███ ██ + ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███████ ███████ ██ ██ ██████ ██ ██ ██ ██ + ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ██████ ██ ██ ██████ ██ ██ ██ ██ ████ +EOF +} + +export SHORIN_BANNER_IDX=0 + +show_banner() { + clear + echo -e "${H_CYAN}" + case $SHORIN_BANNER_IDX in + 0) banner1 ;; + esac + echo -e "${NC}" + echo -e "${DIM} :: Arch Linux Automation ::${NC}" + echo -e "" +} + +# --- Desktop Selection Menu (FZF Powered) --- +select_desktop() { + if ! command -v fzf &> /dev/null; then + echo -e " ${DIM}Installing fzf for interactive menu...${NC}" + pacman -Sy --noconfirm --needed fzf >/dev/null 2>&1 + fi + + local MENU_ITEMS=( + "No_Desktop|none" + "Surprise Me!|random" + "" + "KDE_Plasma ${H_YELLOW}(Recommended)${NC}|kde" + "" + "Shorin_DMS_Niri ${H_YELLOW}(Recommended)${NC}|shorindmsgit" + "Shorin_Noctalia_Niri|shorinnocniri" + "Shorin_Niri|shorinniri" + "Minimal_Niri|minimalniri" + "Shorin_DMS_Hyprland_Scrolling|hyprniri" + "" + "GNOME |gnome" + "" + "Quickshell: End4--illogical_impulse|end4" + "Quickshell: DMS--DankMaterialShell|dms" + "Quickshell: Caelestia|caelestia" + ) + + while true; do + show_banner + + local fzf_list=() + local idx=1 + for item in "${MENU_ITEMS[@]}"; do + [[ -z "$item" ]] && continue + + local name="${item%%|*}" + local val="${item##*|}" + local colored_idx="${H_CYAN}[${idx}]${NC}" + + if [ $idx -lt 10 ]; then + fzf_list+=("${colored_idx} ${name}\t${val}\t${name}") + else + fzf_list+=("${colored_idx} ${name}\t${val}\t${name}") + fi + ((idx++)) + done + + local selected + selected=$(printf "%b\n" "${fzf_list[@]}" | sed '/^[[:space:]]*$/d' | fzf \ + --ansi \ + --delimiter='\t' \ + --with-nth=1 \ + --info=hidden \ + --layout=reverse \ + --border="rounded" \ + --border-label=" Select Desktop Environment " \ + --border-label-pos=5 \ + --color="marker:cyan,pointer:cyan,label:yellow" \ + --header=" [J/K] Select | [Enter] confirm" \ + --pointer=">" \ + --bind 'j:down,k:up,ctrl-c:abort,esc:abort' \ + --height=~20) + + local fzf_status=$? + + if [ $fzf_status -eq 130 ]; then + echo -e "\n ${H_RED}>>> Installation aborted by user.${NC}" + exit 130 + fi + + if [ -z "$selected" ]; then continue; fi + + export DESKTOP_ENV="$(echo "$selected" | awk -F'\t' '{print $2}')" + local selected_name="$(echo "$selected" | awk -F'\t' '{print $3}')" + + if [ "$DESKTOP_ENV" == "random" ]; then + local POOL=() + for item in "${MENU_ITEMS[@]}"; do + [[ -z "$item" ]] && continue + local oid="${item##*|}" + if [[ "$oid" != "none" && "$oid" != "random" ]]; then + POOL+=("$item") + fi + done + + local rand_idx=$(( RANDOM % ${#POOL[@]} )) + local final_item="${POOL[$rand_idx]}" + local final_name="${final_item%%|*}" + export DESKTOP_ENV="${final_item##*|}" + + echo -e "\n ${H_CYAN}>>> Randomly selected:${NC} ${BOLD}${final_name}${NC}" + read -p "$(echo -e " ${H_YELLOW}Continue with this selection? [Y/n]: ${NC}")" confirm + + if [[ "${confirm,,}" == "n" ]]; then continue; else break; fi + else + log "Selected: ${selected_name}" + sleep 0.5 + break + fi + done +} + +# --- Optional Modules Selection Menu (FZF Powered) --- +select_optional_modules() { + local OPTIONAL_MENU=( + "Windows Linux Dualboot Setup|02a-dualboot-fix.sh" + "GPU Drivers|03b-gpu-driver.sh" + "Grub Themes|07-grub-theme.sh" + "Common Apps|99-apps.sh" + ) + + show_banner + + local fzf_list=() + for item in "${OPTIONAL_MENU[@]}"; do + local name="${item%%|*}" + local val="${item##*|}" + fzf_list+=(" ${name}\t${val}") + done + + # 核心修复:引入 --expect=ctrl-x,enter 来拦截按键动作 + local selected_raw + selected_raw=$(printf "%b\n" "${fzf_list[@]}" | fzf \ + --multi \ + --delimiter='\t' \ + --with-nth=1 \ + --layout=reverse \ + --border="rounded" \ + --border-label=" Select Optional Modules " \ + --border-label-pos=5 \ + --color="marker:cyan,pointer:cyan,label:yellow" \ + --header=" [TAB]: Toggle | [CTRL-X]: Skip All | [ENTER]: Confirm " \ + --pointer=">" \ + --expect=ctrl-x,enter \ + --bind 'start:select-all,ctrl-a:select-all,ctrl-d:deselect-all,ctrl-c:abort,esc:abort,j:down,k:up' \ + --height=~20) + + local fzf_status=$? + if [ $fzf_status -eq 130 ]; then + echo -e "\n ${H_RED}>>> Installation aborted by user.${NC}" + exit 130 + fi + + OPTIONAL_MODULES=() + + if [ -n "$selected_raw" ]; then + # 解析 FZF 输出:第一行是按下的键,后面是选中的内容 + local key + key=$(head -n 1 <<< "$selected_raw") + local selected_items + selected_items=$(sed '1d' <<< "$selected_raw") + + # 完美解决“回车默认选中光标项”的问题:用户直接按 Ctrl-X 即可退出并清空 + if [[ "$key" == "ctrl-x" ]]; then + log "Skipping all optional modules..." + sleep 0.5 + else + if [ -n "$selected_items" ]; then + # 利用 awk 过滤掉空行,防止产生空元素 + mapfile -t OPTIONAL_MODULES < <(echo "$selected_items" | awk -F'\t' '{if ($2 != "") print $2}') + fi + fi + fi +} + +sys_dashboard() { + echo -e "${H_BLUE}╔════ SYSTEM DIAGNOSTICS ══════════════════════════════╗${NC}" + echo -e "${H_BLUE}║${NC} ${BOLD}Kernel${NC} : $(uname -r)" + echo -e "${H_BLUE}║${NC} ${BOLD}User${NC} : $(whoami)" + echo -e "${H_BLUE}║${NC} ${BOLD}Desktop${NC} : ${H_CYAN}${DESKTOP_ENV^^}${NC}" + echo -e "${H_BLUE}║${NC} ${BOLD}Modules${NC} : ${#OPTIONAL_MODULES[@]} optional module(s) selected" + + if [ "$CN_MIRROR" == "1" ]; then + echo -e "${H_BLUE}║${NC} ${BOLD}Network${NC} : ${H_YELLOW}CN Optimized (Manual)${NC}" + elif [ "$DEBUG" == "1" ]; then + echo -e "${H_BLUE}║${NC} ${BOLD}Network${NC} : ${H_RED}DEBUG FORCE (CN Mode)${NC}" + else + echo -e "${H_BLUE}║${NC} ${BOLD}Network${NC} : Global Default" + fi + + if [ -f "$STATE_FILE" ]; then + done_count=$(wc -l < "$STATE_FILE") + echo -e "${H_BLUE}║${NC} ${BOLD}Progress${NC} : Resuming ($done_count steps recorded)" + fi + echo -e "${H_BLUE}╚══════════════════════════════════════════════════════╝${NC}" + echo "" +} + +# --- Main Execution --- + +select_desktop +select_optional_modules +clear +show_banner +sys_dashboard + +MANDATORY_MODULES=( + "00-btrfs-init.sh" + "01-base.sh" + "02-musthave.sh" + "03-user.sh" + "03c-snapshot-before-desktop.sh" + "05-verify-desktop.sh" +) + +ALL_MODULES=("${MANDATORY_MODULES[@]}" "${OPTIONAL_MODULES[@]}") + +case "$DESKTOP_ENV" in + shorinniri) ALL_MODULES+=("04-niri-setup.sh") ;; + minimalniri) ALL_MODULES+=("04j-minimal-niri.sh") ;; + kde) ALL_MODULES+=("04b-kdeplasma-setup.sh") ;; + end4) ALL_MODULES+=("04e-illogical-impulse-end4-quickshell.sh") ;; + dms) ALL_MODULES+=("04c-dms-quickshell.sh") ;; + shorindmsgit) ALL_MODULES+=("04h-shorindms-quickshell.sh"); export SHORIN_DMS_GIT=1 ;; + hyprniri) ALL_MODULES+=("04i-shorin-hyprniri-quickshell.sh") ;; + shorinnocniri) ALL_MODULES+=("04k-shorin-noctalia-quickshell.sh") ;; + caelestia) ALL_MODULES+=("04g-caelestia-quickshell.sh") ;; + gnome) ALL_MODULES+=("04d-gnome.sh") ;; + none) log "Skipping Desktop Environment installation." ;; + *) warn "Unknown selection, skipping desktop setup." ;; +esac + +mapfile -t MODULES < <(printf "%s\n" "${ALL_MODULES[@]}" | sort -u) + +if [ ! -f "$STATE_FILE" ]; then touch "$STATE_FILE"; fi + +TOTAL_STEPS=${#MODULES[@]} +CURRENT_STEP=0 + +log "Initializing installer sequence..." +sleep 0.5 + +# --- Reflector Mirror Update (State Aware) --- +section "Pre-Flight" "Mirrorlist Optimization" + +if grep -q "^REFLECTOR_DONE$" "$STATE_FILE"; then + echo -e " ${H_GREEN}✔${NC} Mirrorlist previously optimized." + echo -e " ${DIM} Skipping Reflector steps (Resume Mode)...${NC}" +else + log "Checking Reflector..." + exe pacman -S --noconfirm --needed reflector + + CURRENT_TZ=$(readlink -f /etc/localtime) + REFLECTOR_ARGS="--protocol https -a 12 -f 10 --sort rate --save /etc/pacman.d/mirrorlist --verbose" + + if [[ "$CURRENT_TZ" == *"Shanghai"* ]]; then + echo "" + echo -e "${H_YELLOW}╔══════════════════════════════════════════════════════════════════╗${NC}" + echo -e "${H_YELLOW}║ DETECTED TIMEZONE: Asia/Shanghai ║${NC}" + echo -e "${H_YELLOW}║ Refreshing mirrors in China can be slow. ║${NC}" + echo -e "${H_YELLOW}║ Do you want to force refresh mirrors with Reflector? ║${NC}" + echo -e "${H_YELLOW}╚══════════════════════════════════════════════════════════════════╝${NC}" + echo "" + + read -t 60 -p "$(echo -e " ${H_CYAN}Run Reflector?[y/N] (Default No in 60s): ${NC}")" choice + if [ $? -ne 0 ]; then echo ""; fi + choice=${choice:-N} + + if [[ "$choice" =~ ^[Yy]$ ]]; then + log "Running Reflector for China..." + if exe reflector $REFLECTOR_ARGS -c China; then + success "Mirrors updated." + else + warn "Reflector failed. Continuing with existing mirrors." + fi + else + log "Skipping mirror refresh." + fi + else + log "Detecting location for optimization..." + COUNTRY_CODE=$(curl -s --max-time 2 https://ipinfo.io/country) + + if [ -n "$COUNTRY_CODE" ]; then + info_kv "Country" "$COUNTRY_CODE" "(Auto-detected)" + log "Running Reflector for $COUNTRY_CODE..." + if ! exe reflector $REFLECTOR_ARGS -c "$COUNTRY_CODE"; then + warn "Country specific refresh failed. Trying global speed test..." + exe reflector $REFLECTOR_ARGS + fi + else + warn "Could not detect country. Running global speed test..." + exe reflector $REFLECTOR_ARGS --latest 25 + fi + success "Mirrorlist optimized." + fi + + echo "REFLECTOR_DONE" >> "$STATE_FILE" +fi + +# ---- update keyring----- +section "Pre-Flight" "Update Keyring" + +exe pacman -Sy +exe pacman -S --noconfirm archlinux-keyring + +# --- Global Update --- +section "Pre-Flight" "System update" +log "Ensuring system is up-to-date..." + +if exe pacman -Syu --noconfirm; then + success "System Updated." +else + error "System update failed. Check your network." + exit 1 +fi + +# --- Module Loop --- +for module in "${MODULES[@]}"; do + [[ -z "$module" ]] && continue + + CURRENT_STEP=$((CURRENT_STEP + 1)) + script_path="$SCRIPTS_DIR/$module" + + if [ ! -f "$script_path" ]; then + error "Module not found: $module" + continue + fi + + if grep -q "^${module}$" "$STATE_FILE"; then + echo -e " ${H_GREEN}✔${NC} Module ${BOLD}${module}${NC} already completed." + echo -e " ${DIM} Skipping... (Delete .install_progress to force run)${NC}" + continue + fi + + section "Module ${CURRENT_STEP}/${TOTAL_STEPS}" "$module" + + bash "$script_path" + exit_code=$? + + if [ $exit_code -eq 0 ]; then + echo "$module" >> "$STATE_FILE" + success "Module $module completed." + elif [ $exit_code -eq 130 ]; then + echo "" + warn "Script interrupted by user (Ctrl+C)." + log "Exiting without rollback. You can resume later." + exit 130 + else + write_log "FATAL" "Module $module failed with exit code $exit_code" + error "Module execution failed." + exit 1 + fi +done + +# ------------------------------------------------------------------------------ +# Final Cleanup +# ------------------------------------------------------------------------------ +section "Completion" "System Cleanup" + +clean_intermediate_snapshots() { + local config_name="$1" + local start_marker="Before Shorin Setup" + + local KEEP_MARKERS=( + "Before Desktop Environments" + "Before Niri Setup" + ) + + if ! snapper -c "$config_name" list &>/dev/null; then + return + fi + + log "Scanning junk snapshots in: $config_name..." + + local start_id + start_id=$(snapper -c "$config_name" list --columns number,description | grep -F "$start_marker" | awk '{print $1}' | tail -n 1) + + if [ -z "$start_id" ]; then + warn "Marker '$start_marker' not found in '$config_name'. Skipping cleanup." + return + fi + + local IDS_TO_KEEP=() + for marker in "${KEEP_MARKERS[@]}"; do + local found_id + found_id=$(snapper -c "$config_name" list --columns number,description | grep -F "$marker" | awk '{print $1}' | tail -n 1) + + if [ -n "$found_id" ]; then + IDS_TO_KEEP+=("$found_id") + log "Found protected snapshot: '$marker' (ID: $found_id)" + fi + done + + local snapshots_to_delete=() + + while IFS= read -r line; do + local id + local type + + id=$(echo "$line" | awk '{print $1}') + type=$(echo "$line" | awk '{print $3}') + + if [[ "$id" =~ ^[0-9]+$ ]]; then + if [ "$id" -gt "$start_id" ]; then + + local skip=false + for keep in "${IDS_TO_KEEP[@]}"; do + if [[ "$id" == "$keep" ]]; then + skip=true + break + fi + done + + if [ "$skip" = true ]; then + continue + fi + + if [[ "$type" == "pre" || "$type" == "post" ]]; then + snapshots_to_delete+=("$id") + fi + fi + fi + done < <(snapper -c "$config_name" list --columns number,type) + + if [ ${#snapshots_to_delete[@]} -gt 0 ]; then + log "Deleting ${#snapshots_to_delete[@]} junk snapshots in '$config_name'..." + if exe snapper -c "$config_name" delete "${snapshots_to_delete[@]}"; then + success "Cleaned $config_name." + fi + else + log "No junk snapshots found in '$config_name'." + fi +} + +log "Cleaning Pacman/Yay cache..." +exe pacman -Sc --noconfirm + +clean_intermediate_snapshots "root" +clean_intermediate_snapshots "home" + +DETECTED_USER=$(awk -F: '$3 == 1000 {print $1}' /etc/passwd) +TARGET_USER="${DETECTED_USER:-$(read -p "Target user: " u && echo $u)}" +HOME_DIR="/home/$TARGET_USER" + +for dir in /var/cache/pacman/pkg/download-*/; do + if [ -d "$dir" ]; then + echo "Found residual directory: $dir, cleaning up..." + rm -rf "$dir" + fi +done + +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +log "Regenerating final GRUB configuration..." +exe env LANG=en_US.UTF-8 grub-mkconfig -o /boot/grub/grub.cfg + +# --- Completion --- +clear +show_banner +echo -e "${H_GREEN}╔══════════════════════════════════════════════════════╗${NC}" +echo -e "${H_GREEN}║ INSTALLATION COMPLETE ║${NC}" +echo -e "${H_GREEN}╚══════════════════════════════════════════════════════╝${NC}" +echo "" + +if [ -f "$STATE_FILE" ]; then rm "$STATE_FILE"; fi + +log "Archiving log..." +if [ -f "/tmp/shorin_install_user" ]; then + FINAL_USER=$(cat /tmp/shorin_install_user) +else + FINAL_USER=$(awk -F: '$3 == 1000 {print $1}' /etc/passwd) +fi + +if [ -n "$FINAL_USER" ]; then + FINAL_DOCS="/home/$FINAL_USER/Documents" + mkdir -p "$FINAL_DOCS" + if [ -f "${TEMP_LOG_FILE:-/tmp/shorin.log}" ]; then + cp "${TEMP_LOG_FILE:-/tmp/shorin.log}" "$FINAL_DOCS/log-shorin-arch-setup.txt" + chown -R "$FINAL_USER:$FINAL_USER" "$FINAL_DOCS" + echo -e " ${H_BLUE}●${NC} Log Saved : ${BOLD}$FINAL_DOCS/log-shorin-arch-setup.txt${NC}" + fi +fi + +echo "" +echo -e "${H_YELLOW}>>> System requires a REBOOT.${NC}" + +while read -r -t 0; do read -r; done + +for i in {10..1}; do + echo -ne "\r ${DIM}Auto-rebooting in ${i}s... (Press 'n' to cancel)${NC}" + + read -t 1 -n 1 input + if [ $? -eq 0 ]; then + if [[ "$input" == "n" || "$input" == "N" ]]; then + echo -e "\n\n ${H_BLUE}>>> Reboot cancelled.${NC}" + exit 0 + else + break + fi + fi +done + +echo -e "\n\n ${H_GREEN}>>> Rebooting...${NC}" +systemctl reboot \ No newline at end of file diff --git a/kde-applist.txt b/kde-applist.txt new file mode 100644 index 0000000..a818bde --- /dev/null +++ b/kde-applist.txt @@ -0,0 +1,20 @@ +# --- Shell & Terminal Enhancements --- +fish # Friendly Interactive Shell +starship # Cross-shell customizable prompt +eza # Modern replacement for 'ls' (with icons) +zoxide # Smarter 'cd' command (directory jumper) +fastfetch # Fast system information fetcher (Neofetch alternative) +imagemagick # Powerful image manipulation tools (CLI) +jq # Command-line JSON processor +timg +bat # Better 'cat' command +# --- KDE Applications --- +ark # Archiving Tool (Zip, Tar, 7z GUI) +kate # Advanced Text Editor for KDE +plasma-login-manager # new DM for KDE Plasma +ttf-jetbrains-mono-nerd # JetBrains Mono Font (Nerd Font Patched) + +# --- KDE Visual Effects (AUR) --- +#AUR:kwin-effect-rounded-corners-git # Force rounded corners on all windows (Shader based) +AUR:kwin-effects-geometry-change # KWin animation for window resizing/geometry changes +AUR:shorin-contrib-git # shorin utils \ No newline at end of file diff --git a/kde-common-applist.txt b/kde-common-applist.txt new file mode 100644 index 0000000..16738d3 --- /dev/null +++ b/kde-common-applist.txt @@ -0,0 +1,35 @@ +# --- KDE System Utilities --- +mission-center # System Monitor (Windows-Task-Manager style) +btop # Resource Monitor (TUI) +ksystemlog # System Log Viewer +pacman-contrib # Pacman utilities (paccache, checkupdates) +lact # GPU Control Panel (Overclocking/Fan control) +gwenview # Image Viewer (KDE Native) +upscaler # # AI Image Upscaler (Enhance low-res images) +kcalc # Calculator (KDE Native) + +# --- Disk & Filesystem Tools --- +baobab # Disk Usage Analyzer +gnome-disk-utility # Disk Management Utility (Disks) +dosfstools # Tools for FAT12/16/32 filesystems +exfat-utils # exFAT filesystem utilities +f2fs-tools # Tools for Flash-Friendly File System +ntfs-3g # NTFS filesystem driver +udftools # Tools for UDF filesystems +xfsprogs # Tools for XFS filesystems + +# --- Media & Gaming --- +haruna # Modern Video Player (MPV frontend for KDE) +lutris # Open Source Gaming Platform (Wine/Proton manager) +steam # Gaming Platform (Valve) + +# --- AUR Packages (Social) --- +AUR:linuxqq-appimage # Tencent QQ (AppImage) +AUR:wechat-appimage # WeChat (AppImage) +AUR:ttf-jetbrains-maple-mono-nf-xx-xx # Maple Mono NF font + +# --- Flatpak Packages (Productivity & Media) --- +flatpak:com.github.unrud.VideoDownloader # Video Downloader (YouTube/Bilibili) +flatpak:com.github.wwmm.easyeffects # Audio Effects for PipeWire (Equalizer/Noise reduction) +flatpak:com.obsproject.Studio # OBS Studio (Streaming & Recording) +flatpak:it.mijorus.gearlever # AppImage Manager (Integrates AppImages) \ No newline at end of file diff --git a/kde-dotfiles/.config/breezerc b/kde-dotfiles/.config/breezerc new file mode 100644 index 0000000..fd2c8e3 --- /dev/null +++ b/kde-dotfiles/.config/breezerc @@ -0,0 +1,6 @@ +[Common] +OutlineIntensity=OutlineOff +RoundedCorners=false + +[Style] +MenuOpacity=80 diff --git a/kde-dotfiles/.config/fastfetch/config.jsonc b/kde-dotfiles/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..3eb733d --- /dev/null +++ b/kde-dotfiles/.config/fastfetch/config.jsonc @@ -0,0 +1,124 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "logo": { + "type": "sixel", + //"source": "/home/shorin/Pictures/picture.png", + "width": 25, + // "height":20, + "padding": { + "top": 1, // Top padding + "left": 2, // Left padding + "right": 2 // Right padding + }, + }, + "display": { + "separator": " ", // Separator between keys and values + "color": { + //"keys": "#cdc2db", // Key color module名字的颜色 + "title": "#cbc4cf", // Title color 主机名的颜色 + "output": "#cbc4cf" + }, + }, + "modules": [ + "break", + { + "type": "os", //这是哪个module + "key": "OS", //module名字的显示 + // "keyColor": "#00ff00", //module名字颜色 + // "format": "{name} {version}", //具体内容 + "keyColor": "#d3bbfd", + + }, + { + "type": "kernel", + "key": " ├  KER ", + "keyColor": "#d3bbfd", + + }, + { + "type": "packages", + "key": " ├  PAK ", + "format": "{all}", + "keyColor": "#d3bbfd", + }, + { + "type": "title", + "key": " └  USR ", + "keyColor": "#d3bbfd", + }, + "break", + "break", + { + "type": "wm", + "key": "WM", + "keyColor": "#f1b7c5", + }, + { + "type": "de", + "key": " ├ 󱈹 DES ", + "keyColor": "#f1b7c5", + //"outputColor": "#f1b7c5" + }, + { + "type": "shell", + "key": " ├  SHE ", + "keyColor": "#f1b7c5", + //"outputColor": "#f1b7c5" + }, + { + "type": "terminal", + "key": " ├  TER ", + "keyColor": "#f1b7c5", + //"outputColor": "#f1b7c5" + }, + { + "type": "terminalfont", + "key": " └  TFO ", + "keyColor": "#f1b7c5", + //"outputColor": "#f1b7c5" + }, + "break", + "break", + { + "type": "host", + "key": "PC ", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + { + "type": "cpu", + "key": " ├  CPU ", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + { + "type": "memory", + "key": " ├  MEM ", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + { + "type": "gpu", + "key": " ├ 󰢮 GPU ", + "format": "{1} {2}", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + { + "type": "display", + "key": " ├  MON ", + "format": "{name} {width}x{height}@{refresh-rate} ", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + { + "type": "disk", + "key": " └ 󰋊 DIS ", + "keyColor": "#eadef8", + //"outputColor": "#cdc2db" + }, + "break", + "break", + "colors" + ] +} diff --git a/kde-dotfiles/.config/fcitx5/conf/cached_layouts b/kde-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..15ac22b --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3740 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/kde-dotfiles/.config/fcitx5/conf/classicui.conf b/kde-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..c4c5f2c --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# 垂直候选列表 +Vertical Candidate List=True +# 使用鼠标滚轮翻页 +WheelForPaging=True +# 字体 +Font="Adwaita Sans 11" +# 菜单字体 +MenuFont="Sans 10" +# 托盘字体 +TrayFont="Sans Bold 10" +# 托盘标签轮廓颜色 +TrayOutlineColor=#000000 +# 托盘标签文本颜色 +TrayTextColor=#ffffff +# 优先使用文字图标 +PreferTextIcon=False +# 在图标中显示布局名称 +ShowLayoutNameInIcon=True +# 使用输入法的语言来显示文字 +UseInputMethodLanguageToDisplayText=True +# 主题 +Theme=default +# 深色主题 +DarkTheme=default-dark +# 跟随系统浅色/深色设置 +UseDarkTheme=False +# 当被主题和桌面支持时使用系统的重点色 +UseAccentColor=True +# 在 X11 上针对不同屏幕使用单独的 DPI +PerScreenDPI=False +# 固定 Wayland 的字体 DPI +ForceWaylandDPI=0 +# 在 Wayland 下启用分数缩放 +EnableFractionalScale=True + diff --git a/kde-dotfiles/.config/fcitx5/conf/notifications.conf b/kde-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/kde-dotfiles/.config/fcitx5/conf/pinyin.conf b/kde-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/kde-dotfiles/.config/fcitx5/config b/kde-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..b0b1d5c --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# 按住切换键的修饰键时进行轮换切换 +EnumerateWithTriggerKeys=True +# 向前切换输入法 +EnumerateForwardKeys= +# 向后切换输入法 +EnumerateBackwardKeys= +# 轮换输入法时跳过第一个输入法 +EnumerateSkipFirst=False +# 触发修饰键快捷键的时限 (毫秒) +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Super+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# 默认状态为激活 +ActiveByDefault=False +# 重新聚焦时重置状态 +resetStateWhenFocusIn=No +# 共享输入状态 +ShareInputState=No +# 在程序中显示预编辑文本 +PreeditEnabledByDefault=True +# 切换输入法时显示输入法信息 +ShowInputMethodInformation=True +# 在焦点更改时显示输入法信息 +showInputMethodInformationWhenFocusIn=False +# 显示紧凑的输入法信息 +CompactInputMethodInformation=True +# 显示第一个输入法的信息 +ShowFirstInputMethodInformation=True +# 默认页大小 +DefaultPageSize=5 +# 覆盖 XKB 选项 +OverrideXkbOption=False +# 自定义 XKB 选项 +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# 允许在密码框中使用输入法 +AllowInputMethodForPassword=False +# 输入密码时显示预编辑文本 +ShowPreeditForPassword=False +# 保存用户数据的时间间隔(以分钟为单位) +AutoSavePeriod=30 + diff --git a/kde-dotfiles/.config/fcitx5/profile b/kde-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..d264f5e --- /dev/null +++ b/kde-dotfiles/.config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=默认 +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=默认 + diff --git a/kde-dotfiles/.config/fish/config.fish b/kde-dotfiles/.config/fish/config.fish new file mode 100644 index 0000000..fb5fd92 --- /dev/null +++ b/kde-dotfiles/.config/fish/config.fish @@ -0,0 +1,56 @@ +if status is-interactive + # Commands to run in interactive sessions can go here +end +set fish_greeting "" +set -p PATH ~/.local/bin +starship init fish | source +zoxide init fish --cmd cd | source + +function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" +end + +function cat + command bat $argv +end +function ls + command eza --icons $argv +end + +function lt + command eza --icons --tree $argv +end +# grub +abbr grub 'LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 sudo grub-mkconfig -o /boot/grub/grub.cfg' +# 小黄鸭补帧 需要steam安装正版小黄鸭 +abbr lsfg 'LSFG_PROCESS="miyu"' +# fa运行fastfetch +abbr fa fastfetch +abbr reboot 'systemctl reboot' +function sl + command sl | lolcat +end +function 滚 + sysup +end +function raw + command ~/.config/scripts/random-anime-wallpaper.sh $argv +end + +function 安装 + command yay -S $argv +end + +function 卸载 + command yay -Rns $argv +end + +# Added by LM Studio CLI (lms) +set -gx PATH $PATH /home/shorin/.lmstudio/bin +# End of LM Studio CLI section + diff --git a/kde-dotfiles/.config/fish/functions/apt.fish b/kde-dotfiles/.config/fish/functions/apt.fish new file mode 100644 index 0000000..162d6a1 --- /dev/null +++ b/kde-dotfiles/.config/fish/functions/apt.fish @@ -0,0 +1,171 @@ +# ============================================================================== +# Function: apt (Smart Arch Package Manager Wrapper for Fish) +# Description: Maps common Debian 'apt' commands to an intelligent Arch backend. +# Features: +# - Fallback routing: paru > yay > pacman. +# - Automatic Sudo Handling: Prevents AUR helpers from running as root. +# - Anti-Partial-Upgrade: Merges update/upgrade into a safe -Syu operation. +# - Deep Clean Default: Merges remove/purge into -Rns for a pristine system. +# - UI Integration: Progressive enhancement with 'shorin' for interactive modes. +# - Safe orphan detection and i18n support. +# - Highly readable, colorized, and column-aligned help output. +# Usage: apt {update|upgrade|install [ui]|remove [ui]|search|show|autoremove|clean|help|-h} [pkg...] +# ============================================================================== + +function apt -d "Smart wrapper routing apt commands to paru/yay/pacman" + # 1. 极简的 Locale 探测 + set -l is_zh 0 + if string match -q -r "^zh_" "$LC_ALL" "$LC_MESSAGES" "$LANG" + set is_zh 1 + end + + # 2. 探测 shorin UI 工具是否存在 + set -l has_shorin 0 + if command -q shorin + set has_shorin 1 + end + + set -l action "help" + set -l exit_code 0 + + if test (count $argv) -eq 0 + set exit_code 1 + else + set action $argv[1] + set -e argv[1] + end + + # 3. 帮助信息拦截与本地化 (重构的高颜值排版) + switch $action + case help -h --help + set -l c_cmd (set_color cyan) + set -l c_hl (set_color yellow) + set -l c_rst (set_color normal) + + if test $is_zh -eq 1 + echo "Arch 包管理器包装器 (优先级: "$c_hl"paru > yay > pacman"$c_rst")" + echo "用法: "$c_hl"apt"$c_rst" <命令> [软件包...]" + echo "" + echo "命令:" + echo " "$c_cmd"update(upgrade)"$c_rst" 同步数据库并更新系统 (-Syu)" + echo " "$c_cmd"install "$c_rst" 安装软件包 (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" 打开交互式界面安装 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"remove "$c_rst" 彻底卸载软件包、依赖及配置文件 (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" 打开交互式界面卸载 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"search "$c_rst" 搜索软件包 (-Ss)" + echo " "$c_cmd"show "$c_rst" 显示软件包详细信息 (-Si)" + echo " "$c_cmd"autoremove "$c_rst" 安全地清理系统中的孤立软件包" + echo " "$c_cmd"clean "$c_rst" 清理下载缓存 (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" 显示此帮助信息" + else + echo "Smart Arch Package Wrapper (Routing: "$c_hl"paru > yay > pacman"$c_rst")" + echo "Usage: "$c_hl"apt"$c_rst" [package...]" + echo "" + echo "Commands:" + echo " "$c_cmd"update(upgrade)"$c_rst" Sync databases and update system (Safe -Syu)" + echo " "$c_cmd"install "$c_rst" Install packages (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" Open interactive installation UI (shorin pac)" + end + echo " "$c_cmd"remove "$c_rst" Remove packages, unneeded dependencies, and configs (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" Open interactive removal UI (shorin pacr)" + end + echo " "$c_cmd"search "$c_rst" Search for packages (-Ss)" + echo " "$c_cmd"show "$c_rst" Show package details (-Si)" + echo " "$c_cmd"autoremove "$c_rst" Remove orphaned packages safely" + echo " "$c_cmd"clean "$c_rst" Clean package cache (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" Show this help message" + end + return $exit_code + end + + # 4. 核心路由与提权逻辑 + set -l pkg_mgr + set -l needs_sudo "no" + + if command -q paru + set pkg_mgr "paru" + else if command -q yay + set pkg_mgr "yay" + else + set pkg_mgr "pacman" + set needs_sudo "yes" + end + + set -l cmd + if test "$needs_sudo" = "yes" + set cmd sudo $pkg_mgr + else + set cmd $pkg_mgr + end + + # 5. 预定义基础错误信息 (本地化) + set -l msg_err_pkg "Error: Specify packages." + set -l msg_err_search "Error: Specify search term." + set -l msg_err_show "Error: Specify package to show." + if test $is_zh -eq 1 + set msg_err_pkg "错误:请指定要操作的软件包。" + set msg_err_search "错误:请指定搜索词。" + set msg_err_show "错误:请指定要查看的软件包。" + end + + # 6. 动作映射 (Action Mapping) + switch $action + case update upgrade + $cmd -Syu + case install + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'install ui',条件:且只输入了 ui 一个参数,且系统存在 shorin + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pac + return 0 + end + $cmd -S $argv + case remove + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'remove ui' + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pacr + return 0 + end + $cmd -Rns $argv + case search + if test (count $argv) -eq 0; echo $msg_err_search; return 1; end + $pkg_mgr -Ss $argv + case show + if test (count $argv) -eq 0; echo $msg_err_show; return 1; end + $pkg_mgr -Si $argv + case autoremove + set -l orphans (pacman -Qtdq) + if test (count $orphans) -gt 0 + if test $is_zh -eq 1 + echo "找到 "(count $orphans)" 个孤立的软件包。正在通过 $pkg_mgr 卸载..." + else + echo "Found "(count $orphans)" orphaned package(s). Removing via $pkg_mgr..." + end + $cmd -Rns $orphans + else + if test $is_zh -eq 1 + echo "系统很干净,没有需要清理的孤立软件包。" + else + echo "System is clean. No orphaned packages to remove." + end + end + case clean + $cmd -Sc + case '*' + if test $is_zh -eq 1 + echo "错误:不支持的 apt 命令映射: $action" + echo "运行 'apt -h' 查看可用命令。" + else + echo "Error: Unsupported apt command mapped: $action" + echo "Run 'apt -h' for valid commands." + end + return 1 + end +end diff --git a/kde-dotfiles/.config/fish/functions/f.fish b/kde-dotfiles/.config/fish/functions/f.fish new file mode 100644 index 0000000..8059bc1 --- /dev/null +++ b/kde-dotfiles/.config/fish/functions/f.fish @@ -0,0 +1,252 @@ +function f + # ============================================================================== + # 【脚本功能说明】 + # 1. 结合 Fastfetch,在终端启动时展示随机二次元图片 (支持 SFW / NSFW 模式)。 + # 2. 具备静默后台异步下载机制,库存不足时自动补货,绝不阻塞前台终端的启动。 + # 3. 具备智能缓存管理机制,自动控制待展示区与已使用区 (used) 的图片数量上限。 + # 4. 具备极致的网络环境容错处理,无网或弱网时自动降级 fallback,避免死等。 + # 5. 具备自动清理 Fastfetch 内部生成的图片转换缓存功能,防止磁盘空间无感膨胀。 + # ============================================================================== + + # ================= 配置区域 ================= + + # [开关] 阅后即焚模式 (针对 Fastfetch 内部缓存) + # true = 运行后强力清空 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) + # false = 保留缓存 + set -l CLEAN_CACHE_MODE true + + # 每次补货下载多少张 + set -l DOWNLOAD_BATCH_SIZE 10 + # 最大库存上限 (待展示区) + set -l MAX_CACHE_LIMIT 100 + # 库存少于多少张时开始补货 + set -l MIN_TRIGGER_LIMIT 60 + + # [新增] used 目录最大存放数量 + # 超过此数量将按照时间顺序删除最旧的文件 + set -l MAX_USED_LIMIT 50 + + # =========================================== + + # --- 0. 参数解析与模式设置 --- + + set -l NSFW_MODE false + # 检查环境变量 + if test "$NSFW" = "1" + set NSFW_MODE true + end + + set -l ARGS_FOR_FASTFETCH + for arg in $argv + if test "$arg" = "--nsfw" + set NSFW_MODE true + else + set -a ARGS_FOR_FASTFETCH $arg + end + end + + # --- 1. 目录配置 --- + + # 根据模式区分缓存目录和锁文件 + set -l CACHE_DIR + set -l LOCK_FILE + if test "$NSFW_MODE" = true + set CACHE_DIR "$HOME/.cache/fastfetch_waifu_nsfw" + set LOCK_FILE "/tmp/fastfetch_waifu_nsfw.lock" + else + set CACHE_DIR "$HOME/.cache/fastfetch_waifu" + set LOCK_FILE "/tmp/fastfetch_waifu.lock" + end + + # 定义已使用目录 + set -l USED_DIR "$CACHE_DIR/used" + + mkdir -p "$CACHE_DIR" + mkdir -p "$USED_DIR" + + # --- 2. 核心函数 --- + + # [修复] 抛弃脆弱的 1.1.1.1,使用苹果的全球探针节点,并使用 -I (HEAD请求) 极限提速 + function check_network + curl -sI --connect-timeout 2 "http://captive.apple.com/hotspot-detect.html" >/dev/null 2>&1 + return $status + end + + function get_random_url -V NSFW_MODE + set -l TIMEOUT --connect-timeout 5 --max-time 15 + set -l RAND (math (random) % 3 + 1) + + if test "$NSFW_MODE" = true + # === NSFW API === + switch $RAND + case 1 + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=true" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' + end + else + # === SFW (正常) API === + switch $RAND + case 1 + # [修复] IsNsfwfalse 修正为 IsNsfw=false + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=false" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' + end + end + end + + function download_one_image -V CACHE_DIR + set -l URL (get_random_url) + if string match -qr "^http" -- "$URL" + # 使用带时间戳的随机文件名 + set -l FILENAME "waifu_"(date +%s%N)"_"(random)".jpg" + set -l TARGET_PATH "$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if test -s "$TARGET_PATH" + if command -v file >/dev/null 2>&1 + if not file --mime-type "$TARGET_PATH" | grep -q "image/" + rm -f "$TARGET_PATH" + end + end + else + rm -f "$TARGET_PATH" + end + end + end + + function background_job -V CACHE_DIR -V LOCK_FILE -V MIN_TRIGGER_LIMIT -V DOWNLOAD_BATCH_SIZE -V MAX_CACHE_LIMIT -V NSFW_MODE + # 导出函数定义以便在 fish -c 中使用 + set -l get_random_url_def (functions get_random_url | string collect) + set -l download_one_image_def (functions download_one_image | string collect) + set -l check_network_def (functions check_network | string collect) + + fish -c " + # [核心修复 1] 忽略终端关闭带来的 SIGHUP 信号 + trap '' HUP + + # 重新定义需要的函数 + $get_random_url_def + $download_one_image_def + $check_network_def + + # 使用 flock 防止并发 + flock -n 200 || exit 1 + + # [新增] 网络检查,没网就悄悄退出,不占后台资源 + if not check_network + exit 0 + end + + # 导入变量 + set CACHE_DIR '$CACHE_DIR' + set NSFW_MODE '$NSFW_MODE' + + # 1. 补货检查 + set CURRENT_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + + if test \$CURRENT_COUNT -lt $MIN_TRIGGER_LIMIT + for i in (seq 1 $DOWNLOAD_BATCH_SIZE) + download_one_image + sleep 0.5 + end + end + + # 2. 清理过多库存 (清理的是下载缓存区,不是 used 区) + set FINAL_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + if test \$FINAL_COUNT -gt $MAX_CACHE_LIMIT + set DELETE_START_LINE (math $MAX_CACHE_LIMIT + 1) + ls -tp \$CACHE_DIR/*.jpg 2>/dev/null | tail -n +\$DELETE_START_LINE | xargs -I {} rm -- '{}' + end + " 200>"$LOCK_FILE" & + + # [核心修复 2] 将刚才丢入后台的 fish 子进程剥离终端控制 + disown + end + + # --- 3. 主程序逻辑 --- + + set -l FILES $CACHE_DIR/*.jpg + set -l NUM_FILES (count $FILES) + + # fish 若无匹配文件,$FILES 可能为空或保留模式字符串,需额外判断 + if test "$NUM_FILES" -eq 1; and not test -f "$FILES[1]" + set NUM_FILES 0 + set FILES + end + + set -l SELECTED_IMG "" + + if test "$NUM_FILES" -gt 0 + # 有库存,随机选一张 + set -l RAND_INDEX (math (random) % $NUM_FILES + 1) + set SELECTED_IMG "$FILES[$RAND_INDEX]" + + # 后台补货 + background_job >/dev/null 2>&1 + else + # 没库存,提示语更改并增加网络连通性容错 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + + if check_network + download_one_image + else + echo "网络好像不太通畅,无法下载新图片 QAQ" + end + + set FILES $CACHE_DIR/*.jpg + if test -f "$FILES[1]" + set SELECTED_IMG "$FILES[1]" + background_job >/dev/null 2>&1 + end + end + + # 运行 Fastfetch + if test -n "$SELECTED_IMG"; and test -f "$SELECTED_IMG" + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true $ARGS_FOR_FASTFETCH + + # === 逻辑: 移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 逻辑: 检查 used 目录并清理旧图 === + # 注意:fish 的 glob 展开如果文件太多可能会卡,但这里有 limit 限制所以还好 + set -l used_files $USED_DIR/*.jpg + set -l used_count (count $used_files) + + # 再次确认 count,因为如果没文件 $used_files 可能为空 + if test "$used_count" -gt 0; and not test -f "$used_files[1]" + set used_count 0 + end + + if test "$used_count" -gt "$MAX_USED_LIMIT" + # 计算需要跳过的行数 (保留最新的 N 张) + set -l skip_lines (math "$MAX_USED_LIMIT" + 1) + + # 列出所有文件按时间倒序(tp),取尾部(tail),删除(rm) + # 2>/dev/null 防止目录为空时报错 + set -l files_to_delete (ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$skip_lines) + + if test -n "$files_to_delete" + rm -- $files_to_delete + end + end + + # 检查是否开启清理 Fastfetch 内部缓存 + if test "$CLEAN_CACHE_MODE" = true + # 仅删除缩略图缓存,保留原图 + rm -rf "$HOME/.cache/fastfetch/images" + end + else + # 失败提示语更改 + echo "图片获取失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch $ARGS_FOR_FASTFETCH + end +end diff --git a/kde-dotfiles/.config/fish/functions/fnsfw.fish b/kde-dotfiles/.config/fish/functions/fnsfw.fish new file mode 100644 index 0000000..ef2f45b --- /dev/null +++ b/kde-dotfiles/.config/fish/functions/fnsfw.fish @@ -0,0 +1,3 @@ +function fnsfw + f --nsfw +end diff --git a/kde-dotfiles/.config/fontconfig/fonts.conf b/kde-dotfiles/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..bf57887 --- /dev/null +++ b/kde-dotfiles/.config/fontconfig/fonts.conf @@ -0,0 +1,42 @@ + + + + + + true + true + hintslight + rgb + lcddefault + + + + sans-serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + monospace + + JetBrains Mono + JetBrains Maple Mono + Adwaita Mono + + + + diff --git a/kde-dotfiles/.config/kcminputrc b/kde-dotfiles/.config/kcminputrc new file mode 100644 index 0000000..0ba73dd --- /dev/null +++ b/kde-dotfiles/.config/kcminputrc @@ -0,0 +1,8 @@ +[Libinput][2362][597][UNIW0001:00 093A:0255 Mouse] +PointerAccelerationProfile=1 + +[Libinput][2362][597][UNIW0001:00 093A:0255 Touchpad] +NaturalScroll=true + +[Mouse] +cursorSize=30 diff --git a/kde-dotfiles/.config/kdeglobals b/kde-dotfiles/.config/kdeglobals new file mode 100644 index 0000000..c382cf1 --- /dev/null +++ b/kde-dotfiles/.config/kdeglobals @@ -0,0 +1,158 @@ +[ColorEffects:Disabled] +ChangeSelectionColor= +Color=56,56,56 +ColorAmount=0 +ColorEffect=0 +ContrastAmount=0.65 +ContrastEffect=1 +Enable= +IntensityAmount=0.1 +IntensityEffect=2 + +[ColorEffects:Inactive] +ChangeSelectionColor=true +Color=112,111,110 +ColorAmount=0.025 +ColorEffect=2 +ContrastAmount=0.1 +ContrastEffect=2 +Enable=false +IntensityAmount=0 +IntensityEffect=0 + +[Colors:Button] +BackgroundAlternate=160,144,199 +BackgroundNormal=252,252,252 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=112,125,138 +ForegroundLink=91,67,145 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Complementary] +BackgroundAlternate=27,30,32 +BackgroundNormal=42,46,50 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=161,169,177 +ForegroundLink=202,196,220 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=252,252,252 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header] +BackgroundAlternate=239,240,241 +BackgroundNormal=222,224,226 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=112,125,138 +ForegroundLink=91,67,145 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Header][Inactive] +BackgroundAlternate=227,229,231 +BackgroundNormal=239,240,241 +DecorationFocus=61,174,233 +DecorationHover=61,174,233 +ForegroundActive=61,174,233 +ForegroundInactive=112,125,138 +ForegroundLink=41,128,185 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Selection] +BackgroundAlternate=161,145,200 +BackgroundNormal=161,145,200 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=0,0,0 +ForegroundLink=91,67,145 +ForegroundNegative=176,55,69 +ForegroundNeutral=198,92,0 +ForegroundNormal=0,0,0 +ForegroundPositive=23,104,57 +ForegroundVisited=155,89,182 + +[Colors:Tooltip] +BackgroundAlternate=239,240,241 +BackgroundNormal=247,247,247 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=112,125,138 +ForegroundLink=91,67,145 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:View] +BackgroundAlternate=247,247,247 +BackgroundNormal=255,255,255 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=112,125,138 +ForegroundLink=91,67,145 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[Colors:Window] +BackgroundAlternate=227,229,231 +BackgroundNormal=239,240,241 +DecorationFocus=121,99,177 +DecorationHover=121,99,177 +ForegroundActive=121,99,177 +ForegroundInactive=112,125,138 +ForegroundLink=91,67,145 +ForegroundNegative=218,68,83 +ForegroundNeutral=246,116,0 +ForegroundNormal=35,38,41 +ForegroundPositive=39,174,96 +ForegroundVisited=155,89,182 + +[General] +AccentColor=121,99,177 +ColorSchemeHash=9f63c7711a13123582e720791ea0f8c0172977d2 +UseSystemBell=true +XftHintStyle=hintslight +XftSubPixel=none +accentColorFromWallpaper=true +font=Adwaita Sans,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 +menuFont=Adwaita Sans,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 +smallestReadableFont=Adwaita Sans,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 +toolBarFont=Adwaita Sans,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 + +[KDE] +contrast=4 +frameContrast=0.2 + +[WM] +activeBackground=227,229,231 +activeBlend=227,229,231 +activeFont=Adwaita Sans,11,-1,5,700,0,0,0,0,0,0,0,0,0,0,1,Bold +activeForeground=35,38,41 +inactiveBackground=239,240,241 +inactiveBlend=239,240,241 +inactiveForeground=112,125,138 diff --git a/kde-dotfiles/.config/kglobalshortcutsrc b/kde-dotfiles/.config/kglobalshortcutsrc new file mode 100644 index 0000000..6c241f1 --- /dev/null +++ b/kde-dotfiles/.config/kglobalshortcutsrc @@ -0,0 +1,261 @@ +[ActivityManager] +_k_friendly_name=活动管理器 +switch-to-activity-07bb86c0-791a-4e9f-af74-03bfbe9f11fd=none,none,切换到活动“Default” + +[KDE Keyboard Layout Switcher] +Switch keyboard layout to 英语(美国)=none,none,切换键盘布局为 英语(美国) +Switch to Last-Used Keyboard Layout=Meta+Alt+L,Meta+Alt+L,切换到上次使用过的键盘布局 +Switch to Next Keyboard Layout=Meta+Alt+K,Meta+Alt+K,切换到下一个键盘布局 +_k_friendly_name=键盘布局切换器 + +[kaccess] +Toggle Screen Reader On and Off=Meta+Alt+S,Meta+Alt+S,切换屏幕阅读器开关 +_k_friendly_name=无障碍辅助 + +[kmix] +_k_friendly_name=音量 +decrease_microphone_volume=Microphone Volume Down,Microphone Volume Down,降低麦克风音量 +decrease_volume=Volume Down,Volume Down,降低音量 +decrease_volume_small=Shift+Volume Down,Shift+Volume Down,音量降低 1% +increase_microphone_volume=Microphone Volume Up,Microphone Volume Up,提高麦克风音量 +increase_volume=Volume Up,Volume Up,提高音量 +increase_volume_small=Shift+Volume Up,Shift+Volume Up,音量提高 1% +mic_mute=Microphone Mute\tMeta+Volume Mute,Microphone Mute\tMeta+Volume Mute,麦克风静音 +mute=Volume Mute,Volume Mute,静音 + +[ksmserver] +Halt Without Confirmation=none,,关机 (无需确认) +Lock Session=Meta+L\tScreensaver,Meta+L\tScreensaver,锁定会话 +Log Out=Ctrl+Alt+Del,Ctrl+Alt+Del,显示注销屏幕 +Log Out Without Confirmation=none,,注销 (无需确认) +LogOut=none,,注销 +Reboot=none,,重启 +Reboot Without Confirmation=none,,重启 (无需确认) +Shut Down=none,,关机 +_k_friendly_name=会话管理 + +[kwin] +Activate Window Demanding Attention=Meta+Ctrl+A,Meta+Ctrl+A,激活请求注意的窗口 +Cycle Overview=none,none,循环显示桌面概览和网格视图 +Cycle Overview Opposite=none,none,循环显示网格视图和桌面概览 +Decrease Opacity=none,,降低活动窗口不透明度 5% +Edit Tiles=Meta+F9,Meta+T,磁贴编辑器开关 +Expose=Ctrl+F9,Ctrl+F9,显示/隐藏窗口平铺 (当前桌面) +ExposeAll=Ctrl+F10\tLaunch (C),Ctrl+F10\tLaunch (C),显示/隐藏窗口平铺 (全部桌面) +ExposeClass=Ctrl+F7,Ctrl+F7,显示/隐藏窗口平铺 (窗口类) +ExposeClassCurrentDesktop=none,none,显示/隐藏窗口平铺 (当前桌面的窗口类) +Grid View=Meta+G,Meta+G,切换网格视图 +Increase Opacity=none,,提高活动窗口不透明度 5% +Kill Window=Meta+Ctrl+Q\tMeta+Ctrl+Esc,Meta+Ctrl+Esc,强制终止窗口 +Move Tablet to Next Output=none,none,移动数位板到下一个输出设备 +MoveMouseToCenter=Meta+F6,Meta+F6,移动鼠标到中央 +MoveMouseToFocus=Meta+F5,Meta+F5,移动鼠标到焦点 +MoveZoomDown=none,none,将缩放区域向下移动 +MoveZoomLeft=none,none,将缩放区域向左移动 +MoveZoomRight=none,none,将缩放区域向右移动 +MoveZoomUp=none,none,将缩放区域向上移动 +Overview=Meta,Meta+W,显示/隐藏桌面总览 +Setup Window Shortcut=none,,设置窗口快捷键 +Show Desktop=Meta+M,Meta+D,暂时显示桌面 +Switch One Desktop Down=Meta+Ctrl+Down,Meta+Ctrl+Down,切换到下方桌面 +Switch One Desktop Up=Meta+Ctrl+Up,Meta+Ctrl+Up,切换到上方桌面 +Switch One Desktop to the Left=Meta+Ctrl+Left,Meta+Ctrl+Left,切换到左侧桌面 +Switch One Desktop to the Right=Meta+Ctrl+Right,Meta+Ctrl+Right,切换到右侧桌面 +Switch Window Down=Meta+Alt+Down,Meta+Alt+Down,切换到下面的窗口 +Switch Window Left=Meta+Alt+Left,Meta+Alt+Left,切换到左侧的窗口 +Switch Window Right=Meta+Alt+Right,Meta+Alt+Right,切换到右侧的窗口 +Switch Window Up=Meta+Alt+Up,Meta+Alt+Up,切换到上面的窗口 +Switch to Desktop 1=Ctrl+F1,Ctrl+F1,切换到桌面 1 +Switch to Desktop 10=none,,切换到桌面 10 +Switch to Desktop 11=none,,切换到桌面 11 +Switch to Desktop 12=none,,切换到桌面 12 +Switch to Desktop 13=none,,切换到桌面 13 +Switch to Desktop 14=none,,切换到桌面 14 +Switch to Desktop 15=none,,切换到桌面 15 +Switch to Desktop 16=none,,切换到桌面 16 +Switch to Desktop 17=none,,切换到桌面 17 +Switch to Desktop 18=none,,切换到桌面 18 +Switch to Desktop 19=none,,切换到桌面 19 +Switch to Desktop 2=Ctrl+F2,Ctrl+F2,切换到桌面 2 +Switch to Desktop 20=none,,切换到桌面 20 +Switch to Desktop 3=Ctrl+F3,Ctrl+F3,切换到桌面 3 +Switch to Desktop 4=Ctrl+F4,Ctrl+F4,切换到桌面 4 +Switch to Desktop 5=none,,切换到桌面 5 +Switch to Desktop 6=none,,切换到桌面 6 +Switch to Desktop 7=none,,切换到桌面 7 +Switch to Desktop 8=none,,切换到桌面 8 +Switch to Desktop 9=none,,切换到桌面 9 +Switch to Next Desktop=none,,切换到下一桌面 +Switch to Next Screen=none,,切换到下一屏幕 +Switch to Previous Desktop=none,,切换到上一桌面 +Switch to Previous Screen=none,,切换到上一屏幕 +Switch to Screen 0=none,,切换到屏幕 0 +Switch to Screen 1=none,,切换到屏幕 1 +Switch to Screen 2=none,,切换到屏幕 2 +Switch to Screen 3=none,,切换到屏幕 3 +Switch to Screen 4=none,,切换到屏幕 4 +Switch to Screen 5=none,,切换到屏幕 5 +Switch to Screen 6=none,,切换到屏幕 6 +Switch to Screen 7=none,,切换到屏幕 7 +Switch to Screen Above=none,,切换到上方屏幕 +Switch to Screen Below=none,,切换到下方屏幕 +Switch to Screen to the Left=none,,切换到左侧屏幕 +Switch to Screen to the Right=none,,切换到右侧屏幕 +Toggle Night Color=none,none,暂停/继续夜间色温 +Toggle Window Raise/Lower=none,,提升/降低窗口 +Walk Through Windows=Alt+Tab,Meta+Tab\tAlt+Tab,遍历窗口 +Walk Through Windows (Reverse)=Meta+Shift+Tab\tAlt+Shift+Tab,Meta+Shift+Tab\tAlt+Shift+Tab,遍历窗口 (反向) +Walk Through Windows Alternative=none,none,遍历窗口交替 +Walk Through Windows Alternative (Reverse)=none,none,遍历窗口交替 (反向) +Walk Through Windows of Current Application=Meta+`\tAlt+`,Meta+`\tAlt+`,遍历当前应用程序窗口 +Walk Through Windows of Current Application (Reverse)=Meta+~\tAlt+~,Meta+~\tAlt+~,遍历当前应用程序窗口 (反向) +Walk Through Windows of Current Application Alternative=none,none,遍历当前应用程序窗口交替 +Walk Through Windows of Current Application Alternative (Reverse)=none,none,遍历当前应用程序窗口交替 (反向) +Window Above Other Windows=none,,窗口置顶 +Window Below Other Windows=none,,窗口置底 +Window Close=Alt+F4\tMeta+Q,Alt+F4,关闭窗口 +Window Custom Quick Tile Bottom=Meta+S,,自定义快速铺放窗口到下方 +Window Custom Quick Tile Left=Meta+A,,自定义快速铺放窗口到左侧 +Window Custom Quick Tile Right=Meta+D,,自定义快速铺放窗口到右侧 +Window Custom Quick Tile Top=Meta+W,,自定义快速铺放窗口到上方 +Window Fullscreen=Meta+Alt+F,,全屏显示窗口 +Window Grow Horizontal=none,,水平扩展窗口 +Window Grow Vertical=none,,垂直扩展窗口 +Window Lower=none,,降低窗口 +Window Maximize=Meta+F\tMeta+PgUp,Meta+PgUp,最大化窗口 +Window Maximize Horizontal=none,,水平最大化窗口 +Window Maximize Vertical=none,,垂直最大化窗口 +Window Minimize=Meta+H\tMeta+PgDown,Meta+PgDown,最小化窗口 +Window Move=none,,移动窗口 +Window Move Center=Meta+C,,移动窗口到中央 +Window No Border=none,,显示/隐藏窗口标题栏和框架 +Window On All Desktops=none,,在所有桌面上显示窗口 +Window One Desktop Down=Meta+Ctrl+Shift+Down,Meta+Ctrl+Shift+Down,窗口下移一个桌面 +Window One Desktop Up=Meta+Ctrl+Shift+Up,Meta+Ctrl+Shift+Up,窗口上移一个桌面 +Window One Desktop to the Left=Meta+Ctrl+Shift+Left,Meta+Ctrl+Shift+Left,窗口左移一个桌面 +Window One Desktop to the Right=Meta+Ctrl+Shift+Right,Meta+Ctrl+Shift+Right,窗口右移一个桌面 +Window One Screen Down=none,,移动窗口到下方屏幕 +Window One Screen Up=none,,移动窗口到上方屏幕 +Window One Screen to the Left=none,,移动窗口到左侧屏幕 +Window One Screen to the Right=none,,移动窗口到右侧屏幕 +Window Operations Menu=Alt+F3,Alt+F3,窗口菜单 +Window Pack Down=none,,下移窗口 +Window Pack Left=none,,左移窗口 +Window Pack Right=none,,右移窗口 +Window Pack Up=none,,上移窗口 +Window Quick Tile Bottom=Meta+Down,Meta+Down,快速铺放窗口到下方 +Window Quick Tile Bottom Left=none,,快速铺放窗口到左下方 +Window Quick Tile Bottom Right=none,,快速铺放窗口到右下方 +Window Quick Tile Left=Meta+Left,Meta+Left,快速铺放窗口到左侧 +Window Quick Tile Right=Meta+Right,Meta+Right,快速铺放窗口到右侧 +Window Quick Tile Top=Meta+Up,Meta+Up,快速铺放窗口到上方 +Window Quick Tile Top Left=none,,快速铺放窗口到左上方 +Window Quick Tile Top Right=none,,快速铺放窗口到右上方 +Window Raise=none,,提升窗口 +Window Resize=none,,调整窗口大小 +Window Shrink Horizontal=none,,水平缩小窗口 +Window Shrink Vertical=none,,垂直缩小窗口 +Window to Desktop 1=none,,窗口移动到桌面 1 +Window to Desktop 10=none,,窗口移动到桌面 10 +Window to Desktop 11=none,,窗口移动到桌面 11 +Window to Desktop 12=none,,窗口移动到桌面 12 +Window to Desktop 13=none,,窗口移动到桌面 13 +Window to Desktop 14=none,,窗口移动到桌面 14 +Window to Desktop 15=none,,窗口移动到桌面 15 +Window to Desktop 16=none,,窗口移动到桌面 16 +Window to Desktop 17=none,,窗口移动到桌面 17 +Window to Desktop 18=none,,窗口移动到桌面 18 +Window to Desktop 19=none,,窗口移动到桌面 19 +Window to Desktop 2=none,,窗口移动到桌面 2 +Window to Desktop 20=none,,窗口移动到桌面 20 +Window to Desktop 3=none,,窗口移动到桌面 3 +Window to Desktop 4=none,,窗口移动到桌面 4 +Window to Desktop 5=none,,窗口移动到桌面 5 +Window to Desktop 6=none,,窗口移动到桌面 6 +Window to Desktop 7=none,,窗口移动到桌面 7 +Window to Desktop 8=none,,窗口移动到桌面 8 +Window to Desktop 9=none,,窗口移动到桌面 9 +Window to Next Desktop=none,,窗口移动到下一桌面 +Window to Next Screen=Meta+Shift+Right,Meta+Shift+Right,移动窗口到下一屏幕 +Window to Previous Desktop=none,,窗口移动到上一桌面 +Window to Previous Screen=Meta+Shift+Left,Meta+Shift+Left,移动窗口到上一屏幕 +Window to Screen 0=none,,移动窗口到屏幕 0 +Window to Screen 1=none,,移动窗口到屏幕 1 +Window to Screen 2=none,,移动窗口到屏幕 2 +Window to Screen 3=none,,移动窗口到屏幕 3 +Window to Screen 4=none,,移动窗口到屏幕 4 +Window to Screen 5=none,,移动窗口到屏幕 5 +Window to Screen 6=none,,移动窗口到屏幕 6 +Window to Screen 7=none,,移动窗口到屏幕 7 +_k_friendly_name=KWin +disableInputCapture=Meta+Shift+Esc,Meta+Shift+Esc,禁用活动输入捕获 +view_actual_size=Meta+0,Meta+0,缩放为实际大小(A) +view_zoom_in=Meta++\tMeta+=,Meta++\tMeta+=,放大(I) +view_zoom_out=Meta+-,Meta+-,缩小(O) + +[mediacontrol] +_k_friendly_name=媒体控制器 +mediavolumedown=none,,媒体音量降低 +mediavolumeup=none,,媒体音量提高 +nextmedia=Media Next,Media Next,播放下一首媒体 +pausemedia=Media Pause,Media Pause,暂停媒体播放 +playmedia=none,,播放媒体 +playpausemedia=Media Play,Media Play,播放/暂停媒体播放 +previousmedia=Media Previous,Media Previous,播放上一首媒体 +stopmedia=Media Stop,Media Stop,停止媒体播放 + +[org_kde_powerdevil] +Decrease Keyboard Brightness=Keyboard Brightness Down,Keyboard Brightness Down,降低键盘亮度 +Decrease Screen Brightness=Monitor Brightness Down,Monitor Brightness Down,降低屏幕亮度 +Decrease Screen Brightness Small=Shift+Monitor Brightness Down,Shift+Monitor Brightness Down,降低屏幕亮度 1% +Hibernate=Hibernate,Hibernate,休眠 +Increase Keyboard Brightness=Keyboard Brightness Up,Keyboard Brightness Up,提高键盘亮度 +Increase Screen Brightness=Monitor Brightness Up,Monitor Brightness Up,提高屏幕亮度 +Increase Screen Brightness Small=Shift+Monitor Brightness Up,Shift+Monitor Brightness Up,提高屏幕亮度 1% +PowerDown=Power Down,Power Down,断电 +PowerOff=Power Off,Power Off,关机 +Sleep=Sleep,Sleep,挂起 +Toggle Keyboard Backlight=Keyboard Light On/Off,Keyboard Light On/Off,开关键盘背光 +Turn Off Screen=none,none,关闭屏幕 +_k_friendly_name=电源管理 +powerProfile=Battery,Battery\tMeta+B,切换电源管理方案 + +[plasmashell] +Slideshow Wallpaper Next Image=none,,下一张壁纸图像 +_k_friendly_name=plasmashell +activate application launcher=Alt\tAlt+F1,Meta\tAlt+F1,激活应用程序启动器 +activate task manager entry 1=Meta+1,Meta+1,激活任务管理器条目 1 +activate task manager entry 10=none,,激活任务管理器条目 10 +activate task manager entry 2=Meta+2,Meta+2,激活任务管理器条目 2 +activate task manager entry 3=Meta+3,Meta+3,激活任务管理器条目 3 +activate task manager entry 4=Meta+4,Meta+4,激活任务管理器条目 4 +activate task manager entry 5=Meta+5,Meta+5,激活任务管理器条目 5 +activate task manager entry 6=Meta+6,Meta+6,激活任务管理器条目 6 +activate task manager entry 7=Meta+7,Meta+7,激活任务管理器条目 7 +activate task manager entry 8=Meta+8,Meta+8,激活任务管理器条目 8 +activate task manager entry 9=Meta+9,Meta+9,激活任务管理器条目 9 +clear-history=none,,清除剪贴板历史(L) +clipboard_action=Meta+Ctrl+X,Meta+Ctrl+X,自动弹出操作菜单 +cycle-panels=Meta+Alt+P,Meta+Alt+P,在面板之间移动键盘焦点 +cycleNextAction=none,,下一条历史记录 +cyclePrevAction=none,,上一条历史记录 +edit_clipboard=none,,编辑内容(E)… +manage activities=none,Meta+Q,显示活动切换器 +next activity=none,none,遍历活动 +previous activity=Meta+Shift+A,none,遍历活动 (反向) +repeat_action=none,,在当前剪贴板上手动执行操作 +show dashboard=Ctrl+F12,Ctrl+F12,显示桌面 +show-barcode=none,,显示条形码(S)… +show-on-mouse-pos=Meta+V,Meta+V,在鼠标位置显示剪贴板项目 +switch to next activity=none,,切换到下一个活动 +switch to previous activity=none,,切换到上一个活动 +toggle do not disturb=none,,切换勿扰模式 + +[services][firefox.desktop] +_launch=Meta+B + +[services][org.kde.konsole.desktop] +_launch=Ctrl+Alt+T\tMeta+T + +[services][org.kde.krunner.desktop] +RunClipboard=Alt+Shift+F2\tMeta+Z diff --git a/kde-dotfiles/.config/konsolerc b/kde-dotfiles/.config/konsolerc new file mode 100644 index 0000000..2fa4feb --- /dev/null +++ b/kde-dotfiles/.config/konsolerc @@ -0,0 +1,10 @@ +MenuBar=Disabled + +[Desktop Entry] +DefaultProfile=配置方案 1.profile + +[General] +ConfigVersion=1 + +[UiSettings] +ColorScheme= diff --git a/kde-dotfiles/.config/krunnerrc b/kde-dotfiles/.config/krunnerrc new file mode 100644 index 0000000..031e964 --- /dev/null +++ b/kde-dotfiles/.config/krunnerrc @@ -0,0 +1,2 @@ +[General] +FreeFloating=true \ No newline at end of file diff --git a/kde-dotfiles/.config/kwinrc b/kde-dotfiles/.config/kwinrc new file mode 100644 index 0000000..8635a19 --- /dev/null +++ b/kde-dotfiles/.config/kwinrc @@ -0,0 +1,67 @@ +[Desktops] +Id_1=f6df2954-14b9-49c8-a636-9555f57dfed7 +Id_2=ab7beb6a-c92b-4a4d-9b70-5360ba5311e3 +Number=2 +Rows=1 + +[Effect-kwin4_effect_geometry_change] +Duration=500 + +[Effect-shakecursor] +Magnification=10 + +[Effect-translucency] +MoveResize=97 + +[Effect-wobblywindows] +AdvancedMode=true +Drag=70 +MoveFactor=15 +Stiffness=25 + +[MouseBindings] +CommandTitlebarWheel=Previous/Next Desktop + +[Plugins] +desktopchangeosdEnabled=true +kwin4_effect_geometry_changeEnabled=true +translucencyEnabled=true +wobblywindowsEnabled=true + +[Round-Corners] +ActiveOutlineUseCustom=false +ActiveOutlineUsePalette=true +ActiveSecondOutlineUseCustom=false +ActiveSecondOutlineUsePalette=true +DisableOutlineTile=false +DisableRoundTile=false +InactiveCornerRadius=8 +InactiveOutlineThickness=0 +InactiveOutlineUseCustom=false +InactiveOutlineUsePalette=true +InactiveSecondOutlineThickness=0 +OutlineThickness=2 +Size=8 + +[Script-desktopchangeosd] +PopupHideDelay=0 + +[Tiling] +padding=4 + +[Tiling][ab7beb6a-c92b-4a4d-9b70-5360ba5311e3][c7d12e0c-6522-4cee-ac2b-398fc73721d5] +tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]} + +[Tiling][f6df2954-14b9-49c8-a636-9555f57dfed7][c7d12e0c-6522-4cee-ac2b-398fc73721d5] +tiles={"layoutDirection":"horizontal","tiles":[{"layoutDirection":"vertical","tiles":[{"height":0.5},{"height":0.5}],"width":0.39111111111111085},{"layoutDirection":"vertical","tiles":[{"height":0.5},{"height":0.5}],"width":0.400555555555556},{"layoutDirection":"vertical","tiles":[{"height":0.5},{"height":0.5}],"width":0.20833333333333315}]} + +[Wayland] +InputMethod[$e]=/usr/share/applications/fcitx5-wayland-launcher.desktop + +[Xwayland] +Scale=1.6 + +[org.kde.kdecoration2] +ButtonsOnLeft=MF +ButtonsOnRight=IAX +theme=Breeze 微风 diff --git a/kde-dotfiles/.config/kxkbrc b/kde-dotfiles/.config/kxkbrc new file mode 100644 index 0000000..223a9c7 --- /dev/null +++ b/kde-dotfiles/.config/kxkbrc @@ -0,0 +1,6 @@ +[Layout] +LayoutList=us +VariantList= +DisplayNames= +Use=true + diff --git a/kde-dotfiles/.config/plasma-localerc b/kde-dotfiles/.config/plasma-localerc new file mode 100644 index 0000000..7551702 --- /dev/null +++ b/kde-dotfiles/.config/plasma-localerc @@ -0,0 +1,7 @@ +[Formats] +LANG=en_US.UTF-8 +LC_MESSAGES=zh_CN.UTF-8 +LC_TIME=zh_CN.UTF-8 + +[Translations] +LANGUAGE=zh_CN:en_US diff --git a/kde-dotfiles/.config/plasma-org.kde.plasma.desktop-appletsrc b/kde-dotfiles/.config/plasma-org.kde.plasma.desktop-appletsrc new file mode 100644 index 0000000..408f175 --- /dev/null +++ b/kde-dotfiles/.config/plasma-org.kde.plasma.desktop-appletsrc @@ -0,0 +1,204 @@ +[ActionPlugins][0] +MiddleButton;NoModifier=org.kde.applauncher +RightButton;NoModifier=org.kde.contextmenu +wheel:Vertical;NoModifier=org.kde.switchdesktop + +[ActionPlugins][0][MiddleButton;NoModifier] +showAppsByName=true + +[ActionPlugins][0][RightButton;NoModifier] +_add panel=false +_context=true +_display_settings=true +_lock_screen=false +_logout=false +_open_terminal=false +_run_command=false +_sep1=true +_sep2=true +_sep3=true +_sep4=true +_wallpaper=true +add widgets=false +configure=true +configure shortcuts=false +desktop edit mode=true +manage activities=true +remove=true + +[ActionPlugins][1] +RightButton;NoModifier=org.kde.contextmenu + +[Containments][1] +ItemGeometries-1800x1125= +ItemGeometriesHorizontal= +activityId=07bb86c0-791a-4e9f-af74-03bfbe9f11fd +formfactor=0 +immutability=1 +lastScreen=0 +location=0 +plugin=org.kde.plasma.folder +wallpaperplugin=org.kde.image + +[Containments][1][ConfigDialog] +DialogHeight=630 +DialogWidth=810 + +[Containments][2] +activityId= +formfactor=2 +immutability=1 +lastScreen=0 +location=4 +plugin=org.kde.panel +wallpaperplugin=org.kde.image + +[Containments][2][Applets][21] +immutability=1 +plugin=org.kde.plasma.digitalclock + +[Containments][2][Applets][21][Configuration] +popupHeight=400 +popupWidth=560 + +[Containments][2][Applets][21][Configuration][Appearance] +fontWeight=400 + +[Containments][2][Applets][25] +immutability=1 +plugin=com.github.exequtic.apdatifier + +[Containments][2][Applets][25][Configuration] +PreloadWeight=55 +popupHeight=289 +popupWidth=432 + +[Containments][2][Applets][25][Configuration][Upgrade] +terminal=/usr/bin/konsole +wrapper=yay + +[Containments][2][Applets][26] +immutability=1 +plugin=org.kde.plasma.panelspacer + +[Containments][2][Applets][27] +immutability=1 +plugin=org.kde.plasma.panelspacer + +[Containments][2][Applets][3] +immutability=1 +plugin=org.kde.plasma.kickoff + +[Containments][2][Applets][3][Configuration] +PreloadWeight=100 +popupHeight=518 +popupWidth=647 + +[Containments][2][Applets][3][Configuration][General] +favoritesPortedToKAstats=true + +[Containments][2][Applets][5] +immutability=1 +plugin=org.kde.plasma.icontasks + +[Containments][2][Applets][6] +immutability=1 +plugin=org.kde.plasma.marginsseparator + +[Containments][2][Applets][7] +activityId= +formfactor=0 +immutability=1 +lastScreen=-1 +location=0 +plugin=org.kde.plasma.systemtray +popupHeight=432 +popupWidth=432 +wallpaperplugin=org.kde.image + +[Containments][2][Applets][7][Applets][10] +immutability=1 +plugin=org.kde.plasma.manage-inputmethod + +[Containments][2][Applets][7][Applets][11] +immutability=1 +plugin=org.kde.plasma.keyboardlayout + +[Containments][2][Applets][7][Applets][12] +immutability=1 +plugin=org.kde.plasma.vault + +[Containments][2][Applets][7][Applets][13] +immutability=1 +plugin=org.kde.plasma.devicenotifier + +[Containments][2][Applets][7][Applets][13][Configuration] +PreloadWeight=55 + +[Containments][2][Applets][7][Applets][14] +immutability=1 +plugin=org.kde.plasma.notifications + +[Containments][2][Applets][7][Applets][15] +immutability=1 +plugin=org.kde.plasma.keyboardindicator + +[Containments][2][Applets][7][Applets][16] +immutability=1 +plugin=org.kde.plasma.weather + +[Containments][2][Applets][7][Applets][17] +immutability=1 +plugin=org.kde.kscreen + +[Containments][2][Applets][7][Applets][18] +immutability=1 +plugin=org.kde.plasma.networkmanagement + +[Containments][2][Applets][7][Applets][19] +immutability=1 +plugin=org.kde.plasma.volume + +[Containments][2][Applets][7][Applets][19][Configuration][General] +migrated=true + +[Containments][2][Applets][7][Applets][20] +immutability=1 +plugin=org.kde.plasma.printmanager + +[Containments][2][Applets][7][Applets][23] +immutability=1 +plugin=org.kde.plasma.battery + +[Containments][2][Applets][7][Applets][23][Configuration] +PreloadWeight=42 + +[Containments][2][Applets][7][Applets][24] +immutability=1 +plugin=org.kde.plasma.brightness + +[Containments][2][Applets][7][Applets][24][Configuration] +PreloadWeight=52 + +[Containments][2][Applets][7][Applets][8] +immutability=1 +plugin=org.kde.plasma.cameraindicator + +[Containments][2][Applets][7][Applets][9] +immutability=1 +plugin=org.kde.plasma.clipboard + +[Containments][2][Applets][7][ConfigDialog] +DialogHeight=630 +DialogWidth=810 + +[Containments][2][Applets][7][General] +extraItems=org.kde.plasma.bluetooth,org.kde.plasma.cameraindicator,org.kde.plasma.clipboard,org.kde.plasma.manage-inputmethod,org.kde.plasma.keyboardlayout,org.kde.plasma.vault,org.kde.plasma.devicenotifier,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardindicator,org.kde.plasma.weather,org.kde.kscreen,org.kde.plasma.battery,org.kde.plasma.brightness,org.kde.plasma.networkmanagement,org.kde.plasma.volume,org.kde.plasma.printmanager +knownItems=org.kde.plasma.bluetooth,org.kde.plasma.cameraindicator,org.kde.plasma.clipboard,org.kde.plasma.manage-inputmethod,org.kde.plasma.keyboardlayout,org.kde.plasma.vault,org.kde.plasma.devicenotifier,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardindicator,org.kde.plasma.weather,org.kde.kscreen,org.kde.plasma.battery,org.kde.plasma.brightness,org.kde.plasma.networkmanagement,org.kde.plasma.volume,org.kde.plasma.printmanager + +[Containments][2][General] +AppletOrder=25;26;3;6;5;27;7;21 + +[ScreenMapping] +itemsOnDisabledScreens= +screenMapping= diff --git a/kde-dotfiles/.config/plasmarc b/kde-dotfiles/.config/plasmarc new file mode 100644 index 0000000..f89bcd9 --- /dev/null +++ b/kde-dotfiles/.config/plasmarc @@ -0,0 +1,2 @@ +[Theme] +name=breeze-dark diff --git a/kde-dotfiles/.config/plasmashellrc b/kde-dotfiles/.config/plasmashellrc new file mode 100644 index 0000000..6b8d99c --- /dev/null +++ b/kde-dotfiles/.config/plasmashellrc @@ -0,0 +1,11 @@ +[PlasmaViews][Panel 2] +floating=0 +floatingApplets=1 +panelOpacity=2 +panelVisibility=2 + +[PlasmaViews][Panel 2][Defaults] +thickness=44 + +[Updates] +performed=/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/containmentactions_middlebutton.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_migrate_font_settings.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_migrate_showseconds_setting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_rename_timezonedisplay_key.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/folderview_fix_recursive_screenmapping.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/keyboardlayout_migrateiconsetting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/keyboardlayout_remove_shortcut.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/klipper_clear_config.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/maintain_existing_desktop_icon_sizes.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/mediaframe_migrate_useBackground_setting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/migrate_font_weights.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/move_desktop_layout_config.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/no_middle_click_paste_on_panels.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/systemloadviewer_systemmonitor.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/taskmanager_configUpdate_wheelEnabled.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/unlock_widgets.js diff --git a/kde-dotfiles/.config/scripts/fastfetch-random-wife.sh b/kde-dotfiles/.config/scripts/fastfetch-random-wife.sh new file mode 100644 index 0000000..92de49a --- /dev/null +++ b/kde-dotfiles/.config/scripts/fastfetch-random-wife.sh @@ -0,0 +1,187 @@ +# 脚本功能: +# 从随机老婆图片生成 API 下载图片并使用 Fastfetch 展示。 +# 特性:支持 NSFW 模式,支持自动补货,支持已用图片归档与自动清理。 + +# ================= 配置区域 ================= + +# [开关] 强力清理 Fastfetch 内部缓存 +# true = 每次运行后清理 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) +# false = 保留 Fastfetch 内部缓存 +CLEAN_CACHE_MODE=true + +# 每次补货下载多少张 +DOWNLOAD_BATCH_SIZE=10 +# 最大库存上限 (待展示区) +MAX_CACHE_LIMIT=100 +# 库存少于多少张时开始补货 +MIN_TRIGGER_LIMIT=60 + +# [新增] used 目录最大存放数量 +# 超过此数量将按照时间顺序删除最旧的文件 +MAX_USED_LIMIT=50 + +# =========================================== + +# --- 0. 参数解析与模式设置 --- + +NSFW_MODE=false +# 检查环境变量 +if [ "$NSFW" = "1" ]; then + NSFW_MODE=true +fi + +ARGS_FOR_FASTFETCH=() +for arg in "$@"; do + if [ "$arg" == "--nsfw" ]; then + NSFW_MODE=true + else + ARGS_FOR_FASTFETCH+=("$arg") + fi +done + +# --- 1. 目录配置 --- + +# 根据模式区分缓存目录和锁文件 +if [ "$NSFW_MODE" = true ]; then + CACHE_DIR="$HOME/.cache/fastfetch_waifu_nsfw" + LOCK_FILE="/tmp/fastfetch_waifu_nsfw.lock" +else + CACHE_DIR="$HOME/.cache/fastfetch_waifu" + LOCK_FILE="/tmp/fastfetch_waifu.lock" +fi + +# 定义已使用目录 +USED_DIR="$CACHE_DIR/used" + +mkdir -p "$CACHE_DIR" +mkdir -p "$USED_DIR" + +# --- 2. 核心函数 --- + +get_random_url() { + local TIMEOUT="--connect-timeout 5 --max-time 15" + RAND=$(( ( RANDOM % 3 ) + 1 )) + + if [ "$NSFW_MODE" = true ]; then + # === NSFW API === + case $RAND in + 1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=true" | jq -r '.images[0].url' ;; + 2) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' ;; + 3) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' ;; + esac + else + # === SFW (正常) API === + case $RAND in + 1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=false" | jq -r '.images[0].url' ;; + 2) curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' ;; + 3) curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' ;; + esac + fi +} + +download_one_image() { + URL=$(get_random_url) + if [[ "$URL" =~ ^http ]]; then + # 使用带时间戳的随机文件名 + FILENAME="waifu_$(date +%s%N)_$RANDOM.jpg" + TARGET_PATH="$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if [ -s "$TARGET_PATH" ]; then + if command -v file >/dev/null 2>&1; then + if ! file --mime-type "$TARGET_PATH" | grep -q "image/"; then + rm -f "$TARGET_PATH" + fi + fi + else + rm -f "$TARGET_PATH" + fi + fi +} + +background_job() { + ( + flock -n 200 || exit 1 + + # 1. 补货检查 + CURRENT_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + + if [ "$CURRENT_COUNT" -lt "$MIN_TRIGGER_LIMIT" ]; then + for ((i=1; i<=DOWNLOAD_BATCH_SIZE; i++)); do + download_one_image + sleep 0.5 + done + fi + + # 2. 清理过多库存 + FINAL_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + if [ "$FINAL_COUNT" -gt "$MAX_CACHE_LIMIT" ]; then + DELETE_START_LINE=$((MAX_CACHE_LIMIT + 1)) + ls -tp "$CACHE_DIR"/*.jpg 2>/dev/null | tail -n +$DELETE_START_LINE | xargs -I {} rm -- "{}" + fi + + ) 200>"$LOCK_FILE" +} + +# --- 3. 主程序逻辑 --- + +shopt -s nullglob +FILES=("$CACHE_DIR"/*.jpg) +NUM_FILES=${#FILES[@]} +shopt -u nullglob + +SELECTED_IMG="" + +if [ "$NUM_FILES" -gt 0 ]; then + # 有库存,随机选一张 + RAND_INDEX=$(( RANDOM % NUM_FILES )) + SELECTED_IMG="${FILES[$RAND_INDEX]}" + + # 后台补货 + background_job >/dev/null 2>&1 & + +else + # 没库存,提示语更改 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + download_one_image + + shopt -s nullglob + FILES=("$CACHE_DIR"/*.jpg) + shopt -u nullglob + + if [ ${#FILES[@]} -gt 0 ]; then + SELECTED_IMG="${FILES[0]}" + background_job >/dev/null 2>&1 & + fi +fi + +# 运行 Fastfetch +if [ -n "$SELECTED_IMG" ] && [ -f "$SELECTED_IMG" ]; then + + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true "${ARGS_FOR_FASTFETCH[@]}" + + # === 新增逻辑:移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 新增逻辑:检查 used 目录数量并清理 === + USED_COUNT=$(find "$USED_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l) + + if [ "$USED_COUNT" -gt "$MAX_USED_LIMIT" ]; then + # 计算需要保留的文件行数 (跳过最新的 MAX_USED_LIMIT 个) + SKIP_LINES=$((MAX_USED_LIMIT + 1)) + # ls -tp 按时间倒序排列(新->旧),tail 取出旧文件,xargs 删除 + ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$SKIP_LINES | xargs -I {} rm -- "{}" + fi + + # 检查是否开启清理 Fastfetch 内部缓存 (仅清理缩略图缓存,不删原图) + if [ "$CLEAN_CACHE_MODE" = true ]; then + rm -rf "$HOME/.cache/fastfetch/images" + fi +else + # 失败提示语更改 + echo "呜呜... 图片下载失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch "${ARGS_FOR_FASTFETCH[@]}" +fi diff --git a/kde-dotfiles/.config/spectaclerc b/kde-dotfiles/.config/spectaclerc new file mode 100644 index 0000000..5b17031 --- /dev/null +++ b/kde-dotfiles/.config/spectaclerc @@ -0,0 +1,9 @@ +[General] +autoSaveImage=true +clipboardGroup=PostScreenshotCopyImage + +[ImageSave] +translatedScreenshotsFolder=屏幕截图 + +[VideoSave] +translatedScreencastsFolder=屏幕录像 diff --git a/kde-dotfiles/.config/starship.toml b/kde-dotfiles/.config/starship.toml new file mode 100644 index 0000000..d5dc5e6 --- /dev/null +++ b/kde-dotfiles/.config/starship.toml @@ -0,0 +1,181 @@ +"$schema" = 'https://starship.rs/config-schema.json' +format = """ +[](color_orange)\ +$os\ +$username\ +[](bg:color_yellow fg:color_orange)\ +$directory\ +[](fg:color_yellow bg:color_aqua)\ +$git_branch\ +$git_status\ +[](fg:color_aqua bg:color_blue)\ +$c\ +$cpp\ +$rust\ +$golang\ +$nodejs\ +$php\ +$java\ +$kotlin\ +$haskell\ +$python\ +[](fg:color_blue bg:color_bg3)\ +$docker_context\ +$conda\ +$pixi\ +[](fg:color_bg3 bg:color_bg1)\ +$time\ +[ ](fg:color_bg1)\ +$line_break$character""" +palette = 'colors' + +[palettes.colors] +mustard = '#af8700' +color_orange = '#feb0d3' +color_fg0 = '#521d3a' +color_fg1 = '#eedfe3' +color_purple = '#ffdbc7' +color_bg3 = '#e0bdcb' +color_green = '#521d3a' +color_bg1 = '#59404b' +color_blue = '#40373a' +color_red = '#feb0d3' +color_aqua = '#fdd9e7' +color_yellow = '#f2bb99' + +[os] +disabled = false +style = "bg:color_orange fg:color_fg0" + +[os.symbols] +Windows = "󰍲" +Ubuntu = "󰕈" +SUSE = "" +Raspbian = "󰐿" +Mint = "󰣭" +Macos = "󰀵" +Manjaro = "" +Linux = "󰌽" +Gentoo = "󰣨" +Fedora = "󰣛" +Alpine = "" +Amazon = "" +Android = "" +Arch = "󰣇" +Artix = "󰣇" +EndeavourOS = "" +CentOS = "" +Debian = "󰣚" +Redhat = "󱄛" +RedHatEnterprise = "󱄛" +Pop = "" + +[username] +show_always = true +style_user = "bg:color_orange fg:color_fg0" +style_root = "bg:color_orange fg:color_fg0" +format = '[ $user ]($style)' + +[directory] +style = "fg:color_fg0 bg:color_yellow" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = "󰝚 " +"Pictures" = " " +"Developer" = "󰲋 " + +[git_branch] +symbol = "" +style = "bg:color_aqua" +format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)' + +[git_status] +style = "bg:color_aqua" +format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)' + +[nodejs] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[c] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[cpp] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[rust] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[golang] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[php] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[java] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[kotlin] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg1 bg:color_blue)]($style)' + +[haskell] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[python] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[docker_context] +symbol = "" +style = "bg:color_bg3" +format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)' + +[conda] +style = "bg:color_bg3" +format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)' + +[pixi] +style = "bg:color_bg3" +format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:color_bg1" +format = '[[  $time ](fg:color_fg1 bg:color_bg1)]($style)' + +[line_break] +disabled = false + +[character] +disabled = false +success_symbol = '[](bold fg:color_green)' +error_symbol = '[](bold fg:color_red)' +vimcmd_symbol = '[](bold fg:color_green)' +vimcmd_replace_one_symbol = '[](bold fg:color_purple)' +vimcmd_replace_symbol = '[](bold fg:color_purple)' +vimcmd_visual_symbol = '[](bold fg:color_yellow)' + diff --git a/kde-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/kde-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/kde-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/kde-dotfiles/.local/share/konsole/Catppuccin-Frappe.colorscheme b/kde-dotfiles/.local/share/konsole/Catppuccin-Frappe.colorscheme new file mode 100644 index 0000000..53fdb10 --- /dev/null +++ b/kde-dotfiles/.local/share/konsole/Catppuccin-Frappe.colorscheme @@ -0,0 +1,100 @@ +[Background] +Color=48,52,70 + +[BackgroundFaint] +Color=48,52,70 + +[BackgroundIntense] +Color=48,52,70 + +[Color0] +Color=115,121,148 + +[Color0Faint] +Color=115,121,148 + +[Color0Intense] +Color=115,121,148 + +[Color1] +Color=231,130,132 + +[Color1Faint] +Color=231,130,132 + +[Color1Intense] +Color=231,130,132 + +[Color2] +Color=166,209,137 + +[Color2Faint] +Color=166,209,137 + +[Color2Intense] +Color=166,209,137 + +[Color3] +Color=229,200,144 + +[Color3Faint] +Color=229,200,144 + +[Color3Intense] +Color=229,200,144 + +[Color4] +Color=140,170,238 + +[Color4Faint] +Color=140,170,238 + +[Color4Intense] +Color=140,170,238 + +[Color5] +Color=202,158,230 + +[Color5Faint] +Color=202,158,230 + +[Color5Intense] +Color=202,158,230 + +[Color6] +Color=153,209,219 + +[Color6Faint] +Color=153,209,219 + +[Color6Intense] +Color=153,209,219 + +[Color7] +Color=198,208,245 + +[Color7Faint] +Color=198,208,245 + +[Color7Intense] +Color=198,208,245 + +[Foreground] +Color=198,208,245 + +[ForegroundFaint] +Color=198,208,245 + +[ForegroundIntense] +Color=198,208,245 + +[General] +Anchor=0.5,0.5 +Blur=false +ColorRandomization=false +Description=Catppuccin Frappé +FillStyle=Tile +Opacity=1 +Wallpaper= +WallpaperFlipType=NoFlip +WallpaperOpacity=1 diff --git a/kde-dotfiles/.local/share/konsole/配置方案 1.profile b/kde-dotfiles/.local/share/konsole/配置方案 1.profile new file mode 100644 index 0000000..275a5ec --- /dev/null +++ b/kde-dotfiles/.local/share/konsole/配置方案 1.profile @@ -0,0 +1,14 @@ +[Appearance] +ColorScheme=Catppuccin-Frappe +Font=JetBrains Maple Mono,15,-1,5,400,0,0,0,0,0,0,0,0,0,0,1 +LineSpacing=0 + +[General] +Command=/usr/bin/fish +Name=配置方案 1 +Parent=FALLBACK/ +ShowTerminalSizeHint=false +TerminalMargin=1 + +[Scrolling] +HighlightScrolledLines=false diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/config.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/config.qml new file mode 100644 index 0000000..3e1c077 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/config.qml @@ -0,0 +1,38 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import org.kde.plasma.configuration + +ConfigModel { + ConfigCategory { + name: i18n("General") + icon: "preferences-desktop" + source: "configuration/General.qml" + } + + ConfigCategory { + name: i18n("Upgrade") + icon: "preferences-system-startup" + source: "configuration/Upgrade.qml" + } + + ConfigCategory { + name: i18n("Appearance") + icon: "preferences-desktop-display-color" + source: "configuration/Appearance.qml" + } + + ConfigCategory { + name: i18n("Rules") + icon: "preferences-system-windows-behavior" + source: "configuration/Rules.qml" + } + + ConfigCategory { + name: i18n("Support me") + icon: "starred-symbolic" + source: "configuration/Support.qml" + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/main.xml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/main.xml new file mode 100644 index 0000000..f24f8c4 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/config/main.xml @@ -0,0 +1,105 @@ + + + + + + + true + 60 + false + true + false + false + false + false + false + false + false + 3 + upgradeSystem + + switchInterval + management + true + false + true + true + false + true + true + false + + + + + sudo + false + false + 7 + 5 + null + false + + true + true + systemctl --user restart plasma-plasmashell.service + false + + + + false + false + false + + + 0 + apdatifier-plasmoid + true + true + false + + 0 + 3 + 8 + true + + 6 + true + 0 + 0 + 0 + 0 + false + true + false + true + false + true + 0 + false + 6 + true + true + true + true + true + true + true + true + true + true + true + + + v0 + + true + true + + diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..2b708ae Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/es/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/es/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..0d40333 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/es/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/fr/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/fr/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..c88f113 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/fr/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ko/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ko/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..1303d06 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ko/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/nl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/nl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..04d8c00 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/nl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..e803f34 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pl/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pt_BR/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pt_BR/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..ea57b29 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/pt_BR/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ru/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ru/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..a0e85c4 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/ru/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/zh/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/zh/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo new file mode 100644 index 0000000..af3e710 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/locale/zh/LC_MESSAGES/plasma_applet_com.github.exequtic.apdatifier.mo differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/init b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/init new file mode 100644 index 0000000..50c3aa0 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/init @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +configDir=$HOME/.config/apdatifier +config=$configDir/config.conf +test -d $configDir || mkdir -p $configDir +test -f $config || touch $config + +source $(dirname "$0")/vars + +for dir in $iconsDir $notifDir; do + test -d $dir || mkdir -p $dir +done + +for icon in $icon1 $icon2 $icon3 $icon4; do + test -f $iconsDir/$icon || cp $appletDir/contents/ui/assets/icons/$icon $iconsDir +done + +test -d $notifDir && cat > $notifDir/$notif << EOF +[Global] +IconName=apdatifier-plasmoid +Comment=Apdatifier + +[Event/updates] +Name=New updates +Comment=Event when updates notification enabled without sound +Action=Popup + +[Event/updatesSound] +Name=New updates (with sound) +Comment=Event when updates notification enabled with sound +Action=Popup|Sound +Sound=service-login + +[Event/error] +Name=Error +Comment=Event when error notification enabled without sound +Action=Popup + +[Event/errorSound] +Name=Error (with sound) +Comment=Event when errors notification enabled with sound +Action=Popup|Sound +Sound=dialog-error-serious + +[Event/news] +Name=News +Comment=Event when news notification without sound +Action=Popup + +[Event/newsSound] +Name=News (with sound) +Comment=Event when news notification with sound +Action=Popup|Sound +Sound=dialog-information +EOF diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/management b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/management new file mode 100644 index 0000000..0461bc7 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/management @@ -0,0 +1,174 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/utils" + +trap '' SIGINT + +[ "$1" ] && selected="$1" || selected=0 + +[[ $aur != true || -z $wrapper ]] && wrapper="pacman" +wrapper="${wrapper##*/}"; wrapper_sudo=$wrapper +[[ $wrapper = "pacman" ]] && wrapper_sudo="$sudoBin pacman" + +returnMenu() { + printReturn + showOptions $selected + exit +} + +options=( + "${ICO_MNG_OPT_01}${MNG_OPT_01}" + "${ICO_MNG_OPT_02}${MNG_OPT_02}" + "${ICO_MNG_OPT_03}${MNG_OPT_03}" + "${ICO_MNG_OPT_04}${MNG_OPT_04}" + "${ICO_MNG_OPT_05}${MNG_OPT_05}" + "${ICO_MNG_OPT_06}${MNG_OPT_06}" + "${ICO_MNG_OPT_07}${MNG_OPT_07}" + "${ICO_MNG_OPT_08}${MNG_OPT_08}" + "${ICO_MNG_OPT_09}${MNG_OPT_09}" + "${ICO_MNG_OPT_10}${MNG_OPT_10}" + "${ICO_MNG_OPT_11}${MNG_OPT_11}" + "${ICO_MNG_OPT_12}${MNG_OPT_12}" +) + +showOptions() { + while true; do + clear; tput civis + for i in "${!options[@]}"; do + if [[ $i -eq $selected ]]; then + echo -e "$(colorize red bold $ICO_SELECT) $(colorize green bold ${options[$i]})" + else + echo -e " ${options[$i]}" + fi + done + + read -rsn1 input + case $input in + A) ((selected--));; + B) ((selected++));; + "") break;; + esac + + if [[ $selected -lt 0 ]]; then + selected=$(( ${#options[@]} - 1 )) + elif [ $selected -ge ${#options[@]} ]; then + selected=0 + fi + done + + clear; tput cnorm + + case $selected in + 0) fzfPreview Slq;; + 1) fzfPreview Qq;; + 2) fzfPreview Qqe;; + 3) fzfPreview Qqet;; + 4) fzfPreview Qqtd;; + 5) uninstallOrphans;; + 6) downgradePackage;; + 7) printExec -Scc; $wrapper_sudo -Scc; returnMenu;; + 8) printExec -Sc; $wrapper_sudo -Sc; returnMenu;; + 9) rebuildPython;; + 10) $scriptDir/mirrorlist true $selected;; + 11) exit;; + esac +} + +fzfPreview() { + dependencies "fzf" true + + case $1 in + Slq) fzfExec -$1 -Si -Syu;; + *) fzfExec -$1 -Qil -Rsn;; + esac +} + +fzfExec() { + packages=$($wrapper $1 | fzf $fzf_settings --preview "$wrapper $2 {}") + if [[ -z "$packages" ]]; then + showOptions $selected + else + packages=$(echo "$packages" | oneLine) + printExec $3 "$packages" + $wrapper_sudo $3 $packages + returnMenu + fi +} + +uninstallOrphans() { + if [[ -n $($wrapper -Qdt) ]]; then + printExec -Rsn "$($wrapper -Qqtd | oneLine)" + printImportant "$MNG_WARN"; echo + $wrapper_sudo -Rsn $($wrapper -Qqtd) + else + printDone "$MNG_DONE" + fi + + returnMenu +} + +downgradePackage() { + dependencies "fzf" true + pacman_cache_dir="$(pacman-conf CacheDir)" + wrapper_cache_dir="$HOME/.cache/$wrapper" + + files=$(find "$pacman_cache_dir" "$wrapper_cache_dir" -type f -name "*.pkg.tar.zst" -printf "%f\n" 2>/dev/null | \ + fzf --exact --multi --layout=reverse) + + if [[ -z "$files" ]]; then + showOptions "$selected" + return + fi + + file_paths=() + + for file in $files; do + if [ -f "${pacman_cache_dir}${file}" ]; then + file_paths+=("${pacman_cache_dir}${file}") + else + path=$(find "$wrapper_cache_dir" -type f -name "$file" 2>/dev/null) + [[ -n "$path" ]] && file_paths+=("$path") + fi + done + + if [ ${#file_paths[@]} -gt 0 ]; then + cache="${file_paths[*]}" + printExec -U "$cache" + $wrapper_sudo -U $cache + fi + + returnMenu +} + +rebuildPython() { + [[ $wrapper = "pacman" ]] && { printDone "$MNG_DONE"; returnMenu; } + rebuild_dir=$(find /usr/lib -maxdepth 1 -type d -name "python*.*" | oneLine) + + if [ $(echo "$rebuild_dir" | wc -w) -gt 1 ]; then + rebuild_dir="${rebuild_dir#* }" + rebuild_packages=$( { pacman -Qqo "$rebuild_dir" | pacman -Qqm - | oneLine; } 2>/dev/null) + if [[ -z "$rebuild_packages" ]]; then + printDone "$MNG_DONE" + else + printExec "-S --rebuild" "$rebuild_packages" + while true; do + printQuestion "$MNG_RESUME"; read -r answer + case "$answer" in + [Yy]*) echo; break;; + [Nn]*|"") echo; showOptions;; + *) ;; + esac + done + pacman -Qqo "$rebuild_dir" | pacman -Qqm - | $wrapper -S --rebuild - + fi + else + printDone "$MNG_DONE" + fi + + returnMenu +} + +showOptions diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/messages b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/messages new file mode 100644 index 0000000..9676b86 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/messages @@ -0,0 +1,53 @@ +i18n("Upgrade in progress") +i18n("Full system upgrade") +i18n("Flatpak Upgrade") +i18n("Plasma Widgets Upgrade") +i18n("Upgrade") +i18n("Total execution time:") +i18n("Critical package(s) updated, reboot may be required:") +i18n("Do you want to reboot now?") +i18n("Press Enter to close") +i18n("Skipped...") +i18n("Fetching the latest filtered mirror list") +i18n("Ranking mirrors by their connection and opening speed") +i18n("Check your mirrorlist generator settings...") +i18n("was updated with the following servers:") +i18n("To write to the mirrorlist file, sudo privileges are required") +i18n("Your current mirrorlist:") +i18n("For some widgets you may need to Log Out or restart plasmashell after upgrade") +i18n("Checking widgets for updates") +i18n("Fetching data from the API") +i18n("Getting the download link") +i18n("Downloading package") +i18n("Proceed with upgrade?") +i18n("Restart plasmashell now?") +i18n("No description") +i18n("Too many API requests in the last 15 minutes from your IP address, please try again later") +i18n("Failed to retrieve data from the API") +i18n("Unkwnown error") +i18n("File metadata.json not found") +i18n("Errors in metadata.json file") +i18n("Unsupported file format") +i18n("No files for download") +i18n("No file tagged with version") +i18n("Multiple files are tagged with version") +i18n("Failed to download the package") +i18n("List all available packages in repositories") +i18n("List all installed packages") +i18n("List explicitly installed packages") +i18n("List explicitly installed packages and isn't a dependency of anything") +i18n("List installed dependencies that aren't needed anymore (orphans)") +i18n("Uninstall orphan packages") +i18n("Install (downgrade) a package from cache") +i18n("Remove ALL cached packages") +i18n("Remove cached packages that are not currently installed") +i18n("Rebuild AUR python packages after python upgrade") +i18n("Refresh mirrorlist") +i18n("Exit") +i18n("Review dependency warnings before removing") +i18n("Resume?") +i18n("Press Enter to return menu") +i18n("Search:") +i18n("Executed:") +i18n("Nothing to do") +i18n("Required installed") diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/mirrorlist b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/mirrorlist new file mode 100644 index 0000000..f23e60b --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/mirrorlist @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/utils" + +[[ "$1" == "true" ]] && MENU=1 || MENU=0 +selected=$2 + +returnMenu() { + printReturn + $scriptDir/management $selected + exit +} + +mirrorfile="/etc/pacman.d/mirrorlist" +OUTDATED=false +[[ ! -f "$mirrorfile" ]] && { + NORM_TIME="(no file)" + OUTDATED=true +} || { + FILE_TIME=$(date -r "$mirrorfile" +%s) + NORM_TIME=$(date -d @"$FILE_TIME" +"%d %b %H:%M:%S") + CURR_TIME=$(date +%s) + [[ "$mirrors" == "age" && $MENU -eq 0 ]] && { + (( CURR_TIME - FILE_TIME >= mirrorsAge * 86400 )) && OUTDATED=true || exit + } +} + +[[ "$mirrors" != "force" || $MENU -eq 1 ]] && { + printImportant "$MIRROR_TIME" "$NORM_TIME" + while true; do + printQuestion "$MNG_OPT_11?"; read -r answer + case "$answer" in + [Yy]*) echo; break;; + [Nn]*|"") (( MENU )) && { returnMenu; } || { echo; exit; };; + *) ;; + esac + done +} + +dependencies "rankmirrors" true +rankmirrors -V &>/dev/null || { + countries=$(echo "$dynamicUrl" | grep -oP '(?<=country=)[^&]+') + countries=$(echo "$countries" | tr '\n' ' ') + countries=$(echo "$countries" | sed 's/ *$//') + + if [ -z "$countries" ]; then + printError "$MIRRORS_ERR" + else + echo "Selected countries: $countries" + ${sudoBin} rankmirrors -c ${countries} + echo + fi + + (( MENU )) && returnMenu || exit +} + +tempfile=$(mktemp) +tput sc; curl -m 60 -s -o $tempfile "$dynamicUrl" 2>/dev/null & +spinner $! "$MIRRORS_FETCH"; tput rc; tput ed +if [[ -s "$tempfile" && $(head -n 1 "$tempfile" | grep -c "^##") -gt 0 ]]; then + printDone "$MIRRORS_FETCH" +else + printError "$MIRRORS_FETCH" + printError "$MIRRORS_ERR" + (( MENU )) && returnMenu || exit +fi + +sed -i -e "s/^#Server/Server/" -e "/^#/d" "$tempfile" +tempfile2=$(mktemp) +tput sc; rankmirrors -n "$mirrorCount" "$tempfile" > "$tempfile2" & +spinner $! "$MIRRORS_RANK"; tput rc; tput ed +if [[ -s "$tempfile2" && $(head -n 1 "$tempfile2" | grep -c "^# S") -gt 0 ]]; then + printDone "$MIRRORS_RANK" +else + printError "$MIRRORS_RANK" + (( MENU )) && returnMenu || exit +fi + +sed -i '1d' "$tempfile2" +sed -i "1s/^/##\n## Arch Linux repository mirrorlist\n## Generated on $(date '+%Y-%m-%d %H:%M:%S')\n##\n\n/" "$tempfile2" + +${sudoBin} -n true 2>/dev/null || { printImportant "$MIRRORS_SUDO"; } +cat $tempfile2 | ${sudoBin} tee $mirrorfile > /dev/null + +if [ $? -eq 0 ]; then + printDone "$mirrorfile $MIRRORS_UPD" + echo -e "$y$(tail -n +6 $mirrorfile | sed 's/Server = //g')$c\n" + rm $tempfile; rm $tempfile2 + (( MENU )) && returnMenu +else + printError "$MIRRORS_SUDO" + (( MENU )) && returnMenu || exit +fi diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/terminal b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/terminal new file mode 100644 index 0000000..3b80b3b --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/terminal @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/utils" + +declare -A termArg=( ["gnome-terminal"]="--" ["ptyxis"]="--" ["terminator"]="-x" ) +name="${1^}" +sess="Apdatifier" +term="$(basename $terminal)" +termArg="${termArg[$term]:-"-e"}" +scr="$(dirname "$0")/$1" +arg="${@:2}" + +# Ghostty requires additional quotes +[[ $term = ghostty ]] && Q="'" + +_attach="${Q}tmux attach-session -t $sess \; select-window -t $name${Q}" +_script="${Q}$scr $arg${Q}" + +[[ $tmuxSession = "true" && -x $(command -v tmux) ]] && _TMUX=1 + +run_terminal() { + $term $termArg bash -c "$1" +} +run_yakuake() { + qdbusCMD sessions runCommandInTerminal $session "bash -c '$1'" +} +create_tmux_session() { + ! tmux has-session -t "$sess" 2>/dev/null && { + tmux new-session -d -s "$sess" -n "$name" "bash -c '$scr $arg'" + } || { + ! tmux list-windows -t "$sess" | grep -wq "$name" && { + tmux new-window -t "$sess:" -n "$name" "bash -c '$scr $arg'" + } + } +} + + +if [[ $term = "yakuake" ]]; then + session=$(qdbusCMD sessions addSession) + visible=$(qdbusCMD MainWindow_1 org.qtproject.Qt.QWidget.visible) + qdbusCMD tabs org.kde.yakuake.setTabTitle $session $name + if (( _TMUX )); then + create_tmux_session + run_yakuake "$_attach" + else + run_yakuake "tput sc; clear; $_script" + fi + [[ $visible = "false" ]] && qdbusCMD window org.kde.yakuake.toggleWindowState +elif (( _TMUX )); then + create_tmux_session + run_terminal "$_attach" +else + run_terminal "$_script" +fi diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/upgrade b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/upgrade new file mode 100644 index 0000000..cb81889 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/upgrade @@ -0,0 +1,185 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/utils" + +trap 'echo -e "\n\n$(colorize red bold $ICO_WARN "CTRL+C. $UPGRADE_SKIPPED")"' SIGINT + +run() { + [[ -z $2 ]] && printExec "$1" + + if [ "$idleInhibit" = true ]; then + # (( !OSD )) && { + # OSD=1 + # qdbus6 org.kde.plasmashell /org/kde/osdService org.kde.osdService.showText \ + # system-suspend-inhibited "Idle inhibition is active during upgrade" + # } + read -ra cmd <<< "$1" + systemd-inhibit --what=idle:sleep:shutdown --who="Apdatifier" --why="$UPGRADE_PROGRESS" "${cmd[@]}" + else + eval ${1} + fi +} + +bin="$sudoBin pacman"; [ "$aur" = true ] && bin=$wrapper + +fullSystemUpgrade() { + startTime=$(date +%s) + critical_updated=() + critical_installed=() + critical_packages=( + "amd-ucode" + "intel-ucode" + "cryptsetup" + "linux" + "linux-hardened" + "linux-lts" + "linux-zen" + "linux-rt" + "linux-rt-lts" + "linux-firmware*" + "linux-cachyos*" + "linux-cacule*" + "nvidia" + "nvidia-dkms" + "nvidia-*xx-dkms" + "nvidia-*xx" + "nvidia-*lts-dkms" + "nvidia*-lts" + "mkinitcpio*" + "booster*" + "mesa" + "systemd*" + "wayland" + "virtualbox-guest-utils" + "virtualbox-host-dkms" + "virtualbox-host-modules-arch" + "egl-wayland" + "xf86-video-*" + "xorg-server*" + "xorg-fonts*" + "winesync-dkms" + ) + + if [ "$arch" = true ]; then + printMsg "$UPGRADE_FULL_ARCH" + echo + + [ "$mirrors" != "false" ] && $scriptDir/mirrorlist + + if [ -n "$preExec" ]; then + run "$preExec" + printf '\n\033[32m'; printf '%.0s:' {1..48}; printf '\033[0m\n\n' + fi + + if [ "$rebootSystem" = true ]; then + for package in "${critical_packages[@]}"; do + matches=$(pacman -Qq | grep -E "^${package//\*/.*}$") + [ -n "$matches" ] && critical_installed+=($matches) + done + + declare -A beforeVersions + for pkg in "${critical_installed[@]}"; do + beforeVersions[$pkg]=$(pacman -Q $pkg | awk '{print $2}') + done + fi + + test -f "$configDir/env.sh" && source "$configDir/env.sh" + run "$bin -Syu $archFlags" + + for pkg in "${critical_installed[@]}"; do + afterVersion=$(pacman -Q $pkg | awk '{print $2}') + if [ "${beforeVersions[$pkg]}" != "$afterVersion" ]; then + critical_updated+=("$pkg") + fi + done + fi + + if [ "$flatpak" = true ]; then + printMsg "$UPGRADE_FULL_FLATPAK" + echo + + run "flatpak update $flatpakFlags" + + if [ "$flatpakRemoveUnused" = true ]; then + echo + run "flatpak uninstall --unused $flatpakFlags" + fi + fi + + if [ "$widgets" = true ]; then + printMsg "$UPGRADE_FULL_WIDGETS" + echo + run "$scriptDir/widgets upgradeAll" noPrint + fi + + if [ -n "$postExec" ]; then + printf '\n\033[32m'; printf '%.0s:' {1..48}; printf '\033[0m\n\n' + run "$postExec" + fi + + trap ' ' SIGINT + + endTime=$(date +%s) + runTime=$((endTime-startTime)) + echo + printImportant "$UPGRADE_EXECTIME" "$(printf "%02dh:%02dm:%02ds" $((runTime / 3600)) $(( (runTime % 3600) / 60 )) $((runTime % 60)))" + + # if [ "$idleInhibit" = true ]; then + # qdbus6 org.kde.plasmashell /org/kde/osdService org.kde.osdService.showText \ + # system-suspend-uninhibited "Idle inhibition has been disabled" + # fi + + if [ ${#critical_updated[@]} -gt 0 ]; then + echo + printImportant "$UPGRADE_CRITICAL" "${critical_updated[*]}" + while true; do + printQuestion "$UPGRADE_REBOOT"; read -r answer + case "$answer" in + [Yy]*) qdbus6 org.kde.Shutdown /Shutdown logoutAndReboot;; + [Nn]*|"") break;; + *) ;; + esac + done + fi + + printClose +} + +flatpak_package() { + printMsg "$UPGRADE_PACKAGE: $2" + echo + + printExec "flatpak update" "$1 $flatpakFlags" + + flatpak update $1 $flatpakFlags + + printClose +} + +widget_package() { + printMsg "$UPGRADE_PACKAGE: $2" + echo + + $scriptDir/widgets upgrade $1 $2 + + printClose +} + +postUpgrade() { + local list="" + [ "$arch" = true ] && list+=$(pacman -Q | awk '{print "{\"NM\": \"" $1 "\", \"VO\": \"" $2 "\"},"}') + [ "$flatpak" = true ] && list+=$(flatpak list --app --columns=name,version,active | awk -F'\t' '{print "{\"NM\": \"" $1 "\", \"VO\": \"" $2 $3 "\"},"}') + [ "$widgets" = true ] && list+=$($scriptDir/widgets list) + echo "[${list%,}]" +} + +case "$1" in + "full") fullSystemUpgrade ;; + "flatpak") shift; flatpak_package $1 $2;; + "widget") shift; widget_package $1 $2;; + "postUpgrade") postUpgrade ;; + *) exit;; +esac diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/utils b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/utils new file mode 100644 index 0000000..486fc4e --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/utils @@ -0,0 +1,382 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/vars" + +cleanup() { + [ -d $tempDir ] && rm -rf $tempDir +} + +makeTempDir() { + cleanup + mkdir $tempDir +} + +colorize() { + local red="\033[31m" + local green="\033[32m" + local blue="\033[34m" + local yellow="\033[33m" + local white="\033[37m" + local clear="\033[0m" + local bold="\033[1m" + + local color="$1"; shift + local style="" + + if [[ "$1" == "bold" ]]; then + style="${!1}" + shift + fi + + echo -ne "${!color}${style}$*${clear}" +} + +printDone() { + echo -e "$(colorize green bold "$ICO_DONE $1")" +} + +printError() { + echo -e "$(colorize red bold "$ICO_ERR $1")" +} + +printImportant() { + echo -e "$(colorize yellow bold "$ICO_WARN $1") $2" +} + +printQuestion() { + echo -en "$(colorize yellow bold "$ICO_QUESTION $1") [y/N]: " +} + +printExec() { + echo -e "$(colorize blue bold "$ICO_EXEC $MNG_EXEC") $(colorize white $wrapper_sudo $1 $2) \n" +} + +printMsg() { + local text="$1" + local padding=$(( (48 - ${#text} - 2) / 2 )) + local l=$(printf ":%.0s" {1..48}) + local s=$(printf ":%.0s" $(seq 1 $padding)) + local p=${s}$( (( ${#text} % 2 )) && echo ":" ) + + echo + echo -e "$(colorize green bold $l)" + echo -e "$(colorize green bold $s) $(colorize white bold $text) $(colorize green bold $p)" + echo -e "$(colorize green bold $l)" +} + +printReturn() { + tput civis + echo + echo -e "$(colorize blue bold $ICO_RETURN $MNG_RETURN)" + read -r + tput cnorm +} + +printClose() { + tput civis + printMsg "$UPGRADE_ENTER" + read -r + tput cnorm + [[ $(basename $terminal) = "yakuake" ]] && qdbusCMD sessions removeSession $(qdbusCMD sessions activeSessionId) +} + +printWhile() { + tput sc + pid=$1 + spinner $pid "$2" + wait $pid + exitCode=$? + tput rc + tput ed + + [[ $exitCode -eq 0 ]] && printDone "$2" || printError "$2" + + if [[ "$2" = "$WIDGETS_FETCH" ]]; then + case $exitCode in + 1) printError "$WIDGETS_ERR_API_FAIL" ;; + 2) printError "$WIDGETS_ERR_API" ;; + 3) printError "$WIDGETS_ERR_UNKNOWN" ;; + esac + elif [[ "$2" = "$WIDGETS_LINK" ]]; then + case $exitCode in + 1) printError "$WIDGETS_ERR_NOFILES. $UPGRADE_SKIPPED" ;; + 2) printError "$WIDGETS_ERR_NOTAGGED $latestVer. $UPGRADE_SKIPPED" ;; + 3) printError "$WIDGETS_ERR_TAGGED $latestVer. $UPGRADE_SKIPPED" ;; + esac + elif [[ "$2" = "$WIDGETS_DOWNLOADING" ]]; then + case $exitCode in + 1) printError "$WIDGETS_ERR_PACKAGE_FAIL" ;; + 2) printError "$WIDGETS_ERR_EXT" ;; + 3) printError "$WIDGETS_ERR_NO_JSON" ;; + 4) printError "$WIDGETS_ERR_JSON" ;; + esac + fi +} + +qdbusCMD() { + qdbus6 org.kde.yakuake /yakuake/$1 "${@:2}" +} + +dependencies() { + for cmd in ${1}; do + if ! command -v "$cmd" >/dev/null; then + printError "${CMD_ERR} ${cmd}" + [ $2 ] && returnMenu || exit + fi + done +} + +oneLine() { + tr '\n' ' ' | sed 's/ $//' +} + +spinner() { + local spin="⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" + while kill -0 $1 2>/dev/null; do + i=$(( (i+1) %10 )) + printf "\r$(colorize red ${spin:$i:1}) $(colorize blue bold "$2...")" + sleep .2 + done +} + +clearVer() { + local ver="${1}" + ver="${ver//[^0-9.]/.}" + while [[ "$ver" == *".."* ]]; do + ver="${ver//../.}" + done + ver="${ver#.}" + ver="${ver%.}" + echo "${ver}" +} + +compareVer() { + [[ $1 == $2 ]] && return 0 + local IFS=.; local i ver1=($1) ver2=($2) + for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do ver1[i]=0; done + for ((i=0; i<${#ver1[@]}; i++)); do + [[ -z ${ver2[i]} ]] && ver2[i]=0 + ((10#${ver1[i]} > 10#${ver2[i]})) && return 1 + ((10#${ver1[i]} < 10#${ver2[i]})) && return 2 + done + return 0 +} + +getId() { + [[ $1 =~ ^[0-9]+$ ]] && f=2 || f=1 + grep $1 "$(dirname "$0")/widgets-id" | cut -d' ' -f$f +} + +restartPlasmashell() { + if [[ "$restartShell" = true ]]; then + sleep 1 + while true; do + printQuestion "$WIDGETS_RESTART"; read -r answer + case "$answer" in + [Yy]*) break;; + [Nn]*|"") exit;; + *) ;; + esac + done + eval ${restartCommand} + else + printImportant "$WIDGETS_WARN" + fi +} + +combineFiles() { + sleep 1 + [ -f "$1" ] && rm "$1" + for cache in $(find $configDir -name "updates.json_*" | sort); do + cat "$cache" >> "$1"; rm "$cache" + done +} + +updateJson() { + cat <<< "$2" > "$1.tmp" && mv "$1.tmp" "$1" +} + +rss() { + command -v jq >/dev/null || { echo "${CMD_ERR} jq" >&2; return 127; } + + makeTempDir + trap cleanup EXIT + + local newsFile="$configDir/news.json" + + if [[ ! -s "$newsFile" ]] \ + || ! jq -e '.' "$newsFile" >/dev/null 2>&1 \ + || ! jq -e '[.[] | .date | strptime("%d.%m.%Y | %H:%M")] | length == length' "$newsFile" >/dev/null 2>&1; then + echo '[]' > "$newsFile" + fi + + for url in "$@"; do + local rssFile=$(mktemp "$tempDir/XXXXXX.xml") + curl -s -o "$rssFile" --connect-timeout 5 --retry 2 --max-time 60 --url "$url" 2>/dev/null + xmllint --noout "$rssFile" 2>/dev/null || { echo $url; exit 1; } + + local title=$(xmllint --xpath "string(/rss/channel/title)" $rssFile) + local article=$(xmllint --xpath "string(/rss/channel/item[1]/title)" $rssFile) + local date=$(date -d "$(xmllint --xpath 'string(/rss/channel/item[1]/pubDate)' $rssFile)" +"%d.%m.%Y | %H:%M") + local link=$(xmllint --xpath "string(/rss/channel/item[1]/link)" $rssFile) + + [[ -z "$title" || -z "$article" || -z "$date" || -z "$link" ]] && { echo $url; exit 1; } + + while (( $(jq "[.[] | select(.title == \"$title\")] | length" "$newsFile") > newsKeep )); do + index=$(jq --arg title "$title" 'to_entries | reverse | map(select(.value.title == $title)) | .[0].key' $newsFile) + updateJson $newsFile "$(jq --argjson index "$index" "del(.[$index])" $newsFile)" + done + + if ! jq -e ".[] | select(.link == \"$link\")" $newsFile > /dev/null; then + local item=$(jq -n --arg t "$title" --arg a "$article" --arg d "$date" --arg l "$link" '{title: $t, article: $a, date: $d, link: $l, removed: false}') + updateJson $newsFile "$(jq "[$item] + ." $newsFile)" + fi + done + + updateJson $newsFile "$(jq 'sort_by(.date | strptime("%d.%m.%Y | %H:%M") | mktime) | reverse' $newsFile)" + + jq . $newsFile +} + +install_devel() { + printMsg "Downloading devel" + echo + + required="git jq" + for cmd in ${required}; do command -v "$cmd" >/dev/null || { printError "Required installed ${cmd}"; printClose; exit; }; done; + + commit=$(curl -s https://api.github.com/repos/exequtic/apdatifier/commits/main | jq -r '.sha' | cut -c1-7) + + if [[ "github commit: $commit" = "$(jq -r '.KPlugin.Description' $appletDir/metadata.json)" ]]; then + printDone "Up to date" + printClose + exit + fi + + savedir=$(pwd) + clonedir=$(mktemp -d) + cd $clonedir + + { git clone -n --depth=10 --filter=tree:0 -b main https://github.com/exequtic/apdatifier 2>/dev/null + } & printWhile $! "Clone main branch" + [[ $exitCode -ne 0 ]] && { printClose; exit; } + + cd apdatifier + + { git sparse-checkout set --no-cone package 2>/dev/null && git checkout 2>/dev/null + } & printWhile $! "Checkout package directory" + [[ $exitCode -ne 0 ]] && { printClose; exit; } + + if command -v less &>/dev/null; then + echo + printImportant "Last 10 commits:" + git log --oneline + sleep 2 + fi + + echo + printMsg "Upgrading Apdatifier" + echo + cd package || exit 1 + updateJson metadata.json "$(jq --arg new_value "github commit: $commit" '.KPlugin.Description = $new_value' metadata.json)" + [[ $trayEnabledByDefault == "true" ]] && updateJson $metadata "$(jq '.KPlugin.EnabledByDefault = true' $metadata)" + while true; do + printQuestion "Do you want build translations?"; read -r answer + case "$answer" in + [Yy]*) cd translate; bash build; cd ..; break;; + [Nn]*|"") break;; + *) ;; + esac + done + echo + tar --exclude=./apdatifier.tar -cf apdatifier.tar . + kpackagetool6 -t Plasma/Applet -u apdatifier.tar 2>/dev/null + echo + + cd $savedir + [ ! -d $clonedir ] || rm -rf $clonedir + + restartShell=true + restartPlasmashell + + printClose + exit +} + +install_stable() { + if [[ "$(jq -r '.KPlugin.Description' $appletDir/metadata.json)" = "Arch Update Notifier" ]]; then + while true; do + printImportant "It looks like you already have the stable version." + printQuestion "Do you still want to proceed?"; read -r answer + case "$answer" in + [Yy]*) break;; + [Nn]*|"") printClose; exit;; + *) ;; + esac + done + fi + + $scriptDir/upgrade widget "2135796" "apdatifier" +} + +uninstall() { + printMsg "Uninstall Apdatifier" + echo + + while true; do + printQuestion "Continue?"; read -r answer + case "$answer" in + [Yy]*) break;; + [Nn]*|"") printClose; exit;; + *) ;; + esac + done + + echo + + showCommand() { + echo -e "$(colorize yellow bold "$ICO_EXEC Command:") $1" + } + + printImportant "Remove icons" + for icon in $icon1 $icon2 $icon3 $icon4; do + showCommand "rm $iconsDir/$icon" + test -f "$iconsDir/$icon" && rm "$iconsDir/$icon" + done + showCommand "rmdir -p --ignore-fail-on-non-empty $iconsDir" + test -d "$iconsDir" && rmdir -p --ignore-fail-on-non-empty "$iconsDir" + sleep 1; echo + + printImportant "Remove notification" + showCommand "rm $notifDir/$notif" + test -f "$notifDir/$notif" && rm "$notifDir/$notif" + showCommand "rmdir -p --ignore-fail-on-non-empty $notifDir" + test -d "$notifDir" && rmdir -p --ignore-fail-on-non-empty "$notifDir" + sleep 1; echo + + printImportant "Remove configuration" + showCommand "rm -rf $configDir" + test -d "$configDir" && rm -rf "$configDir" + sleep 1; echo + + printImportant "Uninstall plasmoid" + showCommand "kpackagetool6 -t Plasma/Applet -r $applet" + kpackagetool6 -t Plasma/Applet -r $applet 2>/dev/null + sleep 1; echo + + echo "Bye :("; sleep 1 + + printClose + exit +} + +case "$1" in + "rss") shift; rss "$@" ;; + "combineFiles") shift; combineFiles $1 ;; + "installDev") install_devel ;; + "installStable") install_stable ;; + "uninstall") uninstall ;; +esac diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/vars b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/vars new file mode 100644 index 0000000..1b12fd5 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/vars @@ -0,0 +1,125 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +scriptDir=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` + +applet="com.github.exequtic.apdatifier" +configDir="$HOME/.config/apdatifier" +localDir="$HOME/.local/share" +iconsDir="$localDir/icons/breeze/status/24" +notifDir="$localDir/knotifications6" +appletDir="$localDir/plasma/plasmoids/$applet" +tempDir="/tmp/apdatifier" + +config="$configDir/config.conf" +icon1="apdatifier-plasmoid.svg" +icon2="apdatifier-packages.svg" +icon3="apdatifier-package.svg" +icon4="apdatifier-flatpak.svg" +notif="apdatifier.notifyrc" + +export TEXTDOMAINDIR="$scriptDir/../../locale" +export TEXTDOMAIN="plasma_applet_${applet}" + +source $config + +declare -a var_names=( + UPGRADE_PROGRESS + UPGRADE_FULL_ARCH + UPGRADE_FULL_FLATPAK + UPGRADE_FULL_WIDGETS + UPGRADE_PACKAGE + UPGRADE_EXECTIME + UPGRADE_CRITICAL + UPGRADE_REBOOT + UPGRADE_ENTER + UPGRADE_SKIPPED + MIRRORS_FETCH + MIRRORS_RANK + MIRRORS_ERR + MIRRORS_UPD + MIRRORS_SUDO + MIRROR_TIME + WIDGETS_WARN + WIDGETS_CHECK + WIDGETS_FETCH + WIDGETS_LINK + WIDGETS_DOWNLOADING + WIDGETS_PROCEED + WIDGETS_RESTART + WIDGETS_NODESC + WIDGETS_ERR_API + WIDGETS_ERR_API_FAIL + WIDGETS_ERR_UNKNOWN + WIDGETS_ERR_NO_JSON + WIDGETS_ERR_JSON + WIDGETS_ERR_EXT + WIDGETS_ERR_NOFILES + WIDGETS_ERR_NOTAGGED + WIDGETS_ERR_TAGGED + WIDGETS_ERR_PACKAGE_FAIL + MNG_OPT_01 + MNG_OPT_02 + MNG_OPT_03 + MNG_OPT_04 + MNG_OPT_05 + MNG_OPT_06 + MNG_OPT_07 + MNG_OPT_08 + MNG_OPT_09 + MNG_OPT_10 + MNG_OPT_11 + MNG_OPT_12 + MNG_WARN + MNG_RESUME + MNG_RETURN + MNG_SEARCH + MNG_EXEC + MNG_DONE + CMD_ERR +) + +i=0 +while IFS= read -r line && [ $i -lt ${#var_names[@]} ]; do + i=$((i+1)) + text=$(echo "$line" | grep -oP '(?<=\().*(?=\))' | sed 's/"//g') + eval "${var_names[$((i-1))]}=\"$(gettext "$text")\"" +done < "$scriptDir/messages" + +if [[ $termFont = "true" ]]; then + ICO_MNG_OPT_01="󱝩 " + ICO_MNG_OPT_02="󱝫 " + ICO_MNG_OPT_03="󱝭 " + ICO_MNG_OPT_04="󱝭 " + ICO_MNG_OPT_05="󱝧 " + ICO_MNG_OPT_06=" " + ICO_MNG_OPT_07="󱝥 " + ICO_MNG_OPT_08="󱝝 " + ICO_MNG_OPT_09="󱝝 " + ICO_MNG_OPT_10="󰌠 " + ICO_MNG_OPT_11="󱘴 " + ICO_MNG_OPT_12=" " + + ICO_ERR="" + ICO_DONE="" + ICO_WARN="󱇎" + ICO_QUESTION="" + ICO_EXEC="󰅱" + ICO_RETURN="󰄽" + ICO_SELECT="󰄾" +else + ICO_ERR="✘" + ICO_DONE="✔" + ICO_WARN="::" + ICO_QUESTION="::" + ICO_EXEC="::" + ICO_RETURN="<<" + ICO_SELECT=">" +fi + +fzf_settings="--preview-window "right:70%" --height=100% \ + --layout=reverse --info=right --border=none \ + --multi --track --exact --margin=0 --padding=0 \ + --cycle --prompt=$MNG_SEARCH⠀ --marker=•" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets new file mode 100644 index 0000000..e779a99 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets @@ -0,0 +1,346 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2024 Evgeny Kazantsev +# SPDX-License-Identifier: MIT + +source "$(dirname "$0")/utils" + +fetch_api_data() { + echo '' > "$XML" + + local page=0 + local pagesize=100 + + while true; do + pageXML=$(mktemp "$tempDir/XXXXXX.xml") + api_url="https://api.kde-look.org/ocs/v1/content/data?categories=705x715x719x720&sort=new&page=$page&pagesize=$pagesize" + + curl -s -o "$pageXML" --connect-timeout 5 --retry 2 --max-time 60 --request GET --url "$api_url" + + ! xmllint --noout "$pageXML" 2>/dev/null && return 1 + + totalitems=$(xmllint --xpath "string(//ocs/meta/totalitems)" $pageXML) + statuscode=$(xmllint --xpath "string(//ocs/meta/statuscode)" $pageXML) + + case $statuscode in + 100) + xmllint --xpath "//content[@details='summary']" $pageXML >> $XML + + items=$(((page + 1) * pagesize)) + if [[ $totalitems > $items ]]; then + ((page++)) + else + echo '' >> "$XML" + break + fi + ;; + + 200) return 2 ;; + *) return 3 ;; + esac + done + + return 0 +} + +get_packages() { + packages=($(find \ + "$localDir/kwin/effects" \ + "$localDir/kwin/scripts" \ + "$localDir/plasma/plasmoids" \ + "$localDir/plasma/wallpapers" \ + -mindepth 1 -maxdepth 1 -type d 2>/dev/null)) + [ ${#packages[@]} -eq 0 ] && exit +} + +get_package_type() { + case $(xmllint --xpath "string(//id[text()='$contentId']/../typeid)" $XML) in + "715") echo "Plasma/Wallpaper";; + "719") echo "KWin/Effect";; + "720") echo "KWin/Script";; + *) echo "Plasma/Applet";; + esac +} + +get_package_info() { + local id=$(basename "$package") + + local metadata="$package/metadata.json" + [[ -s "$metadata" ]] || return 1 + jq . $metadata >/dev/null 2>&1 || return 2 + + local originName=$(jq -r '.KPlugin.Name' $metadata) + name=$(echo "$originName" | sed 's/ /-/g; s/.*/\L&/') + + local quotedOriginName='"'$(echo "$originName" | sed 's/"/\\"/g')'"' + contentId=$(xmllint --xpath "string(//name[text()=$quotedOriginName]/../id)" "$XML") + if [[ -z "$contentId" ]]; then + knsregistry=("plasmoids" "kwinscripts" "kwineffect" "wallpaperplugin") + for kns in "${knsregistry[@]}"; do + kns="$HOME/.local/share/knewstuff3/$kns.knsregistry" + [[ -s "$kns" ]] && contentId=$(xmllint --xpath "string(//installedfile[contains(text(), '/$id')]/../id)" $kns) + [[ -n "$contentId" ]] && break + done + fi + [[ -z "$contentId" ]] && contentId="$(getId "$id" | head -n 1)" + [[ -z "$contentId" ]] && return 3 + + currentVer=$(clearVer "$(jq -r '.KPlugin.Version' "$metadata")") + latestVer=$(clearVer "$(xmllint --xpath "string(//id[text()='$contentId']/../version)" $XML)") + [ -z "$currentVer" ] || [ -z "$latestVer" ] && return 4 + compareVer "$currentVer" "$latestVer" + [[ $? != 2 ]] && return 5 + + description=$(jq -r '.KPlugin.Description' $metadata | sed 's/"/\\"/g' | tr -d '\n') + [ -z "$description" ] || [ "$description" = "null" ] && description="$WIDGETS_NODESC" + + author=$(jq -r '.KPlugin.Authors[].Name' $metadata | paste -sd "," - | sed 's/,/, /g') + [ -z "$author" ] || [ "$author" = "null" ] && author="?" + + icon=$(jq -r '.KPlugin.Icon' $metadata) + local fallbackIcon="start-here-kde-plasma-symbolic" + if [ -z "$icon" ]; then + icon=$fallbackIcon + else + local iconTheme=$(kreadconfig6 --file kdeglobals --group Icons --key Theme) + local themeDir1="/usr/share/icons/$iconTheme/" + local themeDir2="$HOME/.local/share/icons/$iconTheme/" + local themeDir3="$HOME/.icons/$iconTheme/" + ! find -L "$themeDir1" "$themeDir2" "$themeDir3" \ + -type f -name "$icon.svg" -print -quit 2>/dev/null | grep -q . \ + && icon=$fallbackIcon + fi + + url="https://store.kde.org/p/$contentId" + repo="kde-store" + type=$(get_package_type) + + if ! jq -e ".KPackageStructure == \"$type\"" "$metadata" >/dev/null 2>&1; then + updateJson $metadata "$(jq ". + { \"KPackageStructure\": \"$type\" }" $metadata)" + fi + + return 0 +} + +get_download_link() { + local signed=() + local files=0 + + while read -r download_version; do + ((files++)) + if [[ "$latestVer" == "$(clearVer "$(xmllint --xpath "string(//id[text()='$contentId']/../$download_version)" $XML)")" ]]; then + signed+=("${download_version#download_version}") + fi + done < <(xmllint --xpath "//content[id='$contentId']/*" $XML | grep -o 'download_version[0-9]\+' | uniq) + + if [[ $files -eq 1 || ${#signed[@]} -eq 1 ]]; then + echo $(xmllint --xpath "string(//id[text()='$contentId']/../downloadlink${signed[0]:-1})" $XML) > $tempDir/link + return 0 + else + [[ $files -eq 0 ]] && return 1 + [[ ${#signed[@]} -eq 0 ]] && return 2 + (( ${#signed[@]} > 1 )) && return 3 + fi +} + +make_updates_list() { + local out="" + for package in "${packages[@]}"; do + get_package_info + [[ $? -ne 0 ]] && continue + out+="{\"NM\": \"${name}\"," + out+="\"RE\": \"${repo}\"," + out+="\"TP\": \"${type}\"," + out+="\"CN\": \"${contentId}\"," + out+="\"IN\": \"${icon}\"," + out+="\"DE\": \"${description}\"," + out+="\"AU\": \"${author}\"," + out+="\"VO\": \"${currentVer}\"," + out+="\"VN\": \"${latestVer}\"," + out+="\"LN\": \"${url}\"}", + done + + echo -e "[${out%,}]" > $updatesList +} + +check_packages_updates() { + command -v jq >/dev/null || { echo 127; exit; } + + makeTempDir + XML="$tempDir/api.kde-look.xml" + updatesList="$tempDir/update.list.json" + trap cleanup EXIT + + declare -a packages + get_packages + + fetch_api_data + case $? in + 1) echo 1; exit ;; + 2) echo 2; exit ;; + 3) echo 3; exit ;; + esac + + make_updates_list + jq . $updatesList +} + +download_package() { + mkdir -p $tempDir/$name/unpacked + link=$(cat $tempDir/link) + package="$tempDir/$name/$(basename "${link}")" + + curl -s -o $package --connect-timeout 5 --retry 2 --max-time 120 --request GET --location --url "$link" 2>/dev/null + + [ ! -s "$package" ] && return 1 + + bsdtar -xf "$package" -C "$tempDir/$name/unpacked" || return 2 + + metadata=$(find $tempDir/$name/unpacked -name metadata.json) + [ -z "metadata" ] && return 3 + + jq . $metadata >/dev/null 2>&1 || return 4 + + if ! jq -e ".KPackageStructure == \"$type\"" "$metadata" >/dev/null 2>&1; then + updateJson $metadata "$(jq ". + { \"KPackageStructure\": \"$type\" }" $metadata)" + fi + + updateJson $metadata "$(jq --arg new_value "$latestVer" '.KPlugin.Version = $new_value' $metadata)" + + if [[ $name == "apdatifier" && $trayEnabledByDefault == "true" ]]; then + if jq -e '.KPlugin.EnabledByDefault == false' "$metadata" > /dev/null; then + updateJson $metadata "$(jq '.KPlugin.EnabledByDefault = true' $metadata)" + fi + fi + + return 0 +} + +upgrade_all_packages() { + dependencies "jq" + + makeTempDir + XML="$tempDir/api.kde-look.xml" + updatesList="$tempDir/update.list.json" + trap cleanup EXIT + + declare -a packages + get_packages + + fetch_api_data & printWhile $! "$WIDGETS_FETCH" + [[ $exitCode -ne 0 ]] && exit + + make_updates_list & printWhile $! "$WIDGETS_CHECK" + + if [[ -s "$updatesList" ]] && jq -e '(. | length) > 0' "$updatesList" > /dev/null 2>&1; then + echo + jq -c 'sort_by(.NM)[]' "$updatesList" | while read -r info; do + echo -e "$(colorize white bold $(echo "$info" | jq -r '.NM')) \t \ + $(colorize yellow bold $(echo "$info" | jq -r '.TP')) \t \ + $(colorize red bold $(echo "$info" | jq -r '.VO')) \t \ + $(colorize white "->") \t \ + $(colorize green bold $(echo "$info" | jq -r '.VN'))" + done | column -t + echo + + if [[ $widgetConfirmation = true ]]; then + while true; do + printQuestion "$WIDGETS_PROCEED"; read -r answer + case "$answer" in + [Yy]*) echo; break;; + [Nn]*|"") return 0;; + *) ;; + esac + done + fi + + updated=false + while read -r info; do + name=$(echo "$info" | jq -r '.NM') + contentId=$(echo "$info" | jq -r '.CN') + latestVer=$(echo "$info" | jq -r '.VN') + type=$(echo "$info" | jq -r '.TP') + + echo "$(colorize blue bold "$ICO_EXEC $name ($latestVer)")" + + get_download_link & printWhile $! "$WIDGETS_LINK" + [[ $exitCode -ne 0 ]] && { echo; continue; } + + download_package & printWhile $! "$WIDGETS_DOWNLOADING" + [[ $exitCode -ne 0 ]] && { echo; continue; } + + kpackagetool6 -t $type -u $(dirname $(find $tempDir/$name -name "metadata.json")) 2>/dev/null + updated=true + sleep 1 + echo + done < <(jq -c 'sort_by(.NM)[]' "$updatesList") + + [[ $updated = true ]] && restartPlasmashell + else + printDone "$MNG_DONE" + fi +} + +upgrade_package() { + [ -n "$1" ] && contentId="$1" || exit + [ -n "$2" ] && name="$2" || exit + + dependencies "jq" + + mkdir -p $tempDir/$name/unpacked + XML="$tempDir/$name/api.kde-look.xml" + + trap cleanup EXIT + + { + curl -s -o $XML --connect-timeout 5 --retry 2 --max-time 60 --request GET --url "https://api.kde-look.org/ocs/v1/content/data/$contentId" 2>/dev/null + if xmllint --noout $XML 2>/dev/null; then + statuscode=$(xmllint --xpath "string(//ocs/meta/statuscode)" $XML) + case $statuscode in + 100) return 0 ;; + 200) return 2 ;; + *) return 3 ;; + esac + else + return 1 + fi + } & printWhile $! "$WIDGETS_FETCH" + [[ $exitCode -ne 0 ]] && exit + + latestVer=$(clearVer "$(xmllint --xpath "string(//id[text()='$contentId']/../version)" $XML)") + type=$(get_package_type) + + get_download_link & printWhile $! "$WIDGETS_LINK" + [[ $exitCode -ne 0 ]] && exit + + download_package & printWhile $! "$WIDGETS_DOWNLOADING" + [[ $exitCode -ne 0 ]] && exit + + kpackagetool6 -t $type -u $(dirname $(find $tempDir/$name -name "metadata.json")) 2>/dev/null + sleep 1 + echo + + restartPlasmashell +} + +list_current_packages() { + declare -a packages + get_packages + local out="" + for package in "${packages[@]}"; do + local json="$package/metadata.json"; [ -s "$json" ] || continue + local name="$(jq -r '.KPlugin.Name' $json)"; [ -z "$name" ] && continue + local currentVer=$(clearVer "$(jq -r '.KPlugin.Version' "$json")"); [ -z "$currentVer" ] && continue + out+="{\"NM\": \"${name}\"," + out+="\"VO\": \"${currentVer}\"},\n" + done + echo -e $out +} + +case "$1" in + "list") list_current_packages;; + "check") check_packages_updates;; + "upgrade") shift; upgrade_package $1 $2;; + "upgradeAll") upgrade_all_packages;; + *) exit;; +esac diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets-id b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets-id new file mode 100644 index 0000000..980cb2a --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/widgets-id @@ -0,0 +1,189 @@ +998890 com.bxabi.bumblebee-indicator +998913 org.kde.plasma.awesomewidget +1155946 com.dschopf.plasma.qalculate +1288430 org.kde.plasma.shutdownorswitch +1377704 org.kde.mediabar +1384066 org.kde.workraveApplet +1396415 com.github.solant.plasmataker +1627256 com.github.xyz32.timekeeper +1804745 com.github.heqro.day-night-switcher +1898708 org.nielsvm.plasma.menupager +2079446 dev.vili.sahkoporssi +2100417 org.kde.mcwsremote +2100418 org.kde.olib.thermalmonitor +2107649 org.kde.panel.transparency.toggle +2112443 com.github.tilorenz.compact_pager +2113872 com.github.korapp.cloudflare-warp +2114471 de.davidhi.ddcci-brightness +2115883 org.kde.plasma.simplekickoff +2117117 com.dv.fokus +2118132 com.github.stepan-zubkov.days-to-new-year +2118492 com.github.korapp.nordvpn +2126775 com.github.tilorenz.timeprogressbar +2128047 luisbocanegra.panelspacer.extended +2128143 plasmusic-toolbar +2128477 luisbocanegra.intel.gpu.monitor +2129423 org.kde.windowtitle +2130222 luisbocanegra.panel.modes.switcher +2130541 org.kde.archupdatechecker +2130967 luisbocanegra.panel.colorizer +2131364 com.github.korapp.homeassistant +2131462 org.kde.plasma.plasm6desktopindicator +2132405 com.github.dhruv8sh.year-progress-mod +2132554 com.himdek.kde.plasma.overview +2132555 com.himdek.kde.plasma.runcommand +2134470 a2n.archupdate.plasmoid +2135509 com.github.antroids.application-title-bar +2135511 org.kde.placesWidget +2135552 org.kde.plasma.yesplaymusic-lyrics +2135642 com.github.prayag2.minimalistclock +2135653 com.github.prayag2.modernclock +2135796 com.github.exequtic.apdatifier +2135799 com.github.k-donn.plasmoid-wunderground +2135898 com.dv.uswitcher +2136288 org.kde.Big.Clock +2136291 zayron.chaac.weather +2136295 Clock.Asitoki.Color +2136299 CircleClock +2136302 zayron.almanac +2136307 Minimal.chaac.weather +2136321 com.Petik.clock +2136329 weather.bicolor.widget +2136505 org.kde.netspeedWidget +2136546 com.nemmayan.clock +2136631 com.github.scriptinator +2136636 com.github.zren.commandoutput +2136852 org.kde.latte.separator +2136860 com.github.zren.alphablackcontrol +2136933 org.kde.plasma.advancedradio +2136963 luisbocanegra.kdematerialyou.colors +2137016 org.kde.plasma.Beclock +2137185 com.github.zren.dailyforecast +2137197 com.github.zren.condensedweather +2137217 org.kde.plasma.scpmk +2137231 com.github.eatsu.spaceraspager +2137418 zayron.simple.separator +2137431 com.github.zren.simpleweather +2137675 com.gitlab.scias.advancedreboot +2137726 org.zayronxio.vector.clock +2137844 org.kde.plasma.catwalk +2138251 org.kpple.kppleMenu +2138283 ink.chyk.minimumMediaController +2138365 optimus-gpu-switcher +2138473 org.kde.plasma.videocard +2138476 lenovo-conservation-mode-switcher +2138485 com.github.boraerciyas.controlcentre +2138746 org.kde.plasma.pminhibition +2138853 org.kde.Date.Bubble.P6 +2138907 org.kde.latte.spacer +2139337 split-clock +2139541 com.github.configurable_button +2139890 Plasma.Control.Hub +2140275 com.github.davide-sd.ip_address +2140856 d4rkwzd.colorpicker-tray +2141133 org.kde.MinimalMusic.P6 +2142681 Audio.Wave.Widget +2142716 com.github.zren.tiledmenu +2143899 org.kde.plasma.resources-monitor +2144212 AndromedaLauncher +2144426 org.previewqt.previewqt.plasmoidpreviewqt +2144969 SoloDay.P6 +2145065 com.github.liujed.rssfeeds +2145280 com.github.DenysMb.Kicker-AppsOnly +2145723 luisbocanegra.desktop.wallpaper.effects +2146553 org.kde.plasma.ginti +2147850 zayron.almanac.V2 +2147871 org.kde.plasma.clearclock +2147882 org.kde.windowtitle.Fork +2148373 lyrics-on-panel-plasma6 +2148469 thot.observer.ram +2148472 thot.observer.cpu +2150544 org.kde.plasma.composeEmail +2150610 com.gitlab.scias.plasmavantage +2150916 org.kde.paneltransparencybutton +2151247 org.kde.plasma.win7showdesktop +2151576 ppk.plasma6.hydrobot +2151585 com.samirgaire10.Brave-plasma6 +2151600 com.samirgaire10.chatgpt-plasma6 +2151622 com.samirgaire10.Deepl-plasma6 +2151683 com.samirgaire10.google_gemini-plasma6 +2151687 com.samirgaire10.Google-plasma6 +2151694 com.samirgaire10.GoogleTranslater-plasma6 +2151931 org.kde.windowbuttons +2151962 com.samirgaire10.perplexityAi-plasma6 +2152642 com.samirgaire10.blackbox.AI_plasma6 +2153869 org.kde.plasma.private.BusyTasksPlasmoid +2154331 com.softtechok.systemmonitorplasmoid +2154894 org.51n7.kMenu +2157390 org.latgardi.darwinmenu +2158349 Almanac.Asimetric +2158358 org.kde.losungen6 +2159592 com.samirgaire10.Ollama-plasma6 +2160638 com.softtechok.processmonitor +2161461 Weather.IntiSol.kde +2162586 org.kde.dwardor.fanspeedmonitor +2163165 OnlyText.Date.Kde +2163199 com.samirgaire10.DuckDuckGo-plasma6 +2163340 ChatAI-Plasmoid +2163368 Circle.Music.Widget +2164459 org.kde.redshiftControl6 +2164590 org.kde.plasma.mediacontroller.panel +2164679 com.github.chrtall.kppleMenu +2166656 Aligned.Music.Widget +2166934 adhe.runcommand +2167594 adhe.dittomenu +2167836 com.github.jonmagon.plasma-screendimmer +2168131 Date.Urban.kde +2168466 Rates.Mercurius.Widget +2169597 com.github.danielwjchen.folding-at-home-plasma-widget +2170656 com.samirgaire10.Github-plasma6 +2171750 adhe.menu.11 +2172470 org.magpie.sonomatic.separator +2173278 org.kde.plasma.powerusage +2174238 adhe.launchpadPlasma +2174265 Chaac.Complete.Weather +2175475 Redmi.Clock +2179264 org.magpie.nightglow.separator +2179317 Start.Next.Menu +2179829 com.kevinbburns.grammarly +2179833 Small.Weather.Plasma6 +2180314 Soniq.Widget +2180887 DeepinMenu.Classic +2182964 adhe.menu.11 #Ignored, not a unique ID +2183258 Compact.Menu +2183752 luisbocanegra.cursor.eyes +2184730 OnlyText.Date.Kde.v2 +2184747 ChatQT-Plasmoid +2185174 Seeua.Weather +2185549 org.kde.plasma.pipewiresettings +2185626 org.kde.plasma.dockio +2185931 asus-battery-health-switcher +2185962 Start.11.Simple +2186442 Music.Waves +2187344 MusicMini +2187962 MechanicalClock +2188275 com.junongx.kde.currentlyplaying +2188581 Lyndo.Kde +2189544 Plain.Circle.Weather +2189637 Solid.Plain.Music +2193670 qinvvv.qtodo.widget +2194992 org.kde.osymUpdates +2195583 org.ruiny.NowPlaying +2196105 KdeControlStation +2196149 ff.qtodo.widget +2196368 com.github.imoize.ollamacontrol +2199942 Bix.Plasma.Player +2200890 org.dhruv8sh.kara +2201084 Emulator.Spectrum.Audio +2202249 com.espaker.simpleradioplayer-plasma6 +2204865 org.dr42.analogclock +2206628 runcommand.fork +2211264 com.ekaaty.vinyl-launcher +2216429 org.kde.plasma.ipaddress +2216432 org.kde.plasma.shamsi-calendar +2217171 Concepto.menu.12 +2217301 hermes.observer.ram.P6 +2217313 hermes.observer.cpu.P6 +2224768 org.kde.plasma.dayprogress +2225123 org.kde.olib.pinpanel +2225378 material.clock \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/tools.js b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/tools.js new file mode 100644 index 0000000..4e8d9db --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/tools.js @@ -0,0 +1,669 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +const scriptDir = "$HOME/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/tools/sh/" +const configDir = "$HOME/.config/apdatifier/" +const configFile = configDir + "config.conf" +const cacheFile = configDir + "updates.json" +const rulesFile = configDir + "rules.json" +const newsFile = configDir + "news.json" + +function execute(command, callback, stoppable) { + const component = Qt.createComponent("../ui/components/Shell.qml") + if (component.status === Component.Ready) { + const componentObject = component.createObject(root) + if (componentObject) { + if (stoppable) check = componentObject + componentObject.exec(command, callback) + } else { + Error(1, "Failed to create executable DataSource object") + } + } else { + Error(1, "Executable DataSource component not ready") + } +} + +const readFile = (file) => `[ -f "${file}" ] && cat "${file}"` +const writeFile = (data, redir, file) => `echo '${data}' ${redir} "${file}"` + +const bash = (script, ...args) => scriptDir + script + ' ' + args.join(' ') +const runInTerminal = (script, ...args) => execute('kstart ' + bash('terminal', script, ...args)) + +const debug = true +function log(message) { + if (debug) console.log("[" + new Date().getTime().toString() + "] "+ "APDATIFIER: " + message) +} + +function Error(code, err) { + if (err) { + cfg.notifyErrors && notify.send("error", i18n("Exit code: ") + code, err.trim()) + sts.errMsg = err.trim().substring(0, 150) + "..." + setStatusBar(code) + return true + } + return false +} + +function init() { + execute(bash('init'), (cmd, out, err, code) => { + if (Error(code, err)) return + loadConfig() + }) + + function loadConfig() { + execute(readFile(configFile), (cmd, out, err, code) => { + if (Error(code, err)) return + if (out) { + const config = out.trim().split("\n") + const convert = value => { + if (!isNaN(parseFloat(value))) return parseFloat(value) + if (value === "true" || value === "false") return value === 'true' + return value + } + config.forEach(line => { + const match = line.match(/(\w+)="([^"]*)"/) + if (match) plasmoid.configuration[match[1]] = convert(match[2]) + }) + } + + loadCache() + }) + } + + function loadCache() { + execute(readFile(cacheFile), (cmd, out, err, code) => { + if (Error(code, err)) return + if (out && validJSON(out, cacheFile)) cache = keys(JSON.parse(out.trim())) + loadRules() + }) + } + + function loadRules() { + execute(readFile(rulesFile), (cmd, out, err, code) => { + if (Error(code, err)) return + if (out && validJSON(out, rulesFile)) plasmoid.configuration.rules = out + loadNews() + }) + } + + function loadNews() { + execute(readFile(newsFile), (cmd, out, err, code) => { + if (Error(code, err)) return + if (out && validJSON(out, newsFile)) JSON.parse(out.trim()).forEach(item => newsModel.append(item)) + onStartup() + }) + } + + function onStartup() { + checkDependencies() + refreshListModel() + updateActiveNews() + upgradingState(true) + } +} + +function saveConfig() { + if (saveTimer.running) return + let config = "" + Object.keys(cfg).forEach(key => { + if (key.endsWith("Default")) { + let name = key.slice(0, -7) + config += `${name}="${cfg[name]}"\n` + } + }) + execute(writeFile(config, ">", configFile)) +} + +function checkDependencies() { + const pkgs = "pacman checkupdates flatpak paru yay jq tmux alacritty foot ghostty gnome-terminal kitty konsole lxterminal ptyxis terminator tilix wezterm xterm yakuake" + const checkPkg = (pkgs) => `for pkg in ${pkgs}; do command -v $pkg || echo; done` + const populate = (data) => data.map(item => ({ "name": item.split("/").pop(), "value": item })) + + execute(checkPkg(pkgs), (cmd, out, err, code) => { + if (Error(code, err)) return + + const output = out.split("\n") + + const [pacman, checkupdates, flatpak, paru, yay, jq, tmux ] = output.map(Boolean) + cfg.packages = { pacman, checkupdates, flatpak, paru, yay, jq, tmux } + if (!cfg.wrapper) cfg.wrapper = paru ? "paru" : yay ? "yay" : "" + + const terminals = populate(output.slice(7).filter(Boolean)) + cfg.terminals = terminals.length > 0 ? terminals : null + if (!cfg.terminal) cfg.terminal = cfg.terminals.length > 0 ? cfg.terminals[0].value : "" + + if (!pacman) plasmoid.configuration.arch = false + if (!pacman || (!yay && !paru)) plasmoid.configuration.aur = false + if (!flatpak) plasmoid.configuration.flatpak = false + if (!checkupdates) plasmoid.configuration.mirrors = "false" + if (!tmux) plasmoid.configuration.tmuxSession = false + if (!jq) { + plasmoid.configuration.widgets = false + plasmoid.configuration.newsArch = false + plasmoid.configuration.newsKDE = false + plasmoid.configuration.newsTWIK = false + plasmoid.configuration.newsTWIKA = false + } + }) +} + + +function upgradePackage(name, appID, contentID) { + if (sts.upgrading) return + enableUpgrading(true) + + if (appID) { + runInTerminal("upgrade", "flatpak", appID, name) + } else if (contentID) { + runInTerminal("upgrade", "widget", contentID, name) + } +} + +function management() { + runInTerminal("management") +} + + +function enableUpgrading(state) { + sts.busy = sts.upgrading = state + if (state) { + if (upgradeTimer.running) return + upgradeTimer.start() + searchTimer.stop() + sts.statusMsg = i18n("Upgrade in progress") + "..." + sts.statusIco = cfg.ownIconsUI ? "toolbar_upgrade" : "akonadiconsole" + } else { + upgradeTimer.stop() + setStatusBar() + } +} + +function upgradingState(startup) { + execute(`ps aux | grep "[a]pdatifier/contents/tools/sh/upgrade"`, (cmd, out, err, code) => { + if (out || err) { + enableUpgrading(true) + } else if (startup) { + if (!cfg.interval) return + cfg.checkOnStartup ? searchTimer.triggered() : searchTimer.start() + } else { + enableUpgrading(false) + execute(bash('upgrade', "postUpgrade"), (cmd, out, err, code) => postUpgrade(out)) + } + }) +} + +function postUpgrade(out) { + const newList = cache.filter(cached => { + const current = JSON.parse(out).find(current => current.NM.replace(/ /g, "-").toLowerCase() === cached.NM) + return current && current.VO === cached.VO + cached.AC + }) + if (JSON.stringify(cache) !== JSON.stringify(newList)) { + cache = newList + refreshListModel() + saveCache(cache) + } +} + +function upgradeSystem() { + if (sts.upgrading && !cfg.tmuxSession) return + enableUpgrading(true) + runInTerminal("upgrade", "full") +} + + +function checkUpdates() { + if (sts.upgrading) return + if (sts.busy) { + check.cleanup() + setStatusBar() + return + } + + searchTimer.stop() + sts.busy = true + sts.errMsg = "" + + const dbPath = pkg.checkupdates ? " --dbpath /tmp/apdatifier-db" : "" + const pkgsync = "pacman -Sl" + dbPath + const pkginfo = "pacman -Qi" + dbPath + const pkgfiles = "pacman -Ql" + dbPath + + const checkupDB = "export CHECKUPDATES_DB=/tmp/apdatifier-db; checkupdates" + const checkupAUR = `${cfg.wrapper} -Qua` + dbPath + + let arch = [], flatpak = [], widgets = [] + + const archCmd = + !pkg.pacman || !cfg.arch ? false + : pkg.checkupdates + ? cfg.aur ? `${checkupDB}; ${checkupAUR}` : `${checkupDB}` + : cfg.aur ? `${cfg.wrapper} -Qu` : "pacman -Qu" + + const feeds = [ + cfg.newsArch && "'https://archlinux.org/feeds/news/'", + cfg.newsKDE && "'https://kde.org/index.xml'", + cfg.newsTWIK && "'https://blogs.kde.org/categories/this-week-in-plasma/index.xml'", + cfg.newsTWIKA && "'https://blogs.kde.org/categories/this-week-in-kde-apps/index.xml'" + ].filter(Boolean).join(' ') + + feeds ? checkNews() : + archCmd ? checkArch() : + cfg.flatpak ? checkFlatpak() : + cfg.widgets ? checkWidgets() : + merge() + + function checkNews() { + sts.statusIco = cfg.ownIconsUI ? "status_news" : "news-subscribe" + sts.statusMsg = i18n("Checking latest news...") + + execute(bash('utils', 'rss', feeds), (cmd, out, err, code) => { + if (code) { + cfg.notifyErrors && notify.send("error", i18n("Cannot fetch news "), out) + } else { + if (out) updateNews(out) + } + + archCmd ? checkArch() : cfg.flatpak ? checkFlatpak() : cfg.widgets ? checkWidgets() : merge() + }, true ) + } + + function checkArch() { + sts.statusIco = cfg.ownIconsUI ? "status_package" : "apdatifier-package" + sts.statusMsg = i18n("Checking system updates...") + + execute(archCmd, (cmd, out, err, code) => { + if (Error(code, err)) return + out ? allArch(out.split("\n")) : cfg.flatpak ? checkFlatpak() : cfg.widgets ? checkWidgets() : merge() + }, true ) + } + + function allArch(upd) { + execute(pkgsync, (cmd, out, err, code) => { + if (Error(code, err)) return + descArch(upd, out.split("\n").filter(line => /\[.*\]/.test(line))) + }, true ) + } + + function descArch(upd, all) { + const pkgs = upd.map(l => l.split(" ")[0]).join(' ') + execute(`${pkginfo} ${pkgs}`, (cmd, out, err, code) => { + if (Error(code, err)) return + iconsArch(upd, all, out, pkgs) + }, true ) + } + + function iconsArch(upd, all, desc, pkgs) { + const getIcons = `\ + while read -r pkg file; do + [[ "$processed" == *"$pkg"* ]] && continue + icon=$(awk -F= '/^Icon=/ {print $2; exit}' "$file" 2>/dev/null || true) && [ -n "$icon" ] || continue + processed="$processed $pkg" + echo "$pkg $icon" + done < <(${pkgfiles} ${pkgs} | grep '/usr/share/applications/.*\.desktop$')` + + execute(getIcons, (cmd, out, err, code) => { + const icons = (out && !err) ? out.split('\n').map(l => ({ NM: l.split(' ')[0], IN: l.split(' ')[1] })) : [] + arch = makeArchList(upd, all, desc, icons) + cfg.flatpak ? checkFlatpak() : cfg.widgets ? checkWidgets() : merge() + }, true ) + } + + function checkFlatpak() { + sts.statusIco = cfg.ownIconsUI ? "status_flatpak" : "apdatifier-flatpak" + sts.statusMsg = i18n("Checking flatpak updates...") + execute("flatpak update --appstream >/dev/null 2>&1; flatpak remote-ls --app --updates --show-details", (cmd, out, err, code) => { + if (Error(code, err)) return + out ? descFlatpak(out.trim()) : cfg.widgets ? checkWidgets() : merge() + }, true ) + } + + function descFlatpak(upd) { + execute("flatpak list --app --columns=application,version,active", (cmd, out, err, code) => { + if (Error(code, err)) return + flatpak = out ? makeFlatpakList(upd, out.trim()) : [] + cfg.widgets ? checkWidgets() : merge() + }, true ) + } + + function checkWidgets() { + sts.statusIco = cfg.ownIconsUI ? "status_widgets" : "start-here-kde-plasma-symbolic" + sts.statusMsg = i18n("Checking widgets updates...") + + execute(bash('widgets', 'check'), (cmd, out, err, code) => { + if (Error(code, err)) return + out = out.trim() + + const errorTexts = { + "127": i18n("Unable check widgets: ") + i18n("Required installed") + " jq", + "1": i18n("Unable check widgets: ") + i18n("Failed to retrieve data from the API"), + "2": i18n("Unable check widgets: ") + i18n("Too many API requests in the last 15 minutes from your IP address, please try again later"), + "3": i18n("Unable check widgets: ") + i18n("Unkwnown error") + } + + if (out in errorTexts) { + Error(out, errorTexts[out]) + return + } + + widgets = JSON.parse(out) + merge() + }, true ) + } + + function merge() { + finalize(keys(arch.concat(flatpak, widgets))) + } +} + + +function updateNews(out) { + const news = JSON.parse(out.trim()) + + if (cfg.notifyNews) { + const currentNews = Array.from(Array(newsModel.count), (_, i) => newsModel.get(i)) + news.forEach(item => { + if (!currentNews.some(currentItem => currentItem.link === item.link)) { + notify.send("news", item.title, item.article, item.link) + } + }) + } + + newsModel.clear() + news.forEach(item => newsModel.append(item)) + updateActiveNews() +} +function updateActiveNews() { + const activeItems = Array.from({ length: newsModel.count }, (_, i) => newsModel.get(i)).filter(item => !item.removed) + activeNewsModel.clear() + activeItems.forEach(item => activeNewsModel.append(item)) +} +function removeNewsItem(index) { + for (let i = 0; i < newsModel.count; i++) { + if (newsModel.get(i).link === activeNewsModel.get(index).link) { + newsModel.setProperty(i, "removed", true) + activeNewsModel.remove(index) + break + } + } + let array = Array.from(Array(newsModel.count), (_, i) => newsModel.get(i)) + execute(writeFile(toFileFormat(array), '>', newsFile)) +} +function restoreNewsList() { + let array = [] + for (let i = 0; i < newsModel.count; i++) { + newsModel.setProperty(i, "removed", false) + array.push(newsModel.get(i)) + } + execute(writeFile(toFileFormat(array), '>', newsFile)) + updateActiveNews() +} + + +function makeArchList(updates, all, description, icons) { + if (!updates || !all || !description) return [] + description = description.replace(/^Installed From\s*:.+\n?/gm, '') + const packagesData = description.split("\n\n") + const skip = new Set([1, 3, 5, 9, 11, 15, 16, 19, 20]) + const empty = new Set([6, 7, 8, 10, 12, 13]) + const keyNames = { + 0: "NM", 2: "DE", 4: "LN", 6: "GR", 7: "PR", 8: "DP", + 10: "RQ", 12: "CF", 13: "RP", 14: "IS", 17: "DT", 18: "RN" + } + + let extendedList = packagesData.map(packageData => { + packageData = packageData.split('\n').filter(line => line.includes(" : ")) + let packageObj = {} + packageData.forEach((line, index) => { + if (skip.has(index)) return + const [, value] = line.split(/\s* : \s*/) + if (empty.has(index) && value.charAt(0) === value.charAt(0).toUpperCase()) return + if (keyNames[index]) packageObj[keyNames[index]] = value.trim() + }) + + if (Object.keys(packageObj).length > 0) { + updates.forEach(str => { + const [name, verold, , vernew] = str.split(" ") + if (packageObj.NM === name) { + const verNew = (vernew === "latest-commit") ? i18n("latest commit") : vernew + Object.assign(packageObj, { VO: verold, VN: verNew }) + } + }) + + const foundRepo = all.find(str => packageObj.NM === str.split(" ")[1]) + packageObj.RE = foundRepo ? foundRepo.split(" ")[0] : (packageObj.NM.endsWith("-git") || packageObj.VN === i18n("latest commit") ? "devel" : "aur") + + const foundIcon = icons.find(item => item.NM === packageObj.NM) + if (foundIcon) packageObj.IN = foundIcon.IN + } + + return packageObj + }) + + extendedList.pop() + return extendedList +} + + +function makeFlatpakList(updates, description) { + if (!updates || !description) return [] + const list = description.split("\n").reduce((obj, line) => { + const [ID, VO, AC] = line.split("\t").map(entry => entry.trim()) + obj[ID] = { VO, AC } + return obj + }, {}) + + return updates.split("\n").map(line => { + const [NM, DE, ID, VN, BR, , RE, , CM, RT, IS, DS] = line.split("\t").map(entry => entry.trim()) + const { VO, AC } = list[ID] + return { + NM: NM.replace(/ /g, "-").toLowerCase(), + DE, LN: "https://flathub.org/apps/" + ID, + ID, BR, RE, AC, CM, RT, IS, DS, VO, + VN: VO === VN ? i18n("latest commit") : VN + } + }) +} + + +function sortList(list, byName) { + if (!list) return + + return list.sort((a, b) => { + const name = a.NM.localeCompare(b.NM) + const repo = a.RE.localeCompare(b.RE) + if (byName || !cfg.sorting) return name + + if (a.IM !== b.IM) return a.IM ? -1 : 1 + + const develA = a.RE.includes("devel") + const develB = b.RE.includes("devel") + if (develA !== develB) return develA ? -1 : 1 + + const aurA = a.RE.includes("aur") + const aurB = b.RE.includes("aur") + if (aurA !== aurB) return aurA ? -1 : 1 + + return repo || name + }) +} + + +function refreshListModel(list) { + list = sortList(applyRules(list || cache)) || [] + sts.count = list.length || 0 + setStatusBar() + + if (!list) return + + listModel.clear() + list.forEach(item => listModel.append(item)) +} + + +function finalize(list) { + cfg.timestamp = new Date().getTime().toString() + + if (!list) { + listModel.clear() + execute(writeFile("[]", '>', cacheFile)) + cache = [] + sts.count = 0 + setStatusBar() + return + } + + refreshListModel(list) + + if (cfg.notifyUpdates) { + const cached = new Map(cache.map(el => [el.NM, el.VN])) + const newList = applyRules(list).filter(el => !cached.has(el.NM) || (cfg.notifyEveryBump && cached.get(el.NM) !== el.VN)) + + if (newList.length > 0) { + const title = i18np("+%1 new update", "+%1 new updates", newList.length) + const body = newList.map(pkg => `${pkg.NM} → ${pkg.VN}`).join("\n") + notify.send("updates", title, body) + } + } + + cache = list + saveCache(cache) +} + +function saveCache(list) { + if (JSON.stringify(list).length > 130000) { + let start = 0 + const chunkSize = 200 + const json = JSON.stringify(keys(sortList(JSON.parse(JSON.stringify(list)), true))).replace(/},/g, "},\n").replace(/'/g, "") + const lines = json.split("\n") + while (start < lines.length) { + const chunk = lines.slice(start, start + chunkSize).join("\n") + const redir = start === 0 ? ">" : ">>" + execute(writeFile(chunk, redir, `${cacheFile}_${Math.ceil(start / chunkSize)}`)) + start += chunkSize + } + execute(bash('utils', 'combineFiles', cacheFile)) + } else { + const json = toFileFormat(keys(sortList(JSON.parse(JSON.stringify(list)), true))) + execute(writeFile(json, '>', cacheFile)) + } +} + + +function setStatusBar(code) { + sts.statusIco = sts.err ? "0" : sts.count > 0 ? "1" : "2" + sts.statusMsg = sts.err ? "Exit code: " + code : sts.count > 0 ? sts.count + " " + i18np("update is pending", "updates are pending", sts.count) : "" + sts.busy = false + !cfg.interval ? searchTimer.stop() : searchTimer.restart() +} + + +function getLastCheckTime() { + if (!cfg.timestamp) return "" + + const diff = new Date().getTime() - parseInt(cfg.timestamp) + const sec = Math.round((diff / 1000) % 60) + const min = Math.floor((diff / (1000 * 60)) % 60) + const hrs = Math.floor(diff / (1000 * 60 * 60)) + + const lastcheck = i18n("Last check:") + const second = i18np("%1 second", "%1 seconds", sec) + const minute = i18np("%1 minute", "%1 minutes", min) + const hour = i18np("%1 hour", "%1 hours", hrs) + const ago = i18n("ago") + + if (hrs === 0 && min === 0) return `${lastcheck} ${second} ${ago}` + if (hrs === 0) return `${lastcheck} ${minute} ${second} ${ago}` + if (min === 0) return `${lastcheck} ${hour} ${ago}` + return `${lastcheck} ${hour} ${minute} ${ago}` +} + + +function setIndex(value, arr) { + let index = 0 + for (let i = 0; i < arr.length; i++) { + if (arr[i]["value"] == value) { + index = i + break + } + } + return index +} + +const defaultIcon = "apdatifier-plasmoid" +function setIcon(icon) { + return icon === "" ? defaultIcon : icon +} + + +function applyRules(list) { + const rules = !cfg.rules ? [] : JSON.parse(cfg.rules) + + list.forEach(el => { + el.IC = el.IN ? el.IN : el.ID ? el.ID : "apdatifier-package" + el.EX = false + el.IM = false + }) + + function applyRule(el, rule) { + const types = { + 'all' : () => true, + 'repo' : () => el.RE === rule.value, + 'group' : () => el.GR.includes(rule.value), + 'match' : () => el.NM.includes(rule.value), + 'name' : () => el.NM === rule.value + } + + if (types[rule.type]()) { + el.IC = rule.icon + el.EX = rule.excluded + el.IM = rule.important + } + } + + rules.forEach(rule => list.forEach(el => applyRule(el, rule))) + return list.filter(el => !el.EX) +} + + +function keys(list) { + const keysList = ["GR", "PR", "DP", "RQ", "CF", "RP", "IS", "DT", "RN", "ID", "BR", "AC", "CM", "RT", "DS", "CN", "AU"] + + list.forEach(el => { + keysList.forEach(key => { + if (!el.hasOwnProperty(key)) el[key] = "" + else if (el[key] === "") delete el[key] + }) + + if (el.hasOwnProperty("IC")) delete el["IC"] + if (el.hasOwnProperty("EX")) delete el["EX"] + if (el.hasOwnProperty("IM")) delete el["IM"] + }) + + return list +} + + +function switchInterval() { + cfg.interval = !cfg.interval +} + +function toFileFormat(obj) { + const jsonStringWithSpace = JSON.stringify(obj, null, 2) + const writebleJsonStrings = jsonStringWithSpace.replace(/'/g, "") + return writebleJsonStrings +} + +function validJSON(string, file) { + try { + const json = JSON.parse(string) + if (json && typeof json === "object") return json + } + catch (e) { + file ? Error(1, `JSON data at ${file} is corrupted or broken and cannot be processed`) + : Error(1, "JSON data is broken and cannot be processed") + } + + return false +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-donate.png b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-donate.png new file mode 100644 index 0000000..7e3a22f Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-donate.png differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-githubstar.png b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-githubstar.png new file mode 100644 index 0000000..7fa17a6 Binary files /dev/null and b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/art/apdatifier-githubstar.png differ diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-flatpak.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-flatpak.svg new file mode 100644 index 0000000..6a93d03 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-flatpak.svg @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-package.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-package.svg new file mode 100644 index 0000000..08733b9 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-package.svg @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-packages.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-packages.svg new file mode 100644 index 0000000..05a8886 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-packages.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-plasmoid.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-plasmoid.svg new file mode 100644 index 0000000..f8035c2 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/apdatifier-plasmoid.svg @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_blank.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_blank.svg new file mode 100644 index 0000000..c9ec703 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_blank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_error.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_error.svg new file mode 100644 index 0000000..449fc09 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_error.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_flatpak.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_flatpak.svg new file mode 100644 index 0000000..e0120e0 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_flatpak.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_news.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_news.svg new file mode 100644 index 0000000..e6c1486 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_news.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_package.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_package.svg new file mode 100644 index 0000000..70632a5 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_package.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_pending.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_pending.svg new file mode 100644 index 0000000..0aa2813 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_pending.svg @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_updated.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_updated.svg new file mode 100644 index 0000000..9eae54c --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_updated.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_widgets.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_widgets.svg new file mode 100644 index 0000000..eb7acda --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/status_widgets.svg @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_compact.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_compact.svg new file mode 100644 index 0000000..3f354bc --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_compact.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_extended.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_extended.svg new file mode 100644 index 0000000..ef3c126 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/tab_extended.svg @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_check.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_check.svg new file mode 100644 index 0000000..4a5405f --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_check.svg @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_management.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_management.svg new file mode 100644 index 0000000..c10ab0b --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_management.svg @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_pause.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_pause.svg new file mode 100644 index 0000000..aa93524 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_pause.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_search.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_search.svg new file mode 100644 index 0000000..86101c8 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_search.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_sort.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_sort.svg new file mode 100644 index 0000000..2923821 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_sort.svg @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_start.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_start.svg new file mode 100644 index 0000000..f1bdbad --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_start.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_stop.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_stop.svg new file mode 100644 index 0000000..aa238f2 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_stop.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_upgrade.svg b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_upgrade.svg new file mode 100644 index 0000000..b289819 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/assets/icons/toolbar_upgrade.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Badge.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Badge.qml new file mode 100644 index 0000000..e31a957 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Badge.qml @@ -0,0 +1,62 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import org.kde.kirigami as Kirigami + +Rectangle { + property var iconName: "" + property var iconColor: "" + property bool pauseBadge: iconName === pausedIcon + + function setAnchor(anchor) { + if (counterRow) { + var topLeft = { top: parent.top, bottom: undefined, left: parent.left, right: undefined } + var topRight = { top: parent.top, bottom: undefined, left: undefined, right: parent.right } + var positions = pauseBadge ? topLeft : topRight + } else { + var normal = { + top: (cfg.counterTop && !cfg.counterBottom) ? parent.top : undefined, + bottom: (cfg.counterBottom && !cfg.counterTop) ? parent.bottom : undefined, + left: (cfg.counterLeft && !cfg.counterRight) ? parent.left : undefined, + right: (cfg.counterRight && !cfg.counterLeft) ? parent.right : undefined + } + var reverse = { + top: (cfg.counterBottom && !cfg.counterTop) ? parent.top : undefined, + bottom: (cfg.counterTop && !cfg.counterBottom) ? parent.bottom : undefined, + left: (cfg.counterRight && !cfg.counterLeft) ? parent.left : undefined, + right: (cfg.counterLeft && !cfg.counterRight) ? parent.right : undefined + } + var positions = pauseBadge ? reverse : normal + } + + return positions[anchor] + } + + + width: (counterOverlay ? trayIconSize : parent.width) / 3 + height: width + radius: width / 2 + color: cfg.counterColor ? cfg.counterColor : Kirigami.Theme.backgroundColor + + anchors { + top: setAnchor("top") + bottom: setAnchor("bottom") + left: setAnchor("left") + right: setAnchor("right") + + topMargin: counterOverlay ? 0 : 5 + bottomMargin: counterOverlay ? 0 : 0 + leftMargin: counterOverlay ? 0 : -1 + rightMargin: counterOverlay ? 0 : -1 + } + + Kirigami.Icon { + anchors.fill: parent + source: cfg.ownIconsUI ? Qt.resolvedUrl("../assets/icons/" + iconName + ".svg") : iconName + color: iconColor + isMask: cfg.ownIconsUI + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/ComboBox.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/ComboBox.qml new file mode 100644 index 0000000..64e45f2 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/ComboBox.qml @@ -0,0 +1,49 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS + +RowLayout { + property alias labelText: label.text + + ComboBox { + id: comboBox + implicitWidth: 250 + textRole: "name" + model: [ + {"name": i18n("None"), "value": ""}, + {"name": i18n("Check updates"), "value": "checkUpdates"}, + {"name": i18n("Upgrade system"), "value": "upgradeSystem"}, + {"name": i18n("Switch interval"), "value": "switchInterval"}, + {"name": i18n("Management"), "value": "management"} + ] + + onCurrentIndexChanged: { + var action = model[currentIndex]["value"] + switch (type) { + case "middle": cfg_middleAction = action; break; + case "right": cfg_rightAction = action; break; + case "scrollUp": cfg_scrollUpAction = action; break; + case "scrollDown": cfg_scrollDownAction = action; break; + } + } + + Component.onCompleted: { + currentIndex = JS.setIndex(plasmoid.configuration[type + "Action"], model) + } + } + + Label { + id: label + text: "" + } + + property string type: "" +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Notification.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Notification.qml new file mode 100644 index 0000000..8ef737f --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Notification.qml @@ -0,0 +1,69 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import org.kde.notification +import "../../tools/tools.js" as JS + +Item { + Component { + id: notifyComponent + Notification { + componentName: "apdatifier" + flags: cfg.notifyPersistent ? Notification.Persistent : Notification.CloseOnTimeout + } + } + + Component { + id: upgradeAction + NotificationAction { + label: i18n("Upgrade system") + onActivated: JS.upgradeSystem() + } + } + + Component { + id: openArticleAction + NotificationAction { + property string link + label: i18n("Read article") + onActivated: Qt.openUrlExternally(link) + } + } + + function send(event, title, body, link) { + const params = { + updates: { + icon: "apdatifier-packages", + urgency: "DefaultUrgency" + }, + news: { + icon: "news-subscribe", + urgency: "HighUrgency" + }, + error: { + icon: "error", + urgency: "CriticalUrgency" + } + } + + const { icon, urgency } = params[event] + + const action = (event === "updates" && cfg.notifyUpdatesAction) ? upgradeAction.createObject(root) + : (event === "news" && cfg.notifyNewsAction) ? openArticleAction.createObject(root, { link: link }) + : [] + + if (cfg.notifySound) event += "Sound" + + notifyComponent.createObject(root, { + eventId: event, + iconName: icon, + title: title, + text: body, + actions: action, + urgency: urgency + })?.sendEvent() + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Placeholder.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Placeholder.qml new file mode 100644 index 0000000..4c99405 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Placeholder.qml @@ -0,0 +1,79 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import org.kde.plasma.extras +import org.kde.plasma.components +import org.kde.kirigami as Kirigami + +Item { + width: parent.width + height: implicitHeight + anchors.centerIn: parent + + Loader { + width: parent.width - (Kirigami.Units.largeSpacing * 4) + anchors.centerIn: parent + active: sts.updated + sourceComponent: Kirigami.PlaceholderMessage { + width: parent.width - (Kirigami.Units.largeSpacing * 4) + icon.name: "checkmark" + text: i18n("System updated") + } + } + + Loader { + width: parent.width - (Kirigami.Units.largeSpacing * 4) + anchors.centerIn: parent + active: !sts.busy && sts.err + sourceComponent: Kirigami.PlaceholderMessage { + icon.name: "error" + text: sts.statusMsg + explanation: sts.errMsg + } + } + + Loader { + width: parent.width - (Kirigami.Units.largeSpacing * 4) + anchors.centerIn: parent + active: sts.busy + sourceComponent: ColumnLayout { + spacing: Kirigami.Units.largeSpacing * 4 + + BusyIndicator { + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: 128 + Layout.preferredHeight: 128 + opacity: 0.6 + running: true + } + + RowLayout { + spacing: Kirigami.Units.smallSpacing + visible: !cfg.showStatusText + + ToolButton { + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: false + highlighted: false + enabled: false + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg(statusIcon) : statusIcon + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + DescriptiveLabel { + text: sts.statusMsg + font.bold: true + } + } + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Shell.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Shell.qml new file mode 100644 index 0000000..5eb1651 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/components/Shell.qml @@ -0,0 +1,45 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import org.kde.plasma.plasma5support as Plasma5Support + +Plasma5Support.DataSource { + id: executable + engine: "executable" + connectedSources: [] + onNewData: (sourceName, data) => { + var cmd = sourceName + var out = data["stdout"] + var err = data["stderr"] + var code = data["exit code"] + + exited(cmd, out, err, code) + + listeners[cmd](cmd, out, err, code) + } + + signal exited(string cmd, string out, string err, int code) + + property var listeners: ({}) + + function exec(cmd, callback) { + listeners[cmd] = execCallback.bind(executable, callback) + connectSource(cmd) + } + + function execCallback(callback, cmd, out, err, code) { + cleanup() + if (callback) callback(cmd, out, err, code) + } + + function cleanup() { + for (var cmd in listeners) { + delete listeners[cmd] + disconnectSource(cmd) + } + this.destroy() + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Appearance.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Appearance.qml new file mode 100644 index 0000000..9524c63 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Appearance.qml @@ -0,0 +1,730 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Dialogs +import QtQuick.Controls + +import org.kde.ksvg +import org.kde.kcmutils +import org.kde.iconthemes +import org.kde.kquickcontrolsaddons +import org.kde.kirigami as Kirigami +import org.kde.plasma.core as PlasmaCore + +import "../../tools/tools.js" as JS + +SimpleKCM { + property alias cfg_relevantIcon: relevantIcon.value + property string cfg_selectedIcon: plasmoid.configuration.selectedIcon + property alias cfg_indicatorStop: indicatorStop.checked + property alias cfg_counterEnabled: counterEnabled.checked + property alias cfg_counterOnLeft: counterOnLeft.checked + property string cfg_counterColor: plasmoid.configuration.counterColor + property alias cfg_counterSize: counterSize.value + property alias cfg_counterRadius: counterRadius.value + property alias cfg_counterOpacity: counterOpacity.value + property alias cfg_counterShadow: counterShadow.checked + property string cfg_counterFontFamily: plasmoid.configuration.counterFontFamily + property alias cfg_counterFontBold: counterFontBold.checked + property alias cfg_counterFontSize: counterFontSize.value + property alias cfg_counterSpacing: counterSpacing.value + property alias cfg_counterMargins: counterMargins.value + property alias cfg_counterOffsetX: counterOffsetX.value + property alias cfg_counterOffsetY: counterOffsetY.value + property alias cfg_counterCenter: counterCenter.checked + property bool cfg_counterTop: plasmoid.configuration.counterTop + property bool cfg_counterBottom: plasmoid.configuration.counterBottom + property bool cfg_counterRight: plasmoid.configuration.counterRight + property bool cfg_counterLeft: plasmoid.configuration.counterLeft + + property alias cfg_ownIconsUI: ownIconsUI.checked + property int cfg_defaultTab: plasmoid.configuration.defaultTab + property alias cfg_switchDefaultTab: switchDefaultTab.checked + property alias cfg_spacing: spacing.value + property alias cfg_sorting: sorting.checked + property alias cfg_showStatusText: showStatusText.checked + property alias cfg_showToolBar: showToolBar.checked + property alias cfg_searchButton: searchButton.checked + property alias cfg_intervalButton: intervalButton.checked + property alias cfg_sortButton: sortButton.checked + property alias cfg_managementButton: managementButton.checked + property alias cfg_upgradeButton: upgradeButton.checked + property alias cfg_checkButton: checkButton.checked + property alias cfg_tabBarVisible: tabBarVisible.checked + property alias cfg_tabBarTexts: tabBarTexts.checked + + property bool inTray: (plasmoid.containmentDisplayHints & PlasmaCore.Types.ContainmentDrawsPlasmoidHeading) + property bool horizontal: plasmoid.location === 3 || plasmoid.location === 4 + property bool counterOverlay: inTray || !horizontal + property bool counterRow: !inTray && horizontal + + property int currentTab + signal tabChanged(currentTab: int) + onCurrentTabChanged: tabChanged(currentTab) + + header: Kirigami.NavigationTabBar { + actions: [ + Kirigami.Action { + icon.name: "view-list-icons" + text: i18n("Panel Icon View") + checked: currentTab === 0 + onTriggered: currentTab = 0 + }, + Kirigami.Action { + icon.name: "view-split-left-right" + text: i18n("List View") + checked: currentTab === 1 + onTriggered: currentTab = 1 + } + ] + } + + Kirigami.FormLayout { + id: iconViewTab + visible: currentTab === 0 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Shown when") + enabled: counterOverlay + + SpinBox { + id: relevantIcon + from: 0 + to: 999 + stepSize: 1 + value: relevantIcon.value + } + + Label { + text: i18np("update is pending ", "updates are pending ", relevantIcon.value) + } + } + + Button { + id: iconButton + + implicitWidth: iconFrame.width + Kirigami.Units.smallSpacing + implicitHeight: implicitWidth + hoverEnabled: true + + FrameSvgItem { + id: iconFrame + anchors.centerIn: parent + width: Kirigami.Units.iconSizes.large + fixedMargins.left + fixedMargins.right + height: width + imagePath: "widgets/background" + + Kirigami.Icon { + anchors.centerIn: parent + width: Kirigami.Units.iconSizes.large + height: width + source: JS.setIcon(cfg_selectedIcon) + } + } + + IconDialog { + id: iconDialog + onIconNameChanged: cfg_selectedIcon = iconName || JS.defaultIcon + } + + onClicked: menu.opened ? menu.close() : menu.open() + + Menu { + id: menu + y: +parent.height + + MenuItem { + text: i18n("Default") + " 1" + icon.name: "apdatifier-plasmoid" + enabled: cfg_selectedIcon !== JS.defaultIcon + onClicked: cfg_selectedIcon = JS.defaultIcon + } + MenuItem { + text: i18n("Default") + " 2" + icon.name: "apdatifier-packages" + enabled: cfg_selectedIcon !== icon.name + onClicked: cfg_selectedIcon = icon.name + } + MenuItem { + text: i18n("Default") + " 3" + icon.name: "apdatifier-package" + enabled: cfg_selectedIcon !== icon.name + onClicked: cfg_selectedIcon = icon.name + } + MenuItem { + text: i18n("Default") + " 4" + icon.name: "apdatifier-flatpak" + enabled: cfg_selectedIcon !== icon.name + onClicked: cfg_selectedIcon = icon.name + } + + MenuItem { + text: i18n("Select...") + icon.name: "document-open-folder" + onClicked: iconDialog.open() + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + ToolTip { + text: cfg_selectedIcon === JS.defaultIcon ? i18n("Default icon") : cfg_selectedIcon + delay: Kirigami.Units.toolTipDelay + visible: iconButton.hovered + } + } + + Item { + Kirigami.FormData.isSection: true + } + + CheckBox { + Kirigami.FormData.label: i18n("Stopped interval") + ":" + id: indicatorStop + text: i18n("Enable") + } + + Item { + Kirigami.FormData.isSection: true + } + + CheckBox { + Kirigami.FormData.label: i18n("Counter") + ":" + id: counterEnabled + text: i18n("Enable") + } + + CheckBox { + Kirigami.FormData.label: "On left" + ":" + id: counterOnLeft + text: i18n("Enable") + visible: counterRow + enabled: counterEnabled.checked + } + + Button { + Kirigami.FormData.label: i18n("Color") + ":" + id: counterColor + + Layout.leftMargin: Kirigami.Units.gridUnit + + implicitWidth: Kirigami.Units.gridUnit + implicitHeight: implicitWidth + visible: counterOverlay + enabled: counterEnabled.checked + + background: Rectangle { + radius: counterRadius.value + border.width: 1 + border.color: "black" + color: cfg_counterColor ? cfg_counterColor : Kirigami.Theme.backgroundColor + } + + onPressed: menuColor.opened ? menuColor.close() : menuColor.open() + + Menu { + id: menuColor + y: +parent.height + + MenuItem { + text: i18n("Default color") + icon.name: "edit-clear" + enabled: cfg_counterColor && cfg_counterColor !== Kirigami.Theme.backgroundColor + onClicked: cfg_counterColor = "" + } + + MenuItem { + text: i18n("Select...") + icon.name: "document-open-folder" + onClicked: colorDialog.open() + } + } + + ColorDialog { + id: colorDialog + visible: false + title: i18n("Select counter background color") + selectedColor: cfg_counterColor + + onAccepted: { + cfg_counterColor = selectedColor + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + ToolTip { + text: cfg_counterColor ? cfg_counterColor : i18n("Default background color from current theme") + delay: Kirigami.Units.toolTipDelay + visible: counterColor.hovered + } + } + + RowLayout { + Kirigami.FormData.label: i18n("Size") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + + Slider { + id: counterSize + from: -5 + to: 10 + stepSize: 1 + value: counterSize.value + onValueChanged: plasmoid.configuration.counterSize = counterSize.value + } + + Label { + text: counterSize.value + } + } + + RowLayout { + Kirigami.FormData.label: i18n("Radius") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + + Slider { + id: counterRadius + from: 0 + to: 100 + stepSize: 1 + value: counterRadius.value + onValueChanged: plasmoid.configuration.counterRadius = counterRadius.value + } + + Label { + text: counterRadius.value + } + } + + RowLayout { + Kirigami.FormData.label: i18n("Opacity") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + + Slider { + id: counterOpacity + from: 0 + to: 10 + stepSize: 1 + value: counterOpacity.value + onValueChanged: plasmoid.configuration.counterOpacity = counterOpacity.value + } + + Label { + text: counterOpacity.value / 10 + } + } + + + CheckBox { + Kirigami.FormData.label: i18n("Shadow") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + id: counterShadow + text: i18n("Enable") + } + + ComboBox { + Kirigami.FormData.label: i18n("Font") + ":" + enabled: counterEnabled.checked + implicitWidth: 250 + editable: true + textRole: "name" + model: { + let fonts = Qt.fontFamilies() + let arr = [] + arr.push({"name": i18n("Default system font"), "value": ""}) + for (let i = 0; i < fonts.length; i++) { + arr.push({"name": fonts[i], "value": fonts[i]}) + } + return arr + } + + onCurrentIndexChanged: cfg_counterFontFamily = model[currentIndex]["value"] + Component.onCompleted: currentIndex = JS.setIndex(plasmoid.configuration.counterFontFamily, model) + } + + CheckBox { + Kirigami.FormData.label: i18n("Font bold") + ":" + enabled: counterEnabled.checked + id: counterFontBold + text: i18n("Enable") + } + + Slider { + Kirigami.FormData.label: i18n("Font size") + ":" + visible: counterRow + enabled: counterEnabled.checked + id: counterFontSize + from: 4 + to: 8 + stepSize: 1 + value: counterFontSize.value + onValueChanged: plasmoid.configuration.counterFontSize = counterFontSize.value + } + + SpinBox { + Kirigami.FormData.label: i18n("Left spacing") + ":" + visible: counterRow + enabled: counterEnabled.checked + id: counterSpacing + from: 0 + to: 99 + stepSize: 1 + value: counterSpacing.value + onValueChanged: plasmoid.configuration.counterSpacing = counterSpacing.value + } + + SpinBox { + Kirigami.FormData.label: i18n("Side margins") + ":" + visible: counterRow + id: counterMargins + from: 0 + to: 99 + stepSize: 1 + value: counterMargins.value + onValueChanged: plasmoid.configuration.counterMargins = counterMargins.value + } + + RowLayout { + Kirigami.FormData.label: i18n("Offset") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + + Label { text: "X:" } + SpinBox { + id: counterOffsetX + from: -10 + to: 10 + stepSize: 1 + value: counterOffsetX.value + onValueChanged: plasmoid.configuration.counterOffsetX = counterOffsetX.value + } + + Label { text: "Y:" } + SpinBox { + id: counterOffsetY + from: -10 + to: 10 + stepSize: 1 + value: counterOffsetY.value + onValueChanged: plasmoid.configuration.counterOffsetY = counterOffsetY.value + } + } + + Item { + Kirigami.FormData.isSection: true + } + + CheckBox { + Kirigami.FormData.label: i18n("Position") + ":" + visible: counterOverlay + enabled: counterEnabled.checked + id: counterCenter + text: i18n("Center") + } + + GridLayout { + Layout.fillWidth: true + visible: counterOverlay + enabled: counterEnabled.checked + columns: 4 + rowSpacing: 0 + columnSpacing: 0 + + ButtonGroup { + id: position + } + + Label { + Layout.fillHeight: true + Layout.alignment: Qt.AlignRight + Layout.rightMargin: Kirigami.Units.smallSpacing * 2.5 + text: i18n("Top-Left") + + MouseArea { + anchors.fill: parent + onClicked: { + topleft.checked = true + } + } + } + + RadioButton { + id: topleft + ButtonGroup.group: position + checked: cfg_counterTop && cfg_counterLeft + + onCheckedChanged: { + if (checked) { + cfg_counterTop = true + cfg_counterBottom = false + cfg_counterRight = false + cfg_counterLeft = true + } + } + } + + RadioButton { + id: topright + ButtonGroup.group: position + checked: cfg_counterTop && cfg_counterRight + + onCheckedChanged: { + if (checked) { + cfg_counterTop = true + cfg_counterBottom = false + cfg_counterRight = true + cfg_counterLeft = false + } + } + } + + Label { + Layout.fillHeight: true + Layout.alignment: Qt.AlignLeft + text: i18n("Top-Right") + + MouseArea { + anchors.fill: parent + onClicked: { + topright.checked = true + } + } + } + + Label { + Layout.fillHeight: true + Layout.alignment: Qt.AlignRight + Layout.rightMargin: Kirigami.Units.smallSpacing * 2.5 + text: i18n("Bottom-Left") + + MouseArea { + anchors.fill: parent + onClicked: { + bottomleft.checked = true + } + } + } + + RadioButton { + id: bottomleft + ButtonGroup.group: position + checked: cfg_counterBottom && cfg_counterLeft + + onCheckedChanged: { + if (checked) { + cfg_counterTop = false + cfg_counterBottom = true + cfg_counterRight = false + cfg_counterLeft = true + } + } + } + + RadioButton { + id: bottomright + ButtonGroup.group: position + checked: cfg_counterBottom && cfg_counterRight + + onCheckedChanged: { + if (checked) { + cfg_counterTop = false + cfg_counterBottom = true + cfg_counterRight = true + cfg_counterLeft = false + } + } + } + + Label { + Layout.fillHeight: true + Layout.alignment: Qt.AlignLeft + text: i18n("Bottom-Right") + + MouseArea { + anchors.fill: parent + onClicked: { + bottomright.checked = true + } + } + } + } + + Item { + Kirigami.FormData.isSection: true + } + } + + Kirigami.FormLayout { + id: listViewTab + visible: currentTab === 1 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: "UI:" + CheckBox { + id: ownIconsUI + text: i18n("Use built-in icons") + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Override custom icon theme and use default Apdatifier icons instead.") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + ButtonGroup { + id: viewGroup + } + + RadioButton { + Kirigami.FormData.label: i18n("Default tab") + ":" + id: compactView + ButtonGroup.group: viewGroup + text: i18n("Compact") + Component.onCompleted: checked = !plasmoid.configuration.defaultTab + } + + RadioButton { + ButtonGroup.group: viewGroup + text: i18n("Extended") + onCheckedChanged: cfg_defaultTab = checked + Component.onCompleted: checked = plasmoid.configuration.defaultTab + } + + CheckBox { + Kirigami.FormData.label: i18n("Behavior") + ":" + id: switchDefaultTab + text: i18n("Always switch to default tab") + } + + RowLayout { + Kirigami.FormData.label: i18n("Item spacing (Compact)") + ":" + Slider { + id: spacing + from: 0 + to: 12 + stepSize: 1 + value: spacing.value + onValueChanged: plasmoid.configuration.spacing = spacing.value + } + + Label { + text: spacing.value + } + } + + Item { + Kirigami.FormData.isSection: true + } + + ButtonGroup { + id: sortGroup + } + + RadioButton { + id: sorting + Kirigami.FormData.label: i18n("Sorting") + ":" + text: i18n("By repository") + checked: true + Component.onCompleted: checked = plasmoid.configuration.sorting + ButtonGroup.group: sortGroup + } + + RadioButton { + text: i18n("By name") + Component.onCompleted: checked = !plasmoid.configuration.sorting + ButtonGroup.group: sortGroup + } + + Item { + Kirigami.FormData.isSection: true + } + + CheckBox { + id: showStatusText + Kirigami.FormData.label: i18n("Header") + ":" + text: i18n("Show status") + } + + CheckBox { + id: showToolBar + text: i18n("Show tool bar") + } + + RowLayout { + enabled: showToolBar.checked + CheckBox { + id: searchButton + icon.name: "search" + } + CheckBox { + id: intervalButton + icon.name: "media-playback-paused" + } + CheckBox { + id: sortButton + icon.name: "sort-name" + } + } + RowLayout { + enabled: showToolBar.checked + CheckBox { + id: managementButton + icon.name: "tools" + } + CheckBox { + id: upgradeButton + icon.name: "akonadiconsole" + } + CheckBox { + id: checkButton + icon.name: "view-refresh" + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Footer") + ":" + + CheckBox { + id: tabBarVisible + text: i18n("Show tab bar") + } + } + + CheckBox { + id: tabBarTexts + text: i18n("Show tab texts") + enabled: tabBarVisible.checked + } + + Item { + Kirigami.FormData.isSection: true + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/General.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/General.qml new file mode 100644 index 0000000..ba9c94a --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/General.qml @@ -0,0 +1,514 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import org.kde.kcmutils +import org.kde.kirigami as Kirigami + +import "../components" as QQC +import "../../tools/tools.js" as JS + +SimpleKCM { + property alias cfg_interval: interval.checked + property alias cfg_time: time.value + property alias cfg_checkOnStartup: checkOnStartup.checked + + property alias cfg_arch: arch.checked + property alias cfg_aur: aur.checked + property alias cfg_flatpak: flatpak.checked + property alias cfg_widgets: widgets.checked + + property alias cfg_newsArch: newsArch.checked + property alias cfg_newsKDE: newsKDE.checked + property alias cfg_newsTWIK: newsTWIK.checked + property alias cfg_newsTWIKA: newsTWIKA.checked + property alias cfg_newsKeep: newsKeep.value + + property string cfg_middleAction: plasmoid.configuration.middleAction + property string cfg_rightAction: plasmoid.configuration.rightAction + property string cfg_scrollUpAction: plasmoid.configuration.scrollUpAction + property string cfg_scrollDownAction: plasmoid.configuration.scrollDownAction + + property alias cfg_notifyUpdates: notifyUpdates.checked + property alias cfg_notifyUpdatesAction: notifyUpdatesAction.checked + property alias cfg_notifyEveryBump: notifyEveryBump.checked + property alias cfg_notifyNews: notifyNews.checked + property alias cfg_notifyNewsAction: notifyNewsAction.checked + property alias cfg_notifyErrors: notifyErrors.checked + property alias cfg_notifySound: notifySound.checked + property alias cfg_notifyPersistent: notifyPersistent.checked + + property var cfg: plasmoid.configuration + property var pkg: plasmoid.configuration.packages + property var terminals: plasmoid.configuration.terminals + property var packageLink: "https://archlinux.org/packages/extra/x86_64/pacman-contrib" + + property int installButton + property var dialogTitles: { + "0": i18n("Install Development version"), + "1": i18n("Install Stable version"), + "2": i18n("Uninstall widget") + } + property var dialogSubtitles: { + "0": i18n("Note: version with the latest commits may be unstable."), + "1": i18n("Note: if you haven't installed the Devel version before, there's no need to install the Stable version."), + "2": i18n("Removal of the widget and all related files, including the directory with its configuration.") + } + + property int currentTab + signal tabChanged(currentTab: int) + onCurrentTabChanged: tabChanged(currentTab) + + Component.onCompleted: { + JS.checkDependencies() + } + + header: Kirigami.NavigationTabBar { + actions: [ + Kirigami.Action { + icon.name: "search" + text: i18n("Search") + checked: currentTab === 0 + onTriggered: currentTab = 0 + }, + Kirigami.Action { + icon.name: "notification-active" + text: i18n("Notifications") + checked: currentTab === 1 + onTriggered: currentTab = 1 + }, + Kirigami.Action { + icon.name: "followmouse-symbolic" + text: i18n("Mouse actions") + checked: currentTab === 2 + onTriggered: currentTab = 2 + }, + Kirigami.Action { + icon.name: "documentinfo" + text: i18n("Misc") + checked: currentTab === 3 + onTriggered: currentTab = 3 + } + ] + } + + ColumnLayout { + Kirigami.InlineMessage { + id: configMsg + Layout.fillWidth: true + icon.source: "document-save" + text: "" + i18n("Configuration is automatically saved in a config file and loaded at every startup, ensuring you never lose your settings. The config file is stored in ") + "~/.config/apdatifier" + "" + type: Kirigami.MessageType.Positive + visible: plasmoid.configuration.configMsg + + actions: [ + Kirigami.Action { + text: "OK" + icon.name: "checkmark" + onTriggered: plasmoid.configuration.configMsg = false + } + ] + } + + Kirigami.InlineMessage { + Layout.fillWidth: true + icon.source: "apdatifier-package" + text: "" + "checkupdates" + i18n(" not installed! Highly recommended to install it for getting the latest updates without the need to download fresh package databases.") + "" + type: Kirigami.MessageType.Error + onLinkActivated: Qt.openUrlExternally(packageLink) + visible: !pkg.checkupdates + } + + Kirigami.FormLayout { + id: searchTab + visible: currentTab === 0 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Interval") + ":" + + CheckBox { + id: interval + } + + SpinBox { + id: time + from: 15 + to: 1440 + stepSize: 5 + value: time + enabled: interval.checked + } + + Label { + text: i18n("minutes") + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("The current timer is reset when either of these settings is changed.") + } + } + + RowLayout { + CheckBox { + id: checkOnStartup + text: i18n("Check on start up") + enabled: interval.checked + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("If the option is enabled, update checking will begin immediately upon widget startup.

If the option is disabled, update checking will be initiated after a specified time interval has passed since the widget was started. Recommended.") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Updates") + ":" + + CheckBox { + id: arch + text: i18n("Arch Official Repositories") + enabled: pkg.pacman + onCheckedChanged: if (!checked) aur.checked = false + } + } + + RowLayout { + spacing: Kirigami.Units.gridUnit + visible: pkg.pacman + + CheckBox { + id: aur + text: i18n("Arch User Repository") + " (AUR)" + enabled: arch.checked && (pkg.paru || pkg.yay) + } + + Kirigami.UrlButton { + url: "https://github.com/exequtic/apdatifier#supported-pacman-wrappers" + text: instTip.text + font.pointSize: instTip.font.pointSize + color: instTip.color + visible: !pkg.paru && !pkg.yay + } + } + + RowLayout { + spacing: Kirigami.Units.gridUnit + + CheckBox { + id: flatpak + text: i18n("Flatpak applications") + enabled: pkg.flatpak + } + + Kirigami.UrlButton { + id: instTip + url: "https://flathub.org/setup" + text: i18n("Not installed") + font.pointSize: Kirigami.Theme.smallFont.pointSize + color: Kirigami.Theme.neutralTextColor + visible: !pkg.flatpak + } + } + + RowLayout { + CheckBox { + id: widgets + text: i18n("Plasma Widgets") + enabled: pkg.jq + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Required installed") + " jq." + i18n("

For widget developers:
Don't forget to update the metadata.json and specify the name of the applet and its version exactly as they appear on the KDE Store.") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("News") + ":" + + CheckBox { + id: newsArch + text: i18n("Arch Linux News") + enabled: pkg.jq + } + } + + CheckBox { + id: newsKDE + text: "KDE Announcements" + enabled: pkg.jq + } + + CheckBox { + id: newsTWIK + text: "This Week in KDE" + enabled: pkg.jq + } + + CheckBox { + id: newsTWIKA + text: "This Week in KDE Apps" + enabled: pkg.jq + } + + RowLayout { + Label { + text: i18n("Keep") + } + + SpinBox { + id: newsKeep + from: 1 + to: 10 + stepSize: 1 + value: newsKeep + enabled: newsArch.checked || newsKDE.checked || newsTWIK.checked || newsTWIKA.checked + } + + Label { + text: i18np("news item from the feed", "news items from the feed", newsKeep.value) + } + } + } + + Kirigami.FormLayout { + id: notificationsTab + visible: currentTab === 1 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + spacing: Kirigami.Units.largeSpacing * 2 + + CheckBox { + Kirigami.FormData.label: i18n("Notifications") + ":" + id: notifyUpdates + text: i18n("For new updates") + } + + CheckBox { + id: notifyUpdatesAction + text: i18n("Action button") + enabled: notifyUpdates.checked + } + } + + RowLayout { + CheckBox { + id: notifyEveryBump + text: i18n("For every version bump") + enabled: notifyUpdates.checked + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("If the option is enabled, notifications will be sent when a new version of the package is bumped, even if the package is already on the list. More notifications.

If the option is disabled, notifications will only be sent for packages that are not yet on the list. Less notifications.") + } + } + + RowLayout { + spacing: Kirigami.Units.largeSpacing * 2 + + CheckBox { + id: notifyNews + text: i18n("For news") + } + + CheckBox { + id: notifyNewsAction + text: i18n("Action button") + enabled: notifyNews.checked + } + } + + CheckBox { + id: notifyErrors + text: i18n("For errors") + } + + CheckBox { + id: notifySound + text: i18n("With sound") + enabled: notifyUpdates.checked || notifyNews.checked || notifyErrors.checked + } + + CheckBox { + id: notifyPersistent + text: i18n("Persistent") + enabled: notifyUpdates.checked || notifyNews.checked || notifyErrors.checked + } + + Item { + Kirigami.FormData.isSection: true + } + + Kirigami.Separator { + Layout.fillWidth: true + } + + RowLayout { + id: notifyTip + + Label { + horizontalAlignment: Text.AlignHCenter + Layout.maximumWidth: 250 + font.pointSize: instTip.font.pointSize + text: i18n("To further configure, click the button below -> Application Settings -> Apdatifier") + wrapMode: Text.WordWrap + } + } + + Item { + Kirigami.FormData.isSection: true + } + + Button { + anchors.horizontalCenter: notifyTip.horizontalCenter + enabled: notifyUpdates.checked || notifyNews.checked || notifyErrors.checked + icon.name: "settings-configure" + text: i18n("Configure...") + onClicked: KCMLauncher.openSystemSettings("kcm_notifications") + } + + Item { + Kirigami.FormData.isSection: true + } + } + + Kirigami.FormLayout { + id: mouseActionsTab + visible: currentTab === 2 + + Item { + Kirigami.FormData.isSection: true + } + + QQC.ComboBox { + Kirigami.FormData.label: i18n("Middle click") + ":" + type: "middle" + } + + QQC.ComboBox { + Kirigami.FormData.label: i18n("Right click") + ":" + type: "right" + Kirigami.ContextualHelpButton { + toolTipText: i18n("Do not enable this option if the widget is not used in the system tray; otherwise, you will not be able to open the settings by right-clicking.") + } + } + + QQC.ComboBox { + Kirigami.FormData.label: i18n("Scroll up") + ":" + type: "scrollUp" + } + + QQC.ComboBox { + Kirigami.FormData.label: i18n("Scroll down") + ":" + type: "scrollDown" + } + + Item { + Kirigami.FormData.isSection: true + } + } + + Kirigami.FormLayout { + id: miscTab + visible: currentTab === 3 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Layout.preferredWidth: miscTab.width - Kirigami.Units.largeSpacing * 10 + Button { + Layout.fillWidth: true + Layout.maximumWidth: 500 + icon.name: "backup" + text: i18n("Restore hidden tooltips") + onClicked: { + plasmoid.configuration.configMsg = true + plasmoid.configuration.rulesMsg = true + plasmoid.configuration.newsMsg = true + plasmoid.configuration.version = "v0" + } + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Layout.preferredWidth: miscTab.width - Kirigami.Units.largeSpacing * 10 + Button { + Layout.fillWidth: true + Layout.maximumWidth: 500 + icon.name: "folder-git-symbolic" + text: i18n("Install Development version") + onClicked: { + installButton = 0 + installDialog.open() + } + } + } + RowLayout { + Layout.preferredWidth: miscTab.width - Kirigami.Units.largeSpacing * 10 + Button { + Layout.fillWidth: true + Layout.maximumWidth: 500 + icon.name: "run-build" + text: i18n("Install Stable version") + onClicked: { + installButton = 1 + installDialog.open() + } + } + } + RowLayout { + Layout.preferredWidth: miscTab.width - Kirigami.Units.largeSpacing * 10 + Button { + Layout.fillWidth: true + Layout.maximumWidth: 500 + icon.name: "delete" + text: i18n("Uninstall widget") + onClicked: { + installButton = 2 + installDialog.open() + } + } + } + Kirigami.PromptDialog { + id: installDialog + title: dialogTitles[installButton] + subtitle: dialogSubtitles[installButton] + standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel + onAccepted: { + if (installButton === 0) { + JS.execute(JS.runInTerminal("utils", "installDev")) + } else if (installButton === 1) { + JS.execute(JS.runInTerminal("utils", "installStable")) + } else { + JS.execute(JS.runInTerminal("utils", "uninstall")) + } + } + } + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Rules.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Rules.qml new file mode 100644 index 0000000..5f70e1d --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Rules.qml @@ -0,0 +1,212 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import org.kde.iconthemes +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS + + +ColumnLayout { + ListModel { + id: rulesModel + Component.onCompleted: { + JS.execute(JS.readFile(JS.rulesFile), (cmd, out, err, code) => { + if (JS.Error(code, err)) return + if (out && JS.validJSON(out, JS.rulesFile)) { + JSON.parse(out).forEach(el => + rulesModel.append({ + type: el.type, + value: el.value, + icon: el.icon, + excluded: el.excluded, + important: ('important' in el) ? el.important : false + }) + ) + } + }) + } + } + + ListModel { + id: typesModel + Component.onCompleted: { + let types = [ + {name: i18n("Unimportant"), type: "all", tip: "---"}, + {name: i18n("Repository"), type: "repo", tip: i18n("Exact repository match")}, + {name: i18n("Group"), type: "group", tip: i18n("Substring group match")}, + {name: i18n("Substring"), type: "match", tip: i18n("Substring name match")}, + {name: i18n("Name"), type: "name", tip: i18n("Exact name match")} + ] + + for (var i = 0; i < types.length; ++i) { + typesModel.append({name: types[i].name, type: types[i].type, tip: types[i].tip}) + } + } + } + + Kirigami.InlineMessage { + id: rulesMsg + Layout.fillWidth: true + Layout.leftMargin: Kirigami.Units.smallSpacing * 2 + Layout.rightMargin: Kirigami.Units.smallSpacing * 2 + icon.source: "showinfo" + text: i18n("Here you can override the default package icons and exclude them from the list. Each rule overwrites the previous one, so the list of rules should be in this order: ")+i18n("Unimportant")+", "+i18n("Repository")+", "+i18n("Group")+", "+i18n("Substring")+", "+i18n("Name") + visible: plasmoid.configuration.rulesMsg + + actions: [ + Kirigami.Action { + text: "OK" + icon.name: "checkmark" + onTriggered: plasmoid.configuration.rulesMsg = false + } + ] + } + + Component { + id: rule + ItemDelegate { + width: rulesList.width - Kirigami.Units.largeSpacing * 2 + contentItem: RowLayout { + ComboBox { + implicitWidth: 200 + id: type + model: typesModel + textRole: "name" + currentIndex: -1 + onCurrentIndexChanged: { + if (currentIndex === 0) valueField.text = "" + rulesList.model.set(index, {"type": model.get(currentIndex).type}) + } + Component.onCompleted: { + var currentType = rulesList.model.get(index).type + for (var i = 0; i < model.count; ++i) { + if (model.get(i).type === currentType) { + currentIndex = i + break + } + } + } + } + + TextField { + id: valueField + Layout.fillWidth: true + text: model.value + placeholderText: type.model.get(type.currentIndex).tip + enabled: type.currentIndex !== 0 + onTextChanged: { + var allow = /^[a-z0-9_\-+.]*$/ + var filtered = valueField.text.replace(/[^a-z0-9_\-+.]/g, "") + if (valueField.text !== filtered) { + valueField.text = filtered + return + } + if (model.value !== valueField.text) { + model.value = valueField.text + } + } + } + + ToolButton { + ToolTip { text: model.icon } + icon.name: model.icon + onClicked: iconDialog.open() + + IconDialog { + id: iconDialog + onIconNameChanged: model.icon = iconName + } + } + + ToolButton { + ToolTip { text: i18n("Mark as important") } + icon.name: model.important ? "flag-red" : "flag" + onClicked: model.important = !model.important + } + + ToolButton { + ToolTip { text: model.excluded ? i18n("Show in the list") : i18n("Exclude from the list") } + icon.name: model.excluded ? "view-visible" : "hint" + onClicked: model.excluded = !model.excluded + } + + ToolButton { + icon.name: 'arrow-up' + enabled: index > 0 + onClicked: rulesList.model.move(index, index - 1, 1) + } + + ToolButton { + icon.name: 'arrow-down' + enabled: index > -1 && index < rulesList.model.count - 1 + onClicked: rulesList.model.move(index, index + 1, 1) + } + + ToolButton { + ToolTip { text: i18n("Remove") } + icon.name: 'delete' + onClicked: rulesList.model.remove(index) + } + } + } + } + + ListView { + Layout.fillHeight: true + Layout.fillWidth: true + id: rulesList + model: rulesModel + delegate: rule + clip: true + + boundsBehavior: Flickable.StopAtBounds + add: Transition { NumberAnimation { properties: "x"; from: 100; duration: 300 } } + moveDisplaced: Transition { NumberAnimation { properties: "x,y"; duration: 300 } } + move: Transition { NumberAnimation { properties: "x,y"; duration: 300 } } + removeDisplaced: Transition { NumberAnimation { properties: "x,y"; duration: 300 } } + remove: Transition { ParallelAnimation { + NumberAnimation { property: "opacity"; to: 0; duration: 300 } + NumberAnimation { properties: "x"; to: 100; duration: 300 } } } + ScrollBar.vertical: ScrollBar { active: true } + } + + RowLayout { + Layout.alignment: Qt.AlignHCenter + Button { + text: i18n("Add rule") + icon.name: "list-add" + onClicked: { + rulesModel.append({ + type: "name", + value: "", + icon: plasmoid.configuration.ownIconsUI ? "apdatifier-package" : "server-database", + excluded: false, + important: false + }) + } + } + Button { + text: i18n("Apply") + icon.name: "dialog-ok-apply" + onClicked: { + var array = [] + for (var i = rulesModel.count - 1; i >= 0; --i) { + if (rulesModel.get(i).type !== "all" && rulesModel.get(i).value.trim() === "") rulesModel.remove(i, 1); + } + for (var i = 0; i < rulesModel.count; i++) { + array.push(rulesModel.get(i)) + } + var rules = JS.toFileFormat(array) + plasmoid.configuration.rules = rules + JS.execute(JS.writeFile(rules, '>', JS.rulesFile)) + } + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Support.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Support.qml new file mode 100644 index 0000000..70f435f --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Support.qml @@ -0,0 +1,94 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import org.kde.kirigami as Kirigami + +Kirigami.Page { + id: supportPage + + leftPadding: Kirigami.Units.gridUnit + rightPadding: Kirigami.Units.gridUnit + + header: Item { + height: layout.implicitHeight + (Kirigami.Units.gridUnit * 2) + + ColumnLayout { + id: layout + width: parent.width - (Kirigami.Units.gridUnit * 2) + anchors.centerIn: parent + + Label { + Layout.fillWidth: true + horizontalAlignment: Text.AlignHCenter + text: i18n("Thanks for using my widget! If you appreciate my work, you can support me by starring the GitHub repository or buying me a coffee ;)") + wrapMode: Text.WordWrap + } + } + } + + RowLayout { + anchors.centerIn: parent + Layout.fillWidth: true + Layout.fillHeight: true + + Kirigami.UrlButton { + id: buymeacoffee + url: "https://buymeacoffee.com/evgk" + visible: false + } + + Kirigami.UrlButton { + id: github + url: "https://github.com/exequtic/apdatifier" + visible: false + } + + Image { + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + source: "../assets/art/apdatifier-donate.png" + sourceSize.width: supportPage.width / 2 + sourceSize.height: supportPage.height + + HoverHandler { + id: handlerCoffee + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: Qt.openUrlExternally(buymeacoffee.url) + } + + ToolTip { + visible: handlerCoffee.hovered + text: i18n("Visit %1", buymeacoffee.url) + } + } + + Image { + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + source: "../assets/art/apdatifier-githubstar.png" + sourceSize.width: supportPage.width / 2 + sourceSize.height: supportPage.height + + HoverHandler { + id: handlerGithub + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: Qt.openUrlExternally(github.url) + } + + ToolTip { + visible: handlerGithub.hovered + text: i18n("Visit %1", github.url) + } + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Upgrade.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Upgrade.qml new file mode 100644 index 0000000..9f21680 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/configuration/Upgrade.qml @@ -0,0 +1,712 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Dialogs + +import org.kde.kcmutils +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS + +SimpleKCM { + property string cfg_terminal: plasmoid.configuration.terminal + property alias cfg_tmuxSession: tmuxSession.checked + property alias cfg_idleInhibit: idleInhibit.checked + property alias cfg_termFont: termFont.checked + + property string cfg_wrapper: plasmoid.configuration.wrapper + property alias cfg_archFlags: archFlags.text + property alias cfg_sudoBin: sudoBin.text + property alias cfg_rebootSystem: rebootSystem.checked + property string cfg_mirrors: plasmoid.configuration.mirrors + property alias cfg_mirrorsAge: mirrorsAge.value + property alias cfg_mirrorCount: mirrorCount.value + property var countryList: [] + property string cfg_dynamicUrl: plasmoid.configuration.dynamicUrl + + property alias cfg_flatpakRemoveUnused: flatpakRemoveUnused.checked + property string cfg_flatpakFlags: plasmoid.configuration.flatpakFlags + + property alias cfg_widgetConfirmation: widgetConfirmation.checked + property alias cfg_restartShell: restartShell.checked + property alias cfg_restartCommand: restartCommand.text + property alias cfg_trayEnabledByDefault: trayEnabledByDefault.checked + + property var pkg: plasmoid.configuration.packages + property var terminals: plasmoid.configuration.terminals + property alias cfg_preExec: preExec.text + property alias cfg_postExec: postExec.text + + property int currentTab + signal tabChanged(currentTab: int) + onCurrentTabChanged: tabChanged(currentTab) + + header: Kirigami.NavigationTabBar { + actions: [ + Kirigami.Action { + icon.name: "akonadiconsole" + text: i18n("General") + checked: currentTab === 0 + onTriggered: currentTab = 0 + }, + Kirigami.Action { + icon.name: "apdatifier-package" + text: "Arch" + checked: currentTab === 1 + onTriggered: currentTab = 1 + }, + Kirigami.Action { + icon.name: "apdatifier-flatpak" + text: "Flatpak" + checked: currentTab === 2 + onTriggered: currentTab = 2 + }, + Kirigami.Action { + icon.name: "start-here-kde-plasma-symbolic" + text: i18n("Widgets") + checked: currentTab === 3 + onTriggered: currentTab = 3 + } + ] + } + + Kirigami.FormLayout { + id: terminalTab + visible: currentTab === 0 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Terminal") + ":" + + ComboBox { + model: terminals + textRole: "name" + enabled: terminals + + onCurrentIndexChanged: cfg_terminal = model[currentIndex]["value"] + + Component.onCompleted: { + if (terminals) { + currentIndex = JS.setIndex(plasmoid.configuration.terminal, terminals) + + if (!plasmoid.configuration.terminal) { + plasmoid.configuration.terminal = model[0]["value"] + } + } + } + } + + Kirigami.UrlButton { + url: "https://github.com/exequtic/apdatifier#supported-terminals" + text: i18n("Not installed") + font.pointSize: Kirigami.Theme.smallFont.pointSize + color: Kirigami.Theme.neutralTextColor + visible: !terminals + } + } + + RowLayout { + CheckBox { + id: termFont + text: i18n("Use NerdFont icons") + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("If your terminal utilizes any Nerd Font, icons from that font will be used.") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + CheckBox { + id: tmuxSession + text: i18n("tmux session") + enabled: pkg.tmux + } + } + + RowLayout { + CheckBox { + id: idleInhibit + text: "Idle Inhibit" + } + + Kirigami.ContextualHelpButton { + toolTipText: "Disables automatic sleep and screen lock while upgrading." + } + } + + Kirigami.Separator { + Kirigami.FormData.label: i18n("Pre/post upgrade scripts") + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Pre-exec") + ":" + + TextField { + id: preExec + placeholderText: i18n("Command or script path") + placeholderTextColor: "grey" + } + + Button { + icon.name: "document-open" + onClicked: fileDialogPreExec.open() + } + + FileDialog { + id: fileDialogPreExec + fileMode: FileDialog.OpenFile + onAccepted: preExec.text = selectedFile.toString().substring(7) + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Running your command or script BEFORE the upgrade.
For example, you can specify your command to update the mirrorlist if you have unofficial repositories.") + } + } + + RowLayout { + Kirigami.FormData.label: i18n("Post-exec") + ":" + + TextField { + id: postExec + placeholderText: i18n("Command or script path") + placeholderTextColor: "grey" + } + + Button { + icon.name: "document-open" + onClicked: fileDialogPostExec.open() + } + + FileDialog { + id: fileDialogPostExec + fileMode: FileDialog.OpenFile + onAccepted: postExec.text = selectedFile.toString().substring(7) + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Running your command or script AFTER the upgrade.
For example, you can specify your command to upgrade something else.") + } + } + } + + Kirigami.FormLayout { + id: archTab + visible: currentTab === 1 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + enabled: plasmoid.configuration.aur + Kirigami.FormData.label: i18n("Wrapper") + ":" + spacing: Kirigami.Units.largeSpacing * 2 + + ButtonGroup { + id: wrappersGroup + } + + RadioButton { + ButtonGroup.group: wrappersGroup + text: "paru" + enabled: pkg.paru + onCheckedChanged: cfg_wrapper = checked ? "paru" : "yay" + Component.onCompleted: checked = plasmoid.configuration.wrapper === text + } + + RadioButton { + ButtonGroup.group: wrappersGroup + text: "yay" + enabled: pkg.yay + Component.onCompleted: checked = plasmoid.configuration.wrapper === text + } + } + + RowLayout { + visible: !plasmoid.configuration.aur + Label { + horizontalAlignment: Text.AlignHCenter + font.pointSize: Kirigami.Theme.smallFont.pointSize + font.bold: true + color: Kirigami.Theme.negativeTextColor + text: i18n("AUR disabled in search settings") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Upgrade options") + ":" + + Label { + text: plasmoid.configuration.aur ? cfg_wrapper+" "+"-Syu" : cfg_sudoBin+" "+"pacman -Syu" + } + + TextField { + id: archFlags + onTextChanged: { + var allow = /^[a-z\- ]*$/ + if (!allow.test(archFlags.text)) + archFlags.text = archFlags.text.replace(/[^a-z\- ]/g, "") + } + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: "sudobin:" + spacing: 0 + enabled: pkg.pacman + + TextField { + id: sudoBin + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Reboot system") + ":" + + CheckBox { + id: rebootSystem + text: i18n("Suggest after upgrading") + } + + Kirigami.ContextualHelpButton { + toolTipText: "This option suggests restarting the system after upgrading critical packages.

Note that not all critical packages require a full system restart; some may only need a session restart or no action at all, such as when an updated package is not currently running (e.g., an alternative kernel) or not in use (e.g., an alternative driver)." + } + } + + Kirigami.Separator { + Kirigami.FormData.label: i18n("Pacman Mirrorlist Generator") + Kirigami.FormData.isSection: true + } + + RowLayout { + height: 30 + Label { + horizontalAlignment: Text.AlignHCenter + font.pointSize: Kirigami.Theme.smallFont.pointSize + font.bold: true + color: Kirigami.Theme.negativeTextColor + text: i18n("Only for official repositories") + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Required installed") + " pacman-contrib." + i18n("

Also see https://archlinux.org/mirrorlist (click button to open link)") + onClicked: Qt.openUrlExternally("https://archlinux.org/mirrorlist") + } + } + + Item { + Layout.preferredHeight: Kirigami.Units.smallSpacing * 2 + } + + ButtonGroup { + id: generator + } + + RowLayout{ + Kirigami.FormData.label: i18n("Generator") + ":" + + RadioButton { + ButtonGroup.group: generator + id: mirrors + text: i18n("Disabled") + enabled: pkg.pacman && pkg.checkupdates + checked: { + plasmoid.configuration.mirrors === "false" + } + onCheckedChanged: { + if (checked) cfg_mirrors = "false" + } + Component.onCompleted: { + if (!checked && !enabled) { + checked = true + plasmoid.configuration.mirrors = "false" + } + } + } + } + + RadioButton { + ButtonGroup.group: generator + text: i18n("Always ask") + enabled: mirrors.enabled + checked: plasmoid.configuration.mirrors === "alwaysAsk" + onCheckedChanged: { + if (checked) cfg_mirrors = "alwaysAsk" + } + } + + RowLayout{ + enabled: mirrors.enabled + RadioButton { + ButtonGroup.group: generator + text: i18n("Ask if older than") + checked: plasmoid.configuration.mirrors === "age" + onCheckedChanged: { + if (checked) cfg_mirrors = "age" + } + } + + SpinBox { + id: mirrorsAge + from: 1 + to: 999 + stepSize: 1 + value: mirrorsAge + } + + Label { + text: i18np("day", "days", mirrorsAge.value) + } + } + + RadioButton { + ButtonGroup.group: generator + text: i18n("No ask, force refresh") + enabled: mirrors.enabled + checked: plasmoid.configuration.mirrors === "force" + onCheckedChanged: { + if (checked) cfg_mirrors = "force" + } + } + + Item { + Layout.preferredHeight: Kirigami.Units.smallSpacing * 2 + } + + RowLayout { + Kirigami.FormData.label: i18n("Protocol") + ":" + + CheckBox { + + id: http + text: "http" + onClicked: updateUrl() + enabled: mirrors.enabled + } + + CheckBox { + id: https + text: "https" + onClicked: updateUrl() + enabled: mirrors.enabled + } + } + + RowLayout { + Kirigami.FormData.label: i18n("IP version") + ":" + + CheckBox { + id: ipv4 + text: "IPv4" + onClicked: updateUrl() + enabled: mirrors.enabled + } + + CheckBox { + id: ipv6 + text: "IPv6" + onClicked: updateUrl() + enabled: mirrors.enabled + } + } + + CheckBox { + Kirigami.FormData.label: i18n("Mirror status") + ":" + id: mirrorstatus + text: i18n("Enable") + onClicked: updateUrl() + enabled: mirrors.enabled + } + + RowLayout { + Kirigami.FormData.label: i18n("Number output") + ":" + + SpinBox { + id: mirrorCount + from: 0 + to: 10 + stepSize: 1 + value: mirrorCount + enabled: mirrors.enabled + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("Number of servers to write to mirrorlist file. 0 for all.") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Country") + ":" + + Label { + textFormat: Text.RichText + text: { + var matchResult = cfg_dynamicUrl.match(/country=([A-Z]+)/g) + if (matchResult !== null) { + var countries = matchResult.map(str => str.split("=")[1]).join(", ") + return countries + } else { + return '' + i18n("Select at least one!") + '' + } + } + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("You must select at least one country, otherwise all will be chosen by default.

The more countries you select, the longer it will take to generate the mirrors!

It is optimal to choose 1-2 countries closest to you.") + } + } + + ColumnLayout { + Layout.maximumWidth: archTab.width / 2.5 + Layout.maximumHeight: 200 + enabled: mirrors.enabled + + ScrollView { + Layout.preferredWidth: archTab.width / 2.5 + Layout.preferredHeight: 200 + + GridLayout { + columns: 1 + + Repeater { + model: countryListModel + delegate: CheckBox { + text: model.text + checked: model.checked + onClicked: { + model.checked = checked + checked ? countryList.push(model.code) : countryList.splice(countryList.indexOf(model.code), 1) + updateUrl() + } + } + } + } + } + } + + Item { + Kirigami.FormData.isSection: true + } + } + + Kirigami.FormLayout { + id: flatpakTab + visible: currentTab === 2 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Uninstall unused") + ":" + + CheckBox { + id: flatpakRemoveUnused + text: i18n("Enable") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + ButtonGroup { + id: flatpakFlags + } + + RowLayout{ + Kirigami.FormData.label: i18n("Upgrade options") + ":" + + RadioButton { + ButtonGroup.group: flatpakFlags + text: i18n("Normal") + checked: plasmoid.configuration.flatpakFlags === "" + onCheckedChanged: { + if (checked) cfg_flatpakFlags = "" + } + } + } + + RadioButton { + ButtonGroup.group: flatpakFlags + text: i18n("Normal, skip questions") + checked: plasmoid.configuration.flatpakFlags === "--assumeyes" + onCheckedChanged: { + if (checked) cfg_flatpakFlags = "--assumeyes" + } + } + + RadioButton { + ButtonGroup.group: flatpakFlags + text: i18n("Non interactive, skip questions") + checked: plasmoid.configuration.flatpakFlags === "--noninteractive" + onCheckedChanged: { + if (checked) cfg_flatpakFlags = "--noninteractive" + } + } + + RadioButton { + ButtonGroup.group: flatpakFlags + text: i18n("Verbose") + checked: plasmoid.configuration.flatpakFlags === "--verbose" + onCheckedChanged: { + if (checked) cfg_flatpakFlags = "--verbose" + } + } + } + + Kirigami.FormLayout { + id: widgetsTab + visible: currentTab === 3 + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Upgrade confirmation") + ":" + + CheckBox { + id: widgetConfirmation + text: i18n("Enable") + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Restart plasmashell") + ":" + + CheckBox { + id: restartShell + text: i18n("Suggest after upgrading") + } + + Kirigami.ContextualHelpButton { + toolTipText: i18n("After upgrading widget, the old version will still remain in memory until you restart plasmashell. To avoid doing this manually, enable this option.") + } + } + + RowLayout { + Kirigami.FormData.label: i18n("Command") + ":" + + TextField { + id: restartCommand + enabled: restartShell.checked + } + } + + Item { + Kirigami.FormData.isSection: true + } + + RowLayout { + Kirigami.FormData.label: i18n("Apdatifier tray icon") + ":" + + CheckBox { + id: trayEnabledByDefault + text: i18n("Enabled by default") + } + } + } + + Component.onCompleted: { + if (tmuxSession.checked && !pkg.tmux) tmuxSession.checked = plasmoid.configuration.tmuxSession = false + + if(cfg_dynamicUrl) { + var urlParams = plasmoid.configuration.dynamicUrl.split("?")[1].split("&") + + for (var i = 0; i < urlParams.length; i++) { + var param = urlParams[i] + if (param.includes("use_mirror_status=on")) mirrorstatus.checked = true + if (/protocol=http\b/.test(param)) http.checked = true + if (param.includes("protocol=https")) https.checked = true + if (param.includes("ip_version=4")) ipv4.checked = true + if (param.includes("ip_version=6")) ipv6.checked = true + if (param.includes("country=")) { + var country = decodeURIComponent(param.split("=")[1]) + countryList.push(country) + for (var j = 0; j < countryListModel.count; ++j) { + if (countryListModel.get(j).code === country) { + countryListModel.get(j).checked = true + } + } + } + } + } + } + + function updateUrl() { + var params = "" + if (http.checked) params += "&protocol=http" + if (https.checked) params += "&protocol=https" + if (ipv4.checked) params += "&ip_version=4" + if (ipv6.checked) params += "&ip_version=6" + if (mirrorstatus.checked) params += "&use_mirror_status=on" + + for (var i = 0; i < countryList.length; i++) { + params += "&country=" + countryList[i] + } + + var baseUrl = "https://archlinux.org/mirrorlist/?" + cfg_dynamicUrl = baseUrl + params.substring(1) + } + + ListModel { + id: countryListModel + + function createCountryList() { + let countries = + "Australia:AU, Austria:AT, Azerbaijan:AZ, Bangladesh:BD, Belarus:BY, Belgium:BE, " + + "Bosnia and Herzegovina:BA, Brazil:BR, Bulgaria:BG, Cambodia:KH, Canada:CA, Chile:CL, " + + "China:CN, Colombia:CO, Croatia:HR, Czech Republic:CZ, Denmark:DK, Ecuador:EC, " + + "Estonia:EE, Finland:FI, France:FR, Georgia:GE, Germany:DE, Greece:GR, Hong Kong:HK, " + + "Hungary:HU, Iceland:IS, India:IN, Indonesia:ID, Iran:IR, Israel:IL, Italy:IT, Japan:JP, " + + "Kazakhstan:KZ, Kenya:KE, Latvia:LV, Lithuania:LT, Luxembourg:LU, Mauritius:MU, Mexico:MX, " + + "Moldova:MD, Monaco:MC, Netherlands:NL, New Caledonia:NC, New Zealand:NZ, North Macedonia:MK, " + + "Norway:NO, Paraguay:PY, Poland:PL, Portugal:PT, Romania:RO, Russia:RU, Réunion:RE, " + + "Serbia:RS, Singapore:SG, Slovakia:SK, Slovenia:SI, South Africa:ZA, South Korea:KR, Spain:ES, " + + "Sweden:SE, Switzerland:CH, Taiwan:TW, Thailand:TH, Turkey:TR, Ukraine:UA, United Kingdom:GB, " + + "United States:US, Uzbekistan:UZ, Vietnam:VN" + + countries.split(", ").map(item => { + let [country, code] = item.split(":") + countryListModel.append({text: country, code: code, checked: false}) + }) + } + + Component.onCompleted: createCountryList() + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/main.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/main.qml new file mode 100644 index 0000000..05d5a30 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/main.qml @@ -0,0 +1,138 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts + +import org.kde.plasma.plasmoid +import org.kde.kirigami as Kirigami +import org.kde.plasma.core as PlasmaCore + +import "components" +import "representation" as Rep +import "../tools/tools.js" as JS + +PlasmoidItem { + id: root + compactRepresentation: Rep.Panel {} + fullRepresentation: Rep.Expanded { + Layout.minimumWidth: Kirigami.Units.gridUnit * 24 + Layout.minimumHeight: Kirigami.Units.gridUnit * 16 + anchors.fill: parent + focus: true + } + + switchWidth: Kirigami.Units.gridUnit * 24 + switchHeight: Kirigami.Units.gridUnit * 16 + + Plasmoid.busy: plasmoid.location === PlasmaCore.Types.Floating ? false : States.busy + Plasmoid.status: cfg.relevantIcon > 0 ? (sts.count >= cfg.relevantIcon || sts.busy || sts.err) ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus : PlasmaCore.Types.ActiveStatus + Plasmoid.backgroundHints: PlasmaCore.Types.DefaultBackground | PlasmaCore.Types.ConfigurableBackground + Plasmoid.icon: plasmoid.configuration.selectedIcon + + toolTipMainText: !interval && sts.idle ? i18n("Auto check disabled") : "" + toolTipSubText: sts.busy ? sts.statusMsg : sts.err ? sts.errMsg : sts.checktime + + property var check + property var cache: [] + property int time: plasmoid.configuration.time + property bool interval: plasmoid.configuration.interval + property bool sorting: plasmoid.configuration.sorting + property string rules: plasmoid.configuration.rules || "" + property var pkg: plasmoid.configuration.packages || "" + property var cfg: plasmoid.configuration + property var configuration: JSON.stringify(cfg) + + QtObject { + id: sts + property int count: 0 + property bool busy: false + property bool upgrading: false + property bool err: !!errMsg + property bool idle: !busy && !err + property bool updated: idle && !count + property bool pending: idle && count + property bool paused: idle && cfg.indicatorStop && !cfg.interval + property string errMsg: "" + property string statusMsg: "" + property string statusIco: "" + property string checktime: "" + } + + ListModel { + id: listModel + } + + ListModel { + id: newsModel + } + + ListModel { + id: activeNewsModel + } + + Notification { + id: notify + } + + Plasmoid.contextualActions: [ + PlasmaCore.Action { + text: i18n("Check updates") + icon.name: "view-refresh" + enabled: !sts.upgrading + onTriggered: JS.checkUpdates() + }, + PlasmaCore.Action { + text: i18n("Upgrade system") + icon.name: "akonadiconsole" + enabled: (cfg.terminal && cfg.tmuxSession && sts.count) || (cfg.terminal && sts.pending) + onTriggered: JS.upgradeSystem() + }, + PlasmaCore.Action { + text: i18n("Management") + icon.name: "tools" + enabled: cfg.terminal && pkg.pacman + onTriggered: JS.management() + } + ] + + Timer { + id: searchTimer + interval: time * 1000 * 60 + repeat: true + onTriggered: JS.checkUpdates() + } + + Timer { + id: upgradeTimer + interval: 1000 + repeat: true + onTriggered: JS.upgradingState() + } + + Timer { + id: saveTimer + interval: 1000 + onTriggered: JS.saveConfig() + } + + Timer { + id: initTimer + running: true + interval: 50 + } + + function refresh() { + if (initTimer.running) return + JS.refreshListModel() + } + + onTimeChanged: searchTimer.restart() + onIntervalChanged: interval ? searchTimer.start() : searchTimer.stop() + onSortingChanged: refresh() + onRulesChanged: refresh() + onConfigurationChanged: saveTimer.start() + Component.onCompleted: JS.init() +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Expanded.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Expanded.qml new file mode 100644 index 0000000..f4ecf9d --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Expanded.qml @@ -0,0 +1,374 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts + +import org.kde.kitemmodels +import org.kde.plasma.extras +import org.kde.plasma.plasmoid +import org.kde.plasma.components +import org.kde.kirigami as Kirigami +import org.kde.plasma.core as PlasmaCore + +import "../scrollview" as View +import "../../tools/tools.js" as JS + +Representation { + property string currVersion: "v2.9.4" + property bool searchFieldOpen: false + property bool expanded: root.expanded + onExpandedChanged: { + if (plasmoid.configuration.switchDefaultTab && !expanded) + swipeView.currentIndex = plasmoid.configuration.defaultTab + } + + property string statusIcon: { + var icons = { + "0": cfg.ownIconsUI ? "status_error" : "error", + "1": cfg.ownIconsUI ? "status_pending" : "accept_time_event", + "2": cfg.ownIconsUI ? "status_blank" : "" + } + return icons[sts.statusIco] !== undefined ? icons[sts.statusIco] : sts.statusIco + } + + function svg(icon) { + return Qt.resolvedUrl("../assets/icons/" + icon + ".svg") + } + + property var backgroundHidden: (Plasmoid.formFactor === PlasmaCore.Types.Planar) && (Plasmoid.userBackgroundHints === PlasmaCore.Types.ShadowBackground) + onBackgroundHiddenChanged: topHeader.background.visible = bottomHeader.background.visible = !backgroundHidden + + header: PlasmoidHeading { + id: topHeader + visible: cfg.showStatusText || cfg.showToolBar + contentItem: RowLayout { + id: toolBar + Layout.fillWidth: true + Layout.minimumHeight: Kirigami.Units.iconSizes.medium + Layout.maximumHeight: Kirigami.Units.iconSizes.medium + + RowLayout { + id: status + Layout.alignment: cfg.showToolBar ? Qt.AlignLeft : Qt.AlignHCenter + spacing: Kirigami.Units.smallSpacing / 2 + visible: cfg.showStatusText + + Item { + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg(statusIcon) : statusIcon + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + Label { + Layout.maximumWidth: toolBar.width - toolBarButtons.width - Kirigami.Units.iconSizes.smallMedium + Layout.alignment: Qt.AlignLeft + text: sts.statusMsg + elide: Text.ElideRight + font.bold: true + } + } + + RowLayout { + id: toolBarButtons + Layout.alignment: Qt.AlignRight + spacing: Kirigami.Units.smallSpacing + visible: cfg.showToolBar + + ToolButton { + id: searchButton + ToolTip {text: i18n("Filter by package name")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + visible: cfg.searchButton && sts.pending + enabled: visible && swipeView.currentIndex != 2 + onClicked: { + if (searchFieldOpen) searchField.text = "" + searchFieldOpen = !searchField.visible + searchField.focus = searchFieldOpen + } + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg("toolbar_search") : "search" + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + ToolButton { + ToolTip {text: cfg.interval ? i18n("Disable auto search updates") : i18n("Enable auto search updates")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + enabled: sts.idle + visible: enabled && cfg.intervalButton + onClicked: JS.switchInterval() + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI + ? (cfg.interval ? svg("toolbar_pause") : svg("toolbar_start")) + : (cfg.interval ? "media-playback-paused" : "media-playback-playing") + color: !cfg.interval && !cfg.indicatorStop ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + ToolButton { + ToolTip {text: cfg.sorting ? i18n("Sort packages by name") : i18n("Sort packages by repository")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + visible: cfg.sortButton && sts.pending + enabled: visible && swipeView.currentIndex != 2 + onClicked: cfg.sorting = !cfg.sorting + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg("toolbar_sort") : "sort-name" + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + ToolButton { + ToolTip { id: managementTip; text: i18n("Management")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + enabled: sts.idle && pkg.pacman !== "" && cfg.terminal + visible: enabled && cfg.managementButton + onClicked: { managementTip.hide(); JS.management() } + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg("toolbar_management") : "tools" + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + ToolButton { + ToolTip { id: upgradeTip; text: i18n("Upgrade system")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + enabled: sts.pending && cfg.terminal + visible: enabled && cfg.upgradeButton + onClicked: { upgradeTip.hide(); JS.upgradeSystem() } + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? svg("toolbar_upgrade") : "akonadiconsole" + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + + ToolButton { + ToolTip {text: sts.busy ? i18n("Stop checking") : i18n("Check updates")} + Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium + Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium + hoverEnabled: enabled + highlighted: enabled + visible: cfg.checkButton && !sts.upgrading + onClicked: JS.checkUpdates() + Kirigami.Icon { + height: parent.height + width: parent.height + anchors.centerIn: parent + source: cfg.ownIconsUI ? (sts.busy ? svg("toolbar_stop") : svg("toolbar_check")) + : (sts.busy ? "media-playback-stopped" : "view-refresh") + color: Kirigami.Theme.colorSet + scale: cfg.ownIconsUI ? 0.7 : 0.9 + isMask: cfg.ownIconsUI + smooth: true + } + } + } + } + } + + footer: PlasmoidHeading { + id: bottomHeader + spacing: 0 + topPadding: 0 + height: Kirigami.Units.iconSizes.medium + visible: cfg.tabBarVisible + + contentItem: TabBar { + id: tabBar + Layout.fillWidth: true + Layout.fillHeight: true + position: TabBar.Footer + currentIndex: swipeView.currentIndex + onCurrentIndexChanged: { + swipeView.currentIndex = currentIndex + if (swipeView.currentIndex === 2) { + searchFieldOpen = false + searchField.text = "" + } + } + + TabButton { + id: compactViewTab + ToolTip { text: cfg.tabBarTexts ? "" : i18n("Compact view") } + contentItem: RowLayout { + Kirigami.Theme.inherit: true + Item { Layout.fillWidth: true } + Kirigami.Icon { + Layout.preferredHeight: Kirigami.Units.iconSizes.small + Layout.preferredWidth: Kirigami.Units.iconSizes.small + source: cfg.ownIconsUI ? svg("tab_compact") : "view-split-left-right" + color: Kirigami.Theme.colorSet + isMask: cfg.ownIconsUI + smooth: true + } + Label { text: i18n("Compact"); visible: cfg.tabBarTexts } + Item { Layout.fillWidth: true } + } + } + + TabButton { + id: extendViewTab + ToolTip { text: cfg.tabBarTexts ? "" : i18n("Extended view") } + contentItem: RowLayout { + Kirigami.Theme.inherit: true + Item { Layout.fillWidth: true } + Kirigami.Icon { + Layout.preferredHeight: Kirigami.Units.iconSizes.small + Layout.preferredWidth: Kirigami.Units.iconSizes.small + source: cfg.ownIconsUI ? svg("tab_extended") : "view-split-top-bottom" + color: Kirigami.Theme.colorSet + isMask: cfg.ownIconsUI + smooth: true + } + Label { text: i18n("Extended"); visible: cfg.tabBarTexts } + Item { Layout.fillWidth: true } + } + } + + TabButton { + id: newsViewTab + ToolTip { text: cfg.tabBarTexts ? "" : i18n("News") } + contentItem: RowLayout { + Kirigami.Theme.inherit: true + Item { Layout.fillWidth: true } + Kirigami.Icon { + id: newsIcon + Layout.preferredHeight: Kirigami.Units.iconSizes.small + Layout.preferredWidth: Kirigami.Units.iconSizes.small + source: cfg.ownIconsUI ? svg("status_news") : "news-subscribe" + color: activeNewsModel.count > 0 ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.colorSet + isMask: cfg.ownIconsUI + smooth: true + } + Label { text: i18n("News"); visible: cfg.tabBarTexts } + Item { Layout.fillWidth: true } + } + } + } + } + + ColumnLayout { + anchors.fill: parent + spacing: 0 + + TextField { + Layout.fillWidth: true + Layout.topMargin: Kirigami.Units.smallSpacing * 2 + Layout.bottomMargin: Kirigami.Units.smallSpacing * 2 + Layout.leftMargin: Kirigami.Units.smallSpacing * 2 + Layout.rightMargin: Kirigami.Units.smallSpacing * 2 + + id: searchField + clearButtonShown: true + visible: searchFieldOpen && sts.pending + placeholderText: i18n("Filter by package name") + onTextChanged: modelList.setFilterFixedString(text) + } + + Kirigami.InlineMessage { + Layout.fillWidth: true + Layout.topMargin: Kirigami.Units.smallSpacing * 2 + Layout.bottomMargin: Kirigami.Units.smallSpacing * 2 + text: "" + i18n("Check out release notes")+" "+currVersion+"" + type: Kirigami.MessageType.Positive + visible: !searchFieldOpen && + plasmoid.configuration.version.localeCompare(currVersion, undefined, { numeric: true, sensitivity: 'base' }) < 0 + + actions: [ + Kirigami.Action { + tooltip: i18n("Select...") + icon.name: "application-menu" + expandible: true + + Kirigami.Action { + text: "GitHub" + icon.name: "internet-web-browser-symbolic" + onTriggered: Qt.openUrlExternally("https://github.com/exequtic/apdatifier/releases") + } + Kirigami.Action { + text: i18n("Dismiss") + icon.name: "dialog-close" + onTriggered: plasmoid.configuration.version = currVersion + } + } + ] + } + + SwipeView { + id: swipeView + Layout.fillWidth: true + Layout.fillHeight: true + clip: true + currentIndex: plasmoid.configuration.defaultTab + View.Compact {} + View.Extended {} + View.News {} + } + } + + KSortFilterProxyModel { + id: modelList + sourceModel: listModel + filterRoleName: "name" + filterRowCallback: (sourceRow, sourceParent) => { + return sourceModel.data(sourceModel.index(sourceRow, 0, sourceParent), filterRole).includes(searchField.text) + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Panel.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Panel.qml new file mode 100644 index 0000000..42d40b9 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/representation/Panel.qml @@ -0,0 +1,204 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import org.kde.plasma.plasmoid +import org.kde.kirigami as Kirigami +import org.kde.plasma.core as PlasmaCore +import Qt5Compat.GraphicalEffects + +import "../components" as QQC +import "../../tools/tools.js" as JS + +MouseArea { + id: mouseArea + + property bool wasExpanded: false + property bool inTray: (plasmoid.containmentDisplayHints & PlasmaCore.Types.ContainmentDrawsPlasmoidHeading) + property bool horizontal: plasmoid.location === 3 || plasmoid.location === 4 + property int trayIconSize: horizontal ? trayIcon.width : trayIcon.height + property bool counterOverlay: inTray || !horizontal + property bool counterRow: !inTray && horizontal + + function darkColor(color) { + return Kirigami.ColorUtils.brightnessForColor(color) === Kirigami.ColorUtils.Dark + } + property var isDarkText: darkColor(Kirigami.Theme.textColor) + property var lightText: isDarkText ? Kirigami.Theme.backgroundColor : Kirigami.Theme.textColor + property var darkText: isDarkText ? Kirigami.Theme.textColor : Kirigami.Theme.backgroundColor + + property var errorIcon: cfg.ownIconsUI ? "status_error" : "error" + property var updatedIcon: cfg.ownIconsUI ? "status_updated" : "checkmark" + property var pausedIcon: cfg.ownIconsUI ? "toolbar_pause" : "media-playback-paused" + + Layout.preferredWidth: counterOverlay ? trayIcon.width : panelRow.width + + hoverEnabled: true + acceptedButtons: cfg.rightAction ? Qt.AllButtons : Qt.LeftButton | Qt.MiddleButton + + onEntered: sts.checktime = JS.getLastCheckTime() + + onPressed: mouse => { + wasExpanded = expanded + if (!cfg.rightAction && mouse.button == Qt.RightButton) mouse.accepted = false + } + + onClicked: mouse => { + if (mouse.button == Qt.LeftButton) expanded = !wasExpanded + if (mouse.button == Qt.MiddleButton && cfg.middleAction) JS[cfg.middleAction]() + if (mouse.button == Qt.RightButton && cfg.rightAction) JS[cfg.rightAction]() + } + + WheelHandler { + acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad + onWheel: (event) => { + if (srollTimer.running) return + srollTimer.start() + var action = event.angleDelta.y > 0 ? cfg.scrollUpAction : cfg.scrollDownAction + if (!action) return + JS[action]() + } + } + + Timer { + id: srollTimer + interval: 500 + } + + RowLayout { + id: panelRow + + layoutDirection: cfg.counterOnLeft ? Qt.RightToLeft : Qt.LeftToRight + visible: counterRow + spacing: 0 + anchors.centerIn: mouseArea + + Item { + Layout.preferredWidth: Kirigami.Units.smallSpacing + cfg.counterMargins + } + + Item { + Layout.preferredHeight: mouseArea.height + Layout.preferredWidth: mouseArea.height + + Kirigami.Icon { + id: panelIcon + width: parent.width + height: parent.height + source: JS.setIcon(plasmoid.icon) + active: mouseArea.containsMouse + + QQC.Badge { + iconName: errorIcon + iconColor: Kirigami.Theme.negativeTextColor + visible: sts.err + } + QQC.Badge { + iconName: updatedIcon + iconColor: Kirigami.Theme.positiveTextColor + visible: sts.updated + } + QQC.Badge { + iconName: pausedIcon + iconColor: Kirigami.Theme.neutralTextColor + visible: sts.paused + } + } + } + Item { + Layout.preferredWidth: cfg.counterSpacing + visible: counterText.visible + } + Label { + id: counterText + visible: cfg.counterEnabled && sts.pending + font.family: plasmoid.configuration.counterFontFamily || Kirigami.Theme.defaultFont + font.pixelSize: mouseArea.height * (cfg.counterFontSize / 10) + font.bold: cfg.counterFontBold + fontSizeMode: Text.FixedSize + smooth: true + text: sts.count + } + + Item { + Layout.preferredWidth: Kirigami.Units.smallSpacing + cfg.counterMargins + } + } + + Kirigami.Icon { + id: trayIcon + anchors.fill: parent + source: JS.setIcon(plasmoid.icon) + active: mouseArea.containsMouse + visible: counterOverlay + } + + Rectangle { + id: frame + anchors.centerIn: trayIcon + width: trayIconSize + cfg.counterOffsetX + height: trayIconSize + cfg.counterOffsetY + opacity: 0 + visible: counterOverlay + } + + Rectangle { + id: counterFrame + width: cfg.counterCenter ? frame.width : counter.width + 2 + height: cfg.counterCenter ? frame.height : counter.height + radius: cfg.counterRadius + opacity: cfg.counterOpacity / 10 + color: cfg.counterColor ? cfg.counterColor : Kirigami.Theme.backgroundColor + visible: counterOverlay && cfg.counterEnabled && sts.pending + + layer.enabled: cfg.counterShadow + layer.effect: DropShadow { + horizontalOffset: 0 + verticalOffset: 0 + radius: 2 + samples: radius * 2 + color: Qt.rgba(0, 0, 0, 0.5) + } + + anchors { + centerIn: cfg.counterCenter ? parent : undefined + top: (!cfg.counterCenter && cfg.counterTop && !cfg.counterBottom) ? frame.top : undefined + bottom: (!cfg.counterCenter && cfg.counterBottom && !cfg.counterTop) ? frame.bottom : undefined + left: (!cfg.counterCenter && cfg.counterLeft && !cfg.counterRight) ? frame.left : undefined + right: (!cfg.counterCenter && cfg.counterRight && !cfg.counterLeft) ? frame.right : undefined + } + } + + Label { + id: counter + anchors.centerIn: counterFrame + text: sts.count + font.family: plasmoid.configuration.counterFontFamily || Kirigami.Theme.defaultFont + font.pixelSize: Math.max(trayIcon.height / 4, Kirigami.Theme.smallFont.pixelSize + cfg.counterSize) + font.bold: cfg.counterFontBold + color: cfg.counterColor ? darkColor(counterFrame.color) ? lightText : darkText : Kirigami.Theme.textColor + smooth: true + visible: counterFrame.visible + } + + QQC.Badge { + iconName: errorIcon + iconColor: Kirigami.Theme.negativeTextColor + visible: counterOverlay && sts.err + } + QQC.Badge { + iconName: updatedIcon + iconColor: Kirigami.Theme.positiveTextColor + visible: counterOverlay && sts.updated + } + QQC.Badge { + iconName: pausedIcon + iconColor: Kirigami.Theme.neutralTextColor + visible: counterOverlay && sts.paused + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Compact.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Compact.qml new file mode 100644 index 0000000..aa5a148 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Compact.qml @@ -0,0 +1,73 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import org.kde.plasma.components +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS +import "../components" + +ScrollView { + id: view + ScrollBar.vertical.policy: (sts.count === 0 || sts.busy || sts.err) ? ScrollBar.AlwaysOff : ScrollBar.AsNeeded + ListView { + model: modelList + delegate: GridLayout { + visible: sts.pending + property var heightItem: Math.round(Kirigami.Theme.defaultFont.pointSize * 1.5) + property var column: view.width / 2 + height: heightItem + cfg.spacing + Rectangle { + id: icon + property bool isHovering: false + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + height: heightItem + width: height + color: "transparent" + Kirigami.Icon { + anchors.centerIn: parent + height: heightItem + width: height + source: !icon.isHovering ? model.IC : "edit-download" + } + + Loader { + width: parent.width - (Kirigami.Units.largeSpacing * 4) + anchors.fill: parent + active: model.ID || model.CN + sourceComponent: MouseArea { + id: hoverIcon + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onEntered: icon.isHovering = true + onExited: icon.isHovering = false + onClicked: JS.upgradePackage(model.NM, model.ID, model.CN) + } + } + } + Label { + Layout.minimumWidth: column + Layout.maximumWidth: column + text: model.IM ? "" + model.NM + "" : model.NM + elide: Text.ElideRight + } + Label { + Layout.minimumWidth: column + Layout.maximumWidth: column + text: model.RE + " → " + model.VN + elide: Text.ElideRight + } + } + + Placeholder { + anchors.fill: parent + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Extended.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Extended.qml new file mode 100644 index 0000000..72c740f --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/Extended.qml @@ -0,0 +1,136 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import org.kde.ksvg +import org.kde.plasma.extras +import org.kde.plasma.components +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS +import "../components" + +ScrollView { + ScrollBar.vertical.policy: (sts.count === 0 || sts.busy || sts.err) ? ScrollBar.AlwaysOff : ScrollBar.AsNeeded + contentItem: ListView { + model: modelList + boundsBehavior: Flickable.StopAtBounds + highlight: Highlight { visible: sts.idle } + highlightMoveDuration: Kirigami.Units.shortDuration + highlightResizeDuration: Kirigami.Units.shortDuration + height: parent.height + + delegate: ExpandableListItem { + visible: sts.pending + property var pkg: [] + allowStyledText: true + title: model.IM ? "" + model.NM + "" : model.NM + subtitle: model.RE + " " + model.VO + " → " + model.VN + icon: model.IC + + function getContextualActions() { + var actions = [] + if (model.ID || model.CN) { + actions.push(updateButton) + } + return actions + } + + Action { + id: updateButton + icon.name: "edit-download" + text: i18n("Upgrade package") + enabled: cfg.terminal + onTriggered: JS.upgradePackage(model.NM, model.ID, model.CN) + } + + contextualActions: getContextualActions() + + customExpandedViewContent: Component { + ColumnLayout { + spacing: 0 + + SvgItem { + Layout.fillWidth: true + imagePath: "widgets/line" + elementId: "horizontal-line" + visible: contextualActions.length === 0 + } + + Item { + Layout.preferredHeight: Kirigami.Units.smallSpacing * 2 + } + + MouseArea { + Layout.fillWidth: true + Layout.preferredHeight: details.implicitHeight + // acceptedButtons: Qt.RightButton + activeFocusOnTab: repeater.count > 0 + + GridLayout { + id: details + width: parent.width + columns: 2 + rowSpacing: Kirigami.Units.smallSpacing / 4 + columnSpacing: 40 + + Repeater { + id: repeater + model: pkg.length + + Label { + property bool header: !(index % 2) + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop + horizontalAlignment: Text.AlignLeft + font: Kirigami.Theme.smallFont + opacity: header ? 0.6 : 1 + text: header ? "" + pkg[index] + ":" : pkg[index].indexOf("://") !== -1 ? "" + pkg[index] + "" : pkg[index] + textFormat: header ? Text.StyledText : pkg[index].indexOf("://") !== -1 ? Text.StyledText : Text.PlainText + wrapMode: header ? Text.NoWrap : Text.WordWrap + onLinkActivated: Qt.openUrlExternally(link) + } + } + } + } + + Item { + Layout.preferredHeight: Kirigami.Units.smallSpacing * 2 + } + + Component.onCompleted: { + const details = [] + model.TP && details.push(i18n("Package type"), model.TP) + model.DE && details.push(i18n("Description"), model.DE) + model.AU && details.push(i18n("Author"), model.AU) + model.LN && details.push("URL", model.LN) + model.ID && details.push(i18n("App ID"), model.ID) + model.BR && details.push(i18n("Branch"), model.BR) + model.CM && details.push(i18n("Commit"), model.CM) + model.RT && details.push(i18n("Runtime"), model.RT) + model.GR && details.push(i18n("Groups"), model.GR) + model.PR && details.push(i18n("Provides"), model.PR) + model.DP && details.push(i18n("Depends on"), model.DP) + model.RQ && details.push(i18n("Required by"), model.RQ) + model.CF && details.push(i18n("Conflicts with"), model.CF) + model.RP && details.push(i18n("Replaces"), model.RP) + model.IS && details.push(i18n("Installed size"), model.IS) + model.DS && details.push(i18n("Download size"), model.DS) + model.DT && details.push(i18n("Install date"), model.DT) + model.RN && details.push(i18n("Install reason"), model.RN) + pkg = details + } + } + } + } + + Placeholder { + anchors.fill: parent + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/News.qml b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/News.qml new file mode 100644 index 0000000..b994002 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/contents/ui/scrollview/News.qml @@ -0,0 +1,126 @@ +/* + SPDX-FileCopyrightText: 2024 Evgeny Kazantsev + SPDX-License-Identifier: MIT +*/ + +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls as Controls + +import org.kde.plasma.components +import org.kde.kirigami as Kirigami + +import "../../tools/tools.js" as JS + +ScrollView { + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + ListView { + model: activeNewsModel + spacing: Kirigami.Units.largeSpacing * 2 + topMargin: spacing + rightMargin: spacing + leftMargin: spacing + bottomMargin: spacing + + // add: Transition { NumberAnimation { properties: "x"; from: 100; duration: Kirigami.Units.longDuration } } NEWS SPACING PATCH + removeDisplaced: Transition { NumberAnimation { properties: "x,y"; duration: Kirigami.Units.longDuration } } + remove: Transition { ParallelAnimation { + NumberAnimation { property: "opacity"; to: 0; duration: Kirigami.Units.longDuration } + NumberAnimation { properties: "x"; to: 100; duration: Kirigami.Units.longDuration }}} + + delegate: Kirigami.AbstractCard { + contentItem: Item { + implicitWidth: delegateLayout.implicitWidth + implicitHeight: delegateLayout.implicitHeight + GridLayout { + id: delegateLayout + anchors { + left: parent.left + top: parent.top + right: parent.right + } + rowSpacing: Kirigami.Units.largeSpacing + columnSpacing: Kirigami.Units.largeSpacing + columns: width > Kirigami.Units.gridUnit * 20 ? 4 : 2 + Kirigami.Icon { + Layout.fillHeight: true + Layout.maximumHeight: Kirigami.Units.iconSizes.huge + Layout.preferredWidth: height + source: model.title.includes("Arch") ? "apdatifier-plasmoid" : + model.title.includes("Plasma") ? "note-symbolic" : + model.title.includes("Apps") ? "applications-all-symbolic" : + model.title.includes("Community") ? "start-here-kde-plasma-symbolic" + : "news-subscribe" + } + + RowLayout { + ColumnLayout { + Controls.Label { + Layout.fillWidth: true + wrapMode: Text.WordWrap + text: model.title + font.bold: true + } + Controls.Label { + Layout.fillWidth: true + wrapMode: Text.WordWrap + text: model.date + opacity: 0.6 + } + Kirigami.Separator { + Layout.fillWidth: true + } + Controls.Label { + Layout.fillWidth: true + wrapMode: Text.WordWrap + text: model.article + } + } + + ColumnLayout { + Controls.Button { + ToolTip { id: tip; text: i18n("Read article") } + icon.name: "internet-web-browser-symbolic" + onClicked: { + tip.hide() + Qt.openUrlExternally(model.link) + } + } + Controls.Button { + ToolTip { text: i18n("Remove") } + icon.name: "delete" + onClicked: JS.removeNewsItem(index) + } + } + } + } + } + } + + Loader { + width: parent.width + active: sts.busy && (sts.statusIco === "status_news" || sts.statusIco === "news-subscribe") + sourceComponent: ProgressBar { + from: 0 + to: 100 + indeterminate: true + } + } + + Loader { + anchors.centerIn: parent + active: activeNewsModel.count === 0 + sourceComponent: Kirigami.PlaceholderMessage { + icon.name: "news-subscribe" + text: i18n("No unread news") + helpfulAction: Kirigami.Action { + enabled: newsModel.count > 0 + icon.name: "backup" + text: i18n("Restore list") + onTriggered: JS.restoreNewsList() + } + } + } + } +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/metadata.json b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/metadata.json new file mode 100644 index 0000000..8becae4 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/metadata.json @@ -0,0 +1,24 @@ +{ + "KPlugin": { + "Authors": [ + { + "Name": "Evgeny Kazantsev", + "Email": "exequtic@gmail.com" + } + ], + "Category": "System Information", + "Description": "Arch Update Notifier", + "Icon": "apdatifier-plasmoid", + "Id": "com.github.exequtic.apdatifier", + "Name": "Apdatifier", + "EnabledByDefault": false, + "Version": "2.9.4", + "License": "MIT", + "BugReportUrl": "https://github.com/exequtic/apdatifier/issues", + "Website": "https://github.com/exequtic/apdatifier" + }, + "KPackageStructure": "Plasma/Applet", + "X-Plasma-API-Minimum-Version": "6.0", + "X-Plasma-NotificationArea": "true", + "X-Plasma-NotificationAreaCategory": "SystemServices" +} diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/ReadMe.md b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/ReadMe.md new file mode 100644 index 0000000..891c5a1 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/ReadMe.md @@ -0,0 +1,33 @@ +> Version 7 of Zren's i18n scripts. + +## New Translations + +Fill out [`template.pot`](template.pot) with your translations then open a [new issue](https://github.com/exequtic/apdatifier/issues/new), name the file with the extension `.txt`, attach the txt file to the issue (drag and drop). + +Or if you know how to make a pull request: + +Copy the [`template.pot`](template.pot) file to [`./po`](po) directory and name it your locale's code (Eg: `en`/`de`/`fr`) with the extension `.po`. Then fill out all the `msgstr ""`. + +## Scripts + +* `sh ./merge` will parse the `i18n()` calls in the `*.qml` files and write it to the `template.pot` file. Then it will merge any changes into the `*.po` language files. +* `sh ./build` will convert the `*.po` files to it's binary `*.mo` version and move it to `contents/locale/...` + +## Links + +* https://zren.github.io/kde/docs/widget/#translations-i18n +* https://github.com/Zren/plasma-applet-lib/tree/master/package/translate + +## Status +| Locale | Lines | % Done| +|----------|---------|-------| +| Template | 256 | | +| de | 256/256 | 100% | +| es | 256/256 | 100% | +| fr | 256/256 | 100% | +| ko | 130/256 | 50% | +| nl | 256/256 | 100% | +| pl | 256/256 | 100% | +| pt_BR | 256/256 | 100% | +| ru | 256/256 | 100% | +| zh | 256/256 | 100% | diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/build b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/build new file mode 100644 index 0000000..b632516 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/build @@ -0,0 +1,53 @@ +#!/bin/bash +# Version: 6 + +# This script will convert the *.po files to *.mo files, rebuilding the package/contents/locale folder. +# Feature discussion: https://phabricator.kde.org/D5209 +# Eg: contents/locale/fr_CA/LC_MESSAGES/plasma_applet_org.kde.plasma.eventcalendar.mo + +DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` +plasmoidName=com.github.exequtic.apdatifier +widgetName="${plasmoidName##*.}" # Strip namespace +website=https://github.com/exequtic/apdatifier +bugAddress="$website" +packageRoot=".." # Root of translatable sources +projectName="plasma_applet_${plasmoidName}" # project name + +#--- +if [ -z "$plasmoidName" ]; then + echo "[build] Error: Couldn't read plasmoidName." + exit +fi + +if [ -z "$(which msgfmt)" ]; then + echo "[build] Error: msgfmt command not found. Need to install gettext" + echo "[build] Running 'sudo apt install gettext'" + sudo apt install gettext + echo "[build] gettext installation should be finished. Going back to installing translations." +fi + +#--- +echo "[build] Compiling messages" + +catalogs=`find ./po -name '*.po' | sort` +for cat in $catalogs; do + catLocale=`basename ${cat%.*}` + msgfmt -o "${catLocale}.mo" "$cat" + + installPath="$DIR/../contents/locale/${catLocale}/LC_MESSAGES/${projectName}.mo" + + echo "[build] Install ${cat} to ${installPath}" + mkdir -p "$(dirname "$installPath")" + mv "${catLocale}.mo" "${installPath}" +done + +echo "[build] Done building messages" + +if [ "$1" = "--restartplasma" ]; then + echo "[build] Restarting plasmashell" + killall plasmashell + kstart5 plasmashell + echo "[build] Done restarting plasmashell" +else + echo "[build] (re)install the plasmoid and restart plasmashell to test." +fi diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/merge b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/merge new file mode 100644 index 0000000..80090bf --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/merge @@ -0,0 +1,165 @@ +#!/bin/bash +# Version: 22 + +# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems +# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems/Outside_KDE_repositories +# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh + +DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` +plasmoidName=com.github.exequtic.apdatifier +widgetName="${plasmoidName##*.}" # Strip namespace +website=https://github.com/exequtic/apdatifier +bugAddress="$website" +packageRoot=".." # Root of translatable sources +projectName="plasma_applet_${plasmoidName}" # project name + +#--- +if [ -z "$plasmoidName" ]; then + echo "[merge] Error: Couldn't read plasmoidName." + exit +fi + +if [ -z "$(which xgettext)" ]; then + echo "[merge] Error: xgettext command not found. Need to install gettext" + echo "[merge] Running 'sudo apt install gettext'" + sudo apt install gettext + echo "[merge] gettext installation should be finished. Going back to merging translations." +fi + +#--- +echo "[merge] Extracting messages" +potArgs="--from-code=UTF-8 --width=200 --add-location=file" + +# See Ki18n's extract-messages.sh for a full example: +# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh#L25 +# The -kN_ and -kaliasLocale keywords are mentioned in the Outside_KDE_repositories wiki. +# We don't need -kN_ since we don't use intltool-extract but might as well keep it. +# I have no idea what -kaliasLocale is used for. Googling aliasLocale found only listed kde1 code. +# We don't need to parse -ki18nd since that'll extract messages from other domains. +find "${packageRoot}" -name '*.cpp' -o -name '*.h' -o -name '*.c' -o -name '*.qml' -o -name '*.js' -o -name 'messages' | sort > "${DIR}/infiles.list" +xgettext \ + ${potArgs} \ + --files-from="${DIR}/infiles.list" \ + -C -kde \ + -ci18n \ + -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 \ + -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ + -kxi18n:1 -kxi18nc:1c,2 -kxi18np:1,2 -kxi18ncp:1c,2,3 \ + -kkxi18n:1 -kkxi18nc:1c,2 -kkxi18np:1,2 -kkxi18ncp:1c,2,3 \ + -kI18N_NOOP:1 -kI18NC_NOOP:1c,2 \ + -kI18N_NOOP2:1c,2 -kI18N_NOOP2_NOSTRIP:1c,2 \ + -ktr2i18n:1 -ktr2xi18n:1 \ + -kN_:1 \ + -kaliasLocale \ + --package-name="${widgetName}" \ + --msgid-bugs-address="${bugAddress}" \ + -D "${packageRoot}" \ + -D "${DIR}" \ + -o "template.pot.new" \ + || \ + { echo "[merge] error while calling xgettext. aborting."; exit 1; } + +sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "template.pot.new" +sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in LANGUAGE"'/' "template.pot.new" +sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "template.pot.new" + +if [ -f "template.pot" ]; then + newPotDate=`grep "POT-Creation-Date:" template.pot.new | sed 's/.\{3\}$//'` + oldPotDate=`grep "POT-Creation-Date:" template.pot | sed 's/.\{3\}$//'` + sed -i 's/'"${newPotDate}"'/'"${oldPotDate}"'/' "template.pot.new" + changes=`diff "template.pot" "template.pot.new"` + if [ ! -z "$changes" ]; then + # There's been changes + sed -i 's/'"${oldPotDate}"'/'"${newPotDate}"'/' "template.pot.new" + mv "template.pot.new" "template.pot" + + addedKeys=`echo "$changes" | grep "> msgid" | cut -c 9- | sort` + removedKeys=`echo "$changes" | grep "< msgid" | cut -c 9- | sort` + echo "" + echo "Added Keys:" + echo "$addedKeys" + echo "" + echo "Removed Keys:" + echo "$removedKeys" + echo "" + + else + # No changes + rm "template.pot.new" + fi +else + # template.pot didn't already exist + mv "template.pot.new" "template.pot" +fi + +potMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "template.pot" | grep -c 'msgstr ""')` +echo "| Locale | Lines | % Done|" > "./Status.md" +echo "|----------|---------|-------|" >> "./Status.md" +entryFormat="| %-8s | %7s | %5s |" +templateLine=`perl -e "printf(\"$entryFormat\", \"Template\", \"${potMessageCount}\", \"\")"` +echo "$templateLine" >> "./Status.md" + +rm "${DIR}/infiles.list" +echo "[merge] Done extracting messages" + +#--- +echo "[merge] Merging messages" +catalogs=`find ./po -name '*.po' | sort` +for cat in $catalogs; do + echo "[merge] $cat" + catLocale=`basename ${cat%.*}` + + widthArg="" + catUsesGenerator=`grep "X-Generator:" "$cat"` + if [ -z "$catUsesGenerator" ]; then + widthArg="--width=400" + fi + + compendiumArg="" + if [ ! -z "$COMPENDIUM_DIR" ]; then + langCode=`basename "${cat%.*}"` + compendiumPath=`realpath "$COMPENDIUM_DIR/compendium-${langCode}.po"` + if [ -f "$compendiumPath" ]; then + echo "compendiumPath=$compendiumPath" + compendiumArg="--compendium=$compendiumPath" + fi + fi + + cp "$cat" "$cat.new" + sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "$cat.new" + + msgmerge \ + ${widthArg} \ + --add-location=file \ + --no-fuzzy-matching \ + ${compendiumArg} \ + -o "$cat.new" \ + "$cat.new" "${DIR}/template.pot" + + sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new" + sed -i 's/# Translation of '"${widgetName}"' in LANGUAGE/'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new" + sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "$cat.new" + + poEmptyMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "$cat.new" | grep -c 'msgstr ""')` + poMessagesDoneCount=`expr $potMessageCount - $poEmptyMessageCount` + poCompletion=`perl -e "printf(\"%d\", $poMessagesDoneCount * 100 / $potMessageCount)"` + poLine=`perl -e "printf(\"$entryFormat\", \"$catLocale\", \"${poMessagesDoneCount}/${potMessageCount}\", \"${poCompletion}%\")"` + echo "$poLine" >> "./Status.md" + + # mv "$cat" "$cat.old" + mv "$cat.new" "$cat" +done +echo "[merge] Done merging messages" + +#--- +# Populate ReadMe.md +echo "[merge] Updating translate/ReadMe.md" +sed -i -E 's`share\/plasma\/plasmoids\/(.+)\/translate`share/plasma/plasmoids/'"${plasmoidName}"'/translate`' ./ReadMe.md +if [[ "$website" == *"github.com"* ]]; then + sed -i -E 's`\[new issue\]\(https:\/\/github\.com\/(.+)\/(.+)\/issues\/new\)`[new issue]('"${website}"'/issues/new)`' ./ReadMe.md +fi +sed -i '/^|/ d' ./ReadMe.md # Remove status table from ReadMe +cat ./Status.md >> ./ReadMe.md +rm ./Status.md + +echo "[merge] Done" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/de.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/de.po new file mode 100644 index 0000000..a1db47d --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/de.po @@ -0,0 +1,1248 @@ +# Translation of apdatifier in de +# Copyright (C) 2024 +# This file is distributed under the same license as the apdatifier package. +# +# SPDX-FileCopyrightText: 2024 Peter Boos +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2024-06-15 01:04+0200\n" +"Last-Translator: Peter Boos \n" +"Language-Team: German \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 24.05.1\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Allgemein" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Aktualisierung" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Erscheinungsbild" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Regeln" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Unterstütze mich" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Upgrade wird durchgeführt" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Vollständiges System-Upgrade" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Flatpak Upgrade" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Plasma Widgets Upgrade" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Gesamtlaufzeit" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "" +"Kritische(r) Paket(e) aktualisiert, ein Neustart könnte erforderlich sein:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Möchten Sie jetzt neu starten?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Eingabetaste drücken zum Beenden" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Übersprungen..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Abrufen der letzten gefilterten Spiegelserverliste" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "" +"Ranking der Spiegelserver nach ihrer Verbindungs- und Öffnungsgeschwindigkeit" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Überprüfen Sie die Einstellungen Ihres Spiegellistengenerators..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "wurde mit den folgenden Servern aktualisiert:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "Um in die Mirrorlist-Datei zu schreiben, sind sudo-Rechte erforderlich" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Ihre aktuelle Spiegelserverliste:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"Nach dem Upgrade mancher Widgets, müssen Sie sich neu anmelden oder " +"Plasmashell neu starten" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Prüfe Widgets auf Aktualisierungen" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Daten von der API abrufen" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Download-Link abrufen" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Packet herrunterladen" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Mit dem Upgrade fortfahren?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Plasmashell jetzt neu starten?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Keine Beschreibung" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"Zu viele API-Anfragen in den letzten 15 Minuten von Ihrer IP-Adresse, bitte " +"versuchen Sie es später noch einmal" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Daten konnten nicht von der API abgerufen werden" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Unbekannter Fehler" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Die Datei metadata.json wurde nicht gefunden" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Fehler in der Datei metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Nicht unterstütztes Dateiformat" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Keine Dateien zum downloaden" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Keine Datei mit dieser Version markiert" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Mehrere Dateien sind mit dieser Version markiert" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Download des Packets fehlgeschlagen" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Alle verfügbaren Pakete in Repositories auflisten" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Alle installierten Pakete auflisten" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Explizit installierte Pakete auflisten" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "" +"Explizit installierte Pakete auflisten, die nicht als Abhängigkeiten " +"installiert wurden" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "" +"Installierte Abhängigkeiten auflisten, die nicht mehr benötigt werden " +"(Waisen)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Verwaiste Pakete deinstallieren" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Pakete aus dem Zwischenspeicher installieren (downgraden)" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "ALLE zwischengespeicherten Pakete entfernen" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "" +"Zwischengespeicherte Pakete entfernen, die derzeit nicht installiert sind" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "AUR Python-Pakete neu erstellen nach einem Python-Upgrade" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Spiegelserverliste auffrischen" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Verlassen" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Überprüfung von Warnungen vor dem Entfernen von Abhängigkeiten" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Fortfahren?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Drücken Sie die Enter, um zum Menü zurückzukehren" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Suche:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Ausgeführt:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Nichts zu tun" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Erforderlich installiert" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Exit-Code:" + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Prüfe aktuelle Nachrichten..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Nachrichten können nicht abgerufen werden " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Prüfe auf Systemaktualisierungen..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Prüfe auf Flatpak-Aktualisierungen..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Prüfe auf Widgets-Updates..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "Widgets können nicht überprüft werden: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "Letzter Commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 neues Update" +msgstr[1] "+%1 neue Updates" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "Update steht noch aus" +msgstr[1] "Updates stehen noch aus" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Letzte Prüfung:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 Sekunde" +msgstr[1] "%1 Sekunden" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 Minute" +msgstr[1] "%1 Minuten" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 Stunde" +msgstr[1] "%1 Stunden" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "vor" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Kein(e)" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Prüfe auf Updates" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "System aktualisieren" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Intervall wechseln" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Verwaltung" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Lese Artikel" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "System aktualisiert" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Panel-Symbolansicht" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Listenansicht" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Angezeigt, wenn" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "Update steht noch aus" +msgstr[1] "Updates stehen noch aus" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Voreinstellung" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Wählen..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Standard-Symbol" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Angehaltenes Intervall" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Aktivieren" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Zähler" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Farbe" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Standardfarbe" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Hintergrundfarbe des Zählers auswählen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Standard-Hintergrundfarbe des aktuellen Themas" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Größe" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Radius" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Deckkraft" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Schatten" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Schriftart" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Standard-Systemschriftart" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Fettschrift" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Schriftgröße" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Linker Abstand" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Seitenränder" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Versatz" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Position" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Mitte" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Oben links" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Oben rechts" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Unten links" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Unten rechts" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Integrierte Symbole" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "" +"Benutzerdefiniertes Symbolthema überschreiben und stattdessen die " +"Standardsymbole von Apdatifier verwenden." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Standard-Registerkarte" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Kompakt" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Erweitert" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Verhalten" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Immer zur Standard-Registerkarte wechseln" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Elementhöhe (Kompakt)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Sortierung" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Nach Repositorium" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Nach Name" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Überschrift" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Status anzeigen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Symbolleiste anzeigen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Fußzeile" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Registerkartenleiste anzeigen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Zeige Tab Texte" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Instalar a versão Dev" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Stabile Version installieren" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Widget entfernen" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Hinweis: Die Version mit den neuesten Commits kann instabil sein." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" +"Hinweis: Wenn Sie die Devel-Version zuvor nicht installiert haben, ist es " +"nicht nötig, die Stable-Version zu installieren." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" +"Entfernung des Widgets und aller zugehörigen Dateien, einschließlich des " +"Verzeichnisses mit seiner Konfiguration." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Suche" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Maus-Aktionen" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Sonstiges" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"Die Konfiguration wird automatisch in einer Konfigurationsdatei gespeichert " +"und bei jedem Start geladen, sodass Sie Ihre Einstellungen nie verlieren. " +"Die Konfigurationsdatei wird gespeichert in " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" nicht installiert! Es wird dringend empfohlen, es zu installieren, um die " +"neuesten Updates zu erhalten, ohne neue Paketdatenbanken herunterladen zu " +"müssen." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Intervall" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "Minuten" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "" +"Der aktuelle Timer wird zurückgesetzt, wenn eine dieser Einstellungen " +"geändert wird." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Prüfung beim Start" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"Ist die Option aktiviert, beginnt die Aktualisierungsprüfung sofort " +"nach dem Start des Widgets. .

Ist die Option deaktiviert, " +"wird die Aktualisierungsprüfung nach einem bestimmten Zeitintervall nach dem " +"Start des Widgets eingeleitet. Empfohlen." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Updates" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Arch offizielle Repositorien" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Arch Nutzer Repositorien" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Flatpak-Anwendungen" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Nicht installiert" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Plasma Widgets" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

Für Widget-Entwickler:
Vergessen Sie nicht, die metadata.json zu " +"aktualisieren und den Namen des Applets und seine Version genau so " +"anzugeben, wie sie im im KDE Store erscheinen." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Nachrichten" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Arch Linux Nachrichten" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Behalten" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "Nachricht aus dem Feed" +msgstr[1] "Nachrichten aus dem Feed" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Für neue Updates" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Aktionstaste" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Bei jedem Versionssprung" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"Wenn die Option aktiviert ist, werden Benachrichtigungen gesendet, " +"wenn eine neue Version des Pakets veröffentlicht wird, auch wenn das Paket " +"bereits auf der Liste steht. Weitere Benachrichtigungen: " +"

Wenn die Option deaktiviert ist, werden Benachrichtigungen " +"nur für Pakete gesendet, die noch nicht noch nicht auf der Liste stehen. " +"Weniger Benachrichtigungen." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Für Nachrichten" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Für Fehler" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Ton" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Persistente" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" +"Um weitere Einstellungen vorzunehmen, klicken Sie auf die Schaltfläche unten " +"-> Anwendungsspezifische Einstellungen -> Apdatierer" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Konfigurieren..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Mittelklick" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Rechtsklick" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" +"Aktivieren Sie diese Option nicht, wenn das Widget nicht im Systemtray " +"verwendet wird; andernfalls können Sie die Einstellungen nicht durch " +"Rechtsklick öffnen." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Nach oben scrollen" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Nach unten scrollen" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Verborgene Tooltips wiederherstellen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Unwichtig" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Repository" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Exakte Repository-Übereinstimmung" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Gruppe" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Übereinstimmung mit Teilzeichenfolge in der Gruppe" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Übereinstimmung" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Übereinstimmung mit Teilzeichenfolge im Namen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Name" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Exakte Namensübereinstimmung" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"Hier können Sie die Standardsymbole der Pakete überschreiben und aus der " +"Liste ausschließen. Jede Regel überschreibt die vorherige, daher sollte die " +"Liste der Regeln in dieser Reihenfolge stehen: " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Als wichtig markieren" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "In der Liste anzeigen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Von der Liste ausschließen" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Entfernen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Regel hinzufügen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Anwenden" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"Danke für die Nutzung meines Widgets! Wenn du meine Arbeit schätzt, kannst " +"du mich unterstützen, indem du das GitHub-Repository unterstützst oder mir " +"einen Kaffee spendierst ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Besuch %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widgets" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Benutze Nerd-Schriftartsymbole" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" +"Wenn Ihr Terminal eine Nerd-Schriftart verwendet, werden die Symbole " +"dieser Schriftart verwendet." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "tmux-Sitzung" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Pre-/Post-Upgrade-Skripte" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Pre-Ausführung" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Befehl oder Skriptpfad" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"Führen Sie Ihren Befehl oder Ihr Skript VOR dem Upgrade aus.
Zum Beispiel " +"können Sie einen Befehl angeben, um die Mirrorlist zu aktualisieren, wenn " +"Sie inoffizielle Repositories haben." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Post-Ausführung" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"Führen Sie Ihren Befehl oder Ihr Skript NACH dem Upgrade aus.
Zum " +"Beispiel können Sie einen Befehl angeben, um etwas anderes zu aktualisieren." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Hülle" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR in den Sucheinstellungen deaktiviert" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Upgrade-Optionen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "System neu starten" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Nach dem Upgrade vorschlagen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Pacman-Spiegellisten-Generator" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Nur für offizielle Repositories" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

Siehe auch https://archlinux.org/mirrorlist (klicken Sie auf die " +"Schaltfläche, um den Link zu öffnen)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Generator" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Deaktiviert" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Immer fragen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Fragen, wenn älter als" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "Tag" +msgstr[1] "Tage" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Nicht fragen, erzwingen aktualisieren" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protokoll" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "IP-Version" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Status des Spiegelservers" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Nummernausgabe" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "" +"Anzahl der Server, die in die Spiegelserverlisten-Datei geschrieben werden " +"sollen. 0 für alle." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "Land" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Mindestens eine(n) auswählen!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"Sie müssen mindestens ein Land auswählen, sonst werden standardmäßig alle " +"Länder ausgewählt. Je mehr Länder Sie auswählen, desto länger dauert es, die " +"Spiegel zu erstellen!

Optimal ist es die Länder auszuwählen, " +"1-2 die Ihnen am nächsten liegen." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Nicht verwendete entfernen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normal, Fragen überspringen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Nicht interaktiv, Fragen überspringen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Ausführlich" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Upgrade-Bestätigung" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Plasmashell neustarten" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"Nach der Aktualisierung des Widgets verbleibt die alte Version im Speicher, " +"bis SiePlasmashell neu starten. Um zu vermeiden dies manuell machen zu " +"müssen, aktivieren Sie diese Option." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Befehl" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Apdatifier-Tray-Symbol" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Standardmäßig aktiviert" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Automatische Prüfung deaktiviert" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Nach Paketname filtern" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Automatische Suche nach Updates deaktivieren" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Automatische Suche nach Updates aktivieren" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Pakete nach Namen sortieren" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Pakete nach Repository sortieren" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Prüfung stoppen" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Kompakte Ansicht" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Erweiterte Ansicht" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Versionshinweise ansehen" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Ablehnen" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Upgrade Paket" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Pakettyp" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Beschreibung" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Autor" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "App-ID" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Zweig" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Laufzeit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Gruppen" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Bereitsstellung" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Hängt ab von" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Wird benötigt von" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Steht im Konflikt mit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Ersetzt" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Installationsgröße" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Downloadgröße" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Installationsdatum" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Installationsgrund" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Keine ungelesene Nachrichten" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Wiederherstellungs-Liste" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Lesen Sie das Arch Wiki - Partielle Upgrades" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "" +#~ "Führen Sie ein vollständiges System-Upgrade statt eines Teil-Upgrades " +#~ "durch!" + +#~ msgid "View" +#~ msgstr "Ansicht" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Vor einem Upgrade vorschlagen" + +#~ msgid "Options" +#~ msgstr "Optionen" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "" +#~ "einige erforderliche Dienstprogramme sind nicht installiert (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "" +#~ "Sie können die Registerkarten auch wechseln, indem Sie die Maus mit " +#~ "gedrückter rechter Maustaste nach links und rechts ziehen." + +#~ msgid "Hide \"News\" tab if no content" +#~ msgstr "\"News\"-Tab ausblenden, wenn kein Inhalt vorhanden ist" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/es.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/es.po new file mode 100644 index 0000000..1328576 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/es.po @@ -0,0 +1,1105 @@ +# Traducción de apdatifier en Español +# Copyright (C) 2025 +# Este archivo se distribuye bajo la misma licencia que el paquete apdatifier. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2024-05-27 15:58-0600\n" +"Last-Translator: RodvinSanchez\n" +"Language-Team: Español\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "General" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Actualizar" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Apariencia" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Reglas" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Apóyame" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Actualización en progreso" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Actualización completa del sistema" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Actualización de Flatpak" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Actualización de Widgets de Plasma" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Tiempo total de ejecución:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "Paquete(s) crítico(s) actualizado(s), puede ser necesario reiniciar:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "¿Deseas reiniciar ahora?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Presiona Enter para cerrar" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Omitido..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Obteniendo la lista de espejos filtrados más reciente" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Clasificando espejos por su velocidad de conexión y apertura" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Verifica la configuración de tu generador de lista de espejos..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "fue actualizado con los siguientes servidores:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "Para escribir en el archivo mirrorlist, se requieren privilegios de sudo" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Tu lista de espejos actual:" + +#: ../contents/tools/sh/messages +msgid "For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "Para algunos widgets, puede que necesites cerrar sesión o reiniciar plasmashell después de actualizar" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Verificando actualizaciones de widgets" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Obteniendo datos de la API" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Obteniendo el enlace de descarga" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Descargando paquete" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "¿Continuar con la actualización?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "¿Reiniciar plasmashell ahora?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Sin descripción" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Too many API requests in the last 15 minutes from your IP address, please try again later" +msgstr "Demasiadas solicitudes a la API en los últimos 15 minutos desde tu dirección IP, por favor intenta nuevamente más tarde" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Error al obtener datos de la API" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Error desconocido" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Archivo metadata.json no encontrado" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Errores en el archivo metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Formato de archivo no soportado" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "No hay archivos para descargar" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Ningún archivo etiquetado con versión" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Múltiples archivos están etiquetados con versión" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Error al descargar el paquete" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Listar todos los paquetes disponibles en los repositorios" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Listar todos los paquetes instalados" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Listar paquetes instalados explícitamente" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "Listar paquetes instalados explícitamente y que no son dependencia de nada" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "Listar dependencias instaladas que ya no son necesarias (huérfanos)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Desinstalar paquetes huérfanos" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Instalar (revertir) un paquete desde la caché" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "Eliminar TODOS los paquetes en caché" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "Eliminar paquetes en caché que no están actualmente instalados" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Reconstruir paquetes Python de AUR después de actualizar Python" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Actualizar lista de espejos" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Salir" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Revisar advertencias de dependencias antes de eliminar" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "¿Continuar?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Presiona Enter para volver al menú" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Buscar:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Ejecutado:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Nada que hacer" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Requerido instalado" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Código de salida: " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Verificando las últimas noticias..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "No se pueden obtener noticias " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Verificando actualizaciones del sistema..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Verificando actualizaciones de Flatpak..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Verificando actualizaciones de widgets..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "No se pueden verificar widgets: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "último commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 nueva actualización" +msgstr[1] "+%1 nuevas actualizaciones" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "actualización pendiente" +msgstr[1] "actualizaciones pendientes" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Última verificación:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 segundo" +msgstr[1] "%1 segundos" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minutos" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 hora" +msgstr[1] "%1 horas" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "hace" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Ninguno" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Verificar actualizaciones" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/components/Notification.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Actualizar sistema" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Cambiar intervalo" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Gestión" + +#: ../contents/ui/components/Notification.qml ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Leer artículo" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "Sistema actualizado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Vista de icono en panel" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Vista de lista" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Mostrar cuando" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "actualización pendiente " +msgstr[1] "actualizaciones pendientes " + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Predeterminado" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Seleccionar..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Icono predeterminado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Intervalo detenido" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Habilitar" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Contador" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Color" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Color predeterminado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Seleccionar color de fondo del contador" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Color de fondo predeterminado del tema actual" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Tamaño" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Radio" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Opacidad" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Sombra" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Fuente" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Fuente del sistema predeterminada" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Fuente en negrita" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Tamaño de fuente" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Espaciado izquierdo" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Márgenes laterales" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Desplazamiento" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Posición" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Centro" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Arriba-Izquierda" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Arriba-Derecha" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Abajo-Izquierda" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Abajo-Derecha" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Usar iconos integrados" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "Anular el tema de iconos personalizado y usar los iconos predeterminados de Apdatifier." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Pestaña predeterminada" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Compacto" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Extendido" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Comportamiento" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Siempre cambiar a la pestaña predeterminada" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Altura de los elementos (Compacto)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Ordenación" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Por repositorio" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Por nombre" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Encabezado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Mostrar estado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Mostrar barra de herramientas" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Pie de página" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Mostrar barra de pestañas" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Mostrar textos de pestañas" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Instalar versión de Desarrollo" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Instalar versión Estable" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Desinstalar widget" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Nota: la versión con los últimos commits puede ser inestable." + +#: ../contents/ui/configuration/General.qml +msgid "Note: if you haven't installed the Devel version before, there's no need to install the Stable version." +msgstr "Nota: si no has instalado antes la versión Devel, no es necesario instalar la versión Estable." + +#: ../contents/ui/configuration/General.qml +msgid "Removal of the widget and all related files, including the directory with its configuration." +msgstr "Eliminación del widget y todos los archivos relacionados, incluyendo el directorio con su configuración." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Buscar" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Notificaciones" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Acciones del ratón" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Varios" + +#: ../contents/ui/configuration/General.qml +msgid "Configuration is automatically saved in a config file and loaded at every startup, ensuring you never lose your settings. The config file is stored in " +msgstr "La configuración se guarda automáticamente en un archivo de configuración y se carga en cada inicio, asegurando que nunca pierdas tus ajustes. El archivo de configuración se almacena en " + +#: ../contents/ui/configuration/General.qml +msgid " not installed! Highly recommended to install it for getting the latest updates without the need to download fresh package databases." +msgstr " ¡no instalado! Muy recomendado instalarlo para obtener las últimas actualizaciones sin necesidad de descargar bases de datos de paquetes nuevas." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Intervalo" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "minutos" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "El temporizador actual se reinicia cuando se cambia cualquiera de estas configuraciones." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Verificar al iniciar" + +#: ../contents/ui/configuration/General.qml +msgid "If the option is enabled, update checking will begin immediately upon widget startup.

If the option is disabled, update checking will be initiated after a specified time interval has passed since the widget was started. Recommended." +msgstr "Si la opción está habilitada, la verificación de actualizaciones comenzará inmediatamente al iniciar el widget.

Si la opción está deshabilitada, la verificación de actualizaciones se iniciará después de que haya pasado un intervalo de tiempo especificado desde que se inició el widget. Recomendado." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Actualizaciones" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Repositorios Oficiales de Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Repositorio de Usuario de Arch (AUR)" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Aplicaciones Flatpak" + +#: ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "No instalado" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Widgets de Plasma" + +#: ../contents/ui/configuration/General.qml +msgid "

For widget developers:
Don't forget to update the metadata.json and specify the name of the applet and its version exactly as they appear on the KDE Store." +msgstr "

Para desarrolladores de widgets:
No olvides actualizar el metadata.json y especificar el nombre del applet y su versión exactamente como aparecen en la KDE Store." + +#: ../contents/ui/configuration/General.qml ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Noticias" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Noticias de Arch Linux" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Mantener" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "noticia del feed" +msgstr[1] "noticias del feed" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Para nuevas actualizaciones" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Botón de acción" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Para cada cambio de versión" + +#: ../contents/ui/configuration/General.qml +msgid "If the option is enabled, notifications will be sent when a new version of the package is bumped, even if the package is already on the list. More notifications.

If the option is disabled, notifications will only be sent for packages that are not yet on the list. Less notifications." +msgstr "Si la opción está habilitada, se enviarán notificaciones cuando haya un nuevo cambio de versión del paquete, incluso si el paquete ya está en la lista. Más notificaciones.

Si la opción está deshabilitada, las notificaciones solo se enviarán para paquetes que aún no están en la lista. Menos notificaciones." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Para noticias" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Para errores" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Con sonido" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Persistente" + +#: ../contents/ui/configuration/General.qml +msgid "To further configure, click the button below -> Application Settings -> Apdatifier" +msgstr "Para configurar más, haz clic en el botón de abajo -> Configuración de la aplicación -> Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Configurar..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Clic medio" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Clic derecho" + +#: ../contents/ui/configuration/General.qml +msgid "Do not enable this option if the widget is not used in the system tray; otherwise, you will not be able to open the settings by right-clicking." +msgstr "No habilites esta opción si el widget no se usa en la bandeja del sistema; de lo contrario, no podrás abrir la configuración haciendo clic derecho." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Desplazar arriba" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Desplazar abajo" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Restaurar tooltips ocultos" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Poco importante" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Repositorio" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Coincidencia exacta de repositorio" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Grupo" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Coincidencia parcial de grupo" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Subcadena" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Coincidencia parcial de nombre" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Nombre" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Coincidencia exacta de nombre" + +#: ../contents/ui/configuration/Rules.qml +msgid "Here you can override the default package icons and exclude them from the list. Each rule overwrites the previous one, so the list of rules should be in this order: " +msgstr "Aquí puedes anular los iconos predeterminados de los paquetes y excluirlos de la lista. Cada regla sobrescribe la anterior, por lo que la lista de reglas debe estar en este orden: " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Marcar como importante" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Mostrar en la lista" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Excluir de la lista" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Eliminar" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Añadir regla" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Aplicar" + +#: ../contents/ui/configuration/Support.qml +msgid "Thanks for using my widget! If you appreciate my work, you can support me by starring the GitHub repository or buying me a coffee ;)" +msgstr "¡Gracias por usar mi widget! Si aprecias mi trabajo, puedes apoyarme dándole una estrella al repositorio en GitHub o invitándome un café ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Visitar %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widgets" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Usar iconos NerdFont" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "If your terminal utilizes any Nerd Font, icons from that font will be used." +msgstr "Si tu terminal utiliza alguna Nerd Font, se usarán los iconos de esa fuente." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "sesión de tmux" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Scripts pre/post actualización" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Pre-ejecución" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Ruta de comando o script" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script BEFORE the upgrade.
For example, you can specify your command to update the mirrorlist if you have unofficial repositories." +msgstr "Ejecutar tu comando o script ANTES de la actualización.
Por ejemplo, puedes especificar tu comando para actualizar la lista de espejos si tienes repositorios no oficiales." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Post-ejecución" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script AFTER the upgrade.
For example, you can specify your command to upgrade something else." +msgstr "Ejecutar tu comando o script DESPUÉS de la actualización.
Por ejemplo, puedes especificar tu comando para actualizar algo más." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Wrapper" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR deshabilitado en configuración de búsqueda" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Opciones de actualización" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Reiniciar sistema" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Sugerir después de actualizar" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Generador de lista de espejos de Pacman" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Solo para repositorios oficiales" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "

Ver también https://archlinux.org/mirrorlist (haz clic en el botón para abrir el enlace)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Generador" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Desactivado" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Preguntar siempre" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Preguntar si es más antiguo que" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "día" +msgstr[1] "días" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "No preguntar, forzar actualización" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protocolo" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "Versión IP" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Estado del espejo" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Número de salida" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "Número de servidores para escribir en el archivo mirrorlist. 0 para todos." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "País" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "¡Selecciona al menos uno!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "You must select at least one country, otherwise all will be chosen by default.

The more countries you select, the longer it will take to generate the mirrors!

It is optimal to choose 1-2 countries closest to you." +msgstr "Debes seleccionar al menos un país, de lo contrario, se elegirán todos por defecto.

¡Cuantos más países selecciones, más tiempo tardará en generar los espejos!

Es óptimo elegir 1-2 países más cercanos a ti." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Desinstalar no utilizados" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normal, omitir preguntas" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "No interactivo, omitir preguntas" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Detallado" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Confirmación de actualización" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Reiniciar plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "After upgrading widget, the old version will still remain in memory until you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "Después de actualizar el widget, la versión antigua permanecerá en memoria hasta que reinicies plasmashell. Para evitar hacer esto manualmente, activa esta opción." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Comando" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Icono de Apdatifier en la bandeja del sistema" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Activado por defecto" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Verificación automática desactivada" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Filtrar por nombre de paquete" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Desactivar búsqueda automática de actualizaciones" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Activar búsqueda automática de actualizaciones" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Ordenar paquetes por nombre" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Ordenar paquetes por repositorio" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Detener verificación" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Vista compacta" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Vista extendida" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Consultar notas de la versión" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Descartar" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Actualizar paquete" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Tipo de paquete" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Descripción" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Autor" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "ID de aplicación" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Rama" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Tiempo de ejecución" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Grupos" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Proporciona" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Depende de" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Requerido por" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Entra en conflicto con" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Reemplaza" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Tamaño instalado" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Tamaño de descarga" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Fecha de instalación" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Motivo de instalación" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "No hay noticias sin leer" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Restaurar lista" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Leer la Wiki de Arch - Actualizaciones parciales" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "¡Realiza una actualización completa del sistema en lugar de una parcial!" + +#~ msgid "View" +#~ msgstr "Vista" + +#~ msgid "Upgrade button" +#~ msgstr "Botón de actualización" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Sugerir antes de actualizar" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/fr.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/fr.po new file mode 100644 index 0000000..3cf4e23 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/fr.po @@ -0,0 +1,1244 @@ +# Translation of apdatifier in fr +# Copyright (C) 2025 +# This file is distributed under the same license as the apdatifier package. +# foXaCe, 2025 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2024-06-02 20:39+0200\n" +"Last-Translator: foXaCe\n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Général" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Mettre à jour" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Apparence" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Règles" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Me soutenir" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Mise à niveau en cours" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Mise à jour complète du système" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Mise à jour Flatpak" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Mise à jour des widgets Plasma" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Temps d'exécution total :" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "" +"Paquet(s) critique(s) mis à jour, un redémarrage peut être nécessaire :" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Voulez-vous redémarrer maintenant ?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Appuyez sur Entrée pour fermer" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Ignoré..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Obtenir une liste des derniers miroirs filtrés" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Trier les miroirs selon leur vitesse de connexion et d'ouverture" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Vérifiez les paramètres du générateur de liste de miroirs..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "a été mis à jour avec les serveurs suivants :" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "" +"Pour écrire dans le fichier mirrorlist, les privilèges sudo sont requis" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Votre liste de miroirs actuelle :" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"Pour certains widgets, vous devrez peut-être vous déconnecter ou redémarrer " +"plasmashell après la mise à niveau" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Vérification des mises à jour des widgets" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Récupération des données de l'API" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Obtention du lien de téléchargement" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Téléchargement du paquet" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Procéder à la mise à niveau ?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Redémarrer plasmashell maintenant ?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Aucune description" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"Trop de requêtes API depuis votre adresse IP ces 15 dernières minutes. " +"Veuillez réessayer plus tard" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Échec de la récupération des données de l'API" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Erreur inconnue" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Fichier metadata.json introuvable" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Erreurs dans le fichier metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Format de fichier non pris en charge" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Aucun fichier à télécharger" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Aucun fichier étiqueté avec la version" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Plusieurs fichiers sont étiquetés avec la version" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Échec du téléchargement du paquet" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Répertorier tous les paquets disponibles dans les dépôts" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Lister tous les paquets installés" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Répertorier les paquets explicitement installés" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "" +"Répertorie les paquets explicitement installés qui ne sont dépendances " +"d'aucun autre paquet" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "" +"Liste les dépendances installées qui ne sont plus nécessaires (orphelins)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Désinstaller les paquets orphelins" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Installer (rétrograder) un package à partir du cache" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "Supprimer TOUS les paquets en cache" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "" +"Supprimer les paquets mis en cache qui ne sont pas actuellement installés" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Reconstruire les paquets Python AUR après la mise à niveau de Python" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Actualiser la liste de miroirs" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Sortir" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Examinez les avertissements de dépendance avant de supprimer" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Reprendre ?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Appuyez sur Entrée pour revenir au menu" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Recherche" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Exécuté :" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Rien à faire" + +# Required installed +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Installation requise" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Code de sortie : " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Vérification des dernières nouvelles..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Impossible de récupérer les actualités " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Vérification des mises à jour du système..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Vérification des mises à jour de Flatpak..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Vérification des mises à jour des widgets..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "Impossible de vérifier les widgets : " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "dernier commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 nouvelle mise à jour" +msgstr[1] "+%1 nouvelles mises à jour" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "mise à jour en attente" +msgstr[1] "mises à jour en attente" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Dernière vérification :" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 seconde" +msgstr[1] "%1 secondes" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minute" +msgstr[1] "%1 minutes" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 heure" +msgstr[1] "%1 heures" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "depuis" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Aucune" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Vérifier les mises à jour" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Mise à niveau système" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Intervalle de changement" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Gestion" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Lire l'article" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "Système mis à jour" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Affichage des icônes du panneau" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Vue en liste" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Affiché lorsque" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "mise à jour en attente" +msgstr[1] "mises à jour en attente" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Défaut" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Sélectionner..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Icône par défaut" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Intervalle interrompu" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Activer" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Compteur" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Couleur" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Couleur par défaut" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Sélectionnez la couleur de fond du compteur" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Couleur d'arrière-plan par défaut du thème actuel" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Taille" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Rayon" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Opacité" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Ombre" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Police" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Police système par défaut" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Gras" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Taille de police" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Espacement à gauche" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Marges latérales" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Décalage" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Position" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Centre" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "En haut à gauche" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "En haut à droite" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "En bas à gauche" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "En bas à droite" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Utiliser les icônes intégrées" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "" +"Remplacer le thème d'icônes personnalisé et utiliser les icônes Apdatifier " +"par défaut à la place." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Onglet par défaut" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Compacte" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Étendue" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Comportement" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Toujours passer à l’onglet par défaut" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Hauteur des éléments (Compacte)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Tri" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Par référentiel" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Par nom" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "En-tête" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Afficher l'état" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Afficher la barre d'outils" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Pied de page" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Afficher la barre d'onglets" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Afficher les textes des onglets" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Installer la version de développement" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Installer la version stable" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Désinstaller le widget" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Remarque : la version avec les derniers commits peut être instable." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" +"Remarque : si vous n'avez pas installé la version de développement " +"auparavant, il n'est pas nécessaire d'installer la version stable." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" +"Suppression du widget et de tous les fichiers associés, y compris le " +"répertoire avec sa configuration." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Recherche" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Notifications" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Actions de la souris" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Divers" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"La configuration est automatiquement enregistrée dans un fichier de " +"configuration et chargée à chaque démarrage, garantissant que vous ne " +"perdrez jamais vos paramètres. Le fichier de configuration est stocké dans " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" n'est pas installé ! Il est fortement recommandé de l'installer pour " +"obtenir les dernières mises à jour sans avoir besoin de télécharger de " +"nouvelles bases de données de paquets." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Intervalle" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "minutes" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "" +"Le minuteur actuel est réinitialisé lorsque l'un de ces paramètres est " +"modifié." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Vérifier au démarrage" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"Si l'option est activée, la vérification des mises à jour commencera " +"immédiatement au démarrage du widget.

Si l'option est désactivée, la vérification des mises à jour sera lancée après un intervalle de " +"temps spécifié depuis le démarrage du widget. Recommandé." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Mises à jour" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Dépôts officiels Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Dépôt utilisateur Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Applications Flatpak" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Pas installé" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Widgets Plasma" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

Pour les développeurs de widgets :
N'oubliez pas de mettre à jour " +"le fichier metadata.json et de spécifier le nom de l'applet et sa version " +"exactement tels qu'ils apparaissent sur le KDE Store." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Actualités" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Actualités Arch Linux" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Conserver" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "élément d'actualité du flux" +msgstr[1] "éléments d'actualité du flux" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Pour les nouvelles mises à jour" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Bouton d’action" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Pour chaque nouvelle version" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"Si l'option est activée, des notifications seront envoyées lorsqu'une " +"nouvelle version du paquet est modifiée, même si le paquet est déjà dans la " +"liste. Plus de notifications.

Si l'option est désactivée, les notifications ne seront envoyées que pour les paquets qui ne sont " +"pas encore dans la liste. Moins de notifications." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Pour les actualités" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Pour les erreurs" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Avec du son" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Persistant" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" +"Pour configurer davantage, cliquez sur le bouton ci-dessous -> Paramètres de " +"l'application -> Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Configurer..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Clic du milieu" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Clic droit" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" +"Ne pas activer cette option si le widget n'est pas utilisé dans la barre " +"d'état système ; sinon, vous ne pourrez pas ouvrir les paramètres en " +"cliquant avec le bouton droit." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Défiler vers le haut" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Défiler vers le bas" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Restaurer les info-bulles masquées" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Sans importance" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Dépôt" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Correspondance exacte du dépôt" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Groupe" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Correspondance partielle du groupe" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Sous-chaîne" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Correspondance partielle du nom" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Nom" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Correspondance exacte du nom" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"Ici, vous pouvez remplacer les icônes de paquet par défaut et les exclure de " +"la liste. Chaque règle remplace la précédente, donc la liste des règles doit " +"être dans cet ordre : " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Marquer comme important" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Afficher dans la liste" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Exclure de la liste" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Supprimer" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Ajouter une règle" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Appliquer" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"Merci d'utiliser mon widget ! Si vous appréciez mon travail, vous pouvez me " +"soutenir en mettant en vedette le dépôt GitHub ou en m'offrant un café ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Visiter %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widgets" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Utiliser les icônes NerdFont" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" +"Si votre terminal utilise une police Nerd, les icônes de cette police " +"seront utilisées." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "Session tmux" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Scripts de pré/post-mise à niveau" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Pré-exécution" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Chemin de la commande ou du script" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"Exécution de votre commande ou script AVANT la mise à niveau.
Par " +"exemple, vous pouvez spécifier votre commande pour mettre à jour la liste " +"des miroirs si vous avez des dépôts non officiels." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Post-exécution" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"Exécution de votre commande ou script APRÈS la mise à niveau.
Par " +"exemple, vous pouvez spécifier votre commande pour mettre à niveau autre " +"chose." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Wrapper" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR désactivé dans les paramètres de recherche" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Options de mise à niveau" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Redémarrer le système" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Suggérer après la mise à niveau" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Générateur de liste de miroirs Pacman" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Uniquement pour les dépôts officiels" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

Voir également https://archlinux.org/mirrorlist (cliquez sur le " +"bouton pour ouvrir le lien)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Générateur" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Désactivé" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Toujours demander" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Demander si plus ancien que" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "jour" +msgstr[1] "jours" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Ne pas demander, forcer la mise à jour" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protocole" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "Version IP" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "État du miroir" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Nombre de sorties" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "Nombre de serveurs à écrire dans le fichier mirrorlist. 0 pour tous." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "Pays" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Sélectionnez-en au moins un !" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"Vous devez sélectionner au moins un pays, sinon tous seront choisis par " +"défaut.

Plus vous sélectionnez de pays, plus la génération des " +"miroirs sera longue !

Il est optimal de choisir 1-2 pays " +"les plus proches de chez vous." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Désinstaller les inutilisés" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normal, sans questions" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Non interactif, ignorer les questions" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Verbeux" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Confirmation de la mise à niveau" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Redémarrer plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"Après la mise à niveau du widget, l'ancienne version restera en mémoire " +"jusqu'à ce que vous redémarriez plasmashell. Pour éviter de le faire " +"manuellement, activez cette option." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Commande" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Icône Apdatifier dans la barre système" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Activé par défaut" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Vérification automatique désactivée" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Filtrer par nom de paquet" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Désactiver les mises à jour de recherche automatique" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Activer les mises à jour de recherche automatique" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Trier les paquets par nom" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Trier les paquets par dépôt" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Arrêter la vérification" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Vue compacte" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Vue étendue" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Consulter les notes de version" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Ignorer" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Mettre à niveau le paquet" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Type de paquet" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Description" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Auteur" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "ID de l'application" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Branche" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Durée d'exécution" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Groupes" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Fournit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Dépend de" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Requis par" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "En conflit avec" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Remplace" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Taille installée" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Taille de téléchargement" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Date d'installation" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Motif d'installation" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Aucune nouvelle non lue" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Restaurer la liste" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Lire le Wiki Arch - Mises à niveau partielles" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "" +#~ "Effectuez une mise à niveau complète du système au lieu d’une mise à " +#~ "niveau partielle !" + +#~ msgid "View" +#~ msgstr "Vue" + +#~ msgid "Upgrade button" +#~ msgstr "Bouton de mise à niveau" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Suggérer avant la mise à niveau" + +#~ msgid "Options" +#~ msgstr "Options" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "certains utilitaires requis ne sont pas installés (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "" +#~ "Vous pouvez également changer d'onglet en faisant glisser la souris vers " +#~ "la gauche et la droite avec le bouton droit bouton de la souris maintenu." diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ko.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ko.po new file mode 100644 index 0000000..9e4920a --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ko.po @@ -0,0 +1,1180 @@ +# Translation of apdatifier in ko +# Copyright (C) 2024 +# This file is distributed under the same license as the apdatifier package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2024-07-02 17:18+0900\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "일반" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "업그레이드" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "모양새" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "규칙" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "지원하기" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "전체 시스템 업그레이드" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Enter 키를 눌러 닫기" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "필터 된 미러리스트를 받아오고 있습니다" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "연결 속도에 따라 미러의 순위를 산정하고 있습니다" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "미러리스트 생성 설정을 확인해 주십시오." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "미러리스트 파일을 변경하기 위해서는 sudo 권한이 필요합니다." + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "현재 미러리스트:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"일부 위젯은 업그레이드 후 로그아웃해야 하거나 plasmashell을 다시 시작하셔야 " +"합니다" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "위젯 업데이트를 확인하는 중" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "plasmashell을 다시 시작하시겠습니까?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "설명 없음" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"15분 내 당신의 IP 주소로 많은 API 요청이 들어왔습니다. 다시 시도하십시오" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "metadata.json 파일을 찾을 수 없음" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "metadata.json 파일에서 오류" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "지원하지 않는 파일 포맷입니다." + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "다운로드 할 파일이 없습니다." + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "저장소에 있는 사용 가능한 모든 패키지 목록" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "모든 설치된 패키지 목록" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "명시적으로 설치된 패키지 목록" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "의존성이 없는 명시된 패키지 목록" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "더 이상 필요하지 않은 의존성 설치 목록" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "실종된 패키지 삭제" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "캐시로부터 다운그레이드 패키지 설치" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "모든 캐시된 패키지 제거" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "현재 설치되지 않은 캐시된 패키지 제거" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Python 업그레이드 후 AUR Python 패키지 재빌드" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "미러리스트 새로 고침" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "나가기" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "삭제 전 의존성 경고를 확인하십시오" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "계속하시겠습니까?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "메뉴로 돌아가려면 Enter를 누르시오" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "검색:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "실행됨:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "할 일 없음" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "설치에 필요" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "최근 소식 확인 중..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "시스템 업데이트 확인 중..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Flatpak 업데이트 확인 중..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "위젯 업데이트 확인 중..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "위젯을 확인할 수 없음: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "새 업데이트 +%1" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "업데이트 대기 중" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "최근 확인:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 초" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 분" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 시간" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "전에" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "없음" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "업데이트 확인" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "시스템 업그레이드" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "업데이트 주기 변경" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "관리" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "기사 읽기" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "패널 아이콘 보기" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "목록 보기" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "업데이트 대기 중" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "기본" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "선택..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "기본 아이콘" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "사용" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "색상" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "기본 색상" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "카운터 배경 색상 선택" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "현재 테마로부터 기본 배경색 설정" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "크기" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "투명도" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "그림자" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "오프셋" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "위치" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "중앙" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "좌측 상단" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "우측 상단" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "좌측 하단" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "우측 하단" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "기본 아이콘 사용" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "아이콘 테마 대신 Apdatifier 아이콘 사용" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "정렬" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "저장소 이름" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "패키지 이름" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "헤더" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "상태 표시" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "툴바 표시" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "푸터" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "탭바 표시" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "검색" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "알림" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "마우스 동작" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"설정은 자동으로 설정 파일에 저장되며, 세션 시작 시마다 로드 되어 설정이 유실" +"되지 않도록 합니다. 설정 파일 위치: " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" 이(가) 설치되지 않았습니다! 새 패키지를 다운 받을 필요 없이 최신 버전으로 업" +"데이트 할 수 있으므로 적극 추천합니다." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "확인 주기" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "분" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "이러한 설정 중 하나를 변경하면 현재 타이머가 재설정됩니다." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "시작 시 확인하기" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"이 옵션이 활성화될 시, 위젯이 시작되는 즉시 업데이트 확인이 시작됩니" +"다.

이 옵션이 비활성화될 시, 위젯이 시작된 후 지정된 시간이 지" +"나면 업데이트 확인이 시작됩니다. 권장됨" + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Arch 공식 저장소" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Arch 사용자 저장소" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Flatpak 앱" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "설치되지 않음" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Plasma 위젯" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

위젯 개발자에게:
metadata.json 파일을 업데이트하는 것을 잊지 마세" +"요. and specify the name of the applet and its version exactly as " +"they appear on the KDE Store." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "아치 리눅스 소식" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "설정..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "가운데 클릭" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "오른쪽 클릭" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "터미널" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "NerdFont 아이콘 사용" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "AUR 헬퍼" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "업그레이드 후 권장됨" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Pacman 미러리스트 생성기" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

https://archlinux.org/mirrorlist 도 참조하십시오.(클릭 시 링크 열림)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "생성" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "프로토콜" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "IP 버전" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "국가" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "적어도 한 곳을 고르시오!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "plasmashell 재시작" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"위젯을 업그레이드하면 이전 버전이 plasmashell을 다시 시작할 때까지 여전히 메" +"모리에 남아있습니다. 이걸 수동으로 하는 것을 피하려면, 이 옵션을 활성화하십시" +"오." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "자동 확인 사용 안 함" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "확인 중단" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "패키지 업그레이드" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "설명" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "원작자" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "앱 ID" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "브랜치" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "커밋" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "런타임" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "제공" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "의존성" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "다운로드 크기" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "설치 날짜" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "설치 이유" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Arch Wiki를 참조 - 부분 업그레이드" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "부분 업그레이드 대신 전체 시스템 업그레이드를 하십시오!" + +#~ msgid "View" +#~ msgstr "보기" + +#~ msgid "Suggest before upgrading" +#~ msgstr "업그레이드 전 권장됨" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "해당 유틸리티가 설치되어 있지 않음 (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "탭을 마우스를 이용해 좌우로 이동할 수도 있습니다." diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/nl.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/nl.po new file mode 100644 index 0000000..164dce3 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/nl.po @@ -0,0 +1,1234 @@ +# Translation of apdatifier in nl +# Copyright (C) 2023 +# This file is distributed under the same license as the apdatifier package. +# Heimen Stoffels , 2023. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2025-05-18 14:38+0200\n" +"Last-Translator: Heimen Stoffels \n" +"Language-Team: \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.6\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Algemeen" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Bijwerken" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Vormgeving" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Regels" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Doneren" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Bezig met bijwerken" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Systeem volledig bijwerken" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Flatpak-update" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Plasmawidgets-update" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Totale uitvoertijd:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "Er zijn kritieke pakketten bijgewerkt - een herstart is vereist:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Wil je nu herstarten?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Druk op enter om te sluiten" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Overgeslagen…" + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Bezig met ophalen van recentste, gefilterde spiegelserverlijst" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Bezig met classificeren van spiegelservers op verbinding en snelheid" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Bezig met controleren van genereerinstellingen…" + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "is voorzien van de volgende servers:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "" +"Voor het opslaan van de spiegelserverlijst zijn beheerdersrechten vereist" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Huidige spiegelserverlijst:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"Voor enkele widgets kan het nodig zijn om je af te melden of plasmashell te " +"herstarten" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Bezig met controleren op widgetupdates" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Bezig met ophalen van api-gegevens" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Bezig met ophalen van downloadlink" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Bezig met downloaden van pakket" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Wil je doorgaan met bijwerken?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Wil je plasmashell nu herstarten?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Geen beschrijving" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"Er zijn in de afgelopen 15 minuten teveel api-verzoeken vanaf je ip-adres " +"geweest - probeer het later opnieuw" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "De gegevens kunnen niet worden opgehaald van de api" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Onbekende foutmelding" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "metadata.json is niet aangetroffen" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Fouten in metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Niet-ondersteund bestandstype" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Er zijn geen bestanden om te downloaden" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Er is geen bestand met deze versie beschikbaar" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Er zijn meerdere bestanden met deze versie beschikbaar" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Het pakket kan niet worden opgehaald" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Alle beschikbare pakketten tonen" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Alle geïnstalleerde pakketten tonen" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Alle gedwongen geïnstalleerde pakketten tonen" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "Alle gedwongen geïnstalleerde pakketten zonder afhankelijkheden tonen" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "Alle onnodige geïnstalleerde afhankelijkheden (onteigend) tonen" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Onteigende pakketten verwijderen" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Pakket installeren (afwaarderen) uit cache" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "ALLE gecachete pakketten verwijderen" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "Alle niet-geïnstalleerde gecachete pakketten verwijderen" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Python-pakketten van AUR herbouwen na Python-upgrades" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Spiegelserverlijst vernieuwen" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Afsluiten" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Afhankelijkheidswaarschuwingen tonen alvorens te verwijderen" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Hervatten?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Druk op enter om terug te keren naar het menu" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Zoeken:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Uitgevoerd:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Er valt niets te doen" + +# Required installed +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Vereist" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Afsluitcode: " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Bezig met ophalen van nieuws…" + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Het nieuws kan niet worden opgehaald " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Bezig met controleren op systeemupdates…" + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Bezig met controleren op flatpakupdates…" + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Bezig met controleren op widgetupdates…" + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "De widget-updatecontrole is mislukt: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "recentste commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 update" +msgstr[1] "+%1 updates" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "update in de wachtrij" +msgstr[1] "updates in de wachtrij" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Recentste controle:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 seconde" +msgstr[1] "%1 seconden" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuut" +msgstr[1] "%1 minuten" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 uur" +msgstr[1] "%1 uur" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "geleden" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Geen" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Controleren op updates" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Systeem bijwerken" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Wisselen, iedere" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Beheer" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Artikel lezen" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "Het systeem is bijgewerkt" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Paneelpictogramweergave" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Lijstweergave" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Getoond indien" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "update in de wachtrij " +msgstr[1] "updates in de wachtrij " + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Standaard" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Kiezen…" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Standaardpictogram" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Stoptussenpoos" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Inschakelen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Embleem" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Kleur" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Standaardkleur" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Kies de achtergrondkleur van het embleem" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Standaard achtergrondkleur uit het huidige thema" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Grootte" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Straal" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Doorzichtigheid" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Schaduw" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Lettertype" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Systeemlettertype" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Vetgedrukt lettertype" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Tekstgrootte" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Ruimte aan linkerzijde" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Marges aan zijkanten" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Verschuiving" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Locatie" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Centreren" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Linksboven" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Rechtsboven" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Linksonder" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Rechtsonder" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Meegeleverde pictogrammen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "" +"Overschrijf aangepaste pictogramthema en gebruik in plaats daarvan de " +"standaard Apdatifier pictogrammen." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Standaardtabblad" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Compact" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Uitgebreid" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Gedrag" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Altijd naar het standaardtabblad schakelen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Hoogte van items (Compact)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Sorteren" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Op pakketbron" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Op naam" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Kop" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Status tonen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Werkbalk tonen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Statusbalk tonen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Tabbladbalk tonen" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Tabbladtitels tonen" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Ontwikkelingsversie installeren" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Stabiele versie installeren" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Widget verwijderen" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Let op: de versie met de recentste commits kan instabiel zijn." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" +"Let op: als je de ontwikkelingsversie nog nooit hebt geïnstalleerd, hoef je " +"de stabiele versie niet te gebruiken." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" +"De widget wordt verwijderd met inbegrip van alle bestanden en de " +"instellingenmap." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Zoeken" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Meldingen" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Muisacties" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Overig" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"Configuratie wordt automatisch opgeslagen in een configuratiebestand en " +"geladen bij elke start, zodat u uw instellingen nooit kwijtraakt. Het " +"configuratiebestand is opgeslagen in " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" is niet geïnstalleerd! Dit pakket wordt sterk aanbevolen voor het " +"controleren op updates zonder de databanken te hoeven vernieuwen." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Periodiek bijwerken" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "minuten" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "" +"De huidige tijdklok wordt op nul ingesteld indien een van deze instellingen " +"wordt gewijzigd." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Controleren na opstarten" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"Schakel in om te controleren op updates zodra de widget geladen is." +"

Schakel uit om te controleren op het opgegeven tijdstip. " +"Aanbevolen." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Updates" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Officiële Arch-pakketbronnen" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Arch User Repository" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Flatpakprogramma's" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Niet geïnstalleerd" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Plasmawidgets" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

Tip voor widgetontwikkelaars:
vergeet niet om metadata.json bij " +"te werken en de naam van het applet en de versie precies zo in te " +"vullen als in de KDE Store." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Nieuws" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Arch Linux-nieuws" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Behouden" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "nieuwsitem op de feed" +msgstr[1] "nieuwsitems op de feed" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Voor nieuwe updates" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Actieknop" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Bij elk nieuwe versie" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"Schakel in om meldingen te tonen bij elke nieuwe pakketversie, zelfs " +"als de pakketten in kwestie al op de lijst staan. Meer meldingen. " +"

Schakel uit om alleen meldingen te tonen van pakketten die " +"nog niet op de lijst staan. Minder meldingen." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Voor nieuws" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Voor fouten" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Geluid" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Persistent" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" +"De rest van de instellingen zijn beschikbaar via onderstaande knop → " +"Speciale programma-instellingen → Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Instellen…" + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Middelklikken" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Rechtsklikken" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" +"Schakel deze optie niet in als de widget niet in het systeemvak staat, " +"anders kun je de instellingen niet via het rechtermuisknopmenu openen." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Omhoog scrollen" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Omlaag scrollen" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Verborgen hulpballonnen herstellen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Onbelangrijk" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Repository" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Exacte repository-overeenkomst" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Groep" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Substring groepsovereenkomst" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Substring" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Substring naamovereenkomst" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Naam" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Exacte naamovereenkomst" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"Hier kunt u de standaardpictogrammen van het pakket overschrijven en " +"uitsluiten van de lijst. Elke regel overschrijft de vorige, dus de lijst met " +"regels moet in deze volgorde staan: " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Als belangrijk markeren" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Tonen op lijst" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Verbergen van lijst" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Verwijderen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Regel toevoegen" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Toepassen" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"Bedankt voor het gebruik van mijn widget! Als je mijn werk waardeert, " +"ondersteun me dan door de GitHub-pakketbron een ster te geven of me een " +"kopje koffie te schenken. ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "%1 openen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widgets" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminalvenster" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "NerdFont-pictogrammen gebruiken" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" +"Als je terminalvenster gebruikmaakt van Nerd Font, dan worden " +"pictogrammen daaruit gebruikt." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "tmux-sessie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Scripts voor/na bijwerken" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Voor bijwerken" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Opdracht of scriptlocatie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"Een opdracht of script die van tevoren dient te worden uitgevoerd." +"
Voorbeeld: een opdracht om de spiegelserverlijst bij te werken." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Na bijwerken" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"Een opdracht of script die nadien dient te worden uitgevoerd.
Voorbeeld: " +"een opdracht om iets anders bij te werken." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Wrapper" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR is uitgeschakeld in de zoekinstellingen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Bijwerkopties" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Systeem herstarten" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Vragen na opwaarderen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Pacman-spiegelserverlijst genereren" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Alleen voor officiële pakketbronnen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

Zie ook https://archlinux.org/mirrorlist (klik op de knop om de link " +"te openen)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Genereren" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Uitgeschakeld" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Altijd vragen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Vragen als ouder dan" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "dag" +msgstr[1] "dagen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Niet vragen, geforceerd vernieuwen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protocol" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "Ip-versie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Spiegelserverstatus" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Aantal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "Het aantal servers dat in het bestand moet worden opgenomen. 0 = alle." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "Land" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Kies minimaal één land!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"Kies minimaal één land om te voorkomen dat alle landen worden gekozen." +"

Hoe meer landen je kiest, des te langer het duurt om de " +"spiegelservers te genereren!

Optimale suggestie: kies 1-2 " +"naburige landen." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Ongebruikte verwijderen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normaal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normaal - vragen overslaan" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Niet-interactief - vragen overslaan" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Uitgebreid" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Opwaarderen bevestigen" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Plasmashell herstarten" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"Na het opwaarderen van de widget blijft de oude versie in het geheugen " +"totdat je plasmashell herstart. Schakel deze optie in om niet handmatig te " +"hoeven herstarten." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Opdracht" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Apdatifier-pictogram in het systeemvak" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Standaard ingeschakeld" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Automatische controle is uitgeschakeld" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Filteren op pakketnaam" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Automatische updatecontrole uitschakelen" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Automatische updatecontrole inschakelen" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Pakketten sorteren op naam" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Pakketten sorteren op pakketbron" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Controle afbreken" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Compacte weergave" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Uitgebreide weergave" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Bekijk de release-opmerkingen" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Negeren" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Pakket bijwerken" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Pakkettype" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Beschrijving" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Maker" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "Programma-id" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Afsplitsing" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Uitvoerbaar bestand" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Groepen" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Biedt" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Vereist" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Vereist door" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Botst met" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Vervangt" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Installatiegrootte" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Downloadgrootte" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Installatiedatum" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Installatiereden" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Er is geen ongelezen nieuws" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Lijst herstellen" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Lees over gedeeltelijke opwaarderingen op de Arch-wiki" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "" +#~ "Voer een volledige opwaardering uit in plaats van een gedeeltelijke!" + +#~ msgid "View" +#~ msgstr "Weergave" + +#~ msgid "Upgrade button" +#~ msgstr "Bijwerkknop" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Vragen alvorens op te waarderen" + +#~ msgid "Options" +#~ msgstr "Opties" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "Enkele vereiste hulpmiddelen zijn niet aangetroffen (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "" +#~ "Tip: wisselen van tabblad kan ook door de muis naar links en rechts te " +#~ "verplaatsen en de rechtermuisknop ingedrukt te houden." diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pl.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pl.po new file mode 100644 index 0000000..d366dde --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pl.po @@ -0,0 +1,1126 @@ +# Translation of apdatifier in Polish +# Copyright (C) 2025 +# This file is distributed under the same license as the apdatifier package. +# Piotr Pająk , 2025. +# Rygorr Mortis , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2025-08-16 00:48+0200\n" +"Last-Translator: Rygorr Mortis \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Ogólne" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Aktualizacja" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Wygląd" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Zasady" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Wesprzyj mnie" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Trwa aktualizacja" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Pełna aktualizacja systemu" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Aktualizacja Flatpak" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Aktualizacja widgetów Plasma" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Całkowity czas wykonania:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "Zaktualizowano krytyczne pakiety, może być wymagany restart:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Czy chcesz zrestartować teraz?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Naciśnij Enter, aby zamknąć" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Pominięto..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Pobieranie najnowszej listy przefiltrowanych serwerów lustrzanych" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Ranking serwerów lustrzanych według ich prędkości połączenia i otwierania" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Sprawdź ustawienia generatora listy serwerów lustrzanych..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "został zaktualizowany o następujące serwery:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "Aby zapisać do pliku mirrorlist, wymagane są uprawnienia sudo" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Twoja aktualna lista serwerów lustrzanych:" + +#: ../contents/tools/sh/messages +msgid "For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "Po aktualizacji niektóre widżety mogą wymagać wylogowania się lub ponownego uruchomienia plasmashell" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Sprawdzanie widżetów pod kątem aktualizacji" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Pobieranie danych z API" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Pobieranie linku" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Pobieranie pakietu" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Czy kontynuować aktualizację?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Czy teraz zrestartować plasmashell?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Brak opisu" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Too many API requests in the last 15 minutes from your IP address, please try again later" +msgstr "Zbyt wiele zapytań do API w ciągu ostatnich 15 minut z twojego adresu IP, spróbuj ponownie później" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Nie udało się pobrać danych z API" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Nieznany błąd" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Nie znaleziono pliku metadata.json" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Błędy w pliku metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Nieobsługiwany format pliku" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Brak plików do pobrania" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Brak pliku oznaczonego wersją" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Wiele plików jest oznaczonych wersją" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Nie udało się pobrać pakietu" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Wyświetl wszystkie dostępne pakiety w repozytoriach" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Wyświetl wszystkie zainstalowane pakiety" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Wyświetl wszystkie pakiety zainstalowane jawnie" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "Wyświetl wszystkie pakiety zainstalowane jawnie, które nie są zależnościami żadnych innych pakietów" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "Wyświetl wszystkie zależności, które nie są już potrzebne (osierocone)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Odinstaluj osierocone pakiety" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Zainstaluj (zaktualizuj do starszej wersji) pakiet z pamięci podręcznej" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "Usuń WSZYSTKIE pakiety z pamięci podręcznej" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "Usuń pakiety w pamięci podręcznej, które nie są aktualnie zainstalowane" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Zbuduj ponownie pakiety Pythona z AUR po aktualizacji Pythona" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Odśwież listę serwerów lustrzanych" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Wyjdź" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Sprawdź ostrzeżenia zależności przed usunięciem" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Wznowić?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Naciśnij Enter, aby wrócić do menu" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Szukaj:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Wykonano:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Nic do zrobienia" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Wymagane do zainstalowania" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Kod wyjścia: " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Sprawdzanie najnowszych wiadomości..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Nie można pobrać wiadomości " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Sprawdzanie aktualizacji systemu..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Sprawdzanie aktualizacji flatpak..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Sprawdzanie aktualizacji widżetów..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "Nie można sprawdzić widżetów: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "najnowszy commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 nowa aktualizacja" +msgstr[1] "+%1 nowe aktualizacje" +msgstr[2] "+%1 nowych aktualizacji" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "aktualizacja w toku" +msgstr[1] "aktualizacje w toku" +msgstr[2] "aktualizacji w toku" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Ostatnio sprawdzono:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 sekunda" +msgstr[1] "%1 sekundy" +msgstr[2] "%1 sekund" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuta" +msgstr[1] "%1 minuty" +msgstr[2] "%1 minut" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 godzina" +msgstr[1] "%1 godziny" +msgstr[2] "%1 godzin" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "temu" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Brak" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Sprawdź aktualizacje" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/components/Notification.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Zaktualizuj system" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Zmień interwał" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Zarządzanie" + +#: ../contents/ui/components/Notification.qml ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Przeczytaj artykuł" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "System zaktualizowany" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Widok ikon panelu" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Widok listy" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Pokazano, gdy" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "aktualizacja oczekuje " +msgstr[1] "aktualizacje oczekują " +msgstr[2] "aktualizacji oczekuje " + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Domyślnie" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Wybierz..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Ikona domyślna" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Zatrzymano interwał" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Włącz" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Licznik" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Kolor" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Domyślny kolor" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Wybierz kolor tła licznika" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Domyślny kolor tła z bieżącego motywu" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Rozmiar" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Promień" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Przezroczystość" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Cień" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Czcionka" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Domyślna czcionka systemowa" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Czcionka pogrubiona" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Rozmiar czcionki" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Lewy odstęp" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Marginesy boczne" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Przesunięcie" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Pozycja" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Środek" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Lewy górny" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Prawy górny" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Lewy dolny" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Prawy dolny" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Użyj wbudowanych ikon" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "Zastąp niestandardowy motyw ikon i użyj domyślnych ikon Apdatifier." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Karta domyślna" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Kompaktowy" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Rozszerzony" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Zachowanie" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Zawsze przełączaj na kartę domyślną" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Wysokość elementów (Kompaktowy)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Sortowanie" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Według repozytorium" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Według nazwy" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Nagłówek" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Pokaż status" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Pokaż pasek narzędzi" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Stopka" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Pokaż pasek kart" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Pokaż teksty kart" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Zainstaluj wersję deweloperską" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Zainstaluj wersję stabilną" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Odinstaluj widżet" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Uwaga: wersja z najnowszymi commitami może być niestabilna." + +#: ../contents/ui/configuration/General.qml +msgid "Note: if you haven't installed the Devel version before, there's no need to install the Stable version." +msgstr "Uwaga: jeśli wcześniej nie zainstalowałeś wersji deweloperskiej, nie ma potrzeby instalowania wersji stabilnej." + +#: ../contents/ui/configuration/General.qml +msgid "Removal of the widget and all related files, including the directory with its configuration." +msgstr "Usunięcie widżetu i wszystkich powiązanych plików, w tym katalogu z jego konfiguracją." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Szukaj" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Powiadomienia" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Akcje myszy" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Różne" + +#: ../contents/ui/configuration/General.qml +msgid "Configuration is automatically saved in a config file and loaded at every startup, ensuring you never lose your settings. The config file is stored in " +msgstr "Konfiguracja jest automatycznie zapisywana w pliku konfiguracyjnym i ładowana przy każdym uruchomieniu, zapewniając, że nigdy nie stracisz swoich ustawień. Plik konfiguracyjny jest przechowywany w " + +#: ../contents/ui/configuration/General.qml +msgid " not installed! Highly recommended to install it for getting the latest updates without the need to download fresh package databases." +msgstr " nie jest zainstalowany! Zdecydowanie zaleca się jego instalację, aby otrzymywać najnowsze aktualizacje bez potrzeby pobierania nowych baz danych pakietów." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Interwał" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "minuty" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "Aktualny timer jest resetowany, gdy jedna z tych ustawień zostanie zmieniona." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Sprawdzaj przy uruchamianiu" + +#: ../contents/ui/configuration/General.qml +msgid "If the option is enabled, update checking will begin immediately upon widget startup.

If the option is disabled, update checking will be initiated after a specified time interval has passed since the widget was started. Recommended." +msgstr "Jeśli opcja jest włączona, sprawdzanie aktualizacji rozpocznie się natychmiast po uruchomieniu widżetu.

Jeśli opcja jest wyłączona, sprawdzanie aktualizacji rozpocznie się po upływie określonego czasu od uruchomienia widżetu. Zalecane." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Aktualizacje" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Oficjalne repozytoria Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Repozytorium użytkowników Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Aplikacje Flatpak" + +#: ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Nie zainstalowane" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Widżety Plasma" + +#: ../contents/ui/configuration/General.qml +msgid "

For widget developers:
Don't forget to update the metadata.json and specify the name of the applet and its version exactly as they appear on the KDE Store." +msgstr "

Dla twórców widżetów:
Nie zapomnij zaktualizować pliku metadata.json i określić nazwę apletu oraz jego wersję dokładnie tak, jak są podane w sklepie KDE." + +#: ../contents/ui/configuration/General.qml ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Wiadomości" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Wiadomości Arch Linux" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Zachowaj" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "wiadomość z kanału" +msgstr[1] "wiadomości z kanału" +msgstr[2] "wiadomości z kanału" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Dla nowych aktualizacji" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Przycisk akcji" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Dla każdej zmiany wersji" + +#: ../contents/ui/configuration/General.qml +msgid "If the option is enabled, notifications will be sent when a new version of the package is bumped, even if the package is already on the list. More notifications.

If the option is disabled, notifications will only be sent for packages that are not yet on the list. Less notifications." +msgstr "Jeśli opcja jest włączona, powiadomienia będą wysyłane, gdy nowa wersja pakietu zostanie opublikowana, nawet jeśli pakiet jest już na liście. Więcej powiadomień.

Jeśli opcja jest wyłączona, powiadomienia będą wysyłane tylko dla pakietów, które jeszcze nie znajdują się na liście. Mniej powiadomień." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Dla wiadomości" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Dla błędów" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Z dźwiękiem" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Stały" + +#: ../contents/ui/configuration/General.qml +msgid "To further configure, click the button below -> Application Settings -> Apdatifier" +msgstr "Aby skonfigurować więcej opcji, kliknij przycisk poniżej -> Ustawienia aplikacji -> Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Skonfiguruj..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Środkowy przycisk myszy" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Prawy przycisk myszy" + +#: ../contents/ui/configuration/General.qml +msgid "Do not enable this option if the widget is not used in the system tray; otherwise, you will not be able to open the settings by right-clicking." +msgstr "Nie włączaj tej opcji, jeśli widżet nie jest używany w zasobniku systemowym; w przeciwnym razie nie będziesz mógł otworzyć ustawień klikając prawym przyciskiem myszy." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Przewiń w górę" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Przewiń w dół" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Przywróć ukryte podpowiedzi" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Nieistotne" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Repozytorium" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Dokładne dopasowanie repozytorium" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Grupa" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Dopasowanie grupy przez podciąg" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Podciąg" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Dopasowanie nazwy przez podciąg" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Nazwa" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Dokładne dopasowanie nazwy" + +#: ../contents/ui/configuration/Rules.qml +msgid "Here you can override the default package icons and exclude them from the list. Each rule overwrites the previous one, so the list of rules should be in this order: " +msgstr "Tutaj możesz nadpisać domyślne ikony pakietów i wykluczyć je z listy. Każda reguła nadpisuje poprzednią, więc lista reguł powinna być w następującej kolejności:" + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Oznacz jako ważne" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Pokaż na liście" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Wyklucz z listy" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Usuń" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Dodaj regułę" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Zastosuj" + +#: ../contents/ui/configuration/Support.qml +msgid "Thanks for using my widget! If you appreciate my work, you can support me by starring the GitHub repository or buying me a coffee ;)" +msgstr "Dziękuję za korzystanie z mojego widżetu! Jeśli doceniasz moją pracę, możesz mnie wesprzeć, dodając gwiazdkę do repozytorium na GitHubie lub stawiając kawę ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Odwiedź %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widżety" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Użyj ikon z NerdFont" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "If your terminal utilizes any Nerd Font, icons from that font will be used." +msgstr "Jeśli Twój terminal używa jakiejkolwiek czcionki Nerd Font, będą używane ikony z tej czcionki." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "Sesja tmux" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Skrypty przed/po aktualizacji" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Przed wykonaniem" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Ścieżka do polecenia lub skryptu" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script BEFORE the upgrade.
For example, you can specify your command to update the mirrorlist if you have unofficial repositories." +msgstr "Uruchamianie polecenia lub skryptu PRZED aktualizacją.
Na przykład, możesz określić polecenie do aktualizacji listy mirrorów, jeśli masz nieoficjalne repozytoria." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Po wykonaniu" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script AFTER the upgrade.
For example, you can specify your command to upgrade something else." +msgstr "Uruchamianie polecenia lub skryptu PO aktualizacji.
Na przykład, możesz określić polecenie do aktualizacji czegoś innego." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Opakowanie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR wyłączone w ustawieniach wyszukiwania" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Opcje aktualizacji" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Restartuj system" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Sugeruj po aktualizacji" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Generator listy luster Pacman" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Tylko dla oficjalnych repozytoriów" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "

Zobacz także https://archlinux.org/mirrorlist (kliknij przycisk, aby otworzyć link)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Generator" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Wyłączone" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Zawsze pytaj" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Pytać, jeśli starsze niż" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "dzień" +msgstr[1] "dni" +msgstr[2] "dni" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Nie pytaj, wymuś odświeżenie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protokół" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "Wersja IP" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Status luster" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Wynik liczbowy" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "Liczba serwerów do zapisania w pliku mirrorlist. 0 dla wszystkich." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "Kraj" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Wybierz przynajmniej jeden!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "You must select at least one country, otherwise all will be chosen by default.

The more countries you select, the longer it will take to generate the mirrors!

It is optimal to choose 1-2 countries closest to you." +msgstr "Musisz wybrać przynajmniej jeden kraj, w przeciwnym razie wszystkie zostaną wybrane domyślnie.

Im więcej krajów wybierzesz, tym dłużej będzie trwało generowanie luster!

Optymalnie jest wybrać 1-2 kraje najbliżej ciebie." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Odinstaluj nieużywane" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normalny" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normalny, pomiń pytania" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Nieinteraktywny, pomiń pytania" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Szczegółowy" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Potwierdzenie aktualizacji" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Zrestartuj plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "After upgrading widget, the old version will still remain in memory until you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "Po zaktualizowaniu widżetu, stara wersja nadal będzie przechowywana w pamięci, dopóki nie zrestartujesz plasmashell. Aby uniknąć robienia tego ręcznie, włącz tę opcję." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Polecenie" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Ikona Apdatifier w zasobniku systemowym" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Domyślnie włączone" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Automatyczne sprawdzanie wyłączone" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Filtruj według nazwy pakietu" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Wyłącz automatyczne wyszukiwanie aktualizacji" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Włącz automatyczne wyszukiwanie aktualizacji" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Sortuj pakiety według nazwy" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Sortuj pakiety według repozytorium" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Zatrzymaj sprawdzanie" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Widok kompaktowy" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Widok rozszerzony" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Sprawdź informacje o wersji" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Odrzuć" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Aktualizuj pakiet" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Typ pakietu" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Opis" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Autor" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "ID aplikacji" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Gałąź" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Czas działania" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Grupy" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Dostarcza" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Zależy od" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Wymagany przez" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Konfliktuje z" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Zastępuje" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Zainstalowany rozmiar" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Rozmiar do pobrania" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Data instalacji" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Powód instalacji" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Brak nieprzeczytanych wiadomości" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Przywróć listę" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Przeczytaj Arch Wiki - Partial Upgrades" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "Wykonaj pełną aktualizację systemu zamiast częściowej!" + +#~ msgid "View" +#~ msgstr "Widok" + +#~ msgid "Upgrade button" +#~ msgstr "Przycisk aktualizacji" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Sugeruj przed aktualizacją" + +#~ msgid "Options" +#~ msgstr "Opcje" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "niektóre wymagane narzędzia nie są zainstalowane (curl, jq)" + +#~ msgid "You can also switch tabs by dragging the mouse left and right with the right mouse button held." +#~ msgstr "Możesz również przełączać karty, przeciągając myszką w lewo i w prawo, trzymając naciśnięty prawy przycisk myszy." + +#~ msgid "Hide \"News\" tab if no content" +#~ msgstr "Ukryj kartę \"Wiadomości\", jeśli brak treści" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pt_BR.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pt_BR.po new file mode 100644 index 0000000..be9e793 --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/pt_BR.po @@ -0,0 +1,1240 @@ +# Translation of apdatifier in pt_BR +# Copyright (C) 2024 +# This file is distributed under the same license as the apdatifier package. +# João Victor Leal , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2024-11-20 22:37-0300\n" +"Last-Translator: João Victor Leal\n" +"Language-Team: \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Geral" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Atualizar" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Aparência" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Regras" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Apoie-me" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Atualização em andamento" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Atualização completa do sistema" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Atualização de Flatpak" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Atualização dos widgets do Plasma" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Tempo total de execução:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "" +"Pacote(s) crítico(s) atualizado(s), reinicialização pode ser necessária:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Deseja reiniciar agora?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Pressione Enter para fechar" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Ignorado..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Buscando a última lista de mirrors filtrados" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Classificando mirrors por sua conexão e velocidade de abertura" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Verifique as configurações do seu gerador de mirrorlist..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "foi atualizado com os seguintes servidores:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "Para escrever no arquivo mirrorlist, são necessários privilégios sudo" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Sua mirrorlist atual:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"Para alguns widgets, pode ser necessário fazer logout ou reiniciar o " +"plasmashell após a atualização" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Verificando por atualizações de widgets" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Obtendo dados da API" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Obtendo o link para download" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Baixando pacote" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Continuar com a atualização?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Reiniciar o plasmashell agora?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Sem descrição" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"Muitas solicitações de API do seu endereço IP nos últimos 15 minutos, tente " +"novamente mais tarde" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Falha ao recuperar dados da API" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Erro desconhecido" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Arquivo metadata.json não encontrado" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Erros no arquivo metadata.json" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Formato de arquivo não suportado" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Não há arquivos para download" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Nenhum arquivo marcado com versão" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Vários arquivos são marcados com versão" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Falha ao baixar o pacote" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Listar todos os pacotes disponíveis nos repositórios" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Listar todos os pacotes instalados" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Listar pacotes instalados explicitamente" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "" +"Listar pacotes instalados explicitamente e que não são dependências de nada" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "Listar dependências instaladas que não são mais necessárias (órfãs)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Desinstalar pacotes órfãos" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Instalar (downgrade) de um pacote do cache" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "Remover TODOS os pacotes em cache" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "Remover pacotes em cache que não estão instalados no momento" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Reconstruir pacotes python AUR após atualização python" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Atualizar mirrorlist" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Sair" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Revise os avisos de dependência antes de remover" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Retomar?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Pressione Enter para retornar ao menu" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Procurar:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Executado:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Nada a fazer" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Requer instalado" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Código de saída: " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Verificando as últimas notícias..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Não foi possível obter as notícias " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Verificando atualizações do sistema..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Verificando atualizações de Flatpak..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Verificando atualizações de widgets..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "Incapaz de verificar atualizações de widgets: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "último commit" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 nova atualização" +msgstr[1] "+%1 novas atualizações" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "atualização está pendente" +msgstr[1] "atualizações estão pendentes" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Última verificação:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 segundo" +msgstr[1] "%1 segundos" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minutos" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 hora" +msgstr[1] "%1 horas" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "atrás" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Nenhum" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Verificar atualizações" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Atualizar sistema" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Alternar intervalo" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Gerenciamento" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Ler artigo" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "Sistema atualizado" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Visualização de ícone do painel" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Visualização de lista" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Mostrado quando" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "atualização está pendente " +msgstr[1] "atualizações estão pendentes " + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Padrão" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Selecione..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Ícone padrão" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Intervalo parado" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Habilitar" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Contador" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Cor" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Cor padrão" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Selecione a cor de fundo do contador" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Cor de fundo padrão do tema atual" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Tamanho" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Raio" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Opacidade" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Sombra" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Fonte" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Fonte padrão do sistema" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Fonte em negrito" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Tamanho da fonte" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Espaçamento à esquerda" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Margens laterais" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Deslocar" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Posição" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "Centro" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Canto superior esquerdo" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Canto superior direito" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Canto inferior esquerdo" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Canto inferior direito" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Use ícones integrados" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "" +"Substitua o tema de ícones personalizados e use os ícones padrão do " +"Apdatifier." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Aba padrão" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Compacto" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Extendido" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Comportamento" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Sempre mudar para a aba padrão" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Altura dos itens (Compacto)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Ordenação" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "Por repositório" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "Por nome" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Cabeçalho" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Mostrar status" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Mostrar barra de ferramentas" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Rodapé" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Mostrar guias" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Mostrar textos das guias" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Instalar a versão de desenvolvimento" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Instalar a versão estável" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Remover widget" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Observação: a versão com os commits mais recentes pode ser instável." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" +"Observação: se você não instalou a versão Devel antes, não há necessidade de " +"instalar a versão Stable." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" +"Remoção do widget e de todos os arquivos relacionados, incluindo o diretório " +"com sua configuração." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Procurar" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Notificações" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Ações do mouse" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Variado" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"A configuração é salva automaticamente em um arquivo de configuração e " +"carregada a cada inicialização, garantindo que você nunca perca suas " +"configurações. O arquivo de configuração é armazenado em " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" não instalado! É altamente recomendável instalá-lo para obter as últimas " +"atualizações sem a necessidade de baixar novos bancos de dados de pacotes." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Intervalo" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "minutos" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "" +"O temporizador atual é reiniciado quando qualquer uma dessas configurações é " +"alterada." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Verifique na inicialização" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"Se a opção estiver habilitada, a verificação de atualizações começará " +"imediatamente após a inicialização do widget.

Se a opção estiver " +"desabilitada, a verificação de atualizações será iniciada após um " +"intervalo de tempo especificado desde que o widget foi iniciado. " +"Recomendado." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Atualizações" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Repositórios oficiais do Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Repositório de usuário do Arch" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Aplicações Flatpak" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Não instalado" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Widgets do Plasma" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

Para desenvolvedores de widgets:
Não se esqueça de atualizar o " +"metadata.json e especificar o nome do applet e sua versão exatamente " +"como aparecem na Loja KDE." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Notícias" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Notícias do Arch Linux" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Manter" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "item de notícia do feed" +msgstr[1] "itens de notícia do feed" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Para novas atualizações" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Botão de ação" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "Para cada nova versão" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"Se a opção estiver habilitada, notificações serão enviadas quando uma " +"nova versão do pacote for lançada, mesmo que o pacote já esteja na lista. " +"Mais notificações.

Se a opção estiver desabilitada, " +"notificações serão enviadas somente para pacotes que ainda não estejam na " +"lista. Menos notificações." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Para notícias" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "Para erros" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Com som" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Persistente" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" +"Para configurar ainda mais, clique no botão abaixo -> Configurações do " +"aplicativo -> Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Configurar..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Clique do meio" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Clique direito" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" +"Não habilite esta opção se o widget não for utilizado na bandeja do sistema, " +"caso contrário, você não conseguirá abrir as configurações clicando com o " +"botão direito." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Rolar para cima" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Rolar para baixo" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Restaurar dicas de ferramentas ocultas" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Sem importância" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Repositório" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Correspondência exata do repositório" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Grupo" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Correspondência de grupo de substring" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Substring" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Correspondência de nome de substring" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Nome" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Correspondência exata do nome" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"Aqui você pode substituir os ícones de pacote padrão e excluí-los da lista. " +"Cada regra substitui a anterior, então a lista de regras deve estar nesta " +"ordem: " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Marcar como importante" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Mostrar na lista" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Excluir da lista" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Remover" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Adicionar regra" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Aplicar" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"Obrigado por usar meu widget! Se você aprecia meu trabalho, pode me apoiar " +"estrelando o repositório do GitHub ou me pagando um café ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Visite %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Widgets" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Terminal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Use ícones NerdFont" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" +"Se o seu terminal utilizar qualquer NerdFont, os ícones dessa fonte " +"serão usados." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "Sessão tmux" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Scripts de pré/pós atualização" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "Pré-execução" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Comando ou script" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"Executando seu comando ou script ANTES da atualização.
Por exemplo, você " +"pode especificar um comando para atualizar a mirrorlist se tiver " +"repositórios não oficiais." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "Pós-execução" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"Executando seu comando ou script DEPOIS da atualização.
Por exemplo, você " +"pode especificar um comando para atualizar outra coisa." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Auxiliar Pacman" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR desativado nas configurações de pesquisa" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Opções de atualização" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Reiniciar o sistema" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Sugerir após a atualização" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Gerador de mirrorlist do pacman" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Apenas para repositórios oficiais" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

Veja também https:/archlinux.org/mirrorlist (clique no botão para " +"abrir o link)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Gerador" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Desativado" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Perguntar sempre" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Perguntar se for mais antigo que" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "dia" +msgstr[1] "dias" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Não perguntar, forçar atualização" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Protocolo" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "versão do IP" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Status do mirror" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Número de servidores" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "Número de servidores para gravar no arquivo mirrorlist. 0 para todos." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "País" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Selecione pelo menos um!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"Você deve selecionar pelo menos um país, caso contrário, todos serão " +"escolhidos por padrão.

Quanto mais países você selecionar, mais " +"tempo levará para gerar os espelhos!

É ideal escolher 1-2 " +"países mais próximos de você." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Remover os não utilizados" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Normal" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Normal, pular perguntas" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Não interativo, pular perguntas" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Detalhado" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Confirmação de atualização" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Reiniciar o plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"Após atualizar o widget, a versão antiga ainda permanecerá na memória até " +"que você reinicie o plasmashell. Para evitar fazer isso manualmente, " +"habilite esta opção." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Comando" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Ícone do Apdatifier na bandeja do sistema" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Ativado por padrão" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Verificação automática desabilitada" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Filtrar por nome do pacote" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Desativar busca automática de atualizações" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Ativar busca automática de atualizações" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Ordenar pacotes por nome" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Ordenar pacotes por repositório" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Pare a verificação" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Visualização compacta" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Visualização extendida" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Confira as notas de lançamento" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Recusar" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Atualizar pacote" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Tipo de pacote" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Descrição" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Autor" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "App ID" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Branch" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Commit" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Runtime" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Grupos" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Fornece" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Depende de" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Exigido por" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Conflita com" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Substitui" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Tamanho instalado" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Tamanho do download" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Data de instalação" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Motivo da instalação" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Nenhuma notícia não lida" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Restaurar lista" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Leia a wiki do Arch - Atualizações parciais" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "" +#~ "Realize uma atualização completa do sistema ao invés de uma atualização " +#~ "parcial!" + +#~ msgid "View" +#~ msgstr "Visualização" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Sugerir antes de atualizar" + +#~ msgid "Options" +#~ msgstr "Opções" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "alguns dos utilitários requeridos não estão instalados (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "" +#~ "Você também pode alternar entre as guias arrastando o mouse para a " +#~ "esquerda e para a direita enquanto mantém o botão direito do mouse " +#~ "pressionado." + +#~ msgid "Hide \"News\" tab if no content" +#~ msgstr "Ocultar a guia \"Notícias\" se não houver conteúdo" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ru.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ru.po new file mode 100644 index 0000000..ba2c20e --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/ru.po @@ -0,0 +1,1240 @@ +# Translation of apdatifier in ru +# Copyright (C) 2023 +# This file is distributed under the same license as the apdatifier package. +# Evgeniy Kazantsev , 2023. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2025-03-09 12:00+0300\n" +"Last-Translator: Evgeniy Kazantsev \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.4.4\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "Основное" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "Обновление" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "Внешний вид" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "Правила" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "Поддержать меня" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "Выполняется обновление" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "Полное обновление системы" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Обновление Flatpak" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Обновление Plasma Виджетов" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "Общее время выполнения:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "Обновлены критические пакеты, может потребоваться перезагрузка:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "Вы хотите перезагрузиться прямо сейчас?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "Нажмите Enter чтобы закрыть" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "Пропуск..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "Получение списка последних зеркал" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "Сортировка зеркал по их скорости" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "Проверьте настройки генератора списка зеркал..." + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "был обновлен следующими серверами:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "Для записи в файл mirrorlist необходимы права администратора" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "Ваш текущий список зеркал:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" +"После обновления необходимо выйти из сессии или перезагрузить plasmashell" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "Проверка обновлений для виджетов" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "Получение данных из API" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "Получение ссылки для скачивания" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "Скачивание пакета" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "Продолжить обновление?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "Перезапустить plasmashell сейчас?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "Нет описания" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "" +"Слишком много API запросов с вашего IP за последние 15 минут, попробуйте " +"позже" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "Не удалось получить данные из API" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "Неизвестная ошибка" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "Файл metadata.json не найден" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "Ошибки metadata.json файле" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "Не поддерживаемый формат файла" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "Нет файлов для загрузки" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "Нет файла с тегом версии" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "Несколько файлов имеют тег версии" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "Не удалось скачать пакет" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "Список всех доступных пакетов в репозиториях" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "Список всех установленных пакетов" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "Список явно установленных пакетов" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "Список явно установленных пакетов, которые не являются зависимостями" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "Список установленных зависимостей, которые больше не нужны (сироты)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "Удалить пакеты сироты" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "Установить пакет (понизить версию) из кэша" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "Очистить ВСЕ кэшированные пакеты" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "Очистить кэшированные пакеты, которые не установлены" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Пересборка python пакетов из AUR после обновления python" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "Обновить список зеркал" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "Выход" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "Ознакомьтесь с предупреждениями о зависимостях перед удалением" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "Продолжить?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "Нажмите Enter чтобы вернуться в меню" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "Поиск:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "Выполнено:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "Нечего делать" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "Требуется установленная утилита" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "Код ошибки: " + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "Проверка последних новостей..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "Не удалось получить новости " + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "Проверка системных обновлений..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "Проверка flatpak обновлений..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "Проверка обновлений виджетов..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "Невозможно проверить виджеты: " + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "последний коммит" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 новое обновление" +msgstr[1] "+%1 новых обновлений" +msgstr[2] "+%1 новых обновлений" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "обновление доступно" +msgstr[1] "обновления доступно" +msgstr[2] "обновлений доступно" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "Последняя проверка:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 секунду" +msgstr[1] "%1 секунды" +msgstr[2] "%1 секунд" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 минуту" +msgstr[1] "%1 минуты" +msgstr[2] "%1 минут" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 час" +msgstr[1] "%1 часа" +msgstr[2] "%1 часов" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "назад" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "Нет" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "Проверить обновления" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "Обновить систему" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "Переключить интервал" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "Управление" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "Читать статью" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "Система обновлена" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "Вид иконки на панели" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "Вид списка" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "Показывать когда" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "обновление доступно " +msgstr[1] "обновления доступно " +msgstr[2] "обновлений доступно " + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "Стандартная" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "Выбрать..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "Стандартная иконка" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "Выключенный интервал" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "Включить" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "Счетчик" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "Цвет" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "Стандартный цвет" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "Выбор цвета для фона счетчика" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "Стандартный цвет фона из текущей темы" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "Размер" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "Радиус" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "Непрозрачность" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "Тень" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "Шрифт" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "Стандартный системный шрифт" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "Жирный шрифт" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "Размер шрифта" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "Отступ слева" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "Боковые отступы" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "Смещение" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "Позиция" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "По центру" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "Сверху-слева" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "Сверху-справа" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "Снизу-слева" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "Снизу-справа" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "Встроенные иконки" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "Использовать иконки Apdatifier вместо пользовательских иконок из темы." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "Вкладка по умолчанию" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "Компактный" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "Расширенный" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "Поведение" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "Всегда переключаться на вкладку по умолчанию" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "Высота элементов (Компактный)" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "Сортировка" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "По репозиторию" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "По имени" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "Заголовок" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "Показывать статус" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "Показывать панель инструментов" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "Нижний колонтитул" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "Показывать панель вкладок" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "Показывать имена вкладок" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "Установить тестовую версию" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "Установить стабильную версию" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "Удалить виджет" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "Примечание: версия с последними коммитами может быть нестабильна." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "" +"Примечание: если ранее не была установлена тестовая версия, то нет " +"необходимости устанавливать стабильную версию." + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "" +"Удаление виджета и всех связанных с ним файлов, включая директорию с его " +"конфигурацией." + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "Поиск" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "Уведомления" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "Действия мыши" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "Разное" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"Конфигурация автоматически сохраняется в файл и загружается при каждом " +"запуске, что гарантирует сохранность ваших настроек. Файл настроек хранится " +"в " + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "" +" не установлен! Настоятельно рекомендуется установить его, чтобы получать " +"последние обновления без необходимости обновлять базы данных репозиториев." + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "Интервал" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "минут" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "Текущий таймер будет сброшен при изменении этих настроек." + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "Проверять при запуске" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"Если опция включена, то поиск обновлений будет запущен сразу после " +"запуска виджета.

Если опция выключена, то поиск обновлений " +"будет запущен через заданный интервал с момента запуска виджета. " +"Рекомендуется." + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "Обновления" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Официальные репозитории" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Пользовательский репозиторий" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Flatpak приложения" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "Не установлено" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Plasma виджеты" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

Для разработчиков виджетов:
Не забывайте обновлять файл " +"metadata.json и указывать имя виджета и его версию в точности как и на сайте " +"KDE Store." + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "Новости" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Новости Arch Linux" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "Хранить" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "новость с фида" +msgstr[1] "новости с фида" +msgstr[2] "новостей с фида" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "Для новых обновлений" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "Кнопка действия" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "При каждом изменении версии" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"Если опция включена, уведомления будут приходить, когда версия пакета " +"повышается, даже если этот пакет уже есть в списке. Больше уведомлений.

Если опция выключена, уведомления будут приходить только " +"если пакета еще нет в списке. Меньше уведомлений." + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "Для новостей" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "При ошибках" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "Со звуком" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "Постоянное" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "" +"Для дополнительных настроек, нажмите кнопку ниже -> Параметры приложения -> " +"Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "Настроить..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "Средняя кнопка" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "Правая кнопка" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "" +"Не включайте эту опцию, если виджет не используется в системном трее; иначе " +"вы не сможете открыть настройки, щелкнув правой кнопкой мыши." + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "Прокрутка верх" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "Прокрутка вниз" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "Восстановить скрытые подсказки" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "Не имеет значения" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "Репозиторий" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "Точное совпадение репозитория" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "Группа" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "Совпадение с подстрокой в группе" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "Совпадение" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "Совпадение с подстрокой в имени" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "Имя" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "Точное совпадение имени" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"Здесь вы можете переопределить значки пакетов и исключить их из списка. " +"Каждое правило перезаписывает предыдущее, поэтому список правил должен быть " +"в таком порядке: " + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "Отметить как важное" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "Показывать в списке" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "Исключить из списка" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "Удалить" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "Добавить правило" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "Применить" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"Спасибо, что пользуетесь моим виджетом! Если он понравился, Вы можете " +"поддержать меня, нажав кнопку Star на GitHub, или купив мне кофе ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "Посетите %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "Виджеты" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "Терминал" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "Использовать NerdFont иконки" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "" +"Если в вашем терминале используется любой шрифт Nerd Font, то будут " +"отображаться иконки из этого шрифта." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "tmux сессия" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "Сценарии до/после обновления" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "До" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "Команда или путь к скрипту" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"Запустите свою команду или скрипт ПЕРЕД обновлением.
Например, вы можете " +"указать свою команду для обновления списка зеркал, если у вас есть " +"неофициальные репозитории." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "После" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"Запустите свою команду или скрипт ПОСЛЕ обновления.
Например, вы можете " +"указать свою команду для обновления чего-либо еще." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "Обертка" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR отключен в настройках поиска" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "Опции обновления" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "Перезагрузить систему" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "Предлагать после обновления" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Генератор списка зеркал" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "Только для официальных репозиториев" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" +"

Также смотрите https://archlinux.org/mirrorlist (нажмите на кнопку " +"для открытия ссылки)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "Генератор" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "Отключено" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "Всегда спрашивать" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "Спрашивать, если старше чем" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "день" +msgstr[1] "дня" +msgstr[2] "дней" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "Не спрашивать, обновлять" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "Протокол" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "IP версия" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "Статус зеркал" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "Количество" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "" +"Количество серверов, которые будут записаны в файл mirrorlist. 0 - все " +"доступные." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "Страна" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "Выберите хотя бы одну!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"Вы должны выбрать хотя бы одну страну, иначе будут выбраны все. " +"

Чем больше стран вы выберете, тем дольше будут генерироваться " +"зеркала!

Оптимильно выбрать 1-2 ближайших к вам стран." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "Удалять неиспользуемое" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "Нормально" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "Нормально, пропуск вопросов" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "Не интерактивно, пропуск вопросов" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "Подробно" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "Подтверждение обновления" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "Перезапуск plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"После обновления виджета, старая версия будет в памяти до тех пор пока не " +"будет перезапущена plasmashell. Чтобы не делать это вручную, включите эту " +"опцию." + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "Команда" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "Значок Apdatifier в системном трее" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "Включено по умолчанию" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "Авто проверка выключена" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "Фильтровать по названию пакета" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "Отключить авто-проверку обновлений" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "Включить авто-проверку обновлений" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "Сортировать пакеты по имени" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "Сортировать пакеты по репозиторию" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "Остановить проверку" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "Компактный вид" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "Расширенный вид" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "Посмотрите список изменений" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "Отклонить" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "Обновить пакет" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "Тип пакета" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "Описание" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "Автор" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "ID приложения" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "Ветвь" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "Активный коммит" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "Среда выполнения" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "Группы" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "Предоставляет" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "Зависим от" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "Требуется для" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "Конфликтует" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "Заменяет" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "Размер" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "Размер загрузки" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "Дата установки" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "Причина установки" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "Нет непрочитанных новостей" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "Восстановить список" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "Прочтите Arch Wiki - Частичное обновление" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "Вместо частичного обновления выполните полное обновление системы!" + +#~ msgid "View" +#~ msgstr "Вид" + +#~ msgid "Upgrade button" +#~ msgstr "Кнопка обновления" + +#~ msgid "Suggest before upgrading" +#~ msgstr "Предлагать перед обновлением" + +#~ msgid "Options" +#~ msgstr "Опции" + +#~ msgid "some required utilities are not installed (curl, jq)" +#~ msgstr "некоторые из требуемых утилит не установлены (curl, jq)" + +#~ msgid "" +#~ "You can also switch tabs by dragging the mouse left and right with the " +#~ "right mouse button held." +#~ msgstr "" +#~ "Вы также можете переключаться между вкладками перемещая мышь влево и " +#~ "вправо с зажатой правой клавишей." + +#~ msgid "Hide \"News\" tab if no content" +#~ msgstr "Скрывать \"Новости\" если их нет" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/zh.po b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/zh.po new file mode 100644 index 0000000..74dec5f --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/po/zh.po @@ -0,0 +1,1180 @@ +# Translation of apdatifier in zh +# Copyright (C) 2025 +# This file is distributed under the same license as the apdatifier package. +# Mill Haruto , 2025. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: 2025-06-08 19:45+0800\n" +"Last-Translator: Mill Haruto \n" +"Language-Team: \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.6\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "常规" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "升级" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "外观" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "规则" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "支持我" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "正在升级中" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "系统完整升级" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "Flatpak 升级" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "Plasma 挂件升级" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "总执行时间:" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "关键软件包已更新,可能需要重启:" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "您希望立即重启吗?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "按下 Enter 关闭" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "已跳过..." + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "正在获取最新的筛选后镜像列表" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "正在根据连接速度和打开速度对镜像进行排序" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "请检查您的镜像列表生成器设置…" + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "已通过以下服务器进行了更新:" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "写入镜像列表文件需要 sudo 权限" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "您当前的镜像列表:" + +#: ../contents/tools/sh/messages +msgid "" +"For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "某些挂件在升级后可能需要注销或重启 plasmashell" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "正在检查挂件更新" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "正在从 API 获取数据" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "正在获取下载链接" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "正在下载包" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "是否继续升级?" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "立即重启 plasmashell ?" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "暂无描述" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "" +"Too many API requests in the last 15 minutes from your IP address, please " +"try again later" +msgstr "您的 IP 地址在过去 15 分钟内发送了过多的 API 请求,请稍后再试" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "从 API 获取数据失败" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "未知错误" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "文件 metadata.json 未找到" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "文件 metadata.json 出错" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "不支持的文件格式" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "无可下载文件" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "无标记版本的文件" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "有多个文件被标记了版本" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "包下载失败" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "列出仓库中所有可用的软件包" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "列出所有已安装的软件包" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "列出显式安装的软件包" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "列出显式安装且未被依赖的软件包" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "列出不再需要的已安装依赖(孤儿包)" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "卸载孤儿包" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "从缓存安装(降级)软件包" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "删除所有缓存的软件包" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "删除当前未安装的软件包缓存" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "Python 升级后重建 AUR Python 软件包" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "刷新镜像列表" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "退出" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "卸载前请查看依赖项警告" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "继续?" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "按下 Enter 返回菜单" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "搜索:" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "执行:" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "无事可做" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "需要安装" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "退出代码:" + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "正在检查最新新闻..." + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "无法获取新闻" + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "正在检查系统更新..." + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "正在检查 flatpak 更新..." + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "正在检查挂件更新..." + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "无法检查挂件:" + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "最新提交" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "+%1 项更新" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "项更新待处理" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "上次检查:" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "%1 秒" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 分钟" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "%1 小时" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "前" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "无" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "检查更新" + +#: ../contents/ui/components/ComboBox.qml +#: ../contents/ui/components/Notification.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "升级系统" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "切换间隔" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "管理" + +#: ../contents/ui/components/Notification.qml +#: ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "阅读文章" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "系统已更新" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "面板图标视图" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "列表视图" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "当有" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "个更新待处理时显示" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "默认" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "选择..." + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "默认图标" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "停止间隔" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "启用" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "计数器" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "颜色" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "默认颜色" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "选择计数器背景颜色" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "来自当前主题的默认背景颜色" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "大小" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "圆角半径" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "不透明度" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "阴影" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "字体" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "默认系统字体" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "字体加粗" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "字体大小" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "左间距" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "侧边距" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "偏移" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "位置" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "中间" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "左上" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "右上" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "左下" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "右下" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "使用内置图标" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "覆盖自定义图标主题,改用默认 Apdatifier 图标。" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "默认标签页" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "紧凑" + +#: ../contents/ui/configuration/Appearance.qml +#: ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "扩展" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "行为" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "始终切换到默认标签页" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "元素高度" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "排序" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "按仓库" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "按名称" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "顶栏" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "显示状态" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "显示工具栏" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "底栏" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "显示标签栏" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "显示标签文字" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "安装开发版本" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "安装稳定版本" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "卸载挂件" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "注意:包含最新提交的版本可能不稳定。" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Note: if you haven't installed the Devel version before, there's no need to " +"install the Stable version." +msgstr "注意:如果之前未安装过开发版,则无需安装稳定版。" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Removal of the widget and all related files, including the directory with " +"its configuration." +msgstr "卸载挂件及其所有相关文件,包括存放配置的目录。" + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "搜索" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "通知" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "鼠标操作" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "其他" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Configuration is automatically saved in a config file and loaded at every " +"startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" +"配置会自动保存至配置文件,并在每次启动时加载,确保您的设置不会丢失。配置文件" +"存放于" + +#: ../contents/ui/configuration/General.qml +msgid "" +" not installed! Highly recommended to install it for getting the latest " +"updates without the need to download fresh package databases." +msgstr "未安装!强烈建议安装,以便无需下载新的软件包数据库即可获取最新更新。" + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "间隔" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "分钟" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "当更改任一设置时,当前计时器将被重置。" + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "启动时检查" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon " +"widget startup.

If the option is disabled, update checking " +"will be initiated after a specified time interval has passed since the " +"widget was started. Recommended." +msgstr "" +"如果启用该选项,挂件启动后将立即开始检查更新。

如果禁用" +"该选项,则在挂件启动后经过设定的时间间隔才开始检查更新。推荐使用此方式。" + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "更新" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "Arch 官方仓库" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "Arch 用户软件仓库" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "Flatpak 应用" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "未安装" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "Plasma 挂件" + +#: ../contents/ui/configuration/General.qml +msgid "" +"

For widget developers:
Don't forget to update the metadata.json " +"and specify the name of the applet and its version exactly as they " +"appear on the KDE Store." +msgstr "" +"

对于挂件开发者:
不要忘记更新 metadata.json 文件,准确指定" +"挂件的名称及版本号,需与 KDE 商店中显示的完全一致。" + +#: ../contents/ui/configuration/General.qml +#: ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "新闻通知" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "Arch Linux 新闻" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "保留" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "条来自订阅源的新闻" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "新更新通知" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "操作按钮" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "每次版本更新通知" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new " +"version of the package is bumped, even if the package is already on the " +"list. More notifications.

If the option is disabled, " +"notifications will only be sent for packages that are not yet on the list. " +"Less notifications." +msgstr "" +"如果启用该选项,当软件包有新版本发布时,即使该软件包已在列表中,也会发" +"送通知。更多通知。

如果禁用该选项,则仅对尚未在列表中的" +"软件包发送通知。更少通知。" + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "新闻" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "错误通知" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "播放声音" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "常驻通知" + +#: ../contents/ui/configuration/General.qml +msgid "" +"To further configure, click the button below -> Application Settings -> " +"Apdatifier" +msgstr "如需进一步配置,请点击以下按钮 -> 应用程序设置 -> Apdatifier" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "配置..." + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "中键点击" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "右键点击" + +#: ../contents/ui/configuration/General.qml +msgid "" +"Do not enable this option if the widget is not used in the system tray; " +"otherwise, you will not be able to open the settings by right-clicking." +msgstr "若挂件未在系统托盘中使用,请勿启用此选项,否则无法通过右键打开设置。" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "向上滚动" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "向下滚动" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "恢复隐藏的工具提示" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "不重要" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "仓库" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "精确匹配仓库" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "组" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "子串匹配组" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "子串" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "子串匹配名字" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "名字" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "精确匹配名字" + +#: ../contents/ui/configuration/Rules.qml +msgid "" +"Here you can override the default package icons and exclude them from the " +"list. Each rule overwrites the previous one, so the list of rules should be " +"in this order: " +msgstr "" +"在此处,您可以覆盖默认的软件包图标并将其从列表中排除。每条规则都会覆盖前一条" +"规则,因此规则列表应按以下顺序排列:" + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "标记为重要" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "在列表中显示" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "从列表中排除" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "移除" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "添加规则" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "应用" + +#: ../contents/ui/configuration/Support.qml +msgid "" +"Thanks for using my widget! If you appreciate my work, you can support me by " +"starring the GitHub repository or buying me a coffee ;)" +msgstr "" +"感谢您使用我的挂件!如果您喜欢我的工作,可以通过给我的 GitHub 仓库点星或请我" +"喝杯咖啡来支持我 ;)" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "访问 %1" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "挂件" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "终端" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "使用 NerdFont 图标" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"If your terminal utilizes any Nerd Font, icons from that font will be " +"used." +msgstr "如果您的终端使用了任何 Nerd Font,将会使用该字体中的图标。" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "tmux 会话" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "升级前/后脚本" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "升级前执行" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "命令或脚本路径" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script BEFORE the upgrade.
For example, you can " +"specify your command to update the mirrorlist if you have unofficial " +"repositories." +msgstr "" +"在升级之前运行您的命令或脚本。
例如,如果您使用了非官方仓库,可以在此指定" +"用于更新镜像列表的命令。" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "升级后执行" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"Running your command or script AFTER the upgrade.
For example, you can " +"specify your command to upgrade something else." +msgstr "" +"在升级完成后运行您的命令或脚本。
例如,您可以指定用于升级其他内容的命令。" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "封装" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "AUR 在搜索设置中已被禁用" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "升级选项" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "重启系统" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "升级后建议" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "Pacman 镜像列表生成器" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "仅适用于官方仓库" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "

另请参见 https://archlinux.org/mirrorlist (点击按钮打开链接)" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "生成器" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "已禁用" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "始终询问" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "如果早于…则询问" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "天" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "不询问,强制刷新" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "协议" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "IP 版本" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "镜像状态" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "输出数量" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "写入镜像列表文件的服务器数量。 0 表示全部服务器。" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "国家" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "至少选择一个!" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by " +"default.

The more countries you select, the longer it will take " +"to generate the mirrors!

It is optimal to choose 1-2 " +"countries closest to you." +msgstr "" +"您必须至少选择一个国家,否则默认会选择全部国家。

选择的国家越多,生" +"成镜像列表所需时间越长!

建议选择距离您最近的1-2 个国家以获" +"得最佳效果。" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "卸载未使用的软件包" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "正常" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "正常,跳过询问" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "非交互模式,跳过询问" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "详细模式" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "升级确认" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "重启 plasmashell" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"After upgrading widget, the old version will still remain in memory until " +"you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" +"升级挂件后,旧版本仍会驻留在内存中,直到您重启 plasmashell。为避免手动操作," +"建议启用此选项" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "命令" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "系统托盘中的 Apdatifier 图标" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "默认启用" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "自动检查已禁用" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "按软件包名称筛选" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "禁用自动搜索更新" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "启用自动搜索更新" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "按名称排序软件包" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "按仓库排序软件包" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "停止检查" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "紧凑视图" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "扩展视图" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "查看发行说明" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "忽略" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "升级软件包" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "包类型" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "描述" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "作者" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "App ID" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "分支" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "提交" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "运行时" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "组" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "提供" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "依赖于" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "依赖它" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "与它冲突" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "取代" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "安装后大小" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "下载大小" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "安装日期" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "安装原因" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "无未读新闻" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "恢复列表" + +#~ msgid "Read the Arch Wiki - Partial Upgrades" +#~ msgstr "阅读 Arch Wiki - 部分更新" + +#~ msgid "Perform full system upgrade instead partial upgrade!" +#~ msgstr "请执行系统完整升级而非部分升级!" + +#~ msgid "View" +#~ msgstr "视图" + +#~ msgid "Upgrade button" +#~ msgstr "升级按钮" + +#~ msgid "Suggest before upgrading" +#~ msgstr "升级前建议" diff --git a/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/template.pot b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/template.pot new file mode 100644 index 0000000..634db1d --- /dev/null +++ b/kde-dotfiles/.local/share/plasma/plasmoids/com.github.exequtic.apdatifier/translate/template.pot @@ -0,0 +1,1097 @@ +# Translation of apdatifier in LANGUAGE +# Copyright (C) 2025 +# This file is distributed under the same license as the apdatifier package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: apdatifier\n" +"Report-Msgid-Bugs-To: https://github.com/exequtic/apdatifier\n" +"POT-Creation-Date: 2025-08-30 18:31+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: ../contents/config/config.qml ../contents/ui/configuration/Upgrade.qml +msgid "General" +msgstr "" + +#: ../contents/config/config.qml ../contents/tools/sh/messages +msgid "Upgrade" +msgstr "" + +#: ../contents/config/config.qml +msgid "Appearance" +msgstr "" + +#: ../contents/config/config.qml +msgid "Rules" +msgstr "" + +#: ../contents/config/config.qml +msgid "Support me" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Upgrade in progress" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Full system upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Flatpak Upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Plasma Widgets Upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Total execution time:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Critical package(s) updated, reboot may be required:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Do you want to reboot now?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Press Enter to close" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Skipped..." +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Fetching the latest filtered mirror list" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Ranking mirrors by their connection and opening speed" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Check your mirrorlist generator settings..." +msgstr "" + +#: ../contents/tools/sh/messages +msgid "was updated with the following servers:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "To write to the mirrorlist file, sudo privileges are required" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Your current mirrorlist:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "For some widgets you may need to Log Out or restart plasmashell after upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Checking widgets for updates" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Fetching data from the API" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Getting the download link" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Downloading package" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Proceed with upgrade?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Restart plasmashell now?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "No description" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Too many API requests in the last 15 minutes from your IP address, please try again later" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Failed to retrieve data from the API" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js +msgid "Unkwnown error" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "File metadata.json not found" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Errors in metadata.json file" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Unsupported file format" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "No files for download" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "No file tagged with version" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Multiple files are tagged with version" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Failed to download the package" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List all available packages in repositories" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List all installed packages" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List explicitly installed packages and isn't a dependency of anything" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "List installed dependencies that aren't needed anymore (orphans)" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Uninstall orphan packages" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Install (downgrade) a package from cache" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Remove ALL cached packages" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Remove cached packages that are not currently installed" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Rebuild AUR python packages after python upgrade" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Refresh mirrorlist" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Exit" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Review dependency warnings before removing" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Resume?" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Press Enter to return menu" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Search:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Executed:" +msgstr "" + +#: ../contents/tools/sh/messages +msgid "Nothing to do" +msgstr "" + +#: ../contents/tools/sh/messages ../contents/tools/tools.js ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Required installed" +msgstr "" + +#: ../contents/tools/tools.js +msgid "Exit code: " +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking latest news..." +msgstr "" + +#: ../contents/tools/tools.js +msgid "Cannot fetch news " +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking system updates..." +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking flatpak updates..." +msgstr "" + +#: ../contents/tools/tools.js +msgid "Checking widgets updates..." +msgstr "" + +#: ../contents/tools/tools.js +msgid "Unable check widgets: " +msgstr "" + +#: ../contents/tools/tools.js +msgid "latest commit" +msgstr "" + +#: ../contents/tools/tools.js +msgid "+%1 new update" +msgid_plural "+%1 new updates" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/tools/tools.js +msgid "update is pending" +msgid_plural "updates are pending" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/tools/tools.js +msgid "Last check:" +msgstr "" + +#: ../contents/tools/tools.js +msgid "%1 second" +msgid_plural "%1 seconds" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/tools/tools.js +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/tools/tools.js +msgid "%1 hour" +msgid_plural "%1 hours" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/tools/tools.js +msgid "ago" +msgstr "" + +#: ../contents/ui/components/ComboBox.qml +msgid "None" +msgstr "" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Check updates" +msgstr "" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/components/Notification.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Upgrade system" +msgstr "" + +#: ../contents/ui/components/ComboBox.qml +msgid "Switch interval" +msgstr "" + +#: ../contents/ui/components/ComboBox.qml ../contents/ui/main.qml ../contents/ui/representation/Expanded.qml +msgid "Management" +msgstr "" + +#: ../contents/ui/components/Notification.qml ../contents/ui/scrollview/News.qml +msgid "Read article" +msgstr "" + +#: ../contents/ui/components/Placeholder.qml +msgid "System updated" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Panel Icon View" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "List View" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shown when" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "update is pending " +msgid_plural "updates are pending " +msgstr[0] "" +msgstr[1] "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Select..." +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default icon" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Stopped interval" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/configuration/Upgrade.qml +msgid "Enable" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Counter" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Color" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default color" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Select counter background color" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default background color from current theme" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Size" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Radius" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Opacity" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Shadow" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default system font" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font bold" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Font size" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Left spacing" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Side margins" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Offset" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Position" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Center" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Left" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Top-Right" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Left" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Bottom-Right" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Use built-in icons" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Override custom icon theme and use default Apdatifier icons instead." +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Default tab" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Compact" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml ../contents/ui/representation/Expanded.qml +msgid "Extended" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Behavior" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Always switch to default tab" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Item spacing (Compact)" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Sorting" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By repository" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "By name" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Header" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show status" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tool bar" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Footer" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab bar" +msgstr "" + +#: ../contents/ui/configuration/Appearance.qml +msgid "Show tab texts" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Install Development version" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Install Stable version" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Uninstall widget" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Note: version with the latest commits may be unstable." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Note: if you haven't installed the Devel version before, there's no need to install the Stable version." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Removal of the widget and all related files, including the directory with its configuration." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Search" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Notifications" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Mouse actions" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Misc" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Configuration is automatically saved in a config file and loaded at every startup, ensuring you never lose your settings. The config file is stored in " +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid " not installed! Highly recommended to install it for getting the latest updates without the need to download fresh package databases." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Interval" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "minutes" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "The current timer is reset when either of these settings is changed." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Check on start up" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, update checking will begin immediately upon widget startup.

If the option is disabled, update checking will be initiated after a specified time " +"interval has passed since the widget was started. Recommended." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Updates" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Official Repositories" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Arch User Repository" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Flatpak applications" +msgstr "" + +#: ../contents/ui/configuration/General.qml ../contents/ui/configuration/Upgrade.qml +msgid "Not installed" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Plasma Widgets" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "

For widget developers:
Don't forget to update the metadata.json and specify the name of the applet and its version exactly as they appear on the KDE Store." +msgstr "" + +#: ../contents/ui/configuration/General.qml ../contents/ui/representation/Expanded.qml +msgid "News" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Arch Linux News" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Keep" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "news item from the feed" +msgid_plural "news items from the feed" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/ui/configuration/General.qml +msgid "For new updates" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Action button" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For every version bump" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "" +"If the option is enabled, notifications will be sent when a new version of the package is bumped, even if the package is already on the list. More notifications.

If the option " +"is disabled, notifications will only be sent for packages that are not yet on the list. Less notifications." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For news" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "For errors" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "With sound" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Persistent" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "To further configure, click the button below -> Application Settings -> Apdatifier" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Configure..." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Middle click" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Right click" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Do not enable this option if the widget is not used in the system tray; otherwise, you will not be able to open the settings by right-clicking." +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll up" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Scroll down" +msgstr "" + +#: ../contents/ui/configuration/General.qml +msgid "Restore hidden tooltips" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Unimportant" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Repository" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact repository match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Group" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring group match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Substring name match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Name" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exact name match" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Here you can override the default package icons and exclude them from the list. Each rule overwrites the previous one, so the list of rules should be in this order: " +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Mark as important" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Show in the list" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Exclude from the list" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml ../contents/ui/scrollview/News.qml +msgid "Remove" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Add rule" +msgstr "" + +#: ../contents/ui/configuration/Rules.qml +msgid "Apply" +msgstr "" + +#: ../contents/ui/configuration/Support.qml +msgid "Thanks for using my widget! If you appreciate my work, you can support me by starring the GitHub repository or buying me a coffee ;)" +msgstr "" + +#: ../contents/ui/configuration/Support.qml +msgid "Visit %1" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Widgets" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Terminal" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Use NerdFont icons" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "If your terminal utilizes any Nerd Font, icons from that font will be used." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "tmux session" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre/post upgrade scripts" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pre-exec" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command or script path" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script BEFORE the upgrade.
For example, you can specify your command to update the mirrorlist if you have unofficial repositories." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Post-exec" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Running your command or script AFTER the upgrade.
For example, you can specify your command to upgrade something else." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Wrapper" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "AUR disabled in search settings" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade options" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Reboot system" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Suggest after upgrading" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Pacman Mirrorlist Generator" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Only for official repositories" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "

Also see https://archlinux.org/mirrorlist (click button to open link)" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Generator" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Disabled" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Always ask" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Ask if older than" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "day" +msgid_plural "days" +msgstr[0] "" +msgstr[1] "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "No ask, force refresh" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Protocol" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "IP version" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Mirror status" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number output" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Number of servers to write to mirrorlist file. 0 for all." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Country" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Select at least one!" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "" +"You must select at least one country, otherwise all will be chosen by default.

The more countries you select, the longer it will take to generate the mirrors!

It is optimal " +"to choose 1-2 countries closest to you." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Uninstall unused" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Normal, skip questions" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Non interactive, skip questions" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Verbose" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Upgrade confirmation" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Restart plasmashell" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "After upgrading widget, the old version will still remain in memory until you restart plasmashell. To avoid doing this manually, enable this option." +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Command" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Apdatifier tray icon" +msgstr "" + +#: ../contents/ui/configuration/Upgrade.qml +msgid "Enabled by default" +msgstr "" + +#: ../contents/ui/main.qml +msgid "Auto check disabled" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Filter by package name" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Disable auto search updates" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Enable auto search updates" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by name" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Sort packages by repository" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Stop checking" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Compact view" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Extended view" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Check out release notes" +msgstr "" + +#: ../contents/ui/representation/Expanded.qml +msgid "Dismiss" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Upgrade package" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Package type" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Description" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Author" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "App ID" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Branch" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Commit" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Runtime" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Groups" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Provides" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Depends on" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Required by" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Conflicts with" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Replaces" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Installed size" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Download size" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install date" +msgstr "" + +#: ../contents/ui/scrollview/Extended.qml +msgid "Install reason" +msgstr "" + +#: ../contents/ui/scrollview/News.qml +msgid "No unread news" +msgstr "" + +#: ../contents/ui/scrollview/News.qml +msgid "Restore list" +msgstr "" diff --git a/minimal-niri-dotfiles/.config/MangoHud/MangoHud.conf b/minimal-niri-dotfiles/.config/MangoHud/MangoHud.conf new file mode 100644 index 0000000..e3c586f --- /dev/null +++ b/minimal-niri-dotfiles/.config/MangoHud/MangoHud.conf @@ -0,0 +1,42 @@ +# Config Generated by MangoJuice # +legacy_layout=false +gpu_stats +gpu_temp +gpu_power +gpu_voltage +cpu_stats +cpu_temp +cpu_power +ram +fps +fps_metrics=avg,0.01 +frame_timing +frame_timing_detailed +wine +toggle_logging=Shift_L+F2 +toggle_hud_position=Shift_R+F11 +fps_limit_method=late +toggle_fps_limit=Shift_L+F1 +background_alpha=0.5 +position=top-left +table_columns=4 +toggle_hud=Shift_R+F12 +gpu_color=2e9762 +cpu_color=2e97cb +fps_value=30,60 +fps_color=cc0000,ffaa7f,92e79a +gpu_load_value=60,90 +gpu_load_color=92e79a,ffaa7f,cc0000 +cpu_load_value=60,90 +cpu_load_color=92e79a,ffaa7f,cc0000 +background_color=000000 +frametime_color=00ff00 +vram_color=ad64c1 +ram_color=c26693 +wine_color=eb5b5b +engine_color=eb5b5b +text_color=ffffff +media_player_color=ffffff +network_color=e07b85 +battery_color=92e79a +media_player_format={title};{artist};{album} diff --git a/minimal-niri-dotfiles/.config/Thunar/accels.scm b/minimal-niri-dotfiles/.config/Thunar/accels.scm new file mode 100644 index 0000000..92c2059 --- /dev/null +++ b/minimal-niri-dotfiles/.config/Thunar/accels.scm @@ -0,0 +1,136 @@ +; thunar GtkAccelMap rc-file -*- scheme -*- +; this file is an automated accelerator map dump +; +; (gtk_accel_path "/ThunarStandardView/sort-by-type" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-last-modified" "") +; (gtk_accel_path "/Thunarwindow/menu" "") +; (gtk_accel_path "/ThunarActionManager/cut" "x") +; (gtk_accel_path "/ThunarStandardView/sort-by-size" "") +(gtk_accel_path "/ThunarActions/uca-action-1769427857102992-1" "v") +; (gtk_accel_path "/ThunarWindow/file-menu" "") +; (gtk_accel_path "/ThunarWindow/close-tab" "w") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab-alt" "ISO_Left_Tab") +; (gtk_accel_path "/ThunarStatusBar/toggle-size" "") +; (gtk_accel_path "/ThunarWindow/new-window" "n") +; (gtk_accel_path "/ThunarWindow/clear-directory-specific-settings" "") +; (gtk_accel_path "/ThunarWindow/close-window" "q") +; (gtk_accel_path "/ThunarWindow/open-parent" "Up") +; (gtk_accel_path "/ThunarWindow/view-side-pane-menu" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-size-in-bytes" "") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab" "Page_Up") +; (gtk_accel_path "/ThunarBookmarks/43958e0ed33f21f69df101ad8063a653" "") +; (gtk_accel_path "/ThunarActionManager/open" "o") +; (gtk_accel_path "/ThunarStandardView/sort-ascending" "") +; (gtk_accel_path "/ThunarWindow/toggle-split-view" "F3") +; (gtk_accel_path "/ThunarActionManager/copy-2" "Insert") +; (gtk_accel_path "/ThunarActionManager/trash-delete" "Delete") +; (gtk_accel_path "/ThunarWindow/open-recent" "") +; (gtk_accel_path "/ThunarWindow/view-configure-toolbar" "") +; (gtk_accel_path "/ThunarStandardView/forward" "Right") +; (gtk_accel_path "/ThunarActionManager/restore" "") +; (gtk_accel_path "/ThunarWindow/open-location-alt" "d") +; (gtk_accel_path "/ThunarStandardView/select-by-pattern" "s") +; (gtk_accel_path "/ThunarWindow/zoom-out-alt" "KP_Subtract") +; (gtk_accel_path "/ThunarWindow/contents" "F1") +; (gtk_accel_path "/ThunarWindow/open-file-menu" "F10") +; (gtk_accel_path "/ThunarBookmarks/54761b802eb6de69c74ff01588374999" "") +; (gtk_accel_path "/ThunarWindow/show-highlight" "") +; (gtk_accel_path "/ThunarStandardView/sort-descending" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-name" "") +; (gtk_accel_path "/ThunarStandardView/select-all-files" "a") +; (gtk_accel_path "/ThunarActionManager/execute" "") +; (gtk_accel_path "/ThunarStandardView/properties" "Return") +; (gtk_accel_path "/ThunarActionManager/cut-2" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-dtime" "") +; (gtk_accel_path "/ThunarWindow/open-templates" "") +; (gtk_accel_path "/ThunarActionManager/paste-2" "Insert") +; (gtk_accel_path "/ThunarWindow/switch-next-tab" "Page_Down") +; (gtk_accel_path "/ThunarStatusBar/toggle-filetype" "") +; (gtk_accel_path "/ThunarWindow/close-all-windows" "w") +; (gtk_accel_path "/ThunarStandardView/create-document" "") +; (gtk_accel_path "/ThunarWindow/detach-tab" "") +; (gtk_accel_path "/ThunarWindow/cancel-search" "Escape") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt2" "equal") +; (gtk_accel_path "/ThunarStatusBar/toggle-hidden-count" "") +; (gtk_accel_path "/ThunarShortcutsPane/sendto-shortcuts" "d") +; (gtk_accel_path "/ThunarActionManager/undo" "z") +; (gtk_accel_path "/ThunarWindow/view-location-selector-entry" "") +; (gtk_accel_path "/ThunarStandardView/toggle-sort-order" "") +(gtk_accel_path "/ThunarActions/uca-action-1769429285959977-2" "v") +; (gtk_accel_path "/ThunarBookmarks/974ddf6f60ae0a85b557432c4c4f2cd9" "") +; (gtk_accel_path "/ThunarActionManager/paste" "v") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt1" "KP_Add") +; (gtk_accel_path "/ThunarWindow/view-menubar" "m") +; (gtk_accel_path "/ThunarActionManager/restore-show" "") +; (gtk_accel_path "/ThunarWindow/open-desktop" "") +; (gtk_accel_path "/ThunarWindow/view-as-detailed-list" "2") +; (gtk_accel_path "/ThunarStandardView/back" "Left") +; (gtk_accel_path "/ThunarWindow/zoom-out" "minus") +; (gtk_accel_path "/ThunarStatusBar/toggle-display-name" "") +; (gtk_accel_path "/ThunarWindow/sendto-menu" "") +; (gtk_accel_path "/ThunarWindow/go-menu" "") +; (gtk_accel_path "/ThunarWindow/remove-from-recent" "") +; (gtk_accel_path "/ThunarBookmarks/cfa69549cdb5c4c993b09b04df44c6b4" "") +; (gtk_accel_path "/ThunarActionManager/open-with-other" "") +; (gtk_accel_path "/ThunarStandardView/invert-selection" "i") +; (gtk_accel_path "/ThunarWindow/view-side-pane-shortcuts" "b") +; (gtk_accel_path "/ThunarBookmarks/cab0112e8c7d4b26ba7cf8d0f8b46cc6" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-2" "Reload") +; (gtk_accel_path "/ThunarWindow/view-location-selector-menu" "") +; (gtk_accel_path "/ThunarWindow/edit-menu" "") +; (gtk_accel_path "/ThunarActionManager/copy" "c") +; (gtk_accel_path "/ThunarStandardView/sort-by-mtime" "") +; (gtk_accel_path "/ThunarStandardView/forward-alt" "Forward") +; (gtk_accel_path "/ThunarActionManager/move-to-trash" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-1" "F5") +; (gtk_accel_path "/ThunarActionManager/delete-3" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/unselect-all-files" "Escape") +; (gtk_accel_path "/ThunarStandardView/arrange-items-menu" "") +; (gtk_accel_path "/ThunarWindow/bookmarks-menu" "") +; (gtk_accel_path "/ThunarWindow/reload" "r") +; (gtk_accel_path "/ThunarWindow/open-computer" "") +; (gtk_accel_path "/ThunarWindow/toggle-image-preview" "") +; (gtk_accel_path "/ThunarWindow/toggle-side-pane" "F9") +; (gtk_accel_path "/ThunarWindow/view-as-icons" "1") +; (gtk_accel_path "/ThunarActionManager/delete-2" "Delete") +; (gtk_accel_path "/ThunarWindow/zoom-in" "plus") +; (gtk_accel_path "/ThunarStandardView/rename" "F2") +; (gtk_accel_path "/ThunarWindow/open-location" "l") +; (gtk_accel_path "/ThunarWindow/view-as-compact-list" "3") +; (gtk_accel_path "/ThunarWindow/view-menu" "") +; (gtk_accel_path "/ThunarWindow/search" "f") +; (gtk_accel_path "/ThunarWindow/new-tab" "t") +; (gtk_accel_path "/ThunarWindow/zoom-reset" "0") +; (gtk_accel_path "/ThunarWindow/contents/help-menu" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-tab" "p") +; (gtk_accel_path "/ThunarWindow/view-location-selector-buttons" "") +; (gtk_accel_path "/ThunarStandardView/back-alt2" "Back") +; (gtk_accel_path "/ThunarActionManager/redo" "z") +; (gtk_accel_path "/ThunarWindow/open-trash" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-window" "o") +; (gtk_accel_path "/ThunarWindow/view-statusbar" "") +; (gtk_accel_path "/ThunarActionManager/open-location" "") +; (gtk_accel_path "/ThunarStandardView/duplicate" "") +; (gtk_accel_path "/ThunarActionManager/trash-delete-2" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/back-alt1" "BackSpace") +; (gtk_accel_path "/ThunarBookmarks/8b904a8394ac05541f9a6e2192949ce2" "") +; (gtk_accel_path "/ThunarBookmarks/88b2652848ed389ddc7f23513e177f1d" "") +; (gtk_accel_path "/ThunarStandardView/create-folder" "n") +; (gtk_accel_path "/ThunarWindow/open-home" "Home") +; (gtk_accel_path "/ThunarWindow/switch-focused-split-view-pane" "") +; (gtk_accel_path "/ThunarWindow/show-hidden" "h") +; (gtk_accel_path "/ThunarStandardView/set-default-app" "") +(gtk_accel_path "/ThunarActions/uca-action-1763109685799433-1" "t") +; (gtk_accel_path "/ThunarWindow/empty-trash" "") +; (gtk_accel_path "/ThunarWindow/preferences" "") +; (gtk_accel_path "/ThunarActionManager/delete" "") +; (gtk_accel_path "/ThunarWindow/open-network" "") +; (gtk_accel_path "/ThunarWindow/view-side-pane-tree" "e") +; (gtk_accel_path "/ThunarWindow/open-file-system" "") +; (gtk_accel_path "/ThunarWindow/search-alt" "Search") +; (gtk_accel_path "/ThunarWindow/switch-next-tab-alt" "Tab") +; (gtk_accel_path "/ThunarActionManager/sendto-desktop" "") +; (gtk_accel_path "/ThunarStandardView/make-link" "") +(gtk_accel_path "/ThunarActions/uca-action-1770297188807065-1" "space") +; (gtk_accel_path "/ThunarWindow/zoom-reset-alt" "KP_0") +; (gtk_accel_path "/ThunarWindow/about" "") diff --git a/minimal-niri-dotfiles/.config/Thunar/uca.xml b/minimal-niri-dotfiles/.config/Thunar/uca.xml new file mode 100644 index 0000000..4b952d5 --- /dev/null +++ b/minimal-niri-dotfiles/.config/Thunar/uca.xml @@ -0,0 +1,123 @@ + + + + utilities-terminal + Open Terminal Here + + 1763109685799433-1 + kitty -e fish + Example for a custom action + + * + + + + + + 多媒体信息 + + 1769424941490550-1 + kitty --class "media_info" -e media-info %f + + * + * + + + + + + 粘贴为链接 + + 1769427857102992-1 + sh -c 'wl-paste -t text/uri-list | python3 -c " +import sys, os, urllib.parse +dest_dir = sys.argv[1] + +# 逐行读取剪贴板里的文件 +for line in sys.stdin: + # 1. 清理路径:解码URL并去掉 file:// 前缀 + src = urllib.parse.unquote(line.strip()).replace(\"file://\", \"\") + + # 2. 基础检查 + if not src or not os.path.exists(src): continue + + # 3. 计算目标文件名 + filename = os.path.basename(src) + target = os.path.join(dest_dir, filename) + + # 4. 重名检测循环:如果有同名文件,变成 \"文件名 (1).后缀\" + root, ext = os.path.splitext(filename) + counter = 1 + while os.path.exists(target): + target = os.path.join(dest_dir, f\"{root} ({counter}){ext}\") + counter += 1 + + # 5. 创建链接 + try: os.symlink(src, target) + except: pass +" %f' + + * + * + + + + + 粘贴剪贴板图片 + + 1769429285959977-2 + bash -c 'd="%f";[ -d "$d" ]||d="$(dirname "$d")";cd "$d"||exit;n="img_$(date -Iseconds|cut -d+ -f1|tr T _|tr : -)";t=$(wl-paste -l);if echo "$t"|grep -q "^image/";then wl-paste -t image/png>"$n.png";elif echo "$t"|grep -q "text/uri-list";then u=$(wl-paste -t text/uri-list|head -n1);if [[ "$u" == file://* ]];then p="${u#file://}";f=$(python3 -c "import sys,urllib.parse;print(urllib.parse.unquote(sys.argv[1]))" "$p");[ -f "$f" ]&&cp "$f" "$n.${f##*.}";fi;fi' + + * + * + + + + + 视频转gif + + 1769514623477685-1 + kitty --class="floating-term" -e video2gif %F + + * + * + + + + + 图片转png + + 1769516013413116-2 + bash -c 'exec 1>>/tmp/img_err.log 2>&1; /usr/bin/notify-send "图片转换" "正在后台处理 $# 张图片..."; for f in "$@"; do /usr/bin/magick -background none "$f" -delete 1--1 "$(echo "$f" | sed "s/\.[^.]*$//").png"; done; /usr/bin/notify-send "图片转换" "处理完成"' -- %F + + * + * + + + + + 压缩视频大小 + + 1770021157399945-1 + kitty --class floating-term bash -c 'f="$1"; out="$(echo "$f" | sed "s/\.[^.]*$//")_compressed.mp4"; echo "正在处理: $f"; if ffmpeg -i "$f" -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -crf 26 -preset slow -c:a aac -b:a 128k -pix_fmt yuv420p "$out"; then echo -e "\n✅ 压缩完成!文件已保存为: $out"; else echo -e "\n❌ 压缩失败,请查看上方报错信息。"; fi; read -n 1 -s -r -p "按任意键退出..."' -- %f + + * + * + + + + + 快速查看 + + 1770297188807065-1 + kitty --class="floating-term" -e bash -c "~/.local/bin/preview \"\$1\"; read -n 1 -s -r" -- %f + + * + * + + + + + + + diff --git a/minimal-niri-dotfiles/.config/fastfetch/config.jsonc b/minimal-niri-dotfiles/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..cf9242e --- /dev/null +++ b/minimal-niri-dotfiles/.config/fastfetch/config.jsonc @@ -0,0 +1,124 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "logo": { + "type":"sixel", + //"source": "/home/shorin/Pictures/picture.png", + "width": 25, + // "height":20, + "padding": { + "top": 1, // Top padding + "left": 2, // Left padding + "right": 2 // Right padding + }, + }, + "display": { + "separator": " ", // Separator between keys and values + "color": { + //"keys": "#b2ccc1", // Key color module名字的颜色 + "title": "#bfc9c3", // Title color 主机名的颜色 + "output": "#bfc9c3" + }, + }, + "modules": [ + "break", + { + "type": "os", //这是哪个module + "key": "OS", //module名字的显示 + // "keyColor": "#00ff00", //module名字颜色 + // "format": "{name} {version}", //具体内容 + "keyColor": "#88d6bb", + + }, + { + "type": "kernel", + "key": " ├  KER ", + "keyColor": "#88d6bb", + + }, + { + "type": "packages", + "key": " ├  PAK ", + "format": "{all}", + "keyColor": "#88d6bb", + }, + { + "type": "title", + "key": " └  USR ", + "keyColor": "#88d6bb", + }, + "break", + "break", + { + "type": "wm", + "key": "WM", + "keyColor": "#a8cbe2", + }, + { + "type": "de", + "key": " ├ 󱈹 DES ", + "keyColor": "#a8cbe2", + //"outputColor": "#a8cbe2" + }, + { + "type": "shell", + "key": " ├  SHE ", + "keyColor": "#a8cbe2", + //"outputColor": "#a8cbe2" + }, + { + "type": "terminal", + "key": " ├  TER ", + "keyColor": "#a8cbe2", + //"outputColor": "#a8cbe2" + }, + { + "type": "terminalfont", + "key": " └  TFO ", + "keyColor": "#a8cbe2", + //"outputColor": "#a8cbe2" + }, + "break", + "break", + { + "type": "host", + "key": "PC ", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + { + "type": "cpu", + "key": " ├  CPU ", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + { + "type": "memory", + "key": " ├  MEM ", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + { + "type": "gpu", + "key": " ├ 󰢮 GPU ", + "format": "{1} {2}", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + { + "type": "display", + "key": " ├  MON ", + "format": "{name} {width}x{height}@{refresh-rate} ", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + { + "type": "disk", + "key": " └ 󰋊 DIS ", + "keyColor": "#cee9dd", + //"outputColor": "#b2ccc1" + }, + "break", + "break", + "colors" + ] +} diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/cached_layouts b/minimal-niri-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..28b5b8b --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3745 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-pl-slaviature] +Description="键盘 - 波兰语 - Polish (Slavistic Phonetic Alphabet)" +Language=pl +Label="pl (slaviature)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/chttrans.conf b/minimal-niri-dotfiles/.config/fcitx5/conf/chttrans.conf new file mode 100644 index 0000000..04476ad --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/chttrans.conf @@ -0,0 +1,12 @@ +# 转换引擎 +Engine=OpenCC +# 启用的输入法 +EnabledIM= +# 简转繁的 OpenCC 配置 +OpenCCS2TProfile=default +# 繁转简的 OpenCC 配置 +OpenCCT2SProfile=default + +[Hotkey] +0=Control+Shift+F + diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/classicui.conf b/minimal-niri-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..ecb49a5 --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# 垂直候选列表 +Vertical Candidate List=True +# 使用鼠标滚轮翻页 +WheelForPaging=True +# 字体 +Font="Sans Serif 11" +# 菜单字体 +MenuFont="Sans Serif 10" +# 托盘字体 +TrayFont="Sans Serif 10" +# 托盘标签轮廓颜色 +TrayOutlineColor=#000000 +# 托盘标签文本颜色 +TrayTextColor=#ffffff +# 优先使用文字图标 +PreferTextIcon=False +# 在图标中显示布局名称 +ShowLayoutNameInIcon=True +# 使用输入法的语言来显示文字 +UseInputMethodLanguageToDisplayText=True +# 主题 +Theme=default +# 深色主题 +DarkTheme=default-dark +# 跟随系统浅色/深色设置 +UseDarkTheme=True +# 当被主题和桌面支持时使用系统的重点色 +UseAccentColor=True +# 在 X11 上针对不同屏幕使用单独的 DPI +PerScreenDPI=False +# 固定 Wayland 的字体 DPI +ForceWaylandDPI=0 +# 在 Wayland 下启用分数缩放 +EnableFractionalScale=True + diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/notifications.conf b/minimal-niri-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/pinyin.conf b/minimal-niri-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/minimal-niri-dotfiles/.config/fcitx5/conf/punctuation.conf b/minimal-niri-dotfiles/.config/fcitx5/conf/punctuation.conf new file mode 100644 index 0000000..3da1c4c --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/conf/punctuation.conf @@ -0,0 +1,10 @@ +# 字母或者数字之后输入半角标点 +HalfWidthPuncAfterLetterOrNumber=True +# 同时输入成对标点 (例如引号) +TypePairedPunctuationsTogether=False +# Enabled +Enabled=True + +[Hotkey] +0=Control+period + diff --git a/minimal-niri-dotfiles/.config/fcitx5/config b/minimal-niri-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..b0b1d5c --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# 按住切换键的修饰键时进行轮换切换 +EnumerateWithTriggerKeys=True +# 向前切换输入法 +EnumerateForwardKeys= +# 向后切换输入法 +EnumerateBackwardKeys= +# 轮换输入法时跳过第一个输入法 +EnumerateSkipFirst=False +# 触发修饰键快捷键的时限 (毫秒) +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Super+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# 默认状态为激活 +ActiveByDefault=False +# 重新聚焦时重置状态 +resetStateWhenFocusIn=No +# 共享输入状态 +ShareInputState=No +# 在程序中显示预编辑文本 +PreeditEnabledByDefault=True +# 切换输入法时显示输入法信息 +ShowInputMethodInformation=True +# 在焦点更改时显示输入法信息 +showInputMethodInformationWhenFocusIn=False +# 显示紧凑的输入法信息 +CompactInputMethodInformation=True +# 显示第一个输入法的信息 +ShowFirstInputMethodInformation=True +# 默认页大小 +DefaultPageSize=5 +# 覆盖 XKB 选项 +OverrideXkbOption=False +# 自定义 XKB 选项 +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# 允许在密码框中使用输入法 +AllowInputMethodForPassword=False +# 输入密码时显示预编辑文本 +ShowPreeditForPassword=False +# 保存用户数据的时间间隔(以分钟为单位) +AutoSavePeriod=30 + diff --git a/minimal-niri-dotfiles/.config/fcitx5/profile b/minimal-niri-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..3d0391e --- /dev/null +++ b/minimal-niri-dotfiles/.config/fcitx5/profile @@ -0,0 +1,29 @@ +[Groups/0] +# Group Name +Name=Default +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[Groups/0/Items/2] +# Name +Name=mozc +# Layout +Layout= + +[GroupOrder] +0=Default + diff --git a/minimal-niri-dotfiles/.config/fontconfig/fonts.conf b/minimal-niri-dotfiles/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..bf57887 --- /dev/null +++ b/minimal-niri-dotfiles/.config/fontconfig/fonts.conf @@ -0,0 +1,42 @@ + + + + + + true + true + hintslight + rgb + lcddefault + + + + sans-serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + monospace + + JetBrains Mono + JetBrains Maple Mono + Adwaita Mono + + + + diff --git a/minimal-niri-dotfiles/.config/foot/foot.ini b/minimal-niri-dotfiles/.config/foot/foot.ini new file mode 100644 index 0000000..3a5210a --- /dev/null +++ b/minimal-niri-dotfiles/.config/foot/foot.ini @@ -0,0 +1,14 @@ +[main] +shell=zsh + +font=JetBrains Maple Mono:size=13.5 + +pad=5x5 + +[cursor] +style=block +unfocused-style=hollow +blink=no + + + diff --git a/minimal-niri-dotfiles/.config/fuzzel/fuzzel.ini b/minimal-niri-dotfiles/.config/fuzzel/fuzzel.ini new file mode 100644 index 0000000..01cac2a --- /dev/null +++ b/minimal-niri-dotfiles/.config/fuzzel/fuzzel.ini @@ -0,0 +1,127 @@ +[main] +# output= + font=adwaita sans:size=13 +# dpi-aware=auto +# use-bold=yes +# prompt="> " +# placeholder= +# icon-theme=default +# icons-enabled=yes +# hide-before-typing=no +# fields=filename,name,generic +# password-character=* +# filter-desktop=no +# match-mode=fzf +# sort-result=yes +# match-counter=no +# delayed-filter-ms=300 +# delayed-filter-limit=20000 +# show-actions=no + terminal=kitty -e +# launch-prefix= +# list-executables-in-path=no + +# anchor=center +# x-margin=0 +# y-margin=0 + lines=9 +# minimal-lines=no + width=35 + # tabs=8 + horizontal-pad=40 + vertical-pad=15 + inner-pad=5 + +# scaling-filter=box +# imagesize-ratio=0.5 + +# gamma-correct-blending=no + line-height=25 +# letter-spacing=0 + +# layer=overlay +# keyboard-focus=exclusive +# exit-on-keyboard-focus-loss=yes + +# cache= + +# render-workers= +# match-workers= + +# enable-mouse=yes + +[colors] +# background=fdf6e3ff +# text=657b83ff +# prompt=586e75ff +# placeholder=93a1a1ff +# input=657b83ff +# match=cb4b16ff +# selection=eee8d5ff +# selection-text=586e75ff +# selection-match=cb4b16ff +# counter=93a1a1ff +border=ffffff + +[border] + width=2 + radius=0 + +[dmenu] +# mode=text # text|index +# exit-immediately-if-empty=no + +[key-bindings] +prev = Control+k Up Control+w +next = Control+j Down Control+s +custom-1 = Control+Return Control+h +# cancel=Escape Control+g Control+c Control+bracketleft +execute=Return KP_Enter Control+l +# execute-or-next=Tab +# execute-input=Shift+Return Shift+KP_Enter +# cursor-left=Left Control+b +# cursor-left-word=Control+Left Mod1+b +# cursor-right=Right Control+f +# cursor-right-word=Control+Right Mod1+f +# cursor-home=Home Control+a +# cursor-end=End Control+e +# delete-line=Control+Shift+BackSpace + delete-prev=BackSpace +delete-prev-word=Mod1+BackSpace Control+BackSpace +# delete-line-backward=Control+u +# delete-next=Delete KP_Delete Control+d +# delete-next-word=Mod1+d Control+Delete Control+KP_Delete + delete-line-forward= none +# prev=Up Control+p +# prev-with-wrap=ISO_Left_Tab +# prev-page=Page_Up KP_Page_Up +# next=Down Control+n +# next-with-wrap=none +# next-page=Page_Down KP_Page_Down +# expunge=Shift+Delete +# clipboard-paste=Control+v XF86Paste +# primary-paste=Shift+Insert Shift+KP_Insert + +# custom-N: *dmenu mode only*. Like execute, but with a non-zero +# exit-code; custom-1 exits with code 10, custom-2 with 11, custom-3 +# with 12, and so on. +# custom-1=Mod1+1 +# custom-2=Mod1+2 +# custom-3=Mod1+3 +# custom-4=Mod1+4 +# custom-5=Mod1+5 +# custom-6=Mod1+6 +# custom-7=Mod1+7 +# custom-8=Mod1+8 +# custom-9=Mod1+9 +# custom-10=Mod1+0 +# custom-11=Mod1+exclam +# custom-12=Mod1+at +# custom-13=Mod1+numbersign +# custom-14=Mod1+dollar +# custom-15=Mod1+percent +# custom-16=Mod1+dead_circumflex +# custom-17=Mod1+ampersand +# custom-18=Mod1+asterix +# custom-19=Mod1+parentleft + diff --git a/minimal-niri-dotfiles/.config/gtk-3.0/bookmarks b/minimal-niri-dotfiles/.config/gtk-3.0/bookmarks new file mode 100644 index 0000000..b80e22f --- /dev/null +++ b/minimal-niri-dotfiles/.config/gtk-3.0/bookmarks @@ -0,0 +1,7 @@ +file:///home/shorin/Documents Documents +file:///home/shorin/Pictures Pictures +file:///home/shorin/Videos Videos +file:///home/shorin/Music Music +file:///home/shorin/Downloads Downloads +file:///home/shorin/.config .config +file:///home/shorin/.local diff --git a/minimal-niri-dotfiles/.config/mako/config b/minimal-niri-dotfiles/.config/mako/config new file mode 100644 index 0000000..dd7dd16 --- /dev/null +++ b/minimal-niri-dotfiles/.config/mako/config @@ -0,0 +1,10 @@ +border-size=2 +icons=1 +anchor=top-right +default-timeout=8000 +margin=10 +padding=10 +font=adwaita sans regular 11 +history=1 +max-visible=20 +max-history=100 diff --git a/minimal-niri-dotfiles/.config/mimeapps.list b/minimal-niri-dotfiles/.config/mimeapps.list new file mode 100644 index 0000000..4641b70 --- /dev/null +++ b/minimal-niri-dotfiles/.config/mimeapps.list @@ -0,0 +1,24 @@ +[Default Applications] +image/png=imv.desktop +video/webm=mpv.desktop +application/x-shellscript=vim.desktop +inode/directory=org.gnome.Nautilus.desktop +image/jpeg=imv.desktop +image/gif=imv.desktop +image/webp=imv.desktop +image/bmp=imv.desktop +image/tiff=imv.desktop +video/mp4=mpv.desktop +video/x-matroska=mpv.desktop +video/avi=mpv.desktop +video/quicktime=mpv.desktop +text/plain=vim.desktop +application/vnd.microsoft.portable-executable=wine.desktop + +[Added Associations] +image/png=imv.desktop; +video/webm=mpv.desktop; +application/x-shellscript=vim.desktop; +video/mp4=mpv.desktop; +text/plain=vim.desktop; +application/vnd.microsoft.portable-executable=wine.desktop; diff --git a/minimal-niri-dotfiles/.config/mpv/config b/minimal-niri-dotfiles/.config/mpv/config new file mode 100644 index 0000000..c7ae769 --- /dev/null +++ b/minimal-niri-dotfiles/.config/mpv/config @@ -0,0 +1,4 @@ +#使用vulkan后端 +gpu-api=vulkan +#通用自动模式硬解 +hwdec=auto-safe diff --git a/minimal-niri-dotfiles/.config/niri/binds.kdl b/minimal-niri-dotfiles/.config/niri/binds.kdl new file mode 100644 index 0000000..12144d3 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/binds.kdl @@ -0,0 +1,362 @@ +//这个文件是快捷键设置 + +binds { + + // 显示快捷键教程 + Mod+Shift+Slash hotkey-overlay-title="快捷键教程 Keybind tutorial" { spawn "~/.config/niri/scripts/niri-binds"; } + + // alt+tab切换窗口 + Alt+Tab hotkey-overlay-title="快速跳转窗口 Quick window switch menu" {spawn "~/.config/niri/scripts/niri-quick-switch-fuzzel.py";} + Mod+F1 hotkey-overlay-title="开关输入法 Toggle fcitx" {spawn-sh "pkill fcitx5 || fcitx5 ";} + Mod+F2 hotkey-overlay-title=null {spawn-sh "pkill cava || true && pkill waybar || true && waybar -c $HOME/.config/waybar/config.jsonc -s $HOME/.config/waybar/style.css ";} + Mod+F5 hotkey-overlay-title="快速存档 Quick save" {spawn "quicksave";} + Mod+F8 hotkey-overlay-title="快速读档 Quick load" {spawn "quickload";} + Mod+F9 hotkey-overlay-title="切换护眼模式 Toggle sunset" {spawn "~/.config/niri/scripts/toggle-wlsunset";} + + // 这一行是关闭waybar进程,释放资源占用。在意资源占用的时候使用。 + Mod+F4 hotkey-overlay-title="开关任务栏 Toggle bar" {spawn-sh "pkill waybar || waybar ";} + // 这一行是用waybar自己支持的信号功能隐藏waybar,但进程没有退出,资源占用依旧有 + Mod+Shift+F4 hotkey-overlay-title="隐藏任务栏 Hide bar" {spawn-sh "killall -SIGUSR1 waybar";} + // 临时开一个浮动终端 + Mod+Slash hotkey-overlay-title="临时终端 Quick Terminal" {spawn "footclient" "-a" "quickterminal";} + //打开浏览器 + Mod+B hotkey-overlay-title="浏览器 Browser" { spawn "firefox"; } + + + // Suggested binds for running programs: terminal, app launcher, screen locker. + Mod+T hotkey-overlay-title="终端 Terminal" { spawn "footclient"; } + // 文档管理器。如果有thunar的话会优先打开thunar,没有的话会打开nautilus,不要问我为什么() + Mod+E hotkey-overlay-title="文档管理器 Filemanager" { spawn-sh "thunar || env GSK_RENDERER=gl GTK_IM_MODULE=fcitx nautilus"; } + // 另一个打开nautilus的快捷键,主要是为了在同时安装thunar和nautilus的情况下打开naultilus + Mod+Alt+E hotkey-overlay-title=null {spawn "env" "GSK_RENDERER=gl" "GTK_IM_MODULE=fcitx" "nautilus" "--new-window";} + Mod+Z hotkey-overlay-title="程序菜单 Applauncher" { spawn "fuzzel"; } + // 锁屏 + Mod+Alt+L hotkey-overlay-title="锁屏 Lock screen" { spawn-sh "hyprlock -c ~/.config/niri/hyprlock.conf"; } + // 这是我自己的剪贴板程序,对应aur包shorinclip-git + Mod+Alt+V hotkey-overlay-title="剪贴板 Clipboard" {spawn-sh "footclient -a shorinclip shorinclip";} + // 调节音量 + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "swayosd-client --output-volume +5||wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "swayosd-client --output-volume -5||wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05-"; } + XF86AudioMute allow-when-locked=true { spawn-sh "swayosd-client --output-volume mute-toggle||wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } + + // 调节屏幕亮度 + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+5%"; } + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "5%-"; } + + // 切换overview总览 + Mod+O hotkey-overlay-title="切换总览界面 toggle overview" repeat=false { toggle-overview; } + Mod+G repeat=false { toggle-overview; } + // 关闭聚焦窗口 + Mod+Q hotkey-overlay-title="关闭聚焦窗口 Close focus window" repeat=false { close-window; } + Alt+F4 hotkey-overlay-title=null repeat=false { close-window; } + + // mod+鼠标中键 关闭窗口 + Mod+MouseMiddle { close-window; } + + // 下面的快捷键看着很多很复杂,其实并不难记。 + // 记住三组方向键,wasd、hjkl和上下左右箭头 + // 总的来说 + // super+方向键就是切换聚焦,再加上ctrl就是移动窗口 + // super+a/d 比较特殊,不是切换聚焦而是左右合并colume(相当于左右移动窗口) + // super+shift就是跨显示器,加上ctrl就是移动窗口 + + // 切换聚焦 + // super+方向键 + Mod+Left hotkey-overlay-title=null { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + // super+vim key + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + // 移动colume(列) + // super+ctrl+方向键 + Mod+Ctrl+Left hotkey-overlay-title=null { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right hotkey-overlay-title=null { move-column-right; } + // super+ctrl+vimkey + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + // super+ctrl+a/d 向左/右移动列 + Mod+Ctrl+A { move-column-left; } + Mod+Ctrl+D { move-column-right; } + + // Alternative commands that move across workspaces when reaching + // the first or last window in a column. + // Mod+J { focus-window-or-workspace-down; } + // Mod+K { focus-window-or-workspace-up; } + // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } + // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + + // 切换到第一个colume + Mod+Home { focus-column-first; } + // 切换到最后一个colume + Mod+End { focus-column-last; } + // 移动colume到第一个 + Mod+Ctrl+Home { move-column-to-first; } + // 移动colume到最后一个 + Mod+Ctrl+End { move-column-to-last; } + + // 切换显示器聚焦 + // mod+shift+方向键 + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + // mod+shift+vimkey + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + // 跨显示器移动colume + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + Mod+Shift+Ctrl+A { move-column-to-monitor-left; } + Mod+Shift+Ctrl+S { move-column-to-monitor-down; } + Mod+Shift+Ctrl+W { move-column-to-monitor-up; } + Mod+Shift+Ctrl+D { move-column-to-monitor-right; } + // Alternatively, there are commands to move just a single window: + // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } + // ... + + // And you can also move a whole workspace to another monitor: + + //移动整个工作区 + // mod+shift跨显示器,alt代表移动整个工作区,再加上三组方向键 + Mod+Shift+Alt+W { move-workspace-to-monitor-up; } + Mod+Shift+Alt+S { move-workspace-to-monitor-down; } + Mod+Shift+Alt+D { move-workspace-to-monitor-right; } + Mod+Shift+Alt+A { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+K { move-workspace-to-monitor-up; } + Mod+Shift+Alt+J { move-workspace-to-monitor-down; } + Mod+Shift+Alt+L { move-workspace-to-monitor-right; } + Mod+Shift+Alt+H { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+Up { move-workspace-to-monitor-up; } + Mod+Shift+Alt+Down { move-workspace-to-monitor-down; } + Mod+Shift+Alt+Right { move-workspace-to-monitor-right; } + Mod+Shift+Alt+Left { move-workspace-to-monitor-left; } + + // 上下切换工作区 + Mod+Page_Down hotkey-overlay-title=null { focus-workspace-down; } + Mod+Page_Up hotkey-overlay-title=null { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + // 上下移动窗口到其他工作区 + Mod+Ctrl+Page_Down hotkey-overlay-title=null { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up hotkey-overlay-title=null { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + // You can bind mouse wheel scroll ticks using the following syntax. + // These binds will change direction based on the natural-scroll setting. + // + // To avoid scrolling through workspaces really fast, you can use + // the cooldown-ms property. The bind will be rate-limited to this value. + // You can set a cooldown on any bind, but it's most useful for the wheel. + + // mod+shitf+滚轮上下切换工作区 + Mod+Shift+WheelScrollDown hotkey-overlay-title="切换工作区 Change workspaces" cooldown-ms=150 { focus-workspace-down; } + Mod+Shift+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + //再加上ctrl移动窗口 + Mod+Ctrl+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + // 如果滚轮支持左右的话这里可以设置切换聚焦和移动窗口 + //Mod+WheelScrollRight { focus-column-right; } + //Mod+WheelScrollLeft { focus-column-left; } + //Mod+Ctrl+WheelScrollRight { move-column-right; } + //Mod+Ctrl+WheelScrollLeft { move-column-left; } + + // Usually scrolling up and down with Shift in applications results in + // horizontal scrolling; these binds replicate that. + + // mod+滚轮上下 左右切换聚焦 + Mod+WheelScrollDown hotkey-overlay-title="滚轮切换聚焦 Change focus with wheel" { focus-column-right; } + Mod+WheelScrollUp { focus-column-left; } + // 再加上ctrl移动colume + Mod+Ctrl+WheelScrollDown { move-column-right; } + Mod+Ctrl+WheelScrollUp { move-column-left; } + + // Similarly, you can bind touchpad scroll "ticks". + // Touchpad scrolling is continuous, so for these binds it is split into + // discrete intervals. + // These binds are also affected by touchpad's natural-scroll, so these + // example binds are "inverted", since we have natural-scroll enabled for + // touchpads by default. + // Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; } + // Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; } + + // You can refer to workspaces by index. However, keep in mind that + // niri is a dynamic workspace system, so these commands are kind of + // "best effort". Trying to refer to a workspace index bigger than + // the current workspace count will instead refer to the bottommost + // (empty) workspace. + // + // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on + // will all refer to the 3rd workspace. + // mod+数字切换工作区 + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + // 再加上ctrl移动colume + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+1 { move-window-to-workspace 1; } + + // Switches focus between the current and the previous workspace. + //Mod+Tab { focus-workspace-previous; } + + // The following binds move the focused window in and out of a column. + // If the window is alone, they will consume it into the nearby column to the side. + // If the window is already in a column, they will expel it out. + + // mod+左右方括号 移动窗口(不是移动colume,是允许移动到另一个colume的窗口移动) + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + // mod+A/D 同效果 + Mod+A hotkey-overlay-title="向左移动窗口 Move window to left between columes" { consume-or-expel-window-left; } + Mod+D hotkey-overlay-title="向右移动窗口 Move window to right between columes" { consume-or-expel-window-right; } + // mod+S/W 上下切换窗口 + Mod+S { move-window-down; } + Mod+W { move-window-up; } + + // mod+逗号/句号 把窗口合并或者踢出当前的colume + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + // mod+shift+A/D 同效果 + Mod+Shift+A { consume-window-into-column; } + Mod+Shift+D { expel-window-from-column; } + // 开启colume的标签页模式(同一个colume中的窗口会以类似浏览器标签页的形式堆叠) + Mod+Shift+X { toggle-column-tabbed-display; } + Mod+X { toggle-column-tabbed-display; } + // mod+鼠标侧键 上下切换聚焦 + Mod+MouseForward { focus-window-up; } + Mod+MouseBack { focus-window-down; } + + // 按照预设切换窗口宽度 + Mod+R hotkey-overlay-title="按预设切换宽度 Switch width " { switch-preset-column-width; } + // Cycling through the presets in reverse order is also possible. + // Mod+R { switch-preset-column-width-back; } + + // 按照预设切换窗口高度 + Mod+Shift+R { switch-preset-window-height; } + // 重置窗口高度 + Mod+Ctrl+R { reset-window-height; } + + Mod+F hotkey-overlay-title="最大化 maximize" { maximize-column; } + Mod+Alt+F hotkey-overlay-title="全屏 fullscreen" { fullscreen-window; } + + // Expand the focused column to space not taken up by other fully visible columns. + // Makes the column "fill the rest of the space". + // 没什么用。增加窗口宽度占满空闲空间 + Mod+Ctrl+F { expand-column-to-available-width; } + + // 居中当前聚焦的colume + Mod+C { center-column; } + + // Center all fully visible columns on screen. + // 没什么用 + Mod+Ctrl+C { center-visible-columns; } + + // Finer width adjustments. + // This command can also: + // * set width in pixels: "1000" + // * adjust width in pixels: "-5" or "+5" + // * set width as a percentage of screen width: "25%" + // * adjust width as a percentage of screen width: "-10%" or "+10%" + // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, + // set-column-width "100" will make the column occupy 200 physical screen pixels. + + // mod+加减号调整窗口宽度 + Mod+Minus { set-column-width "-5%"; } + Mod+Equal { set-column-width "+5%"; } + + // Finer height adjustments when in column with other windows. + // mod+shift+加减号调整窗口高度 + Mod+Shift+Minus { set-window-height "-5%"; } + Mod+Shift+Equal { set-window-height "+5%"; } + + // Move the focused window between the floating and the tiling layout. + // 切换浮动模式 + Mod+V hotkey-overlay-title="切换浮动 Toggle floating" { toggle-window-floating; } + // 在浮动模式和非浮动模式之间切换聚焦 + Mod+Shift+V hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + Mod+N hotkey-overlay-title="切换浮动聚焦 Change focus to floating" { switch-focus-between-floating-and-tiling; } + Alt+grave hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + + Mod+Alt+N hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + + // Toggle tabbed column display mode. + // Windows in this column will appear as vertical tabs, + // rather than stacked on top of each other. + + + // Actions to switch layouts. + // Note: if you uncomment these, make sure you do NOT have + // a matching layout switch hotkey configured in xkb options above. + // Having both at once on the same hotkey will break the switching, + // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). + //Mod+Shift+X { switch-layout "next"; } + //Mod+Shift+Z { switch-layout "prev"; } + + // 截图相关 + // 截图前创建一个用来触发截图音效进程的token + Mod+Alt+A hotkey-overlay-title="选取区域截图 Select screenshot" {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Mod+Alt+Ctrl+A hotkey-overlay-title="截取聚焦窗口 Focus-window screenshot" { spawn-sh "niri msg action screenshot-window && pkill -f -USR1 screenshot-sound.sh"; } + Mod+Alt+Ctrl+Shift+A hotkey-overlay-title="截取显示器 Monitor screenshot" { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Print hotkey-overlay-title=null {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Ctrl+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-window --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Shift+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + + //Mod+Shift+S { spawn "~/.config/niri/scripts/satty-screenshot.sh";} + Mod+Shift+S hotkey-overlay-title="截图后按下此键进行编辑 Edit the image after screenshot" { spawn-sh "wl-paste | satty -f -";} + + // Applications such as remote-desktop clients and software KVM switches may + // request that niri stops processing the keyboard shortcuts defined here + // so they may, for example, forward the key presses as-is to a remote machine. + // It's a good idea to bind an escape hatch to toggle the inhibitor, + // so a buggy application can't hold your session hostage. + // + // The allow-inhibiting=false property can be applied to other binds as well, + // which ensures niri always processes them, even when an inhibitor is active. + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + // The quit action will show a confirmation dialog to avoid accidental exits. + Mod+Shift+Ctrl+Q hotkey-overlay-title=null { spawn "wlogout"; } + Mod+Shift+E hotkey-overlay-title="退出niri Quit niri" { quit; } + // Powers off the monitors. To turn them back on, do any input like + + // moving the mouse or pressing any other key. + Mod+Alt+P hotkey-overlay-title="休眠 Turn off monitors" { spawn-sh "niri msg action power-off-monitors && hyprlock && systemctl suspend"; } + +} diff --git a/minimal-niri-dotfiles/.config/niri/config.kdl b/minimal-niri-dotfiles/.config/niri/config.kdl new file mode 100644 index 0000000..1d94c3c --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/config.kdl @@ -0,0 +1,210 @@ +// ██████ ██ ██ ██████ ███████ ██ ███ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ███████ ███████ ██ ██ ██████ ██ ██ ██ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ██████ ██ ██ ██████ ██ ██ ██ ██ ████ + +// 自25.11版本开始niri支持配置文件拆分,所有include都代表后面的文件是拆分出去的,不包含在这个文件内 +// binds里设置了快捷键,rule是窗口和layer规则,output是显示器,如果你用我的脚本安装,output里会是空的,配置方法可以看文档 +include "binds.kdl" +include "rule.kdl" +include "output.kdl" +include "layout.kdl" +// 截图保存位置 +screenshot-path "~/Pictures/Screenshots/Niri-screenshots/%Y-%m-%d %H-%M-%S.png" + +// 环境变量 + +environment { + //LC_CTYPE "zh_CN.UTF-8" 会导致输入法出现漏字 + //LC_MESSAGES "zh_CN.UTF-8" 让系统全局使用英文,仅主要界面为英文时使用这个环境变量 + // 设置界面语言 + LANG "zh_CN.UTF-8" + LC_CTYPE "en_US.UTF-8" //这一项可以解决漏字问题,但是也许会导致steam之类的x11应用无法使用中文输入法 + // 输入法环境变量 + XMODIFIERS "@im=fcitx" + // qt主题 + QT_QPA_PLATFORMTHEME "gtk3" + QT_QPA_PLATFORMTHEME_QT6 "gtk3" + // 解决quickshell图标主题缺失问题 + QS_ICON_THEME "Adwaita" + // GTK软件使用的渲染器,可以解决n卡双显卡导致的GTK应用启动缓慢问题,AMD或Intel单显卡不需要这行设置可以注释掉 + GSK_RENDERER "gl" + // 默认文本编辑器 + EDITOR "vim" + +} + +// 光标配置 +cursor { + // 主题,存放路径在~/.local/share/icons + xcursor-theme "breeze_cursors" + // 大小 + xcursor-size 30 + // 闲置多少毫秒自动隐藏光标 + hide-after-inactive-ms 15000 +} + +// 带缩略图的alt+tab切换窗口功能(但是我设置的是super+tab,更符合逻辑) +recent-windows { + // 取消//off的注释可以禁用 + // off + debounce-ms 750 + open-delay-ms 150 + + highlight { + active-color "#999999ff" + urgent-color "#ff9999ff" + // 缩略图背景内间距 + padding 30 + // 缩略图的背景圆角 + corner-radius 12 + } + + //设置缩略图大小 + previews { + max-height 480 + max-scale 0.2 + } + + binds { + // scope可以设置显示的窗口是当前工作区的、还是当前显示器的、或者显示全部窗口 + Mod+Tab { next-window scope="workspace"; } + Mod+Shift+Tab { previous-window scope="workspace"; } + // grave是波浪键,显示当前应用的所有窗口 + Mod+grave { next-window filter="app-id"; } + Mod+Shift+grave { previous-window filter="app-id"; } + } +} + +input { + keyboard { + xkb { + // You can set rules, model, layout, variant and options. + // For more information, see xkeyboard-config(7). + + // For example: + // layout "us,ru" + // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" + + // If this section is empty, niri will fetch xkb settings + // from org.freedesktop.locale1. You can control these using + // localectl set-x11-keymap. + } + + // Enable numlock on startup, omitting this setting disables it. + //numlock + } + + // Next sections include libinput settings. + // Omitting settings disables them, or leaves them at their default values. + // All commented-out settings here are examples, not defaults. + touchpad { + // off + tap + // dwt + // dwtp + // drag false + // drag-lock + // nautural-scroll可以翻转触摸板滚动的方向 + natural-scroll + //accel-speed -0.5 + // accel-profile "flat" + // scroll-method "two-finger" + // disabled-on-external-mouse + } + + mouse { + + // off + // natural-scroll + // 鼠标速度 + accel-speed -0.15 + // 禁用鼠标加速 + accel-profile "flat" + // scroll-method "no-scroll" + //speed of scroll,like: + //scroll-factor horizontal=2.0 vertical=-5.0 + } + + trackpoint { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "on-button-down" + // scroll-button 273 + // scroll-button-lock + // middle-emulation + } + + // Uncomment this to make the mouse warp to the center of newly focused windows. + //warp-mouse-to-focus + + // Focus windows and outputs automatically when moving the mouse into them. + // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. + //focus-follows-mouse max-scroll-amount="50%" +} + +//blur +//blur { + // off + //passes 3 + //offset 2 + //noise 0.02 + //saturation 1.5 +//} + +overview { + // 关闭overview里的工作区阴影,配合layout里面的透明工作区背景可以做到让工作区和overview共用同一个背景。在意内存占用的可以把waypaper的后端改成swaybg,然后关闭桌面自动模糊功能,取消swww自动启动,能节省250MB左右内存 + workspace-shadow { + //off + } + //缩放 + zoom 0.5 +} +// Add lines like this to spawn processes at startup. +// Note that running niri as a session supports xdg-desktop-autostart, +// which may be more convenient to use. +// See the binds section below for more ipawn examples. + +// 询问管理员权限功能(身份验证) +spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +// 屏幕分享、录屏相关的环境设置,如果屏幕分享出异常的话可以开启 + spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri & /usr/lib/xdg-desktop-portal-gnome" +// GNOME tracker修复 +spawn-sh-at-startup "systemctl --user set-environment XDG_SESSION_CLASS=user" +spawn-at-startup "foot" "-s" +// 通知程序 +spawn-at-startup "mako" +// 任务栏 +spawn-at-startup "waybar" +// 输入法 +spawn-at-startup "fcitx5" +// 剪贴板守护进程 + //cliphist +spawn-at-startup "wl-paste" "--watch" "cliphist" "store" + // wayland <--> x11 剪贴板同步 这个包是我自己推的clipsync-git +//spawn-at-startup "systemctl" "--user" "start" "clipsync" +// 闲置时自动熄屏锁屏睡眠的脚本,说实话这东西毫无用处,super+alt+P可以熄屏休眠 +// spawn-at-startup "~/.config/niri/scripts/swayidle.sh" +// 自动开启护眼模式,经纬度设置位置 +spawn-at-startup "~/.config/niri/scripts/toggle-wlsunset" +// 截图音效的守护进程 +spawn-at-startup "~/.config/niri/scripts/screenshot-sound.sh" +// 允许root通过用户的xwayland打开窗口 +spawn-at-startup "xhost" "+si:localuser:root" + +// 取消启动niri时自动开启快捷键教程 +hotkey-overlay { + // Uncomment this line to disable the "Important Hotkeys" pop-up at startup. + skip-at-startup +} + +// 隐藏窗口标题栏 +prefer-no-csd + + + + + diff --git a/minimal-niri-dotfiles/.config/niri/hyprlock-colors.conf b/minimal-niri-dotfiles/.config/niri/hyprlock-colors.conf new file mode 100644 index 0000000..74a9109 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/hyprlock-colors.conf @@ -0,0 +1,101 @@ + +$background = rgba(131318ff) + +$error = rgba(ffb4abff) + +$error_container = rgba(93000aff) + +$inverse_on_surface = rgba(303036ff) + +$inverse_primary = rgba(555a92ff) + +$inverse_surface = rgba(e4e1e9ff) + +$on_background = rgba(e4e1e9ff) + +$on_error = rgba(690005ff) + +$on_error_container = rgba(ffdad6ff) + +$on_primary = rgba(262b60ff) + +$on_primary_container = rgba(e0e0ffff) + +$on_primary_fixed = rgba(10144bff) + +$on_primary_fixed_variant = rgba(3d4279ff) + +$on_secondary = rgba(2e2f42ff) + +$on_secondary_container = rgba(e1e0f9ff) + +$on_secondary_fixed = rgba(191a2cff) + +$on_secondary_fixed_variant = rgba(444559ff) + +$on_surface = rgba(e4e1e9ff) + +$on_surface_variant = rgba(c7c5d0ff) + +$on_tertiary = rgba(45263cff) + +$on_tertiary_container = rgba(ffd8eeff) + +$on_tertiary_fixed = rgba(2e1126ff) + +$on_tertiary_fixed_variant = rgba(5e3c53ff) + +$outline = rgba(91909aff) + +$outline_variant = rgba(46464fff) + +$primary = rgba(bec2ffff) + +$primary_container = rgba(3d4279ff) + +$primary_fixed = rgba(e0e0ffff) + +$primary_fixed_dim = rgba(bec2ffff) + +$scrim = rgba(000000ff) + +$secondary = rgba(c5c4ddff) + +$secondary_container = rgba(444559ff) + +$secondary_fixed = rgba(e1e0f9ff) + +$secondary_fixed_dim = rgba(c5c4ddff) + +$shadow = rgba(000000ff) + +$source_color = rgba(5a61b1ff) + +$surface = rgba(131318ff) + +$surface_bright = rgba(39393fff) + +$surface_container = rgba(1f1f25ff) + +$surface_container_high = rgba(2a292fff) + +$surface_container_highest = rgba(34343aff) + +$surface_container_low = rgba(1b1b21ff) + +$surface_container_lowest = rgba(0e0e13ff) + +$surface_dim = rgba(131318ff) + +$surface_tint = rgba(bec2ffff) + +$surface_variant = rgba(46464fff) + +$tertiary = rgba(e7b9d5ff) + +$tertiary_container = rgba(5e3c53ff) + +$tertiary_fixed = rgba(ffd8eeff) + +$tertiary_fixed_dim = rgba(e7b9d5ff) + diff --git a/minimal-niri-dotfiles/.config/niri/hyprlock.conf b/minimal-niri-dotfiles/.config/niri/hyprlock.conf new file mode 100644 index 0000000..842b9b4 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/hyprlock.conf @@ -0,0 +1,148 @@ +# 引入 Matugen 生成的颜色文件 +# 确保 Matugen 已经运行并生成了此文件,否则变量无法解析 +source = ~/.config/niri/hyprlock-colors.conf + +# 定义字体变量,方便统一修改 +$font = JetBrains Maple Mono +$font_clock = JetBrains Maple Mono + +general { + hide_cursor = false # 锁屏时不隐藏鼠标光标 + ignore_empty_input = true # 开启后,输入框为空时按回车不会显示“验证失败”,而是直接忽略 +} + +animations { + enabled = true + # 贝塞尔曲线定义 (控制动画速度变化) + bezier = linear, 1, 1, 0, 0 + # 动画定义: 动画名, 开关(1/0), 持续时间, 曲线 + animation = fadeIn, 1, 3, linear # 淡入动画 + animation = fadeOut, 1, 5, linear # 淡出动画 + animation = inputFieldDots, 1, 2, linear # 输入密码时圆点的跳动动画 +} + +background { + monitor = # 留空表示应用到所有显示器 + path = screenshot # 使用当前屏幕截图作为背景 + color = $surface # 如果截图加载失败,使用的默认背景色 + + # === 高斯模糊与质感设置 === + # 这些参数共同营造出“磨砂玻璃”的高级感 + blur_size = 5 # 模糊半径 + blur_passes = 4 # 模糊迭代次数 (越高越平滑,但消耗性能) + noise = 0.01 # 添加轻微噪点,防止色带(banding)并增加胶片感 + contrast = 1.3000 # 提高对比度,让文字更清晰 + brightness = 0.8000 # 降低亮度,避免背景太亮抢眼 + vibrancy = 0.2100 # 增加色彩鲜艳度 + vibrancy_darkness = 0.0 +} + +# === 视觉重心上移 (Visual Shift Up) === +# 策略:保持上一版完美的紧凑间距,将整体坐标向上平移约 20% +# 这样时间组件会占据屏幕的上三分之一处,留下开阔的中下部空间。 + +# Hours (小时) +label { + monitor = + # cmd[update:1000]: 每 1000ms (1秒) 更新一次 + # : Pango 标记语法,用于加粗和放大字体 + text = cmd[update:1000] echo " $(date +"%H") " + color = $primary # 使用主色调 + + font_size = 130 + font_family = $font_clock + + # 文字阴影设置,增加立体感 + shadow_passes = 3 # 阴影迭代次数 + shadow_size = 4 # 阴影扩散大小 + + # 上移至 29% (垂直方向) + position = 0, 29% + halign = center # 水平居中 + valign = center # 垂直居中 +} + +# Minutes (分钟) +label { + monitor = + text = cmd[update:1000] echo " $(date +"%M") " + color = $primary + + font_size = 130 + font_family = $font_clock + + shadow_passes = 3 + shadow_size = 4 + + # 保持 13% 的黄金间距 -> 19% (相对于小时的位置) + # 这里的 16% 是绝对位置 + position = 0, 16% + halign = center + valign = center +} + +# === 日期信息 (Date Info) === + +# Today (星期几) +label { + monitor = + # cmd[update:18000000]: 更新频率很低,因为星期几很久才变一次,节省资源 + text = cmd[update:18000000] echo " "$(date +'%A')" " + color = $secondary # 使用次级颜色,建立视觉层级 + + font_size = 28 + font_family = $font + + # 紧随分钟下方 -> 7% + position = 0, 7% + halign = center + valign = center +} + +# Week (日期) +label { + monitor = + text = cmd[update:18000000] echo " "$(date +'%b %d')" " + color = $secondary + + font_size = 18 + font_family = $font + + # 收尾 -> 4% + position = 0, 4% + halign = center + valign = center +} + +# === 底部交互区 (Interaction Area) === + +# Input Field (输入框) +input-field { + monitor = + size = 9%, 3.1% # 使用百分比宽高,适配不同分辨率的屏幕 + outline_thickness = 2 # 边框粗细 + + # 密码掩码圆点设置 + dots_size = 0.26 # 圆点相对于输入框高度的大小 + dots_spacing = 0.64 # 圆点之间的间距 + dots_center = true # 圆点垂直居中 + dots_rounding = -1 # -1 表示完美的圆形 + + rounding = 12 # 输入框圆角半径 + + # 颜色设置 (支持渐变) + # 这里的 outer_color 使用了渐变色: 主色 -> 第三色 -> 主色 + outer_color = $primary $tertiary $primary + inner_color = $surface_container # 输入框背景色 + font_color = $on_surface # 输入文字颜色 + check_color = $secondary # 验证中颜色 + fail_color = $error # 验证失败颜色 + + fade_on_empty = false # 即使没有输入内容,输入框也保持显示 (不消失) + placeholder_text = Password... # 占位符提示文字 (斜体) + + # 保持在底部 10%,与上方的时间形成极大的张力 + position = 0, 10% + halign = center # 水平居中 + valign = bottom # 垂直对齐到底部 +} diff --git a/minimal-niri-dotfiles/.config/niri/layout.kdl b/minimal-niri-dotfiles/.config/niri/layout.kdl new file mode 100644 index 0000000..996f1b5 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/layout.kdl @@ -0,0 +1,161 @@ + +layout { + + //设置工作区背景颜色 + //background-color "transparent" + // Set gaps around windows in logical pixels. + // 窗口和窗口之间的间距 + gaps 12 + //empty-workspace-above-first + // When to center a column when changing focus, options are: + // - "never", default behavior, focusing an off-screen column will keep at the left + // or right edge of the screen. + // - "always", the focused column will always be centered. + // - "on-overflow", focusing a column will center it if it doesn't fit + // together with the previously focused column. + center-focused-column "never" + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + // 预设窗口宽度 + preset-column-widths { + // Proportion sets the width as a fraction of the output width, taking gaps into account. + // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. + // The default preset widths are 1/3, 1/2 and 2/3 of the output. + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + // Fixed sets the width in logical pixels exactly. + // fixed 1920 + } + + // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. + // preset-window-heights { } + + // You can change the default width of the new windows. + // 默认的窗口宽度 + default-column-width { proportion 0.5; } + // If you leave the brackets empty, the windows themselves will decide their initial width. + // default-column-width {} + + // By default focus ring and border are rendered as a solid background rectangle + // behind windows. That is, they will show up through semitransparent windows. + // This is because windows using client-side decorations can have an arbitrary shape. + // + // If you don't like that, you should uncomment `prefer-no-csd` below. + // Niri will draw focus ring and border *around* windows that agree to omit their + // client-side decorations. + // + // Alternatively, you can override it with a window rule called + // `draw-border-with-background`. + + // You can change how the focus ring looks. + // 聚焦窗口边框,这个的颜色设置在我include进来的colors.kdl里 + focus-ring { + // Uncomment this line to disable the focus ring. + // off + // How many logical pixels the ring extends out from the windows. + width 3 + + // Colors can be set in a variety of ways: + // - CSS named colors: "red" + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + // Color of the ring on the active monitor. + //active-color "@primary" + //active-color "#00000000" + // Color of the ring on inactive monitors. + // + // The focus ring only draws around the active window, so the only place + // where you can see its inactive-color is on other monitors. + //inactive-color "#505050" + + // You can also use gradients. They take precedence over solid colors. + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). + // The angle is the same as in linear-gradient, and is optional, + // defaulting to 180 (top-to-bottom gradient). + // You can use any CSS linear-gradient tool on the web to set these up. + // Changing the color space is also supported, check the wiki for more info. + // + // active-gradient from="#80c8ff" to="#c7ff7f" angle=45 + + // You can also color the gradient relative to the entire view + // of the workspace, rather than relative to just the window itself. + // To do that, set relative-to="workspace-view". + // + //inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can also add a border. It's similar to the focus ring, but always visible. + // 窗口边框 + border { + // The settings are the same as for the focus ring. + // If you enable the border, you probably want to disable the focus ring. + off + + width 4 + active-color "#ffc87f" + inactive-color "#505050" + + // Color of the border around windows that request your attention. + urgent-color "#9b0000" + + // Gradients can use a few different interpolation color spaces. + // For example, this is a pastel rainbow gradient via in="oklch longer hue". + // + // active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue" + + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can enable drop shadows for windows. + // 阴影 + shadow { + // Uncomment the next line to enable shadows. + on + + // By default, the shadow draws only around its window, and not behind it. + // Uncomment this setting to make the shadow draw behind its window. + // + // Note that niri has no way of knowing about the CSD window corner + // radius. It has to assume that windows have square corners, leading to + // shadow artifacts inside the CSD rounded corners. This setting fixes + // those artifacts. + // + // However, instead you may want to set prefer-no-csd and/or + // geometry-corner-radius. Then, niri will know the corner radius and + // draw the shadow correctly, without having to draw it behind the + // window. These will also remove client-side shadows if the window + // draws any. + // + //draw-behind-window true + + // You can change how shadows look. The values below are in logical + // pixels and match the CSS box-shadow properties. + + // Softness controls the shadow blur radius. + softness 20 + + // Spread expands the shadow. + spread 2 + + // Offset moves the shadow relative to the window. + offset x=-4 y=-4 + + // You can also change the shadow color and opacity. + color "rgba(0, 0, 0, 0.7)" + } + + // Struts shrink the area occupied by windows, similarly to layer-shell panels. + // You can think of them as a kind of outer gaps. They are set in logical pixels. + // Left and right struts will cause the next window to the side to always be visible. + // Top and bottom struts will simply add outer gaps in addition to the area occupied by + // layer-shell panels and regular gaps. + + //窗口距离屏幕边缘的距离 + struts { + //left 64 + // right 64 + // top 64 + // bottom 64 + } +} diff --git a/minimal-niri-dotfiles/.config/niri/output-example.kdl b/minimal-niri-dotfiles/.config/niri/output-example.kdl new file mode 100644 index 0000000..1043832 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/output-example.kdl @@ -0,0 +1,16 @@ +output "eDP-1"{ +// off + mode "2560x1440@165" + scale 1.3 + position x=0 y=0 + +} +output "DP-2"{ + //主要显示器DP-2 + mode "2560x1440@180" + scale 1 + position x=0 y=0 + focus-at-startup + +} + diff --git a/minimal-niri-dotfiles/.config/niri/rule.kdl b/minimal-niri-dotfiles/.config/niri/rule.kdl new file mode 100644 index 0000000..9fc703f --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/rule.kdl @@ -0,0 +1,175 @@ +// Window rules let you adjust behavior for individual windows. +// Find more information on the wiki: +// https://yalter.github.io/niri/Configuration:-Window-Rules + +// 放进overview里的壁纸程序 +layer-rule{ + match namespace="hyprpaper" + match namespace="wallpaper" + match namespace="awww-daemon" + match namespace="swww-daemonoverview" + place-within-backdrop true +} +// 全局窗口规则 +window-rule { + // 这一行规则可以让niri变成传统桌面那样的堆叠式桌面。 + //open-floating true + // 圆角 + //geometry-corner-radius 8 + // 去掉超出圆角的窗口内容 + //clip-to-geometry true + // 全局透明度 + //opacity 0.98 + // 禁止边框画到背景里 + draw-border-with-background false +} + +// niri-siderbar需要的全局窗口规则 +window-rule { + match is-floating=true + min-width 100 + min-height 100 +} + +// 以浮动模式打开imv(一个轻量化图片预览程序)且不自动聚焦 +window-rule { + match app-id="imv" + open-focused false + open-floating true + } +//shorinclip剪贴板TUI +window-rule{ + match app-id="shorinclip" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + //min-height 800 + open-floating true + default-floating-position x=0 y=18 relative-to="top" +} +// 以浮动模式打开的软件 +window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + match app-id="com.gabm.satty" + match app-id="media_info" + match app-id="video2gif" + match app-id="floating-term" + match app-id="nm-connection-editor" + match app-id="niri-quick-switch" + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + match app-id="steam" title="Friends List" + match app-id="blueberry.py" title="蓝牙" + match app-id="blueman-manager" + match app-id="flameshot" + match app-id="com.github.hluk.copyq" + match app-id="be.alexandervanhee.gradia" + match app-id="org.pulseaudio.pavucontrol" title="音量控制" + match app-id="org.gnome.clocks" title="时钟" + match app-id="fcitx" title="Fcitx5 Input Window" + match app-id="org.gnome.FileRoller" + match app-id="thunar" title="文件操作进度" + match app-id="waypaper" + match app-id="clipse-gui" + match title="群聊的聊天记录" + match title="聊天记录" + match title="日历" + match title="重命名" + match app-id="btrfs-assistant" + match app-id="markpix" + match title="Steam 设置" + match title="另存为" + match app-id="better_control.py" + open-floating true +} +// waybar命令中心模块 +window-rule { + match app-id="command-center" +default-column-width { fixed 1000; } + default-window-height { fixed 600; } + open-floating true +} +//快速终端和笔记 +window-rule { + match app-id="notebook" + match app-id="quickterminal" + open-floating true + default-floating-position x=20 y=20 relative-to="top" +} +window-rule{ + match app-id="bluetui" + match app-id="impala" +default-column-width { fixed 800; } + default-window-height { fixed 800; } + open-floating true +} +window-rule { + match app-id="clipse" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + open-floating true +} + // waydroid调整 +window-rule { + match title="gsr ui" + match app-id="waydroid" + open-fullscreen true + open-floating true + focus-ring{ + off + } + shadow { + off + } +} +// 取消图片预览、视频播放器之类的透明度,并且以浮动模式打开 +window-rule { + match title="图片查看器" + match title="画中画" + match title="图片和视频" + match title="视频播放器" + open-floating true + opacity 1.0 +} +window-rule { + match app-id="mpv" + match app-id="celluloid" + opacity 1.0 +} + + +window-rule { + // This regular expression is intentionally made as specific as possible, + // since this is the default config, and we want no false positives. + // You can get away with just app-id="wezterm" if you want. + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} +/-window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + default-floating-position x=0 y=0 relative-to="bottom-right" + open-floating true +} +// window-rule { +// // This app-id regular expression will work for both: +// // - host Firefox (app-id is "firefox") +// // - Flatpak Firefox (app-id is "org.mozilla.firefox") + +// match app-id="blueman-manager" title="蓝牙设备" +// match app-id="org.pulseaudio.pavucontrol" title="音量控制" +// default-floating-position x=0 y=0 relative-to="top-right" +// open-floating true +// } +// Example: block out two password managers from screen capture. +// (This example rule is commented out with a "/-" in front.) +window-rule { + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + match app-id="wechat" + block-out-from "screen-capture" + + // Use this instead if you want them visible on third-party screenshot tools. + // block-out-from "screencast" +} diff --git a/minimal-niri-dotfiles/.config/niri/scripts/niri-binds b/minimal-niri-dotfiles/.config/niri/scripts/niri-binds new file mode 100644 index 0000000..8ea7601 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/scripts/niri-binds @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +NIRI_DIR="$HOME/.config/niri" + +# === 界面尺寸设置 (在这里微调,下方的所有终端会自动应用) === +MENU_WIDTH=90 +MENU_HEIGHT=20 + +# 检查目录 +if [[ ! -d "$NIRI_DIR" ]]; then + echo "Error: 找不到配置目录 $NIRI_DIR" + exit 1 +fi + +# 提取并使用 column 对齐 +MENU_ITEMS=$(grep -Rh 'hotkey-overlay-title=' "$NIRI_DIR" --include="*.kdl" | \ + grep -v '^[ \t]*//' | \ + sed -n -E 's/^[ \t]*(.*)[ \t]+hotkey-overlay-title="([^"]+)".*/\1|\2/p' | \ + sed -E 's/[ \t]*\|/\|/' | \ + column -t -s '|') + +if [[ -z "$MENU_ITEMS" ]]; then + echo "没有找到有效的快捷键配置。" + exit 1 +fi + +# Fzf 核心命令 +FZF_CMD="echo \"$MENU_ITEMS\" | fzf --reverse --prompt='󰌌 快捷键: ' --info=hidden --border=none > /dev/null" + +# 动态检测终端并使用对应的参数启动 +if command -v kitty >/dev/null 2>&1; then + kitty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o remember_window_size=no -o initial_window_width=${MENU_WIDTH}c -o initial_window_height=${MENU_HEIGHT}c \ + bash -c "$FZF_CMD" + +elif command -v foot >/dev/null 2>&1; then + foot --app-id "niri-hotkey-menu" --title "快捷键菜单" \ + --window-size-chars=${MENU_WIDTH}x${MENU_HEIGHT} \ + bash -c "$FZF_CMD" + +elif command -v alacritty >/dev/null 2>&1; then + alacritty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o window.dimensions.columns=${MENU_WIDTH} -o window.dimensions.lines=${MENU_HEIGHT} \ + -e bash -c "$FZF_CMD" + +elif command -v wezterm >/dev/null 2>&1; then + wezterm start --class "niri-hotkey-menu" -- bash -c "$FZF_CMD" + +elif [[ -n "$TERMINAL" ]]; then + $TERMINAL -e bash -c "$FZF_CMD" + +else + echo "Error: 未检测到支持的终端模拟器。" + if command -v fuzzel >/dev/null 2>&1; then + # Fuzzel 降级方案也会自动读取顶层变量 + echo "$MENU_ITEMS" | fuzzel --dmenu -i -p "󰌌 快捷键: " -w ${MENU_WIDTH} > /dev/null + fi +fi diff --git a/minimal-niri-dotfiles/.config/niri/scripts/niri-quick-switch-fuzzel.py b/minimal-niri-dotfiles/.config/niri/scripts/niri-quick-switch-fuzzel.py new file mode 100644 index 0000000..e520988 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/scripts/niri-quick-switch-fuzzel.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +import subprocess +import json +import sys +import shutil +import time # <--- 新增:用于等待窗口关闭生效 + +# ================= Configuration ================= +EXCLUDE_APPS = ["fuzzel", "quick-switch", "niri-quick-switch"] +FUZZEL_ARGS = [ + "--dmenu", + "--index", + "--width", "60", + "--lines", "15", + "--prompt", "Switch: ", + # 修改了这里:提示 Ctrl+L 跳转,Ctrl+H 关闭 + "--placeholder", "Search... [Ctrl+J/K: Select | Ctrl+L: Switch | Ctrl+H: Close]" +] +# ================================================= + +def run_cmd(cmd): + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + if result.returncode != 0: return None + if "-j" in cmd: + return json.loads(result.stdout) + return result.stdout + except Exception: return None + +def get_active_output_workspace_ids(): + """ + 获取当前活动显示器(output)上的所有工作区 ID + """ + workspaces = run_cmd("niri msg -j workspaces") + if not workspaces: return set() + + # 1. 找到当前聚焦的工作区所在的显示器名称 + active_output = None + for ws in workspaces: + if ws.get("is_focused"): + active_output = ws.get("output") + break + + if not active_output: return set() + + # 2. 收集该显示器上的所有工作区 ID + valid_ws_ids = set() + for ws in workspaces: + if ws.get("output") == active_output: + valid_ws_ids.add(ws.get("id")) + + return valid_ws_ids + +def get_window_sort_key(w): + # 将 workspace_id 作为第一排序优先级,确保不同工作区的窗口按组排列 + ws_id = w.get("workspace_id", 0) + + if w.get("is_floating"): + return (ws_id, 99999, 0, w.get("id")) + try: + layout = w.get("layout", {}) + if not layout: return (ws_id, 9999, 0, w.get("id")) + pos = layout.get("pos_in_scrolling_layout") + if pos and isinstance(pos, list) and len(pos) >= 2: + return (ws_id, pos[0], pos[1], w.get("id")) + except Exception: + pass + return (ws_id, 9999, 0, w.get("id")) + +def main(): + if not shutil.which("fuzzel"): + print("Error: Fuzzel not found") + sys.exit(1) + + # === 核心改动:开启死循环 === + while True: + # 1. 每次循环重新获取当前显示器上的所有 Workspace ID + valid_ws_ids = get_active_output_workspace_ids() + if not valid_ws_ids: break + + # 2. 每次循环都重新获取最新的窗口列表 + windows = run_cmd("niri msg -j windows") + if not windows: break + + current_windows = [] + for w in windows: + # 判断窗口是否在允许的工作区集合内 + if w.get("workspace_id") not in valid_ws_ids: continue + app_id = w.get("app_id") or "" + if app_id in EXCLUDE_APPS: continue + current_windows.append(w) + + # 如果没有窗口了,直接退出 + if not current_windows: break + + current_windows.sort(key=get_window_sort_key) + + input_str = "" + for w in current_windows: + app_id = w.get("app_id") or "Wayland" + title = w.get("title", "No Title").replace("\n", " ") + display_str = f"[{app_id}] {title}" + line = f"{display_str}\0icon\x1f{app_id}" + input_str += f"{line}\n" + + try: + # 3. 启动 Fuzzel + proc = subprocess.Popen( + ["fuzzel"] + FUZZEL_ARGS, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + text=True + ) + stdout, _ = proc.communicate(input=input_str) + + return_code = proc.returncode + raw_output = stdout.strip() + + # 情况 A: 用户按 ESC 取消 -> 退出循环 + if return_code not in [0, 10] or not raw_output: + break + + try: + selected_idx = int(raw_output) + except ValueError: + break + + if 0 <= selected_idx < len(current_windows): + target_window = current_windows[selected_idx] + target_id = target_window.get("id") + + if return_code == 0: + # 动作: 切换窗口 -> 任务完成,退出循环 + subprocess.run(["niri", "msg", "action", "focus-window", "--id", str(target_id)]) + break + + elif return_code == 10: + # 动作: 关闭窗口 -> 执行关闭,然后 CONTINUE (继续循环) + subprocess.run(["niri", "msg", "action", "close-window", "--id", str(target_id)]) + + # 关键:稍微等一下,让 niri 有时间处理关闭动作, + # 否则立刻刷新列表可能还会看到那个已经被杀死的窗口 + time.sleep(0.1) + continue + + except Exception as e: + print(f"Error: {e}") + break + +if __name__ == "__main__": + main() diff --git a/minimal-niri-dotfiles/.config/niri/scripts/screenshot-sound.sh b/minimal-niri-dotfiles/.config/niri/scripts/screenshot-sound.sh new file mode 100644 index 0000000..c00f1f0 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/scripts/screenshot-sound.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# =================配置区域================= +SOUND="/usr/share/sounds/freedesktop/stereo/camera-shutter.oga" +# 这是一个“扳机”文件,存于内存中 (/dev/shm),读写极快 +TRIGGER_FILE="/dev/shm/niri_screenshot_armed" +# 有效期:按下截图键后,多少秒内产生了图片才响?(防止你取消截图后,下次复制图片误响) +TIMEOUT_SEC=15 +# ========================================= + +# 环境检查 +if ! command -v pw-play >/dev/null; then + notify-send "错误: 未找到 pw-play" + exit 1 +fi + +# ========================================= +# 1. 定义信号处理 (收到信号 = 上膛) +# ========================================= +arm_trigger() { + # 更新文件的修改时间,或者创建它 + touch "$TRIGGER_FILE" +} + +# 注册信号:收到 USR1 就执行 arm_trigger +trap arm_trigger SIGUSR1 + +# ========================================= +# 2. 启动剪贴板监听 (后台运行) +# ========================================= +# 只有当剪贴板真正发生变化时,这个子进程才会醒来 +wl-paste --watch bash -c " + # A. 检查是不是图片 + if wl-paste --list-types 2>/dev/null | grep -q 'image/'; then + + # B. 检查有没有“上膛” (文件是否存在) + if [ -f \"$TRIGGER_FILE\" ]; then + + # C. 检查“上膛”是否过期 (利用文件修改时间) + # $(date +%s) - stat获取的时间 + NOW=\$(date +%s) + FILE_TIME=\$(stat -c %Y \"$TRIGGER_FILE\") + DIFF=\$((NOW - FILE_TIME)) + + if [ \$DIFF -lt $TIMEOUT_SEC ]; then + # 조건을 满足:是图片 + 已上膛 + 没过期 + pw-play \"$SOUND\" & + + # D. 销毁扳机 (防止连响) + rm -f \"$TRIGGER_FILE\" + fi + fi + fi +" & +# 获取 wl-paste 的 PID,以便脚本退出时杀掉它 +WATCHER_PID=$! + +# ========================================= +# 3. 守护进程主循环 (0 CPU 占用) +# ========================================= +# 这里的 trap 负责在脚本退出时清理子进程 +trap "kill $WATCHER_PID; exit" INT TERM EXIT + +# 写入当前 PID 方便调试 (可选) +# echo $$ > /tmp/niri-sound.pid + +echo "截图音效服务已启动,等待 SIGUSR1 信号..." + +# 无限睡眠,只响应信号 +while true; do + sleep infinity & wait $! +done diff --git a/minimal-niri-dotfiles/.config/niri/scripts/swayidle.sh b/minimal-niri-dotfiles/.config/niri/scripts/swayidle.sh new file mode 100644 index 0000000..8918a95 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/scripts/swayidle.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# 5分钟锁屏,10分钟熄屏,20分钟休眠 +exec swayidle -w \ +timeout 600 'hyprlock -c ~/.config/niri/hyprlock.conf &' \ +timeout 900 'niri msg action power-off-monitors' \ +resume 'niri msg action power-on-monitors' \ +timeout 1800 'systemctl suspend' diff --git a/minimal-niri-dotfiles/.config/niri/scripts/toggle-wlsunset b/minimal-niri-dotfiles/.config/niri/scripts/toggle-wlsunset new file mode 100644 index 0000000..4964921 --- /dev/null +++ b/minimal-niri-dotfiles/.config/niri/scripts/toggle-wlsunset @@ -0,0 +1,27 @@ +#!/bin/bash + +# =============================================================== +# 配置区 +# =============================================================== +TEMP_LOW="5000" # 夜间/护眼色温 +TEMP_HIGH="6500" # 日间/标准色温 +TRANSITION="1800" # 过渡时间 (30分钟) + +# 经纬度 +LAT="36.5" +LONG="128.0" + +# =============================================================== +# 逻辑区 +# =============================================================== +if pgrep -x "wlsunset" > /dev/null; then + # 如果正在运行,则关闭 + pkill wlsunset + notify-send -t 2000 -a "System" "护眼模式" "已关闭" +else + # 如果未运行,则开启 + # 这里使用的是经纬度模式,如果你想用固定时间模式, + # 请把下面这行改为: wlsunset -S 07:00 -s 19:00 -t $TEMP_LOW -T $TEMP_HIGH -d $TRANSITION & + wlsunset -l $LAT -L $LONG -t $TEMP_LOW -T $TEMP_HIGH -d $TRANSITION & + notify-send -t 2000 -a "System" "护眼模式" "已开启,目标色温 ${TEMP_LOW}K" +fi diff --git a/minimal-niri-dotfiles/.config/satty/config.toml b/minimal-niri-dotfiles/.config/satty/config.toml new file mode 100644 index 0000000..63194dc --- /dev/null +++ b/minimal-niri-dotfiles/.config/satty/config.toml @@ -0,0 +1,15 @@ +[general] +copy-command = "wl-copy" +focus-toggles-toolbars= true +initial-tool = "brush" +zoom-factor=1.1 + +[font] +family = "Roboto" +style = "Regular" +fallback = [ + "Noto Sans CJK SC", + "Noto Sans CJK JP", + "Noto Sans CJK TC", + "Noto Sans CJK KR" +] diff --git a/minimal-niri-dotfiles/.config/waybar/config.jsonc b/minimal-niri-dotfiles/.config/waybar/config.jsonc new file mode 100644 index 0000000..552afc3 --- /dev/null +++ b/minimal-niri-dotfiles/.config/waybar/config.jsonc @@ -0,0 +1,208 @@ +// -*- mode: jsonc -*- +{ + // "layer": "top", // Waybar at top layer + // "position": "bottom", // Waybar position (top|bottom|left|right) + "height": 30, // Waybar height (to be removed for auto height) + // "width": 1280, // Waybar width + "spacing": 4, // Gaps between modules (4px) + // Choose the order of the modules + "modules-left": [ + "niri/workspaces", + "niri/window" + ], + "modules-center": [ + "clock", + ], + "modules-right": [ + "tray", + "idle_inhibitor", + "power-profiles-daemon", + "pulseaudio", + "keyboard-state", + "battery", + "battery#bat2" + ], + // Modules configuration + // "sway/workspaces": { + // "disable-scroll": true, + // "all-outputs": true, + // "warp-on-scroll": false, + // "format": "{name}: {icon}", + // "format-icons": { + // "1": "", + // "2": "", + // "3": "", + // "4": "", + // "5": "", + // "urgent": "", + // "focused": "", + // "default": "" + // } + // }, + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + "sway/mode": { + "format": "{}" + }, + "sway/scratchpad": { + "format": "{icon} {count}", + "show-empty": false, + "format-icons": ["", ""], + "tooltip": true, + "tooltip-format": "{app}: {title}" + }, + "mpd": { + "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ", + "format-disconnected": "Disconnected ", + "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ", + "unknown-tag": "N/A", + "interval": 5, + "consume-icons": { + "on": " " + }, + "random-icons": { + "off": " ", + "on": " " + }, + "repeat-icons": { + "on": " " + }, + "single-icons": { + "on": "1 " + }, + "state-icons": { + "paused": "", + "playing": "" + }, + "tooltip-format": "MPD (connected)", + "tooltip-format-disconnected": "MPD (disconnected)" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "tray": { + // "icon-size": 21, + "spacing": 10, + // "icons": { + // "blueman": "bluetooth", + // "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png" + // } + }, + "clock": { + // "timezone": "America/New_York", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + "cpu": { + "format": "{usage}% ", + "tooltip": false + }, + "memory": { + "format": "{}% " + }, + "temperature": { + // "thermal-zone": 2, + // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + "critical-threshold": 80, + // "format-critical": "{temperatureC}°C {icon}", + "format": "{temperatureC}°C {icon}", + "format-icons": ["", "", ""] + }, + "backlight": { + // "device": "acpi_video1", + "format": "{percent}% {icon}", + "format-icons": ["", "", "", "", "", "", "", "", ""] + }, + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-full": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""] + }, + "battery#bat2": { + "bat": "BAT2" + }, + "power-profiles-daemon": { + "format": "{icon}", + "tooltip-format": "Power profile: {profile}\nDriver: {driver}", + "tooltip": true, + "format-icons": { + "default": "", + "performance": "", + "balanced": "", + "power-saver": "" + } + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol" + }, + "custom/media": { + "format": "{icon} {text}", + "return-type": "json", + "max-length": 40, + "format-icons": { + "spotify": "", + "default": "🎜" + }, + "escape": true, + "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder + // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name + }, + "custom/power": { + "format" : "⏻ ", + "tooltip": false, + "menu": "on-click", + "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder + "menu-actions": { + "shutdown": "shutdown", + "reboot": "reboot", + "suspend": "systemctl suspend", + "hibernate": "systemctl hibernate" + } + } +} diff --git a/minimal-niri-dotfiles/.config/waybar/style.css b/minimal-niri-dotfiles/.config/waybar/style.css new file mode 100644 index 0000000..4bfa73f --- /dev/null +++ b/minimal-niri-dotfiles/.config/waybar/style.css @@ -0,0 +1,323 @@ +* { + /* `otf-font-awesome` is required to be installed for icons */ + font-family: JetBrainsMono NFP, FontAwesome, Roboto, Helvetica, Arial, sans-serif; + font-size: 13px; +} + +window#waybar { + background-color: rgba(43, 48, 59, 0.5); + border-bottom: 3px solid rgba(100, 114, 125, 0.5); + color: #ffffff; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +/* +window#waybar.empty { + background-color: transparent; +} +window#waybar.solo { + background-color: #FFFFFF; +} +*/ + +window#waybar.termite { + background-color: #3F3F3F; +} + +window#waybar.chromium { + background-color: #000000; + border: none; +} + +button { + /* Use box-shadow instead of border so the text isn't offset */ + box-shadow: inset 0 -3px transparent; + /* Avoid rounded borders under each button name */ + border: none; + border-radius: 0; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +button:hover { + background: inherit; + box-shadow: inset 0 -3px #ffffff; +} + +/* you can set a style on hover for any module like this */ +#pulseaudio:hover { + background-color: #a37800; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: #ffffff; +} + +#workspaces button:hover { + background: rgba(0, 0, 0, 0.2); +} + +#workspaces button.focused, #workspaces button.active { + background-color: #64727D; + box-shadow: inset 0 -3px #ffffff; +} + +#workspaces button.urgent { + background-color: #eb4d4b; +} + +#mode { + background-color: #64727D; + box-shadow: inset 0 -3px #ffffff; +} + +#clock, +#battery, +#cpu, +#memory, +#disk, +#temperature, +#backlight, +#network, +#pulseaudio, +#wireplumber, +#custom-media, +#tray, +#mode, +#idle_inhibitor, +#scratchpad, +#power-profiles-daemon, +#mpd { + padding: 0 10px; + color: #ffffff; +} + +#window, +#workspaces { + margin: 0 4px; +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right > widget:last-child > #workspaces { + margin-right: 0; +} + +#clock { + background-color: #64727D; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging, #battery.plugged { + color: #ffffff; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +/* Using steps() instead of linear as a timing function to limit cpu usage */ +#battery.critical:not(.charging) { + background-color: #f53c3c; + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: steps(12); + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#power-profiles-daemon.performance { + background-color: #f53c3c; + color: #ffffff; +} + +#power-profiles-daemon.balanced { + background-color: #2980b9; + color: #ffffff; +} + +#power-profiles-daemon.power-saver { + background-color: #2ecc71; + color: #000000; +} + +label:focus { + background-color: #000000; +} + +#cpu { + background-color: #2ecc71; + color: #000000; +} + +#memory { + background-color: #9b59b6; +} + +#disk { + background-color: #964B00; +} + +#backlight { + background-color: #90b1b1; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} + +#pulseaudio { + background-color: #f1c40f; + color: #000000; +} + +#pulseaudio.muted { + background-color: #90b1b1; + color: #2a5c45; +} + +#wireplumber { + background-color: #fff0f5; + color: #000000; +} + +#wireplumber.muted { + background-color: #f53c3c; +} + +#custom-media { + background-color: #66cc99; + color: #2a5c45; + min-width: 100px; +} + +#custom-media.custom-spotify { + background-color: #66cc99; +} + +#custom-media.custom-vlc { + background-color: #ffa000; +} + +#temperature { + background-color: #f0932b; +} + +#temperature.critical { + background-color: #eb4d4b; +} + +#tray { + background-color: #2980b9; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} + +#idle_inhibitor { + background-color: #2d3436; +} + +#idle_inhibitor.activated { + background-color: #ecf0f1; + color: #2d3436; +} + +#mpd { + background-color: #66cc99; + color: #2a5c45; +} + +#mpd.disconnected { + background-color: #f53c3c; +} + +#mpd.stopped { + background-color: #90b1b1; +} + +#mpd.paused { + background-color: #51a37a; +} + +#language { + background: #00b093; + color: #740864; + padding: 0 5px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state { + background: #97e1ad; + color: #000000; + padding: 0 0px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state > label { + padding: 0 5px; +} + +#keyboard-state > label.locked { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad.empty { + background-color: transparent; +} + +#privacy { + padding: 0; +} + +#privacy-item { + padding: 0 5px; + color: white; +} + +#privacy-item.screenshare { + background-color: #cf5700; +} + +#privacy-item.audio-in { + background-color: #1ca000; +} + +#privacy-item.audio-out { + background-color: #0069d4; +} diff --git a/minimal-niri-dotfiles/.config/xdg-desktop-portal/niri-portals.conf b/minimal-niri-dotfiles/.config/xdg-desktop-portal/niri-portals.conf new file mode 100644 index 0000000..f1ac31d --- /dev/null +++ b/minimal-niri-dotfiles/.config/xdg-desktop-portal/niri-portals.conf @@ -0,0 +1,8 @@ +[preferred] +default=gnome;gtk; +org.freedesktop.impl.portal.Access=gtk; +org.freedesktop.impl.portal.Notification=gtk; +org.freedesktop.impl.portal.FileChooser=gtk; +org.freedesktop.impl.portal.Secret=gnome-keyring; +org.freedesktop.impl.portal.ScreenCast=gnome +org.freedesktop.impl.portal.Screenshot=gnome diff --git a/minimal-niri-dotfiles/.config/xfce4/helpers.rc b/minimal-niri-dotfiles/.config/xfce4/helpers.rc new file mode 100644 index 0000000..5226528 --- /dev/null +++ b/minimal-niri-dotfiles/.config/xfce4/helpers.rc @@ -0,0 +1 @@ +TerminalEmulator=kitty diff --git a/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml b/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml new file mode 100644 index 0000000..e3e9cd4 --- /dev/null +++ b/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml b/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml new file mode 100644 index 0000000..e230cb3 --- /dev/null +++ b/minimal-niri-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/minimal-niri-dotfiles/.local/bin/apt b/minimal-niri-dotfiles/.local/bin/apt new file mode 100644 index 0000000..fff129a --- /dev/null +++ b/minimal-niri-dotfiles/.local/bin/apt @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +# ============================================================================== +# Function: apt (Smart Arch Package Manager Wrapper for Bash) +# Description: Maps common Debian 'apt' commands to an intelligent Arch backend. +# Features: +# - Fallback routing: paru > yay > pacman. +# - Automatic Sudo Handling: Prevents AUR helpers from running as root. +# - Anti-Partial-Upgrade: Merges update/upgrade into a safe -Syu operation. +# - Deep Clean Default: Merges remove/purge into -Rns for a pristine system. +# - UI Integration: Progressive enhancement with 'shorin' for interactive modes. +# - Safe orphan detection and i18n support. +# - Highly readable, colorized, and column-aligned help output. +# Usage: apt {update|upgrade|install [ui]|remove [ui]|search|show|autoremove|clean|help|-h} [pkg...] +# ============================================================================== + +# 启用严格模式:遇到错误退出、未定义变量退出、管道中任何命令失败则失败 +set -euo pipefail + +# 1. 极简的 Locale 探测 (纯Bash字符串匹配) +is_zh=0 +if [[ "${LC_ALL:-}" == zh_* || "${LC_MESSAGES:-}" == zh_* || "${LANG:-}" == zh_* ]]; then + is_zh=1 +fi + +# 2. 探测 shorin UI 工具是否存在 +has_shorin=0 +if command -v shorin >/dev/null 2>&1; then + has_shorin=1 +fi + +# 3. 参数解析与默认行为 +if [[ $# -eq 0 ]]; then + action="help" + exit_code=1 +else + action="$1" + shift # 移除第一个参数,将剩余参数传给对应的命令 + exit_code=0 +fi + +# 定义 ANSI 颜色转义序列 (KISS原则:不依赖 tput) +c_cmd=$'\033[36m' # Cyan +c_hl=$'\033[33m' # Yellow +c_rst=$'\033[0m' # Reset + +# 预定义基础错误信息 (本地化) +msg_err_pkg="Error: Specify packages." +msg_err_search="Error: Specify search term." +msg_err_show="Error: Specify package to show." + +if [[ "$is_zh" -eq 1 ]]; then + msg_err_pkg="错误:请指定要操作的软件包。" + msg_err_search="错误:请指定搜索词。" + msg_err_show="错误:请指定要查看的软件包。" +fi + +# 4. 帮助信息拦截与本地化排版 +if [[ "$action" == "help" || "$action" == "-h" || "$action" == "--help" ]]; then + if [[ "$is_zh" -eq 1 ]]; then + echo "Arch 包管理器包装器 (优先级: ${c_hl}paru > yay > pacman${c_rst})" + echo "用法: ${c_hl}apt${c_rst} <命令> [软件包...]" + echo "" + echo "命令:" + echo " ${c_cmd}update(upgrade)${c_rst} 同步数据库并更新系统 (-Syu)" + echo " ${c_cmd}install ${c_rst} 安装软件包 (-S)" + if [[ "$has_shorin" -eq 1 ]]; then + echo " ${c_cmd}install ui ${c_rst} 打开交互式界面安装 (依赖: shorin-contrib-git)" + fi + echo " ${c_cmd}remove ${c_rst} 彻底卸载软件包、依赖及配置文件 (-Rns)" + if [[ "$has_shorin" -eq 1 ]]; then + echo " ${c_cmd}remove ui ${c_rst} 打开交互式界面卸载 (依赖: shorin-contrib-git)" + fi + echo " ${c_cmd}search ${c_rst} 搜索软件包 (-Ss)" + echo " ${c_cmd}show ${c_rst} 显示软件包详细信息 (-Si)" + echo " ${c_cmd}autoremove ${c_rst} 安全地清理系统中的孤立软件包" + echo " ${c_cmd}clean ${c_rst} 清理下载缓存 (-Sc)" + echo " ${c_cmd}help, -h ${c_rst} 显示此帮助信息" + else + echo "Smart Arch Package Wrapper (Routing: ${c_hl}paru > yay > pacman${c_rst})" + echo "Usage: ${c_hl}apt${c_rst} [package...]" + echo "" + echo "Commands:" + echo " ${c_cmd}update(upgrade)${c_rst} Sync databases and update system (Safe -Syu)" + echo " ${c_cmd}install ${c_rst} Install packages (-S)" + if [[ "$has_shorin" -eq 1 ]]; then + echo " ${c_cmd}install ui ${c_rst} Open interactive installation UI (shorin pac)" + fi + echo " ${c_cmd}remove ${c_rst} Remove packages, unneeded dependencies, and configs (-Rns)" + if [[ "$has_shorin" -eq 1 ]]; then + echo " ${c_cmd}remove ui ${c_rst} Open interactive removal UI (shorin pacr)" + fi + echo " ${c_cmd}search ${c_rst} Search for packages (-Ss)" + echo " ${c_cmd}show ${c_rst} Show package details (-Si)" + echo " ${c_cmd}autoremove ${c_rst} Remove orphaned packages safely" + echo " ${c_cmd}clean ${c_rst} Clean package cache (-Sc)" + echo " ${c_cmd}help, -h ${c_rst} Show this help message" + fi + exit "$exit_code" +fi + +# 5. 核心路由与提权逻辑 +# 使用数组来存储命令,避免含有空格的参数被 Bash 错误拆分 +if command -v paru >/dev/null 2>&1; then + pkg_mgr="paru" + cmd=("paru") +elif command -v yay >/dev/null 2>&1; then + pkg_mgr="yay" + cmd=("yay") +else + pkg_mgr="pacman" + cmd=("sudo" "pacman") +fi + +# 6. 动作映射 (Action Mapping) +case "$action" in + update|upgrade) + "${cmd[@]}" -Syu + ;; + install) + if [[ $# -eq 0 ]]; then echo "$msg_err_pkg"; exit 1; fi + # 拦截 'install ui',条件:且只输入了 ui 一个参数,且系统存在 shorin + if [[ "$1" == "ui" && $# -eq 1 && "$has_shorin" -eq 1 ]]; then + shorin pac + exit 0 + fi + "${cmd[@]}" -S "$@" + ;; + remove) + if [[ $# -eq 0 ]]; then echo "$msg_err_pkg"; exit 1; fi + # 拦截 'remove ui' + if [[ "$1" == "ui" && $# -eq 1 && "$has_shorin" -eq 1 ]]; then + shorin pacr + exit 0 + fi + "${cmd[@]}" -Rns "$@" + ;; + search) + if [[ $# -eq 0 ]]; then echo "$msg_err_search"; exit 1; fi + "$pkg_mgr" -Ss "$@" + ;; + show) + if [[ $# -eq 0 ]]; then echo "$msg_err_show"; exit 1; fi + "$pkg_mgr" -Si "$@" + ;; + autoremove) + # 巧妙处理: pacman -Qtdq 找不到包时会返回退出码1,使用 || true 避免触发 set -e 导致脚本直接终止 + orphans=$(pacman -Qtdq || true) + + if [[ -n "$orphans" ]]; then + # 使用 mapfile 将多行字符串转换为安全数组,精准统计数量 + mapfile -t orphan_arr <<< "$orphans" + if [[ "$is_zh" -eq 1 ]]; then + echo "找到 ${#orphan_arr[@]} 个孤立的软件包。正在通过 $pkg_mgr 卸载..." + else + echo "Found ${#orphan_arr[@]} orphaned package(s). Removing via $pkg_mgr..." + fi + "${cmd[@]}" -Rns "${orphan_arr[@]}" + else + if [[ "$is_zh" -eq 1 ]]; then + echo "系统很干净,没有需要清理的孤立软件包。" + else + echo "System is clean. No orphaned packages to remove." + fi + fi + ;; + clean) + "${cmd[@]}" -Sc + ;; + *) + if [[ "$is_zh" -eq 1 ]]; then + echo "错误:不支持的 apt 命令映射: $action" + echo "运行 'apt -h' 查看可用命令。" + else + echo "Error: Unsupported apt command mapped: $action" + echo "Run 'apt -h' for valid commands." + fi + exit 1 + ;; +esac diff --git a/minimal-niri-dotfiles/.local/bin/f b/minimal-niri-dotfiles/.local/bin/f new file mode 100644 index 0000000..a1a9422 --- /dev/null +++ b/minimal-niri-dotfiles/.local/bin/f @@ -0,0 +1,215 @@ +#!/usr/bin/env bash + +# ============================================================================== +# 【脚本功能说明】 +# 1. 结合 Fastfetch,在终端启动时展示随机二次元图片 (支持 SFW / NSFW 模式)。 +# 2. 具备静默后台异步下载机制,库存不足时自动补货,绝不阻塞前台终端的启动。 +# 3. 具备智能缓存管理机制,自动控制待展示区与已使用区 (used) 的图片数量上限。 +# 4. 具备极致的网络环境容错处理,无网或弱网时自动降级 fallback,避免死等。 +# 5. 具备自动清理 Fastfetch 内部生成的图片转换缓存功能,防止磁盘空间无感膨胀。 +# ============================================================================== + +# 启用严格模式:遇到错误退出、未定义变量退出、管道中任何命令失败则失败 +set -euo pipefail + +# ================= 配置区域 ================= + +# [开关] 阅后即焚模式 (针对 Fastfetch 内部缓存) +# true = 运行后强力清空 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) +# false = 保留缓存 +clean_cache_mode=true + +# 每次补货下载多少张 +download_batch_size=10 +# 最大库存上限 (待展示区) +max_cache_limit=100 +# 库存少于多少张时开始补货 +min_trigger_limit=60 +# used 目录最大存放数量 (超过此数量将按照时间顺序删除最旧的文件) +max_used_limit=50 + +# =========================================== + +# --- 0. 参数解析与模式设置 --- + +nsfw_mode=false +if [[ "${NSFW:-}" == "1" ]]; then + nsfw_mode=true +fi + +args_for_fastfetch=() +for arg in "$@"; do + if [[ "$arg" == "--nsfw" ]]; then + nsfw_mode=true + else + args_for_fastfetch+=("$arg") + fi +done + +# --- 1. 目录配置 --- + +if [[ "$nsfw_mode" == true ]]; then + cache_dir="$HOME/.cache/fastfetch_waifu_nsfw" + lock_file="/tmp/fastfetch_waifu_nsfw.lock" +else + cache_dir="$HOME/.cache/fastfetch_waifu" + lock_file="/tmp/fastfetch_waifu.lock" +fi + +used_dir="$cache_dir/used" +mkdir -p "$cache_dir" "$used_dir" + +# --- 2. 核心函数定义 --- + +check_network() { + curl -sI --connect-timeout 2 "http://captive.apple.com/hotspot-detect.html" >/dev/null 2>&1 +} + +get_random_url() { + local timeout="--connect-timeout 5 --max-time 15" + local rand=$(( RANDOM % 3 + 1 )) + + # 管道中使用 || true 确保 jq 解析失败时不会触发 pipefail 导致脚本崩溃 + if [[ "$nsfw_mode" == true ]]; then + case $rand in + 1) curl -s $timeout "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=true" | jq -r '.images[0].url' 2>/dev/null || true ;; + 2) curl -s $timeout "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' 2>/dev/null || true ;; + 3) curl -s $timeout "https://api.waifu.pics/nsfw/neko" | jq -r '.url' 2>/dev/null || true ;; + esac + else + case $rand in + 1) curl -s $timeout "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=false" | jq -r '.images[0].url' 2>/dev/null || true ;; + 2) curl -s $timeout "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' 2>/dev/null || true ;; + 3) curl -s $timeout "https://api.waifu.pics/sfw/waifu" | jq -r '.url' 2>/dev/null || true ;; + esac + fi +} + +download_one_image() { + local url + url=$(get_random_url || true) + + if [[ -n "$url" && "$url" =~ ^http ]]; then + local filename="waifu_$(date +%s%N)_$RANDOM.jpg" + local target_path="$cache_dir/$filename" + + # 使用 || true 防止 curl 意外崩溃 + curl -s -L --connect-timeout 5 --max-time 15 -o "$target_path" "$url" || true + + if [[ -s "$target_path" ]]; then + if command -v file >/dev/null 2>&1; then + if ! file --mime-type "$target_path" | grep -q "image/"; then + rm -f "$target_path" + fi + fi + else + rm -f "$target_path" + fi + fi +} + +background_job() { + ( + # 1. 彻底切断标准输入输出,变成纯粹的后台幽灵进程 + exec /dev/null 2>&1 + + # 2. 忽略终端挂断信号 + trap '' HUP + + # 3. 局部关闭严格模式,确保后台尽力而为,不因单次网络错误退出 + set +e + + # 4. 获取文件描述符 200 的排他锁,防止并发下载 + exec 200>"$lock_file" + flock -n 200 || exit 0 + + # 网络检查,没网就悄悄退出 + if ! check_network; then + exit 0 + fi + + # 开启空 glob 扩展 + shopt -s nullglob + + # --- 补货逻辑 --- + local current_files=("$cache_dir"/*.jpg) + if (( ${#current_files[@]} < min_trigger_limit )); then + for ((i=0; i max_cache_limit )); then + local skip_lines=$(( max_cache_limit + 1 )) + local cache_to_delete + # 只有明确文件存在时才执行 ls,避免 nullglob 导致的当前目录误删 + mapfile -t cache_to_delete < <(ls -tp "$cache_dir"/*.jpg 2>/dev/null | tail -n +"$skip_lines") + if (( ${#cache_to_delete[@]} > 0 )); then + rm -f -- "${cache_to_delete[@]}" + fi + fi + ) & +} + +# --- 3. 主程序逻辑 --- + +# 开启空 glob 扩展,安全获取文件列表 +shopt -s nullglob +files=("$cache_dir"/*.jpg) +num_files=${#files[@]} +selected_img="" + +if (( num_files > 0 )); then + rand_index=$(( RANDOM % num_files )) + selected_img="${files[$rand_index]}" + + background_job +else + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + + if check_network; then + # 前台下载时暂时关闭严格模式,防止网络异常导致脚本闪退 + set +e + download_one_image + set -e + else + echo "网络好像不太通畅,无法下载新图片 QAQ" + fi + + # 重新获取文件列表 + files=("$cache_dir"/*.jpg) + if (( ${#files[@]} > 0 )); then + selected_img="${files[0]}" + background_job + fi +fi + +if [[ -n "$selected_img" && -f "$selected_img" ]]; then + # 显示图片 + fastfetch --logo "$selected_img" --logo-preserve-aspect-ratio true "${args_for_fastfetch[@]}" + + # === 移动到 used 目录 === + mv "$selected_img" "$used_dir/" + + # === 检查 used 目录并清理旧图 === + used_files=("$used_dir"/*.jpg) + if (( ${#used_files[@]} > max_used_limit )); then + skip_lines=$(( max_used_limit + 1 )) + + mapfile -t files_to_delete < <(ls -tp "$used_dir"/*.jpg 2>/dev/null | tail -n +"$skip_lines") + if (( ${#files_to_delete[@]} > 0 )); then + rm -f -- "${files_to_delete[@]}" + fi + fi + + # 清理 Fastfetch 内部缓存 + if [[ "$clean_cache_mode" == true ]]; then + rm -rf "$HOME/.cache/fastfetch/images" + fi +else + echo "图片获取失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch "${args_for_fastfetch[@]}" +fi diff --git a/minimal-niri-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/minimal-niri-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/minimal-niri-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/minimal-niri-dotfiles/.vimrc b/minimal-niri-dotfiles/.vimrc new file mode 100644 index 0000000..39302e0 --- /dev/null +++ b/minimal-niri-dotfiles/.vimrc @@ -0,0 +1,32 @@ +"显示行号 +set number +"显示相对行号 +set relativenumber +"高亮当前行 +set cursorline +"语法高亮 +syntax on + +" 开启自动缩进,新的一行会自动与上一行对齐 +set autoindent +" 在输入搜索词时,实时高亮显示匹配项(增量搜索) +set incsearch + +" 高亮显示所有搜索结果 +set hlsearch + +" 搜索时忽略大小写 +set ignorecase + +" 如果搜索词中包含了大写字母,则自动切换为大小写敏感搜索 +set smartcase +" 开启持久化撤销(undo),即使关闭再打开文件,也能撤销之前的更改 +set undofile +" undo目录 +silent !mkdir -p ~/.cache/vim/undo +set undodir=~/.cache/vim/undo +" 剪贴板 gvim的功能 +set clipboard=unnamedplus +" 接管鼠标事件 +set mouse=a + diff --git a/minimal-niri-dotfiles/.zshrc b/minimal-niri-dotfiles/.zshrc new file mode 100644 index 0000000..6d79ab7 --- /dev/null +++ b/minimal-niri-dotfiles/.zshrc @@ -0,0 +1,49 @@ +eval "$(starship init zsh)" +# 设置历史记录文件的路径 +HISTFILE=~/.zsh_history + +# 设置在会话(内存)中和历史文件中保存的条数,建议设置得大一些 +HISTSIZE=1000 +SAVEHIST=1000 + +# 忽略重复的命令,连续输入多次的相同命令只记一次 +setopt HIST_IGNORE_DUPS + +# 忽略以空格开头的命令(用于临时执行一些你不想保存的敏感命令) +setopt HIST_IGNORE_SPACE + +# 在多个终端之间实时共享历史记录 +# 这是实现多终端同步最关键的选项 +setopt SHARE_HISTORY + +# 让新的历史记录追加到文件,而不是覆盖 +setopt APPEND_HISTORY +# 在历史记录中记录命令的执行开始时间和持续时间 +setopt EXTENDED_HISTORY + +#语法检查和高亮 +source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh +ZSH_AUTOSUGGEST_STRATEGY=(history completion) +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +#开启tab上下左右选择补全 +zstyle ':completion:*' menu select +autoload -Uz compinit +compinit + +# 自定义命令 +eval "$(zoxide init zsh)" +alias cd="z" + +alias ls='eza --icons' +alias la='eza -al --icons --group-directories-first' +alias lt='eza --tree --level=2 --icons' + +alias fa='fastfetch' +alias f='f' +alias fnsfw='f --nsfw' + +alias reboot='systemctl reboot' +alias poweroff='systemctl poweroff' +alias suspend='systemctl suspend' + +alias cat='bat' diff --git a/niri-applist.txt b/niri-applist.txt new file mode 100644 index 0000000..9c7fe6e --- /dev/null +++ b/niri-applist.txt @@ -0,0 +1,52 @@ +# --- Standard Packages --- +bat # better cat +bazaar # Gui store for flatpak software +bluetui # tui for bluetooth +brightnessctl # Device brightness control +cava # Console-based Audio Visualizer +cliphist # Clipboard history manager +clipnotify # x11 clipboard manager +wl-clipboard # Command-line copy/paste utilities +xclip # x11 clipboard manger +eza # Modern replacement for ls +fish # Friendly Interactive Shell +starship # Cross-shell prompt +zoxide # Smarter cd command +grim # Screenshot utility (Grabs images) +slurp # Region selector (Works with grim) +satty # Modern screenshot annotation tool +wf-recorder # Screen recorder for Wayland +wl-screenrec-git # Screen recorder for Wayland (RUST) +hyprlock # Screen locker with effects (Blur/Screenshots) +hyprpicker # Color picker for Wayland +chafa # terminal image preview +timg # view image in terminal +imv # Image Viewer for Wayland +imagemagick # Image manipulation tools +ffmpegthumbnailer # generate thumbnailers +waifu2x-ncnn-vulkan # make anime wallpaper more clear +jq # Command-line JSON processor +nwg-look # GTK3 settings editor for Wayland +pacman-contrib # pacman utilus +swayidle # Idle management daemon (Screen lock/suspend) +swayosd # On-Screen Display for Volume/Brightness +awww # Efficient wallpaper daemon for Wayland +ttf-jetbrains-mono-nerd # JetBrains Mono font (Nerd Font patched) +waybar # Highly customizable Wayland bar +wlsunset # take care of your eyes +xwayland-satellite # XWayland compatibility +pavucontrol # sound config GUI +downgrade # downgrade software version +strace # dependency of shorin-contrib-git +# --- AUR Packages --- +AUR:shorin-contrib-git # shorin-utils +AUR:clipsync-git # x11 <--> wayland clipboard sync +AUR:shorinclip-git # My clipboard tui +AUR:ddcutil-service # Monitor hardware brightness control service +AUR:matugen # Material You theme generator +AUR:python-pywalfox # Pywal support for Firefox +AUR:ttf-jetbrains-maple-mono-nf-xx-xx # Maple Mono NF font +AUR:ttf-lxgw-wenkai-screen # xia2 wu4 wen2 kai3 font +AUR:waybar-niri-taskbar-git # Waybar module: Niri Workspaces/Taskbar +AUR:waypaper-git # GUI wallpaper setter (Frontend for swww) +AUR:niri-sidebar-git # niri sidebar functions \ No newline at end of file diff --git a/noctalia-dotfiles/.config/Thunar/accels.scm b/noctalia-dotfiles/.config/Thunar/accels.scm new file mode 100644 index 0000000..92c2059 --- /dev/null +++ b/noctalia-dotfiles/.config/Thunar/accels.scm @@ -0,0 +1,136 @@ +; thunar GtkAccelMap rc-file -*- scheme -*- +; this file is an automated accelerator map dump +; +; (gtk_accel_path "/ThunarStandardView/sort-by-type" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-last-modified" "") +; (gtk_accel_path "/Thunarwindow/menu" "") +; (gtk_accel_path "/ThunarActionManager/cut" "x") +; (gtk_accel_path "/ThunarStandardView/sort-by-size" "") +(gtk_accel_path "/ThunarActions/uca-action-1769427857102992-1" "v") +; (gtk_accel_path "/ThunarWindow/file-menu" "") +; (gtk_accel_path "/ThunarWindow/close-tab" "w") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab-alt" "ISO_Left_Tab") +; (gtk_accel_path "/ThunarStatusBar/toggle-size" "") +; (gtk_accel_path "/ThunarWindow/new-window" "n") +; (gtk_accel_path "/ThunarWindow/clear-directory-specific-settings" "") +; (gtk_accel_path "/ThunarWindow/close-window" "q") +; (gtk_accel_path "/ThunarWindow/open-parent" "Up") +; (gtk_accel_path "/ThunarWindow/view-side-pane-menu" "") +; (gtk_accel_path "/ThunarStatusBar/toggle-size-in-bytes" "") +; (gtk_accel_path "/ThunarWindow/switch-previous-tab" "Page_Up") +; (gtk_accel_path "/ThunarBookmarks/43958e0ed33f21f69df101ad8063a653" "") +; (gtk_accel_path "/ThunarActionManager/open" "o") +; (gtk_accel_path "/ThunarStandardView/sort-ascending" "") +; (gtk_accel_path "/ThunarWindow/toggle-split-view" "F3") +; (gtk_accel_path "/ThunarActionManager/copy-2" "Insert") +; (gtk_accel_path "/ThunarActionManager/trash-delete" "Delete") +; (gtk_accel_path "/ThunarWindow/open-recent" "") +; (gtk_accel_path "/ThunarWindow/view-configure-toolbar" "") +; (gtk_accel_path "/ThunarStandardView/forward" "Right") +; (gtk_accel_path "/ThunarActionManager/restore" "") +; (gtk_accel_path "/ThunarWindow/open-location-alt" "d") +; (gtk_accel_path "/ThunarStandardView/select-by-pattern" "s") +; (gtk_accel_path "/ThunarWindow/zoom-out-alt" "KP_Subtract") +; (gtk_accel_path "/ThunarWindow/contents" "F1") +; (gtk_accel_path "/ThunarWindow/open-file-menu" "F10") +; (gtk_accel_path "/ThunarBookmarks/54761b802eb6de69c74ff01588374999" "") +; (gtk_accel_path "/ThunarWindow/show-highlight" "") +; (gtk_accel_path "/ThunarStandardView/sort-descending" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-name" "") +; (gtk_accel_path "/ThunarStandardView/select-all-files" "a") +; (gtk_accel_path "/ThunarActionManager/execute" "") +; (gtk_accel_path "/ThunarStandardView/properties" "Return") +; (gtk_accel_path "/ThunarActionManager/cut-2" "") +; (gtk_accel_path "/ThunarStandardView/sort-by-dtime" "") +; (gtk_accel_path "/ThunarWindow/open-templates" "") +; (gtk_accel_path "/ThunarActionManager/paste-2" "Insert") +; (gtk_accel_path "/ThunarWindow/switch-next-tab" "Page_Down") +; (gtk_accel_path "/ThunarStatusBar/toggle-filetype" "") +; (gtk_accel_path "/ThunarWindow/close-all-windows" "w") +; (gtk_accel_path "/ThunarStandardView/create-document" "") +; (gtk_accel_path "/ThunarWindow/detach-tab" "") +; (gtk_accel_path "/ThunarWindow/cancel-search" "Escape") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt2" "equal") +; (gtk_accel_path "/ThunarStatusBar/toggle-hidden-count" "") +; (gtk_accel_path "/ThunarShortcutsPane/sendto-shortcuts" "d") +; (gtk_accel_path "/ThunarActionManager/undo" "z") +; (gtk_accel_path "/ThunarWindow/view-location-selector-entry" "") +; (gtk_accel_path "/ThunarStandardView/toggle-sort-order" "") +(gtk_accel_path "/ThunarActions/uca-action-1769429285959977-2" "v") +; (gtk_accel_path "/ThunarBookmarks/974ddf6f60ae0a85b557432c4c4f2cd9" "") +; (gtk_accel_path "/ThunarActionManager/paste" "v") +; (gtk_accel_path "/ThunarWindow/zoom-in-alt1" "KP_Add") +; (gtk_accel_path "/ThunarWindow/view-menubar" "m") +; (gtk_accel_path "/ThunarActionManager/restore-show" "") +; (gtk_accel_path "/ThunarWindow/open-desktop" "") +; (gtk_accel_path "/ThunarWindow/view-as-detailed-list" "2") +; (gtk_accel_path "/ThunarStandardView/back" "Left") +; (gtk_accel_path "/ThunarWindow/zoom-out" "minus") +; (gtk_accel_path "/ThunarStatusBar/toggle-display-name" "") +; (gtk_accel_path "/ThunarWindow/sendto-menu" "") +; (gtk_accel_path "/ThunarWindow/go-menu" "") +; (gtk_accel_path "/ThunarWindow/remove-from-recent" "") +; (gtk_accel_path "/ThunarBookmarks/cfa69549cdb5c4c993b09b04df44c6b4" "") +; (gtk_accel_path "/ThunarActionManager/open-with-other" "") +; (gtk_accel_path "/ThunarStandardView/invert-selection" "i") +; (gtk_accel_path "/ThunarWindow/view-side-pane-shortcuts" "b") +; (gtk_accel_path "/ThunarBookmarks/cab0112e8c7d4b26ba7cf8d0f8b46cc6" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-2" "Reload") +; (gtk_accel_path "/ThunarWindow/view-location-selector-menu" "") +; (gtk_accel_path "/ThunarWindow/edit-menu" "") +; (gtk_accel_path "/ThunarActionManager/copy" "c") +; (gtk_accel_path "/ThunarStandardView/sort-by-mtime" "") +; (gtk_accel_path "/ThunarStandardView/forward-alt" "Forward") +; (gtk_accel_path "/ThunarActionManager/move-to-trash" "") +; (gtk_accel_path "/ThunarWindow/reload-alt-1" "F5") +; (gtk_accel_path "/ThunarActionManager/delete-3" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/unselect-all-files" "Escape") +; (gtk_accel_path "/ThunarStandardView/arrange-items-menu" "") +; (gtk_accel_path "/ThunarWindow/bookmarks-menu" "") +; (gtk_accel_path "/ThunarWindow/reload" "r") +; (gtk_accel_path "/ThunarWindow/open-computer" "") +; (gtk_accel_path "/ThunarWindow/toggle-image-preview" "") +; (gtk_accel_path "/ThunarWindow/toggle-side-pane" "F9") +; (gtk_accel_path "/ThunarWindow/view-as-icons" "1") +; (gtk_accel_path "/ThunarActionManager/delete-2" "Delete") +; (gtk_accel_path "/ThunarWindow/zoom-in" "plus") +; (gtk_accel_path "/ThunarStandardView/rename" "F2") +; (gtk_accel_path "/ThunarWindow/open-location" "l") +; (gtk_accel_path "/ThunarWindow/view-as-compact-list" "3") +; (gtk_accel_path "/ThunarWindow/view-menu" "") +; (gtk_accel_path "/ThunarWindow/search" "f") +; (gtk_accel_path "/ThunarWindow/new-tab" "t") +; (gtk_accel_path "/ThunarWindow/zoom-reset" "0") +; (gtk_accel_path "/ThunarWindow/contents/help-menu" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-tab" "p") +; (gtk_accel_path "/ThunarWindow/view-location-selector-buttons" "") +; (gtk_accel_path "/ThunarStandardView/back-alt2" "Back") +; (gtk_accel_path "/ThunarActionManager/redo" "z") +; (gtk_accel_path "/ThunarWindow/open-trash" "") +; (gtk_accel_path "/ThunarActionManager/open-in-new-window" "o") +; (gtk_accel_path "/ThunarWindow/view-statusbar" "") +; (gtk_accel_path "/ThunarActionManager/open-location" "") +; (gtk_accel_path "/ThunarStandardView/duplicate" "") +; (gtk_accel_path "/ThunarActionManager/trash-delete-2" "KP_Delete") +; (gtk_accel_path "/ThunarStandardView/back-alt1" "BackSpace") +; (gtk_accel_path "/ThunarBookmarks/8b904a8394ac05541f9a6e2192949ce2" "") +; (gtk_accel_path "/ThunarBookmarks/88b2652848ed389ddc7f23513e177f1d" "") +; (gtk_accel_path "/ThunarStandardView/create-folder" "n") +; (gtk_accel_path "/ThunarWindow/open-home" "Home") +; (gtk_accel_path "/ThunarWindow/switch-focused-split-view-pane" "") +; (gtk_accel_path "/ThunarWindow/show-hidden" "h") +; (gtk_accel_path "/ThunarStandardView/set-default-app" "") +(gtk_accel_path "/ThunarActions/uca-action-1763109685799433-1" "t") +; (gtk_accel_path "/ThunarWindow/empty-trash" "") +; (gtk_accel_path "/ThunarWindow/preferences" "") +; (gtk_accel_path "/ThunarActionManager/delete" "") +; (gtk_accel_path "/ThunarWindow/open-network" "") +; (gtk_accel_path "/ThunarWindow/view-side-pane-tree" "e") +; (gtk_accel_path "/ThunarWindow/open-file-system" "") +; (gtk_accel_path "/ThunarWindow/search-alt" "Search") +; (gtk_accel_path "/ThunarWindow/switch-next-tab-alt" "Tab") +; (gtk_accel_path "/ThunarActionManager/sendto-desktop" "") +; (gtk_accel_path "/ThunarStandardView/make-link" "") +(gtk_accel_path "/ThunarActions/uca-action-1770297188807065-1" "space") +; (gtk_accel_path "/ThunarWindow/zoom-reset-alt" "KP_0") +; (gtk_accel_path "/ThunarWindow/about" "") diff --git a/noctalia-dotfiles/.config/Thunar/uca.xml b/noctalia-dotfiles/.config/Thunar/uca.xml new file mode 100644 index 0000000..4b952d5 --- /dev/null +++ b/noctalia-dotfiles/.config/Thunar/uca.xml @@ -0,0 +1,123 @@ + + + + utilities-terminal + Open Terminal Here + + 1763109685799433-1 + kitty -e fish + Example for a custom action + + * + + + + + + 多媒体信息 + + 1769424941490550-1 + kitty --class "media_info" -e media-info %f + + * + * + + + + + + 粘贴为链接 + + 1769427857102992-1 + sh -c 'wl-paste -t text/uri-list | python3 -c " +import sys, os, urllib.parse +dest_dir = sys.argv[1] + +# 逐行读取剪贴板里的文件 +for line in sys.stdin: + # 1. 清理路径:解码URL并去掉 file:// 前缀 + src = urllib.parse.unquote(line.strip()).replace(\"file://\", \"\") + + # 2. 基础检查 + if not src or not os.path.exists(src): continue + + # 3. 计算目标文件名 + filename = os.path.basename(src) + target = os.path.join(dest_dir, filename) + + # 4. 重名检测循环:如果有同名文件,变成 \"文件名 (1).后缀\" + root, ext = os.path.splitext(filename) + counter = 1 + while os.path.exists(target): + target = os.path.join(dest_dir, f\"{root} ({counter}){ext}\") + counter += 1 + + # 5. 创建链接 + try: os.symlink(src, target) + except: pass +" %f' + + * + * + + + + + 粘贴剪贴板图片 + + 1769429285959977-2 + bash -c 'd="%f";[ -d "$d" ]||d="$(dirname "$d")";cd "$d"||exit;n="img_$(date -Iseconds|cut -d+ -f1|tr T _|tr : -)";t=$(wl-paste -l);if echo "$t"|grep -q "^image/";then wl-paste -t image/png>"$n.png";elif echo "$t"|grep -q "text/uri-list";then u=$(wl-paste -t text/uri-list|head -n1);if [[ "$u" == file://* ]];then p="${u#file://}";f=$(python3 -c "import sys,urllib.parse;print(urllib.parse.unquote(sys.argv[1]))" "$p");[ -f "$f" ]&&cp "$f" "$n.${f##*.}";fi;fi' + + * + * + + + + + 视频转gif + + 1769514623477685-1 + kitty --class="floating-term" -e video2gif %F + + * + * + + + + + 图片转png + + 1769516013413116-2 + bash -c 'exec 1>>/tmp/img_err.log 2>&1; /usr/bin/notify-send "图片转换" "正在后台处理 $# 张图片..."; for f in "$@"; do /usr/bin/magick -background none "$f" -delete 1--1 "$(echo "$f" | sed "s/\.[^.]*$//").png"; done; /usr/bin/notify-send "图片转换" "处理完成"' -- %F + + * + * + + + + + 压缩视频大小 + + 1770021157399945-1 + kitty --class floating-term bash -c 'f="$1"; out="$(echo "$f" | sed "s/\.[^.]*$//")_compressed.mp4"; echo "正在处理: $f"; if ffmpeg -i "$f" -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -crf 26 -preset slow -c:a aac -b:a 128k -pix_fmt yuv420p "$out"; then echo -e "\n✅ 压缩完成!文件已保存为: $out"; else echo -e "\n❌ 压缩失败,请查看上方报错信息。"; fi; read -n 1 -s -r -p "按任意键退出..."' -- %f + + * + * + + + + + 快速查看 + + 1770297188807065-1 + kitty --class="floating-term" -e bash -c "~/.local/bin/preview \"\$1\"; read -n 1 -s -r" -- %f + + * + * + + + + + + + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/cached_layouts b/noctalia-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..28b5b8b --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3745 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-pl-slaviature] +Description="键盘 - 波兰语 - Polish (Slavistic Phonetic Alphabet)" +Language=pl +Label="pl (slaviature)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/chttrans.conf b/noctalia-dotfiles/.config/fcitx5/conf/chttrans.conf new file mode 100644 index 0000000..04476ad --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/chttrans.conf @@ -0,0 +1,12 @@ +# 转换引擎 +Engine=OpenCC +# 启用的输入法 +EnabledIM= +# 简转繁的 OpenCC 配置 +OpenCCS2TProfile=default +# 繁转简的 OpenCC 配置 +OpenCCT2SProfile=default + +[Hotkey] +0=Control+Shift+F + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/classicui.conf b/noctalia-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..01a65ce --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# 垂直候选列表 +Vertical Candidate List=True +# 使用鼠标滚轮翻页 +WheelForPaging=True +# 字体 +Font="Sans Serif 11" +# 菜单字体 +MenuFont="Sans Serif 10" +# 托盘字体 +TrayFont="Sans Serif 10" +# 托盘标签轮廓颜色 +TrayOutlineColor=#000000 +# 托盘标签文本颜色 +TrayTextColor=#ffffff +# 优先使用文字图标 +PreferTextIcon=False +# 在图标中显示布局名称 +ShowLayoutNameInIcon=True +# 使用输入法的语言来显示文字 +UseInputMethodLanguageToDisplayText=True +# 主题 +Theme=Matugen +# 深色主题 +DarkTheme=default-dark +# 跟随系统浅色/深色设置 +UseDarkTheme=False +# 当被主题和桌面支持时使用系统的重点色 +UseAccentColor=True +# 在 X11 上针对不同屏幕使用单独的 DPI +PerScreenDPI=False +# 固定 Wayland 的字体 DPI +ForceWaylandDPI=0 +# 在 Wayland 下启用分数缩放 +EnableFractionalScale=True + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/notifications.conf b/noctalia-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/pinyin.conf b/noctalia-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/noctalia-dotfiles/.config/fcitx5/conf/punctuation.conf b/noctalia-dotfiles/.config/fcitx5/conf/punctuation.conf new file mode 100644 index 0000000..3da1c4c --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/conf/punctuation.conf @@ -0,0 +1,10 @@ +# 字母或者数字之后输入半角标点 +HalfWidthPuncAfterLetterOrNumber=True +# 同时输入成对标点 (例如引号) +TypePairedPunctuationsTogether=False +# Enabled +Enabled=True + +[Hotkey] +0=Control+period + diff --git a/noctalia-dotfiles/.config/fcitx5/config b/noctalia-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..86333a0 --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# Enumerate when holding modifier of Toggle key +EnumerateWithTriggerKeys=True +# Enumerate Input Method Forward +EnumerateForwardKeys= +# Enumerate Input Method Backward +EnumerateBackwardKeys= +# Skip first input method while enumerating +EnumerateSkipFirst=False +# Time limit in milliseconds for triggering modifier key shortcuts +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Super+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# Active By Default +ActiveByDefault=False +# Reset state on Focus In +resetStateWhenFocusIn=No +# Share Input State +ShareInputState=No +# Show preedit in application +PreeditEnabledByDefault=True +# Show Input Method Information when switch input method +ShowInputMethodInformation=True +# Show Input Method Information when changing focus +showInputMethodInformationWhenFocusIn=False +# Show compact input method information +CompactInputMethodInformation=True +# Show first input method information +ShowFirstInputMethodInformation=True +# Default page size +DefaultPageSize=5 +# Override XKB Option +OverrideXkbOption=False +# Custom XKB Option +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# Allow input method in the password field +AllowInputMethodForPassword=False +# Show preedit text when typing password +ShowPreeditForPassword=False +# Interval of saving user data in minutes +AutoSavePeriod=30 + diff --git a/noctalia-dotfiles/.config/fcitx5/profile b/noctalia-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..d28185b --- /dev/null +++ b/noctalia-dotfiles/.config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=Default +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=Default + diff --git a/noctalia-dotfiles/.config/fish/config.fish b/noctalia-dotfiles/.config/fish/config.fish new file mode 100644 index 0000000..a66e103 --- /dev/null +++ b/noctalia-dotfiles/.config/fish/config.fish @@ -0,0 +1,56 @@ +if status is-interactive + # Commands to run in interactive sessions can go here +end +set fish_greeting "" +set -p PATH ~/.local/bin +starship init fish | source +zoxide init fish --cmd cd | source + +function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" +end + +function cat + command bat $argv +end +function ls + command eza --icons $argv +end + +function lt + command eza --icons --tree $argv +end +# grub +abbr grub 'LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 sudo grub-mkconfig -o /boot/grub/grub.cfg' +# 小黄鸭补帧 需要steam安装正版小黄鸭 +abbr lsfg 'LSFG_PROCESS="miyu"' +# fa运行fastfetch +abbr fa fastfetch +abbr reboot 'systemctl reboot' +function sl + command sl | lolcat +end +function 滚 + sysup +end +function raw + command ~/.local/bin/random-anime-wallpaper-dms $argv +end + +function 安装 + command yay -S $argv +end + +function 卸载 + command yay -Rns $argv +end + +# Added by LM Studio CLI (lms) +set -gx PATH $PATH /home/shorin/.lmstudio/bin +# End of LM Studio CLI section + diff --git a/noctalia-dotfiles/.config/fish/fish_variables b/noctalia-dotfiles/.config/fish/fish_variables new file mode 100644 index 0000000..ad10b9b --- /dev/null +++ b/noctalia-dotfiles/.config/fish/fish_variables @@ -0,0 +1,3 @@ +# This file contains fish universal variable definitions. +# VERSION: 3.0 +SETUVAR __fish_initialized:4300 diff --git a/noctalia-dotfiles/.config/fish/functions/apt.fish b/noctalia-dotfiles/.config/fish/functions/apt.fish new file mode 100644 index 0000000..162d6a1 --- /dev/null +++ b/noctalia-dotfiles/.config/fish/functions/apt.fish @@ -0,0 +1,171 @@ +# ============================================================================== +# Function: apt (Smart Arch Package Manager Wrapper for Fish) +# Description: Maps common Debian 'apt' commands to an intelligent Arch backend. +# Features: +# - Fallback routing: paru > yay > pacman. +# - Automatic Sudo Handling: Prevents AUR helpers from running as root. +# - Anti-Partial-Upgrade: Merges update/upgrade into a safe -Syu operation. +# - Deep Clean Default: Merges remove/purge into -Rns for a pristine system. +# - UI Integration: Progressive enhancement with 'shorin' for interactive modes. +# - Safe orphan detection and i18n support. +# - Highly readable, colorized, and column-aligned help output. +# Usage: apt {update|upgrade|install [ui]|remove [ui]|search|show|autoremove|clean|help|-h} [pkg...] +# ============================================================================== + +function apt -d "Smart wrapper routing apt commands to paru/yay/pacman" + # 1. 极简的 Locale 探测 + set -l is_zh 0 + if string match -q -r "^zh_" "$LC_ALL" "$LC_MESSAGES" "$LANG" + set is_zh 1 + end + + # 2. 探测 shorin UI 工具是否存在 + set -l has_shorin 0 + if command -q shorin + set has_shorin 1 + end + + set -l action "help" + set -l exit_code 0 + + if test (count $argv) -eq 0 + set exit_code 1 + else + set action $argv[1] + set -e argv[1] + end + + # 3. 帮助信息拦截与本地化 (重构的高颜值排版) + switch $action + case help -h --help + set -l c_cmd (set_color cyan) + set -l c_hl (set_color yellow) + set -l c_rst (set_color normal) + + if test $is_zh -eq 1 + echo "Arch 包管理器包装器 (优先级: "$c_hl"paru > yay > pacman"$c_rst")" + echo "用法: "$c_hl"apt"$c_rst" <命令> [软件包...]" + echo "" + echo "命令:" + echo " "$c_cmd"update(upgrade)"$c_rst" 同步数据库并更新系统 (-Syu)" + echo " "$c_cmd"install "$c_rst" 安装软件包 (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" 打开交互式界面安装 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"remove "$c_rst" 彻底卸载软件包、依赖及配置文件 (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" 打开交互式界面卸载 (依赖: shorin-contrib-git)" + end + echo " "$c_cmd"search "$c_rst" 搜索软件包 (-Ss)" + echo " "$c_cmd"show "$c_rst" 显示软件包详细信息 (-Si)" + echo " "$c_cmd"autoremove "$c_rst" 安全地清理系统中的孤立软件包" + echo " "$c_cmd"clean "$c_rst" 清理下载缓存 (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" 显示此帮助信息" + else + echo "Smart Arch Package Wrapper (Routing: "$c_hl"paru > yay > pacman"$c_rst")" + echo "Usage: "$c_hl"apt"$c_rst" [package...]" + echo "" + echo "Commands:" + echo " "$c_cmd"update(upgrade)"$c_rst" Sync databases and update system (Safe -Syu)" + echo " "$c_cmd"install "$c_rst" Install packages (-S)" + if test $has_shorin -eq 1 + echo " "$c_cmd"install ui "$c_rst" Open interactive installation UI (shorin pac)" + end + echo " "$c_cmd"remove "$c_rst" Remove packages, unneeded dependencies, and configs (-Rns)" + if test $has_shorin -eq 1 + echo " "$c_cmd"remove ui "$c_rst" Open interactive removal UI (shorin pacr)" + end + echo " "$c_cmd"search "$c_rst" Search for packages (-Ss)" + echo " "$c_cmd"show "$c_rst" Show package details (-Si)" + echo " "$c_cmd"autoremove "$c_rst" Remove orphaned packages safely" + echo " "$c_cmd"clean "$c_rst" Clean package cache (-Sc)" + echo " "$c_cmd"help, -h "$c_rst" Show this help message" + end + return $exit_code + end + + # 4. 核心路由与提权逻辑 + set -l pkg_mgr + set -l needs_sudo "no" + + if command -q paru + set pkg_mgr "paru" + else if command -q yay + set pkg_mgr "yay" + else + set pkg_mgr "pacman" + set needs_sudo "yes" + end + + set -l cmd + if test "$needs_sudo" = "yes" + set cmd sudo $pkg_mgr + else + set cmd $pkg_mgr + end + + # 5. 预定义基础错误信息 (本地化) + set -l msg_err_pkg "Error: Specify packages." + set -l msg_err_search "Error: Specify search term." + set -l msg_err_show "Error: Specify package to show." + if test $is_zh -eq 1 + set msg_err_pkg "错误:请指定要操作的软件包。" + set msg_err_search "错误:请指定搜索词。" + set msg_err_show "错误:请指定要查看的软件包。" + end + + # 6. 动作映射 (Action Mapping) + switch $action + case update upgrade + $cmd -Syu + case install + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'install ui',条件:且只输入了 ui 一个参数,且系统存在 shorin + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pac + return 0 + end + $cmd -S $argv + case remove + if test (count $argv) -eq 0; echo $msg_err_pkg; return 1; end + # 拦截 'remove ui' + if test "$argv[1]" = "ui" -a (count $argv) -eq 1 -a $has_shorin -eq 1 + shorin pacr + return 0 + end + $cmd -Rns $argv + case search + if test (count $argv) -eq 0; echo $msg_err_search; return 1; end + $pkg_mgr -Ss $argv + case show + if test (count $argv) -eq 0; echo $msg_err_show; return 1; end + $pkg_mgr -Si $argv + case autoremove + set -l orphans (pacman -Qtdq) + if test (count $orphans) -gt 0 + if test $is_zh -eq 1 + echo "找到 "(count $orphans)" 个孤立的软件包。正在通过 $pkg_mgr 卸载..." + else + echo "Found "(count $orphans)" orphaned package(s). Removing via $pkg_mgr..." + end + $cmd -Rns $orphans + else + if test $is_zh -eq 1 + echo "系统很干净,没有需要清理的孤立软件包。" + else + echo "System is clean. No orphaned packages to remove." + end + end + case clean + $cmd -Sc + case '*' + if test $is_zh -eq 1 + echo "错误:不支持的 apt 命令映射: $action" + echo "运行 'apt -h' 查看可用命令。" + else + echo "Error: Unsupported apt command mapped: $action" + echo "Run 'apt -h' for valid commands." + end + return 1 + end +end diff --git a/noctalia-dotfiles/.config/fish/functions/f.fish b/noctalia-dotfiles/.config/fish/functions/f.fish new file mode 100644 index 0000000..8059bc1 --- /dev/null +++ b/noctalia-dotfiles/.config/fish/functions/f.fish @@ -0,0 +1,252 @@ +function f + # ============================================================================== + # 【脚本功能说明】 + # 1. 结合 Fastfetch,在终端启动时展示随机二次元图片 (支持 SFW / NSFW 模式)。 + # 2. 具备静默后台异步下载机制,库存不足时自动补货,绝不阻塞前台终端的启动。 + # 3. 具备智能缓存管理机制,自动控制待展示区与已使用区 (used) 的图片数量上限。 + # 4. 具备极致的网络环境容错处理,无网或弱网时自动降级 fallback,避免死等。 + # 5. 具备自动清理 Fastfetch 内部生成的图片转换缓存功能,防止磁盘空间无感膨胀。 + # ============================================================================== + + # ================= 配置区域 ================= + + # [开关] 阅后即焚模式 (针对 Fastfetch 内部缓存) + # true = 运行后强力清空 ~/.cache/fastfetch/images/ (防止转码缓存膨胀) + # false = 保留缓存 + set -l CLEAN_CACHE_MODE true + + # 每次补货下载多少张 + set -l DOWNLOAD_BATCH_SIZE 10 + # 最大库存上限 (待展示区) + set -l MAX_CACHE_LIMIT 100 + # 库存少于多少张时开始补货 + set -l MIN_TRIGGER_LIMIT 60 + + # [新增] used 目录最大存放数量 + # 超过此数量将按照时间顺序删除最旧的文件 + set -l MAX_USED_LIMIT 50 + + # =========================================== + + # --- 0. 参数解析与模式设置 --- + + set -l NSFW_MODE false + # 检查环境变量 + if test "$NSFW" = "1" + set NSFW_MODE true + end + + set -l ARGS_FOR_FASTFETCH + for arg in $argv + if test "$arg" = "--nsfw" + set NSFW_MODE true + else + set -a ARGS_FOR_FASTFETCH $arg + end + end + + # --- 1. 目录配置 --- + + # 根据模式区分缓存目录和锁文件 + set -l CACHE_DIR + set -l LOCK_FILE + if test "$NSFW_MODE" = true + set CACHE_DIR "$HOME/.cache/fastfetch_waifu_nsfw" + set LOCK_FILE "/tmp/fastfetch_waifu_nsfw.lock" + else + set CACHE_DIR "$HOME/.cache/fastfetch_waifu" + set LOCK_FILE "/tmp/fastfetch_waifu.lock" + end + + # 定义已使用目录 + set -l USED_DIR "$CACHE_DIR/used" + + mkdir -p "$CACHE_DIR" + mkdir -p "$USED_DIR" + + # --- 2. 核心函数 --- + + # [修复] 抛弃脆弱的 1.1.1.1,使用苹果的全球探针节点,并使用 -I (HEAD请求) 极限提速 + function check_network + curl -sI --connect-timeout 2 "http://captive.apple.com/hotspot-detect.html" >/dev/null 2>&1 + return $status + end + + function get_random_url -V NSFW_MODE + set -l TIMEOUT --connect-timeout 5 --max-time 15 + set -l RAND (math (random) % 3 + 1) + + if test "$NSFW_MODE" = true + # === NSFW API === + switch $RAND + case 1 + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=true" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' + end + else + # === SFW (正常) API === + switch $RAND + case 1 + # [修复] IsNsfwfalse 修正为 IsNsfw=false + curl -s $TIMEOUT "https://api.waifu.im/images?IncludedTags=waifu&IsNsfw=false" | jq -r '.images[0].url' + case 2 + curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' + case 3 + curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' + end + end + end + + function download_one_image -V CACHE_DIR + set -l URL (get_random_url) + if string match -qr "^http" -- "$URL" + # 使用带时间戳的随机文件名 + set -l FILENAME "waifu_"(date +%s%N)"_"(random)".jpg" + set -l TARGET_PATH "$CACHE_DIR/$FILENAME" + + curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL" + + # 简单校验 + if test -s "$TARGET_PATH" + if command -v file >/dev/null 2>&1 + if not file --mime-type "$TARGET_PATH" | grep -q "image/" + rm -f "$TARGET_PATH" + end + end + else + rm -f "$TARGET_PATH" + end + end + end + + function background_job -V CACHE_DIR -V LOCK_FILE -V MIN_TRIGGER_LIMIT -V DOWNLOAD_BATCH_SIZE -V MAX_CACHE_LIMIT -V NSFW_MODE + # 导出函数定义以便在 fish -c 中使用 + set -l get_random_url_def (functions get_random_url | string collect) + set -l download_one_image_def (functions download_one_image | string collect) + set -l check_network_def (functions check_network | string collect) + + fish -c " + # [核心修复 1] 忽略终端关闭带来的 SIGHUP 信号 + trap '' HUP + + # 重新定义需要的函数 + $get_random_url_def + $download_one_image_def + $check_network_def + + # 使用 flock 防止并发 + flock -n 200 || exit 1 + + # [新增] 网络检查,没网就悄悄退出,不占后台资源 + if not check_network + exit 0 + end + + # 导入变量 + set CACHE_DIR '$CACHE_DIR' + set NSFW_MODE '$NSFW_MODE' + + # 1. 补货检查 + set CURRENT_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + + if test \$CURRENT_COUNT -lt $MIN_TRIGGER_LIMIT + for i in (seq 1 $DOWNLOAD_BATCH_SIZE) + download_one_image + sleep 0.5 + end + end + + # 2. 清理过多库存 (清理的是下载缓存区,不是 used 区) + set FINAL_COUNT (find \$CACHE_DIR -maxdepth 1 -name '*.jpg' 2>/dev/null | wc -l) + if test \$FINAL_COUNT -gt $MAX_CACHE_LIMIT + set DELETE_START_LINE (math $MAX_CACHE_LIMIT + 1) + ls -tp \$CACHE_DIR/*.jpg 2>/dev/null | tail -n +\$DELETE_START_LINE | xargs -I {} rm -- '{}' + end + " 200>"$LOCK_FILE" & + + # [核心修复 2] 将刚才丢入后台的 fish 子进程剥离终端控制 + disown + end + + # --- 3. 主程序逻辑 --- + + set -l FILES $CACHE_DIR/*.jpg + set -l NUM_FILES (count $FILES) + + # fish 若无匹配文件,$FILES 可能为空或保留模式字符串,需额外判断 + if test "$NUM_FILES" -eq 1; and not test -f "$FILES[1]" + set NUM_FILES 0 + set FILES + end + + set -l SELECTED_IMG "" + + if test "$NUM_FILES" -gt 0 + # 有库存,随机选一张 + set -l RAND_INDEX (math (random) % $NUM_FILES + 1) + set SELECTED_IMG "$FILES[$RAND_INDEX]" + + # 后台补货 + background_job >/dev/null 2>&1 + else + # 没库存,提示语更改并增加网络连通性容错 + echo "库存不够啦!正在去搬运新的图片,请稍等哦..." + + if check_network + download_one_image + else + echo "网络好像不太通畅,无法下载新图片 QAQ" + end + + set FILES $CACHE_DIR/*.jpg + if test -f "$FILES[1]" + set SELECTED_IMG "$FILES[1]" + background_job >/dev/null 2>&1 + end + end + + # 运行 Fastfetch + if test -n "$SELECTED_IMG"; and test -f "$SELECTED_IMG" + # 显示图片 + fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true $ARGS_FOR_FASTFETCH + + # === 逻辑: 移动到 used 目录 === + mv "$SELECTED_IMG" "$USED_DIR/" + + # === 逻辑: 检查 used 目录并清理旧图 === + # 注意:fish 的 glob 展开如果文件太多可能会卡,但这里有 limit 限制所以还好 + set -l used_files $USED_DIR/*.jpg + set -l used_count (count $used_files) + + # 再次确认 count,因为如果没文件 $used_files 可能为空 + if test "$used_count" -gt 0; and not test -f "$used_files[1]" + set used_count 0 + end + + if test "$used_count" -gt "$MAX_USED_LIMIT" + # 计算需要跳过的行数 (保留最新的 N 张) + set -l skip_lines (math "$MAX_USED_LIMIT" + 1) + + # 列出所有文件按时间倒序(tp),取尾部(tail),删除(rm) + # 2>/dev/null 防止目录为空时报错 + set -l files_to_delete (ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$skip_lines) + + if test -n "$files_to_delete" + rm -- $files_to_delete + end + end + + # 检查是否开启清理 Fastfetch 内部缓存 + if test "$CLEAN_CACHE_MODE" = true + # 仅删除缩略图缓存,保留原图 + rm -rf "$HOME/.cache/fastfetch/images" + end + else + # 失败提示语更改 + echo "图片获取失败了,这次只能先显示默认的 Logo 啦 QAQ" + fastfetch $ARGS_FOR_FASTFETCH + end +end diff --git a/noctalia-dotfiles/.config/fish/functions/fnsfw.fish b/noctalia-dotfiles/.config/fish/functions/fnsfw.fish new file mode 100644 index 0000000..ef2f45b --- /dev/null +++ b/noctalia-dotfiles/.config/fish/functions/fnsfw.fish @@ -0,0 +1,3 @@ +function fnsfw + f --nsfw +end diff --git a/noctalia-dotfiles/.config/fontconfig/fonts.conf b/noctalia-dotfiles/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..bf57887 --- /dev/null +++ b/noctalia-dotfiles/.config/fontconfig/fonts.conf @@ -0,0 +1,42 @@ + + + + + + true + true + hintslight + rgb + lcddefault + + + + sans-serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + serif + + Noto Sans + Noto Sans CJK SC + Adwaita Sans + Liberation Sans + + + + + monospace + + JetBrains Mono + JetBrains Maple Mono + Adwaita Mono + + + + diff --git a/noctalia-dotfiles/.config/fuzzel/fuzzel.ini b/noctalia-dotfiles/.config/fuzzel/fuzzel.ini new file mode 100644 index 0000000..cc7e9bd --- /dev/null +++ b/noctalia-dotfiles/.config/fuzzel/fuzzel.ini @@ -0,0 +1,129 @@ +[main] +include = "~/.config/fuzzel/themes/noctalia" +# output= + font=adwaita sans:size=13 +# dpi-aware=auto +# use-bold=yes +# prompt="> " +# placeholder= +# icon-theme=default +# icons-enabled=yes +# hide-before-typing=no +# fields=filename,name,generic +# password-character=* +# filter-desktop=no +# match-mode=fzf +# sort-result=yes +# match-counter=no +# delayed-filter-ms=300 +# delayed-filter-limit=20000 +# show-actions=no + terminal=kitty -e +# launch-prefix= +# list-executables-in-path=no + +# anchor=center +# x-margin=0 +# y-margin=0 + lines=9 +# minimal-lines=no + width=35 + # tabs=8 + horizontal-pad=40 + vertical-pad=15 + inner-pad=5 + +# scaling-filter=box +# imagesize-ratio=0.5 + +# gamma-correct-blending=no + line-height=25 +# letter-spacing=0 + +# layer=overlay +# keyboard-focus=exclusive +# exit-on-keyboard-focus-loss=yes + +# cache= + +# render-workers= +# match-workers= + +# enable-mouse=yes + +[colors] +# background=fdf6e3ff +# text=657b83ff +# prompt=586e75ff +# placeholder=93a1a1ff +# input=657b83ff +# match=cb4b16ff +# selection=eee8d5ff +# selection-text=586e75ff +# selection-match=cb4b16ff +# counter=93a1a1ff +# border=002b36ff + +[border] + width=2 + radius=10 + +[dmenu] +# mode=text # text|index +# exit-immediately-if-empty=no + +[key-bindings] +prev = Control+k Up Control+w +next = Control+j Down Control+s +custom-1 = Control+Return Control+h +# cancel=Escape Control+g Control+c Control+bracketleft +execute=Return KP_Enter Control+l +# execute-or-next=Tab +# execute-input=Shift+Return Shift+KP_Enter +# cursor-left=Left Control+b +# cursor-left-word=Control+Left Mod1+b +# cursor-right=Right Control+f +# cursor-right-word=Control+Right Mod1+f +# cursor-home=Home Control+a +# cursor-end=End Control+e +# delete-line=Control+Shift+BackSpace + delete-prev=BackSpace +delete-prev-word=Mod1+BackSpace Control+BackSpace +# delete-line-backward=Control+u +# delete-next=Delete KP_Delete Control+d +# delete-next-word=Mod1+d Control+Delete Control+KP_Delete + delete-line-forward= none +# prev=Up Control+p +# prev-with-wrap=ISO_Left_Tab +# prev-page=Page_Up KP_Page_Up +# next=Down Control+n +# next-with-wrap=none +# next-page=Page_Down KP_Page_Down +# expunge=Shift+Delete +# clipboard-paste=Control+v XF86Paste +# primary-paste=Shift+Insert Shift+KP_Insert + +# custom-N: *dmenu mode only*. Like execute, but with a non-zero +# exit-code; custom-1 exits with code 10, custom-2 with 11, custom-3 +# with 12, and so on. +# custom-1=Mod1+1 +# custom-2=Mod1+2 +# custom-3=Mod1+3 +# custom-4=Mod1+4 +# custom-5=Mod1+5 +# custom-6=Mod1+6 +# custom-7=Mod1+7 +# custom-8=Mod1+8 +# custom-9=Mod1+9 +# custom-10=Mod1+0 +# custom-11=Mod1+exclam +# custom-12=Mod1+at +# custom-13=Mod1+numbersign +# custom-14=Mod1+dollar +# custom-15=Mod1+percent +# custom-16=Mod1+dead_circumflex +# custom-17=Mod1+ampersand +# custom-18=Mod1+asterix +# custom-19=Mod1+parentleft + +include=~/.config/fuzzel/themes/noctalia diff --git a/noctalia-dotfiles/.config/fuzzel/themes/noctalia b/noctalia-dotfiles/.config/fuzzel/themes/noctalia new file mode 100644 index 0000000..611f9ee --- /dev/null +++ b/noctalia-dotfiles/.config/fuzzel/themes/noctalia @@ -0,0 +1,15 @@ +# Fuzzel Colors +# Generated by Noctalia's Template Processor + +[colors] +background=131316CC +text=e5e1e6ff +prompt=c5c4ddff +placeholder=e7b9d5ff +input=bec2ffff +match=e7b9d5ff +selection=bec2ff80 +selection-text=e5e1e6ff +selection-match=1f2578ff +counter=c5c4ddff +border=bec2ffff diff --git a/noctalia-dotfiles/.config/gtk-3.0/bookmarks b/noctalia-dotfiles/.config/gtk-3.0/bookmarks new file mode 100644 index 0000000..b80e22f --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-3.0/bookmarks @@ -0,0 +1,7 @@ +file:///home/shorin/Documents Documents +file:///home/shorin/Pictures Pictures +file:///home/shorin/Videos Videos +file:///home/shorin/Music Music +file:///home/shorin/Downloads Downloads +file:///home/shorin/.config .config +file:///home/shorin/.local diff --git a/noctalia-dotfiles/.config/gtk-3.0/gtk.css b/noctalia-dotfiles/.config/gtk-3.0/gtk.css new file mode 100644 index 0000000..deb32ff --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-3.0/gtk.css @@ -0,0 +1 @@ +@import url("noctalia.css"); diff --git a/noctalia-dotfiles/.config/gtk-3.0/noctalia.css b/noctalia-dotfiles/.config/gtk-3.0/noctalia.css new file mode 100644 index 0000000..a40e0c8 --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-3.0/noctalia.css @@ -0,0 +1,53 @@ +/* +* GTK Colors (GTK3) +* Generated by Noctalia's Template Processor +* stylelint-disable at-rule-no-unknown +*/ + +@define-color accent_color #bec2ff; +@define-color accent_bg_color #bec2ff; +@define-color accent_fg_color #1f2578; + +@define-color destructive_bg_color #ffb4ab; +@define-color destructive_fg_color #690005; + +@define-color error_bg_color #ffb4ab; +@define-color error_fg_color #690005; + +@define-color window_bg_color #131316; +@define-color window_fg_color #e5e1e6; + +@define-color view_bg_color #131316; +@define-color view_fg_color #e5e1e6; + +@define-color headerbar_bg_color #131316; +@define-color headerbar_fg_color #e5e1e6; +@define-color headerbar_backdrop_color @window_bg_color; + +@define-color popover_bg_color #1f1f23; +@define-color popover_fg_color #e5e1e6; + +@define-color card_bg_color #1f1f23; +@define-color card_fg_color #e5e1e6; + +@define-color dialog_bg_color #131316; +@define-color dialog_fg_color #e5e1e6; + +@define-color overview_bg_color #1f1f23; +@define-color overview_fg_color #e5e1e6; + +@define-color sidebar_bg_color #1f1f23; +@define-color sidebar_fg_color #e5e1e6; +@define-color sidebar_backdrop_color @window_bg_color; +@define-color sidebar_border_color @window_bg_color; + +@define-color secondary_sidebar_bg_color #131316; +@define-color secondary_sidebar_fg_color #e5e1e6; + +/* Backdrop/unfocused states */ +@define-color theme_unfocused_fg_color @window_fg_color; +@define-color theme_unfocused_text_color @view_fg_color; +@define-color theme_unfocused_bg_color @window_bg_color; +@define-color theme_unfocused_base_color @window_bg_color; +@define-color theme_unfocused_selected_bg_color @accent_bg_color; +@define-color theme_unfocused_selected_fg_color @accent_fg_color; diff --git a/noctalia-dotfiles/.config/gtk-3.0/settings.ini b/noctalia-dotfiles/.config/gtk-3.0/settings.ini new file mode 100644 index 0000000..0367248 --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-3.0/settings.ini @@ -0,0 +1,17 @@ +[Settings] +gtk-theme-name=adw-gtk3-dark +gtk-icon-theme-name=Adwaita +gtk-font-name=Adwaita Sans 11 +gtk-cursor-theme-name=Adwaita +gtk-cursor-theme-size=24 +gtk-toolbar-style=GTK_TOOLBAR_ICONS +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=0 +gtk-menu-images=0 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=0 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintslight +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1 diff --git a/noctalia-dotfiles/.config/gtk-4.0/gtk.css b/noctalia-dotfiles/.config/gtk-4.0/gtk.css new file mode 100644 index 0000000..deb32ff --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-4.0/gtk.css @@ -0,0 +1 @@ +@import url("noctalia.css"); diff --git a/noctalia-dotfiles/.config/gtk-4.0/noctalia.css b/noctalia-dotfiles/.config/gtk-4.0/noctalia.css new file mode 100644 index 0000000..cc892c5 --- /dev/null +++ b/noctalia-dotfiles/.config/gtk-4.0/noctalia.css @@ -0,0 +1,103 @@ +/* +* GTK Colors (GTK4) +* Generated by Noctalia's Template Processor +* stylelint-disable at-rule-no-unknown +*/ + +@define-color accent_color #bec2ff; +@define-color accent_bg_color #bec2ff; +@define-color accent_fg_color #1f2578; + +@define-color destructive_bg_color #ffb4ab; +@define-color destructive_fg_color #690005; + +@define-color error_bg_color #ffb4ab; +@define-color error_fg_color #690005; + +@define-color window_bg_color #131316; +@define-color window_fg_color #e5e1e6; + +@define-color view_bg_color #131316; +@define-color view_fg_color #e5e1e6; + +@define-color headerbar_bg_color #131316; +@define-color headerbar_fg_color #e5e1e6; +@define-color headerbar_backdrop_color @window_bg_color; + +@define-color popover_bg_color #1f1f23; +@define-color popover_fg_color #e5e1e6; + +@define-color card_bg_color #1f1f23; +@define-color card_fg_color #e5e1e6; + +@define-color dialog_bg_color #131316; +@define-color dialog_fg_color #e5e1e6; + +@define-color overview_bg_color #1f1f23; +@define-color overview_fg_color #e5e1e6; + +@define-color sidebar_bg_color #1f1f23; +@define-color sidebar_fg_color #e5e1e6; +@define-color sidebar_backdrop_color @window_bg_color; +@define-color sidebar_border_color @window_bg_color; + +@define-color secondary_sidebar_bg_color #131316; +@define-color secondary_sidebar_fg_color #e5e1e6; + +/* Backdrop/unfocused states */ +@define-color theme_unfocused_fg_color @window_fg_color; +@define-color theme_unfocused_text_color @view_fg_color; +@define-color theme_unfocused_bg_color @window_bg_color; +@define-color theme_unfocused_base_color @window_bg_color; +@define-color theme_unfocused_selected_bg_color @accent_bg_color; +@define-color theme_unfocused_selected_fg_color @accent_fg_color; + +:root { + --accent-color: #bec2ff; + --accent-bg-color: #bec2ff; + --accent-fg-color: #1f2578; + + --destructive-bg-color: #ffb4ab; + --destructive-fg-color: #690005; + + --error-bg-color: #ffb4ab; + --error-fg-color: #690005; + --error-color: #ffb4ab; + + --window-bg-color: #131316; + --window-fg-color: #e5e1e6; + + --view-bg-color: #131316; + --view-fg-color: #e5e1e6; + + --headerbar-bg-color: #131316; + --headerbar-fg-color: #e5e1e6; + --headerbar-backdrop-color: @window_bg_color; + + --popover-bg-color: #1f1f23; + --popover-fg-color: #e5e1e6; + + --card-bg-color: #1f1f23; + --card-fg-color: #e5e1e6; + + --dialog-bg-color: #131316; + --dialog-fg-color: #e5e1e6; + + --overview-bg-color: #1f1f23; + --overview-fg-color: #e5e1e6; + + --sidebar-bg-color: #1f1f23; + --sidebar-fg-color: #e5e1e6; + --sidebar-backdrop-color: @window_bg_color; + --sidebar-border-color: @window_bg_color; + + --warning-bg-color: #5e3c53; + --warning-fg-color: #ffd8ee; + --warning-color: #e7b9d5; + + --success-color: #c5c4dd; + --success-bg-color: #444559; + --success-fg-color: #e1e0f9; + + --shade-color: rgba(0, 0, 0, 0.36); +} diff --git a/noctalia-dotfiles/.config/kitty/current-theme.conf b/noctalia-dotfiles/.config/kitty/current-theme.conf new file mode 100644 index 0000000..b4e211b --- /dev/null +++ b/noctalia-dotfiles/.config/kitty/current-theme.conf @@ -0,0 +1,32 @@ +color0 #131316 +color1 #ffb4ab +color2 #bec2ff +color3 #c5c4dd +color4 #e7b9d5 +color5 #bec2ff +color6 #c5c4dd +color7 #e5e1e6 +color8 #91909a +color9 #ffb4ab +color10 #bec2ff +color11 #c5c4dd +color12 #e7b9d5 +color13 #bec2ff +color14 #c5c4dd +color15 #e5e1e6 + +cursor #e5e1e6 +cursor_text_color #131316 +background #131316 +foreground #e5e1e6 +selection_foreground #c7c5d0 +selection_background #46464f +active_border_color #bec2ff +inactive_border_color #46464f +url_color #bec2ff + +active_tab_foreground #1f2578 +active_tab_background #bec2ff +inactive_tab_foreground #c7c5d0 +inactive_tab_background #46464f +cursor_trail_color #c7c5d0 diff --git a/noctalia-dotfiles/.config/kitty/kitty.conf b/noctalia-dotfiles/.config/kitty/kitty.conf new file mode 100644 index 0000000..5489b96 --- /dev/null +++ b/noctalia-dotfiles/.config/kitty/kitty.conf @@ -0,0 +1,20 @@ +include dank-tabs.conf +include dank-theme.conf +window_padding_width 5 +hide_window_decorations yes +background_opacity 0.8 +font_family JetBrains Maple Mono +font_size 13.5 +remember_window_size no +#confirm_os_window_close 0 +shell fish +cursor_trail 1 +cursor_shape block +shell_integration no-cursor + + + +# BEGIN_KITTY_THEME +# Noctalia +include current-theme.conf +# END_KITTY_THEME diff --git a/noctalia-dotfiles/.config/kitty/themes/kitty.conf b/noctalia-dotfiles/.config/kitty/themes/kitty.conf new file mode 100644 index 0000000..3bee652 --- /dev/null +++ b/noctalia-dotfiles/.config/kitty/themes/kitty.conf @@ -0,0 +1,13 @@ +window_padding_width 5 +hide_window_decorations yes +background_opacity 0.8 +font_family JetBrains Maple Mono +font_size 13.5 +remember_window_size no +confirm_os_window_close 0 +shell fish +cursor_trail 1 +cursor_shape block +shell_integration no-cursor + +include themes/noctalia.conf diff --git a/noctalia-dotfiles/.config/kitty/themes/noctalia.conf b/noctalia-dotfiles/.config/kitty/themes/noctalia.conf new file mode 100644 index 0000000..b4e211b --- /dev/null +++ b/noctalia-dotfiles/.config/kitty/themes/noctalia.conf @@ -0,0 +1,32 @@ +color0 #131316 +color1 #ffb4ab +color2 #bec2ff +color3 #c5c4dd +color4 #e7b9d5 +color5 #bec2ff +color6 #c5c4dd +color7 #e5e1e6 +color8 #91909a +color9 #ffb4ab +color10 #bec2ff +color11 #c5c4dd +color12 #e7b9d5 +color13 #bec2ff +color14 #c5c4dd +color15 #e5e1e6 + +cursor #e5e1e6 +cursor_text_color #131316 +background #131316 +foreground #e5e1e6 +selection_foreground #c7c5d0 +selection_background #46464f +active_border_color #bec2ff +inactive_border_color #46464f +url_color #bec2ff + +active_tab_foreground #1f2578 +active_tab_background #bec2ff +inactive_tab_foreground #c7c5d0 +inactive_tab_background #46464f +cursor_trail_color #c7c5d0 diff --git a/noctalia-dotfiles/.config/mimeapps.list b/noctalia-dotfiles/.config/mimeapps.list new file mode 100644 index 0000000..4641b70 --- /dev/null +++ b/noctalia-dotfiles/.config/mimeapps.list @@ -0,0 +1,24 @@ +[Default Applications] +image/png=imv.desktop +video/webm=mpv.desktop +application/x-shellscript=vim.desktop +inode/directory=org.gnome.Nautilus.desktop +image/jpeg=imv.desktop +image/gif=imv.desktop +image/webp=imv.desktop +image/bmp=imv.desktop +image/tiff=imv.desktop +video/mp4=mpv.desktop +video/x-matroska=mpv.desktop +video/avi=mpv.desktop +video/quicktime=mpv.desktop +text/plain=vim.desktop +application/vnd.microsoft.portable-executable=wine.desktop + +[Added Associations] +image/png=imv.desktop; +video/webm=mpv.desktop; +application/x-shellscript=vim.desktop; +video/mp4=mpv.desktop; +text/plain=vim.desktop; +application/vnd.microsoft.portable-executable=wine.desktop; diff --git a/noctalia-dotfiles/.config/mpv/config b/noctalia-dotfiles/.config/mpv/config new file mode 100644 index 0000000..c84be6a --- /dev/null +++ b/noctalia-dotfiles/.config/mpv/config @@ -0,0 +1 @@ +hwdec=auto-safe diff --git a/noctalia-dotfiles/.config/niri/animations.kdl b/noctalia-dotfiles/.config/niri/animations.kdl new file mode 100644 index 0000000..94996db --- /dev/null +++ b/noctalia-dotfiles/.config/niri/animations.kdl @@ -0,0 +1,74 @@ +// Animation settings. +// The wiki explains how to configure individual animations: +// https://yalter.github.io/niri/Configuration:-Animations +// https://yalter.github.io/niri/Configuration:-Animations +animations { + // 禁用全部动画 + //off + + // 总体动画速度,浮点数(带小数点),默认为1,小于1加快,大于1减慢 + slowdown 1.0 + + + // 切换工作区的动画 + workspace-switch { + // 具体动画设置代码块里的off可以单独禁用此动画 + //off + // spring弹簧动画类型 + // damping-ratio 设置阻尼,默认1.0(仅在触摸板快速滑动时产生回弹),小于1.0会产生回弹,大于1.0会导致bug。 + // stiffness 设置刚度,数值越大动画会越硬越生涩,数值调低更容易产生回弹 + // epsilon 当动画运动速度和距离小于这个值的时候会判定动画停止 + spring damping-ratio=0.82 stiffness=523 epsilon=0.0001 + } + + // 左右切换聚焦的动画 + horizontal-view-movement { + spring damping-ratio=0.86 stiffness=450 epsilon=0.0001 + + } + + // 打开窗口的动画 + window-open { + // 动画时长 + duration-ms 150 + // 动画曲线 + curve "ease-out-expo" + + // niri可用的动画曲线: + // ease-out-quad 比较平缓的加速-->减速曲线,不明显,算是更生动的线性动画 + // ease-out-cubic 较快加速后迅速减速 + // ease-out-expo 超快加速后立马减速 + // linear 纯线性 + // cubic-bezier 自定义动画曲线,通过 curve "cubic-bezier" 0.05 0.7 0.1 1 的方式传入参数使用 + // 设计曲线可以使用 https://easings.co/ + // 预览预设曲线效果可以看 https://easings.net/ + } + + // 关闭窗口 + window-close { + duration-ms 150 + curve "ease-out-quad" + } + + // 移动窗口的动画。包括合并列、上下移动窗口、合并/踢出列等。 + window-movement { + spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 + } + + // 按照预设调整窗口大小时的动画 + window-resize { + spring damping-ratio=1.0 stiffness=750 epsilon=0.0001 + } + + // 开启截图UI的动画 + screenshot-ui-open { + duration-ms 300 + curve "ease-out-quad" + } + + // 开关overview的动画 + overview-open-close { + spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 + } + +} diff --git a/noctalia-dotfiles/.config/niri/binds.kdl b/noctalia-dotfiles/.config/niri/binds.kdl new file mode 100644 index 0000000..44662d1 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/binds.kdl @@ -0,0 +1,266 @@ +// 整合版 binds.kdl:Shorin 核心配置 + DMS 特有功能与媒体控制 + +binds { + // 显示快捷键教程 + Mod+Shift+Slash hotkey-overlay-title="快捷键教程 Keybind tutorial" { spawn "~/.config/niri/scripts/niri-binds"; } + + // alt+tab切换窗口 + Alt+Tab hotkey-overlay-title="跳转窗口 swich windows" {spawn "qs" "-c" "noctalia-shell" "ipc" "call" "launcher" "windows";} + // 特殊功能 + Mod+F1 hotkey-overlay-title="开关输入法 Toggle fcitx" {spawn-sh "pkill fcitx5 || fcitx5 ";} + Mod+F2 hotkey-overlay-title="设置 Settings" { spawn-sh "qs -c noctalia-shell ipc call settings toggle";} + Mod+F3 hotkey-overlay-title="录屏 Screen record" { spawn "shorin" "screenrec";} + Mod+F5 hotkey-overlay-title="快速存档 Quick save" {spawn "quicksave";} + Mod+F8 hotkey-overlay-title="快速读档 Quick load" {spawn "quickload";} + + // 临时开一个浮动终端 + Mod+Slash hotkey-overlay-title="临时终端 Quick Terminal" {spawn "kitty" "--single-instance" "--class" "quickterminal";} + //打开浏览器 + Mod+B hotkey-overlay-title="浏览器 Browser" { spawn "firefox"; } + Mod+T hotkey-overlay-title="终端 Terminal" { spawn "kitty" "--single-instance"; } + // 文档管理器。如果有thunar的话会优先打开thunar,没有的话会打开nautilus + Mod+E hotkey-overlay-title="文档管理器 Filemanager" { spawn-sh "thunar || env GSK_RENDERER=gl GTK_IM_MODULE=fcitx nautilus"; } + // 另一个打开nautilus的快捷键,主要是为了在同时安装thunar和nautilus的情况下打开naultilus + Mod+Alt+E hotkey-overlay-title=null {spawn "env" "GSK_RENDERER=gl" "GTK_IM_MODULE=fcitx" "nautilus" "--new-window";} + + Mod+Z hotkey-overlay-title="程序菜单 Applauncher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle || fuzzel"; } + // 壁纸选择 + Mod+Alt+W hotkey-overlay-title="壁纸切换 Wallpaper" { spawn-sh "qs -c noctalia-shell ipc call wallpaper toggle";} + // 随机切换壁纸 + Mod+F10 hotkey-overlay-title="随机切换壁纸 Random wallpaper" { spawn-sh "qs -c noctalia-shell ipc call wallpaper random all";} + // 随机下载壁纸 + Mod+Shift+F10 hotkey-overlay-title="随机下载壁纸 Random Download wallpaper" { spawn "~/.local/bin/random-anime-wallpaper-noctalia";} + + Mod+O hotkey-overlay-title="切换总览界面 toggle overview" repeat=false { toggle-overview; } + Mod+G repeat=false { toggle-overview; } + // 关闭聚焦窗口 + Mod+Q hotkey-overlay-title="关闭聚焦窗口 Close focus window" repeat=false { close-window; } + Alt+F4 hotkey-overlay-title=null repeat=false { close-window; } + + // niri-sidebar扩展相关 + // 警告:这是实验性功能 + // 切换 移动聚焦窗口至侧边栏 (建议配合切换浮动聚焦的快捷键使用,我设置的是super+n) + Mod+Alt+S hotkey-overlay-title="收起窗口 Move to Sidebar" { spawn "niri-sidebar" "toggle-window"; } + Mod+M hotkey-overlay-title="收起窗口 Move to Sidebar" { spawn "niri-sidebar" "toggle-window"; } + // 切换 收起/展开侧边栏 + Mod+Alt+Z hotkey-overlay-title="展开/收起侧边栏 Toggle Sidebar" { spawn "niri-sidebar" "toggle-visibility";} + // 反向排序侧边栏 + Mod+Alt+X hotkey-overlay-title=null { spawn "niri-sidebar" "flip";} + // 重新排列侧边栏中的窗口(侧边栏中的窗口本质是一个浮动窗口,你有时候可能会把它移动到别的地方 + // 例如 ctrl+c居中。此时按下此键可以重新排列) + Mod+Alt+R hotkey-overlay-title="重置侧边栏 Reorder Sidebar" { spawn "niri-sidebar" "reorder"; } + + + // mod+鼠标中键 关闭窗口 + Mod+MouseMiddle { close-window; } + + // 切换聚焦 + // super+方向键 + Mod+Left hotkey-overlay-title=null { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + // super+vim key + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + // 移动colume(列) + // super+ctrl+方向键 + Mod+Ctrl+Left hotkey-overlay-title=null { move-column-left; } + Mod+Ctrl+Right hotkey-overlay-title=null { move-column-right; } + // super+ctrl+vimkey + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + // super+ctrl+a/d 向左/右移动列 + Mod+Ctrl+A { move-column-left; } + Mod+Ctrl+D { move-column-right; } + // mod+S/W 上下切换窗口 + Mod+S { move-window-down; } + Mod+W { move-window-up; } + + // 切换到第一个colume + Mod+Home { focus-column-first; } + // 切换到最后一个colume + Mod+End { focus-column-last; } + // 移动colume到第一个 + Mod+Ctrl+Home { move-column-to-first; } + // 移动colume到最后一个 + Mod+Ctrl+End { move-column-to-last; } + + // 切换显示器聚焦 + // mod+shift+方向键 + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + // mod+shift+vimkey + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + // 跨显示器移动colume + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + Mod+Shift+Ctrl+A { move-column-to-monitor-left; } + Mod+Shift+Ctrl+S { move-column-to-monitor-down; } + Mod+Shift+Ctrl+W { move-column-to-monitor-up; } + Mod+Shift+Ctrl+D { move-column-to-monitor-right; } + + // 移动整个工作区 + // mod+shift跨显示器,alt代表移动整个工作区,再加上三组方向键 + Mod+Shift+Alt+W { move-workspace-to-monitor-up; } + Mod+Shift+Alt+S { move-workspace-to-monitor-down; } + Mod+Shift+Alt+D { move-workspace-to-monitor-right; } + Mod+Shift+Alt+A { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+K { move-workspace-to-monitor-up; } + Mod+Shift+Alt+J { move-workspace-to-monitor-down; } + Mod+Shift+Alt+L { move-workspace-to-monitor-right; } + Mod+Shift+Alt+H { move-workspace-to-monitor-left; } + + Mod+Shift+Alt+Up { move-workspace-to-monitor-up; } + Mod+Shift+Alt+Down { move-workspace-to-monitor-down; } + Mod+Shift+Alt+Right { move-workspace-to-monitor-right; } + Mod+Shift+Alt+Left { move-workspace-to-monitor-left; } + + // mod+shitf+滚轮上下切换工作区 + Mod+Shift+WheelScrollDown hotkey-overlay-title="切换工作区 Change workspaces" cooldown-ms=150 { focus-workspace-down; } + Mod+Shift+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + //再加上ctrl移动窗口 + Mod+Ctrl+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + // mod+滚轮上下 左右切换聚焦 + Mod+WheelScrollDown hotkey-overlay-title="滚轮切换聚焦 Change focus with wheel" { focus-column-right; } + Mod+WheelScrollUp { focus-column-left; } + // 再加上ctrl移动colume + Mod+Ctrl+WheelScrollDown { move-column-right; } + Mod+Ctrl+WheelScrollUp { move-column-left; } + + // mod+左右方括号 移动窗口(不是移动colume,是允许移动到另一个colume的窗口移动) + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + // mod+A/D 同效果 + Mod+A hotkey-overlay-title="向左移动窗口 Move window to left between columes" { consume-or-expel-window-left; } + Mod+D hotkey-overlay-title="向右移动窗口 Move window to right between columes" { consume-or-expel-window-right; } + + // mod+逗号/句号 把窗口合并或者踢出当前的colume + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + // mod+shift+A/D 同效果 + Mod+Shift+A { consume-window-into-column; } + Mod+Shift+D { expel-window-from-column; } + + // 开启colume的标签页模式 + Mod+Shift+X { toggle-column-tabbed-display; } + //Mod+X { toggle-column-tabbed-display; } + // mod+鼠标侧键 上下切换聚焦 + Mod+MouseForward { focus-window-up; } + Mod+MouseBack { focus-window-down; } + + // 按照预设切换窗口宽度 + Mod+R hotkey-overlay-title="按预设切换宽度 Switch width " { switch-preset-column-width; } + // 按照预设切换窗口高度 + Mod+Shift+R { switch-preset-window-height; } + // 重置窗口高度 + Mod+Ctrl+R { reset-window-height; } + + Mod+F hotkey-overlay-title="最大化 maximize" { maximize-column; } + Mod+Alt+F hotkey-overlay-title="全屏 fullscreen" { fullscreen-window; } + + // 增加窗口宽度占满空闲空间 + Mod+Ctrl+F { expand-column-to-available-width; } + // 居中当前聚焦的colume + Mod+C { center-column; } + Mod+Ctrl+C { center-visible-columns; } + + // mod+加减号调整窗口宽度 + Mod+Minus { set-column-width "-5%"; } + Mod+Equal { set-column-width "+5%"; } + + // mod+shift+加减号调整窗口高度 + Mod+Shift+Minus { set-window-height "-5%"; } + Mod+Shift+Equal { set-window-height "+5%"; } + + // 切换浮动模式 + Mod+V hotkey-overlay-title="切换浮动 Toggle floating" { toggle-window-floating; } + // 在浮动模式和非浮动模式之间切换聚焦 + Mod+Shift+V hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + Mod+N hotkey-overlay-title="切换浮动聚焦 Change focus to floating" { switch-focus-between-floating-and-tiling; } + Alt+grave hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + Mod+Alt+N hotkey-overlay-title=null { switch-focus-between-floating-and-tiling; } + + // 截图相关 + Mod+Alt+A hotkey-overlay-title="选取区域截图 Select screenshot" {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Mod+Alt+Ctrl+A hotkey-overlay-title="截取聚焦窗口 Focus-window screenshot" { spawn-sh "niri msg action screenshot-window && pkill -f -USR1 screenshot-sound.sh"; } + Mod+Alt+Ctrl+Shift+A hotkey-overlay-title="截取显示器 Monitor screenshot" { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Print hotkey-overlay-title=null {spawn-sh "niri msg action screenshot --show-pointer false && pkill -f -USR1 screenshot-sound.sh";} + Ctrl+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-window --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Shift+Print hotkey-overlay-title=null { spawn-sh "niri msg action screenshot-screen --show-pointer false && pkill -f -USR1 screenshot-sound.sh"; } + Mod+Shift+S hotkey-overlay-title="截图后按下此键进行编辑 Edit the image after screenshot" { spawn-sh "wl-paste | satty -f -";} + + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + Mod+Shift+E hotkey-overlay-title="退出niri Quit niri" { quit; } + + // 电源菜单 + Mod+P hotkey-overlay-title="电源菜单 powermenu" {spawn "qs" "-c" "noctalia-shell" "ipc" "call" "sessionMenu" "toggle";} + // 剪贴板 + Mod+Alt+V hotkey-overlay-title="剪贴板 Clipboard" {spawn-sh "qs -c noctalia-shell ipc call launcher clipboard";} + // 锁屏 + Mod+Alt+L hotkey-overlay-title="锁屏 Lock Screen" {spawn "qs" "-c" "noctalia-shell" "ipc" "call" "lockScreen" "lock"; } + // 锁屏、关闭显示器、休眠 + Mod+Alt+P hotkey-overlay-title="挂起 Suspend" { spawn-sh "niri msg action power-off-monitors && qs -c noctalia-shell ipc call lockScreen lock && systemctl suspend";} + + // === 媒体控制 === + XF86AudioRaiseVolume { spawn "qs" "-c" "noctalia-shell" "ipc" "call" "volume" "increase"; } + XF86AudioLowerVolume { spawn "qs" "-c" "noctalia-shell" "ipc" "call" "volume" "decrease"; } + XF86AudioMute { spawn "qs" "-c" "noctalia-shell" "ipc" "call" "volume" "muteOutput"; } + XF86MonBrightnessUp { spawn "qs" "-c" "noctalia-shell" "ipc" "call" "brightness" "increase"; } + XF86MonBrightnessDown { spawn "qs" "-c" "noctalia-shell" "ipc" "call" "brightness" "decrease"; } + + // === 工作区导航补充 (无冲突项) === + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + // === 数字工作区 (1-9) === + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + +} diff --git a/noctalia-dotfiles/.config/niri/config.kdl b/noctalia-dotfiles/.config/niri/config.kdl new file mode 100644 index 0000000..6a2b77a --- /dev/null +++ b/noctalia-dotfiles/.config/niri/config.kdl @@ -0,0 +1,112 @@ +// ██████ ██ ██ ██████ ███████ ██ ███ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ███████ ███████ ██ ██ ██████ ██ ██ ██ ██ +// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +// ██████ ██ ██ ██████ ██ ██ ██ ██ ████ + +// 截图保存位置 +screenshot-path "~/Pictures/Screenshots/Niri-screenshots/%Y-%m-%d_%H-%M-%S.png" +// 环境变量 + +environment { + //LC_CTYPE "zh_CN.UTF-8" 会导致输入法出现漏字 + //LC_MESSAGES "zh_CN.UTF-8" 让系统全局使用英文,仅主要界面为英文时使用这个环境变量 + // 设置界面语言 + LANGUAGE "zh_CN.UTF-8" + LANG "zh_CN.UTF-8" + LC_CTYPE "en_US.UTF-8" //这一项可以解决漏字问题,但是也许会导致steam之类的x11应用无法使用中文输入法 + // 输入法环境变量 + XMODIFIERS "@im=fcitx" + // qt主题 + QT_QPA_PLATFORMTHEME "gtk3" + QT_QPA_PLATFORMTHEME_QT6 "gtk3" + // 解决quickshell图标主题缺失问题 + QS_ICON_THEME "Adwaita" + // GTK软件使用的渲染器,可以解决n卡双显卡导致的GTK应用启动缓慢问题,AMD或Intel单显卡不需要这行设置可以注释掉 + //GSK_RENDERER "gl" + // 默认文本编辑器 + EDITOR "vim" + +} + +input { + keyboard { + xkb { + } + } + + touchpad { + // off + tap + // dwt + // dwtp + // drag false + // drag-lock + // nautural-scroll可以翻转触摸板滚动的方向 + natural-scroll + //accel-speed -0.5 + // accel-profile "flat" + // scroll-method "two-finger" + // disabled-on-external-mouse + } + + mouse { + + // off + // natural-scroll + // 鼠标速度 + accel-speed -0.15 + // 禁用鼠标加速 + accel-profile "flat" + // scroll-method "no-scroll" + //speed of scroll,like: + //scroll-factor horizontal=2.0 vertical=-5.0 + } + + trackpoint { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "on-button-down" + // scroll-button 273 + // scroll-button-lock + // middle-emulation + } +} +// 自动启动 +spawn-sh-at-startup "qs -c noctalia-shell" +// 询问管理员权限功能(身份验证) +spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri & /usr/lib/xdg-desktop-portal-gnome" +// GNOME tracker修复 +spawn-sh-at-startup "systemctl --user set-environment XDG_SESSION_CLASS=user" +// 输入法 +spawn-at-startup "fcitx5" +// 截图音效的守护进程 +spawn-at-startup "~/.config/niri/scripts/screenshot-sound.sh" +// 允许root通过用户的xwayland打开窗口 +spawn-at-startup "xhost" "+si:localuser:root" +// 开启时自动随机更换一次壁纸 +spawn-sh-at-startup "sleep 3 && qs -c noctalia-shell ipc call wallpaper random all" + +// 取消启动niri时自动开启快捷键教程 +hotkey-overlay { + // Uncomment this line to disable the "Important Hotkeys" pop-up at startup. + skip-at-startup +} + +// 隐藏窗口标题栏 +prefer-no-csd + + +include "layout.kdl" +include "animations.kdl" +include "binds.kdl" +include "supertab.kdl" +include "windowrules.kdl" +include "cursor.kdl" +include "outputs.kdl" + +include "./noctalia.kdl" + diff --git a/noctalia-dotfiles/.config/niri/cursor.kdl b/noctalia-dotfiles/.config/niri/cursor.kdl new file mode 100644 index 0000000..6d73a15 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/cursor.kdl @@ -0,0 +1,10 @@ + +// 光标配置 +cursor { + // 主题,存放路径在~/.local/share/icons + xcursor-theme "breeze_cursors" + // 大小 + xcursor-size 30 + // 闲置多少毫秒自动隐藏光标 + hide-after-inactive-ms 15000 +} diff --git a/noctalia-dotfiles/.config/niri/layout.kdl b/noctalia-dotfiles/.config/niri/layout.kdl new file mode 100644 index 0000000..4b0ac72 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/layout.kdl @@ -0,0 +1,160 @@ + +layout { + + //设置工作区背景颜色 + //background-color "transparent" + // Set gaps around windows in logical pixels. + // 窗口和窗口之间的间距 + gaps 10 + //empty-workspace-above-first + // When to center a column when changing focus, options are: + // - "never", default behavior, focusing an off-screen column will keep at the left + // or right edge of the screen. + // - "always", the focused column will always be centered. + // - "on-overflow", focusing a column will center it if it doesn't fit + // together with the previously focused column. + center-focused-column "never" + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + // 预设窗口宽度 + preset-column-widths { + // Proportion sets the width as a fraction of the output width, taking gaps into account. + // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. + // The default preset widths are 1/3, 1/2 and 2/3 of the output. + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + // Fixed sets the width in logical pixels exactly. + // fixed 1920 + } + + // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. + // preset-window-heights { } + + // You can change the default width of the new windows. + // 默认的窗口宽度 + default-column-width { proportion 0.5; } + // If you leave the brackets empty, the windows themselves will decide their initial width. + // default-column-width {} + + // By default focus ring and border are rendered as a solid background rectangle + // behind windows. That is, they will show up through semitransparent windows. + // This is because windows using client-side decorations can have an arbitrary shape. + // + // If you don't like that, you should uncomment `prefer-no-csd` below. + // Niri will draw focus ring and border *around* windows that agree to omit their + // client-side decorations. + // + // Alternatively, you can override it with a window rule called + // `draw-border-with-background`. + + // You can change how the focus ring looks. + focus-ring { + // Uncomment this line to disable the focus ring. + // off + // How many logical pixels the ring extends out from the windows. + width 2 + + // Colors can be set in a variety of ways: + // - CSS named colors: "red" + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + // Color of the ring on the active monitor. + //active-color "@primary" + //active-color "#00000000" + // Color of the ring on inactive monitors. + // + // The focus ring only draws around the active window, so the only place + // where you can see its inactive-color is on other monitors. + //inactive-color "#505050" + + // You can also use gradients. They take precedence over solid colors. + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). + // The angle is the same as in linear-gradient, and is optional, + // defaulting to 180 (top-to-bottom gradient). + // You can use any CSS linear-gradient tool on the web to set these up. + // Changing the color space is also supported, check the wiki for more info. + // + // active-gradient from="#80c8ff" to="#c7ff7f" angle=45 + + // You can also color the gradient relative to the entire view + // of the workspace, rather than relative to just the window itself. + // To do that, set relative-to="workspace-view". + // + //inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can also add a border. It's similar to the focus ring, but always visible. + // 窗口边框 + border { + // The settings are the same as for the focus ring. + // If you enable the border, you probably want to disable the focus ring. + off + + width 4 + active-color "#ffc87f" + inactive-color "#505050" + + // Color of the border around windows that request your attention. + urgent-color "#9b0000" + + // Gradients can use a few different interpolation color spaces. + // For example, this is a pastel rainbow gradient via in="oklch longer hue". + // + // active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue" + + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can enable drop shadows for windows. + // 阴影 + shadow { + // Uncomment the next line to enable shadows. + on + + // By default, the shadow draws only around its window, and not behind it. + // Uncomment this setting to make the shadow draw behind its window. + // + // Note that niri has no way of knowing about the CSD window corner + // radius. It has to assume that windows have square corners, leading to + // shadow artifacts inside the CSD rounded corners. This setting fixes + // those artifacts. + // + // However, instead you may want to set prefer-no-csd and/or + // geometry-corner-radius. Then, niri will know the corner radius and + // draw the shadow correctly, without having to draw it behind the + // window. These will also remove client-side shadows if the window + // draws any. + // + //draw-behind-window true + + // You can change how shadows look. The values below are in logical + // pixels and match the CSS box-shadow properties. + + // Softness controls the shadow blur radius. + softness 20 + + // Spread expands the shadow. + spread 2 + + // Offset moves the shadow relative to the window. + offset x=-4 y=-4 + + // You can also change the shadow color and opacity. + color "rgba(0, 0, 0, 0.7)" + } + + // Struts shrink the area occupied by windows, similarly to layer-shell panels. + // You can think of them as a kind of outer gaps. They are set in logical pixels. + // Left and right struts will cause the next window to the side to always be visible. + // Top and bottom struts will simply add outer gaps in addition to the area occupied by + // layer-shell panels and regular gaps. + + //窗口距离屏幕边缘的距离 + struts { + //left 64 + // right 64 + // top 64 + // bottom 64 + } +} diff --git a/noctalia-dotfiles/.config/niri/noctalia.kdl b/noctalia-dotfiles/.config/niri/noctalia.kdl new file mode 100644 index 0000000..e844fad --- /dev/null +++ b/noctalia-dotfiles/.config/niri/noctalia.kdl @@ -0,0 +1,35 @@ +layout { + + focus-ring { + active-color "#bec2ff" + inactive-color "#131316" + urgent-color "#ffb4ab" + } + + border { + active-color "#bec2ff" + inactive-color "#131316" + urgent-color "#ffb4ab" + } + + shadow { + color "#00000070" + } + + tab-indicator { + active-color "#bec2ff" + inactive-color "#373e90" + urgent-color "#ffb4ab" + } + + insert-hint { + color "#bec2ff80" + } +} + +recent-windows { + highlight { + active-color "#bec2ff" + urgent-color "#ffb4ab" + } +} diff --git a/noctalia-dotfiles/.config/niri/outputs.kdl b/noctalia-dotfiles/.config/niri/outputs.kdl new file mode 100644 index 0000000..8b9a565 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/outputs.kdl @@ -0,0 +1,10 @@ +// 这是显示器设置 +// 运行niri msg outputs可以获取显示器信息 +// 以下是一个配置示例 +/-output "eDP-1"{ + // off + mode "2560x1440@165" + scale 1.3 + position x=0 y=0 + focus-at-startup +} diff --git a/noctalia-dotfiles/.config/niri/scripts/niri-binds b/noctalia-dotfiles/.config/niri/scripts/niri-binds new file mode 100644 index 0000000..8ea7601 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/scripts/niri-binds @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +NIRI_DIR="$HOME/.config/niri" + +# === 界面尺寸设置 (在这里微调,下方的所有终端会自动应用) === +MENU_WIDTH=90 +MENU_HEIGHT=20 + +# 检查目录 +if [[ ! -d "$NIRI_DIR" ]]; then + echo "Error: 找不到配置目录 $NIRI_DIR" + exit 1 +fi + +# 提取并使用 column 对齐 +MENU_ITEMS=$(grep -Rh 'hotkey-overlay-title=' "$NIRI_DIR" --include="*.kdl" | \ + grep -v '^[ \t]*//' | \ + sed -n -E 's/^[ \t]*(.*)[ \t]+hotkey-overlay-title="([^"]+)".*/\1|\2/p' | \ + sed -E 's/[ \t]*\|/\|/' | \ + column -t -s '|') + +if [[ -z "$MENU_ITEMS" ]]; then + echo "没有找到有效的快捷键配置。" + exit 1 +fi + +# Fzf 核心命令 +FZF_CMD="echo \"$MENU_ITEMS\" | fzf --reverse --prompt='󰌌 快捷键: ' --info=hidden --border=none > /dev/null" + +# 动态检测终端并使用对应的参数启动 +if command -v kitty >/dev/null 2>&1; then + kitty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o remember_window_size=no -o initial_window_width=${MENU_WIDTH}c -o initial_window_height=${MENU_HEIGHT}c \ + bash -c "$FZF_CMD" + +elif command -v foot >/dev/null 2>&1; then + foot --app-id "niri-hotkey-menu" --title "快捷键菜单" \ + --window-size-chars=${MENU_WIDTH}x${MENU_HEIGHT} \ + bash -c "$FZF_CMD" + +elif command -v alacritty >/dev/null 2>&1; then + alacritty --class "niri-hotkey-menu" --title "快捷键菜单" \ + -o window.dimensions.columns=${MENU_WIDTH} -o window.dimensions.lines=${MENU_HEIGHT} \ + -e bash -c "$FZF_CMD" + +elif command -v wezterm >/dev/null 2>&1; then + wezterm start --class "niri-hotkey-menu" -- bash -c "$FZF_CMD" + +elif [[ -n "$TERMINAL" ]]; then + $TERMINAL -e bash -c "$FZF_CMD" + +else + echo "Error: 未检测到支持的终端模拟器。" + if command -v fuzzel >/dev/null 2>&1; then + # Fuzzel 降级方案也会自动读取顶层变量 + echo "$MENU_ITEMS" | fuzzel --dmenu -i -p "󰌌 快捷键: " -w ${MENU_WIDTH} > /dev/null + fi +fi diff --git a/noctalia-dotfiles/.config/niri/scripts/screenshot-sound.sh b/noctalia-dotfiles/.config/niri/scripts/screenshot-sound.sh new file mode 100644 index 0000000..c00f1f0 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/scripts/screenshot-sound.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# =================配置区域================= +SOUND="/usr/share/sounds/freedesktop/stereo/camera-shutter.oga" +# 这是一个“扳机”文件,存于内存中 (/dev/shm),读写极快 +TRIGGER_FILE="/dev/shm/niri_screenshot_armed" +# 有效期:按下截图键后,多少秒内产生了图片才响?(防止你取消截图后,下次复制图片误响) +TIMEOUT_SEC=15 +# ========================================= + +# 环境检查 +if ! command -v pw-play >/dev/null; then + notify-send "错误: 未找到 pw-play" + exit 1 +fi + +# ========================================= +# 1. 定义信号处理 (收到信号 = 上膛) +# ========================================= +arm_trigger() { + # 更新文件的修改时间,或者创建它 + touch "$TRIGGER_FILE" +} + +# 注册信号:收到 USR1 就执行 arm_trigger +trap arm_trigger SIGUSR1 + +# ========================================= +# 2. 启动剪贴板监听 (后台运行) +# ========================================= +# 只有当剪贴板真正发生变化时,这个子进程才会醒来 +wl-paste --watch bash -c " + # A. 检查是不是图片 + if wl-paste --list-types 2>/dev/null | grep -q 'image/'; then + + # B. 检查有没有“上膛” (文件是否存在) + if [ -f \"$TRIGGER_FILE\" ]; then + + # C. 检查“上膛”是否过期 (利用文件修改时间) + # $(date +%s) - stat获取的时间 + NOW=\$(date +%s) + FILE_TIME=\$(stat -c %Y \"$TRIGGER_FILE\") + DIFF=\$((NOW - FILE_TIME)) + + if [ \$DIFF -lt $TIMEOUT_SEC ]; then + # 조건을 满足:是图片 + 已上膛 + 没过期 + pw-play \"$SOUND\" & + + # D. 销毁扳机 (防止连响) + rm -f \"$TRIGGER_FILE\" + fi + fi + fi +" & +# 获取 wl-paste 的 PID,以便脚本退出时杀掉它 +WATCHER_PID=$! + +# ========================================= +# 3. 守护进程主循环 (0 CPU 占用) +# ========================================= +# 这里的 trap 负责在脚本退出时清理子进程 +trap "kill $WATCHER_PID; exit" INT TERM EXIT + +# 写入当前 PID 方便调试 (可选) +# echo $$ > /tmp/niri-sound.pid + +echo "截图音效服务已启动,等待 SIGUSR1 信号..." + +# 无限睡眠,只响应信号 +while true; do + sleep infinity & wait $! +done diff --git a/noctalia-dotfiles/.config/niri/supertab.kdl b/noctalia-dotfiles/.config/niri/supertab.kdl new file mode 100644 index 0000000..b2854d6 --- /dev/null +++ b/noctalia-dotfiles/.config/niri/supertab.kdl @@ -0,0 +1,30 @@ +// 带缩略图的alt+tab切换窗口功能(但是我设置的是super+tab,更符合逻辑) +recent-windows { + // 取消//off的注释可以禁用 + // off + debounce-ms 750 + open-delay-ms 150 + + highlight { + + // 缩略图背景内间距 + padding 30 + // 缩略图的背景圆角 + corner-radius 12 + } + + //设置缩略图大小 + previews { + max-height 480 + max-scale 0.2 + } + + binds { + // scope可以设置显示的窗口是当前工作区的、还是当前显示器的、或者显示全部窗口 + Mod+Tab { next-window scope="workspace"; } + Mod+Shift+Tab { previous-window scope="workspace"; } + // grave是波浪键,显示当前应用的所有窗口 + Mod+grave { next-window filter="app-id"; } + Mod+Shift+grave { previous-window filter="app-id"; } + } +} diff --git a/noctalia-dotfiles/.config/niri/windowrules.kdl b/noctalia-dotfiles/.config/niri/windowrules.kdl new file mode 100644 index 0000000..07c005a --- /dev/null +++ b/noctalia-dotfiles/.config/niri/windowrules.kdl @@ -0,0 +1,175 @@ + +// 全局窗口规则 +window-rule { + // 这一行规则可以让niri变成传统桌面那样的堆叠式桌面。 + //open-floating true + // 圆角 + geometry-corner-radius 8 + // 去掉超出圆角的窗口内容 + clip-to-geometry true + // 全局透明度 + //opacity 0.99 + // 禁止边框画到背景里 + draw-border-with-background false +} +// Set the overview wallpaper on the backdrop. +layer-rule { + match namespace="^noctalia-overview*" + place-within-backdrop true +} +// 以浮动模式打开imv(一个轻量化图片预览程序)且不自动聚焦 +window-rule { + match app-id="imv" + open-floating true + } +// steam 好友列表 +window-rule { + match app-id="steam" title="Friends List" + match app-id="steam" title="好友列表" + default-column-width { proportion 0.20; } + +} +//shorinclip剪贴板TUI +window-rule { + match app-id="shorinclip" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + //min-height 800 + open-floating true + default-floating-position x=0 y=18 relative-to="top" +} +// 以浮动模式打开的软件 +window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + match app-id="com.gabm.satty" + match app-id="media_info" + match app-id="video2gif" + match app-id="floating-term" + match app-id="nm-connection-editor" + match app-id="niri-quick-switch" + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + match app-id="steam" title="Friends List" + match app-id="blueberry.py" title="蓝牙" + match app-id="blueman-manager" + match app-id="flameshot" + match app-id="com.github.hluk.copyq" + match app-id="be.alexandervanhee.gradia" + match app-id="org.pulseaudio.pavucontrol" title="音量控制" + match app-id="org.gnome.clocks" title="时钟" + match app-id="fcitx" title="Fcitx5 Input Window" + match app-id="org.gnome.FileRoller" + match app-id="thunar" title="文件操作进度" + match app-id="waypaper" + match app-id="clipse-gui" + match title="群聊的聊天记录" + match title="聊天记录" + match title="日历" + match title="重命名" + match app-id="btrfs-assistant" + match app-id="markpix" + match title="Steam 设置" + match title="另存为" + match app-id="better_control.py" + match app-id="niri-hotkey-menu" + open-floating true +} +//快速终端和笔记 +window-rule { + match app-id="quickterminal" + open-floating true + default-floating-position x=20 y=20 relative-to="top" +} +window-rule { + match app-id="bluetui" + match app-id="impala" +default-column-width { fixed 800; } + default-window-height { fixed 800; } + open-floating true +} +window-rule { + match app-id="clipse" + default-column-width { fixed 625; } + default-window-height { fixed 700; } + open-floating true +} + // waydroid调整 +window-rule { + match title="gsr ui" + match app-id="waydroid" + open-fullscreen true + open-floating true + focus-ring { + off + } + shadow { + off + } +} +// 取消图片预览、视频播放器之类的透明度,并且以浮动模式打开 +window-rule { + match title="图片查看器" + match title="画中画" + match title="图片和视频" + match title="视频播放器" + open-floating true + opacity 1.0 +} +window-rule { + match app-id="mpv" + match app-id="celluloid" + opacity 1.0 +} + +// 默认窗口规则 +window-rule { + // This regular expression is intentionally made as specific as possible, + // since this is the default config, and we want no false positives. + // You can get away with just app-id="wezterm" if you want. + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} +window-rule { + match app-id=r#"^org\.gnome\."# + draw-border-with-background false + geometry-corner-radius 12 + clip-to-geometry true +} +window-rule { + match app-id=r#"^gnome-control-center$"# + match app-id=r#"^pavucontrol$"# + match app-id=r#"^nm-connection-editor$"# + default-column-width { proportion 0.5; } + open-floating false +} +window-rule { + match app-id=r#"^gnome-calculator$"# + match app-id=r#"^galculator$"# + match app-id=r#"^blueman-manager$"# + match app-id=r#"^xdg-desktop-portal$"# + open-floating true +} +window-rule { + match app-id=r#"^steam$"# title=r#"^notificationtoasts_\d+_desktop$"# + default-floating-position x=10 y=10 relative-to="bottom-right" + open-focused false +} +window-rule { + match app-id=r#"^org\.wezfurlong\.wezterm$"# + match app-id="Alacritty" + match app-id="zen" + match app-id="com.mitchellh.ghostty" + match app-id="kitty" + draw-border-with-background false +} +window-rule { + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + match app-id="zoom" + open-floating true +} +// Open dms windows as floating by default +window-rule { + match app-id=r#"org.quickshell$"# + open-floating true +} diff --git a/noctalia-dotfiles/.config/noctalia/colors.json b/noctalia-dotfiles/.config/noctalia/colors.json new file mode 100644 index 0000000..33a9bb6 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/colors.json @@ -0,0 +1,25 @@ +{ + "mPrimary": "#bec2ff", + "mOnPrimary": "#1f2578", + + "mSecondary": "#c5c4dd", + "mOnSecondary": "#2e2f42", + + "mTertiary": "#e7b9d5", + "mOnTertiary": "#45263c", + + "mError": "#ffb4ab", + "mOnError": "#690005", + + "mSurface": "#131316", + "mOnSurface": "#e5e1e6", + + "mSurfaceVariant": "#1f1f23", + "mOnSurfaceVariant": "#c7c5d0", + + "mOutline": "#46464f", + "mShadow": "#000000", + + "mHover": "#e7b9d5", + "mOnHover": "#45263c" +} \ No newline at end of file diff --git a/noctalia-dotfiles/.config/noctalia/plugins.json b/noctalia-dotfiles/.config/noctalia/plugins.json new file mode 100644 index 0000000..04b0a22 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/plugins.json @@ -0,0 +1,12 @@ +{ + "sources": [ + { + "enabled": true, + "name": "Noctalia Plugins", + "url": "https://github.com/noctalia-dev/noctalia-plugins" + } + ], + "states": { + }, + "version": 2 +} diff --git a/noctalia-dotfiles/.config/noctalia/settings.json b/noctalia-dotfiles/.config/noctalia/settings.json new file mode 100644 index 0000000..cf783b0 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/settings.json @@ -0,0 +1,705 @@ +{ + "appLauncher": { + "autoPasteClipboard": false, + "clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store", + "clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store", + "clipboardWrapText": true, + "customLaunchPrefix": "", + "customLaunchPrefixEnabled": false, + "density": "default", + "enableClipPreview": true, + "enableClipboardChips": true, + "enableClipboardHistory": true, + "enableClipboardSmartIcons": true, + "enableSessionSearch": true, + "enableSettingsSearch": true, + "enableWindowsSearch": true, + "iconMode": "tabler", + "ignoreMouseInput": false, + "overviewLayer": false, + "pinnedApps": [ + ], + "position": "center", + "screenshotAnnotationTool": "", + "showCategories": true, + "showIconBackground": false, + "sortByMostUsed": true, + "terminalCommand": "alacritty -e", + "viewMode": "list" + }, + "audio": { + "mprisBlacklist": [ + ], + "preferredPlayer": "", + "spectrumFrameRate": 30, + "spectrumMirrored": true, + "visualizerType": "linear", + "volumeFeedback": false, + "volumeFeedbackSoundFile": "", + "volumeOverdrive": false, + "volumeStep": 5 + }, + "bar": { + "autoHideDelay": 500, + "autoShowDelay": 150, + "backgroundOpacity": 0.93, + "barType": "simple", + "capsuleColorKey": "none", + "capsuleOpacity": 1, + "contentPadding": 2, + "density": "default", + "displayMode": "always_visible", + "enableExclusionZoneInset": true, + "fontScale": 1, + "frameRadius": 12, + "frameThickness": 8, + "hideOnOverview": false, + "marginHorizontal": 4, + "marginVertical": 4, + "middleClickAction": "none", + "middleClickCommand": "", + "middleClickFollowMouse": false, + "monitors": [ + ], + "mouseWheelAction": "none", + "mouseWheelWrap": true, + "outerCorners": true, + "position": "top", + "reverseScroll": false, + "rightClickAction": "controlCenter", + "rightClickCommand": "", + "rightClickFollowMouse": true, + "screenOverrides": [ + ], + "showCapsule": true, + "showOnWorkspaceSwitch": true, + "showOutline": false, + "useSeparateOpacity": false, + "widgetSpacing": 6, + "widgets": { + "center": [ + { + "characterCount": 2, + "colorizeIcons": false, + "emptyColor": "secondary", + "enableScrollWheel": true, + "focusedColor": "primary", + "followFocusedScreen": false, + "fontWeight": "bold", + "groupedBorderOpacity": 1, + "hideUnoccupied": false, + "iconScale": 0.8, + "id": "Workspace", + "labelMode": "index", + "occupiedColor": "secondary", + "pillSize": 0.6, + "showApplications": false, + "showApplicationsHover": false, + "showBadge": true, + "showLabelsOnlyWhenOccupied": true, + "unfocusedIconsOpacity": 1 + } + ], + "left": [ + { + "colorizeSystemIcon": "none", + "customIconPath": "", + "enableColorization": false, + "icon": "rocket", + "iconColor": "none", + "id": "Launcher", + "useDistroLogo": false + }, + { + "clockColor": "none", + "customFont": "", + "formatHorizontal": "HH:mm ddd, MMM dd", + "formatVertical": "HH mm - dd MM", + "id": "Clock", + "tooltipFormat": "HH:mm ddd, MMM dd", + "useCustomFont": false + }, + { + "compactMode": true, + "diskPath": "/", + "iconColor": "none", + "id": "SystemMonitor", + "showCpuCores": false, + "showCpuFreq": false, + "showCpuTemp": true, + "showCpuUsage": true, + "showDiskAvailable": false, + "showDiskUsage": false, + "showDiskUsageAsPercent": false, + "showGpuTemp": false, + "showLoadAverage": false, + "showMemoryAsPercent": false, + "showMemoryUsage": true, + "showNetworkStats": false, + "showSwapUsage": false, + "textColor": "none", + "useMonospaceFont": true, + "usePadding": false + }, + { + "colorizeIcons": false, + "hideMode": "hidden", + "id": "ActiveWindow", + "maxWidth": 145, + "scrollingMode": "hover", + "showIcon": true, + "textColor": "none", + "useFixedWidth": false + }, + { + "compactMode": false, + "hideMode": "hidden", + "hideWhenIdle": false, + "id": "MediaMini", + "maxWidth": 145, + "panelShowAlbumArt": true, + "scrollingMode": "hover", + "showAlbumArt": true, + "showArtistFirst": true, + "showProgressRing": true, + "showVisualizer": false, + "textColor": "none", + "useFixedWidth": false, + "visualizerType": "linear" + } + ], + "right": [ + { + "blacklist": [ + ], + "chevronColor": "none", + "colorizeIcons": false, + "drawerEnabled": true, + "hidePassive": false, + "id": "Tray", + "pinned": [ + "Keyboard - English (US)" + ] + }, + { + "hideWhenZero": false, + "hideWhenZeroUnread": false, + "iconColor": "none", + "id": "NotificationHistory", + "showUnreadBadge": true, + "unreadBadgeColor": "primary" + }, + { + "deviceNativePath": "__default__", + "displayMode": "graphic-clean", + "hideIfIdle": false, + "hideIfNotDetected": true, + "id": "Battery", + "showNoctaliaPerformance": false, + "showPowerProfiles": false + }, + { + "displayMode": "onhover", + "iconColor": "none", + "id": "Volume", + "middleClickCommand": "pwvucontrol || pavucontrol", + "textColor": "none" + }, + { + "applyToAllMonitors": false, + "displayMode": "onhover", + "iconColor": "none", + "id": "Brightness", + "textColor": "none" + }, + { + "colorizeDistroLogo": false, + "colorizeSystemIcon": "none", + "customIconPath": "", + "enableColorization": false, + "icon": "noctalia", + "id": "ControlCenter", + "useDistroLogo": false + } + ] + } + }, + "brightness": { + "backlightDeviceMappings": [ + ], + "brightnessStep": 5, + "enableDdcSupport": false, + "enforceMinimum": true + }, + "calendar": { + "cards": [ + { + "enabled": true, + "id": "calendar-header-card" + }, + { + "enabled": true, + "id": "calendar-month-card" + }, + { + "enabled": true, + "id": "weather-card" + } + ] + }, + "colorSchemes": { + "darkMode": true, + "generationMethod": "tonal-spot", + "manualSunrise": "06:30", + "manualSunset": "18:30", + "monitorForColors": "", + "predefinedScheme": "Noctalia (default)", + "schedulingMode": "off", + "useWallpaperColors": true + }, + "controlCenter": { + "cards": [ + { + "enabled": true, + "id": "profile-card" + }, + { + "enabled": true, + "id": "shortcuts-card" + }, + { + "enabled": true, + "id": "audio-card" + }, + { + "enabled": false, + "id": "brightness-card" + }, + { + "enabled": true, + "id": "weather-card" + }, + { + "enabled": true, + "id": "media-sysmon-card" + } + ], + "diskPath": "/", + "position": "close_to_bar_button", + "shortcuts": { + "left": [ + { + "id": "Network" + }, + { + "id": "Bluetooth" + }, + { + "id": "WallpaperSelector" + }, + { + "id": "NoctaliaPerformance" + } + ], + "right": [ + { + "id": "Notifications" + }, + { + "id": "PowerProfile" + }, + { + "id": "KeepAwake" + }, + { + "id": "NightLight" + } + ] + } + }, + "desktopWidgets": { + "enabled": false, + "gridSnap": false, + "gridSnapScale": false, + "monitorWidgets": [ + ], + "overviewEnabled": true + }, + "dock": { + "animationSpeed": 1, + "backgroundOpacity": 1, + "colorizeIcons": false, + "deadOpacity": 0.6, + "displayMode": "auto_hide", + "dockType": "floating", + "enabled": true, + "floatingRatio": 1, + "groupApps": false, + "groupClickAction": "cycle", + "groupContextMenuMode": "extended", + "groupIndicatorStyle": "dots", + "inactiveIndicators": false, + "indicatorColor": "primary", + "indicatorOpacity": 0.6, + "indicatorThickness": 3, + "launcherIcon": "", + "launcherIconColor": "none", + "launcherPosition": "end", + "launcherUseDistroLogo": false, + "monitors": [ + ], + "onlySameOutput": true, + "pinnedApps": [ + ], + "pinnedStatic": false, + "position": "bottom", + "showDockIndicator": false, + "showLauncherIcon": false, + "sitOnFrame": false, + "size": 1 + }, + "general": { + "allowPanelsOnScreenWithoutBar": true, + "allowPasswordWithFprintd": false, + "animationDisabled": false, + "animationSpeed": 1, + "autoStartAuth": false, + "avatarImage": "/home/shorin/.face", + "boxRadiusRatio": 1, + "clockFormat": "hh\\nmm", + "clockStyle": "custom", + "compactLockScreen": false, + "dimmerOpacity": 0.2, + "enableBlurBehind": true, + "enableLockScreenCountdown": true, + "enableLockScreenMediaControls": false, + "enableShadows": true, + "forceBlackScreenCorners": false, + "iRadiusRatio": 1, + "keybinds": { + "keyDown": [ + "Down" + ], + "keyEnter": [ + "Return", + "Enter" + ], + "keyEscape": [ + "Esc" + ], + "keyLeft": [ + "Left" + ], + "keyRemove": [ + "Del" + ], + "keyRight": [ + "Right" + ], + "keyUp": [ + "Up" + ] + }, + "language": "", + "lockOnSuspend": true, + "lockScreenAnimations": false, + "lockScreenBlur": 0, + "lockScreenCountdownDuration": 10000, + "lockScreenMonitors": [ + ], + "lockScreenTint": 0, + "passwordChars": false, + "radiusRatio": 1, + "reverseScroll": false, + "scaleRatio": 1, + "screenRadiusRatio": 1, + "shadowDirection": "bottom_right", + "shadowOffsetX": 2, + "shadowOffsetY": 3, + "showChangelogOnStartup": true, + "showHibernateOnLockScreen": false, + "showScreenCorners": false, + "showSessionButtonsOnLockScreen": true, + "telemetryEnabled": false + }, + "hooks": { + "colorGeneration": "", + "darkModeChange": "", + "enabled": false, + "performanceModeDisabled": "", + "performanceModeEnabled": "", + "screenLock": "", + "screenUnlock": "", + "session": "", + "startup": "", + "wallpaperChange": "" + }, + "idle": { + "customCommands": "[]", + "enabled": false, + "fadeDuration": 5, + "lockCommand": "", + "lockTimeout": 660, + "resumeLockCommand": "", + "resumeScreenOffCommand": "", + "resumeSuspendCommand": "", + "screenOffCommand": "", + "screenOffTimeout": 600, + "suspendCommand": "", + "suspendTimeout": 1800 + }, + "location": { + "analogClockInCalendar": false, + "firstDayOfWeek": -1, + "hideWeatherCityName": false, + "hideWeatherTimezone": false, + "name": "Tokyo", + "showCalendarEvents": true, + "showCalendarWeather": true, + "showWeekNumberInCalendar": false, + "use12hourFormat": false, + "useFahrenheit": false, + "weatherEnabled": true, + "weatherShowEffects": true + }, + "network": { + "airplaneModeEnabled": false, + "bluetoothAutoConnect": true, + "bluetoothDetailsViewMode": "grid", + "bluetoothHideUnnamedDevices": false, + "bluetoothRssiPollIntervalMs": 60000, + "bluetoothRssiPollingEnabled": false, + "disableDiscoverability": false, + "networkPanelView": "wifi", + "wifiDetailsViewMode": "grid" + }, + "nightLight": { + "autoSchedule": true, + "dayTemp": "6500", + "enabled": false, + "forced": false, + "manualSunrise": "06:30", + "manualSunset": "18:30", + "nightTemp": "4000" + }, + "noctaliaPerformance": { + "disableDesktopWidgets": true, + "disableWallpaper": true + }, + "notifications": { + "backgroundOpacity": 1, + "clearDismissed": true, + "criticalUrgencyDuration": 15, + "density": "default", + "enableBatteryToast": true, + "enableKeyboardLayoutToast": true, + "enableMarkdown": false, + "enableMediaToast": false, + "enabled": true, + "location": "top_right", + "lowUrgencyDuration": 3, + "monitors": [ + ], + "normalUrgencyDuration": 8, + "overlayLayer": true, + "respectExpireTimeout": false, + "saveToHistory": { + "critical": true, + "low": true, + "normal": true + }, + "sounds": { + "criticalSoundFile": "", + "enabled": false, + "excludedApps": "discord,firefox,chrome,chromium,edge", + "lowSoundFile": "", + "normalSoundFile": "", + "separateSounds": false, + "volume": 0.5 + } + }, + "osd": { + "autoHideMs": 2000, + "backgroundOpacity": 1, + "enabled": true, + "enabledTypes": [ + 0, + 1, + 2 + ], + "location": "top_right", + "monitors": [ + ], + "overlayLayer": true + }, + "plugins": { + "autoUpdate": false, + "notifyUpdates": true + }, + "sessionMenu": { + "countdownDuration": 10000, + "enableCountdown": true, + "largeButtonsLayout": "single-row", + "largeButtonsStyle": true, + "position": "center", + "powerOptions": [ + { + "action": "lock", + "enabled": true, + "keybind": "1" + }, + { + "action": "suspend", + "enabled": true, + "keybind": "2" + }, + { + "action": "hibernate", + "enabled": true, + "keybind": "3" + }, + { + "action": "reboot", + "enabled": true, + "keybind": "4" + }, + { + "action": "logout", + "enabled": true, + "keybind": "5" + }, + { + "action": "shutdown", + "enabled": true, + "keybind": "6" + }, + { + "action": "rebootToUefi", + "enabled": true, + "keybind": "7" + } + ], + "showHeader": true, + "showKeybinds": true + }, + "settingsVersion": 59, + "systemMonitor": { + "batteryCriticalThreshold": 5, + "batteryWarningThreshold": 20, + "cpuCriticalThreshold": 90, + "cpuWarningThreshold": 80, + "criticalColor": "", + "diskAvailCriticalThreshold": 10, + "diskAvailWarningThreshold": 20, + "diskCriticalThreshold": 90, + "diskWarningThreshold": 80, + "enableDgpuMonitoring": false, + "externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor", + "gpuCriticalThreshold": 90, + "gpuWarningThreshold": 80, + "memCriticalThreshold": 90, + "memWarningThreshold": 80, + "swapCriticalThreshold": 90, + "swapWarningThreshold": 80, + "tempCriticalThreshold": 90, + "tempWarningThreshold": 80, + "useCustomColors": false, + "warningColor": "" + }, + "templates": { + "activeTemplates": [ + { + "enabled": true, + "id": "kitty" + }, + { + "enabled": true, + "id": "niri" + }, + { + "enabled": true, + "id": "fuzzel" + }, + { + "enabled": true, + "id": "btop" + }, + { + "enabled": true, + "id": "cava" + }, + { + "enabled": true, + "id": "gtk" + } + ], + "enableUserTheming": true + }, + "ui": { + "boxBorderEnabled": false, + "fontDefault": "Sans Serif", + "fontDefaultScale": 1, + "fontFixed": "monospace", + "fontFixedScale": 1, + "panelBackgroundOpacity": 0.93, + "panelsAttachedToBar": true, + "scrollbarAlwaysVisible": true, + "settingsPanelMode": "attached", + "settingsPanelSideBarCardStyle": false, + "tooltipsEnabled": true, + "translucentWidgets": false + }, + "wallpaper": { + "automationEnabled": false, + "directory": "/home/shorin/Pictures/Wallpapers", + "enableMultiMonitorDirectories": false, + "enabled": true, + "favorites": [ + ], + "fillColor": "#000000", + "fillMode": "crop", + "hideWallpaperFilenames": false, + "monitorDirectories": [ + { + "directory": "/home/shorin/Pictures/Wallpapers", + "name": "Virtual-1", + "wallpaper": "" + } + ], + "overviewBlur": 0.4, + "overviewEnabled": true, + "overviewTint": 0.6, + "panelPosition": "follow_bar", + "randomIntervalSec": 300, + "setWallpaperOnAllMonitors": true, + "showHiddenFiles": false, + "skipStartupTransition": false, + "solidColor": "#1a1a2e", + "sortOrder": "name", + "transitionDuration": 1500, + "transitionEdgeSmoothness": 0.05, + "transitionType": [ + "fade", + "disc", + "stripes", + "wipe", + "pixelate", + "honeycomb" + ], + "useOriginalImages": false, + "useSolidColor": false, + "useWallhaven": false, + "viewMode": "recursive", + "wallhavenApiKey": "", + "wallhavenCategories": "111", + "wallhavenOrder": "desc", + "wallhavenPurity": "100", + "wallhavenQuery": "", + "wallhavenRatios": "", + "wallhavenResolutionHeight": "", + "wallhavenResolutionMode": "atleast", + "wallhavenResolutionWidth": "", + "wallhavenSorting": "relevance", + "wallpaperChangeMode": "random" + } +} diff --git a/noctalia-dotfiles/.config/noctalia/templates/btop.theme b/noctalia-dotfiles/.config/noctalia/templates/btop.theme new file mode 100644 index 0000000..8fc94f6 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/btop.theme @@ -0,0 +1,89 @@ +# Matugen template for btop + + +# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255" +# example for white: "#ffffff", "#ff" or "255 255 255". + +# All graphs and meters can be gradients +# For single color graphs leave "mid" and "end" variable empty. +# Use "start" and "end" variables for two color gradient +# Use "start", "mid" and "end" for three color gradient + +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="" + +# Main text color +theme[main_fg]="{{colors.on_surface.default.hex}}" + +# Title color for boxes +theme[title]="{{colors.primary.default.hex}}" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="{{colors.secondary.default.hex}}" + +# Background color of selected item in processes box +theme[selected_bg]="{{colors.primary.default.hex}}" + +# Foreground color of selected item in processes box +theme[selected_fg]="{{colors.on_primary.default.hex}}" + +# Color of inactive/disabled text +theme[inactive_fg]="{{colors.on_surface_variant.default.hex}}" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="{{colors.tertiary.default.hex}}" + +# Cpu box outline color +theme[cpu_box]="{{colors.outline.default.hex}}" + +# Memory/disks box outline color +theme[mem_box]="{{colors.outline.default.hex}}" + +# Net up/down box outline color +theme[net_box]="{{colors.outline.default.hex}}" + +# Processes box outline color +theme[proc_box]="{{colors.outline.default.hex}}" + +# Box divider line and small boxes line color +theme[div_line]="{{colors.outline_variant.default.hex}}" + +# Temperature graph colors +theme[temp_start]="{{colors.secondary.default.hex}}" +theme[temp_mid]="{{colors.primary.default.hex}}" +theme[temp_end]="{{colors.error.default.hex}}" + +# CPU graph colors +theme[cpu_start]="{{colors.secondary.default.hex}}" +theme[cpu_mid]="{{colors.primary.default.hex}}" +theme[cpu_end]="{{colors.error.default.hex}}" + +# Mem/Disk free meter +theme[free_start]="{{colors.secondary.default.hex}}" +theme[free_mid]="" +theme[free_end]="{{colors.secondary_container.default.hex}}" + +# Mem/Disk cached meter +theme[cached_start]="{{colors.tertiary.default.hex}}" +theme[cached_mid]="" +theme[cached_end]="{{colors.tertiary_container.default.hex}}" + +# Mem/Disk available meter +theme[available_start]="{{colors.primary.default.hex}}" +theme[available_mid]="" +theme[available_end]="{{colors.primary_container.default.hex}}" + +# Mem/Disk used meter +theme[used_start]="{{colors.error.default.hex}}" +theme[used_mid]="" +theme[used_end]="{{colors.error_container.default.hex}}" + +# Download graph colors +theme[download_start]="{{colors.secondary.default.hex}}" +theme[download_mid]="{{colors.primary.default.hex}}" +theme[download_end]="{{colors.tertiary.default.hex}}" + +# Upload graph colors +theme[upload_start]="{{colors.secondary.default.hex}}" +theme[upload_mid]="{{colors.primary.default.hex}}" +theme[upload_end]="{{colors.tertiary.default.hex}}" diff --git a/noctalia-dotfiles/.config/noctalia/templates/cava-colors.ini b/noctalia-dotfiles/.config/noctalia/templates/cava-colors.ini new file mode 100644 index 0000000..f4813b2 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/cava-colors.ini @@ -0,0 +1,19 @@ +[color] +background = 'default' +foreground = '{{colors.primary.default.hex}}' + +; gradient = 0 +gradient = 1 +gradient_color_1 = '{{colors.primary_container.default.hex}}' +gradient_color_2 = '{{colors.primary.default.hex}}' +gradient_color_3 = '{{colors.on_primary_container.default.hex}}' + +horizontal_gradient = 0 +; horizontal_gradient = 1 +horizontal_gradient_color_1 = '{{colors.primary_container.default.hex}}' +horizontal_gradient_color_2 = '{{colors.primary.default.hex}}' +horizontal_gradient_color_3 = '{{colors.on_primary_container.default.hex}}' +horizontal_gradient_color_4 = '{{colors.primary.default.hex}}' +horizontal_gradient_color_5 = '{{colors.primary_container.default.hex}}' + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/fastfetch-config.jsonc b/noctalia-dotfiles/.config/noctalia/templates/fastfetch-config.jsonc new file mode 100644 index 0000000..cab4c6a --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/fastfetch-config.jsonc @@ -0,0 +1,128 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json", + "logo": { + //"type": "kitty", + //"source": "/home/shorin/Pictures/picture.png", + "width": 25, + // "height":20, + "color":{ + "1":"{{colors.primary.default.hex}}", + "2":"{{colors.primary.default.hex}}" + }, + "padding": { + "top": 1, // Top padding + "left": 2, // Left padding + "right": 2 // Right padding + }, + }, + "display": { + "separator": " ", // Separator between keys and values + "color": { + //"keys": "{{colors.secondary.default.hex}}", // Key color module名字的颜色 + "title": "{{colors.on_surface_variant.default.hex}}", // Title color 主机名的颜色 + "output": "{{colors.on_surface_variant.default.hex}}" + }, + }, + "modules": [ + "break", + { + "type": "os", //这是哪个module + "key": "OS", //module名字的显示 + // "keyColor": "#00ff00", //module名字颜色 + // "format": "{name} {version}", //具体内容 + "keyColor": "{{colors.primary.default.hex}}", + + }, + { + "type": "kernel", + "key": " ├  KER ", + "keyColor": "{{colors.primary.default.hex}}", + + }, + { + "type": "packages", + "key": " ├  PAK ", + "format": "{all}", + "keyColor": "{{colors.primary.default.hex}}", + }, + { + "type": "title", + "key": " └  USR ", + "keyColor": "{{colors.primary.default.hex}}", + }, + "break", + "break", + { + "type": "wm", + "key": "WM", + "keyColor": "{{colors.tertiary.default.hex}}", + }, + { + "type": "de", + "key": " ├ 󱈹 DES ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "shell", + "key": " ├  SHE ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "terminal", + "key": " ├  TER ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + { + "type": "terminalfont", + "key": " └  TFO ", + "keyColor": "{{colors.tertiary.default.hex}}", + //"outputColor": "{{colors.tertiary_fixed_dim.default.hex}}" + }, + "break", + "break", + { + "type": "host", + "key": "PC ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "cpu", + "key": " ├  CPU ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "memory", + "key": " ├  MEM ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "gpu", + "key": " ├ 󰢮 GPU ", + "format": "{1} {2}", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "display", + "key": " ├  MON ", + "format": "{name} {width}x{height}@{refresh-rate} ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + { + "type": "disk", + "key": " └ 󰋊 DIS ", + "keyColor": "{{colors.secondary_fixed.default.hex}}", + //"outputColor": "{{colors.secondary_fixed_dim.default.hex}}" + }, + "break", + "break", + "colors" + ] +} diff --git a/noctalia-dotfiles/.config/noctalia/templates/fcitx5-theme.conf b/noctalia-dotfiles/.config/noctalia/templates/fcitx5-theme.conf new file mode 100644 index 0000000..3589610 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/fcitx5-theme.conf @@ -0,0 +1,296 @@ +# vim: ft=dosini +[Metadata] +Name=Matugen +Version=0.1 +Author=shorin +Description=WallpaperColorSyncByMatugen +ScaleWithDPI=True + +[InputPanel] +# 改这个:一般文字颜色 +NormalColor={{colors.on_surface.default.hex}} +# 高亮文字颜色 +HighlightColor={{colors.on_primary.default.hex}} +# 高亮背景颜色 +HighlightBackgroundColor={{colors.tertiary.default.hex}} +# 改这个:这个才是被选中的文字颜色 +HighlightCandidateColor={{colors.on_tertiary.default.hex}} +# KWin 下启用模糊 +EnableBlur=False +# 模糊遮罩 +BlurMask= +# 竖排列表时使用所有横向空间高亮 +FullWidthHighlight=True +# 页面按钮垂直对齐 +PageButtonAlignment="Last Candidate" + +[InputPanel/Background] +# 改这个:输入法框整体背景颜色 +Color={{colors.surface_container.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 改这个:边框宽度 +BorderWidth=2 + +[InputPanel/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/Highlight] +# 改这个:高亮背景颜色 +Color={{colors.tertiary.default.hex}} + +[InputPanel/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[InputPanel/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu] +# 一般文字颜色 +NormalColor={{colors.on_surface.default.hex}} +# 选中项文本颜色 +HighlightCandidateColor={{colors.on_surface.default.hex}} + +[Menu/Background] +# 背景图片 +Image= +# 颜色 +Color={{colors.surface_container.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 边框宽度 +BorderWidth=2 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + + +[Menu/Highlight] +# 背景图片 +Image= +# 颜色 +Color={{colors.tertiary.default.hex}} +# 边框颜色 +BorderColor={{colors.outline.default.hex}} +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu/Highlight/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator] +# 背景图片 +Image= +# 颜色 +Color=#c0c0c0 +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Separator/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox] +# 背景图片 +Image=radio.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/CheckBox/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu] +# 背景图片 +Image=arrow.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/SubMenu/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[Menu/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/fuzzel.ini b/noctalia-dotfiles/.config/noctalia/templates/fuzzel.ini new file mode 100644 index 0000000..2e2cbdd --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/fuzzel.ini @@ -0,0 +1,15 @@ +# Fuzzel Colors +# Generated with Matugen + +[colors] +background={{colors.surface_container.default.hex_stripped}}ff +text={{colors.on_surface.default.hex_stripped}}ff +prompt={{colors.secondary.default.hex_stripped}}ff +placeholder={{colors.tertiary.default.hex_stripped}}ff +input={{colors.primary.default.hex_stripped}}ff +match={{colors.tertiary.default.hex_stripped}}ff +selection={{colors.secondary.default.hex_stripped}}ff +selection-text={{colors.on_secondary.default.hex_stripped}}ff +selection-match={{colors.on_tertiary.default.hex_stripped}}ff +counter={{colors.secondary.default.hex_stripped}}ff +border={{colors.secondary.default.hex_stripped}}ff diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/index.theme b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/index.theme new file mode 100644 index 0000000..a143982 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/index.theme @@ -0,0 +1,235 @@ +[Icon Theme] +Name=Adwaita-Matugen +Comment=The Only One +Example=folder +Inherits=Adwaita,AdwaitaLegacy,hicolor +Hidden=true + +# KDE Specific Stuff +DisplayDepth=32 +LinkOverlay=link_overlay +LockOverlay=lock_overlay +ZipOverlay=zip_overlay +DesktopDefault=48 +DesktopSizes=16,22,32,48,64,72,96,128 +ToolbarDefault=22 +ToolbarSizes=16,22,32,48 +MainToolbarDefault=22 +MainToolbarSizes=16,22,32,48 +SmallDefault=16 +SmallSizes=16 +PanelDefault=32 +PanelSizes=16,22,32,48,64,72,96,128 + +# Directory list +Directories=16x16/actions,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/legacy,16x16/mimetypes,16x16/places,16x16/status,16x16/ui,scalable/devices,scalable/mimetypes,scalable/places,scalable/status,scalable/actions,scalable/apps,scalable/categories,scalable/emblems,scalable/emotes,scalable/legacy,scalable/ui,symbolic/actions,symbolic/apps,symbolic/categories,symbolic/devices,symbolic/emblems,symbolic/emotes,symbolic/mimetypes,symbolic/places,symbolic/status,symbolic/legacy,symbolic/ui, + +[16x16/actions] +Context=Actions +Size=16 +Type=Fixed + +[16x16/apps] +Context=Applications +Size=16 +Type=Fixed + +[16x16/categories] +Context=Categories +Size=16 +Type=Fixed + +[16x16/devices] +Context=Devices +Size=16 +Type=Fixed + +[16x16/emblems] +Context=Emblems +Size=16 +Type=Fixed + +[16x16/emotes] +Context=Emotes +Size=16 +Type=Fixed + +[16x16/legacy] +Context=Legacy +Size=16 +Type=Fixed + +[16x16/mimetypes] +Context=MimeTypes +Size=16 +Type=Fixed + +[16x16/places] +Context=Places +Size=16 +Type=Fixed + +[16x16/status] +Context=Status +Size=16 +Type=Fixed + +[16x16/ui] +Context=UI +Size=16 +Type=Fixed + +[scalable/devices] +Context=Devices +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/mimetypes] +Context=MimeTypes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/places] +Context=Places +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/status] +Context=Status +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/actions] +Context=Actions +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/apps] +Context=Applications +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/categories] +Context=Categories +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emblems] +Context=Emblems +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emotes] +Context=Emotes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/legacy] +Context=Legacy +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/ui] +Context=UI +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/actions] +Context=Actions +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/apps] +Context=Applications +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/categories] +Context=Categories +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/devices] +Context=Devices +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emblems] +Context=Emblems +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emotes] +Context=Emotes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/mimetypes] +Context=MimeTypes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/places] +Context=Places +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/status] +Context=Status +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/legacy] +Context=Legacy +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/ui] +Context=UI +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg new file mode 100644 index 0000000..4ee67b4 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-addon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg new file mode 100644 index 0000000..a2f038e --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/application-x-executable.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg new file mode 100644 index 0000000..8ce5b1a --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/audio-x-generic.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg new file mode 100644 index 0000000..fc93ed9 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/font-x-generic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/inode-directory.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg new file mode 100644 index 0000000..296603f --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-html.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg new file mode 100644 index 0000000..5efac55 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/text-x-script.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg new file mode 100644 index 0000000..dd73be1 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-document.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg new file mode 100644 index 0000000..41d5d0d --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/mimetypes/x-office-presentation.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg new file mode 100644 index 0000000..7fa7030 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-documents.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg new file mode 100644 index 0000000..f707afa --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-download.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-drag-accept.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg new file mode 100644 index 0000000..115b5c7 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-music.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg new file mode 100644 index 0000000..173d777 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-pictures.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg new file mode 100644 index 0000000..163320b --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-publicshare.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg new file mode 100644 index 0000000..fb05bea --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-remote.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg new file mode 100644 index 0000000..e7f0747 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-templates.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg new file mode 100644 index 0000000..665af73 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder-videos.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/folder.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg new file mode 100644 index 0000000..fa65381 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-server.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg new file mode 100644 index 0000000..92b8866 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/network-workgroup.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg new file mode 100644 index 0000000..af9b0e8 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-bookmarks.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg new file mode 100644 index 0000000..34d3948 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-desktop.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg new file mode 100644 index 0000000..f036aa1 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-home.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg new file mode 100644 index 0000000..f33215b --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/places/user-trash.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg new file mode 100644 index 0000000..d89d7c3 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/folder-open.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg new file mode 100644 index 0000000..a95b170 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/Adwaita-Matugen/scalable/status/user-trash-full.svg @@ -0,0 +1,1079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/recolor.sh b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/recolor.sh new file mode 100644 index 0000000..f7ff2e1 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/gtk-folder/recolor.sh @@ -0,0 +1,285 @@ +#!/usr/bin/env bash + +# ============================================================================== +# Adwaita-Matugen Icon Generator V6 (扁平化配置版) +# 逻辑:每一组 SVG 文件的颜色变量直接在顶部定义,方便用户微调。 +# ============================================================================== + +# ============================================================================== +# [一] 颜色变量配置区 (用户修改此处) +# ============================================================================== +MAIN_COLOR="{{colors.secondary_fixed_dim.default.hex}}" +MAIN_SHADOW="{{colors.secondary_container.default.hex}}" +MAIN_DARKER_SHADOW="{{colors.on_secondary.default.hex}}" +MAIN_HILIGHT="{{colors.secondary.default.hex}}" +INVERSE_MAIN_COLOR="{{colors.tertiary_fixed_dim.default.hex}}" +INVERSE_MAIN_HIGHLT="{{colors.tertiary.default.hex}}" +INVERSE_MAIN_SHADOW="{{colors.tertiary_container.default.hex}}" +PAPER_COLOR="#fafafa" +PAPER_FOLE_COLOR="#deddda" +# ------------------------------------------------------------------------------ +# [1] 文件夹 (folder*.svg / user-home.svg ...) +# ------------------------------------------------------------------------------ +# 文件夹保持使用 Secondary (次色系),为了不刺眼使用 dim 版本作为主体 +COLOR_FOLDER_BODY=$MAIN_COLOR # 主体 (原 #a4caee) +COLOR_FOLDER_TOP=$MAIN_HILIGHT # 顶部高光/符号 (原 #afd4ff) +COLOR_FOLDER_SHADOW=$MAIN_SHADOW # 阴影/渐变暗部 (原 #438de6) + +# ------------------------------------------------------------------------------ +# [2] 网络与垃圾桶 (network*.svg / user-trash*.svg) +# ------------------------------------------------------------------------------ +# 使用 Tertiary (第三色系) 作为强调色 +COLOR_ACCENT_BODY=$INVERSE_MAIN_COLOR # 主体 (原 #1c71d8/垃圾桶身) +COLOR_ACCENT_LIGHT=$INVERSE_MAIN_HIGHLT # 亮部 (原 #62a0ea/垃圾桶盖亮面) +COLOR_ACCENT_DARK=$INVERSE_MAIN_SHADOW # 暗部 (原 #1a5fb4/垃圾桶内侧) +COLOR_TRASH_PAPER="{{colors.on_tertiary_container.default.hex}}" # 废纸团颜色 + +# ------------------------------------------------------------------------------ +# [3] 脚本与可执行文件 (text-x-script.svg / application-x-executable.svg) +# ------------------------------------------------------------------------------ +# 重点修正:防止偏淡,主体使用 Primary Default (最鲜艳的主色) +# 对应 Adwaita 原版光影逻辑: +COLOR_SCRIPT_BODY=$MAIN_SHADOW # 主体 (原 #3584e4 - 基准蓝) +COLOR_SCRIPT_HIGHLIGHT=$MAIN_HILIGHT # 高光 (原 #99c1f1 - 亮蓝) +COLOR_SCRIPT_MID="#f0f0f0" # 侧面/次亮 (原 #62a0ea) +COLOR_SCRIPT_SHADOW=$MAIN_SHADOW # 阴影 (原 #1c71d8) +COLOR_SCRIPT_GEAR=$MAIN_DARKER_SHADOW # 齿轮/最深色 +COLOR_SCRIPT_PALE="ffffff" # 极亮部 (原 #d7e8fc) + +# ------------------------------------------------------------------------------ +# [4] 网页地球仪 (text-html.svg) +# ------------------------------------------------------------------------------ +# [新增] 极高光/反光 (原 #b3d3f9, #d7e8fc) +# 建议:使用 secondary_fixed (通常比 dim 更亮) 或 surface_bright +COLOR_HTML_PALE="#f0f0f0" +COLOR_HTML_HIGHLIGHT=$MAIN_HILIGHT # 中间向左上一级左上反光 (原 #99c1f1) +COLOR_HTML_BODY=$MAIN_SHADOW # 球体中间 (原 #62a0ea) +COLOR_HTML_MID=$MAIN_SHADOW # 球体中间向右下一级 (原 #3584e4) +COLOR_HTML_SHADOW=$MAIN_DARKER_SHADOW # 右下 (原 #1c71d8) +COLOR_HTML_DEEP="{{colors.surface_container.default.hex}}" # 最右下 (原 #1a5fb4) +# [新增] 纸张背景 (原 #f6f5f4, #deddda) - +COLOR_DOC_PAPER=$PAPER_COLOR +COLOR_DOC_FOLD=$PAPER_FOLE_COLOR + +# ------------------------------------------------------------------------------ +# [5] 插件图标 (application-x-addon.svg) +# ------------------------------------------------------------------------------ +# 你的要求:必须和 Folder (Secondary) 颜色一致 +COLOR_ADDON_BODY=$MAIN_COLOR # 主体 (原 #3584e4 -> 对应 Folder Body) +COLOR_ADDON_HIGHLIGHT=$MAIN_HILIGHT # 高光 (原 #98c1f1 -> 对应 Folder Top) +COLOR_ADDON_SHADOW=$MAIN_SHADOW # 阴影 (原 #1c71d8 -> 对应 Folder Shadow) +COLOR_ADDON_DEEP=$MAIN_DARKER_SHADOW # 轮廓 (原 #1a5fb4 -> 对应 Folder Deep) + +# ------------------------------------------------------------------------------ +# [6] 字体文件 (font-x-generic.svg) +# ------------------------------------------------------------------------------ +COLOR_FONT_A=$MAIN_SHADOW # 字母 "A" (原 #3584e4) +COLOR_FONT_BASE=$MAIN_DARKER_SHADOW # 底座/阴影 (原 #1a5fb4) + +# ------------------------------------------------------------------------------ +# [7] Office 文档 (x-office-document.svg) +# ------------------------------------------------------------------------------ +COLOR_DOC_PAPER=$PAPER_COLOR # 纸张白 +COLOR_DOC_FOLD=$PAPER_FOLE_COLOR # 折角灰 +# 绿色渐变 -> 映射为 Tertiary (强调色) +COLOR_DOC_GRAD_ACCENT_START=$INVERSE_MAIN_COLOR # 原 #50db81 +COLOR_DOC_GRAD_ACCENT_END=$INVERSE_MAIN_COLOR # 原 #8ff0a4 +# 蓝色阴影 -> 映射为 Primary (主色) +COLOR_DOC_GRAD_SHADE_START=$MAIN_COLOR # 原 #4a86cf +COLOR_DOC_GRAD_SHADE_END=$INVERSE_MAIN_COLOR # 原 #87bae1 + +# ------------------------------------------------------------------------------ +# [8] Office 演示文稿 (x-office-presentation.svg) +# ------------------------------------------------------------------------------ +# 你的要求:饼图蓝色变 Folder 色,绿色变 Accent 色 +COLOR_PRES_CHART_BLUE=$MAIN_COLOR # 饼图-蓝 (Folder Body) +COLOR_PRES_CHART_BLUE_DEEP=$MAIN_SHADOW # 饼图-深蓝 (Folder Shadow) +COLOR_PRES_CHART_GREEN=$INVERSE_MAIN_COLOR # 饼图-绿 (Accent Body) +COLOR_PRES_CHART_GREEN_DEEP=$INVERSE_MAIN_SHADOW # 饼图-深绿 (Accent Dark) +# 支架颜色 (保持中性灰或微调) +COLOR_PRES_STAND_DARK="{{colors.outline.default.hex}}" +COLOR_PRES_STAND_LIGHT="{{colors.outline.default.hex}}" +# ------------------------------------------------------------------------------ +# [10] 音频文件 (audio-x-generic.svg) +# ------------------------------------------------------------------------------ +# 对应之前的光影逻辑,映射到 Tertiary (第三色系) 以保持与其他图标的区别 +# 逻辑:Pale > Highlight > Body > Shadow > Deep +COLOR_AUDIO_PALE="{{colors.tertiary_fixed.default.hex}}" # 最亮高光 (原 #8ff0a4) +COLOR_AUDIO_HIGHLIGHT=$INVERSE_MAIN_HIGHLT # 鲜艳高光 (原 #38ec8b, #38f39d) +COLOR_AUDIO_BODY=$INVERSE_MAIN_COLOR # 主体 (原 #33d17a, #2dbd7d) +COLOR_AUDIO_SHADOW=$INVERSE_MAIN_SHADOW # 阴影/过渡 (原 #26a269) +COLOR_AUDIO_DEEP="{{colors.on_tertiary_container.default.hex}}" # 最深轮廓 (原 #1a6842) + +# ============================================================================== +# [二] 核心逻辑与 Sed 规则生成 +# ============================================================================== + +# 1. 文件夹规则 +CMD_FOLDER=" +s/#a4caee/$COLOR_FOLDER_BODY/g; +s/#438de6/$COLOR_FOLDER_SHADOW/g; +s/#62a0ea/$COLOR_FOLDER_SHADOW/g; +s/#afd4ff/$COLOR_FOLDER_TOP/g; +s/#c0d5ea/$COLOR_FOLDER_TOP/g" + +# 2. 网络规则 +CMD_NETWORK=" +s/#62a0ea/$COLOR_ACCENT_LIGHT/g; +s/#1c71d8/$COLOR_ACCENT_BODY/g; +s/#c0bfbc/$COLOR_ACCENT_BODY/g; +s/#1a5fb4/$COLOR_ACCENT_DARK/g; +s/#14498a/$COLOR_ACCENT_DARK/g; +s/#9a9996/$COLOR_ACCENT_DARK/g; +s/#77767b/$COLOR_FOLDER_SHADOW/g; +s/#241f31/$COLOR_FOLDER_SHADOW/g; +s/#3d3846/$COLOR_FOLDER_SHADOW/g" + + +# 3. 垃圾桶规则 +CMD_TRASH=" +s/#2ec27e/$COLOR_ACCENT_BODY/g; +s/#33d17a/$COLOR_ACCENT_BODY/g; +s/#26a269/$COLOR_ACCENT_DARK/g; +s/#26a168/$COLOR_ACCENT_DARK/g; +s/#9a9996/$COLOR_ACCENT_DARK/g; +s/#c3c2bc/$COLOR_ACCENT_DARK/g; +s/#42d390/$COLOR_ACCENT_LIGHT/g; +s/#ffffff/$COLOR_FOLDER_SHADOW/g; +s/#deddda/$COLOR_TRASH_PAPER/g; +s/#f6f5f4/$COLOR_TRASH_PAPER/g; +s/#77767b/$COLOR_FOLDER_SHADOW/g" + +# 4. 脚本/可执行文件规则 (核心光影修正) +CMD_SCRIPT=" +s/#3584e4/$COLOR_SCRIPT_BODY/g; +s/#99c1f1/$COLOR_SCRIPT_HIGHLIGHT/g; +s/#98c1f1/$COLOR_SCRIPT_HIGHLIGHT/g; +s/#62a0ea/$COLOR_SCRIPT_MID/g; +s/#1c71d8/$COLOR_SCRIPT_SHADOW/g; +s/#1a5fb4/$COLOR_SCRIPT_GEAR/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g; +s/#b3d3f9/$COLOR_SCRIPT_PALE/g" + +# 5. 网页地球仪规则 (已补全所有 Hex) +CMD_HTML=" +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#deddda/$COLOR_DOC_FOLD/g; +s/#b3d3f9/$COLOR_HTML_PALE/g; +s/#d7e8fc/$COLOR_HTML_PALE/g; +s/#62a0ea/$COLOR_HTML_BODY/g; +s/#3584e4/$COLOR_HTML_MID/g; +s/#99c1f1/$COLOR_HTML_HIGHLIGHT/g; +s/#1c71d8/$COLOR_HTML_SHADOW/g; +s/#1a5fb4/$COLOR_HTML_DEEP/g" + +# 6. Addon (拼图) 规则 +CMD_ADDON=" +s/#3584e4/$COLOR_ADDON_BODY/g; +s/#62a0ea/$COLOR_ADDON_HIGHLIGHT/g; +s/#98c1f1/$COLOR_ADDON_HIGHLIGHT/g; +s/#1c71d8/$COLOR_ADDON_SHADOW/g; +s/#1a5fb4/$COLOR_ADDON_DEEP/g" + +# 7. Font (字体) 规则 +CMD_FONT=" +s/#3584e4/$COLOR_FONT_A/g; +s/#1a5fb4/$COLOR_FONT_BASE/g" + +# 8. Document (文档) 规则 +CMD_DOC=" +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#deddda/$COLOR_DOC_FOLD/g; +s/#50db81/$COLOR_DOC_GRAD_ACCENT_START/g; +s/#8ff0a4/$COLOR_DOC_GRAD_ACCENT_END/g; +s/#4a86cf/$COLOR_DOC_GRAD_SHADE_START/g; +s/#87bae1/$COLOR_DOC_GRAD_SHADE_END/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g; +s/#b3d3f9/$COLOR_SCRIPT_PALE/g" + +# 9. Presentation (PPT) 规则 +CMD_PRES=" +s/#4a86cf/$COLOR_PRES_CHART_BLUE/g; +s/#1a5fb4/$COLOR_PRES_CHART_BLUE_DEEP/g; +s/#50db81/$COLOR_PRES_CHART_GREEN/g; +s/#26a269/$COLOR_PRES_CHART_GREEN_DEEP/g; +s/#f6f5f4/$COLOR_DOC_PAPER/g; +s/#ffffff/$COLOR_DOC_PAPER/g; +s/#414140/$COLOR_PRES_STAND_DARK/g; +s/#949390/$COLOR_PRES_STAND_LIGHT/g; +s/#d7e8fc/$COLOR_SCRIPT_PALE/g" + +# 10. Audio (音频) 规则 +# 精确映射 audio-x-generic.svg 中的所有绿色阶 +CMD_AUDIO=" +s/#1a6842/$COLOR_AUDIO_DEEP/g; +s/#26a269/$COLOR_AUDIO_SHADOW/g; +s/#2dbd7d/$COLOR_AUDIO_BODY/g; +s/#2dc47e/$COLOR_AUDIO_BODY/g; +s/#33d17a/$COLOR_AUDIO_BODY/g; +s/#38ec8b/$COLOR_AUDIO_HIGHLIGHT/g; +s/#38f39d/$COLOR_AUDIO_HIGHLIGHT/g; +s/#8ff0a4/$COLOR_AUDIO_PALE/g" +# ============================================================================== +# [三] 执行核心流程 +# ============================================================================== + +TEMPLATE_DIR="$HOME/.config/noctalia/templates/gtk-folder/Adwaita-Matugen" +CURRENT_THEME=$(gsettings get org.gnome.desktop.interface icon-theme | tr -d "'") + +if [[ "$CURRENT_THEME" == "Adwaita-Matugen-A" ]]; then + TARGET_THEME="Adwaita-Matugen-B" +else + TARGET_THEME="Adwaita-Matugen-A" +fi +TARGET_DIR="$HOME/.local/share/icons/$TARGET_THEME" + +# 1. 准备目录 +mkdir -p "$TARGET_DIR" +cp -rf --reflink=auto --no-preserve=mode,ownership "$TEMPLATE_DIR/"* "$TARGET_DIR/" +sed -i "s/Name=.*/Name=$TARGET_THEME/" "$TARGET_DIR/index.theme" + +# 2. 处理 PNG (统一使用文件夹颜色) +find "$TARGET_DIR" -name "*.png" -print0 | xargs -0 -P0 -I {} magick "{}" \ + -channel RGB -colorspace gray -sigmoidal-contrast 10,50% \ + +level-colors "$COLOR_FOLDER_SHADOW","$COLOR_FOLDER_BODY" \ + +channel "{}" + +# 3. 处理 SVG (分模块并行处理) + +# [Group 1] Folders +find "$TARGET_DIR/scalable" \ + \( -name "folder*.svg" -o -name "user-home*.svg" -o -name "user-desktop*.svg" -o -name "user-bookmarks*.svg" -o -name "inode-directory*.svg" \) \ + -print0 | xargs -0 -P0 sed -i "$CMD_FOLDER" + +# [Group 2] Network +find "$TARGET_DIR/scalable" -name "network*.svg" -print0 | xargs -0 -P0 sed -i --follow-symlinks "$CMD_NETWORK" + +# [Group 3] Trash +find "$TARGET_DIR/scalable" -name "user-trash*.svg" -print0 | xargs -0 -P0 sed -i --follow-symlinks "$CMD_TRASH" + +# [Group 4] Mimetypes - Script & Executable +find "$TARGET_DIR/scalable/mimetypes" \ + \( -name "text-x-script*.svg" -o -name "application-x-executable*.svg" \) \ + -print0 | xargs -0 -P0 sed -i "$CMD_SCRIPT" + +# [Group 5] Mimetypes - Addon +find "$TARGET_DIR/scalable/mimetypes" -name "application-x-addon*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_ADDON" + +# [Group 6] Mimetypes - HTML +find "$TARGET_DIR/scalable/mimetypes" -name "text-html*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_HTML" + +# [Group 7] Mimetypes - Font +find "$TARGET_DIR/scalable/mimetypes" -name "font-x-generic*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_FONT" + +# [Group 8] Mimetypes - Document +find "$TARGET_DIR/scalable/mimetypes" -name "x-office-document*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_DOC" + +# [Group 9] Mimetypes - Presentation +find "$TARGET_DIR/scalable/mimetypes" -name "x-office-presentation*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_PRES" +# [Group 10] Mimetypes - Audio +find "$TARGET_DIR/scalable/mimetypes" -name "audio-x-generic*.svg" -print0 | xargs -0 -P0 sed -i "$CMD_AUDIO" +# 4. 应用变更 +gsettings set org.gnome.desktop.interface icon-theme "$TARGET_THEME" +flatpak override --user --env=ICON_THEME="$TARGET_THEME" 2>/dev/null || true + +exit 0 diff --git a/noctalia-dotfiles/.config/noctalia/templates/pywalfox-colors.json b/noctalia-dotfiles/.config/noctalia/templates/pywalfox-colors.json new file mode 100644 index 0000000..9ddf17f --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/pywalfox-colors.json @@ -0,0 +1,22 @@ +{ + "wallpaper": "{{image}}", + "alpha": "100", + "colors": { + "color0": "{{colors.background.default.hex}}", + "color1": "", + "color2": "", + "color3": "", + "color4": "", + "color5": "", + "color6": "", + "color7": "", + "color8": "", + "color9": "", + "color10": "{{colors.primary.default.hex}}", + "color11": "", + "color12": "", + "color13": "{{colors.surface_bright.default.hex}}", + "color14": "", + "color15": "{{colors.on_surface.default.hex}}" + } +} diff --git a/noctalia-dotfiles/.config/noctalia/templates/starship-colors.toml b/noctalia-dotfiles/.config/noctalia/templates/starship-colors.toml new file mode 100644 index 0000000..59047e6 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/starship-colors.toml @@ -0,0 +1,182 @@ +"$schema" = 'https://starship.rs/config-schema.json' +format = """ +[](color_orange)\ +$os\ +$username\ +[](bg:color_yellow fg:color_orange)\ +$directory\ +[](fg:color_yellow bg:color_aqua)\ +$git_branch\ +$git_status\ +[](fg:color_aqua bg:color_blue)\ +$c\ +$cpp\ +$rust\ +$golang\ +$nodejs\ +$php\ +$java\ +$kotlin\ +$haskell\ +$python\ +[](fg:color_blue bg:color_bg3)\ +$docker_context\ +$conda\ +$pixi\ +[](fg:color_bg3 bg:color_bg1)\ +$time\ +[ ](fg:color_bg1)\ +$line_break$character""" +palette = 'colors' + +[palettes.colors] +mustard = '#af8700' +color_orange = '{{colors.primary_fixed_dim.default.hex}}' +color_fg0 = '{{colors.on_primary.default.hex}}' +color_fg1 = '{{colors.on_surface.default.hex}}' +color_purple = '{{colors.on_tertiary_container.default.hex}}' +color_bg3 = '{{colors.secondary.default.hex}}' +color_green = '{{colors.on_primary.default.hex}}' +color_bg1 = '{{colors.secondary_container.default.hex}}' +color_blue = '{{colors.inverse_primary.default.hex}}' +color_red = '{{colors.primary.default.hex}}' +color_aqua = '{{colors.on_secondary_container.default.hex}}' +color_yellow = '{{colors.tertiary.default.hex}}' + +[os] +disabled = false +style = "bg:color_orange fg:color_fg0" + +[os.symbols] +Windows = "󰍲" +Ubuntu = "󰕈" +SUSE = "" +Raspbian = "󰐿" +Mint = "󰣭" +Macos = "󰀵" +Manjaro = "" +Linux = "󰌽" +Gentoo = "󰣨" +Fedora = "󰣛" +Alpine = "" +Amazon = "" +Android = "" +Arch = "󰣇" +Artix = "󰣇" +CachyOS = "󰣇" +EndeavourOS = "" +CentOS = "" +Debian = "󰣚" +Redhat = "󱄛" +RedHatEnterprise = "󱄛" +Pop = "" + +[username] +show_always = true +style_user = "bg:color_orange fg:color_fg0" +style_root = "bg:color_orange fg:color_fg0" +format = '[ $user ]($style)' + +[directory] +style = "fg:color_fg0 bg:color_yellow" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = "󰝚 " +"Pictures" = " " +"Developer" = "󰲋 " + +[git_branch] +symbol = "" +style = "bg:color_aqua" +format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)' + +[git_status] +style = "bg:color_aqua" +format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)' + +[nodejs] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[c] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[cpp] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[rust] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[golang] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[php] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[java] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[kotlin] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg1 bg:color_blue)]($style)' + +[haskell] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[python] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[docker_context] +symbol = "" +style = "bg:color_bg3" +format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)' + +[conda] +style = "bg:color_bg3" +format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)' + +[pixi] +style = "bg:color_bg3" +format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:color_bg1" +format = '[[  $time ](fg:color_fg1 bg:color_bg1)]($style)' + +[line_break] +disabled = false + +[character] +disabled = false +success_symbol = '[](bold fg:color_green)' +error_symbol = '[](bold fg:color_red)' +vimcmd_symbol = '[](bold fg:color_green)' +vimcmd_replace_one_symbol = '[](bold fg:color_purple)' +vimcmd_replace_symbol = '[](bold fg:color_purple)' +vimcmd_visual_symbol = '[](bold fg:color_yellow)' + diff --git a/noctalia-dotfiles/.config/noctalia/templates/yazi-theme.toml b/noctalia-dotfiles/.config/noctalia/templates/yazi-theme.toml new file mode 100644 index 0000000..9d2def8 --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/templates/yazi-theme.toml @@ -0,0 +1,278 @@ +# : Manager [[[ + +[mgr] +cwd = { fg = "{{colors.on_surface.default.hex}}" } + +# Find +find_keyword = { fg = "{{colors.error.default.hex}}", bold = true, italic = true, underline = true } +find_position = { fg = "{{colors.error.default.hex}}", bold = true, italic = true } + +# Marker +marker_copied = { fg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 20.0}}", bg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 20.0}}" } +marker_cut = { fg = "{{colors.tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +marker_marked = { fg = "{{colors.error.default.hex}}", bg = "{{colors.error.default.hex}}" } +marker_selected = { fg = "{{colors.tertiary.default.hex}}", bg = "{{colors.tertiary.default.hex}}" } + +# Count +count_copied = { fg = "{{colors.on_tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +count_cut = { fg = "{{colors.on_tertiary_fixed.default.hex}}", bg = "{{colors.tertiary_fixed.default.hex}}" } +count_selected = { fg = "{{colors.on_primary.default.hex}}", bg = "{{colors.tertiary.default.hex}}" } + +# Border +border_symbol = "│" +border_style = { fg = "{{colors.surface_tint.default.hex}}" } + +# : ]]] + + +# : Indicator [[[ + +[indicator] +padding = { open = "█", close = "█" } + +# : ]]] + + +# : Tabs [[[ + +[tabs] +active = { fg = "{{colors.primary.default.hex}}", bold = true, bg = "{{colors.surface.default.hex}}" } +inactive = { fg = "{{colors.secondary.default.hex}}", bg = "{{colors.surface.default.hex}}" } +sep_inner = { open = "[", close = "]" } + +# : ]]] + + +# : Mode [[[ + +[mode] +# Mode +normal_main = { bg = "{{colors.primary.default.hex}}", fg = "{{colors.on_primary.default.hex}}", bold = true } +normal_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# Select mode +select_main = { bg = "{{colors.secondary.default.hex}}", fg = "{{colors.on_secondary.default.hex}}", bold = true } +select_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# Unset mode +unset_main = { bg = "{{colors.tertiary.default.hex}}", fg = "{{colors.on_tertiary.default.hex}}", bold = true } +unset_alt = { bg = "{{colors.surface_variant.default.hex}}", fg = "{{colors.on_surface_variant.default.hex}}" } + +# : ]]] + + +# : Status [[[ + +[status] +sep_left = { open = "🭁", close = "🭠" } +sep_right = { open = "🭁", close = "🭠" } + +# Permissions +perm_type = { fg = "{{colors.secondary.default.hex | auto_lightness: 30.0}}" } +perm_write = { fg = "{{colors.tertiary.default.hex | auto_lightness: 30.0}}" } +perm_read = { fg = "{{colors.error.default.hex | auto_lightness: 30.0}}" } +perm_exec = { fg = "{{colors.tertiary_fixed.default.hex | auto_lightness: 30.0}}" } +perm_sep = { fg = "{{colors.primary_fixed.default.hex | auto_lightness: 30.0}}" } + +# Progress +progress_label = { bold = true } +progress_normal = { fg = "{{colors.primary.default.hex}}", bg = "{{colors.surface_bright.default.hex}}" } +progress_error = { fg = "{{colors.error.default.hex}}", bg = "{{colors.surface_bright.default.hex}}" } + +# : ]]] + + +# : Which [[[ + +[which] +cols = 3 +mask = { bg = "{{colors.surface_bright.default.hex}}" } +cand = { fg = "{{colors.primary.default.hex}}" } +rest = { fg = "{{colors.on_primary.default.hex}}" } +desc = { fg = "{{colors.on_surface.default.hex}}" } +separator = " ▶ " +separator_style = { fg = "{{colors.on_surface.default.hex}}" } + +# : ]]] + + +# : Notify [[[ + +[notify] +title_info = { fg = "{{colors.tertiary.default.hex}}" } +title_warn = { fg = "{{colors.primary.default.hex}}" } +title_error = { fg = "{{colors.error.default.hex}}" } + +# : ]]] + + +# : Picker [[[ + +[pick] +border = { fg = "{{colors.primary.default.hex}}" } +active = { fg = "{{colors.tertiary.default.hex}}", bold = true } +inactive = {} + +# : ]]] + + +# : Input [[[ + +[input] +border = { fg = "{{colors.primary.default.hex}}" } +value = { fg = "{{colors.on_surface.default.hex}}" } + +# : ]]] + + +# : Completion [[[ + +[cmp] +border = { fg = "{{colors.primary.default.hex}}", bg = "{{colors.on_primary.default.hex}}" } + +# : ]]] + + +# : Tasks [[[ + +[tasks] +border = { fg = "{{colors.primary.default.hex}}" } +title = {} +hovered = { fg = "{{colors.tertiary_fixed.default.hex}}", underline = true } + +# : ]]] + + +# : Help [[[ + +[help] +on = { fg = "{{colors.on_surface.default.hex}}" } +run = { fg = "{{colors.on_surface.default.hex}}" } +footer = { fg = "{{colors.on_secondary.default.hex}}", bg = "{{colors.secondary.default.hex}}" } + +# : ]]] + + +# : File-specific styles [[[ + +[filetype] + +rules = [ + # Images + { mime = "image/*", fg = "#94e2d5" }, + + # Media + { mime = "{audio,video}/*", fg = "#f9e2af" }, + + # Archives + { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#f5c2e7" }, + + # Documents + { mime = "application/{pdf,doc,rtf}", fg = "#a6e3a1" }, + + # Special files + { name = "*", is = "orphan", bg = "{{colors.error_container.default.hex}}" }, + { name = "*", is = "exec", fg = "{{colors.on_error_container.default.hex}}" }, + + # Fallback + { url = "*", fg = "{{colors.on_surface.default.hex}}" }, + { url = "*/", fg = "{{colors.surface_tint.default.hex}}" }, +] + + +# : ]]] +# : Icon [[[ + +[icon] +# ========================================== +# 1. 预设条件 (最高优先级) +# ========================================== +prepend_conds = [ + # 隐藏的文件夹 (半透明或较暗的颜色) + { if = "dir & hidden", text = "", fg = "{{colors.surface_tint.default.hex | auto_lightness: -20.0}}" }, + + # 普通文件夹 - 提到前面来,确保文件夹图标最先被匹配 + { if = "dir", text = "", fg = "{{colors.surface_tint.default.hex}}" }, + + # 损坏的符号链接 (孤儿) - 使用 Error 色 + { if = "orphan", text = "󰌌", fg = "{{colors.error.default.hex}}" }, + # 正常的符号链接 - 使用 Tertiary 固定色 + { if = "link", text = "󰌷", fg = "{{colors.tertiary_fixed.default.hex}}" }, + + # 可执行文件 - 【关键修复:必须排除文件夹 (!dir)】 + { if = "exec & !dir", text = "󰆧", fg = "{{colors.secondary.default.hex}}" }, + + # 普通隐藏文件 (暗淡的文字色) + { if = "hidden", text = "󰈙", fg = "{{colors.on_surface_variant.default.hex}}" }, +] + +# ========================================== +# 2. 预设目录 (特殊文件夹图标与主色调) +# ========================================== +prepend_dirs = [ + # 使用 Primary 颜色高亮常用主目录 + { name = "Desktop", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "Documents", text = "󰈙", fg = "{{colors.primary.default.hex}}" }, + { name = "Downloads", text = "󰇚", fg = "{{colors.primary.default.hex}}" }, + { name = "Pictures", text = "󰉏", fg = "{{colors.primary.default.hex}}" }, + { name = "Music", text = "󰎆", fg = "{{colors.primary.default.hex}}" }, + { name = "Videos", text = "󰕧", fg = "{{colors.primary.default.hex}}" }, + { name = "Public", text = "", fg = "{{colors.primary.default.hex}}" }, + + # 使用 Secondary 颜色标记开发/配置目录 + { name = ".config", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".git", text = "󰊢", fg = "{{colors.secondary.default.hex}}" }, + { name = "Github", text = "󰊢", fg = "{{colors.secondary.default.hex}}" }, + { name = "src", text = "", fg = "{{colors.secondary.default.hex}}" }, +] + +# ========================================== +# 3. 预设文件扩展名 +# ========================================== +prepend_exts = [ + # 图片/媒体 - 使用 Tertiary 颜色 (提供视觉对比) + { name = "png", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "jpg", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "jpeg", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "webp", text = "󰉏", fg = "{{colors.tertiary.default.hex}}" }, + { name = "svg", text = "󰜡", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mp4", text = "󰕧", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mkv", text = "󰕧", fg = "{{colors.tertiary.default.hex}}" }, + { name = "mp3", text = "󰎆", fg = "{{colors.tertiary.default.hex}}" }, + { name = "flac", text = "󰎆", fg = "{{colors.tertiary.default.hex}}" }, + + # 档案/压缩包 - 使用 Error Container 相关的颜色 (以示区别,或可选 tertiary_fixed) + { name = "zip", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "tar", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "gz", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "rar", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + { name = "7z", text = "󰛫", fg = "{{colors.tertiary_fixed_dim.default.hex}}" }, + + # 常用代码/配置文件 - 使用 Primary 或 On Surface 色 + { name = "conf", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "toml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "yaml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "yml", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "json", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "sh", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "bash", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "py", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "rs", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "c", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "cpp", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "md", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "txt", text = "󰈙", fg = "{{colors.on_surface.default.hex}}" }, +] + +# ========================================== +# 4. 预设特定文件名 +# ========================================== +prepend_files = [ + { name = "PKGBUILD", text = "", fg = "{{colors.primary.default.hex}}" }, + { name = "README.md", text = "󰂺", fg = "{{colors.secondary.default.hex}}" }, + { name = "Makefile", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".bashrc", text = "", fg = "{{colors.secondary.default.hex}}" }, + { name = ".zshrc", text = "", fg = "{{colors.secondary.default.hex}}" }, +] + +# : ]]] diff --git a/noctalia-dotfiles/.config/noctalia/user-templates.toml b/noctalia-dotfiles/.config/noctalia/user-templates.toml new file mode 100644 index 0000000..06ba1fd --- /dev/null +++ b/noctalia-dotfiles/.config/noctalia/user-templates.toml @@ -0,0 +1,40 @@ +[config] + +[templates] + +# User-defined templates +# Add your custom templates below +# Example: +# [templates.myapp] +# input_path = "~/.config/noctalia/templates/myapp.css" +# output_path = "~/.config/myapp/theme.css" +# post_hook = "myapp --reload-theme" + +# Remove this section and add your own templates +#[templates.placeholder] +#input_path = "/etc/xdg/quickshell/noctalia-shell/Assets/Templates/noctalia.json" +#output_path = "/home/shorin/.cache/noctalia/placeholder.json" + +[templates.pywalfox] +input_path = '~/.config/noctalia/templates/pywalfox-colors.json' +output_path = '~/.cache/wal/colors.json' +post_hook = 'pywalfox update &' + +[templates.fcitx5] +input_path = '~/.config/noctalia/templates/fcitx5-theme.conf' +output_path = '~/.local/share/fcitx5/themes/Matugen/theme.conf' +post_hook= 'fcitx5 -r & disown ' + +[templates.starship] +input_path = '~/.config/noctalia/templates/starship-colors.toml' +output_path = '~/.config/starship.toml' + +[templates.gtk-folder] +input_path = '~/.config/noctalia/templates/gtk-folder/recolor.sh' +output_path = '~/.cache/matugen/recoloricons.sh' +post_hook = 'bash ~/.cache/matugen/recoloricons.sh &' + +[templates.fastfetch] +input_path = '~/.config/noctalia/templates/fastfetch-config.jsonc' +output_path = '~/.config/fastfetch/config.jsonc' + diff --git a/noctalia-dotfiles/.config/satty/config.toml b/noctalia-dotfiles/.config/satty/config.toml new file mode 100644 index 0000000..63194dc --- /dev/null +++ b/noctalia-dotfiles/.config/satty/config.toml @@ -0,0 +1,15 @@ +[general] +copy-command = "wl-copy" +focus-toggles-toolbars= true +initial-tool = "brush" +zoom-factor=1.1 + +[font] +family = "Roboto" +style = "Regular" +fallback = [ + "Noto Sans CJK SC", + "Noto Sans CJK JP", + "Noto Sans CJK TC", + "Noto Sans CJK KR" +] diff --git a/noctalia-dotfiles/.config/starship.toml b/noctalia-dotfiles/.config/starship.toml new file mode 100644 index 0000000..24687f0 --- /dev/null +++ b/noctalia-dotfiles/.config/starship.toml @@ -0,0 +1,182 @@ +"$schema" = 'https://starship.rs/config-schema.json' +format = """ +[](color_orange)\ +$os\ +$username\ +[](bg:color_yellow fg:color_orange)\ +$directory\ +[](fg:color_yellow bg:color_aqua)\ +$git_branch\ +$git_status\ +[](fg:color_aqua bg:color_blue)\ +$c\ +$cpp\ +$rust\ +$golang\ +$nodejs\ +$php\ +$java\ +$kotlin\ +$haskell\ +$python\ +[](fg:color_blue bg:color_bg3)\ +$docker_context\ +$conda\ +$pixi\ +[](fg:color_bg3 bg:color_bg1)\ +$time\ +[ ](fg:color_bg1)\ +$line_break$character""" +palette = 'colors' + +[palettes.colors] +mustard = '#af8700' +color_orange = '#bec2ff' +color_fg0 = '#1f2578' +color_fg1 = '#e5e1e6' +color_purple = '#ffd8ee' +color_bg3 = '#c5c4dd' +color_green = '#1f2578' +color_bg1 = '#444559' +color_blue = '#4f56a9' +color_red = '#bec2ff' +color_aqua = '#e1e0f9' +color_yellow = '#e7b9d5' + +[os] +disabled = false +style = "bg:color_orange fg:color_fg0" + +[os.symbols] +Windows = "󰍲" +Ubuntu = "󰕈" +SUSE = "" +Raspbian = "󰐿" +Mint = "󰣭" +Macos = "󰀵" +Manjaro = "" +Linux = "󰌽" +Gentoo = "󰣨" +Fedora = "󰣛" +Alpine = "" +Amazon = "" +Android = "" +Arch = "󰣇" +Artix = "󰣇" +CachyOS = "󰣇" +EndeavourOS = "" +CentOS = "" +Debian = "󰣚" +Redhat = "󱄛" +RedHatEnterprise = "󱄛" +Pop = "" + +[username] +show_always = true +style_user = "bg:color_orange fg:color_fg0" +style_root = "bg:color_orange fg:color_fg0" +format = '[ $user ]($style)' + +[directory] +style = "fg:color_fg0 bg:color_yellow" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[directory.substitutions] +"Documents" = "󰈙 " +"Downloads" = " " +"Music" = "󰝚 " +"Pictures" = " " +"Developer" = "󰲋 " + +[git_branch] +symbol = "" +style = "bg:color_aqua" +format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)' + +[git_status] +style = "bg:color_aqua" +format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)' + +[nodejs] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[c] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[cpp] +symbol = " " +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[rust] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[golang] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[php] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[java] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[kotlin] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg1 bg:color_blue)]($style)' + +[haskell] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[python] +symbol = "" +style = "bg:color_blue" +format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)' + +[docker_context] +symbol = "" +style = "bg:color_bg3" +format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)' + +[conda] +style = "bg:color_bg3" +format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)' + +[pixi] +style = "bg:color_bg3" +format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)' + +[time] +disabled = false +time_format = "%R" +style = "bg:color_bg1" +format = '[[  $time ](fg:color_fg1 bg:color_bg1)]($style)' + +[line_break] +disabled = false + +[character] +disabled = false +success_symbol = '[](bold fg:color_green)' +error_symbol = '[](bold fg:color_red)' +vimcmd_symbol = '[](bold fg:color_green)' +vimcmd_replace_one_symbol = '[](bold fg:color_purple)' +vimcmd_replace_symbol = '[](bold fg:color_purple)' +vimcmd_visual_symbol = '[](bold fg:color_yellow)' + diff --git a/noctalia-dotfiles/.config/xdg-terminials.list b/noctalia-dotfiles/.config/xdg-terminials.list new file mode 100644 index 0000000..f53f3ca --- /dev/null +++ b/noctalia-dotfiles/.config/xdg-terminials.list @@ -0,0 +1 @@ +kitty.desktop diff --git a/noctalia-dotfiles/.config/xfce4/helpers.rc b/noctalia-dotfiles/.config/xfce4/helpers.rc new file mode 100644 index 0000000..5226528 --- /dev/null +++ b/noctalia-dotfiles/.config/xfce4/helpers.rc @@ -0,0 +1 @@ +TerminalEmulator=kitty diff --git a/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml b/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml new file mode 100644 index 0000000..e3e9cd4 --- /dev/null +++ b/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar-volman.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml b/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml new file mode 100644 index 0000000..9ac783b --- /dev/null +++ b/noctalia-dotfiles/.config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.config/xsettingsd/xsettingsd.conf b/noctalia-dotfiles/.config/xsettingsd/xsettingsd.conf new file mode 100644 index 0000000..604a5d9 --- /dev/null +++ b/noctalia-dotfiles/.config/xsettingsd/xsettingsd.conf @@ -0,0 +1,9 @@ +Net/ThemeName "adw-gtk3-dark" +Net/IconThemeName "Adwaita-Matugen-B" +Gtk/CursorThemeName "breeze_cursors" +Net/EnableEventSounds 1 +EnableInputFeedbackSounds 0 +Xft/Antialias 1 +Xft/Hinting 1 +Xft/HintStyle "hintslight" +Xft/RGBA "rgb" diff --git a/noctalia-dotfiles/.local/bin/random-anime-wallpaper-noctalia b/noctalia-dotfiles/.local/bin/random-anime-wallpaper-noctalia new file mode 100644 index 0000000..6526693 --- /dev/null +++ b/noctalia-dotfiles/.local/bin/random-anime-wallpaper-noctalia @@ -0,0 +1,163 @@ +#!/bin/bash +set -euo pipefail + +# ============================================================================= +# 功能描述: +# 从指定 API 获取随机壁纸,强制转换为 PNG 格式,并使用 noctalia IPC 协议设置为桌面壁纸。 +# +# 核心特性: +# 1. 异步下载与长耗时心跳通知。 +# 2. 健壮性检查:校验文件大小与 MIME 类型,剔除损坏/无效文件。 +# 3. 格式转换:自动将下载的图片(无论原格式)转换为 noctalia 支持的 PNG 格式。 +# 4. 资源自清洁:根据配置自动清理历史壁纸,保持存储整洁。 +# 5. 解耦设计:更新完毕后触发异步的系统 UI 更新钩子 (matugen, niri等)。 +# +# 选项: +# -k: 保留模式,不清理旧壁纸 +# -s: 静默模式,关闭桌面通知 +# -h: 显示帮助信息 +# +# 依赖: +# curl, file, notify-send, ImageMagick (magick 或 convert), qs (noctalia wrapper) +# ============================================================================= + +# ================= 默认配置 ================= +API_URL="https://t.alcy.cc/pc/" +SAVE_DIR="$HOME/Pictures/Wallpapers/api-random-download" + +# 自动清理时保留最近多少张图片 +KEEP_COUNT=40 + +# 默认开关状态 (可被参数覆盖) +ENABLE_CLEANUP=true +SILENT_MODE=false + +# ================= 参数解析 ================= +usage() { + echo "用法: $(basename "$0") [-k] [-s] [-h]" + echo " -k (Keep) 保留模式:不清理旧壁纸" + echo " -s (Silent) 静默模式:不发送任何 notify-send 通知" + echo " -h 帮助信息" + exit 0 +} + +while getopts "ksh" opt; do + case $opt in + k) ENABLE_CLEANUP=false ;; + s) SILENT_MODE=true ;; + h) usage ;; + *) usage ;; + esac +done + +# ================= 辅助函数 ================= + +# 统一通知函数 (兼容 set -u 处理未传递的 $3) +send_notify() { + if [ "$SILENT_MODE" = false ]; then + notify-send "$1" "$2" ${3:-} + fi +} + +# ================= 主逻辑 ================= + +mkdir -p "$SAVE_DIR" +TIMESTAMP=$(date +%s) +RAW_PATH="${SAVE_DIR}/wall_${TIMESTAMP}_raw.tmp" +FINAL_PATH="${SAVE_DIR}/wall_${TIMESTAMP}.png" + +# --- 1. 下载模块 (带心跳通知) --- + +if [ "$SILENT_MODE" = false ]; then + ( + sleep 8 + while true; do + notify-send "Wallpaper" "Downloading is still in progress..." --expire-time=5000 --icon=drive-harddisk --replace-id=999 || true + sleep 8 + done + ) & + NOTIFY_PID=$! +else + NOTIFY_PID="" +fi + +send_notify "Wallpaper" "Downloading from Alcy..." "--expire-time=5000" + +USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" + +# 执行下载并做严格模式下的安全判断 +if ! curl -L -s -A "$USER_AGENT" --connect-timeout 10 -m 120 -o "$RAW_PATH" "$API_URL"; then + [ -n "${NOTIFY_PID:-}" ] && kill "$NOTIFY_PID" 2>/dev/null || true + send_notify "Wallpaper Error" "Download failed (Network/API Error)" + exit 1 +fi + +# 下载结束,杀掉通知进程 +if [ -n "${NOTIFY_PID:-}" ]; then + kill "$NOTIFY_PID" 2>/dev/null || true +fi + +# 校验文件 (大小) +if [ ! -f "$RAW_PATH" ] || [ "$(wc -c < "$RAW_PATH")" -lt 20480 ]; then + send_notify "Wallpaper Error" "Download failed (File too small/Invalid)" + rm -f "$RAW_PATH" + exit 1 +fi + +# 校验文件 (MIME 类型) +FILE_TYPE=$(file --mime-type -b "$RAW_PATH" || echo "unknown") +if [[ "$FILE_TYPE" != image/* ]]; then + send_notify "Wallpaper Error" "Not an image file ($FILE_TYPE)" + rm -f "$RAW_PATH" + exit 1 +fi + +# --- 2. 格式转换模块 (转为 PNG) --- + +# 检查 ImageMagick 是否存在 (兼容新版 magick 和旧版 convert) +if command -v magick > /dev/null 2>&1; then + IMG_TOOL="magick" +elif command -v convert > /dev/null 2>&1; then + IMG_TOOL="convert" +else + send_notify "Wallpaper Error" "ImageMagick not found. Please install it." + rm -f "$RAW_PATH" + exit 1 +fi + +# 执行转换 +if ! $IMG_TOOL "$RAW_PATH" "$FINAL_PATH"; then + send_notify "Wallpaper Error" "Failed to convert image to PNG format" + rm -f "$RAW_PATH" "$FINAL_PATH" + exit 1 +fi + +# 转换成功,清理原始临时文件 +rm -f "$RAW_PATH" + +# --- 3. 应用模块 (noctalia ipc call) --- + +# 使用 qs 包装器调用 noctalia-shell 的 ipc,并将 monitor 参数设为 all +qs -c noctalia-shell ipc call wallpaper set "$FINAL_PATH" all + +# --- 4. 钩子与清理 --- +( + if [ -x "$HOME/.config/scripts/matugen-update.sh" ]; then + "$HOME/.config/scripts/matugen-update.sh" "$FINAL_PATH" > /dev/null || true + fi + + sleep 0.5 + + if [ -x "$HOME/.config/scripts/niri_set_overview_blur_dark_bg.sh" ]; then + "$HOME/.config/scripts/niri_set_overview_blur_dark_bg.sh" > /dev/null || true + fi + + # 动态清理逻辑 + if [ "$ENABLE_CLEANUP" = true ]; then + DELETE_START=$((KEEP_COUNT + 1)) + # 这里的命名规范只包含时间戳,无特殊字符,xargs rm 是安全的 + cd "$SAVE_DIR" && ls -t | tail -n +"$DELETE_START" | xargs -I {} rm -- {} 2>/dev/null || true + fi +) & + +send_notify "Wallpaper Updated" "PNG applied successfully via Noctalia!" diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.prism.bin new file mode 100644 index 0000000..af99a69 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.schema.yaml new file mode 100644 index 0000000..75406a0 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/bopomofo.schema.yaml @@ -0,0 +1,274 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + bopomofo.custom: 0 + bopomofo.schema: 1774017862 + default: 1774018450 + default.custom: 1774339475 + grammar: 0 + key_bindings: 1774018450 + key_bindings.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 + zhuyin: 1774017862 + zhuyin.custom: 0 +custom_phrase: + db_class: stabledb + dictionary: "" + enable_completion: false + enable_sentence: false + initial_quality: 1 + user_dict: custom_phrase +editor: + bindings: + space: toggle_selection +engine: + filters: + - "simplifier@zh_hans" + - "simplifier@zh_hant_tw" + - uniquifier + processors: + - ascii_composer + - recognizer + - key_binder + - speller + - punctuator + - selector + - navigator + - fluency_editor + segmentors: + - ascii_segmentor + - matcher + - abc_segmentor + - punct_segmentor + - fallback_segmentor + translators: + - punct_translator + - "table_translator@custom_phrase" + - reverse_lookup_translator + - script_translator +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} + - {accept: comma, send: comma, when: has_menu} + - {accept: period, send: period, when: has_menu} + - {accept: minus, send: minus, when: has_menu} + - {accept: minus, send: Page_Up, when: paging} + - {accept: equal, send: Page_Down, when: has_menu} + import_preset: default +menu: + alternative_select_keys: ABCDEFGHIJ + page_size: 6 +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ":": [":", ";"] + "<": {commit: ","} + "=": "=" + ">": {commit: "。"} + "?": ["?", "/", "÷"] + "@": ["@", "☯"] + "[": ["「", "【", "《", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "》", "〕", "]"] + "^": {commit: "……"} + _: ["——", "-"] + "`": "`" + "{": ["『", "〖", "〈", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "〉", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ":": [":", ";"] + "<": {commit: ","} + "=": "=" + ">": {commit: "。"} + "?": ["?", "/", "/", "÷"] + "@": "@" + "[": ["「", "【", "《", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "》", "〕", "]"] + "^": {commit: "……"} + _: ["——", "-", "-"] + "`": "`" + "{": ["『", "〖", "〈", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "〉", "}"] + "~": "~" +recognizer: + patterns: + email: "^[a-z][-_.0-9a-z]*@.*$" + reverse_lookup: "`[a-z]*'?$" + uppercase: "^[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp:|mailto:).*$" +reverse_lookup: + comment_format: + - "xform/^m(\\d)$/mu$1/" + - "xform/^r5$/er5/" + - "xform/iu/iou/" + - "xform/ui/uei/" + - "xform/ong/ung/" + - "xform/^yi?/i/" + - "xform/^wu?/u/" + - "xform/iu/v/" + - "xform/^([jqx])u/$1v/" + - "xform/([iuv])n/$1en/" + - "xform/^zhi?/Z/" + - "xform/^chi?/C/" + - "xform/^shi?/S/" + - "xform/^([zcsr])i/$1/" + - "xform/ai/A/" + - "xform/ei/I/" + - "xform/ao/O/" + - "xform/ou/U/" + - "xform/ang/K/" + - "xform/eng/G/" + - "xform/an/M/" + - "xform/en/N/" + - "xform/er/R/" + - "xform/eh/E/" + - "xform/([iv])e/$1E/" + - "xform/1//" + - "xlit|bpmfdtnlgkhjqxZCSrzcsiuvaoeEAIOUMNKGR2345|ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄧㄨㄩㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦˊˇˋ˙|" + dictionary: stroke + enable_completion: true + preedit_format: + - "xlit/hspnz/一丨丿丶乙/" + prefix: "`" + suffix: "'" + tips: "〔筆畫〕" +schema: + author: + - "佛振 " + dependencies: + - stroke + description: | + 注音符號輸入,採用「大千式」鍵盤排列。 + + 本方案採用「無模式」設計,以大寫字母鍵或上下方向鍵、回車鍵選詞; + 空格鍵輸入第一聲,標記爲「ˉ」。 + + 請配合 librime>=1.3 使用。 + + name: "注音" + schema_id: bopomofo + version: 2.4 +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + algebra: + - "xform/^m(\\d)$/mu$1/" + - "xform/^r5$/er5/" + - "xform/iu/iou/" + - "xform/ui/uei/" + - "xform/ong/ung/" + - "xform/^yi?/i/" + - "xform/^wu?/u/" + - "xform/iu/v/" + - "xform/^([jqx])u/$1v/" + - "xform/([iuv])n/$1en/" + - "xform/^zhi?/Z/" + - "xform/^chi?/C/" + - "xform/^shi?/S/" + - "xform/^([zcsr])i/$1/" + - "xform/ai/A/" + - "xform/ei/I/" + - "xform/ao/O/" + - "xform/ou/U/" + - "xform/ang/K/" + - "xform/eng/G/" + - "xform/an/M/" + - "xform/en/N/" + - "xform/er/R/" + - "xform/eh/E/" + - "xform/([iv])e/$1E/" + - "derive/([bpmfdtnlgkhjqxZCSrzcs])([iuv])/$2$1/" + - "derive/([iuv])([aoeEAIOUMNKGR])/$2$1/" + - "derive/([bpmfdtnlgkhjqxZCSrzcs])([aoeEAIOUMNKGR])/$2$1/" + - "derive/([bpmfdtnlgkhjqxZCSrzcs])([iuv])/$2$1/" + - "abbrev/^([bpmfdtnlgkhjqxZCSrzcs]).+$/$1/" + - "abbrev/^([A-Za-z]+)\\d$/$1/" + - "abbrev/^([bpmfdtnlgkhjqxZCSrzcs]).+(\\d)$/$1$2/" + - "xlit|bpmfdtnlgkhjqxZCSrzcsiuvaoeEAIOUMNKGR12345|1qaz2wsxedcrfv5tgbyhnujm8ik,9ol.0p;/- 6347|" + alphabet: "1qaz2wsxedcrfv5tgbyhnujm8ik,9ol.0p;/- 6347" + delimiter: "'" + finals: " 6347" + initials: "1qaz2wsxedcrfv5tgbyhnujm8ik,9ol.0p;/-" + use_space: true +switches: + - name: ascii_mode + reset: 0 + states: ["中文", "西文"] + - name: full_shape + states: ["半角", "全角"] + - options: [zh_hant, zh_hans, zh_hant_tw] + states: ["傳統漢字", "简化字", "臺灣字形"] +translator: + dictionary: terra_pinyin + preedit_format: + - "xlit|1qaz2wsxedcrfv5tgbyhnujm8ik,9ol.0p;/- 6347'|ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄧㄨㄩㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦˉˊˇˋ˙ |" + prism: bopomofo +zh_hans: + excluded_types: + - reverse_lookup + opencc_config: t2s.json + option_name: zh_hans + tips: all +zh_hant_tw: + excluded_types: + - reverse_lookup + opencc_config: t2tw.json + option_name: zh_hant_tw + tips: none \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/default.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/default.yaml new file mode 100644 index 0000000..90be48c --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/default.yaml @@ -0,0 +1,145 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + key_bindings: 1774018450 + key_bindings.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 +ascii_composer: + good_old_caps_lock: true +config_version: 0.50 +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} +menu: + page_size: 6 +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": "@" + "[": ["「", "【", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": ["~", "~"] +recognizer: + patterns: + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +switcher: + abbreviate_options: true + caption: "〔方案選單〕" + fold_options: true + hotkeys: + - "Control+grave" + - "Control+Shift+grave" + - F4 + option_list_separator: "/" + save_options: + - full_shape + - ascii_punct + - simplification + - extended_charset + - zh_hant + - zh_hans + - zh_hant_tw \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.prism.bin new file mode 100644 index 0000000..52d4319 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.schema.yaml new file mode 100644 index 0000000..5a8e6c8 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/double_pinyin_flypy.schema.yaml @@ -0,0 +1,832 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + double_pinyin_flypy.custom: 0 + double_pinyin_flypy.schema: 1774239672 + key_bindings: 1774018450 + key_bindings.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 + symbols_caps_v: 1774239672 + symbols_caps_v.custom: 0 +cn_en: + comment_format: + - "xform/^.+$//" + db_class: stabledb + dictionary: "" + enable_completion: true + enable_sentence: false + initial_quality: 0.5 + user_dict: "en_dicts/cn_en_flypy" +custom_phrase: + db_class: stabledb + dictionary: "" + enable_completion: false + enable_sentence: false + initial_quality: 99 + user_dict: custom_phrase_double +date_translator: + date: date + dateen: dateen + datetime: datetime + datezh: datezh + time: time + timestamp: timestamp + week: week +editor: + bindings: + BackSpace: revert + "Control+BackSpace": back_syllable + "Control+Delete": delete_candidate + "Control+Return": commit_script_text + "Control+Shift+Return": commit_comment + Delete: delete + Escape: cancel + Return: commit_raw_input + space: confirm +emoji: + inherit_comment: false + opencc_config: emoji.json + option_name: emoji +engine: + filters: + - "lua_filter@*corrector" + - "reverse_lookup_filter@radical_reverse_lookup" + - "lua_filter@*autocap_filter" + - "lua_filter@*pin_cand_filter" + - "lua_filter@*reduce_english_filter" + - "simplifier@emoji" + - "simplifier@traditionalize" + - "lua_filter@*search@radical_pinyin" + - uniquifier + processors: + - "lua_processor@*select_character" + - ascii_composer + - recognizer + - key_binder + - speller + - punctuator + - selector + - navigator + - express_editor + segmentors: + - ascii_segmentor + - matcher + - abc_segmentor + - "affix_segmentor@radical_lookup" + - punct_segmentor + - fallback_segmentor + translators: + - punct_translator + - script_translator + - "lua_translator@*date_translator" + - "lua_translator@*lunar" + - "lua_translator@*uuid" + - "table_translator@custom_phrase" + - "table_translator@melt_eng" + - "table_translator@cn_en" + - "table_translator@radical_lookup" + - "lua_translator@*unicode" + - "lua_translator@*number_translator" + - "lua_translator@*calc_translator" + - "lua_translator@*force_gc" +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} + import_preset: default + search: "`" +lunar: lunar +melt_eng: + comment_format: + - "xform/.*//" + dictionary: melt_eng + enable_sentence: false + enable_user_dict: false + initial_quality: 1.1 +menu: + page_size: 6 +pin_cand_filter: + - "d\t的" +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": "@" + "[": ["「", "【", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": ["~", "~"] + symbols: + V0: ["零", "〇", "⁰", "₀", "⓪", "⓿", "0"] + V1: ["一", "壹", "¹", "₁", "Ⅰ", "ⅰ", "①", "➀", "❶", "➊", "⓵", "⑴", "⒈", "1", "㊀", "㈠", "弌", "壱", "幺", "㆒"] + V10: ["十", "拾", "¹⁰", "₁₀", "Ⅹ", "ⅹ", "⑩", "➉", "❿", "➓", "⓾", "⑽", "⒑", "10", "㊉", "㈩", "什"] + V2: ["二", "贰", "²", "₂", "Ⅱ", "ⅱ", "②", "➁", "❷", "➋", "⓶", "⑵", "⒉", "2", "㊁", "㈡", "弍", "弐", "貮", "㒃", "㒳", "两", "俩", "㆓"] + V3: ["三", "叁", "³", "₃", "Ⅲ", "ⅲ", "③", "➂", "❸", "➌", "⓷", "⑶", "⒊", "3", "㊂", "㈢", "参", "参", "叁", "弎", "仨", "㆔"] + V4: ["四", "肆", "⁴", "₄", "Ⅳ", "ⅳ", "④", "➃", "❹", "➍", "⓸", "⑷", "⒋", "4", "㊃", "㈣", "亖"] + V5: ["五", "伍", "⁵", "₅", "Ⅴ", "ⅴ", "⑤", "➄", "❺", "➎", "⓹", "⑸", "⒌", "5", "㊄", "㈤", "㐅", "㠪", "𠄡"] + V6: ["六", "陆", "⁶", "₆", "Ⅵ", "ⅵ", "⑥", "➅", "❻", "➏", "⓺", "⑹", "⒍", "6", "㊅", "㈥", "ↅ"] + V7: ["七", "柒", "⁷", "₇", "Ⅶ", "ⅶ", "⑦", "➆", "❼", "➐", "⓻", "⑺", "⒎", "7", "㊆", "㈦", "漆"] + V8: ["八", "捌", "⁸", "₈", "Ⅷ", "ⅷ", "⑧", "➇", "❽", "➑", "⓼", "⑻", "⒏", "8", "㊇", "㈧"] + V9: ["九", "玖", "⁹", "₉", "Ⅸ", "ⅸ", "⑨", "➈", "❾", "➒", "⓽", "⑼", "⒐", "9", "㊈", "㈨"] + VA: ["Ā", "Á", "Ǎ", "À", "Ȁ", "Â", "Ă", "Ȃ", "Ȧ", "Ä", "Å", "Ã", "ᴀ", "ᴬ", "Ⱥ", "Ả", "Ą", "Ạ", "Ḁ", "Ấ", "Ầ", "Ẫ", "Ẩ", "Ắ", "Ằ", "Ẵ", "Ẳ", "Ǡ", "Ǟ", "Ǻ", "Ậ", "Ặ", "Ɐ", "Ɑ", "Ɒ"] + VAA: ["Ꜳ"] + VAE: ["Æ", "Ǣ", "Ǽ", "ᴭ", "ᴁ"] + VAO: ["Ꜵ"] + VAU: ["Ꜷ"] + VAV: ["Ꜹ", "Ꜻ"] + VAY: ["Ꜽ"] + VB: ["Ḃ", "Ḅ", "ʙ", "ᴃ", "ᴮ", "ᴯ", "Ƀ", "Ƃ", "Ḇ", "Ɓ", "Ꞗ"] + VC: ["Ç", "Ć", "Č", "Ĉ", "Ċ", "ᴄ", "Ȼ", "Ꞓ", "Ƈ", "Ḉ", "Ꜿ"] + VD: ["Ď", "Ḋ", "ᴅ", "ᴆ", "ᴰ", "Đ", "Ƌ", "Ḑ", "Ḓ", "Ḏ", "Ḍ", "Ɖ", "Ɗ", "Ð", "DZ", "Dz", "DŽ", "Dž"] + VE: ["Ē", "É", "Ě", "È", "Ȅ", "Ê", "Ĕ", "Ȇ", "Ė", "Ë", "Ẽ", "ᴇ", "ᴱ", "Ɇ", "Ẻ", "Ȩ", "Ę", "Ḙ", "Ẹ", "Ḛ", "Ḗ", "Ḕ", "Ế", "Ề", "Ễ", "Ể", "Ḝ", "Ệ", "Ə", "Ɛ", "Ɜ", "Ǝ", "ⱻ", "ᴲ", "Ȝ"] + VF: ["Ḟ", "ꜰ", "Ƒ", "Ꞙ", "ꟻ"] + VG: ["Ḡ", "Ǵ", "Ǧ", "Ĝ", "Ğ", "Ġ", "ʛ", "ᴳ", "Ǥ", "Ꞡ", "Ģ", "Ɠ", "Ɡ", "Ɣ"] + VH: ["Ĥ", "Ȟ", "Ḣ", "Ḧ", "ʜ", "ᴴ", "Ħ", "Ɦ", "Ꜧ", "Ḩ", "Ḫ", "Ḥ", "Ⱨ", "Ɥ", "Ⱶ"] + VHV: ["Ƕ"] + VI: ["Ī", "Í", "Ǐ", "Ì", "Ȉ", "Î", "Ĭ", "Ȋ", "Ï", "Ĩ", "ɪ", "ᴵ", "ᶦ", "Ɨ", "ᵻ", "ᶧ", "Ỉ", "Į", "Ị", "Ḭ", "Ḯ", "ꟾ", "Ɩ"] + VIJ: ["IJ"] + VJ: ["Ĵ", "ᴊ", "ᴶ", "Ɉ", "Ʝ"] + VK: ["Ḱ", "Ǩ", "ᴋ", "ᴷ", "Ꝁ", "Ꝃ", "Ꞣ", "Ꝅ", "Ķ", "Ḵ", "Ḳ", "Ƙ", "Ⱪ", "Ʞ"] + VL: ["Ĺ", "ʟ", "ᶫ", "Ƚ", "Ꝉ", "Ł", "ᴌ", "Ⱡ", "Ɫ", "Ɬ", "Ľ", "Ļ", "Ḻ", "Ḽ", "Ḷ", "Ŀ", "Ꝇ"] + VLL: ["Ỻ"] + VM: ["Ḿ", "Ṁ", "ᴍ", "ᴹ", "Ṃ", "Ɱ", "Ɯ", "ꟽ", "ꟿ"] + VN: ["Ń", "Ň", "Ǹ", "Ṅ", "Ñ", "ɴ", "ᴺ", "ᴻ", "ᶰ", "Ɲ", "Ƞ", "Ŋ", "Ņ", "Ṉ", "Ṋ", "Ṇ", "Ꞑ"] + VNJ: ["NJ"] + VNj: ["Nj"] + VO: ["Ō", "Ó", "Ő", "Ǒ", "Ò", "Ô", "Ŏ", "Ȯ", "Ö", "Õ", "ᴏ", "ᴼ", "Ɔ", "ᴐ", "Ø", "Ǫ", "Ọ", "Ơ", "Ɵ", "Ꝋ", "Ꝍ", "Ṓ", "Ṑ", "Ố", "Ồ", "Ỗ", "Ổ", "Ȱ", "Ȫ", "Ȭ", "Ṍ", "Ṏ", "Ộ", "Ǭ", "Ǿ", "Ớ", "Ờ", "Ỡ", "Ở", "Ợ"] + VOE: ["Œ", "ɶ"] + VOI: ["Ƣ"] + VOO: ["Ꝏ"] + VOU: ["Ȣ", "ᴽ"] + VP: ["Ṕ", "Ṗ", "ᴘ", "ᴾ", "Ᵽ", "Ꝑ", "Ƥ", "Ꝓ", "Ꝕ", "ꟼ"] + VQ: ["Ɋ", "Ꝗ", "Ꝙ"] + VR: ["Ŕ", "Ř", "Ȑ", "Ȓ", "Ṙ", "ʀ", "ᴙ", "ᴿ", "Ʀ", "ꭆ", "Ɍ", "Ꞧ", "Ŗ", "Ṟ", "Ṛ", "Ṝ", "Ɽ", "ꝶ", "ʶ", "ʁ", "Ꝛ", "Ꝝ"] + VRx: ["℞"] + VS: ["Ś", "Ŝ", "Š", "Ṡ", "ꜱ", "Ꞩ", "Ş", "Ṣ", "Ș", "Ṥ", "Ṧ", "Ṩ", "Ʃ", "ẞ"] + VT: ["Ť", "Ṫ", "ᴛ", "ᵀ", "Ʈ", "Þ", "Ꝥ", "Ꝧ", "Ŧ", "Ⱦ", "Ţ", "Ṯ", "Ṱ", "Ṭ", "Ț", "Ƭ", "Ʇ"] + VTZ: ["Ꜩ"] + VU: ["Ū", "Ú", "Ű", "Ǔ", "Ù", "Ȕ", "Û", "Ŭ", "Ȗ", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ů", "Ũ", "ᴜ", "ᵁ", "ᶸ", "Ʉ", "Ủ", "Ų", "Ṷ", "Ụ", "Ṳ", "Ṵ", "Ư", "Ʊ", "Ṻ", "Ṹ", "Ứ", "Ừ", "Ữ", "Ử", "Ự"] + VV: ["Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ṽ", "ᴠ", "ⱽ", "Ṿ", "Ꝟ", "Ʋ", "Ỽ", "Ʌ"] + VVY: ["Ꝡ"] + VW: ["Ẃ", "Ẁ", "Ŵ", "Ẇ", "Ẅ", "W̊", "ᴡ", "ᵂ", "Ẉ", "Ƿ", "Ⱳ"] + VX: ["Ẋ", "Ẍ"] + VY: ["Ȳ", "Ý", "Ỳ", "Ŷ", "Ẏ", "Ÿ", "Ỹ", "ʏ", "Ɏ", "Ỷ", "Ỵ", "Ƴ", "Ỿ"] + VZ: ["Ź", "Ž", "Ẑ", "Ż", "ᴢ", "Ƶ", "Ẕ", "Ẓ", "Ȥ", "Ⱬ", "Ʒ", "ᴣ", "Ǯ", "Ƹ", "Ɀ", "Ꝣ"] + Va: ["ā", "á", "ǎ", "à", "ȁ", "â", "ă", "ȃ", "ȧ", "ä", "å", "ã", "ₐ", "ᵃ", "ª", "ⱥ", "ꬰ", "ả", "ą", "ạ", "ḁ", "ẚ", "ấ", "ầ", "ẫ", "ẩ", "ắ", "ằ", "ẵ", "ẳ", "ǡ", "ǟ", "ǻ", "ậ", "ặ", "ᶏ", "ɐ", "ᵄ", "ɑ", "ᵅ", "ᶐ", "ɒ", "ᶛ"] + Vaa: ["ꜳ"] + Vae: ["æ", "ǣ", "ǽ", "ᵆ", "ᴂ"] + Vao: ["ꜵ"] + Vau: ["ꜷ"] + Vav: ["ꜹ", "ꜻ"] + Vay: ["ꜽ"] + Vb: ["ḃ", "ḅ", "ᵇ", "ƀ", "ƃ", "ḇ", "ɓ", "ᵬ", "ᶀ", "ꞗ"] + Vbd: ["、", "。", "「", "」", "『", "』", "【", "】", "〈", "〉", "《", "》", "₋", "⁻", "―", "˗", "ˉ", "_", "﹍", "﹎", ".", "¡", "‼", "⁉", "¿", "؟", "⁈", "⁇", "、", "。", "〃", "〄", "々", "〆", "〇", "〒", "〓", "〔", "〕", "〖", "〗", "〘", "〙", "〚", "〛", "〜", "〝", "〞", "〟", "〠", "〰", "〱", "〲", "〳", "〴", "〵", "〶", "〷", "〻", "〼", "〽"] + Vbdz: ["﹅", "﹆", "﹁", "﹂", "﹃", "﹄", "︙", "︱", "︻", "︼", "︗", "︘", "︵", "︶", "︷", "︸", "︹", "︺", "︿", "﹀", "︽", "︾", "︰", "︲", "︳", "︴", "﹉", "﹊", "﹋", "﹌", "﹍", "﹎", "﹏", "﹇", "﹈", "︐", "︑", "︒", "︔", "︕", "︖"] + Vbdzy: ["‐", "‑", "‒", "–", "—", "―", "‖", "‗", "‘", "’", "‚", "‛", "“", "”", "„", "‟", "†", "‡", "•", "‣", "․", "‥", "…", "‧", "‰", "‱", "′", "″", "‴", "‵", "‶", "‷", "‸", "‹", "›", "※", "‼", "‽", "‾", "‿", "⁀", "⁁", "⁂", "⁃", "⁄", "⁅", "⁆", "⁇", "⁈", "⁉", "⁊", "⁋", "⁌", "⁍", "⁎", "⁏", "⁐", "⁑", "⁒", "⁓", "⁔", "⁕", "⁖", "⁗", "⁘", "⁙", "⁚", "⁛", "⁜", "⁝", "⁞"] + Vbg: ["☰", "☱", "☲", "☳", "☴", "☵", "☶", "☷"] + Vbgm: ["乾", "兑", "离", "震", "巽", "坎", "艮", "坤"] + Vbh: ["㇀", "㇁", "㇂", "㇃", "㇄", "㇅", "㇆", "㇇", "㇈", "㇉", "㇊", "㇋", "㇌", "㇍", "㇎", "㇏", "㇐", "㇑", "㇒", "㇓", "㇔", "㇕", "㇖", "㇗", "㇘", "㇙", "㇚", "㇛", "㇜", "㇝", "㇞", "㇟", "㇠", "㇡", "㇢", "㇣"] + Vbq: ["☻", "☺", "☹"] + Vc: ["ç", "ć", "č", "ĉ", "ċ", "ᶜ", "ȼ", "ꞓ", "ƈ", "ḉ", "ꞔ", "ɕ", "ᶝ", "ꜿ"] + Vd: ["ď", "ḋ", "ᵈ", "đ", "ƌ", "ᵭ", "ḑ", "ḓ", "ḏ", "ḍ", "ɖ", "ɗ", "ᶑ", "ᶁ", "ð", "ᶞ", "ꝱ", "ʤ", "ʣ", "ʥ", "ȡ", "ƍ", "dz", "dž", "ẟ"] + Vdb: ["ȸ"] + Vdh: ["。", ".", ",", "、", ":", ";", "!", "‼", "?", "⁇"] + Vdn: ["❖", "⌘", "⌃", "⌥", "⎇", "⇧", "⇪", "␣", "⇥", "⇤", "↩", "⌅", "⌤", "⌫", "⌦", "⌧", "⎋", "⌨", "◁", "⌀", "⌖", "⌗", "⏏", "↖", "↘", "⇞", "⇟", "⌚", "⏰", "⏱", "⏲", "⏳", "⌛", "⌜", "⌝⌞⌟", "⍑", "⏩", "⏪", "⏫", "⏬", "⏭", "⏮", "⏯"] + Vdw: ["Å", "℃", "%", "‰", "‱", "°", "℉", "㏃", "㏆", "㎈", "㏄", "㏅", "㎝", "㎠", "㎤", "㏈", "㎗", "㎙", "㎓", "㎬", "㏉", "㏊", "㏋", "㎐", "㏌", "㎄", "㎅", "㎉", "㎏", "㎑", "㏍", "㎘", "㎞", "㏎", "㎢", "㎦", "㎪", "㏏", "㎸", "㎾", "㏀", "㏐", "㏓", "㎧", "㎨", "㎡", "㎥", "㎃", "㏔", "㎆", "㎎", "㎒", "㏕", "㎖", "㎜", "㎟", "㎣", "㏖", "㎫", "㎳", "㎷", "㎹", "㎽", "㎿", "㏁", "㎁", "㎋", "㎚", "㎱", "㎵", "㎻", "㏘", "㎩", "㎀", "㎊", "㏗", "㏙", "㏚", "㎰", "㎴", "㎺", "㎭", "㎮", "㎯", "㏛", "㏜", "㎔", "㏝", "㎂", "㎌", "㎍", "㎕", "㎛", "㎲", "㎶", "㎼"] + Vdz: ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] + Ve: ["ē", "é", "ě", "è", "ȅ", "ê", "ĕ", "ȇ", "ė", "ë", "ẽ", "ₑ", "ᵉ", "ɇ", "ꬳ", "ẻ", "ȩ", "ę", "ḙ", "ẹ", "ḛ", "ḗ", "ḕ", "ế", "ề", "ễ", "ể", "ḝ", "ệ", "ᶒ", "ꬴ", "ɘ", "ə", "ɚ", "ᶕ", "ɛ", "ᵋ", "ᶓ", "ɜ", "ᵌ", "ᴈ", "ᶟ", "ɝ", "ᶔ", "ɞ", "ʚ", "ǝ", "ₔ", "ᵊ", "ȝ", "ⱸ"] + Vey: ["а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"] + Veyd: ["А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"] + Vf: ["ḟ", "ᶠ", "ƒ", "ᵮ", "ᶂ", "ꞙ"] + Vff: ["ff"] + Vffi: ["ffi"] + Vffl: ["ffl"] + Vfh: ["©", "®", "℗", "℠", "™", "℡", "℻", "☇", "☈", "☉", "☊", "☋", "☌", "☍", "☎", "☏", "☐", "☑", "☒", "☓", "☕", "☖", "☗", "⛉", "⛊", "☘", "☙", "☚", "☛", "☜", "☝", "☞", "☟", "☠", "☡", "☢", "☣", "☤", "☥", "☦", "☧", "☨", "☩", "☪", "☫", "☬", "☭", "☮", "☯", "☸", "♨", "♰", "♱", "♲", "♳", "♴", "♵", "♶", "♷", "♸", "♹", "♺", "♻", "♼", "♽", "♾", "♿", "⚆", "⚇", "⚈", "⚉", "⚐", "⚑", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚘", "⚙", "⚚", "⚛", "⚜", "⚝", "⚞", "⚟", "⚠", "⚡", "⚰", "⚱", "⚲", "⚳", "⚴", "⚵", "⚶", "⚷", "⚸", "⚹", "⚺", "⚻", "⚼", "⚽", "⚾", "⚿", "⛀", "⛁", "⛂", "⛃", "⛋", "⛌", "⛍", "⛎", "⛏", "⛐", "⛑", "⛒", "⛓", "⛔", "⛕", "⛖", "⛗", "⛘", "⛙", "⛚", "⛛", "⛜", "⛝", "⛞", "⛟", "⛠", "⛡", "⛢", "⛣", "⛨", "⛩", "⛪", "⛫", "⛬", "⛭", "⛮", "⛯", "⛰", "⛱", "⛲", "⛳", "⛴", "⛵", "⛶", "⛷", "⛸", "⛹", "⛺", "⛻", "⛼", "⛽", "⛾", "⛿"] + Vfi: ["fi"] + Vfjz: ["⸺", "——", "……", "⋯⋯", "~", "-", "–", "—", "·", "・", "‧", "/", "/"] + Vfk: ["▀", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊", "▋", "▌", "▍", "▎", "▏", "▐", "░", "▒", "▓", "▔", "▕", "▖", "▗", "▘", "▙", "▚", "▛", "▜", "▝", "▞", "▟"] + Vfl: ["fl"] + Vfn: ["ʩ"] + Vfs: ["⅟", "½", "↉", "⅓", "⅔", "¼", "⅕", "⅖", "⅗", "⅘", "⅙", "⅚", "⅐", "⅛", "⅜", "⅝", "⅞", "⅑", "⅒"] + Vg: ["ḡ", "ǵ", "ǧ", "ĝ", "ğ", "ġ", "ᵍ", "ǥ", "ꞡ", "ģ", "ɠ", "ᵷ", "ᶃ", "ɡ", "ꬶ", "ᶢ", "ɣ", "ˠ", "ɤ", "ᵹ"] + Vgz: ["甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"] + Vh: ["ĥ", "ȟ", "ḣ", "ḧ", "ͪ", "ħ", "ɦ", "ʱ", "ꜧ", "ꭜ", "ɧ", "ḩ", "ẖ", "ḫ", "ḥ", "ⱨ", "ꞕ", "ɥ", "ᶣ", "ʮ", "ʯ", "ⱶ"] + Vhb: ["¥", "¥", "¤", "¢", "¢", "$", "$", "£", "£", "৳", "฿", "₠", "₡", "₢", "₣", "₤", "₥", "₦", "₧", "₩", "₪", "₫", "€", "₭", "₮", "₯", "₰", "₱", "₲", "₳", "₴", "₵", "₶", "₷", "₸", "₹", "₺", "₨", "﷼"] + Vhj: ["_", "﹏", "●", "•"] + Vhv: ["ƕ"] + Vhw: ["ㄱ", "ㄴ", "ㄷ", "ㄹ", "ㅁ", "ㅂ", "ㅅ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"] + Vhwh: ["㈀", "㈁", "㈂", "㈃", "㈄", "㈅", "㈆", "㈇", "㈈", "㈉", "㈊", "㈋", "㈌", "㈍", "㈎", "㈏", "㈐", "㈑", "㈒", "㈓", "㈔", "㈕", "㈖", "㈗", "㈘", "㈙", "㈚", "㈛", "㈜", "㈝", "㈞"] + Vhwq: ["㉠", "㉡", "㉢", "㉣", "㉤", "㉥", "㉦", "㉧", "㉨", "㉩", "㉪", "㉫", "㉬", "㉭", "㉮", "㉯", "㉰", "㉱", "㉲", "㉳", "㉴", "㉵", "㉶", "㉷", "㉸", "㉹", "㉺", "㉻", "㉼", "㉽", "㉾", "㉿"] + Vhzh: ["㈠", "㈡", "㈢", "㈣", "㈤", "㈥", "㈦", "㈧", "㈨", "㈩", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈱", "㈲", "㈳", "㈴", "㈵", "㈶", "㈷", "㈸", "㈹", "㈺", "㈻", "㈼", "㈽", "㈾", "㈿", "㉀", "㉁", "㉂", "㉃"] + Vhzq: ["㊀", "㊁", "㊂", "㊃", "㊄", "㊅", "㊆", "㊇", "㊈", "㊉", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊑", "㊒", "㊓", "㊔", "㊕", "㊖", "㊗", "㊘", "㊙", "㊚", "㊛", "㊜", "㊝", "㊞", "㊟", "㊠", "㊡", "㊢", "㊣", "㊤", "㊥", "㊦", "㊧", "㊨", "㊩", "㊪", "㊫", "㊬", "㊭", "㊮", "㊯", "㊰", "㉄", "㉅", "㉆", "㉇"] + Vi: ["ī", "í", "ǐ", "ì", "ȉ", "î", "ĭ", "ȋ", "ï", "ĩ", "ᵢ", "ı", "ɨ", "ᶤ", "ỉ", "į", "ị", "ḭ", "ᴉ", "ᵎ", "ḯ", "ᶖ", "ɩ", "ᶥ", "ᵼ"] + Vij: ["ij"] + Viro: ["い", "ろ", "は", "に", "ほ", "へ", "と", "ち", "り", "ぬ", "る", "を", "わ", "か", "よ", "た", "れ", "そ", "つ", "ね", "な", "ら", "む", "う", "ゐ", "の", "お", "く", "や", "ま", "け", "ふ", "こ", "え", "て", "あ", "さ", "き", "ゆ", "め", "み", "し", "ゑ", "ひ", "も", "せ", "す"] + Vj: ["ĵ", "ǰ", "ⱼ", "ʲ", "ɉ", "ȷ", "ɟ", "ᶡ", "ʄ", "ʝ", "ᶨ"] + Vjg: ["⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿼", "⿸", "⿹", "⿺", "⿽", "⿻", "⿾", "⿿", "〾"] + Vjh: ["■", "□", "▢", "▣", "▤", "▥", "▦", "▧", "▨", "▩", "▪", "▫", "▬", "▭", "▮", "▯", "▰", "▱", "▲", "△", "▴", "▵", "▶", "▷", "▸", "▹", "►", "▻", "▼", "▽", "▾", "▿", "◀", "◁", "◂", "◃", "◄", "◅", "◆", "◇", "◈", "◉", "◊", "○", "◌", "◍", "◎", "●", "◐", "◑", "◒", "◓", "◔", "◕", "◖", "◗", "◘", "◙", "◚", "◛", "◜", "◝", "◞", "◟", "◠", "◡", "◢", "◣", "◤", "◥", "◦", "◧", "◨", "◩", "◪", "◫", "◬", "◭", "◮", "◯", "◰", "◱", "◲", "◳", "◴", "◵", "◶", "◷", "◸", "◹", "◺", "◻", "◼", "◽", "◾", "◿"] + Vjm: ["あ", "ぁ", "い", "ぃ", "う", "ぅ", "え", "ぇ", "お", "ぉ", "か", "ゕ", "が", "き", "ぎ", "く", "ぐ", "け", "ゖ", "げ", "こ", "ご", "さ", "ざ", "し", "じ", "す", "ず", "せ", "ぜ", "そ", "ぞ", "た", "だ", "ち", "ぢ", "つ", "っ", "づ", "て", "で", "と", "ど", "な", "に", "ぬ", "ね", "の", "は", "ば", "ぱ", "ひ", "び", "ぴ", "ふ", "ぶ", "ぷ", "へ", "べ", "ぺ", "ほ", "ぼ", "ぽ", "ま", "み", "む", "め", "も", "や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ら", "り", "る", "れ", "ろ", "わ", "ゎ", "ゐ", "ゔ", "ゑ", "を", "ん", "・", "ー", "ゝ", "ゞ", "ゟ"] + Vjma: ["あ", "か", "が", "さ", "ざ", "た", "だ", "な", "は", "ば", "ぱ", "ま", "や", "ら", "わ", "ア", "カ", "ガ", "サ", "ザ", "タ", "ダ", "ナ", "ハ", "バ", "パ", "マ", "ヤ", "ラ", "ワ"] + Vjmb: ["ば", "び", "ぶ", "べ", "ぼ", "バ", "ビ", "ブ", "ベ", "ボ"] + Vjmbj: ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "ッ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "・", "ー", "゙", "゚"] + Vjmd: ["だ", "ぢ", "づ", "で", "ど", "ダ", "ヂ", "ヅ", "デ", "ド"] + Vjme: ["え", "け", "げ", "せ", "ぜ", "て", "で", "ね", "へ", "べ", "ぺ", "め", "れ", "ゑ", "エ", "ケ", "ゲ", "セ", "ゼ", "テ", "デ", "ネ", "ヘ", "ベ", "ペ", "メ", "レ", "ヱ"] + Vjmg: ["が", "ぎ", "ぐ", "げ", "ご", "ガ", "ギ", "グ", "ゲ", "ゴ"] + Vjmh: ["は", "ひ", "ふ", "へ", "ほ", "ハ", "ヒ", "フ", "ヘ", "ホ"] + Vjmi: ["い", "き", "ぎ", "し", "じ", "ち", "ぢ", "に", "ひ", "び", "ぴ", "み", "り", "ゐ", "イ", "キ", "ギ", "シ", "ジ", "チ", "ヂ", "ニ", "ヒ", "ビ", "ピ", "ミ", "リ", "ヰ"] + Vjmk: ["か", "ゕ", "き", "く", "け", "ゖ", "こ", "カ", "ヵ", "キ", "ク", "ケ", "ヶ", "コ"] + Vjmm: ["ま", "み", "む", "め", "も", "マ", "ミ", "ム", "メ", "モ"] + Vjmn: ["な", "に", "ぬ", "ね", "の", "ん", "ナ", "ニ", "ヌ", "ネ", "ノ", "ン"] + Vjmo: ["お", "こ", "ご", "そ", "ぞ", "と", "ど", "の", "ほ", "ぼ", "ぽ", "も", "ろ", "を", "オ", "コ", "ゴ", "ソ", "ゾ", "ト", "ド", "ノ", "ホ", "ボ", "ポ", "モ", "ロ", "ヲ"] + Vjmp: ["ぱ", "ぴ", "ぷ", "ぺ", "ぽ", "パ", "ピ", "プ", "ペ", "ポ"] + Vjmq: ["㋐", "㋑", "㋒", "㋓", "㋔", "㋕", "㋖", "㋗", "㋘", "㋙", "㋚", "㋛", "㋜", "㋝", "㋞", "㋟", "㋠", "㋡", "㋢", "㋣", "㋤", "㋥", "㋦", "㋧", "㋨", "㋩", "㋪", "㋫", "㋬", "㋭", "㋮", "㋯", "㋰", "㋱", "㋲", "㋳", "㋴", "㋵", "㋶", "㋷", "㋸", "㋹", "㋺", "㋻", "㋼", "㋽", "㋾"] + Vjmr: ["ら", "り", "る", "れ", "ろ", "ラ", "リ", "ル", "レ", "ロ"] + Vjms: ["さ", "し", "す", "せ", "そ", "サ", "シ", "ス", "セ", "ソ"] + Vjmt: ["た", "ち", "つ", "っ", "て", "と", "タ", "チ", "ツ", "ッ", "テ", "ト"] + Vjmu: ["う", "く", "ぐ", "す", "ず", "つ", "づ", "ぬ", "ふ", "ぶ", "ぷ", "む", "る", "ウ", "ク", "グ", "ス", "ズ", "ツ", "ヅ", "ヌ", "フ", "ブ", "プ", "ム", "ル"] + Vjmw: ["わ", "ゐ", "ゑ", "を", "ワ", "ヰ", "ヱ", "ヲ"] + Vjmy: ["や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ"] + Vjmz: ["ざ", "じ", "ず", "ぜ", "ぞ", "ザ", "ジ", "ズ", "ゼ", "ゾ"] + Vjq: ["立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒"] + Vjt: ["↑", "↓", "←", "→", "↕", "↔", "↖", "↗", "↙", "↘", "↚", "↛", "↮", "↜", "↝", "↞", "↟", "↠", "↡", "↢", "↣", "↤", "↥", "↦", "↧", "↨", "↩", "↪", "↫", "↬", "↭", "↯", "↰", "↱", "↲", "↳", "↴", "↵", "↶", "↷", "↸", "↹", "↺", "↻", "↼", "↽", "↾", "↿", "⇀", "⇁", "⇂", "⇃", "⇄", "⇅", "⇆", "⇇", "⇈", "⇉", "⇊", "⇋", "⇌", "⇐", "⇍", "⇑", "⇒", "⇏", "⇓", "⇔", "⇎", "⇕", "⇖", "⇗", "⇘", "⇙", "⇚", "⇛", "⇜", "⇝", "⇞", "⇟", "⇠", "⇡", "⇢", "⇣", "⇤", "⇥", "⇦", "⇧", "⇨", "⇩", "⇪", "⇫", "⇬", "⇭", "⇮", "⇯", "⇰", "⇱", "⇲", "⇳", "⇴", "⇵", "⇶", "⇷", "⇸", "⇹", "⇺", "⇻", "⇼", "⇽", "➔", "➘", "➙", "➚", "➛", "➜", "➝", "➞", "➟", "➠", "➡", "➢", "➣", "➤", "➥", "➦", "➧", "➨", "➩", "➪", "➫", "➬", "➭", "➮", "➱", "➲", "➳", "➴", "➵", "➶", "➷", "➸", "➹", "➺", "➻", "➼", "➽", "➾"] + Vjz: ["「", "」", "『", "』", "“", "”", "‘", "’", "(", ")", "《", "》", "〈", "〉", "【", "】", "〖", "〗", "〔", "〕", "[", "]", "{", "}"] + Vk: ["ḱ", "ǩ", "ₖ", "ᵏ", "ꝁ", "ꝃ", "ꞣ", "ꝅ", "ķ", "ḵ", "ḳ", "ƙ", "ᶄ", "ⱪ", "ʞ", "ĸ"] + Vkx: ["一", "丨", "丶", "丿", "乙", "亅", "二", "亠", "人", "儿", "入", "八", "冂", "冖", "冫", "几", "凵", "刀", "力", "勹", "匕", "匚", "匸", "十", "卜", "卩", "厂", "厶", "又", "口", "囗", "土", "士", "夂", "夊", "夕", "大", "女", "子", "宀", "寸", "小", "尢", "尸", "屮", "山", "巛", "工", "己", "巾", "干", "幺", "广", "廴", "廾", "弋", "弓", "彐", "彡", "彳", "心", "戈", "戶", "手", "支", "攴", "文", "斗", "斤", "方", "无", "日", "曰", "月", "木", "欠", "止", "歹", "殳", "毋", "比", "毛", "氏", "气", "水", "火", "爪", "父", "爻", "爿", "片", "牙", "牛", "犬", "玄", "玉", "瓜", "瓦", "甘", "生", "用", "田", "疋", "疒", "癶", "白", "皮", "皿", "目", "矛", "矢", "石", "示", "禸", "禾", "穴", "立", "竹", "米", "糸", "缶", "网", "羊", "羽", "老", "而", "耒", "耳", "聿", "肉", "臣", "自", "至", "臼", "舌", "舛", "舟", "艮", "色", "艸", "虍", "虫", "血", "行", "衣", "襾", "見", "角", "言", "谷", "豆", "豕", "豸", "貝", "赤", "走", "足", "身", "車", "辛", "辰", "辵", "邑", "酉", "釆", "里", "金", "長", "門", "阜", "隶", "隹", "雨", "靑", "非", "面", "革", "韋", "韭", "音", "頁", "風", "飛", "食", "首", "香", "馬", "骨", "高", "髟", "鬥", "鬯", "鬲", "鬼", "魚", "鳥", "鹵", "鹿", "麥", "麻", "黃", "黍", "黑", "黹", "黽", "鼎", "鼓", "鼠", "鼻", "齊", "齒", "龍", "龜", "龠"] + Vl: ["ĺ", "ˡ", "ł", "ꝉ", "ƚ", "ⱡ", "ɫ", "ꭞ", "ꬸ", "ɬ", "ľ", "ļ", "ḻ", "ḽ", "ḷ", "ŀ", "ꝲ", "ƛ", "ᶅ", "ᶪ", "ɭ", "ᶩ", "ḹ", "ꬷ", "ꭝ", "ꬹ", "ȴ", "ꝇ"] + Vlj: ["lj"] + Vll: ["ỻ"] + Vlm: ["ⅰ", "ⅱ", "ⅲ", "ⅳ", "ⅴ", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "ⅹ", "ⅺ", "ⅻ", "ⅼ", "ⅽ", "ⅾ", "ⅿ"] + Vlmd: ["Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ", "Ⅻ", "Ⅼ", "Ⅽ", "Ⅾ", "Ⅿ"] + Vls: ["ʪ"] + Vlssg: ["䷀", "䷁", "䷂", "䷃", "䷄", "䷅", "䷆", "䷇", "䷈", "䷉", "䷊", "䷋", "䷌", "䷍", "䷎", "䷏", "䷐", "䷑", "䷒", "䷓", "䷔", "䷕", "䷖", "䷗", "䷘", "䷙", "䷚", "䷛", "䷜", "䷝", "䷞", "䷟", "䷠", "䷡", "䷢", "䷣", "䷤", "䷥", "䷦", "䷧", "䷨", "䷩", "䷪", "䷫", "䷬", "䷭", "䷮", "䷯", "䷰", "䷱", "䷲", "䷳", "䷴", "䷵", "䷶", "䷷", "䷸", "䷹", "䷺", "䷻", "䷼", "䷽", "䷾", "䷿"] + Vlssgm: ["乾", "坤", "屯", "蒙", "需", "讼", "师", "比", "小畜", "履", "泰", "否", "同人", "大有", "谦", "豫", "随", "蛊", "临", "观", "噬嗑", "贲", "剥", "复", "无妄", "大畜", "颐", "大过", "坎", "离", "咸", "恒", "遯", "大壮", "晋", "明夷", "家人", "睽", "蹇", "解", "损", "益", "夬", "姤", "萃", "升", "困", "井", "革", "鼎", "震", "艮", "渐", "归妹", "丰", "旅", "巽", "兑", "涣", "节", "中孚", "小过", "既济", "未济"] + Vlx: ["♂", "♀", "⚢", "⚣", "⚤", "⚥", "⚦", "⚧", "⚨", "⚩", "⚪", "⚫", "⚬", "⚭", "⚮", "⚯"] + Vlz: ["ʫ", "ɮ"] + Vm: ["ḿ", "ṁ", "ᵐ", "ₘ", "ṃ", "ᵯ", "ɱ", "ᶬ", "ꬺ", "ᶆ", "ꝳ", "ɯ", "ᵚ", "ɰ", "ᶭ", "ᴟ"] + Vmj: ["🀀", "🀁", "🀂", "🀃", "🀄", "🀅", "🀆", "🀇", "🀈", "🀉", "🀊", "🀋", "🀌", "🀍", "🀎", "🀏", "🀐", "🀑", "🀒", "🀓", "🀔", "🀕", "🀖", "🀗", "🀘", "🀙", "🀚", "🀛", "🀜", "🀝", "🀞", "🀟", "🀠", "🀡", "🀢", "🀣", "🀤", "🀥", "🀦", "🀧", "🀨", "🀩", "🀪", "🀫"] + Vn: ["ń", "ň", "ǹ", "ṅ", "ñ", "ₙ", "ⁿ", "ɲ", "ᶮ", "ɳ", "ᶯ", "ȵ", "ƞ", "ŋ", "ᵑ", "ꬻ", "ꬼ", "ꝴ", "ʼn", "ꞥ", "ņ", "ṉ", "ṋ", "ṇ", "ᵰ", "ꞑ", "ᶇ"] + Vnj: ["nj"] + Vo: ["ō", "ó", "ǒ", "ò", "ő", "ô", "ŏ", "ȯ", "ö", "õ", "ₒ", "ᵒ", "º", "ɔ", "ᵓ", "ᶗ", "ꬿ", "ø", "ǫ", "ọ", "ơ", "ɵ", "ᶱ", "ᴑ", "ᴒ", "ᴓ", "ꝋ", "ꝍ", "ṓ", "ṑ", "ố", "ồ", "ỗ", "ổ", "ȱ", "ȫ", "ȭ", "ṍ", "ṏ", "ộ", "ǭ", "ǿ", "ớ", "ờ", "ỡ", "ở", "ợ", "ɷ", "ⱺ", "ᴖ", "ᵔ", "ᴗ", "ᵕ"] + Voe: ["œ", "ᴔ"] + Voi: ["ƣ"] + Voo: ["ꝏ"] + Vou: ["ȣ"] + Vp: ["ṕ", "ṗ", "ᵖ", "ᵽ", "ꝑ", "ᵱ", "ƥ", "ᶈ", "ꝓ", "ꝕ", "ɸ", "ᶲ", "ⱷ"] + Vpjm: ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "ヵ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ヶ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ツ", "ッ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヮ", "ヰ", "ヸ", "ヴ", "ヱ", "ヹ", "ヲ", "ヺ", "ン", "・", "ー", "ヽ", "ヾ", "ヿ", "ㇰ", "ㇱ", "ㇲ", "ㇳ", "ㇴ", "ㇵ", "ㇶ", "ㇷ", "ㇸ", "ㇹ", "ㇺ", "ㇻ", "ㇼ", "ㇽ", "ㇾ", "ㇿ"] + Vpk: ["♠", "♥", "♣", "♦", "♤", "♡", "♧", "♢"] + Vpp: ["乛", "冫", "丷", "龹", "⺌", "龸", "亻", "亼", "亽", "仒", "冖", "冂", "冃", "冄", "宀", "罒", "㓁", "罓", "冈", "凵", "厶", "刂", "勹", "匚", "匸", "卩", "阝", "厂", "丆", "广", "壬", "訁", "讠", "釒", "钅", "飠", "饣", "龺", "攵", "夂", "夊", "尢", "尣", "兂", "旡", "巜", "巛", "彐", "彑", "彡", "彳", "龰", "辶", "廴", "㞢", "忄", "㣺", "扌", "爫", "龵", "廾", "歺", "癶", "氵", "氺", "火", "灬", "爿", "丬", "疒", "牜", "⺶", "犭", "豕", "豸", "虍", "艹", "卝", "龷", "丗", "龶", "芈", "丵", "菐", "黹", "礻", "衤", "糸", "糹", "纟", "龻", "镸", "髟", "襾", "覀", "吅", "㗊", "㠭", "㸚", "叕"] + Vpy: ["ā", "á", "ǎ", "à", "ō", "ó", "ǒ", "ò", "ê", "ê̄", "ế", "ê̌", "ề", "ē", "é", "ě", "è", "ī", "í", "ǐ", "ì", "ū", "ú", "ǔ", "ù", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ḿ", "m̀", "ń", "ň", "ǹ", "ẑ", "ĉ", "ŝ", "ŋ"] + Vpyd: ["Ā", "Á", "Ǎ", "À", "Ō", "Ó", "Ǒ", "Ò", "Ê", "Ê̄", "Ế", "Ê̌", "Ề", "Ē", "É", "Ě", "È", "Ī", "Í", "Ǐ", "Ì", "Ū", "Ú", "Ǔ", "Ù", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ḿ", "M̀", "Ń", "Ň", "Ǹ", "Ẑ", "Ĉ", "Ŝ", "Ŋ"] + Vq: ["ɋ", "ꝗ", "ꝙ", "ʠ"] + Vqp: ["ȹ"] + Vr: ["ŕ", "ř", "ȑ", "ȓ", "ṙ", "ᵣ", "ɍ", "ꞧ", "ᵲ", "ŗ", "ṟ", "ṛ", "ṝ", "ᵳ", "ɽ", "ᶉ", "ꭇ", "ꭈ", "ꭊ", "ꭉ", "ꝵ", "ꭋ", "ꭌ", "ɹ", "ʴ", "ɺ", "ɻ", "ʵ", "ⱹ", "ɼ", "ʳ", "ɾ", "ɿ", "ꝛ", "ꝝ"] + Vrq: ["㏠", "㏡", "㏢", "㏣", "㏤", "㏥", "㏦", "㏧", "㏨", "㏩", "㏪", "㏫", "㏬", "㏭", "㏮", "㏯", "㏰", "㏱", "㏲", "㏳", "㏴", "㏵", "㏶", "㏷", "㏸", "㏹", "㏺", "㏻", "㏼", "㏽", "㏾"] + Vs: [Vs., "🆚", "ś", "ŝ", "š", "ṡ", "ˢ", "ʂ", "ᶳ", "ᵴ", "ꞩ", "ᶊ", "ş", "ṣ", "ș", "ȿ", "ṥ", "ṧ", "ṩ", "ʃ", "ᶴ", "ʆ", "ᶘ", "ʅ", "ƪ", "ß", "ſ", "ẛ", "ẜ", "ẝ"] + Vsb: ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹", "˜", "⁺", "⁻", "⁼", "⁽", "⁾", "ᴬ", "ᵃ", "ᵄ", "ᵅ", "ᶛ", "ᴭ", "ᵆ", "ᴮ", "ᴯ", "ᵇ", "ᵝ", "ᶜ", "ᵓ", "ᶝ", "ᴰ", "ᵈ", "ᶞ", "ᵟ", "ᴱ", "ᵉ", "ᴲ", "ᵊ", "ᵋ", "ᶟ", "ᵌ", "ᶠ", "ᶡ", "ᶲ", "ᵠ", "ᴳ", "ᵍ", "ᶢ", "ˠ", "ᵞ", "ᴴ", "ʰ", "ᶣ", "ʱ", "ᴵ", "ⁱ", "ᶤ", "ᵎ", "ᶥ", "ᴶ", "ʲ", "ᶨ", "ᴷ", "ᵏ", "ᴸ", "ᶫ", "ˡ", "ᶩ", "ᶪ", "ᴹ", "ᵐ", "ᶬ", "ᵚ", "ᶭ", "ᴺ", "ᴻ", "ⁿ", "ᵑ", "ᶮ", "ᶯ", "ᴼ", "ᵒ", "ᶱ", "ᴽ", "ᴾ", "ᵖ", "ᴿ", "ʳ", "ʶ", "ʴ", "ʵ", "ˢ", "ᶴ", "ᶳ", "ᵀ", "ᵗ", "ᶵ", "ᶿ", "ᵁ", "ᵘ", "ᶶ", "ᶷ", "ᵙ", "ⱽ", "ᵛ", "ᶺ", "ᶹ", "ᵂ", "ʷ", "ˣ", "ᵡ", "ʸ", "ᶻ", "ᶾ", "ᶽ", "ᶼ"] + Vsd: ["ˉ", "ˊ", "ˇ", "ˋ", "ˆ", "˙", "˜", "˥", "˦", "˧", "˨", "˩", "꜀", "꜁", "꜂", "꜃", "꜄", "꜅", "꜆", "꜇", "〪", "〫", "〬", "〭"] + Vsj: ["㍘", "㍙", "㍚", "㍛", "㍜", "㍝", "㍞", "㍟", "㍠", "㍡", "㍢", "㍣", "㍤", "㍥", "㍦", "㍧", "㍨", "㍩", "㍪", "㍫", "㍬", "㍭", "㍮", "㍯", "㍰"] + Vsx: ["±", "÷", "×", "∈", "∏", "∑", "-", "+", "<", "≮", "=", "≠", ">", "≯", "∕", "√", "∝", "∞", "∟", "∠", "∥", "¬", "⊕", "∧", "∨", "∩", "∪", "∫", "∮", "∴", "∵", "∷", "∽", "≈", "≌", "≒", "≡", "≤", "≥", "≦", "≧", "⊕", "⊖", "⊗", "⊙", "⊥", "⊿", "㏑", "㏒"] + Vsz: ["⚀", "⚁", "⚂", "⚃", "⚄", "⚅"] + Vszd: ["⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙", "⒚", "⒛"] + Vszh: ["⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽", "⑾", "⑿", "⒀", "⒁", "⒂", "⒃", "⒄", "⒅", "⒆", "⒇"] + Vszm: ["〡", "〢", "〣", "〤", "〥", "〦", "〧", "〨", "〩", "〸", "〹", "〺"] + Vszq: ["⓪", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳", "㉑", "㉒", "㉓", "㉔", "㉕", "㉖", "㉗", "㉘", "㉙", "㉚", "㉛", "㉜", "㉝", "㉞", "㉟", "㊱", "㊲", "㊳", "㊴", "㊵", "㊶", "㊷", "㊸", "㊹", "㊺", "㊻", "㊼", "㊽", "㊾", "㊿", "⓿", "❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿", "⓫", "⓬", "⓭", "⓮", "⓯", "⓰", "⓱", "⓲", "⓳", "⓴"] + Vt: ["ť", "ṫ", "ẗ", "ᵗ", "ₜ", "ʈ", "þ", "ꝥ", "ꝧ", "ŧ", "ⱦ", "ţ", "ṯ", "ṱ", "ṭ", "ț", "ƭ", "ᵵ", "ƫ", "ᶵ", "ʇ", "ȶ", "ꝷ"] + Vtc: ["ʨ"] + Vtg: ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] + Vth: ["ᵺ"] + Vtq: ["☀", "☁", "⛅", "⛈", "⛆", "☂", "☔", "☃", "⛄", "⛇"] + Vts: ["ʦ", "ʧ"] + Vtt: ["☉", "☼", "☽", "☾", "☿", "♀", "♁", "🜨", "♂", "♃", "♄", "♅", "⛢", "♆", "♇", "⚳", "☄"] + Vtxj: ["⚊", "⚋", "⚌", "⚍", "⚎", "⚏", "𝌀", "𝌁", "𝌂", "𝌃", "𝌄", "𝌅", "𝌆", "𝌇", "𝌈", "𝌉", "𝌊", "𝌋", "𝌌", "𝌍", "𝌎", "𝌏", "𝌐", "𝌑", "𝌒", "𝌓", "𝌔", "𝌕", "𝌖", "𝌗", "𝌘", "𝌙", "𝌚", "𝌛", "𝌜", "𝌝", "𝌞", "𝌟", "𝌠", "𝌡", "𝌢", "𝌣", "𝌤", "𝌥", "𝌦", "𝌧", "𝌨", "𝌩", "𝌪", "𝌫", "𝌬", "𝌭", "𝌮", "𝌯", "𝌰", "𝌱", "𝌲", "𝌳", "𝌴", "𝌵", "𝌶", "𝌷", "𝌸", "𝌹", "𝌺", "𝌻", "𝌼", "𝌽", "𝌾", "𝌿", "𝍀", "𝍁", "𝍂", "𝍃", "𝍄", "𝍅", "𝍆", "𝍇", "𝍈", "𝍉", "𝍊", "𝍋", "𝍌", "𝍍", "𝍎", "𝍏", "𝍐", "𝍑", "𝍒", "𝍓", "𝍔", "𝍕", "𝍖"] + Vtz: ["ꜩ"] + Vu: ["ū", "ú", "ǔ", "ù", "ű", "ȕ", "û", "ŭ", "ȗ", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ů", "ũ", "ᵤ", "ᵘ", "ʉ", "ᶶ", "ủ", "ų", "ṷ", "ụ", "ṳ", "ṵ", "ư", "ʊ", "ᶷ", "ᵿ", "ᶙ", "ṻ", "ṹ", "ứ", "ừ", "ữ", "ử", "ự", "ꭒ", "ꭟ", "ꝸ", "ꭎ", "ꭏ", "ᴝ", "ᵙ", "ᴞ"] + Vue: ["ᵫ"] + Vv: ["ü", "ǖ", "ǘ", "ǚ", "ǜ", "ṽ", "ᵛ", "ᵥ", "ṿ", "ꝟ", "ʋ", "ᶹ", "ᶌ", "ⱴ", "ⱱ", "ỽ", "ʌ", "ᶺ"] + Vvy: ["ꝡ"] + Vw: ["ẃ", "ẁ", "ŵ", "ẇ", "ẅ", "ẘ", "ʷ", "ẉ", "ƿ", "ʍ", "ⱳ"] + Vww: ["ʬ"] + Vx: ["ẋ", "ẍ", "ᶍ", "ˣ", "ₓ", "ꭖ", "ꭗ", "ꭘ", "ꭙ"] + Vxb: ["₀", "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉", "₊", "₋", "₌", "₍", "₎", "‸", "ᴀ", "ₐ", "ᴁ", "ʙ", "ᴃ", "ᵦ", "ᴄ", "ᴐ", "ᴒ", "ᴅ", "ᴆ", "ᴇ", "ₑ", "ₔ", "ᵩ", "ɢ", "ʛ", "ᴦ", "ᵧ", "ʜ", "ₕ", "ɪ", "ᵻ", "ᵢ", "ᴊ", "ⱼ", "ᴋ", "ₖ", "ʟ", "ₗ", "ᴌ", "ᴧ", "ᴍ", "ₘ", "ꟺ", "ɴ", "ᴎ", "ₙ", "ᴏ", "ₒ", "ɶ", "ʘ", "ᴓ", "ᴑ", "ᴘ", "ₚ", "ᴨ", "ᴪ", "ʀ", "ᵣ", "ᴙ", "ʁ", "ᴚ", "ᵨ", "ₛ", "ᴛ", "ₜ", "ᴜ", "ᵤ", "ᵾ", "ᴠ", "ᵥ", "ᴡ", "ₓ", "ᵪ", "ʏ", "ᴢ", "ᴣ"] + Vxh: ["★", "☆", "⛤", "⛥", "⛦", "⛧", "✡", "❋", "❊", "❉", "❈", "❇", "❆", "❅", "❄", "❃", "❂", "❁", "❀", "✿", "✾", "✽", "✼", "✻", "✺", "✹", "✸", "✷", "✶", "✵", "✴", "✳", "✲", "✱", "✰", "✯", "✮", "✭", "✬", "✫", "✪", "✩", "✧", "✦", "✥", "✤", "✣", "✢"] + Vxl: ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω"] + Vxld: ["Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω"] + Vxq: ["♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟"] + Vxz: ["♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓"] + Vxzg: ["白羊宫", "金牛宫", "双子宫", "巨蟹宫", "狮子宫", "室女宫", "天秤宫", "天蝎宫", "人马宫", "摩羯宫", "宝瓶宫", "双鱼宫"] + Vxzm: ["白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "室女座", "天秤座", "天蝎座", "人马座", "摩羯座", "宝瓶座", "双鱼座"] + Vy: ["ȳ", "ý", "ỳ", "ŷ", "ẏ", "ÿ", "ẙ", "ỹ", "ʸ", "ɏ", "ỷ", "ỵ", "ƴ", "ʎ", "ỿ", "ꭚ"] + Vyf: ["㋀", "㋁", "㋂", "㋃", "㋄", "㋅", "㋆", "㋇", "㋈", "㋉", "㋊", "㋋"] + Vyr: ["月", "火", "水", "木", "金", "土", "日", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊗", "㊡", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈷", "㉁", "㉀"] + Vyy: ["𝄞", "𝄡", "𝄢", "♯", "♭", "𝄪", "𝄫", "♮", "𝄴", "𝄵", "𝅜", "𝅝", "𝅗𝅥", "𝅘𝅥", "𝅘𝅥𝅮", "𝅘𝅥𝅯", "𝅘𝅥𝅰", "𝄺", "𝄻", "𝄼", "𝄽", "𝄾", "𝄿", "𝅀", "♩", "♪", "♫", "♬"] + Vz: ["ź", "ž", "ẑ", "ż", "ᶻ", "ʐ", "ᶼ", "ʑ", "ᶽ", "ƶ", "ẕ", "ẓ", "ᵶ", "ȥ", "ⱬ", "ᶎ", "ʒ", "ᶾ", "ǯ", "ʓ", "ƹ", "ƺ", "ᶚ", "θ", "ᶿ", "ɀ", "ꝣ"] + Vzmh: ["⒜", "⒝", "⒞", "⒟", "⒠", "⒡", "⒢", "⒣", "⒤", "⒥", "⒦", "⒧", "⒨", "⒩", "⒪", "⒫", "⒬", "⒭", "⒮", "⒯", "⒰", "⒱", "⒲", "⒳", "⒴", "⒵"] + Vzmq: ["ⓐ", "Ⓐ", "ⓑ", "Ⓑ", "ⓒ", "Ⓒ", "ⓓ", "Ⓓ", "ⓔ", "Ⓔ", "ⓕ", "Ⓕ", "ⓖ", "Ⓖ", "ⓗ", "Ⓗ", "ⓘ", "Ⓘ", "ⓙ", "Ⓙ", "ⓚ", "Ⓚ", "ⓛ", "Ⓛ", "ⓜ", "Ⓜ", "ⓝ", "Ⓝ", "ⓞ", "Ⓞ", "ⓟ", "Ⓟ", "ⓠ", "Ⓠ", "ⓡ", "Ⓡ", "ⓢ", "Ⓢ", "ⓣ", "Ⓣ", "ⓤ", "Ⓤ", "ⓥ", "Ⓥ", "ⓦ", "Ⓦ", "ⓧ", "Ⓧ", "ⓨ", "Ⓨ", "ⓩ", "Ⓩ"] + Vzy: ["ㄅ", "ㄆ", "ㄇ", "ㄈ", "ㄉ", "ㄊ", "ㄋ", "ㄌ", "ㄍ", "ㄎ", "ㄏ", "ㄐ", "ㄑ", "ㄒ", "ㄓ", "ㄔ", "ㄕ", "ㄖ", "ㄗ", "ㄘ", "ㄙ", "ㄧ", "ㄨ", "ㄩ", "ㄚ", "ㄛ", "ㄜ", "ㄝ", "ㄞ", "ㄟ", "ㄠ", "ㄡ", "ㄢ", "ㄣ", "ㄤ", "ㄥ", "ㄦ", "ㄪ", "ㄫ", "ㄬ", "ㄭ", "ㆠ", "ㆡ", "ㆢ", "ㆣ", "ㆤ", "ㆥ", "ㆦ", "ㆧ", "ㆨ", "ㆩ", "ㆪ", "ㆫ", "ㆬ", "ㆭ", "ㆮ", "ㆯ", "ㆰ", "ㆱ", "ㆲ", "ㆳ", "ㆴ", "ㆵ", "ㆶ", "ㆷ"] +radical_lookup: + comment_format: + - "erase/^.*$//" + dictionary: radical_pinyin + enable_user_dict: false + prefix: uU + tag: radical_lookup + tips: " 〔拆字〕" +radical_reverse_lookup: + dictionary: rime_ice + tags: + - radical_lookup +recognizer: + import_preset: default + patterns: + calculator: "^cC.+" + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + gregorian_to_lunar: "^N[0-9]{1,8}" + number: "^R[0-9]+[.]?[0-9]*" + punct: "^V([0-9]|10|[A-Za-z]+)$" + radical_lookup: "^uU[a-z]+$" + unicode: "^U[a-f0-9]+" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +reduce_english_filter: + idx: 2 + mode: custom + words: + - aid + - ann + - bail + - bait + - bam + - band + - bans + - bat + - bay + - bend + - bent + - benz + - bib + - bid + - bien + - biz + - boc + - bop + - bos + - bud + - buf + - bach + - bench + - bush + - cab + - cad + - cain + - cam + - cans + - cap + - cef + - chad + - chan + - chap + - chef + - cher + - chew + - chic + - chin + - chip + - chit + - coup + - cum + - cunt + - cur + - couch + - dab + - dag + - dal + - dam + - dent + - dew + - dial + - diet + - dim + - din + - dip + - dis + - dit + - doug + - dub + - dug + - dunn + - fab + - fax + - fob + - fog + - foul + - fur + - gag + - gail + - gain + - gal + - gam + - gaol + - ged + - gel + - ger + - guam + - gus + - gut + - hail + - ham + - hank + - hans + - hat + - hay + - heil + - heir + - hem + - hep + - hud + - hum + - hung + - hunk + - hut + - hush + - jim + - jug + - kat + - lab + - lad + - lag + - laid + - lam + - laos + - lap + - lat + - lax + - lay + - led + - leg + - lex + - liam + - lib + - lid + - lied + - lien + - lies + - linn + - lip + - lit + - liz + - lob + - lug + - lund + - lung + - lux + - lash + - loch + - lush + - mag + - maid + - mann + - mar + - mat + - med + - mel + - mend + - mens + - ment + - mil + - mins + - mint + - mob + - moc + - mop + - mos + - mot + - mud + - mug + - mum + - mesh + - nap + - nat + - nay + - neil + - nib + - nip + - noun + - nous + - nun + - nut + - nail + - nash + - pac + - paid + - pail + - pain + - pair + - pak + - pal + - pam + - pans + - pant + - pap + - par + - pat + - paw + - pax + - pens + - pic + - pier + - pies + - pins + - pint + - pit + - pix + - pod + - pop + - pos + - pot + - pour + - pow + - pub + - pinch + - pouch + - rand + - rant + - rent + - rep + - res + - ret + - rex + - rib + - rid + - rig + - rim + - rub + - rug + - rum + - runc + - runs + - ranch + - sac + - sail + - sal + - sam + - sans + - sap + - saw + - sax + - sew + - sham + - shaw + - shin + - sig + - sin + - sip + - sis + - suit + - sung + - suns + - sup + - sur + - sus + - tad + - tail + - taj + - tar + - tax + - tec + - ted + - tel + - ter + - tex + - tic + - tied + - tier + - ties + - tim + - tin + - tit + - tour + - tout + - tum + - wag + - wand + - womens + - wap + - wax + - weir + - won + - yan + - yen + - zach +schema: + author: + - Dvel + dependencies: + - melt_eng + - radical_pinyin + description: | + 雾凇拼音 - 小鹤双拼 + https://github.com/iDvel/rime-ice + + name: "小鹤双拼" + schema_id: double_pinyin_flypy + version: 1 +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + algebra: + - "erase/^xx$/" + - "derive/^([jqxy])u$/$1v/" + - "derive/^([aoe])([ioun])$/$1$1$2/" + - "xform/^([aoe])(ng)?$/$1$1$2/" + - "xform/iu$/Ⓠ/" + - "xform/(.)ei$/$1Ⓦ/" + - "xform/uan$/Ⓡ/" + - "xform/[uv]e$/Ⓣ/" + - "xform/un$/Ⓨ/" + - "xform/^sh/Ⓤ/" + - "xform/^ch/Ⓘ/" + - "xform/^zh/Ⓥ/" + - "xform/uo$/Ⓞ/" + - "xform/ie$/Ⓟ/" + - "xform/(.)i?ong$/$1Ⓢ/" + - "xform/ing$|uai$/Ⓚ/" + - "xform/(.)ai$/$1Ⓓ/" + - "xform/(.)en$/$1Ⓕ/" + - "xform/(.)eng$/$1Ⓖ/" + - "xform/[iu]ang$/Ⓛ/" + - "xform/(.)ang$/$1Ⓗ/" + - "xform/ian$/Ⓜ/" + - "xform/(.)an$/$1Ⓙ/" + - "xform/(.)ou$/$1Ⓩ/" + - "xform/[iu]a$/Ⓧ/" + - "xform/iao$/Ⓝ/" + - "xform/(.)ao$/$1Ⓒ/" + - "xform/ui$/Ⓥ/" + - "xform/in$/Ⓑ/" + - "xlit/ⓆⓌⓇⓉⓎⓊⒾⓄⓅⓈⒹⒻⒼⒽⒿⓀⓁⓏⓍⒸⓋⒷⓃⓂ/qwrtyuiopsdfghjklzxcvbnm/" + alphabet: "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA`" + delimiter: " '" + initials: zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA +switches: + - name: ascii_mode + states: ["中", "A"] + - name: ascii_punct + states: ["¥", "$"] + - name: traditionalization + states: ["简", "繁"] + - name: emoji + reset: 1 + states: ["💀", "😄"] + - name: full_shape + states: ["半角", "全角"] + - abbrev: ["词", "单"] + name: search_single_char + states: ["正常", "单字"] +traditionalize: + opencc_config: s2t.json + option_name: traditionalization + tags: + - abc + - number + - gregorian_to_lunar + tips: none +translator: + always_show_comments: true + comment_format: + - "xform/^/[/" + - "xform/$/]/" + dictionary: rime_ice + enable_word_completion: true + initial_quality: 1.2 + preedit_format: + - "xform/(^|[ '])aa/$1a/" + - "xform/(^|[ '])ee/$1e/" + - "xform/(^|[ '])oo/$1o/" + - "xform/([bpmfdtnljqx])n/$1iao/" + - "xform/(\\w)g/$1eng/" + - "xform/(\\w)q/$1iu/" + - "xform/(\\w)w/$1ei/" + - "xform/([dtnlgkhjqxyvuirzcs])r/$1uan/" + - "xform/(\\w)t/$1ve/" + - "xform/(\\w)y/$1un/" + - "xform/([dtnlgkhvuirzcs])o/$1uo/" + - "xform/(\\w)p/$1ie/" + - "xform/([jqx])s/$1iong/" + - "xform/(\\w)s/$1ong/" + - "xform/(\\w)d/$1ai/" + - "xform/(\\w)f/$1en/" + - "xform/(\\w)h/$1ang/" + - "xform/(\\w)j/$1an/" + - "xform/([gkhvuirzcs])k/$1uai/" + - "xform/(\\w)k/$1ing/" + - "xform/([jqxnlb])l/$1iang/" + - "xform/(\\w)l/$1uang/" + - "xform/(\\w)z/$1ou/" + - "xform/([gkhvuirzcs])x/$1ua/" + - "xform/(\\w)x/$1ia/" + - "xform/(\\w)c/$1ao/" + - "xform/([dtgkhvuirzcs])v/$1ui/" + - "xform/(\\w)b/$1in/" + - "xform/(\\w)m/$1ian/" + - "xform/([aoe])\\1(\\w)/$1$2/" + - "xform/(^|[ '])v/$1zh/" + - "xform/(^|[ '])i/$1ch/" + - "xform/(^|[ '])u/$1sh/" + - "xform/([jqxy])v/$1u/" + - "xform/([nl])v/$1ü/" + - "xform/ü/v/" + - "xform/(?<=[A-Z])\\s(?=[A-Z])//" + prism: double_pinyin_flypy + spelling_hints: 8 +uuid: uuid \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.prism.bin new file mode 100644 index 0000000..d1b97db Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.schema.yaml new file mode 100644 index 0000000..7324d87 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/luna_pinyin_simp.schema.yaml @@ -0,0 +1,425 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + grammar: 0 + key_bindings: 1774018450 + key_bindings.custom: 0 + luna_pinyin.custom: 0 + luna_pinyin.schema: 1774018271 + luna_pinyin_simp.custom: 0 + luna_pinyin_simp.schema: 1774018271 + pinyin: 1774018271 + pinyin.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 + symbols: 1774018450 + symbols.custom: 0 +custom_phrase: + db_class: stabledb + dictionary: "" + enable_completion: false + enable_sentence: false + initial_quality: 1 + user_dict: custom_phrase +engine: + filters: + - simplifier + - uniquifier + processors: + - ascii_composer + - recognizer + - key_binder + - speller + - punctuator + - selector + - navigator + - express_editor + segmentors: + - ascii_segmentor + - matcher + - abc_segmentor + - punct_segmentor + - fallback_segmentor + translators: + - punct_translator + - "table_translator@custom_phrase" + - reverse_lookup_translator + - script_translator +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} + - {accept: "Control+Shift+4", toggle: zh_simp, when: always} + - {accept: "Control+Shift+dollar", toggle: zh_simp, when: always} + import_preset: default +menu: + page_size: 6 +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤", "₩"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹", "⟨"] + "=": ["=", "々", "〃"] + ">": ["》", "〉", "»", "›", "⟩"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "[", "〚", "〘"] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]", "〛", "〙"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "№"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤", "₩"] + "%": ["%", "%", "°", "℃", "‰", "‱", "℉", "℅", "℆", "℀", "℁", "⅍"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂", "⁂", "☮", "☯", "☣"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹", "⟨", "˂", "˱"] + "=": ["=", "々", "〃"] + ">": ["》", "〉", "»", "›", "⟩", "˃", "˲"] + "?": {commit: "?"} + "@": ["@", "©", "®", "℗"] + "[": ["「", "【", "〔", "[", "〚", "〘"] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]", "〛", "〙"] + "^": {commit: "……"} + _: "——" + "`": ["`", "‵", "‶", "‷", "′", "″", "‴", "⁗"] + "{": ["『", "〖", "{"] + "|": ["·", "・", "|", "|", "§", "¦", "‖", "︴"] + "}": ["』", "〗", "}"] + "~": ["~", "~", "˜", "˷", "ⸯ", "≈", "≋", "≃", "≅", "≇", "∽", "⋍", "≌", "﹏", "﹋", "﹌", "︴"] + import_preset: symbols + symbols: + "/0": ["〇", "零", "₀", "⁰", "⓪", "⓿", "0"] + "/1": ["一", "壹", "₁", "¹", "Ⅰ", "ⅰ", "①", "➀", "❶", "➊", "⓵", "⑴", "⒈", "1", "㊀", "㈠", "弌", "壱", "幺", "㆒"] + "/10": ["十", "拾", "₁₀", "¹⁰", "Ⅹ", "ⅹ", "⑩", "➉", "❿", "➓", "⓾", "⑽", "⒑", "10", "㊉", "㈩", "什"] + "/2": ["二", "貳", "₂", "²", "Ⅱ", "ⅱ", "②", "➁", "❷", "➋", "⓶", "⑵", "⒉", "2", "㊁", "㈡", "弍", "弐", "貮", "㒃", "㒳", "兩", "倆", "㆓"] + "/3": ["三", "叄", "₃", "³", "Ⅲ", "ⅲ", "③", "➂", "❸", "➌", "⓷", "⑶", "⒊", "3", "㊂", "㈢", "參", "参", "叁", "弎", "仨", "㆔"] + "/4": ["四", "肆", "₄", "⁴", "Ⅳ", "ⅳ", "④", "➃", "❹", "➍", "⓸", "⑷", "⒋", "4", "㊃", "㈣", "亖"] + "/5": ["五", "伍", "₅", "⁵", "Ⅴ", "ⅴ", "⑤", "➄", "❺", "➎", "⓹", "⑸", "⒌", "5", "㊄", "㈤", "㐅", "㠪", "𠄡"] + "/6": ["六", "陸", "₆", "⁶", "Ⅵ", "ⅵ", "⑥", "➅", "❻", "➏", "⓺", "⑹", "⒍", "6", "㊅", "㈥", "ↅ"] + "/7": ["七", "柒", "₇", "⁷", "Ⅶ", "ⅶ", "⑦", "➆", "❼", "➐", "⓻", "⑺", "⒎", "7", "㊆", "㈦", "漆"] + "/8": ["八", "捌", "₈", "⁸", "Ⅷ", "ⅷ", "⑧", "➇", "❽", "➑", "⓼", "⑻", "⒏", "8", "㊇", "㈧"] + "/9": ["九", "玖", "₉", "⁹", "Ⅸ", "ⅸ", "⑨", "➈", "❾", "➒", "⓽", "⑼", "⒐", "9", "㊈", "㈨"] + "/A": ["Ā", "Á", "Ǎ", "À", "Ȁ", "Â", "Ă", "Ȃ", "Ȧ", "Ä", "Å", "Ã", "ᴀ", "ᴬ", "Ⱥ", "Ả", "Ą", "Ạ", "Ḁ", "Ấ", "Ầ", "Ẫ", "Ẩ", "Ắ", "Ằ", "Ẵ", "Ẳ", "Ǡ", "Ǟ", "Ǻ", "Ậ", "Ặ", "Ɐ", "Ɑ", "Ɒ"] + "/AA": ["Ꜳ"] + "/AE": ["Æ", "Ǣ", "Ǽ", "ᴭ", "ᴁ"] + "/AO": ["Ꜵ"] + "/AU": ["Ꜷ"] + "/AV": ["Ꜹ", "Ꜻ"] + "/AY": ["Ꜽ"] + "/B": ["Ḃ", "Ḅ", "ʙ", "ᴃ", "ᴮ", "ᴯ", "Ƀ", "Ƃ", "Ḇ", "Ɓ", "Ꞗ"] + "/C": ["Ç", "Ć", "Č", "Ĉ", "Ċ", "ᴄ", "Ȼ", "Ꞓ", "Ƈ", "Ḉ", "Ꜿ"] + "/D": ["Ď", "Ḋ", "ᴅ", "ᴆ", "ᴰ", "Đ", "Ƌ", "Ḑ", "Ḓ", "Ḏ", "Ḍ", "Ɖ", "Ɗ", "Ð", "DZ", "Dz", "DŽ", "Dž"] + "/E": ["Ē", "É", "Ě", "È", "Ȅ", "Ê", "Ĕ", "Ȇ", "Ė", "Ë", "Ẽ", "ᴇ", "ᴱ", "Ɇ", "Ẻ", "Ȩ", "Ę", "Ḙ", "Ẹ", "Ḛ", "Ḗ", "Ḕ", "Ế", "Ề", "Ễ", "Ể", "Ḝ", "Ệ", "Ə", "Ɛ", "Ɜ", "Ǝ", "ⱻ", "ᴲ", "Ȝ"] + "/F": ["Ḟ", "ꜰ", "Ƒ", "Ꞙ", "ꟻ"] + "/G": ["Ḡ", "Ǵ", "Ǧ", "Ĝ", "Ğ", "Ġ", "ʛ", "ᴳ", "Ǥ", "Ꞡ", "Ģ", "Ɠ", "Ɡ", "Ɣ"] + "/H": ["Ĥ", "Ȟ", "Ḣ", "Ḧ", "ʜ", "ᴴ", "Ħ", "Ɦ", "Ꜧ", "Ḩ", "Ḫ", "Ḥ", "Ⱨ", "Ɥ", "Ⱶ"] + "/HV": ["Ƕ"] + "/I": ["Ī", "Í", "Ǐ", "Ì", "Ȉ", "Î", "Ĭ", "Ȋ", "Ï", "Ĩ", "İ", "ɪ", "ᴵ", "ᶦ", "Ɨ", "ᵻ", "ᶧ", "Ỉ", "Į", "Ị", "Ḭ", "Ḯ", "ꟾ", "Ɩ"] + "/IJ": ["IJ"] + "/J": ["Ĵ", "ᴊ", "ᴶ", "Ɉ", "Ʝ"] + "/K": ["Ḱ", "Ǩ", "ᴋ", "ᴷ", "Ꝁ", "Ꝃ", "Ꞣ", "Ꝅ", "Ķ", "Ḵ", "Ḳ", "Ƙ", "Ⱪ", "Ʞ"] + "/L": ["Ĺ", "ʟ", "ᶫ", "Ƚ", "Ꝉ", "Ł", "ᴌ", "Ⱡ", "Ɫ", "Ɬ", "Ľ", "Ļ", "Ḻ", "Ḽ", "Ḷ", "Ŀ", "Ꝇ"] + "/LL": ["Ỻ"] + "/M": ["Ḿ", "Ṁ", "ᴍ", "ᴹ", "Ṃ", "Ɱ", "Ɯ", "ꟽ", "ꟿ"] + "/N": ["Ń", "Ň", "Ǹ", "Ṅ", "Ñ", "ɴ", "ᴺ", "ᴻ", "ᶰ", "Ɲ", "Ƞ", "Ŋ", "Ņ", "Ṉ", "Ṋ", "Ṇ", "Ꞑ"] + "/NJ": ["NJ"] + "/Nj": ["Nj"] + "/O": ["Ō", "Ó", "Ő", "Ǒ", "Ò", "Ô", "Ŏ", "Ȯ", "Ö", "Õ", "ᴏ", "ᴼ", "Ɔ", "ᴐ", "Ø", "Ǫ", "Ọ", "Ơ", "Ɵ", "Ꝋ", "Ꝍ", "Ṓ", "Ṑ", "Ố", "Ồ", "Ỗ", "Ổ", "Ȱ", "Ȫ", "Ȭ", "Ṍ", "Ṏ", "Ộ", "Ǭ", "Ǿ", "Ớ", "Ờ", "Ỡ", "Ở", "Ợ"] + "/OE": ["Œ", "ɶ"] + "/OI": ["Ƣ"] + "/OO": ["Ꝏ"] + "/OU": ["Ȣ", "ᴽ"] + "/P": ["Ṕ", "Ṗ", "ᴘ", "ᴾ", "Ᵽ", "Ꝑ", "Ƥ", "Ꝓ", "Ꝕ", "ꟼ"] + "/Q": ["Ɋ", "Ꝗ", "Ꝙ"] + "/R": ["Ŕ", "Ř", "Ȑ", "Ȓ", "Ṙ", "ʀ", "ᴙ", "ᴿ", "Ʀ", "ꭆ", "Ɍ", "Ꞧ", "Ŗ", "Ṟ", "Ṛ", "Ṝ", "Ɽ", "ꝶ", "ʶ", "ʁ", "Ꝛ", "Ꝝ"] + "/Rx": ["℞"] + "/S": ["Ś", "Ŝ", "Š", "Ṡ", "ꜱ", "Ꞩ", "Ş", "Ṣ", "Ș", "Ṥ", "Ṧ", "Ṩ", "Ʃ", "ẞ"] + "/T": ["Ť", "Ṫ", "ᴛ", "ᵀ", "Ʈ", "Þ", "Ꝥ", "Ꝧ", "Ŧ", "Ⱦ", "Ţ", "Ṯ", "Ṱ", "Ṭ", "Ț", "Ƭ", "Ʇ"] + "/TZ": ["Ꜩ"] + "/U": ["Ū", "Ú", "Ű", "Ǔ", "Ù", "Ȕ", "Û", "Ŭ", "Ȗ", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ů", "Ũ", "ᴜ", "ᵁ", "ᶸ", "Ʉ", "Ủ", "Ų", "Ṷ", "Ụ", "Ṳ", "Ṵ", "Ư", "Ʊ", "Ṻ", "Ṹ", "Ứ", "Ừ", "Ữ", "Ử", "Ự"] + "/V": ["Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ṽ", "ᴠ", "ⱽ", "Ṿ", "Ꝟ", "Ʋ", "Ỽ", "Ʌ"] + "/VY": ["Ꝡ"] + "/W": ["Ẃ", "Ẁ", "Ŵ", "Ẇ", "Ẅ", "W̊", "ᴡ", "ᵂ", "Ẉ", "Ƿ", "Ⱳ"] + "/X": ["Ẋ", "Ẍ"] + "/Y": ["Ȳ", "Ý", "Ỳ", "Ŷ", "Ẏ", "Ÿ", "Ỹ", "ʏ", "Ɏ", "Ỷ", "Ỵ", "Ƴ", "Ỿ"] + "/Z": ["Ź", "Ž", "Ẑ", "Ż", "ᴢ", "Ƶ", "Ẕ", "Ẓ", "Ȥ", "Ⱬ", "Ʒ", "ᴣ", "Ǯ", "Ƹ", "Ɀ", "Ꝣ"] + "/a": ["ā", "á", "ǎ", "à", "ȁ", "â", "ă", "ȃ", "ȧ", "ä", "å", "ã", "ₐ", "ᵃ", "ª", "ⱥ", "ꬰ", "ả", "ą", "ạ", "ḁ", "ẚ", "ấ", "ầ", "ẫ", "ẩ", "ắ", "ằ", "ẵ", "ẳ", "ǡ", "ǟ", "ǻ", "ậ", "ặ", "ᶏ", "ɐ", "ᵄ", "ɑ", "ᵅ", "ᶐ", "ɒ", "ᶛ"] + "/aa": ["ꜳ"] + "/ae": ["æ", "ǣ", "ǽ", "ᵆ", "ᴂ"] + "/ao": ["ꜵ"] + "/au": ["ꜷ"] + "/av": ["ꜹ", "ꜻ"] + "/ay": ["ꜽ"] + "/b": ["ḃ", "ḅ", "ᵇ", "ƀ", "ƃ", "ḇ", "ɓ", "ᵬ", "ᶀ", "ꞗ"] + "/bd": ["、", "。", "「", "」", "『", "』", "【", "】", "〈", "〉", "《", "》", "⟨", "⟩", "₋", "⁻", "―", "˗", "ˉ", "_", "﹍", "﹎", ".", "¡", "‼", "⁉", "¿", "؟", "⁈", "⁇", "、", "。", "〃", "〄", "々", "〆", "〇", "〒", "〓", "〔", "〕", "〖", "〗", "〘", "〙", "〚", "〛", "〜", "〝", "〞", "〟", "〠", "〰", "〱", "〲", "〳", "〴", "〵", "〶", "〷", "〻", "〼", "〽"] + "/bdz": ["﹅", "﹆", "﹁", "﹂", "﹃", "﹄", "︙", "︱", "︻", "︼", "︗", "︘", "︵", "︶", "︷", "︸", "︹", "︺", "︿", "﹀", "︽", "︾", "︰", "︲", "︳", "︴", "﹉", "﹊", "﹋", "﹌", "﹍", "﹎", "﹏", "﹇", "﹈", "︐", "︑", "︒", "︔", "︕", "︖"] + "/bg": ["☰", "☱", "☲", "☳", "☴", "☵", "☶", "☷"] + "/bgm": ["乾", "兌", "離", "震", "巽", "坎", "艮", "坤"] + "/bh": ["㇀", "㇁", "㇂", "㇃", "㇄", "㇅", "㇆", "㇇", "㇈", "㇉", "㇊", "㇋", "㇌", "㇍", "㇎", "㇏", "㇐", "㇑", "㇒", "㇓", "㇔", "㇕", "㇖", "㇗", "㇘", "㇙", "㇚", "㇛", "㇜", "㇝", "㇞", "㇟", "㇠", "㇡", "㇢", "㇣"] + "/bq": ["☻", "☺", "☹"] + "/c": ["ç", "ć", "č", "ĉ", "ċ", "ᶜ", "ȼ", "ꞓ", "ƈ", "ḉ", "ꞔ", "ɕ", "ᶝ", "ꜿ"] + "/d": ["ď", "ḋ", "ᵈ", "đ", "ƌ", "ᵭ", "ḑ", "ḓ", "ḏ", "ḍ", "ɖ", "ɗ", "ᶑ", "ᶁ", "ð", "ᶞ", "ꝱ", "ʤ", "ʣ", "ʥ", "ȡ", "ƍ", "dz", "dž", "ẟ"] + "/db": ["ȸ"] + "/dn": ["❖", "⌘", "⌃", "⌥", "⎇", "⇧", "⇪", "␣", "⇥", "⇤", "↩", "⌅", "⌤", "⌫", "⌦", "⌧", "⎋", "⌨", "◁", "⌀", "⌖", "⌗", "⏏", "↖", "↘", "⇞", "⇟", "⌚", "⏰", "⏱", "⏲", "⏳", "⌛", "⌜", "⌝", "⌞", "⌟", "⍑", "⏩", "⏪", "⏫", "⏬", "⏭", "⏮", "⏯"] + "/dw": ["Å", "℃", "%", "‰", "‱", "°", "℉", "㏃", "㏆", "㎈", "㏄", "㏅", "㎝", "㎠", "㎤", "㏈", "㎗", "㎙", "㎓", "㎬", "㏉", "㏊", "㏋", "㎐", "㏌", "㎄", "㎅", "㎉", "㎏", "㎑", "㏍", "㎘", "㎞", "㏎", "㎢", "㎦", "㎪", "㏏", "㎸", "㎾", "㏀", "㏐", "㏓", "㎧", "㎨", "㎡", "㎥", "㎃", "㏔", "㎆", "㎎", "㎒", "㏕", "㎖", "㎜", "㎟", "㎣", "㏖", "㎫", "㎳", "㎷", "㎹", "㎽", "㎿", "㏁", "㎁", "㎋", "㎚", "㎱", "㎵", "㎻", "㏘", "㎩", "㎀", "㎊", "㏗", "㏙", "㏚", "㎰", "㎴", "㎺", "㎭", "㎮", "㎯", "㏛", "㏜", "㎔", "㏝", "㎂", "㎌", "㎍", "㎕", "㎛", "㎲", "㎶", "㎼"] + "/dz": ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] + "/e": ["ē", "é", "ě", "è", "ȅ", "ê", "ĕ", "ȇ", "ė", "ë", "ẽ", "ₑ", "ᵉ", "ɇ", "ꬳ", "ẻ", "ȩ", "ę", "ḙ", "ẹ", "ḛ", "ḗ", "ḕ", "ế", "ề", "ễ", "ể", "ḝ", "ệ", "ᶒ", "ꬴ", "ɘ", "ə", "ɚ", "ᶕ", "ɛ", "ᵋ", "ᶓ", "ɜ", "ᵌ", "ᴈ", "ᶟ", "ɝ", "ᶔ", "ɞ", "ʚ", "ǝ", "ₔ", "ᵊ", "ȝ", "ⱸ"] + "/ey": ["а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"] + "/eyd": ["А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"] + "/f": ["ḟ", "ᶠ", "ƒ", "ᵮ", "ᶂ", "ꞙ"] + "/ff": ["ff"] + "/ffi": ["ffi"] + "/ffl": ["ffl"] + "/fh": ["©", "®", "℗", "℠", "™", "℡", "℻", "☇", "☈", "☉", "☊", "☋", "☌", "☍", "☎", "☏", "☐", "☑", "☒", "☓", "☕", "☖", "☗", "⛉", "⛊", "☘", "☙", "☚", "☛", "☜", "☝", "☞", "☟", "☠", "☡", "☢", "☣", "☤", "☥", "☦", "☧", "☨", "☩", "☪", "☫", "☬", "☭", "☮", "☯", "☸", "♨", "♰", "♱", "♲", "♳", "♴", "♵", "♶", "♷", "♸", "♹", "♺", "♻", "♼", "♽", "♾", "♿", "⚆", "⚇", "⚈", "⚉", "⚐", "⚑", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚘", "⚙", "⚚", "⚛", "⚜", "⚝", "⚞", "⚟", "⚠", "⚡", "⚰", "⚱", "⚲", "⚳", "⚴", "⚵", "⚶", "⚷", "⚸", "⚹", "⚺", "⚻", "⚼", "⚽", "⚾", "⚿", "⛀", "⛁", "⛂", "⛃", "⛋", "⛌", "⛍", "⛎", "⛏", "⛐", "⛑", "⛒", "⛓", "⛔", "⛕", "⛖", "⛗", "⛘", "⛙", "⛚", "⛛", "⛜", "⛝", "⛞", "⛟", "⛠", "⛡", "⛢", "⛣", "⛨", "⛩", "⛪", "⛫", "⛬", "⛭", "⛮", "⛯", "⛰", "⛱", "⛲", "⛳", "⛴", "⛵", "⛶", "⛷", "⛸", "⛹", "⛺", "⛻", "⛼", "⛽", "⛾", "⛿"] + "/fi": ["fi"] + "/fk": ["▀", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊", "▋", "▌", "▍", "▎", "▏", "▐", "░", "▒", "▓", "▔", "▕", "▖", "▗", "▘", "▙", "▚", "▛", "▜", "▝", "▞", "▟"] + "/fl": ["fl"] + "/fn": ["ʩ"] + "/fs": ["⅟", "½", "↉", "⅓", "⅔", "¼", "¾", "⅕", "⅖", "⅗", "⅘", "⅙", "⅚", "⅐", "⅛", "⅜", "⅝", "⅞", "⅑", "⅒"] + "/g": ["ḡ", "ǵ", "ǧ", "ĝ", "ğ", "ġ", "ᵍ", "ǥ", "ꞡ", "ģ", "ɠ", "ᵷ", "ᶃ", "ɡ", "ꬶ", "ᶢ", "ɣ", "ˠ", "ɤ", "ᵹ"] + "/gz": ["甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"] + "/h": ["ĥ", "ȟ", "ḣ", "ḧ", "ͪ", "ħ", "ɦ", "ʱ", "ꜧ", "ꭜ", "ɧ", "ḩ", "ẖ", "ḫ", "ḥ", "ⱨ", "ꞕ", "ɥ", "ᶣ", "ʮ", "ʯ", "ⱶ"] + "/hb": ["¥", "¥", "¤", "¢", "$", "$", "£", "£", "৳", "฿", "₠", "₡", "₢", "₣", "₤", "₥", "₦", "₧", "₨", "₩", "₪", "₫", "€", "₭", "₮", "₯", "₰", "₱", "₲", "₳", "₴", "₵", "₶", "₷", "₸", "₹", "₺", "₻", "₼", "₽", "₾", "₿", "⃀", "﷼"] + "/hv": ["ƕ"] + "/hw": ["ㄱ", "ㄴ", "ㄷ", "ㄹ", "ㅁ", "ㅂ", "ㅅ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"] + "/hwh": ["㈀", "㈁", "㈂", "㈃", "㈄", "㈅", "㈆", "㈇", "㈈", "㈉", "㈊", "㈋", "㈌", "㈍", "㈎", "㈏", "㈐", "㈑", "㈒", "㈓", "㈔", "㈕", "㈖", "㈗", "㈘", "㈙", "㈚", "㈛", "㈜", "㈝", "㈞"] + "/hwq": ["㉠", "㉡", "㉢", "㉣", "㉤", "㉥", "㉦", "㉧", "㉨", "㉩", "㉪", "㉫", "㉬", "㉭", "㉮", "㉯", "㉰", "㉱", "㉲", "㉳", "㉴", "㉵", "㉶", "㉷", "㉸", "㉹", "㉺", "㉻", "㉼", "㉽", "㉾", "㉿"] + "/hzh": ["㈠", "㈡", "㈢", "㈣", "㈤", "㈥", "㈦", "㈧", "㈨", "㈩", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈱", "㈲", "㈳", "㈴", "㈵", "㈶", "㈷", "㈸", "㈹", "㈺", "㈻", "㈼", "㈽", "㈾", "㈿", "㉀", "㉁", "㉂", "㉃"] + "/hzq": ["㊀", "㊁", "㊂", "㊃", "㊄", "㊅", "㊆", "㊇", "㊈", "㊉", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊑", "㊒", "㊓", "㊔", "㊕", "㊖", "㊗", "㊘", "㊙", "㊚", "㊛", "㊜", "㊝", "㊞", "㊟", "㊠", "㊡", "㊢", "㊣", "㊤", "㊥", "㊦", "㊧", "㊨", "㊩", "㊪", "㊫", "㊬", "㊭", "㊮", "㊯", "㊰", "㉄", "㉅", "㉆", "㉇"] + "/i": ["ī", "í", "ǐ", "ì", "ȉ", "î", "ĭ", "ȋ", "ï", "ĩ", "ı", "ᵢ", "ɨ", "ᶤ", "ỉ", "į", "ị", "ḭ", "ᴉ", "ᵎ", "ḯ", "ᶖ", "ɩ", "ᶥ", "ᵼ"] + "/ij": ["ij"] + "/iro": ["い", "ろ", "は", "に", "ほ", "へ", "と", "ち", "り", "ぬ", "る", "を", "わ", "か", "よ", "た", "れ", "そ", "つ", "ね", "な", "ら", "む", "う", "ゐ", "の", "お", "く", "や", "ま", "け", "ふ", "こ", "え", "て", "あ", "さ", "き", "ゆ", "め", "み", "し", "ゑ", "ひ", "も", "せ", "す"] + "/j": ["ĵ", "ǰ", "ⱼ", "ʲ", "ɉ", "ȷ", "ɟ", "ᶡ", "ʄ", "ʝ", "ᶨ"] + "/jg": ["⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "〾", "⿼", "⿽", "⿾", "⿿", "㇯"] + "/jh": ["■", "□", "▢", "▣", "▤", "▥", "▦", "▧", "▨", "▩", "▪", "▫", "▬", "▭", "▮", "▯", "▰", "▱", "▲", "△", "▴", "▵", "▶", "▷", "▸", "▹", "►", "▻", "▼", "▽", "▾", "▿", "◀", "◁", "◂", "◃", "◄", "◅", "◆", "◇", "◈", "◉", "◊", "○", "◌", "◍", "◎", "●", "◐", "◑", "◒", "◓", "◔", "◕", "◖", "◗", "◘", "◙", "◚", "◛", "◜", "◝", "◞", "◟", "◠", "◡", "◢", "◣", "◤", "◥", "◦", "◧", "◨", "◩", "◪", "◫", "◬", "◭", "◮", "◯", "◰", "◱", "◲", "◳", "◴", "◵", "◶", "◷", "◸", "◹", "◺", "◻", "◼", "◽", "◾", "◿"] + "/jm": ["あ", "ぁ", "い", "ぃ", "う", "ぅ", "え", "ぇ", "お", "ぉ", "か", "ゕ", "が", "き", "ぎ", "く", "ぐ", "け", "ゖ", "げ", "こ", "ご", "さ", "ざ", "し", "じ", "す", "ず", "せ", "ぜ", "そ", "ぞ", "た", "だ", "ち", "ぢ", "つ", "っ", "づ", "て", "で", "と", "ど", "な", "に", "ぬ", "ね", "の", "は", "ば", "ぱ", "ひ", "び", "ぴ", "ふ", "ぶ", "ぷ", "へ", "べ", "ぺ", "ほ", "ぼ", "ぽ", "ま", "み", "む", "め", "も", "や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ら", "り", "る", "れ", "ろ", "わ", "ゎ", "ゐ", "ゔ", "ゑ", "を", "ん", "・", "ー", "ゝ", "ゞ", "ゟ"] + "/jma": ["あ", "か", "が", "さ", "ざ", "た", "だ", "な", "は", "ば", "ぱ", "ま", "や", "ら", "わ", "ア", "カ", "ガ", "サ", "ザ", "タ", "ダ", "ナ", "ハ", "バ", "パ", "マ", "ヤ", "ラ", "ワ"] + "/jmb": ["ば", "び", "ぶ", "べ", "ぼ", "バ", "ビ", "ブ", "ベ", "ボ"] + "/jmbj": ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "ッ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "・", "ー", "゙", "゚"] + "/jmd": ["だ", "ぢ", "づ", "で", "ど", "ダ", "ヂ", "ヅ", "デ", "ド"] + "/jme": ["え", "け", "げ", "せ", "ぜ", "て", "で", "ね", "へ", "べ", "ぺ", "め", "れ", "ゑ", "エ", "ケ", "ゲ", "セ", "ゼ", "テ", "デ", "ネ", "ヘ", "ベ", "ペ", "メ", "レ", "ヱ"] + "/jmg": ["が", "ぎ", "ぐ", "げ", "ご", "ガ", "ギ", "グ", "ゲ", "ゴ"] + "/jmh": ["は", "ひ", "ふ", "へ", "ほ", "ハ", "ヒ", "フ", "ヘ", "ホ"] + "/jmi": ["い", "き", "ぎ", "し", "じ", "ち", "ぢ", "に", "ひ", "び", "ぴ", "み", "り", "ゐ", "イ", "キ", "ギ", "シ", "ジ", "チ", "ヂ", "ニ", "ヒ", "ビ", "ピ", "ミ", "リ", "ヰ"] + "/jmk": ["か", "ゕ", "き", "く", "け", "ゖ", "こ", "カ", "ヵ", "キ", "ク", "ケ", "ヶ", "コ"] + "/jmm": ["ま", "み", "む", "め", "も", "マ", "ミ", "ム", "メ", "モ"] + "/jmn": ["な", "に", "ぬ", "ね", "の", "ん", "ナ", "ニ", "ヌ", "ネ", "ノ", "ン"] + "/jmo": ["お", "こ", "ご", "そ", "ぞ", "と", "ど", "の", "ほ", "ぼ", "ぽ", "も", "ろ", "を", "オ", "コ", "ゴ", "ソ", "ゾ", "ト", "ド", "ノ", "ホ", "ボ", "ポ", "モ", "ロ", "ヲ"] + "/jmp": ["ぱ", "ぴ", "ぷ", "ぺ", "ぽ", "パ", "ピ", "プ", "ペ", "ポ"] + "/jmq": ["㋐", "㋑", "㋒", "㋓", "㋔", "㋕", "㋖", "㋗", "㋘", "㋙", "㋚", "㋛", "㋜", "㋝", "㋞", "㋟", "㋠", "㋡", "㋢", "㋣", "㋤", "㋥", "㋦", "㋧", "㋨", "㋩", "㋪", "㋫", "㋬", "㋭", "㋮", "㋯", "㋰", "㋱", "㋲", "㋳", "㋴", "㋵", "㋶", "㋷", "㋸", "㋹", "㋺", "㋻", "㋼", "㋽", "㋾"] + "/jmr": ["ら", "り", "る", "れ", "ろ", "ラ", "リ", "ル", "レ", "ロ"] + "/jms": ["さ", "し", "す", "せ", "そ", "サ", "シ", "ス", "セ", "ソ"] + "/jmt": ["た", "ち", "つ", "っ", "て", "と", "タ", "チ", "ツ", "ッ", "テ", "ト"] + "/jmu": ["う", "く", "ぐ", "す", "ず", "つ", "づ", "ぬ", "ふ", "ぶ", "ぷ", "む", "る", "ウ", "ク", "グ", "ス", "ズ", "ツ", "ヅ", "ヌ", "フ", "ブ", "プ", "ム", "ル"] + "/jmw": ["わ", "ゐ", "ゑ", "を", "ワ", "ヰ", "ヱ", "ヲ"] + "/jmy": ["や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ"] + "/jmz": ["ざ", "じ", "ず", "ぜ", "ぞ", "ザ", "ジ", "ズ", "ゼ", "ゾ"] + "/jq": ["立春", "雨水", "驚蟄", "春分", "清明", "穀雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒"] + "/jt": ["↑", "↓", "←", "→", "↕", "↔", "↖", "↗", "↙", "↘", "↚", "↛", "↮", "↜", "↝", "↞", "↟", "↠", "↡", "↢", "↣", "↤", "↥", "↦", "↧", "↨", "↩", "↪", "↫", "↬", "↭", "↯", "↰", "↱", "↲", "↳", "↴", "↵", "↶", "↷", "↸", "↹", "↺", "↻", "↼", "↽", "↾", "↿", "⇀", "⇁", "⇂", "⇃", "⇄", "⇅", "⇆", "⇇", "⇈", "⇉", "⇊", "⇋", "⇌", "⇐", "⇍", "⇑", "⇒", "⇏", "⇓", "⇔", "⇎", "⇕", "⇖", "⇗", "⇘", "⇙", "⇚", "⇛", "⇜", "⇝", "⇞", "⇟", "⇠", "⇡", "⇢", "⇣", "⇤", "⇥", "⇦", "⇧", "⇨", "⇩", "⇪", "⇫", "⇬", "⇭", "⇮", "⇯", "⇰", "⇱", "⇲", "⇳", "⇴", "⇵", "⇶", "⇷", "⇸", "⇹", "⇺", "⇻", "⇼", "⇽", "➔", "➘", "➙", "➚", "➛", "➜", "➝", "➞", "➟", "➠", "➡", "➢", "➣", "➤", "➥", "➦", "➧", "➨", "➩", "➪", "➫", "➬", "➭", "➮", "➱", "➲", "➳", "➴", "➵", "➶", "➷", "➸", "➹", "➺", "➻", "➼", "➽", "➾"] + "/k": ["ḱ", "ǩ", "ₖ", "ᵏ", "ꝁ", "ꝃ", "ꞣ", "ꝅ", "ķ", "ḵ", "ḳ", "ƙ", "ᶄ", "ⱪ", "ʞ", "ĸ"] + "/kx": ["一", "丨", "丶", "丿", "乙", "亅", "二", "亠", "人", "儿", "入", "八", "冂", "冖", "冫", "几", "凵", "刀", "力", "勹", "匕", "匚", "匸", "十", "卜", "卩", "厂", "厶", "又", "口", "囗", "土", "士", "夂", "夊", "夕", "大", "女", "子", "宀", "寸", "小", "尢", "尸", "屮", "山", "巛", "工", "己", "巾", "干", "幺", "广", "廴", "廾", "弋", "弓", "彐", "彡", "彳", "心", "戈", "戶", "手", "支", "攴", "文", "斗", "斤", "方", "无", "日", "曰", "月", "木", "欠", "止", "歹", "殳", "毋", "比", "毛", "氏", "气", "水", "火", "爪", "父", "爻", "爿", "片", "牙", "牛", "犬", "玄", "玉", "瓜", "瓦", "甘", "生", "用", "田", "疋", "疒", "癶", "白", "皮", "皿", "目", "矛", "矢", "石", "示", "禸", "禾", "穴", "立", "竹", "米", "糸", "缶", "网", "羊", "羽", "老", "而", "耒", "耳", "聿", "肉", "臣", "自", "至", "臼", "舌", "舛", "舟", "艮", "色", "艸", "虍", "虫", "血", "行", "衣", "襾", "見", "角", "言", "谷", "豆", "豕", "豸", "貝", "赤", "走", "足", "身", "車", "辛", "辰", "辵", "邑", "酉", "釆", "里", "金", "長", "門", "阜", "隶", "隹", "雨", "靑", "非", "面", "革", "韋", "韭", "音", "頁", "風", "飛", "食", "首", "香", "馬", "骨", "高", "髟", "鬥", "鬯", "鬲", "鬼", "魚", "鳥", "鹵", "鹿", "麥", "麻", "黃", "黍", "黑", "黹", "黽", "鼎", "鼓", "鼠", "鼻", "齊", "齒", "龍", "龜", "龠"] + "/l": ["ĺ", "ˡ", "ł", "ꝉ", "ƚ", "ⱡ", "ɫ", "ꭞ", "ꬸ", "ɬ", "ľ", "ļ", "ḻ", "ḽ", "ḷ", "ŀ", "ꝲ", "ƛ", "ᶅ", "ᶪ", "ɭ", "ᶩ", "ḹ", "ꬷ", "ꭝ", "ꬹ", "ȴ", "ꝇ"] + "/lj": ["lj"] + "/ll": ["ỻ"] + "/lm": ["ⅰ", "ⅱ", "ⅲ", "ⅳ", "ⅴ", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "ⅹ", "ⅺ", "ⅻ", "ⅼ", "ⅽ", "ⅾ", "ⅿ"] + "/lmd": ["Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ", "Ⅻ", "Ⅼ", "Ⅽ", "Ⅾ", "Ⅿ"] + "/ls": ["ʪ"] + "/lssg": ["䷀", "䷁", "䷂", "䷃", "䷄", "䷅", "䷆", "䷇", "䷈", "䷉", "䷊", "䷋", "䷌", "䷍", "䷎", "䷏", "䷐", "䷑", "䷒", "䷓", "䷔", "䷕", "䷖", "䷗", "䷘", "䷙", "䷚", "䷛", "䷜", "䷝", "䷞", "䷟", "䷠", "䷡", "䷢", "䷣", "䷤", "䷥", "䷦", "䷧", "䷨", "䷩", "䷪", "䷫", "䷬", "䷭", "䷮", "䷯", "䷰", "䷱", "䷲", "䷳", "䷴", "䷵", "䷶", "䷷", "䷸", "䷹", "䷺", "䷻", "䷼", "䷽", "䷾", "䷿"] + "/lssgm": ["乾", "坤", "屯", "蒙", "需", "訟", "師", "比", "小畜", "履", "泰", "否", "同人", "大有", "謙", "豫", "隨", "蠱", "臨", "觀", "噬嗑", "賁", "剝", "復", "无妄", "大畜", "頤", "大過", "坎", "離", "咸", "恆", "遯", "大壯", "晉", "明夷", "家人", "睽", "蹇", "解", "損", "益", "夬", "姤", "萃", "升", "困", "井", "革", "鼎", "震", "艮", "漸", "歸妹", "豐", "旅", "巽", "兌", "渙", "節", "中孚", "小過", "既濟", "未濟"] + "/lx": ["♂", "♀", "⚢", "⚣", "⚤", "⚥", "⚦", "⚧", "⚨", "⚩", "⚪", "⚫", "⚬", "⚭", "⚮", "⚯"] + "/lz": ["ʫ", "ɮ"] + "/m": ["ḿ", "ṁ", "ᵐ", "ₘ", "ṃ", "ᵯ", "ɱ", "ᶬ", "ꬺ", "ᶆ", "ꝳ", "ɯ", "ᵚ", "ɰ", "ᶭ", "ᴟ"] + "/mj": ["🀀", "🀁", "🀂", "🀃", "🀄", "🀅", "🀆", "🀇", "🀈", "🀉", "🀊", "🀋", "🀌", "🀍", "🀎", "🀏", "🀐", "🀑", "🀒", "🀓", "🀔", "🀕", "🀖", "🀗", "🀘", "🀙", "🀚", "🀛", "🀜", "🀝", "🀞", "🀟", "🀠", "🀡", "🀢", "🀣", "🀤", "🀥", "🀦", "🀧", "🀨", "🀩", "🀪", "🀫"] + "/n": ["ń", "ň", "ǹ", "ṅ", "ñ", "ₙ", "ⁿ", "ɲ", "ᶮ", "ɳ", "ᶯ", "ȵ", "ƞ", "ŋ", "ᵑ", "ꬻ", "ꬼ", "ꝴ", "ʼn", "ꞥ", "ņ", "ṉ", "ṋ", "ṇ", "ᵰ", "ꞑ", "ᶇ"] + "/nj": ["nj"] + "/o": ["ō", "ó", "ő", "ǒ", "ò", "ô", "ŏ", "ȯ", "ö", "õ", "ₒ", "ᵒ", "º", "ɔ", "ᵓ", "ᶗ", "ꬿ", "ø", "ǫ", "ọ", "ơ", "ɵ", "ᶱ", "ᴑ", "ᴒ", "ᴓ", "ꝋ", "ꝍ", "ṓ", "ṑ", "ố", "ồ", "ỗ", "ổ", "ȱ", "ȫ", "ȭ", "ṍ", "ṏ", "ộ", "ǭ", "ǿ", "ớ", "ờ", "ỡ", "ở", "ợ", "ɷ", "ⱺ", "ᴖ", "ᵔ", "ᴗ", "ᵕ"] + "/oe": ["œ", "ᴔ"] + "/oi": ["ƣ"] + "/oo": ["ꝏ"] + "/ou": ["ȣ"] + "/p": ["ṕ", "ṗ", "ᵖ", "ᵽ", "ꝑ", "ᵱ", "ƥ", "ᶈ", "ꝓ", "ꝕ", "ɸ", "ᶲ", "ⱷ"] + "/pjm": ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "ヵ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ヶ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ツ", "ッ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヮ", "ヰ", "ヸ", "ヴ", "ヱ", "ヹ", "ヲ", "ヺ", "ン", "・", "ー", "ヽ", "ヾ", "ヿ", "ㇰ", "ㇱ", "ㇲ", "ㇳ", "ㇴ", "ㇵ", "ㇶ", "ㇷ", "ㇸ", "ㇹ", "ㇺ", "ㇻ", "ㇼ", "ㇽ", "ㇾ", "ㇿ"] + "/pk": ["♠", "♥", "♣", "♦", "♤", "♡", "♧", "♢"] + "/pp": ["乛", "冫", "丷", "龹", "⺌", "龸", "亻", "亼", "亽", "仒", "冖", "冂", "冃", "冄", "宀", "罒", "㓁", "罓", "冈", "凵", "厶", "刂", "勹", "匚", "匸", "卩", "阝", "厂", "丆", "广", "壬", "訁", "讠", "釒", "钅", "飠", "饣", "龺", "攵", "夂", "夊", "尢", "尣", "兂", "旡", "巜", "巛", "彐", "彑", "彡", "彳", "龰", "辶", "廴", "㞢", "忄", "㣺", "扌", "爫", "龵", "廾", "歺", "癶", "氵", "氺", "火", "灬", "爿", "丬", "疒", "牜", "⺶", "犭", "豕", "豸", "虍", "艹", "卝", "龷", "丗", "龶", "芈", "丵", "菐", "黹", "礻", "衤", "糸", "糹", "纟", "龻", "镸", "髟", "襾", "覀", "吅", "㗊", "㠭", "㸚", "叕"] + "/py": ["ā", "á", "ǎ", "à", "ō", "ó", "ǒ", "ò", "ê", "ê̄", "ế", "ê̌", "ề", "ē", "é", "ě", "è", "ī", "í", "ǐ", "ì", "ū", "ú", "ǔ", "ù", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ḿ", "m̀", "ń", "ň", "ǹ", "ẑ", "ĉ", "ŝ", "ŋ"] + "/pyd": ["Ā", "Á", "Ǎ", "À", "Ō", "Ó", "Ǒ", "Ò", "Ê", "Ê̄", "Ế", "Ê̌", "Ề", "Ē", "É", "Ě", "È", "Ī", "Í", "Ǐ", "Ì", "Ū", "Ú", "Ǔ", "Ù", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ḿ", "M̀", "Ń", "Ň", "Ǹ", "Ẑ", "Ĉ", "Ŝ", "Ŋ"] + "/q": ["ɋ", "ꝗ", "ꝙ", "ʠ"] + "/qp": ["ȹ"] + "/r": ["ŕ", "ř", "ȑ", "ȓ", "ṙ", "ᵣ", "ɍ", "ꞧ", "ᵲ", "ŗ", "ṟ", "ṛ", "ṝ", "ᵳ", "ɽ", "ᶉ", "ꭇ", "ꭈ", "ꭊ", "ꭉ", "ꝵ", "ꭋ", "ꭌ", "ɹ", "ʴ", "ɺ", "ɻ", "ʵ", "ⱹ", "ɼ", "ʳ", "ɾ", "ɿ", "ꝛ", "ꝝ"] + "/rq": ["㏠", "㏡", "㏢", "㏣", "㏤", "㏥", "㏦", "㏧", "㏨", "㏩", "㏪", "㏫", "㏬", "㏭", "㏮", "㏯", "㏰", "㏱", "㏲", "㏳", "㏴", "㏵", "㏶", "㏷", "㏸", "㏹", "㏺", "㏻", "㏼", "㏽", "㏾"] + "/s": ["ś", "ŝ", "š", "ṡ", "ˢ", "ʂ", "ᶳ", "ᵴ", "ꞩ", "ᶊ", "ş", "ṣ", "ș", "ȿ", "ṥ", "ṧ", "ṩ", "ʃ", "ᶴ", "ʆ", "ᶘ", "ʅ", "ƪ", "ß", "ſ", "ẛ", "ẜ", "ẝ"] + "/sb": ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹", "˜", "⁺", "⁻", "⁼", "⁽", "⁾", "ᴬ", "ᵃ", "ᵄ", "ᵅ", "ᶛ", "ᴭ", "ᵆ", "ᴮ", "ᴯ", "ᵇ", "ᵝ", "ᶜ", "ᵓ", "ᶝ", "ᴰ", "ᵈ", "ᶞ", "ᵟ", "ᴱ", "ᵉ", "ᴲ", "ᵊ", "ᵋ", "ᶟ", "ᵌ", "ᶠ", "ᶡ", "ᶲ", "ᵠ", "ᴳ", "ᵍ", "ᶢ", "ˠ", "ᵞ", "ᴴ", "ʰ", "ᶣ", "ʱ", "ᴵ", "ⁱ", "ᶤ", "ᵎ", "ᶥ", "ᴶ", "ʲ", "ᶨ", "ᴷ", "ᵏ", "ᴸ", "ᶫ", "ˡ", "ᶩ", "ᶪ", "ᴹ", "ᵐ", "ᶬ", "ᵚ", "ᶭ", "ᴺ", "ᴻ", "ⁿ", "ᵑ", "ᶮ", "ᶯ", "ᴼ", "ᵒ", "ᶱ", "ᴽ", "ᴾ", "ᵖ", "ᴿ", "ʳ", "ʶ", "ʴ", "ʵ", "ˢ", "ᶴ", "ᶳ", "ᵀ", "ᵗ", "ᶵ", "ᶿ", "ᵁ", "ᵘ", "ᶶ", "ᶷ", "ᵙ", "ⱽ", "ᵛ", "ᶺ", "ᶹ", "ᵂ", "ʷ", "ˣ", "ᵡ", "ʸ", "ᶻ", "ᶾ", "ᶽ", "ᶼ"] + "/sd": ["ˉ", "ˊ", "ˇ", "ˋ", "ˆ", "˙", "˜", "˥", "˦", "˧", "˨", "˩", "꜀", "꜁", "꜂", "꜃", "꜄", "꜅", "꜆", "꜇", "〪", "〫", "〬", "〭"] + "/seg": ["白羊宮", "金牛宮", "雙子宮", "巨蟹宮", "獅子宮", "室女宮", "天秤宮", "天蠍宮", "人馬宮", "摩羯宮", "寶瓶宮", "雙魚宮"] + "/sj": ["㍘", "㍙", "㍚", "㍛", "㍜", "㍝", "㍞", "㍟", "㍠", "㍡", "㍢", "㍣", "㍤", "㍥", "㍦", "㍧", "㍨", "㍩", "㍪", "㍫", "㍬", "㍭", "㍮", "㍯", "㍰"] + "/sx": ["±", "÷", "×", "∈", "∏", "∑", "-", "+", "<", "≮", "=", "≠", ">", "≯", "∕", "√", "∝", "∞", "⟨", "⟩", "∟", "∠", "∥", "∧", "∨", "∩", "∪", "∫", "∮", "∴", "∵", "∷", "∽", "≈", "≌", "≒", "≡", "≤", "≥", "≦", "≧", "⊕", "⊙", "⊥", "⊿", "㏑", "㏒"] + "/sz": ["⚀", "⚁", "⚂", "⚃", "⚄", "⚅"] + "/szd": ["⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙", "⒚", "⒛"] + "/szh": ["⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽", "⑾", "⑿", "⒀", "⒁", "⒂", "⒃", "⒄", "⒅", "⒆", "⒇"] + "/szm": ["〡", "〢", "〣", "〤", "〥", "〦", "〧", "〨", "〩", "〸", "〹", "〺"] + "/szq": ["⓪", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳", "㉑", "㉒", "㉓", "㉔", "㉕", "㉖", "㉗", "㉘", "㉙", "㉚", "㉛", "㉜", "㉝", "㉞", "㉟", "㊱", "㊲", "㊳", "㊴", "㊵", "㊶", "㊷", "㊸", "㊹", "㊺", "㊻", "㊼", "㊽", "㊾", "㊿", "⓿", "❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿", "⓫", "⓬", "⓭", "⓮", "⓯", "⓰", "⓱", "⓲", "⓳", "⓴"] + "/t": ["ť", "ṫ", "ẗ", "ᵗ", "ₜ", "ʈ", "þ", "ꝥ", "ꝧ", "ŧ", "ⱦ", "ţ", "ṯ", "ṱ", "ṭ", "ț", "ƭ", "ᵵ", "ƫ", "ᶵ", "ʇ", "ȶ", "ꝷ"] + "/tc": ["ʨ"] + "/tg": ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] + "/th": ["ᵺ"] + "/tq": ["☀", "☁", "⛅", "⛈", "⛆", "☂", "☔", "☃", "⛄", "⛇"] + "/ts": ["ʦ", "ʧ"] + "/tt": ["☄", "☼", "☽", "☾", "☿", "♀", "♁", "♂", "♃", "♄", "♅", "♆", "♇"] + "/txj": ["⚊", "⚋", "⚌", "⚍", "⚎", "⚏", "𝌀", "𝌁", "𝌂", "𝌃", "𝌄", "𝌅", "𝌆", "𝌇", "𝌈", "𝌉", "𝌊", "𝌋", "𝌌", "𝌍", "𝌎", "𝌏", "𝌐", "𝌑", "𝌒", "𝌓", "𝌔", "𝌕", "𝌖", "𝌗", "𝌘", "𝌙", "𝌚", "𝌛", "𝌜", "𝌝", "𝌞", "𝌟", "𝌠", "𝌡", "𝌢", "𝌣", "𝌤", "𝌥", "𝌦", "𝌧", "𝌨", "𝌩", "𝌪", "𝌫", "𝌬", "𝌭", "𝌮", "𝌯", "𝌰", "𝌱", "𝌲", "𝌳", "𝌴", "𝌵", "𝌶", "𝌷", "𝌸", "𝌹", "𝌺", "𝌻", "𝌼", "𝌽", "𝌾", "𝌿", "𝍀", "𝍁", "𝍂", "𝍃", "𝍄", "𝍅", "𝍆", "𝍇", "𝍈", "𝍉", "𝍊", "𝍋", "𝍌", "𝍍", "𝍎", "𝍏", "𝍐", "𝍑", "𝍒", "𝍓", "𝍔", "𝍕", "𝍖"] + "/tz": ["ꜩ"] + "/u": ["ū", "ú", "ű", "ǔ", "ù", "ȕ", "û", "ŭ", "ȗ", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ů", "ũ", "ᵤ", "ᵘ", "ʉ", "ᶶ", "ủ", "ų", "ṷ", "ụ", "ṳ", "ṵ", "ư", "ʊ", "ᶷ", "ᵿ", "ᶙ", "ṻ", "ṹ", "ứ", "ừ", "ữ", "ử", "ự", "ꭒ", "ꭟ", "ꝸ", "ꭎ", "ꭏ", "ᴝ", "ᵙ", "ᴞ"] + "/ue": ["ᵫ"] + "/v": ["ü", "ǖ", "ǘ", "ǚ", "ǜ", "ṽ", "ᵛ", "ᵥ", "ṿ", "ꝟ", "ʋ", "ᶹ", "ᶌ", "ⱴ", "ⱱ", "ỽ", "ʌ", "ᶺ"] + "/vy": ["ꝡ"] + "/w": ["ẃ", "ẁ", "ŵ", "ẇ", "ẅ", "ẘ", "ʷ", "ẉ", "ƿ", "ʍ", "ⱳ"] + "/ww": ["ʬ"] + "/x": ["ẋ", "ẍ", "ᶍ", "ˣ", "ₓ", "ꭖ", "ꭗ", "ꭘ", "ꭙ"] + "/xb": ["₀", "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉", "₊", "₋", "₌", "₍", "₎", "‸", "ᴀ", "ₐ", "ᴁ", "ʙ", "ᴃ", "ᵦ", "ᴄ", "ᴐ", "ᴒ", "ᴅ", "ᴆ", "ᴇ", "ₑ", "ₔ", "ᵩ", "ɢ", "ʛ", "ᴦ", "ᵧ", "ʜ", "ₕ", "ɪ", "ᵻ", "ᵢ", "ᴊ", "ⱼ", "ᴋ", "ₖ", "ʟ", "ₗ", "ᴌ", "ᴧ", "ᴍ", "ₘ", "ꟺ", "ɴ", "ᴎ", "ₙ", "ᴏ", "ₒ", "ɶ", "ʘ", "ᴓ", "ᴑ", "ᴘ", "ₚ", "ᴨ", "ᴪ", "ʀ", "ᵣ", "ᴙ", "ʁ", "ᴚ", "ᵨ", "ₛ", "ᴛ", "ₜ", "ᴜ", "ᵤ", "ᵾ", "ᴠ", "ᵥ", "ᴡ", "ₓ", "ᵪ", "ʏ", "ᴢ", "ᴣ"] + "/xh": ["★", "☆", "⛤", "⛥", "⛦", "⛧", "✡", "❋", "❊", "❉", "❈", "❇", "❆", "❅", "❄", "❃", "❂", "❁", "❀", "✿", "✾", "✽", "✼", "✻", "✺", "✹", "✸", "✷", "✶", "✵", "✴", "✳", "✲", "✱", "✰", "✯", "✮", "✭", "✬", "✫", "✪", "✩", "✧", "✦", "✥", "✤", "✣", "✢"] + "/xl": ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "ς", "τ", "υ", "φ", "χ", "ψ", "ω"] + "/xld": ["Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω"] + "/xq": ["♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟"] + "/xz": ["♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓"] + "/xzm": ["白羊座", "金牛座", "雙子座", "巨蟹座", "獅子座", "室女座", "天秤座", "天蠍座", "人馬座", "摩羯座", "寶瓶座", "雙魚座"] + "/y": ["ȳ", "ý", "ỳ", "ŷ", "ẏ", "ÿ", "ẙ", "ỹ", "ʸ", "ɏ", "ỷ", "ỵ", "ƴ", "ʎ", "ỿ", "ꭚ"] + "/yf": ["㋀", "㋁", "㋂", "㋃", "㋄", "㋅", "㋆", "㋇", "㋈", "㋉", "㋊", "㋋"] + "/yr": ["月", "火", "水", "木", "金", "土", "日", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊗", "㊡", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈷", "㉁", "㉀"] + "/yy": ["𝄞", "♩", "♪", "♫", "♬", "♭", "♮", "♯"] + "/z": ["ź", "ž", "ẑ", "ż", "ᶻ", "ʐ", "ᶼ", "ʑ", "ᶽ", "ƶ", "ẕ", "ẓ", "ᵶ", "ȥ", "ⱬ", "ᶎ", "ʒ", "ᶾ", "ǯ", "ʓ", "ƹ", "ƺ", "ᶚ", "θ", "ᶿ", "ɀ", "ꝣ"] + "/zmh": ["⒜", "⒝", "⒞", "⒟", "⒠", "⒡", "⒢", "⒣", "⒤", "⒥", "⒦", "⒧", "⒨", "⒩", "⒪", "⒫", "⒬", "⒭", "⒮", "⒯", "⒰", "⒱", "⒲", "⒳", "⒴", "⒵"] + "/zmq": ["ⓐ", "Ⓐ", "ⓑ", "Ⓑ", "ⓒ", "Ⓒ", "ⓓ", "Ⓓ", "ⓔ", "Ⓔ", "ⓕ", "Ⓕ", "ⓖ", "Ⓖ", "ⓗ", "Ⓗ", "ⓘ", "Ⓘ", "ⓙ", "Ⓙ", "ⓚ", "Ⓚ", "ⓛ", "Ⓛ", "ⓜ", "Ⓜ", "ⓝ", "Ⓝ", "ⓞ", "Ⓞ", "ⓟ", "Ⓟ", "ⓠ", "Ⓠ", "ⓡ", "Ⓡ", "ⓢ", "Ⓢ", "ⓣ", "Ⓣ", "ⓤ", "Ⓤ", "ⓥ", "Ⓥ", "ⓦ", "Ⓦ", "ⓧ", "Ⓧ", "ⓨ", "Ⓨ", "ⓩ", "Ⓩ"] + "/zy": ["ㄅ", "ㄆ", "ㄇ", "ㄈ", "ㄉ", "ㄊ", "ㄋ", "ㄌ", "ㄍ", "ㄎ", "ㄏ", "ㄐ", "ㄑ", "ㄒ", "ㄓ", "ㄔ", "ㄕ", "ㄖ", "ㄗ", "ㄘ", "ㄙ", "ㄧ", "ㄨ", "ㄩ", "ㄚ", "ㄛ", "ㄜ", "ㄝ", "ㄞ", "ㄟ", "ㄠ", "ㄡ", "ㄢ", "ㄣ", "ㄤ", "ㄥ", "ㄦ", "ㄪ", "ㄫ", "ㄬ", "ㄭ", "ㆠ", "ㆡ", "ㆢ", "ㆣ", "ㆤ", "ㆥ", "ㆦ", "ㆧ", "ㆨ", "ㆩ", "ㆪ", "ㆫ", "ㆬ", "ㆭ", "ㆮ", "ㆯ", "ㆰ", "ㆱ", "ㆲ", "ㆳ", "ㆴ", "ㆵ", "ㆶ", "ㆷ"] +recognizer: + import_preset: default + patterns: + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + punct: "^/([0-9]0?|[A-Za-z]+)$" + reverse_lookup: "`[a-z]*'?$" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +reverse_lookup: + comment_format: + - "xform/([nl])v/$1ü/" + dictionary: stroke + enable_completion: true + preedit_format: + - "xlit/hspnz/一丨丿丶乙/" + prefix: "`" + suffix: "'" + tips: "〔筆畫〕" +schema: + author: + - "佛振 " + dependencies: + - stroke + description: | + 朙月拼音,簡化字輸出模式。 + + name: "朙月拼音·简化字" + schema_id: luna_pinyin_simp + version: 0.22 +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +simplifier: + option_name: zh_simp +speller: + algebra: + - "abbrev/^([a-z]).+$/$1/" + - "abbrev/^([zcs]h).+$/$1/" + - "derive/^([nl])ve$/$1ue/" + - "derive/^([jqxy])u/$1v/" + - "derive/un$/uen/" + - "derive/ui$/uei/" + - "derive/iu$/iou/" + - "derive/([aeiou])ng$/$1gn/" + - "derive/([dtngkhrzcs])o(u|ng)$/$1o/" + - "derive/ong$/on/" + - "derive/ao$/oa/" + - "derive/([iu])a(o|ng?)$/a$1$2/" + alphabet: zyxwvutsrqponmlkjihgfedcba + delimiter: " '" +switches: + - name: ascii_mode + reset: 0 + states: ["中文", "西文"] + - name: full_shape + states: ["半角", "全角"] + - name: zh_simp + reset: 1 + states: ["漢字", "汉字"] + - name: ascii_punct + states: ["。,", ".,"] +translator: + dictionary: luna_pinyin + preedit_format: + - "xform/([nl])v/$1ü/" + - "xform/([nl])ue/$1üe/" + - "xform/([jqxy])v/$1u/" + prism: luna_pinyin_simp \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.prism.bin new file mode 100644 index 0000000..de8f558 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.schema.yaml new file mode 100644 index 0000000..ff35014 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/melt_eng.schema.yaml @@ -0,0 +1,405 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + key_bindings: 1774018450 + key_bindings.custom: 0 + melt_eng.custom: 0 + melt_eng.schema: 1774239672 + punctuation: 1774018450 + punctuation.custom: 0 +algebra_abc: + __append: + - "derive/(?": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": "@" + "[": ["「", "【", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": ["~", "~"] + import_preset: default +recognizer: + import_preset: default + patterns: + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +schema: + author: + - "Patrick " + - "tumuyan " + description: "Easy English Nano,只包含少量常用词汇,方便中英文混合输入度方案调用。" + name: "Easy English Nano" + schema_id: melt_eng + version: "2026-01-30" +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + algebra: + __append: ["derive/(?/" + - "xform/^ch//" + - "xform/^sh//" + - "xform/'zh/'/" + - "xform/'ch/'/" + - "xform/'sh/'/" + - "xform/^([aoe].*)(?=^|$|')/$1/" + - "xform/'([aoe].*)(?=^|$|')/'$1/" + - "xform/ei(?=^|$|')//" + - "xform/ian(?=^|$|')//" + - "xform/er(?=^|$|')|iu(?=^|$|')//" + - "xform/[iu]ang(?=^|$|')//" + - "xform/ing(?=^|$|')//" + - "xform/uo(?=^|$|')//" + - "xform/uan(?=^|$|')/

/" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]a(?=^|$|')//" + - "xform/en(?=^|$|')//" + - "xform/eng(?=^|$|')//" + - "xform/ang(?=^|$|')//" + - "xform/an(?=^|$|')//" + - "xform/iao(?=^|$|')//" + - "xform/ao(?=^|$|')//" + - "xform/in(?=^|$|')|uai(?=^|$|')//" + - "xform/ai(?=^|$|')//" + - "xform/ie(?=^|$|')//" + - "xform/ou(?=^|$|')//" + - "xform/un(?=^|$|')//" + - "xform/[uv]e(?=^|$|')|ui(?=^|$|')//" + - "xform/'|<|>//" +algebra_double_pinyin: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe])([ioun])(?=^|$|')/$1$1$2/" + - "derive/'([aoe])([ioun])(?=^|$|')/'$1$1$2/" + - "xform/^([aoe])(ng)?(?=^|$|')/$1$1$2/" + - "xform/'([aoe])(ng)?(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/[uv]an(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/ing(?=^|$|')|uai(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/[uv]n(?=^|$|')/

/" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])ei(?=^|$|')/$1/" + - "xform/ie(?=^|$|')//" + - "xform/ui(?=^|$|')//" + - "xform/([a-z>])ou(?=^|$|')/$1/" + - "xform/in(?=^|$|')//" + - "xform/'|<|>//" +algebra_flypy: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe])([ioun])(?=^|$|')/$1$1$2/" + - "derive/'([aoe])([ioun])(?=^|$|')/'$1$1$2/" + - "xform/^([aoe])(ng)?(?=^|$|')/$1$1$2/" + - "xform/'([aoe])(ng)?(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/(.)ei(?=^|$|')/$1/" + - "xform/uan(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/un(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/ie(?=^|$|')/

/" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/ing(?=^|$|')|uai(?=^|$|')//" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/([a-z>])ou(?=^|$|')/$1/" + - "xform/[iu]a(?=^|$|')//" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/ui(?=^|$|')//" + - "xform/in(?=^|$|')//" + - "xform/'|<|>//" +algebra_jiajia: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe])([ioun])(?=^|$|')/$1$1$2/" + - "derive/'([aoe])([ioun])(?=^|$|')/'$1$1$2/" + - "xform/^([aoe])(ng)?(?=^|$|')/$1$1$2/" + - "xform/'([aoe])(ng)?(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/[uv]an(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/ing(?=^|$|')|er(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/[uv]n(?=^|$|')//" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])ei(?=^|$|')/$1/" + - "xform/ie(?=^|$|')//" + - "xform/ui(?=^|$|')//" + - "xform/([a-z>])ou(?=^|$|')/$1

/" + - "xform/in(?=^|$|')//" + - "xform/'|<|>//" +algebra_mspy: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe].*)(?=^|$|')/o$1/" + - "derive/'([aoe].*)(?=^|$|')/'o$1/" + - "xform/^([ae])(.*)(?=^|$|')/$1$1$2/" + - "xform/'([ae])(.*)(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/er(?=^|$|')|[uv]an(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/v(?=^|$|')|uai(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/[uv]n(?=^|$|')/

/" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])ei(?=^|$|')/$1/" + - "xform/ie(?=^|$|')//" + - "xform/ui(?=^|$|')//" + - "derive/(?=^|$|')//" + - "xform/([a-z>])ou(?=^|$|')/$1/" + - "xform/in(?=^|$|')//" + - "xform/ing(?=^|$|')/;/" + - "xform/'|<|>//" +algebra_pinyin: + - "xform/'//" + - "derive/^([nl])ue$/$1ve/" + - "derive/'([nl])ue$/'$1ve/" + - "derive/^([jqxy])u/$1v/" + - "derive/'([jqxy])u/'$1v/" +algebra_sogou: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe].*)(?=^|$|')/o$1/" + - "derive/'([aoe].*)(?=^|$|')/'o$1/" + - "xform/^([ae])(.*)(?=^|$|')/$1$1$2/" + - "xform/'([ae])(.*)(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/er(?=^|$|')|[uv]an(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/v(?=^|$|')|uai(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/[uv]n(?=^|$|')/

/" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])ei(?=^|$|')/$1/" + - "xform/ie(?=^|$|')//" + - "xform/ui(?=^|$|')//" + - "xform/([a-z>])ou(?=^|$|')/$1/" + - "xform/in(?=^|$|')//" + - "xform/ing(?=^|$|')/;/" + - "xform/'|<|>//" +algebra_ziguang: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "xform/'([aoe].*)(?=^|$|')/'$1/" + - "xform/^([aoe].*)(?=^|$|')/$1/" + - "xform/en(?=^|$|')//" + - "xform/eng(?=^|$|')//" + - "xform/in(?=^|$|')|uai(?=^|$|')//" + - "xform/^zh//" + - "xform/^sh//" + - "xform/'zh/'/" + - "xform/'sh/'/" + - "xform/uo(?=^|$|')//" + - "xform/ai(?=^|$|')/

/" + - "xform/^ch//" + - "xform/'ch/'/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/ang(?=^|$|')//" + - "xform/ie(?=^|$|')//" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/er(?=^|$|')|iu(?=^|$|')//" + - "xform/ei(?=^|$|')//" + - "xform/uan(?=^|$|')//" + - "xform/ing(?=^|$|')/;/" + - "xform/ou(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/iao(?=^|$|')//" + - "xform/ue(?=^|$|')|ui(?=^|$|')|ve(?=^|$|')//" + - "xform/un(?=^|$|')//" + - "xform/ao(?=^|$|')//" + - "xform/an(?=^|$|')//" + - "xform/'|<|>//" +engine: + filters: + - uniquifier + processors: + - key_binder + - speller + - selector + - navigator + - express_editor + segmentors: + - abc_segmentor + translators: + - echo_translator + - table_translator +menu: + page_size: 6 +schema: + author: Mirtle + description: | + 用拼音按顺序打出偏旁部件,组合出汉字 + 码表:开放词典 / henrysting / Mirtle + 注音、校对、方案:Mirtle + 仓库:https://github.com/mirtlecn/rime_radical_pinyin + + name: "部件拆字 | 全拼双拼" + schema_id: radical_pinyin + version: 3.0.0 +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + algebra: + - "derive/^([jqxy])u(?=^|$|')/$1v/" + - "derive/'([jqxy])u(?=^|$|')/'$1v/" + - "derive/^([aoe])([ioun])(?=^|$|')/$1$1$2/" + - "derive/'([aoe])([ioun])(?=^|$|')/'$1$1$2/" + - "xform/^([aoe])(ng)?(?=^|$|')/$1$1$2/" + - "xform/'([aoe])(ng)?(?=^|$|')/'$1$1$2/" + - "xform/iu(?=^|$|')//" + - "xform/[iu]a(?=^|$|')//" + - "xform/[uv]an(?=^|$|')//" + - "xform/[uv]e(?=^|$|')//" + - "xform/ing(?=^|$|')|er(?=^|$|')//" + - "xform/^sh//" + - "xform/^ch//" + - "xform/^zh//" + - "xform/'sh/'/" + - "xform/'ch/'/" + - "xform/'zh/'/" + - "xform/uo(?=^|$|')//" + - "xform/[uv]n(?=^|$|')//" + - "xform/([a-z>])i?ong(?=^|$|')/$1/" + - "xform/[iu]ang(?=^|$|')//" + - "xform/([a-z>])en(?=^|$|')/$1/" + - "xform/([a-z>])eng(?=^|$|')/$1/" + - "xform/([a-z>])ang(?=^|$|')/$1/" + - "xform/ian(?=^|$|')//" + - "xform/([a-z>])an(?=^|$|')/$1/" + - "xform/iao(?=^|$|')//" + - "xform/([a-z>])ao(?=^|$|')/$1/" + - "xform/([a-z>])ai(?=^|$|')/$1/" + - "xform/([a-z>])ei(?=^|$|')/$1/" + - "xform/ie(?=^|$|')//" + - "xform/ui(?=^|$|')//" + - "xform/([a-z>])ou(?=^|$|')/$1

/" + - "xform/in(?=^|$|')//" + - "xform/'|<|>//" + alphabet: "abcdefghijklmnopqrstuvwxyz;" + delimiter: " '" +translator: + dictionary: radical_pinyin + enable_user_dict: false \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.prism.bin new file mode 100644 index 0000000..c99186a Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.schema.yaml new file mode 100644 index 0000000..a38f2d8 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/rime_ice.schema.yaml @@ -0,0 +1,903 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + key_bindings: 1774018450 + key_bindings.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 + rime_ice.custom: 0 + rime_ice.schema: 1774239672 + symbols_v: 1774239672 + symbols_v.custom: 0 +cn_en: + comment_format: + - "xform/^.+$//" + db_class: stabledb + dictionary: "" + enable_completion: true + enable_sentence: false + initial_quality: 0.5 + user_dict: "en_dicts/cn_en" +custom_phrase: + db_class: stabledb + dictionary: "" + enable_completion: false + enable_sentence: false + initial_quality: 99 + user_dict: custom_phrase +date_translator: + date: rq + dateen: rqen + datetime: dt + datezh: rqzh + time: sj + timestamp: ts + week: xq +editor: + bindings: + BackSpace: revert + "Control+BackSpace": back_syllable + "Control+Delete": delete_candidate + "Control+Return": commit_script_text + "Control+Shift+Return": commit_comment + Delete: delete + Escape: cancel + Return: commit_raw_input + space: confirm +emoji: + inherit_comment: false + opencc_config: emoji.json + option_name: emoji +engine: + filters: + - "lua_filter@*corrector" + - "reverse_lookup_filter@radical_reverse_lookup" + - "lua_filter@*autocap_filter" + - "lua_filter@*v_filter" + - "lua_filter@*pin_cand_filter" + - "lua_filter@*long_word_filter" + - "lua_filter@*reduce_english_filter" + - "simplifier@emoji" + - "simplifier@traditionalize" + - "lua_filter@*search@radical_pinyin" + - uniquifier + processors: + - "lua_processor@*select_character" + - ascii_composer + - recognizer + - key_binder + - speller + - punctuator + - selector + - navigator + - express_editor + segmentors: + - ascii_segmentor + - matcher + - abc_segmentor + - "affix_segmentor@radical_lookup" + - punct_segmentor + - fallback_segmentor + translators: + - punct_translator + - script_translator + - "lua_translator@*date_translator" + - "lua_translator@*lunar" + - "lua_translator@*uuid" + - "table_translator@custom_phrase" + - "table_translator@melt_eng" + - "table_translator@cn_en" + - "table_translator@radical_lookup" + - "lua_translator@*unicode" + - "lua_translator@*number_translator" + - "lua_translator@*calc_translator" + - "lua_translator@*force_gc" +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} + import_preset: default + search: "`" +long_word_filter: + count: 2 + idx: 4 +lunar: nl +melt_eng: + comment_format: + - "xform/.*//" + dictionary: melt_eng + enable_sentence: false + enable_user_dict: false + initial_quality: 1.1 +menu: + page_size: 6 +pin_cand_filter: + - "d\t的" + - "m\t吗 嘛" + - "hm\t后面" +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": "@" + "[": ["「", "【", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": ["~", "~"] + symbols: + v0: ["零", "〇", "⁰", "₀", "⓪", "⓿", "0"] + v1: ["一", "壹", "¹", "₁", "Ⅰ", "ⅰ", "①", "➀", "❶", "➊", "⓵", "⑴", "⒈", "1", "㊀", "㈠", "弌", "壱", "幺", "㆒"] + v10: ["十", "拾", "¹⁰", "₁₀", "Ⅹ", "ⅹ", "⑩", "➉", "❿", "➓", "⓾", "⑽", "⒑", "10", "㊉", "㈩", "什"] + v2: ["二", "贰", "²", "₂", "Ⅱ", "ⅱ", "②", "➁", "❷", "➋", "⓶", "⑵", "⒉", "2", "㊁", "㈡", "弍", "弐", "貮", "㒃", "㒳", "两", "俩", "㆓"] + v3: ["三", "叁", "³", "₃", "Ⅲ", "ⅲ", "③", "➂", "❸", "➌", "⓷", "⑶", "⒊", "3", "㊂", "㈢", "参", "参", "叁", "弎", "仨", "㆔"] + v4: ["四", "肆", "⁴", "₄", "Ⅳ", "ⅳ", "④", "➃", "❹", "➍", "⓸", "⑷", "⒋", "4", "㊃", "㈣", "亖"] + v5: ["五", "伍", "⁵", "₅", "Ⅴ", "ⅴ", "⑤", "➄", "❺", "➎", "⓹", "⑸", "⒌", "5", "㊄", "㈤", "㐅", "㠪", "𠄡"] + v6: ["六", "陆", "⁶", "₆", "Ⅵ", "ⅵ", "⑥", "➅", "❻", "➏", "⓺", "⑹", "⒍", "6", "㊅", "㈥", "ↅ"] + v7: ["七", "柒", "⁷", "₇", "Ⅶ", "ⅶ", "⑦", "➆", "❼", "➐", "⓻", "⑺", "⒎", "7", "㊆", "㈦", "漆"] + v8: ["八", "捌", "⁸", "₈", "Ⅷ", "ⅷ", "⑧", "➇", "❽", "➑", "⓼", "⑻", "⒏", "8", "㊇", "㈧"] + v9: ["九", "玖", "⁹", "₉", "Ⅸ", "ⅸ", "⑨", "➈", "❾", "➒", "⓽", "⑼", "⒐", "9", "㊈", "㈨"] + vA: ["Ā", "Á", "Ǎ", "À", "Ȁ", "Â", "Ă", "Ȃ", "Ȧ", "Ä", "Å", "Ã", "ᴀ", "ᴬ", "Ⱥ", "Ả", "Ą", "Ạ", "Ḁ", "Ấ", "Ầ", "Ẫ", "Ẩ", "Ắ", "Ằ", "Ẵ", "Ẳ", "Ǡ", "Ǟ", "Ǻ", "Ậ", "Ặ", "Ɐ", "Ɑ", "Ɒ"] + vAA: ["Ꜳ"] + vAE: ["Æ", "Ǣ", "Ǽ", "ᴭ", "ᴁ"] + vAO: ["Ꜵ"] + vAU: ["Ꜷ"] + vAV: ["Ꜹ", "Ꜻ"] + vAY: ["Ꜽ"] + vB: ["Ḃ", "Ḅ", "ʙ", "ᴃ", "ᴮ", "ᴯ", "Ƀ", "Ƃ", "Ḇ", "Ɓ", "Ꞗ"] + vC: ["Ç", "Ć", "Č", "Ĉ", "Ċ", "ᴄ", "Ȼ", "Ꞓ", "Ƈ", "Ḉ", "Ꜿ"] + vD: ["Ď", "Ḋ", "ᴅ", "ᴆ", "ᴰ", "Đ", "Ƌ", "Ḑ", "Ḓ", "Ḏ", "Ḍ", "Ɖ", "Ɗ", "Ð", "DZ", "Dz", "DŽ", "Dž"] + vE: ["Ē", "É", "Ě", "È", "Ȅ", "Ê", "Ĕ", "Ȇ", "Ė", "Ë", "Ẽ", "ᴇ", "ᴱ", "Ɇ", "Ẻ", "Ȩ", "Ę", "Ḙ", "Ẹ", "Ḛ", "Ḗ", "Ḕ", "Ế", "Ề", "Ễ", "Ể", "Ḝ", "Ệ", "Ə", "Ɛ", "Ɜ", "Ǝ", "ⱻ", "ᴲ", "Ȝ"] + vF: ["Ḟ", "ꜰ", "Ƒ", "Ꞙ", "ꟻ"] + vG: ["Ḡ", "Ǵ", "Ǧ", "Ĝ", "Ğ", "Ġ", "ʛ", "ᴳ", "Ǥ", "Ꞡ", "Ģ", "Ɠ", "Ɡ", "Ɣ"] + vH: ["Ĥ", "Ȟ", "Ḣ", "Ḧ", "ʜ", "ᴴ", "Ħ", "Ɦ", "Ꜧ", "Ḩ", "Ḫ", "Ḥ", "Ⱨ", "Ɥ", "Ⱶ"] + vHV: ["Ƕ"] + vI: ["Ī", "Í", "Ǐ", "Ì", "Ȉ", "Î", "Ĭ", "Ȋ", "Ï", "Ĩ", "ɪ", "ᴵ", "ᶦ", "Ɨ", "ᵻ", "ᶧ", "Ỉ", "Į", "Ị", "Ḭ", "Ḯ", "ꟾ", "Ɩ"] + vIJ: ["IJ"] + vJ: ["Ĵ", "ᴊ", "ᴶ", "Ɉ", "Ʝ"] + vK: ["Ḱ", "Ǩ", "ᴋ", "ᴷ", "Ꝁ", "Ꝃ", "Ꞣ", "Ꝅ", "Ķ", "Ḵ", "Ḳ", "Ƙ", "Ⱪ", "Ʞ"] + vL: ["Ĺ", "ʟ", "ᶫ", "Ƚ", "Ꝉ", "Ł", "ᴌ", "Ⱡ", "Ɫ", "Ɬ", "Ľ", "Ļ", "Ḻ", "Ḽ", "Ḷ", "Ŀ", "Ꝇ"] + vLL: ["Ỻ"] + vM: ["Ḿ", "Ṁ", "ᴍ", "ᴹ", "Ṃ", "Ɱ", "Ɯ", "ꟽ", "ꟿ"] + vN: ["Ń", "Ň", "Ǹ", "Ṅ", "Ñ", "ɴ", "ᴺ", "ᴻ", "ᶰ", "Ɲ", "Ƞ", "Ŋ", "Ņ", "Ṉ", "Ṋ", "Ṇ", "Ꞑ"] + vNJ: ["NJ"] + vNj: ["Nj"] + vO: ["Ō", "Ó", "Ő", "Ǒ", "Ò", "Ô", "Ŏ", "Ȯ", "Ö", "Õ", "ᴏ", "ᴼ", "Ɔ", "ᴐ", "Ø", "Ǫ", "Ọ", "Ơ", "Ɵ", "Ꝋ", "Ꝍ", "Ṓ", "Ṑ", "Ố", "Ồ", "Ỗ", "Ổ", "Ȱ", "Ȫ", "Ȭ", "Ṍ", "Ṏ", "Ộ", "Ǭ", "Ǿ", "Ớ", "Ờ", "Ỡ", "Ở", "Ợ"] + vOE: ["Œ", "ɶ"] + vOI: ["Ƣ"] + vOO: ["Ꝏ"] + vOU: ["Ȣ", "ᴽ"] + vP: ["Ṕ", "Ṗ", "ᴘ", "ᴾ", "Ᵽ", "Ꝑ", "Ƥ", "Ꝓ", "Ꝕ", "ꟼ"] + vQ: ["Ɋ", "Ꝗ", "Ꝙ"] + vR: ["Ŕ", "Ř", "Ȑ", "Ȓ", "Ṙ", "ʀ", "ᴙ", "ᴿ", "Ʀ", "ꭆ", "Ɍ", "Ꞧ", "Ŗ", "Ṟ", "Ṛ", "Ṝ", "Ɽ", "ꝶ", "ʶ", "ʁ", "Ꝛ", "Ꝝ"] + vRx: ["℞"] + vS: ["Ś", "Ŝ", "Š", "Ṡ", "ꜱ", "Ꞩ", "Ş", "Ṣ", "Ș", "Ṥ", "Ṧ", "Ṩ", "Ʃ", "ẞ"] + vT: ["Ť", "Ṫ", "ᴛ", "ᵀ", "Ʈ", "Þ", "Ꝥ", "Ꝧ", "Ŧ", "Ⱦ", "Ţ", "Ṯ", "Ṱ", "Ṭ", "Ț", "Ƭ", "Ʇ"] + vTZ: ["Ꜩ"] + vU: ["Ū", "Ú", "Ű", "Ǔ", "Ù", "Ȕ", "Û", "Ŭ", "Ȗ", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ů", "Ũ", "ᴜ", "ᵁ", "ᶸ", "Ʉ", "Ủ", "Ų", "Ṷ", "Ụ", "Ṳ", "Ṵ", "Ư", "Ʊ", "Ṻ", "Ṹ", "Ứ", "Ừ", "Ữ", "Ử", "Ự"] + vV: ["Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ṽ", "ᴠ", "ⱽ", "Ṿ", "Ꝟ", "Ʋ", "Ỽ", "Ʌ"] + vVY: ["Ꝡ"] + vW: ["Ẃ", "Ẁ", "Ŵ", "Ẇ", "Ẅ", "W̊", "ᴡ", "ᵂ", "Ẉ", "Ƿ", "Ⱳ"] + vX: ["Ẋ", "Ẍ"] + vY: ["Ȳ", "Ý", "Ỳ", "Ŷ", "Ẏ", "Ÿ", "Ỹ", "ʏ", "Ɏ", "Ỷ", "Ỵ", "Ƴ", "Ỿ"] + vZ: ["Ź", "Ž", "Ẑ", "Ż", "ᴢ", "Ƶ", "Ẕ", "Ẓ", "Ȥ", "Ⱬ", "Ʒ", "ᴣ", "Ǯ", "Ƹ", "Ɀ", "Ꝣ"] + va: ["ā", "á", "ǎ", "à", "ȁ", "â", "ă", "ȃ", "ȧ", "ä", "å", "ã", "ₐ", "ᵃ", "ª", "ⱥ", "ꬰ", "ả", "ą", "ạ", "ḁ", "ẚ", "ấ", "ầ", "ẫ", "ẩ", "ắ", "ằ", "ẵ", "ẳ", "ǡ", "ǟ", "ǻ", "ậ", "ặ", "ᶏ", "ɐ", "ᵄ", "ɑ", "ᵅ", "ᶐ", "ɒ", "ᶛ"] + vaa: ["ꜳ"] + vae: ["æ", "ǣ", "ǽ", "ᵆ", "ᴂ"] + vao: ["ꜵ"] + vau: ["ꜷ"] + vav: ["ꜹ", "ꜻ"] + vay: ["ꜽ"] + vb: ["ḃ", "ḅ", "ᵇ", "ƀ", "ƃ", "ḇ", "ɓ", "ᵬ", "ᶀ", "ꞗ"] + vbackspace: ["⌫"] + vbai: ["佰"] + vbd: ["、", "。", "「", "」", "『", "』", "【", "】", "〈", "〉", "《", "》", "₋", "⁻", "―", "˗", "ˉ", "_", "﹍", "﹎", ".", "¡", "‼", "⁉", "¿", "؟", "⁈", "⁇", "、", "。", "〃", "〄", "々", "〆", "〇", "〒", "〓", "〔", "〕", "〖", "〗", "〘", "〙", "〚", "〛", "〜", "〝", "〞", "〟", "〠", "〰", "〱", "〲", "〳", "〴", "〵", "〶", "〷", "〻", "〼", "〽"] + vbdz: ["﹅", "﹆", "﹁", "﹂", "﹃", "﹄", "︙", "︱", "︻", "︼", "︗", "︘", "︵", "︶", "︷", "︸", "︹", "︺", "︿", "﹀", "︽", "︾", "︰", "︲", "︳", "︴", "﹉", "﹊", "﹋", "﹌", "﹍", "﹎", "﹏", "﹇", "﹈", "︐", "︑", "︒", "︔", "︕", "︖"] + vbdzy: ["‐", "‑", "‒", "–", "—", "―", "‖", "‗", "‘", "’", "‚", "‛", "“", "”", "„", "‟", "†", "‡", "•", "‣", "․", "‥", "…", "‧", "‰", "‱", "′", "″", "‴", "‵", "‶", "‷", "‸", "‹", "›", "※", "‼", "‽", "‾", "‿", "⁀", "⁁", "⁂", "⁃", "⁄", "⁅", "⁆", "⁇", "⁈", "⁉", "⁊", "⁋", "⁌", "⁍", "⁎", "⁏", "⁐", "⁑", "⁒", "⁓", "⁔", "⁕", "⁖", "⁗", "⁘", "⁙", "⁚", "⁛", "⁜", "⁝", "⁞"] + vbg: ["☰", "☱", "☲", "☳", "☴", "☵", "☶", "☷"] + vbgm: ["乾", "兑", "离", "震", "巽", "坎", "艮", "坤"] + vbh: ["㇀", "㇁", "㇂", "㇃", "㇄", "㇅", "㇆", "㇇", "㇈", "㇉", "㇊", "㇋", "㇌", "㇍", "㇎", "㇏", "㇐", "㇑", "㇒", "㇓", "㇔", "㇕", "㇖", "㇗", "㇘", "㇙", "㇚", "㇛", "㇜", "㇝", "㇞", "㇟", "㇠", "㇡", "㇢", "㇣"] + vbq: ["☻", "☺", "☹"] + vbudeng: ["≠"] + vbudengyu: ["≠"] + vc: ["ç", "ć", "č", "ĉ", "ċ", "ᶜ", "ȼ", "ꞓ", "ƈ", "ḉ", "ꞔ", "ɕ", "ᶝ", "ꜿ"] + vcap: ["⇪"] + vcaps: ["⇪"] + vcheng: ["×"] + vchu: ["÷"] + vcmd: ["⌘"] + vctrl: ["⌃"] + vcuo: ["✗", "✘", "❎", "❌"] + vd: ["ď", "ḋ", "ᵈ", "đ", "ƌ", "ᵭ", "ḑ", "ḓ", "ḏ", "ḍ", "ɖ", "ɗ", "ᶑ", "ᶁ", "ð", "ᶞ", "ꝱ", "ʤ", "ʣ", "ʥ", "ȡ", "ƍ", "dz", "dž", "ẟ"] + vdayu: [">", "≥"] + vdb: ["ȸ"] + vdel: ["⌦"] + vdh: ["。", ".", ",", "、", ":", ";", "!", "‼", "?", "⁇"] + vdian: ["·"] + vdn: ["❖", "⌘", "⌃", "⌥", "⎇", "⇧", "⇪", "␣", "⇥", "⇤", "↩", "⌅", "⌤", "⌫", "⌦", "⌧", "⎋", "⌨", "◁", "⌀", "⌖", "⌗", "⏏", "↖", "↘", "⇞", "⇟", "⌚", "⏰", "⏱", "⏲", "⏳", "⌛", "⌜", "⌝⌞⌟", "⍑", "⏩", "⏪", "⏫", "⏬", "⏭", "⏮", "⏯"] + vdu: ["°", "°C", "°F"] + vdui: ["✓", "✔", "✅"] + vdw: ["Å", "℃", "%", "‰", "‱", "°", "℉", "㏃", "㏆", "㎈", "㏄", "㏅", "㎝", "㎠", "㎤", "㏈", "㎗", "㎙", "㎓", "㎬", "㏉", "㏊", "㏋", "㎐", "㏌", "㎄", "㎅", "㎉", "㎏", "㎑", "㏍", "㎘", "㎞", "㏎", "㎢", "㎦", "㎪", "㏏", "㎸", "㎾", "㏀", "㏐", "㏓", "㎧", "㎨", "㎡", "㎥", "㎃", "㏔", "㎆", "㎎", "㎒", "㏕", "㎖", "㎜", "㎟", "㎣", "㏖", "㎫", "㎳", "㎷", "㎹", "㎽", "㎿", "㏁", "㎁", "㎋", "㎚", "㎱", "㎵", "㎻", "㏘", "㎩", "㎀", "㎊", "㏗", "㏙", "㏚", "㎰", "㎴", "㎺", "㎭", "㎮", "㎯", "㏛", "㏜", "㎔", "㏝", "㎂", "㎌", "㎍", "㎕", "㎛", "㎲", "㎶", "㎼"] + vdz: ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] + ve: ["ē", "é", "ě", "è", "ȅ", "ê", "ĕ", "ȇ", "ė", "ë", "ẽ", "ₑ", "ᵉ", "ɇ", "ꬳ", "ẻ", "ȩ", "ę", "ḙ", "ẹ", "ḛ", "ḗ", "ḕ", "ế", "ề", "ễ", "ể", "ḝ", "ệ", "ᶒ", "ꬴ", "ɘ", "ə", "ɚ", "ᶕ", "ɛ", "ᵋ", "ᶓ", "ɜ", "ᵌ", "ᴈ", "ᶟ", "ɝ", "ᶔ", "ɞ", "ʚ", "ǝ", "ₔ", "ᵊ", "ȝ", "ⱸ"] + veject: ["⏏"] + vend: ["↘"] + venter: ["⏎"] + vescape: ["⎋"] + vey: ["а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"] + veyd: ["А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"] + vf: ["ḟ", "ᶠ", "ƒ", "ᵮ", "ᶂ", "ꞙ"] + vff: ["ff"] + vffi: ["ffi"] + vffl: ["ffl"] + vfh: ["©", "®", "℗", "℠", "™", "℡", "℻", "☇", "☈", "☉", "☊", "☋", "☌", "☍", "☎", "☏", "☐", "☑", "☒", "☓", "☕", "☖", "☗", "⛉", "⛊", "☘", "☙", "☚", "☛", "☜", "☝", "☞", "☟", "☠", "☡", "☢", "☣", "☤", "☥", "☦", "☧", "☨", "☩", "☪", "☫", "☬", "☭", "☮", "☯", "☸", "♨", "♰", "♱", "♲", "♳", "♴", "♵", "♶", "♷", "♸", "♹", "♺", "♻", "♼", "♽", "♾", "♿", "⚆", "⚇", "⚈", "⚉", "⚐", "⚑", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚘", "⚙", "⚚", "⚛", "⚜", "⚝", "⚞", "⚟", "⚠", "⚡", "⚰", "⚱", "⚲", "⚳", "⚴", "⚵", "⚶", "⚷", "⚸", "⚹", "⚺", "⚻", "⚼", "⚽", "⚾", "⚿", "⛀", "⛁", "⛂", "⛃", "⛋", "⛌", "⛍", "⛎", "⛏", "⛐", "⛑", "⛒", "⛓", "⛔", "⛕", "⛖", "⛗", "⛘", "⛙", "⛚", "⛛", "⛜", "⛝", "⛞", "⛟", "⛠", "⛡", "⛢", "⛣", "⛨", "⛩", "⛪", "⛫", "⛬", "⛭", "⛮", "⛯", "⛰", "⛱", "⛲", "⛳", "⛴", "⛵", "⛶", "⛷", "⛸", "⛹", "⛺", "⛻", "⛼", "⛽", "⛾", "⛿"] + vfi: ["fi"] + vfjz: ["⸺", "——", "……", "⋯⋯", "~", "-", "–", "—", "·", "・", "‧", "/", "/"] + vfk: ["▀", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊", "▋", "▌", "▍", "▎", "▏", "▐", "░", "▒", "▓", "▔", "▕", "▖", "▗", "▘", "▙", "▚", "▛", "▜", "▝", "▞", "▟"] + vfl: ["fl"] + vfn: ["ʩ"] + vfs: ["⅟", "½", "↉", "⅓", "⅔", "¼", "⅕", "⅖", "⅗", "⅘", "⅙", "⅚", "⅐", "⅛", "⅜", "⅝", "⅞", "⅑", "⅒"] + vg: ["ḡ", "ǵ", "ǧ", "ĝ", "ğ", "ġ", "ᵍ", "ǥ", "ꞡ", "ģ", "ɠ", "ᵷ", "ᶃ", "ɡ", "ꬶ", "ᶢ", "ɣ", "ˠ", "ɤ", "ᵹ"] + vgenhao: ["√"] + vgz: ["甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未", "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"] + vh: ["ĥ", "ȟ", "ḣ", "ḧ", "ͪ", "ħ", "ɦ", "ʱ", "ꜧ", "ꭜ", "ɧ", "ḩ", "ẖ", "ḫ", "ḥ", "ⱨ", "ꞕ", "ɥ", "ᶣ", "ʮ", "ʯ", "ⱶ"] + vhb: ["¥", "¥", "¤", "¢", "¢", "$", "$", "£", "£", "৳", "฿", "₠", "₡", "₢", "₣", "₤", "₥", "₦", "₧", "₩", "₪", "₫", "€", "₭", "₮", "₯", "₰", "₱", "₲", "₳", "₴", "₵", "₶", "₷", "₸", "₹", "₺", "₨", "﷼"] + vhj: ["_", "﹏", "●", "•"] + vhome: ["↖"] + vhsd: ["°F"] + vhv: ["ƕ"] + vhw: ["ㄱ", "ㄴ", "ㄷ", "ㄹ", "ㅁ", "ㅂ", "ㅅ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"] + vhwh: ["㈀", "㈁", "㈂", "㈃", "㈄", "㈅", "㈆", "㈇", "㈈", "㈉", "㈊", "㈋", "㈌", "㈍", "㈎", "㈏", "㈐", "㈑", "㈒", "㈓", "㈔", "㈕", "㈖", "㈗", "㈘", "㈙", "㈚", "㈛", "㈜", "㈝", "㈞"] + vhwq: ["㉠", "㉡", "㉢", "㉣", "㉤", "㉥", "㉦", "㉧", "㉨", "㉩", "㉪", "㉫", "㉬", "㉭", "㉮", "㉯", "㉰", "㉱", "㉲", "㉳", "㉴", "㉵", "㉶", "㉷", "㉸", "㉹", "㉺", "㉻", "㉼", "㉽", "㉾", "㉿"] + vhzh: ["㈠", "㈡", "㈢", "㈣", "㈤", "㈥", "㈦", "㈧", "㈨", "㈩", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈱", "㈲", "㈳", "㈴", "㈵", "㈶", "㈷", "㈸", "㈹", "㈺", "㈻", "㈼", "㈽", "㈾", "㈿", "㉀", "㉁", "㉂", "㉃"] + vhzq: ["㊀", "㊁", "㊂", "㊃", "㊄", "㊅", "㊆", "㊇", "㊈", "㊉", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊑", "㊒", "㊓", "㊔", "㊕", "㊖", "㊗", "㊘", "㊙", "㊚", "㊛", "㊜", "㊝", "㊞", "㊟", "㊠", "㊡", "㊢", "㊣", "㊤", "㊥", "㊦", "㊧", "㊨", "㊩", "㊪", "㊫", "㊬", "㊭", "㊮", "㊯", "㊰", "㉄", "㉅", "㉆", "㉇"] + vi: ["ī", "í", "ǐ", "ì", "ȉ", "î", "ĭ", "ȋ", "ï", "ĩ", "ᵢ", "ı", "ɨ", "ᶤ", "ỉ", "į", "ị", "ḭ", "ᴉ", "ᵎ", "ḯ", "ᶖ", "ɩ", "ᶥ", "ᵼ"] + vij: ["ij"] + viro: ["い", "ろ", "は", "に", "ほ", "へ", "と", "ち", "り", "ぬ", "る", "を", "わ", "か", "よ", "た", "れ", "そ", "つ", "ね", "な", "ら", "む", "う", "ゐ", "の", "お", "く", "や", "ま", "け", "ふ", "こ", "え", "て", "あ", "さ", "き", "ゆ", "め", "み", "し", "ゑ", "ひ", "も", "せ", "す"] + vj: ["ĵ", "ǰ", "ⱼ", "ʲ", "ɉ", "ȷ", "ɟ", "ᶡ", "ʄ", "ʝ", "ᶨ"] + vjg: ["⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿼", "⿸", "⿹", "⿺", "⿽", "⿻", "⿾", "⿿", "〾"] + vjgh: ["·"] + vjh: ["■", "□", "▢", "▣", "▤", "▥", "▦", "▧", "▨", "▩", "▪", "▫", "▬", "▭", "▮", "▯", "▰", "▱", "▲", "△", "▴", "▵", "▶", "▷", "▸", "▹", "►", "▻", "▼", "▽", "▾", "▿", "◀", "◁", "◂", "◃", "◄", "◅", "◆", "◇", "◈", "◉", "◊", "○", "◌", "◍", "◎", "●", "◐", "◑", "◒", "◓", "◔", "◕", "◖", "◗", "◘", "◙", "◚", "◛", "◜", "◝", "◞", "◟", "◠", "◡", "◢", "◣", "◤", "◥", "◦", "◧", "◨", "◩", "◪", "◫", "◬", "◭", "◮", "◯", "◰", "◱", "◲", "◳", "◴", "◵", "◶", "◷", "◸", "◹", "◺", "◻", "◼", "◽", "◾", "◿"] + vjm: ["あ", "ぁ", "い", "ぃ", "う", "ぅ", "え", "ぇ", "お", "ぉ", "か", "ゕ", "が", "き", "ぎ", "く", "ぐ", "け", "ゖ", "げ", "こ", "ご", "さ", "ざ", "し", "じ", "す", "ず", "せ", "ぜ", "そ", "ぞ", "た", "だ", "ち", "ぢ", "つ", "っ", "づ", "て", "で", "と", "ど", "な", "に", "ぬ", "ね", "の", "は", "ば", "ぱ", "ひ", "び", "ぴ", "ふ", "ぶ", "ぷ", "へ", "べ", "ぺ", "ほ", "ぼ", "ぽ", "ま", "み", "む", "め", "も", "や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ら", "り", "る", "れ", "ろ", "わ", "ゎ", "ゐ", "ゔ", "ゑ", "を", "ん", "・", "ー", "ゝ", "ゞ", "ゟ"] + vjma: ["あ", "か", "が", "さ", "ざ", "た", "だ", "な", "は", "ば", "ぱ", "ま", "や", "ら", "わ", "ア", "カ", "ガ", "サ", "ザ", "タ", "ダ", "ナ", "ハ", "バ", "パ", "マ", "ヤ", "ラ", "ワ"] + vjmb: ["ば", "び", "ぶ", "べ", "ぼ", "バ", "ビ", "ブ", "ベ", "ボ"] + vjmbj: ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "ッ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "・", "ー", "゙", "゚"] + vjmd: ["だ", "ぢ", "づ", "で", "ど", "ダ", "ヂ", "ヅ", "デ", "ド"] + vjme: ["え", "け", "げ", "せ", "ぜ", "て", "で", "ね", "へ", "べ", "ぺ", "め", "れ", "ゑ", "エ", "ケ", "ゲ", "セ", "ゼ", "テ", "デ", "ネ", "ヘ", "ベ", "ペ", "メ", "レ", "ヱ"] + vjmg: ["が", "ぎ", "ぐ", "げ", "ご", "ガ", "ギ", "グ", "ゲ", "ゴ"] + vjmh: ["は", "ひ", "ふ", "へ", "ほ", "ハ", "ヒ", "フ", "ヘ", "ホ"] + vjmi: ["い", "き", "ぎ", "し", "じ", "ち", "ぢ", "に", "ひ", "び", "ぴ", "み", "り", "ゐ", "イ", "キ", "ギ", "シ", "ジ", "チ", "ヂ", "ニ", "ヒ", "ビ", "ピ", "ミ", "リ", "ヰ"] + vjmk: ["か", "ゕ", "き", "く", "け", "ゖ", "こ", "カ", "ヵ", "キ", "ク", "ケ", "ヶ", "コ"] + vjmm: ["ま", "み", "む", "め", "も", "マ", "ミ", "ム", "メ", "モ"] + vjmn: ["な", "に", "ぬ", "ね", "の", "ん", "ナ", "ニ", "ヌ", "ネ", "ノ", "ン"] + vjmo: ["お", "こ", "ご", "そ", "ぞ", "と", "ど", "の", "ほ", "ぼ", "ぽ", "も", "ろ", "を", "オ", "コ", "ゴ", "ソ", "ゾ", "ト", "ド", "ノ", "ホ", "ボ", "ポ", "モ", "ロ", "ヲ"] + vjmp: ["ぱ", "ぴ", "ぷ", "ぺ", "ぽ", "パ", "ピ", "プ", "ペ", "ポ"] + vjmq: ["㋐", "㋑", "㋒", "㋓", "㋔", "㋕", "㋖", "㋗", "㋘", "㋙", "㋚", "㋛", "㋜", "㋝", "㋞", "㋟", "㋠", "㋡", "㋢", "㋣", "㋤", "㋥", "㋦", "㋧", "㋨", "㋩", "㋪", "㋫", "㋬", "㋭", "㋮", "㋯", "㋰", "㋱", "㋲", "㋳", "㋴", "㋵", "㋶", "㋷", "㋸", "㋹", "㋺", "㋻", "㋼", "㋽", "㋾"] + vjmr: ["ら", "り", "る", "れ", "ろ", "ラ", "リ", "ル", "レ", "ロ"] + vjms: ["さ", "し", "す", "せ", "そ", "サ", "シ", "ス", "セ", "ソ"] + vjmt: ["た", "ち", "つ", "っ", "て", "と", "タ", "チ", "ツ", "ッ", "テ", "ト"] + vjmu: ["う", "く", "ぐ", "す", "ず", "つ", "づ", "ぬ", "ふ", "ぶ", "ぷ", "む", "る", "ウ", "ク", "グ", "ス", "ズ", "ツ", "ヅ", "ヌ", "フ", "ブ", "プ", "ム", "ル"] + vjmw: ["わ", "ゐ", "ゑ", "を", "ワ", "ヰ", "ヱ", "ヲ"] + vjmy: ["や", "ゃ", "ゆ", "ゅ", "よ", "ょ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ"] + vjmz: ["ざ", "じ", "ず", "ぜ", "ぞ", "ザ", "ジ", "ズ", "ゼ", "ゾ"] + vjq: ["立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒"] + vjt: ["↑", "↓", "←", "→", "↕", "↔", "↖", "↗", "↙", "↘", "↚", "↛", "↮", "↜", "↝", "↞", "↟", "↠", "↡", "↢", "↣", "↤", "↥", "↦", "↧", "↨", "↩", "↪", "↫", "↬", "↭", "↯", "↰", "↱", "↲", "↳", "↴", "↵", "↶", "↷", "↸", "↹", "↺", "↻", "↼", "↽", "↾", "↿", "⇀", "⇁", "⇂", "⇃", "⇄", "⇅", "⇆", "⇇", "⇈", "⇉", "⇊", "⇋", "⇌", "⇐", "⇍", "⇑", "⇒", "⇏", "⇓", "⇔", "⇎", "⇕", "⇖", "⇗", "⇘", "⇙", "⇚", "⇛", "⇜", "⇝", "⇞", "⇟", "⇠", "⇡", "⇢", "⇣", "⇤", "⇥", "⇦", "⇧", "⇨", "⇩", "⇪", "⇫", "⇬", "⇭", "⇮", "⇯", "⇰", "⇱", "⇲", "⇳", "⇴", "⇵", "⇶", "⇷", "⇸", "⇹", "⇺", "⇻", "⇼", "⇽", "➔", "➘", "➙", "➚", "➛", "➜", "➝", "➞", "➟", "➠", "➡", "➢", "➣", "➤", "➥", "➦", "➧", "➨", "➩", "➪", "➫", "➬", "➭", "➮", "➱", "➲", "➳", "➴", "➵", "➶", "➷", "➸", "➹", "➺", "➻", "➼", "➽", "➾"] + vjz: ["「", "」", "『", "』", "“", "”", "‘", "’", "(", ")", "《", "》", "〈", "〉", "【", "】", "〖", "〗", "〔", "〕", "[", "]", "{", "}"] + vk: ["ḱ", "ǩ", "ₖ", "ᵏ", "ꝁ", "ꝃ", "ꞣ", "ꝅ", "ķ", "ḵ", "ḳ", "ƙ", "ᶄ", "ⱪ", "ʞ", "ĸ"] + vkx: ["一", "丨", "丶", "丿", "乙", "亅", "二", "亠", "人", "儿", "入", "八", "冂", "冖", "冫", "几", "凵", "刀", "力", "勹", "匕", "匚", "匸", "十", "卜", "卩", "厂", "厶", "又", "口", "囗", "土", "士", "夂", "夊", "夕", "大", "女", "子", "宀", "寸", "小", "尢", "尸", "屮", "山", "巛", "工", "己", "巾", "干", "幺", "广", "廴", "廾", "弋", "弓", "彐", "彡", "彳", "心", "戈", "戶", "手", "支", "攴", "文", "斗", "斤", "方", "无", "日", "曰", "月", "木", "欠", "止", "歹", "殳", "毋", "比", "毛", "氏", "气", "水", "火", "爪", "父", "爻", "爿", "片", "牙", "牛", "犬", "玄", "玉", "瓜", "瓦", "甘", "生", "用", "田", "疋", "疒", "癶", "白", "皮", "皿", "目", "矛", "矢", "石", "示", "禸", "禾", "穴", "立", "竹", "米", "糸", "缶", "网", "羊", "羽", "老", "而", "耒", "耳", "聿", "肉", "臣", "自", "至", "臼", "舌", "舛", "舟", "艮", "色", "艸", "虍", "虫", "血", "行", "衣", "襾", "見", "角", "言", "谷", "豆", "豕", "豸", "貝", "赤", "走", "足", "身", "車", "辛", "辰", "辵", "邑", "酉", "釆", "里", "金", "長", "門", "阜", "隶", "隹", "雨", "靑", "非", "面", "革", "韋", "韭", "音", "頁", "風", "飛", "食", "首", "香", "馬", "骨", "高", "髟", "鬥", "鬯", "鬲", "鬼", "魚", "鳥", "鹵", "鹿", "麥", "麻", "黃", "黍", "黑", "黹", "黽", "鼎", "鼓", "鼠", "鼻", "齊", "齒", "龍", "龜", "龠"] + vl: ["ĺ", "ˡ", "ł", "ꝉ", "ƚ", "ⱡ", "ɫ", "ꭞ", "ꬸ", "ɬ", "ľ", "ļ", "ḻ", "ḽ", "ḷ", "ŀ", "ꝲ", "ƛ", "ᶅ", "ᶪ", "ɭ", "ᶩ", "ḹ", "ꬷ", "ꭝ", "ꬹ", "ȴ", "ꝇ"] + vlj: ["lj"] + vll: ["ỻ"] + vlm: ["ⅰ", "ⅱ", "ⅲ", "ⅳ", "ⅴ", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "ⅹ", "ⅺ", "ⅻ", "ⅼ", "ⅽ", "ⅾ", "ⅿ"] + vlmd: ["Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ", "Ⅻ", "Ⅼ", "Ⅽ", "Ⅾ", "Ⅿ"] + vls: ["ʪ"] + vlssg: ["䷀", "䷁", "䷂", "䷃", "䷄", "䷅", "䷆", "䷇", "䷈", "䷉", "䷊", "䷋", "䷌", "䷍", "䷎", "䷏", "䷐", "䷑", "䷒", "䷓", "䷔", "䷕", "䷖", "䷗", "䷘", "䷙", "䷚", "䷛", "䷜", "䷝", "䷞", "䷟", "䷠", "䷡", "䷢", "䷣", "䷤", "䷥", "䷦", "䷧", "䷨", "䷩", "䷪", "䷫", "䷬", "䷭", "䷮", "䷯", "䷰", "䷱", "䷲", "䷳", "䷴", "䷵", "䷶", "䷷", "䷸", "䷹", "䷺", "䷻", "䷼", "䷽", "䷾", "䷿"] + vlssgm: ["乾", "坤", "屯", "蒙", "需", "讼", "师", "比", "小畜", "履", "泰", "否", "同人", "大有", "谦", "豫", "随", "蛊", "临", "观", "噬嗑", "贲", "剥", "复", "无妄", "大畜", "颐", "大过", "坎", "离", "咸", "恒", "遯", "大壮", "晋", "明夷", "家人", "睽", "蹇", "解", "损", "益", "夬", "姤", "萃", "升", "困", "井", "革", "鼎", "震", "艮", "渐", "归妹", "丰", "旅", "巽", "兑", "涣", "节", "中孚", "小过", "既济", "未济"] + vlx: ["♂", "♀", "⚢", "⚣", "⚤", "⚥", "⚦", "⚧", "⚨", "⚩", "⚪", "⚫", "⚬", "⚭", "⚮", "⚯"] + vlz: ["ʫ", "ɮ"] + vm: ["ḿ", "ṁ", "ᵐ", "ₘ", "ṃ", "ᵯ", "ɱ", "ᶬ", "ꬺ", "ᶆ", "ꝳ", "ɯ", "ᵚ", "ɰ", "ᶭ", "ᴟ"] + vmj: ["🀀", "🀁", "🀂", "🀃", "🀄", "🀅", "🀆", "🀇", "🀈", "🀉", "🀊", "🀋", "🀌", "🀍", "🀎", "🀏", "🀐", "🀑", "🀒", "🀓", "🀔", "🀕", "🀖", "🀗", "🀘", "🀙", "🀚", "🀛", "🀜", "🀝", "🀞", "🀟", "🀠", "🀡", "🀢", "🀣", "🀤", "🀥", "🀦", "🀧", "🀨", "🀩", "🀪", "🀫"] + vn: ["ń", "ň", "ǹ", "ṅ", "ñ", "ₙ", "ⁿ", "ɲ", "ᶮ", "ɳ", "ᶯ", "ȵ", "ƞ", "ŋ", "ᵑ", "ꬻ", "ꬼ", "ꝴ", "ʼn", "ꞥ", "ņ", "ṉ", "ṋ", "ṇ", "ᵰ", "ꞑ", "ᶇ"] + vnacui: ["卐"] + vnian: ["廿"] + vnj: ["nj"] + vo: ["ō", "ó", "ǒ", "ò", "ő", "ô", "ŏ", "ȯ", "ö", "õ", "ₒ", "ᵒ", "º", "ɔ", "ᵓ", "ᶗ", "ꬿ", "ø", "ǫ", "ọ", "ơ", "ɵ", "ᶱ", "ᴑ", "ᴒ", "ᴓ", "ꝋ", "ꝍ", "ṓ", "ṑ", "ố", "ồ", "ỗ", "ổ", "ȱ", "ȫ", "ȭ", "ṍ", "ṏ", "ộ", "ǭ", "ǿ", "ớ", "ờ", "ỡ", "ở", "ợ", "ɷ", "ⱺ", "ᴖ", "ᵔ", "ᴗ", "ᵕ"] + voe: ["œ", "ᴔ"] + voi: ["ƣ"] + voo: ["ꝏ"] + vopt: ["⌥"] + vou: ["ȣ"] + vp: ["ṕ", "ṗ", "ᵖ", "ᵽ", "ꝑ", "ᵱ", "ƥ", "ᶈ", "ꝓ", "ꝕ", "ɸ", "ᶲ", "ⱷ"] + vpai: ["π"] + vpgdn: ["⇟"] + vpgup: ["⇞"] + vpi: ["π"] + vpjm: ["ア", "ァ", "イ", "ィ", "ウ", "ゥ", "エ", "ェ", "オ", "ォ", "カ", "ヵ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ヶ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ツ", "ッ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ャ", "ユ", "ュ", "ヨ", "ョ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヮ", "ヰ", "ヸ", "ヴ", "ヱ", "ヹ", "ヲ", "ヺ", "ン", "・", "ー", "ヽ", "ヾ", "ヿ", "ㇰ", "ㇱ", "ㇲ", "ㇳ", "ㇴ", "ㇵ", "ㇶ", "ㇷ", "ㇸ", "ㇹ", "ㇺ", "ㇻ", "ㇼ", "ㇽ", "ㇾ", "ㇿ"] + vpk: ["♠", "♥", "♣", "♦", "♤", "♡", "♧", "♢"] + vpp: ["乛", "冫", "丷", "龹", "⺌", "龸", "亻", "亼", "亽", "仒", "冖", "冂", "冃", "冄", "宀", "罒", "㓁", "罓", "冈", "凵", "厶", "刂", "勹", "匚", "匸", "卩", "阝", "厂", "丆", "广", "壬", "訁", "讠", "釒", "钅", "飠", "饣", "龺", "攵", "夂", "夊", "尢", "尣", "兂", "旡", "巜", "巛", "彐", "彑", "彡", "彳", "龰", "辶", "廴", "㞢", "忄", "㣺", "扌", "爫", "龵", "廾", "歺", "癶", "氵", "氺", "火", "灬", "爿", "丬", "疒", "牜", "⺶", "犭", "豕", "豸", "虍", "艹", "卝", "龷", "丗", "龶", "芈", "丵", "菐", "黹", "礻", "衤", "糸", "糹", "纟", "龻", "镸", "髟", "襾", "覀", "吅", "㗊", "㠭", "㸚", "叕"] + vpy: ["ā", "á", "ǎ", "à", "ō", "ó", "ǒ", "ò", "ê", "ê̄", "ế", "ê̌", "ề", "ē", "é", "ě", "è", "ī", "í", "ǐ", "ì", "ū", "ú", "ǔ", "ù", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ḿ", "m̀", "ń", "ň", "ǹ", "ẑ", "ĉ", "ŝ", "ŋ"] + vpyd: ["Ā", "Á", "Ǎ", "À", "Ō", "Ó", "Ǒ", "Ò", "Ê", "Ê̄", "Ế", "Ê̌", "Ề", "Ē", "É", "Ě", "È", "Ī", "Í", "Ǐ", "Ì", "Ū", "Ú", "Ǔ", "Ù", "Ü", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ḿ", "M̀", "Ń", "Ň", "Ǹ", "Ẑ", "Ĉ", "Ŝ", "Ŋ"] + vq: ["ɋ", "ꝗ", "ꝙ", "ʠ"] + vqian: ["仟"] + vqp: ["ȹ"] + vr: ["ŕ", "ř", "ȑ", "ȓ", "ṙ", "ᵣ", "ɍ", "ꞧ", "ᵲ", "ŗ", "ṟ", "ṛ", "ṝ", "ᵳ", "ɽ", "ᶉ", "ꭇ", "ꭈ", "ꭊ", "ꭉ", "ꝵ", "ꭋ", "ꭌ", "ɹ", "ʴ", "ɺ", "ɻ", "ʵ", "ⱹ", "ɼ", "ʳ", "ɾ", "ɿ", "ꝛ", "ꝝ"] + vreturn: ["⏎"] + vrq: ["㏠", "㏡", "㏢", "㏣", "㏤", "㏥", "㏦", "㏧", "㏨", "㏩", "㏪", "㏫", "㏬", "㏭", "㏮", "㏯", "㏰", "㏱", "㏲", "㏳", "㏴", "㏵", "㏶", "㏷", "㏸", "㏹", "㏺", "㏻", "㏼", "㏽", "㏾"] + vs: [Vs., "🆚", "ś", "ŝ", "š", "ṡ", "ˢ", "ʂ", "ᶳ", "ᵴ", "ꞩ", "ᶊ", "ş", "ṣ", "ș", "ȿ", "ṥ", "ṧ", "ṩ", "ʃ", "ᶴ", "ʆ", "ᶘ", "ʅ", "ƪ", "ß", "ſ", "ẛ", "ẜ", "ẝ"] + vsa: ["卅"] + vsb: ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹", "˜", "⁺", "⁻", "⁼", "⁽", "⁾", "ᴬ", "ᵃ", "ᵄ", "ᵅ", "ᶛ", "ᴭ", "ᵆ", "ᴮ", "ᴯ", "ᵇ", "ᵝ", "ᶜ", "ᵓ", "ᶝ", "ᴰ", "ᵈ", "ᶞ", "ᵟ", "ᴱ", "ᵉ", "ᴲ", "ᵊ", "ᵋ", "ᶟ", "ᵌ", "ᶠ", "ᶡ", "ᶲ", "ᵠ", "ᴳ", "ᵍ", "ᶢ", "ˠ", "ᵞ", "ᴴ", "ʰ", "ᶣ", "ʱ", "ᴵ", "ⁱ", "ᶤ", "ᵎ", "ᶥ", "ᴶ", "ʲ", "ᶨ", "ᴷ", "ᵏ", "ᴸ", "ᶫ", "ˡ", "ᶩ", "ᶪ", "ᴹ", "ᵐ", "ᶬ", "ᵚ", "ᶭ", "ᴺ", "ᴻ", "ⁿ", "ᵑ", "ᶮ", "ᶯ", "ᴼ", "ᵒ", "ᶱ", "ᴽ", "ᴾ", "ᵖ", "ᴿ", "ʳ", "ʶ", "ʴ", "ʵ", "ˢ", "ᶴ", "ᶳ", "ᵀ", "ᵗ", "ᶵ", "ᶿ", "ᵁ", "ᵘ", "ᶶ", "ᶷ", "ᵙ", "ⱽ", "ᵛ", "ᶺ", "ᶹ", "ᵂ", "ʷ", "ˣ", "ᵡ", "ʸ", "ᶻ", "ᶾ", "ᶽ", "ᶼ"] + vsd: ["ˉ", "ˊ", "ˇ", "ˋ", "ˆ", "˙", "˜", "˥", "˦", "˧", "˨", "˩", "꜀", "꜁", "꜂", "꜃", "꜄", "꜅", "꜆", "꜇", "〪", "〫", "〬", "〭"] + vshang: ["↑", "⬆️"] + vshift: ["⇧"] + vsj: ["㍘", "㍙", "㍚", "㍛", "㍜", "㍝", "㍞", "㍟", "㍠", "㍡", "㍢", "㍣", "㍤", "㍥", "㍦", "㍧", "㍨", "㍩", "㍪", "㍫", "㍬", "㍭", "㍮", "㍯", "㍰"] + vspace: ["␣"] + vssd: ["°C"] + vsuoyi: ["∴"] + vsx: ["±", "÷", "×", "∈", "∏", "∑", "-", "+", "<", "≮", "=", "≠", ">", "≯", "∕", "√", "∝", "∞", "∟", "∠", "∥", "¬", "⊕", "∧", "∨", "∩", "∪", "∫", "∮", "∴", "∵", "∷", "∽", "≈", "≌", "≒", "≡", "≤", "≥", "≦", "≧", "⊕", "⊖", "⊗", "⊙", "⊥", "⊿", "㏑", "㏒"] + vsz: ["⚀", "⚁", "⚂", "⚃", "⚄", "⚅"] + vszd: ["⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙", "⒚", "⒛"] + vszh: ["⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽", "⑾", "⑿", "⒀", "⒁", "⒂", "⒃", "⒄", "⒅", "⒆", "⒇"] + vszm: ["〡", "〢", "〣", "〤", "〥", "〦", "〧", "〨", "〩", "〸", "〹", "〺"] + vszq: ["⓪", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳", "㉑", "㉒", "㉓", "㉔", "㉕", "㉖", "㉗", "㉘", "㉙", "㉚", "㉛", "㉜", "㉝", "㉞", "㉟", "㊱", "㊲", "㊳", "㊴", "㊵", "㊶", "㊷", "㊸", "㊹", "㊺", "㊻", "㊼", "㊽", "㊾", "㊿", "⓿", "❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿", "⓫", "⓬", "⓭", "⓮", "⓯", "⓰", "⓱", "⓲", "⓳", "⓴"] + vt: ["ť", "ṫ", "ẗ", "ᵗ", "ₜ", "ʈ", "þ", "ꝥ", "ꝧ", "ŧ", "ⱦ", "ţ", "ṯ", "ṱ", "ṭ", "ț", "ƭ", "ᵵ", "ƫ", "ᶵ", "ʇ", "ȶ", "ꝷ"] + vtab: ["↹", "⇤", "⇥"] + vtabl: ["⇤"] + vtabr: ["⇥"] + vtc: ["ʨ"] + vtg: ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] + vth: ["ᵺ"] + vtq: ["☀", "☁", "⛅", "⛈", "⛆", "☂", "☔", "☃", "⛄", "⛇"] + vts: ["ʦ", "ʧ"] + vtt: ["☉", "☼", "☽", "☾", "☿", "♀", "♁", "🜨", "♂", "♃", "♄", "♅", "⛢", "♆", "♇", "⚳", "☄"] + vtxj: ["⚊", "⚋", "⚌", "⚍", "⚎", "⚏", "𝌀", "𝌁", "𝌂", "𝌃", "𝌄", "𝌅", "𝌆", "𝌇", "𝌈", "𝌉", "𝌊", "𝌋", "𝌌", "𝌍", "𝌎", "𝌏", "𝌐", "𝌑", "𝌒", "𝌓", "𝌔", "𝌕", "𝌖", "𝌗", "𝌘", "𝌙", "𝌚", "𝌛", "𝌜", "𝌝", "𝌞", "𝌟", "𝌠", "𝌡", "𝌢", "𝌣", "𝌤", "𝌥", "𝌦", "𝌧", "𝌨", "𝌩", "𝌪", "𝌫", "𝌬", "𝌭", "𝌮", "𝌯", "𝌰", "𝌱", "𝌲", "𝌳", "𝌴", "𝌵", "𝌶", "𝌷", "𝌸", "𝌹", "𝌺", "𝌻", "𝌼", "𝌽", "𝌾", "𝌿", "𝍀", "𝍁", "𝍂", "𝍃", "𝍄", "𝍅", "𝍆", "𝍇", "𝍈", "𝍉", "𝍊", "𝍋", "𝍌", "𝍍", "𝍎", "𝍏", "𝍐", "𝍑", "𝍒", "𝍓", "𝍔", "𝍕", "𝍖"] + vtz: ["ꜩ"] + vu: ["ū", "ú", "ǔ", "ù", "ű", "ȕ", "û", "ŭ", "ȗ", "ü", "ǖ", "ǘ", "ǚ", "ǜ", "ů", "ũ", "ᵤ", "ᵘ", "ʉ", "ᶶ", "ủ", "ų", "ṷ", "ụ", "ṳ", "ṵ", "ư", "ʊ", "ᶷ", "ᵿ", "ᶙ", "ṻ", "ṹ", "ứ", "ừ", "ữ", "ử", "ự", "ꭒ", "ꭟ", "ꝸ", "ꭎ", "ꭏ", "ᴝ", "ᵙ", "ᴞ"] + vue: ["ᵫ"] + vv: ["ü", "ǖ", "ǘ", "ǚ", "ǜ", "ṽ", "ᵛ", "ᵥ", "ṿ", "ꝟ", "ʋ", "ᶹ", "ᶌ", "ⱴ", "ⱱ", "ỽ", "ʌ", "ᶺ"] + vvv: ["👌", "👍", "😂", "😅", "😡", "😮", "😱", "😭", "😘", "😰", "💩"] + vvy: ["ꝡ"] + vw: ["ẃ", "ẁ", "ŵ", "ẇ", "ẅ", "ẘ", "ʷ", "ẉ", "ƿ", "ʍ", "ⱳ"] + vwanzi: ["卍"] + vww: ["ʬ"] + vx: ["ẋ", "ẍ", "ᶍ", "ˣ", "ₓ", "ꭖ", "ꭗ", "ꭘ", "ꭙ"] + vxb: ["₀", "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉", "₊", "₋", "₌", "₍", "₎", "‸", "ᴀ", "ₐ", "ᴁ", "ʙ", "ᴃ", "ᵦ", "ᴄ", "ᴐ", "ᴒ", "ᴅ", "ᴆ", "ᴇ", "ₑ", "ₔ", "ᵩ", "ɢ", "ʛ", "ᴦ", "ᵧ", "ʜ", "ₕ", "ɪ", "ᵻ", "ᵢ", "ᴊ", "ⱼ", "ᴋ", "ₖ", "ʟ", "ₗ", "ᴌ", "ᴧ", "ᴍ", "ₘ", "ꟺ", "ɴ", "ᴎ", "ₙ", "ᴏ", "ₒ", "ɶ", "ʘ", "ᴓ", "ᴑ", "ᴘ", "ₚ", "ᴨ", "ᴪ", "ʀ", "ᵣ", "ᴙ", "ʁ", "ᴚ", "ᵨ", "ₛ", "ᴛ", "ₜ", "ᴜ", "ᵤ", "ᵾ", "ᴠ", "ᵥ", "ᴡ", "ₓ", "ᵪ", "ʏ", "ᴢ", "ᴣ"] + vxh: ["★", "☆", "⛤", "⛥", "⛦", "⛧", "✡", "❋", "❊", "❉", "❈", "❇", "❆", "❅", "❄", "❃", "❂", "❁", "❀", "✿", "✾", "✽", "✼", "✻", "✺", "✹", "✸", "✷", "✶", "✵", "✴", "✳", "✲", "✱", "✰", "✯", "✮", "✭", "✬", "✫", "✪", "✩", "✧", "✦", "✥", "✤", "✣", "✢"] + vxi: ["卌"] + vxia: ["↓", "⬇️"] + vxiaoyu: ["<", "≤"] + vxl: ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω"] + vxld: ["Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω"] + vxq: ["♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟"] + vxz: ["♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓"] + vxzg: ["白羊宫", "金牛宫", "双子宫", "巨蟹宫", "狮子宫", "室女宫", "天秤宫", "天蝎宫", "人马宫", "摩羯宫", "宝瓶宫", "双鱼宫"] + vxzm: ["白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "室女座", "天秤座", "天蝎座", "人马座", "摩羯座", "宝瓶座", "双鱼座"] + vy: ["ȳ", "ý", "ỳ", "ŷ", "ẏ", "ÿ", "ẙ", "ỹ", "ʸ", "ɏ", "ỷ", "ỵ", "ƴ", "ʎ", "ỿ", "ꭚ"] + vyf: ["㋀", "㋁", "㋂", "㋃", "㋄", "㋅", "㋆", "㋇", "㋈", "㋉", "㋊", "㋋"] + vyinwei: ["∵"] + vyou: ["→", "➡️", "V 友"] + vyoushang: ["↗"] + vyouxia: ["↘"] + vyr: ["月", "火", "水", "木", "金", "土", "日", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊗", "㊡", "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈷", "㉁", "㉀"] + vyuan: ["圆"] + vyy: ["𝄞", "𝄡", "𝄢", "♯", "♭", "𝄪", "𝄫", "♮", "𝄴", "𝄵", "𝅜", "𝅝", "𝅗𝅥", "𝅘𝅥", "𝅘𝅥𝅮", "𝅘𝅥𝅯", "𝅘𝅥𝅰", "𝄺", "𝄻", "𝄼", "𝄽", "𝄾", "𝄿", "𝅀", "♩", "♪", "♫", "♬"] + vz: ["ź", "ž", "ẑ", "ż", "ᶻ", "ʐ", "ᶼ", "ʑ", "ᶽ", "ƶ", "ẕ", "ẓ", "ᵶ", "ȥ", "ⱬ", "ᶎ", "ʒ", "ᶾ", "ǯ", "ʓ", "ƹ", "ƺ", "ᶚ", "θ", "ᶿ", "ɀ", "ꝣ"] + vzhengfu: ["±"] + vzhengfuhao: ["±"] + vzmh: ["⒜", "⒝", "⒞", "⒟", "⒠", "⒡", "⒢", "⒣", "⒤", "⒥", "⒦", "⒧", "⒨", "⒩", "⒪", "⒫", "⒬", "⒭", "⒮", "⒯", "⒰", "⒱", "⒲", "⒳", "⒴", "⒵"] + vzmq: ["ⓐ", "Ⓐ", "ⓑ", "Ⓑ", "ⓒ", "Ⓒ", "ⓓ", "Ⓓ", "ⓔ", "Ⓔ", "ⓕ", "Ⓕ", "ⓖ", "Ⓖ", "ⓗ", "Ⓗ", "ⓘ", "Ⓘ", "ⓙ", "Ⓙ", "ⓚ", "Ⓚ", "ⓛ", "Ⓛ", "ⓜ", "Ⓜ", "ⓝ", "Ⓝ", "ⓞ", "Ⓞ", "ⓟ", "Ⓟ", "ⓠ", "Ⓠ", "ⓡ", "Ⓡ", "ⓢ", "Ⓢ", "ⓣ", "Ⓣ", "ⓤ", "Ⓤ", "ⓥ", "Ⓥ", "ⓦ", "Ⓦ", "ⓧ", "Ⓧ", "ⓨ", "Ⓨ", "ⓩ", "Ⓩ"] + vzuo: ["←", "⬅️"] + vzuoshang: ["↖"] + vzuoxia: ["↙"] + vzuoyou: ["↔︎", "⇔", "⇋"] + vzy: ["ㄅ", "ㄆ", "ㄇ", "ㄈ", "ㄉ", "ㄊ", "ㄋ", "ㄌ", "ㄍ", "ㄎ", "ㄏ", "ㄐ", "ㄑ", "ㄒ", "ㄓ", "ㄔ", "ㄕ", "ㄖ", "ㄗ", "ㄘ", "ㄙ", "ㄧ", "ㄨ", "ㄩ", "ㄚ", "ㄛ", "ㄜ", "ㄝ", "ㄞ", "ㄟ", "ㄠ", "ㄡ", "ㄢ", "ㄣ", "ㄤ", "ㄥ", "ㄦ", "ㄪ", "ㄫ", "ㄬ", "ㄭ", "ㆠ", "ㆡ", "ㆢ", "ㆣ", "ㆤ", "ㆥ", "ㆦ", "ㆧ", "ㆨ", "ㆩ", "ㆪ", "ㆫ", "ㆬ", "ㆭ", "ㆮ", "ㆯ", "ㆰ", "ㆱ", "ㆲ", "ㆳ", "ㆴ", "ㆵ", "ㆶ", "ㆷ"] +radical_lookup: + comment_format: + - "erase/^.*$//" + dictionary: radical_pinyin + enable_user_dict: false + prefix: uU + tag: radical_lookup + tips: " 〔拆字〕" +radical_reverse_lookup: + dictionary: rime_ice + tags: + - radical_lookup +recognizer: + import_preset: default + patterns: + calculator: "^cC.+" + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + gregorian_to_lunar: "^N[0-9]{1,8}" + number: "^R[0-9]+[.]?[0-9]*" + punct: "^v([0-9]|10|[A-Za-z]+)$" + radical_lookup: "^uU[a-z]+$" + unicode: "^U[a-f0-9]+" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +reduce_english_filter: + idx: 2 + mode: custom + words: + - aid + - ann + - bail + - bait + - bam + - band + - bans + - bat + - bay + - bend + - bent + - benz + - bib + - bid + - bien + - biz + - boc + - bop + - bos + - bud + - buf + - bus + - bach + - bench + - bush + - bog + - cab + - cad + - cain + - cam + - cans + - cap + - cef + - chad + - chan + - chap + - chef + - cher + - chew + - chic + - chime + - chin + - chip + - chit + - coup + - cum + - cunt + - cur + - couch + - dab + - dag + - dal + - dam + - dent + - dew + - dial + - diet + - dim + - din + - dip + - dis + - dit + - doug + - dub + - dug + - dunn + - don + - fab + - fax + - fob + - fog + - foul + - fur + - fend + - gag + - gail + - gain + - gal + - gam + - gaol + - ged + - gel + - ger + - guam + - gus + - gut + - hail + - ham + - hank + - hans + - hat + - hay + - heil + - heir + - hem + - hep + - hex + - hud + - hum + - hung + - hunk + - hut + - hush + - jim + - jug + - kat + - lab + - lad + - lag + - laid + - lam + - laos + - lap + - lat + - lax + - lay + - led + - leg + - lex + - liam + - lib + - lichen + - lid + - lied + - lien + - lies + - linn + - lip + - lit + - liz + - lob + - lug + - lund + - lung + - lux + - lash + - loch + - lush + - mag + - maid + - mann + - mar + - mat + - med + - mel + - mend + - mens + - ment + - mil + - mins + - mint + - mob + - moc + - mop + - mos + - mot + - mud + - mug + - mum + - mesh + - nap + - nat + - nay + - neil + - nib + - nip + - noun + - nous + - nun + - nut + - nail + - nash + - pac + - paid + - pail + - pain + - pair + - pak + - pal + - pam + - pans + - pant + - pap + - par + - pat + - paw + - pax + - pens + - pic + - pier + - pies + - pins + - pint + - pit + - pix + - pod + - pop + - pos + - posh + - pot + - pour + - pow + - pub + - pinch + - pouch + - rand + - rant + - rent + - rep + - res + - ret + - rex + - rib + - rid + - rig + - rim + - rub + - rug + - rum + - runc + - runs + - ranch + - sac + - sail + - sal + - sam + - sans + - sap + - saw + - sax + - sew + - sham + - shaw + - shin + - sig + - sin + - sip + - sis + - suit + - sung + - suns + - sup + - sur + - sus + - tad + - tail + - taj + - tar + - tax + - tec + - ted + - tel + - ter + - tex + - tic + - tied + - tier + - ties + - tim + - tin + - tit + - tour + - tout + - tum + - wag + - wand + - womens + - wap + - wax + - weir + - won + - went + - yan + - yen + - zach + - my + - mt + - dj + - as + - js + - cs + - ak + - ps + - cd + - cn + - hk + - bt + - pk + - ml +schema: + author: + - Dvel + dependencies: + - melt_eng + - radical_pinyin + description: | + 雾凇拼音 + https://github.com/iDvel/rime-ice + + name: "雾凇拼音" + schema_id: rime_ice + version: "2026-03-08" +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + algebra: + - "erase/^hm$/" + - "erase/^m$/" + - "erase/^n$/" + - "erase/^ng$/" + - "abbrev/^([a-z]).+$/$1/" + - "abbrev/^([zcs]h).+$/$1/" + - "derive/^([nl])ve$/$1ue/" + - "derive/^([jqxy])u/$1v/" + - "derive/^([nl])ue$/$1ve/" + - "derive/^([jqxy])v/$1u/" + - "derive/([zcs])h(a|e|i|u|ai|ei|an|en|ou|uo|ua|un|ui|uan|uai|uang|ang|eng|ong)$/h$1$2/" + - "derive/([zcs])h([aeiu])$/$1$2h/" + - "derive/^([wghk])ai$/$1ia/" + - "derive/([wfghkz])ei$/$1ie/" + - "derive/([jqx])ie$/$1ei/" + - "derive/([rtypsdghklzcbnm])ao$/$1oa/" + - "derive/([ypfm])ou$/$1uo/" + - "derive/([wrtypsdfghklzcbnm])ang$/$1nag/" + - "derive/([wrtypsdfghklzcbnm])ang$/$1agn/" + - "derive/([wrtpsdfghklzcbnm])eng$/$1neg/" + - "derive/([wrtpsdfghklzcbnm])eng$/$1egn/" + - "derive/([qtypdjlxbnm])ing$/$1nig/" + - "derive/([qtypdjlxbnm])ing$/$1ign/" + - "derive/([rtysdghklzcn])ong$/$1nog/" + - "derive/([rtysdghklzcn])ong$/$1ogn/" + - "derive/([qtpdjlxbnm])iao$/$1ioa/" + - "derive/([qtpdjlxbnm])iao$/$1oia/" + - "derive/([rtsghkzc])ui$/$1iu/" + - "derive/([qjlxnm])iu$/$1ui/" + - "derive/([qjlxn])iang$/$1aing/" + - "derive/([qjlxn])iang$/$1inag/" + - "derive/([g|k|h|zh|sh])ua$/$1au/" + - "derive/([g|h|k|zh|ch|sh])uai$/$1aui/" + - "derive/([qrtysdghjklzxcn])uan$/$1aun/" + - "derive/([nlyjqx])ue$/$1eu/" + - "derive/([g|h|k|zh|ch|sh])uang$/$1aung/" + - "derive/([g|h|k|zh|ch|sh])uang$/$1uagn/" + - "derive/([g|h|k|zh|ch|sh])uang$/$1unag/" + - "derive/([g|h|k|zh|ch|sh])uang$/$1augn/" + - "derive/([jqx])iong$/$1inog/" + - "derive/([jqx])iong$/$1oing/" + - "derive/([jqx])iong$/$1iogn/" + - "derive/([jqx])iong$/$1oign/" + - "derive/([rtsdghkzc])o(u|ng)$/$1o/" + - "derive/(.+)ong$/$1on/" + - "derive/([tl])eng$/$1en/" + - "derive/([qwrtypsdfghjklzxcbnm])([aeio])ng$/$1ng/" + alphabet: "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA`" + delimiter: " '" + initials: zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA +switches: + - name: ascii_mode + states: ["中", "A"] + - name: ascii_punct + states: ["¥", "$"] + - name: traditionalization + states: ["简", "繁"] + - name: emoji + reset: 1 + states: ["💀", "😄"] + - name: full_shape + states: ["半角", "全角"] + - abbrev: ["词", "单"] + name: search_single_char + states: ["正常", "单字"] +traditionalize: + opencc_config: s2t.json + option_name: traditionalization + tags: + - abc + - number + - gregorian_to_lunar + tips: none +translator: + always_show_comments: true + comment_format: + - "xform/^/[/" + - "xform/$/]/" + dictionary: rime_ice + enable_word_completion: true + initial_quality: 1.2 + preedit_format: + - "xform/([jqxy])v/$1u/" + - "xform/([nl])v/$1v/" + - "xform/([nl])ue/$1ve/" + - "xform/(?<=[A-Z])\\s(?=[A-Z])//" + spelling_hints: 8 +uuid: uuid \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.prism.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.prism.bin new file mode 100644 index 0000000..ff3d494 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.prism.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.reverse.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.reverse.bin new file mode 100644 index 0000000..3762a96 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.reverse.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.schema.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.schema.yaml new file mode 100644 index 0000000..5483e0e --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.schema.yaml @@ -0,0 +1,209 @@ +__build_info: + rime_version: 1.16.1 + timestamps: + default: 1774018450 + default.custom: 1774339475 + key_bindings: 1774018450 + key_bindings.custom: 0 + punctuation: 1774018450 + punctuation.custom: 0 + stroke.custom: 0 + stroke.schema: 1760467193 +abc_segmentor: + extra_tags: + - reverse_lookup +engine: + processors: + - ascii_composer + - recognizer + - key_binder + - speller + - punctuator + - selector + - navigator + - express_editor + segmentors: + - ascii_segmentor + - matcher + - abc_segmentor + - punct_segmentor + - fallback_segmentor + translators: + - punct_translator + - reverse_lookup_translator + - table_translator +key_binder: + bindings: + - {accept: "Control+p", send: Up, when: composing} + - {accept: "Control+n", send: Down, when: composing} + - {accept: "Control+b", send: Left, when: composing} + - {accept: "Control+f", send: Right, when: composing} + - {accept: "Control+a", send: Home, when: composing} + - {accept: "Control+e", send: End, when: composing} + - {accept: "Control+d", send: Delete, when: composing} + - {accept: "Control+k", send: "Shift+Delete", when: composing} + - {accept: "Control+h", send: BackSpace, when: composing} + - {accept: "Control+g", send: Escape, when: composing} + - {accept: "Control+bracketleft", send: Escape, when: composing} + - {accept: "Control+y", send: Page_Up, when: composing} + - {accept: "Alt+v", send: Page_Up, when: composing} + - {accept: "Control+v", send: Page_Down, when: composing} + - {accept: minus, send: Page_Up, when: has_menu} + - {accept: equal, send: Page_Down, when: has_menu} + - {accept: comma, send: Page_Up, when: paging} + - {accept: period, send: Page_Down, when: has_menu} + - {accept: "Control+Shift+1", select: .next, when: always} + - {accept: "Control+Shift+2", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+3", toggle: full_shape, when: always} + - {accept: "Control+Shift+4", toggle: simplification, when: always} + - {accept: "Control+Shift+5", toggle: extended_charset, when: always} + - {accept: "Control+Shift+exclam", select: .next, when: always} + - {accept: "Control+Shift+at", toggle: ascii_mode, when: always} + - {accept: "Control+Shift+numbersign", toggle: full_shape, when: always} + - {accept: "Control+Shift+dollar", toggle: simplification, when: always} + - {accept: "Control+Shift+percent", toggle: extended_charset, when: always} + - {accept: d, send: n, when: always} + - {accept: t, send: h, when: always} + - {accept: j, send: h, when: always} + - {accept: k, send: s, when: always} + - {accept: l, send: p, when: always} + - {accept: u, send: n, when: always} + - {accept: i, send: z, when: always} + - {accept: KP_1, send: h, when: always} + - {accept: KP_2, send: s, when: always} + - {accept: KP_3, send: p, when: always} + - {accept: KP_4, send: n, when: always} + - {accept: KP_5, send: z, when: always} + - {accept: KP_6, send: Select, when: has_menu} + - {accept: KP_7, send: Select, when: has_menu} + - {accept: KP_8, send: Select, when: has_menu} + - {accept: KP_9, send: Select, when: has_menu} + - {accept: KP_0, send: Select, when: has_menu} + import_preset: default +menu: + page_size: 9 +punctuator: + full_shape: + " ": {commit: " "} + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": ["#", "⌘"] + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": ["@", "☯"] + "[": ["「", "【", "〔", "["] + "\\": ["、", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": "~" + half_shape: + "!": {commit: "!"} + "\"": {pair: ["“", "”"]} + "#": "#" + "$": ["¥", "$", "€", "£", "¥", "¢", "¤"] + "%": ["%", "%", "°", "℃"] + "&": "&" + "'": {pair: ["‘", "’"]} + "(": "(" + ")": ")" + "*": ["*", "*", "·", "・", "×", "※", "❂"] + "+": "+" + ",": {commit: ","} + "-": "-" + .: {commit: "。"} + "/": ["、", "/", "/", "÷"] + ":": {commit: ":"} + ";": {commit: ";"} + "<": ["《", "〈", "«", "‹"] + "=": "=" + ">": ["》", "〉", "»", "›"] + "?": {commit: "?"} + "@": "@" + "[": ["「", "【", "〔", "["] + "\\": ["、", "\\", "\"] + "]": ["」", "】", "〕", "]"] + "^": {commit: "……"} + _: "——" + "`": "`" + "{": ["『", "〖", "{"] + "|": ["·", "|", "|", "§", "¦"] + "}": ["』", "〗", "}"] + "~": ["~", "~"] + import_preset: default +recognizer: + import_preset: default + patterns: + email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$" + reverse_lookup: "`[a-z]*'?$" + uppercase: "[A-Z][-_+.'0-9A-Za-z]*$" + url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$" +reverse_lookup: + comment_format: + - "xlit/hspnz/⼀⼁⼃⼂⼄/" + dictionary: luna_pinyin + preedit_format: + - "xform/([nl])v/$1ü/" + - "xform/([nl])ue/$1üe/" + - "xform/([jqxy])v/$1u/" + prefix: "`" + suffix: "'" + tips: "〔拼音〕" +schema: + author: + - "四季的風" + - "雪齋" + - "Kunki Chou" + - "宋天" + dependencies: + - luna_pinyin + description: | + 五筆畫 + h,s,p,n,z 代表橫、豎、撇、捺、折 + + name: "五筆畫" + schema_id: stroke + version: 0.6 +selector: + bindings: + ISO_Left_Tab: previous_candidate + "Shift+Tab": previous_candidate + Tab: next_candidate +speller: + alphabet: abcdefghijklmnopqrstuvwxyz + delimiter: " '" +switches: + - name: ascii_mode + reset: 0 + states: ["中文", "西文"] + - name: full_shape + states: ["半角", "全角"] + - name: ascii_punct + states: ["。,", ".,"] +translator: + comment_format: + - "xform/~//" + - "xlit/hspnz/⼀⼁⼃⼂⼄/" + dictionary: stroke + preedit_format: + - "xlit/hspnz/⼀⼁⼃⼂⼄/" \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.table.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.table.bin new file mode 100644 index 0000000..7129ed6 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/stroke.table.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.reverse.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.reverse.bin new file mode 100644 index 0000000..b229d9c Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.reverse.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.table.bin b/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.table.bin new file mode 100644 index 0000000..aa5d951 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/build/terra_pinyin.table.bin differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/installation.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/installation.yaml new file mode 100644 index 0000000..5ff92b1 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/installation.yaml @@ -0,0 +1,6 @@ +distribution_code_name: "fcitx-rime" +distribution_name: Rime +distribution_version: 5.1.13 +install_time: "Tue Mar 24 17:22:42 2026" +installation_id: "215baa5e-7422-4f71-a117-346a2e402f34" +rime_version: 1.16.1 \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000037.ldb b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000037.ldb new file mode 100644 index 0000000..5676ae1 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000037.ldb differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000041.ldb b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000041.ldb new file mode 100644 index 0000000..56c9828 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000041.ldb differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000046.ldb b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000046.ldb new file mode 100644 index 0000000..13e72c3 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000046.ldb differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000051.ldb b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000051.ldb new file mode 100644 index 0000000..bac3968 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000051.ldb differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000052.log b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/000052.log new file mode 100644 index 0000000..e69de29 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/CURRENT b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/CURRENT new file mode 100644 index 0000000..7570f19 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000050 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOCK b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG new file mode 100644 index 0000000..3669277 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG @@ -0,0 +1,5 @@ +2026/03/24-17:32:30.776834 139855870813888 Recovering log #49 +2026/03/24-17:32:30.776853 139855870813888 Level-0 table #51: started +2026/03/24-17:32:30.781897 139855870813888 Level-0 table #51: 1067 bytes OK +2026/03/24-17:32:30.797865 139855870813888 Delete type=0 #49 +2026/03/24-17:32:30.797888 139855870813888 Delete type=3 #48 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG.old b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG.old new file mode 100644 index 0000000..7dcfd3a --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/LOG.old @@ -0,0 +1,3 @@ +2026/03/24-17:32:30.762768 139855870813888 Recovering log #47 +2026/03/24-17:32:30.776210 139855870813888 Delete type=0 #47 +2026/03/24-17:32:30.776233 139855870813888 Delete type=3 #45 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/MANIFEST-000050 b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/MANIFEST-000050 new file mode 100644 index 0000000..5209150 Binary files /dev/null and b/noctalia-dotfiles/.local/share/fcitx5/rime/rime_ice.userdb/MANIFEST-000050 differ diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/default.custom.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/installation.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/installation.yaml new file mode 100644 index 0000000..5ff92b1 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/installation.yaml @@ -0,0 +1,6 @@ +distribution_code_name: "fcitx-rime" +distribution_name: Rime +distribution_version: 5.1.13 +install_time: "Tue Mar 24 17:22:42 2026" +installation_id: "215baa5e-7422-4f71-a117-346a2e402f34" +rime_version: 1.16.1 \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/rime_ice.userdb.txt b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/rime_ice.userdb.txt new file mode 100644 index 0000000..0ca4393 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/rime_ice.userdb.txt @@ -0,0 +1,30 @@ +# Rime user dictionary +#@/db_name rime_ice +#@/db_type userdb +#@/rime_version 1.16.1 +#@/tick 5 +#@/user_id 215baa5e-7422-4f71-a117-346a2e402f34 +dan shi 但是 c=0 d=0.0995012 t=5 +deng ji fen lei 等级分类 c=0 d=0.0995012 t=5 +du li kai fa 独立开发 c=0 d=0.0995012 t=5 +fa jia lian sai 法甲联赛 c=0 d=0.0985112 t=5 +fa jia lian sai ken de ji feng kuang luan shuo luan dong kuang feng ju lang ke shi jiao du fang 法甲联赛肯德基疯狂乱说乱动狂风巨浪可视角度放 c=1 d=0.99005 t=5 +fa kuan 罚款 c=0 d=0.0995012 t=5 +fan kai le 翻开了 c=0 d=0.0995012 t=5 +fang 放 c=0 d=0.0985112 t=5 +feng kou lang jian shang 风口浪尖上 c=0 d=0.0995012 t=5 +jiao liao shou kao 脚镣手铐 c=0 d=0.0995012 t=5 +jiao liao shou kao deng ji fen lei ke jian shao du li kai fa 脚镣手铐等级分类可减少独立开发 c=1 d=1 t=5 +kai fa jian she 开发建设 c=0 d=0.0995012 t=5 +ke jian shao 可减少 c=0 d=0.0995012 t=5 +ke shi jiao du 可视角度 c=0 d=0.0985112 t=5 +ken de ji feng kuang 肯德基疯狂 c=0 d=0.0985112 t=5 +kuang feng ju lang 狂风巨浪 c=0 d=0.0985112 t=5 +ling du kong jian 零度空间 c=0 d=0.198506 t=5 +luan shuo luan dong 乱说乱动 c=0 d=0.0985112 t=5 +ni shuo de dui 你说得对 c=1 d=0.995012 t=5 +she ji de 设计的 c=0 d=0.0995012 t=5 +she ji de feng kou lang jian shang ling du kong jian fan kai le dan shi 设计的风口浪尖上零度空间翻开了但是 c=1 d=1 t=5 +she li deng ji 设立登记 c=0 d=0.0995012 t=5 +shi jian dao le 时间到了 c=0 d=0.0995012 t=5 +shi jian dao le kai fa jian she ling du kong jian fa kuan she li deng ji 时间到了开发建设零度空间罚款设立登记 c=1 d=1 t=5 diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/user.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/user.yaml new file mode 100644 index 0000000..0ff3bb3 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/sync/215baa5e-7422-4f71-a117-346a2e402f34/user.yaml @@ -0,0 +1,2 @@ +var: + last_build_time: 1774341143 \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/rime/user.yaml b/noctalia-dotfiles/.local/share/fcitx5/rime/user.yaml new file mode 100644 index 0000000..2e45ce9 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/rime/user.yaml @@ -0,0 +1,2 @@ +var: + last_build_time: 1774341153 \ No newline at end of file diff --git a/noctalia-dotfiles/.local/share/fcitx5/themes/Matugen/theme.conf b/noctalia-dotfiles/.local/share/fcitx5/themes/Matugen/theme.conf new file mode 100644 index 0000000..6f0b649 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/themes/Matugen/theme.conf @@ -0,0 +1,296 @@ +# vim: ft=dosini +[Metadata] +Name=Matugen +Version=0.1 +Author=shorin +Description=WallpaperColorSyncByMatugen +ScaleWithDPI=True + +[InputPanel] +# 改这个:一般文字颜色 +NormalColor=#e5e1e6 +# 高亮文字颜色 +HighlightColor=#1f2578 +# 高亮背景颜色 +HighlightBackgroundColor=#e7b9d5 +# 改这个:这个才是被选中的文字颜色 +HighlightCandidateColor=#45263c +# KWin 下启用模糊 +EnableBlur=False +# 模糊遮罩 +BlurMask= +# 竖排列表时使用所有横向空间高亮 +FullWidthHighlight=True +# 页面按钮垂直对齐 +PageButtonAlignment="Last Candidate" + +[InputPanel/Background] +# 改这个:输入法框整体背景颜色 +Color=#1f1f23 +# 边框颜色 +BorderColor=#91909a +# 改这个:边框宽度 +BorderWidth=2 + +[InputPanel/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/Highlight] +# 改这个:高亮背景颜色 +Color=#e7b9d5 + +[InputPanel/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[InputPanel/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu] +# 一般文字颜色 +NormalColor=#e5e1e6 +# 选中项文本颜色 +HighlightCandidateColor=#e5e1e6 + +[Menu/Background] +# 背景图片 +Image= +# 颜色 +Color=#1f1f23 +# 边框颜色 +BorderColor=#91909a +# 边框宽度 +BorderWidth=2 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + + +[Menu/Highlight] +# 背景图片 +Image= +# 颜色 +Color=#e7b9d5 +# 边框颜色 +BorderColor=#91909a +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu/Highlight/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator] +# 背景图片 +Image= +# 颜色 +Color=#c0c0c0 +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Separator/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox] +# 背景图片 +Image=radio.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/CheckBox/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu] +# 背景图片 +Image=arrow.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/SubMenu/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[Menu/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + + diff --git a/noctalia-dotfiles/.local/share/fcitx5/themes/default/theme.conf b/noctalia-dotfiles/.local/share/fcitx5/themes/default/theme.conf new file mode 100644 index 0000000..8d95073 --- /dev/null +++ b/noctalia-dotfiles/.local/share/fcitx5/themes/default/theme.conf @@ -0,0 +1,432 @@ +[Metadata] +# 名称 +Name=Default +Name[ca]="Per defecte" +Name[da]=Standard +Name[fr]="Par défaut" +Name[de]=Standard +Name[zh_CN]=默认 +Name[ja]=デフォルト +Name[vi]="Mặc định" +Name[ko]=기본값 +Name[ru]="По умолчанию" +Name[zh_TW]=預設 +# 版本 +Version=1 +# 作者 +Author=Fcitx +# 描述 +Description="Default Theme" + +[InputPanel] +# 改这个:一般文字颜色 +NormalColor=#e7e0e8 +# 高亮文字颜色 +HighlightColor=#39255c +# 高亮背景颜色 +HighlightBackgroundColor=#f1b7c4 +# 改这个:高亮候选词颜色(这个才是被选中的文字颜色) +HighlightCandidateColor=#4a252f +# KWin 下启用模糊 +EnableBlur=False +# 模糊遮罩 +BlurMask= +# 竖排列表时使用所有横向空间高亮 +FullWidthHighlight=True +# 页面按钮垂直对齐 +PageButtonAlignment="Last Candidate" + +[InputPanel/BlurMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[InputPanel/Background] +# 背景图片 +Image= +# 改这个:输入法框整体背景颜色 +Color=#3b383e +# 边框颜色 +BorderColor=#948f99 +# 改这个:边框宽度 +BorderWidth=2 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖 +HideOverlayIfOversize=False + +[InputPanel/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/Background/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[InputPanel/Highlight] +# 背景图片 +Image= +# 改这个:高亮背景颜色 +Color=#f1b7c4 +# 边框颜色 +BorderColor=#f1b7c4 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[InputPanel/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[InputPanel/Highlight/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[InputPanel/Highlight/HighlightClickMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[InputPanel/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[InputPanel/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[InputPanel/PrevPage] +# 图片 +Image=prev.png + +[InputPanel/PrevPage/ClickMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=4 +# 底部边距 +Bottom=4 + +[InputPanel/NextPage] +# 图片 +Image=next.png + +[InputPanel/NextPage/ClickMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=4 +# 底部边距 +Bottom=4 + +[InputPanel/ShadowMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu] +# 一般文字颜色 +NormalColor=#e7e0e8 +# 选中项文本颜色 +HighlightCandidateColor=#ffffff +# 间隔 +Spacing=0 + +[Menu/Background] +# 背景图片 +Image= +# 颜色 +Color=#3b383e +# 边框颜色 +BorderColor=#948f99 +# 边框宽度 +BorderWidth=2 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Background/Margin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[Menu/Background/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Highlight] +# 背景图片 +Image= +# 颜色 +Color=#f1b7c4 +# 边框颜色 +BorderColor=#948f99 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Highlight/Margin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[Menu/Highlight/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator] +# 背景图片 +Image= +# 颜色 +Color=#c0c0c0 +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/Separator/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/Separator/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox] +# 背景图片 +Image=radio.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/CheckBox/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/CheckBox/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu] +# 背景图片 +Image=arrow.png +# 颜色 +Color=#ffffff +# 边框颜色 +BorderColor=#ffffff00 +# 边框宽度 +BorderWidth=0 +# 覆盖图片 +Overlay= +# 覆盖图片位置 +Gravity="Top Left" +# 覆盖图片 X 偏移 +OverlayOffsetX=0 +# 覆盖图片 Y 偏移 +OverlayOffsetY=0 +# 显示区域不足时隐藏覆盖图片 +HideOverlayIfOversize=False + +[Menu/SubMenu/Margin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/SubMenu/OverlayClipMargin] +# 左侧边距 +Left=0 +# 右侧边距 +Right=0 +# 顶部边距 +Top=0 +# 底部边距 +Bottom=0 + +[Menu/ContentMargin] +# 左侧边距 +Left=2 +# 右侧边距 +Right=2 +# 顶部边距 +Top=2 +# 底部边距 +Bottom=2 + +[Menu/TextMargin] +# 左侧边距 +Left=5 +# 右侧边距 +Right=5 +# 顶部边距 +Top=5 +# 底部边距 +Bottom=5 + +[AccentColorField] +0="Input Panel Border" +1="Input Panel Highlight Candidate Background" +2="Input Panel Highlight" +3="Menu Border" +4="Menu Separator" +5="Menu Selected Item Background" + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/index.theme b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/index.theme new file mode 100644 index 0000000..e8986d1 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/index.theme @@ -0,0 +1,235 @@ +[Icon Theme] +Name=Adwaita-Matugen-B +Comment=The Only One +Example=folder +Inherits=Adwaita,AdwaitaLegacy,hicolor +Hidden=true + +# KDE Specific Stuff +DisplayDepth=32 +LinkOverlay=link_overlay +LockOverlay=lock_overlay +ZipOverlay=zip_overlay +DesktopDefault=48 +DesktopSizes=16,22,32,48,64,72,96,128 +ToolbarDefault=22 +ToolbarSizes=16,22,32,48 +MainToolbarDefault=22 +MainToolbarSizes=16,22,32,48 +SmallDefault=16 +SmallSizes=16 +PanelDefault=32 +PanelSizes=16,22,32,48,64,72,96,128 + +# Directory list +Directories=16x16/actions,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/legacy,16x16/mimetypes,16x16/places,16x16/status,16x16/ui,scalable/devices,scalable/mimetypes,scalable/places,scalable/status,scalable/actions,scalable/apps,scalable/categories,scalable/emblems,scalable/emotes,scalable/legacy,scalable/ui,symbolic/actions,symbolic/apps,symbolic/categories,symbolic/devices,symbolic/emblems,symbolic/emotes,symbolic/mimetypes,symbolic/places,symbolic/status,symbolic/legacy,symbolic/ui, + +[16x16/actions] +Context=Actions +Size=16 +Type=Fixed + +[16x16/apps] +Context=Applications +Size=16 +Type=Fixed + +[16x16/categories] +Context=Categories +Size=16 +Type=Fixed + +[16x16/devices] +Context=Devices +Size=16 +Type=Fixed + +[16x16/emblems] +Context=Emblems +Size=16 +Type=Fixed + +[16x16/emotes] +Context=Emotes +Size=16 +Type=Fixed + +[16x16/legacy] +Context=Legacy +Size=16 +Type=Fixed + +[16x16/mimetypes] +Context=MimeTypes +Size=16 +Type=Fixed + +[16x16/places] +Context=Places +Size=16 +Type=Fixed + +[16x16/status] +Context=Status +Size=16 +Type=Fixed + +[16x16/ui] +Context=UI +Size=16 +Type=Fixed + +[scalable/devices] +Context=Devices +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/mimetypes] +Context=MimeTypes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/places] +Context=Places +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/status] +Context=Status +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/actions] +Context=Actions +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/apps] +Context=Applications +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/categories] +Context=Categories +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emblems] +Context=Emblems +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/emotes] +Context=Emotes +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/legacy] +Context=Legacy +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[scalable/ui] +Context=UI +Size=128 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/actions] +Context=Actions +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/apps] +Context=Applications +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/categories] +Context=Categories +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/devices] +Context=Devices +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emblems] +Context=Emblems +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/emotes] +Context=Emotes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/mimetypes] +Context=MimeTypes +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/places] +Context=Places +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/status] +Context=Status +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/legacy] +Context=Legacy +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + +[symbolic/ui] +Context=UI +Size=16 +MinSize=8 +MaxSize=512 +Type=Scalable + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-addon.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-addon.svg new file mode 100644 index 0000000..b9e9aaf --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-addon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-executable.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-executable.svg new file mode 100644 index 0000000..2ac9d92 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/application-x-executable.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/audio-x-generic.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/audio-x-generic.svg new file mode 100644 index 0000000..8badec8 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/audio-x-generic.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/font-x-generic.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/font-x-generic.svg new file mode 100644 index 0000000..0be7e5e --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/font-x-generic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/inode-directory.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/inode-directory.svg new file mode 100644 index 0000000..c8ce462 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/inode-directory.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-html.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-html.svg new file mode 100644 index 0000000..1a496d9 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-html.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-x-script.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-x-script.svg new file mode 100644 index 0000000..81c7e2d --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/text-x-script.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-document.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-document.svg new file mode 100644 index 0000000..05c80ac --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-document.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-presentation.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-presentation.svg new file mode 100644 index 0000000..a565df5 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/mimetypes/x-office-presentation.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-documents.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-documents.svg new file mode 100644 index 0000000..6a5dd4a --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-documents.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-download.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-download.svg new file mode 100644 index 0000000..8b81b1d --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-download.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-drag-accept.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-drag-accept.svg new file mode 100644 index 0000000..c8ce462 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-drag-accept.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-music.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-music.svg new file mode 100644 index 0000000..51e8aea --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-music.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-pictures.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-pictures.svg new file mode 100644 index 0000000..89a608c --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-pictures.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-publicshare.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-publicshare.svg new file mode 100644 index 0000000..ae74d78 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-publicshare.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-remote.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-remote.svg new file mode 100644 index 0000000..ea4b25b --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-remote.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-templates.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-templates.svg new file mode 100644 index 0000000..f605b37 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-templates.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-videos.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-videos.svg new file mode 100644 index 0000000..6323564 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder-videos.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder.svg new file mode 100644 index 0000000..c8ce462 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/folder.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-server.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-server.svg new file mode 100644 index 0000000..418867d --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-server.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-workgroup.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-workgroup.svg new file mode 100644 index 0000000..b0cdf4e --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/network-workgroup.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-bookmarks.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-bookmarks.svg new file mode 100644 index 0000000..b0f2da3 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-bookmarks.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-desktop.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-desktop.svg new file mode 100644 index 0000000..fc4b2f0 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-desktop.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-home.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-home.svg new file mode 100644 index 0000000..670aa69 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-home.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-trash.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-trash.svg new file mode 100644 index 0000000..4b1f58f --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/places/user-trash.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/folder-open.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/folder-open.svg new file mode 100644 index 0000000..c8ce462 --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/folder-open.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/user-trash-full.svg b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/user-trash-full.svg new file mode 100644 index 0000000..678515d --- /dev/null +++ b/noctalia-dotfiles/.local/share/icons/Adwaita-Matugen-B/scalable/status/user-trash-full.svg @@ -0,0 +1,1079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/noctalia-dotfiles/.local/share/nwg-look/gsettings b/noctalia-dotfiles/.local/share/nwg-look/gsettings new file mode 100644 index 0000000..5f2898d --- /dev/null +++ b/noctalia-dotfiles/.local/share/nwg-look/gsettings @@ -0,0 +1,15 @@ +# Generated by nwg-look, do not edit this file. +gtk-theme=adw-gtk3-dark +icon-theme=Adwaita-Matugen-B +font-name=Adwaita Sans 11 +cursor-theme=breeze_cursors +cursor-size=30 +toolbar-style=both-horiz +toolbar-icons-size=large +font-hinting=slight +font-antialiasing=grayscale +font-rgba-order=rgb +text-scaling-factor=1.0 +color-scheme=prefer-dark +event-sounds=true +input-feedback-sounds=false diff --git a/noctalia-dotfiles/.vimrc b/noctalia-dotfiles/.vimrc new file mode 100644 index 0000000..0041270 --- /dev/null +++ b/noctalia-dotfiles/.vimrc @@ -0,0 +1,35 @@ +"显示行号 +set number +"显示相对行号 +set relativenumber +"高亮当前行 +set cursorline +"语法高亮 +syntax on + +" 开启自动缩进,新的一行会自动与上一行对齐 +set autoindent +" 在输入搜索词时,实时高亮显示匹配项(增量搜索) +set incsearch + +" 高亮显示所有搜索结果 +set hlsearch + +" 搜索时忽略大小写 +set ignorecase + +" 如果搜索词中包含了大写字母,则自动切换为大小写敏感搜索 +set smartcase +" 开启持久化撤销(undo),即使关闭再打开文件,也能撤销之前的更改 +set undofile + +" undo目录 +silent !mkdir -p ~/.cache/vim/undo +set undodir=~/.cache/vim/undo + +" 剪贴板 gvim的功能 +set clipboard=unnamedplus + +" 接管鼠标事件 +set mouse=a + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/cached_layouts b/quickshell-dotfiles/.config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..15ac22b --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/cached_layouts @@ -0,0 +1,3740 @@ +[keyboard-bqn] +Description="键盘 - BQN" +Language=en +Label=bqn + +[keyboard-apl] +Description="键盘 - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="键盘 - APL - APL 符号(Dyalog APL)" +Language=en +Label="dlg (dyalog)" + +[keyboard-apl-sax] +Description="键盘 - APL - APL 符号(SAX,Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="键盘 - APL - APL 符号(统一)" +Language=en +Label="ufd (unified)" + +[keyboard-apl-apl2] +Description="键盘 - APL - APL 符号(IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="键盘 - APL - APL 符号(Manugistics APL*PLUS II)" +Language=en +Label="aplII (aplplusII)" + +[keyboard-apl-aplx] +Description="键盘 - APL - APL 符号(APLX 统一)" +Language=en +Label=aplx + +[keyboard-ua] +Description="键盘 - 乌克兰语" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="键盘 - 乌克兰语 - 乌克兰语(语音助记)" +Language=uk +Label="ua (phonetic)" + +[keyboard-ua-typewriter] +Description="键盘 - 乌克兰语 - 乌克兰语(打字机)" +Language=uk +Label="ua (typewriter)" + +[keyboard-ua-winkeys] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows)" +Language=uk +Label="ua (winkeys)" + +[keyboard-ua-winkeysenhanced] +Description="键盘 - 乌克兰语 - 乌克兰语(Windows 增强)" +Language=uk +Label="ua (winkeysenhanced)" + +[keyboard-ua-macOS] +Description="键盘 - 乌克兰语 - 乌克兰语(macOS)" +Language=uk +Label="ua (macOS)" + +[keyboard-ua-legacy] +Description="键盘 - 乌克兰语 - 乌克兰语(传统)" +Language=uk +Label="ua (legacy)" + +[keyboard-ua-homophonic] +Description="键盘 - 乌克兰语 - 乌克兰语(同音)" +Language=uk +Label="ua (homophonic)" + +[keyboard-ua-crh] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Q)" +Language=crh +Label=crh + +[keyboard-ua-crh_f] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 F)" +Language=crh +Label="crh (crh_f)" + +[keyboard-ua-crh_alt] +Description="键盘 - 乌克兰语 - 克里米亚鞑靼语(土耳其 Alt-Q)" +Language=crh +Label="crh (crh_alt)" + +[keyboard-ua-sun_type6] +Description="键盘 - 乌克兰语 - 乌克兰语(Sun Type 6/7)" +Language=uk +Label="ua (sun_type6)" + +[keyboard-th] +Description="键盘 - 泰语" +Language=th +Label=th + +[keyboard-th-tis] +Description="键盘 - 泰语 - 泰语(TIS-820.2538)" +Language=th +Label="th (tis)" + +[keyboard-th-pat] +Description="键盘 - 泰语 - 泰语(Pattachote)" +Language=th +Label="th (pat)" + +[keyboard-th-mnc] +Description="键盘 - 泰语 - 泰语(Manoonchai)" +Language=th +Label="th (mnc)" + +[keyboard-tz] +Description="键盘 - 斯瓦希里语(坦桑尼亚)" +Language=sw +Label=sw + +[keyboard-latam] +Description="键盘 - 西班牙语(拉丁美洲)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,无死键)" +Language=es +Label="latam (nodeadkeys)" + +[keyboard-latam-deadtilde] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,波浪号为死键)" +Language=es +Label="latam (deadtilde)" + +[keyboard-latam-dvorak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Dvorak)" +Language=es +Label="latam (dvorak)" + +[keyboard-latam-colemak] +Description="键盘 - 西班牙语(拉丁美洲) - 西班牙语(拉丁美洲,Colemak)" +Language=es +Label="latam (colemak)" + +[keyboard-sk] +Description="键盘 - 斯洛伐克语" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(额外的反斜杠)" +Language=sk +Label="sk (bksl)" + +[keyboard-sk-qwerty] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY)" +Language=sk +Label="sk (qwerty)" + +[keyboard-sk-qwerty_bksl] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(QWERTY,额外的反斜杠)" +Language=sk +Label="sk (qwerty_bksl)" + +[keyboard-sk-acc] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(ACC 布局,只有重音字母)" +Language=sk +Label="sk (acc)" + +[keyboard-sk-sun_type6] +Description="键盘 - 斯洛伐克语 - 斯洛伐克语(Sun Type 6/7)" +Language=sk +Label="sk (sun_type6)" + +[keyboard-ru] +Description="键盘 - 俄语" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="键盘 - 俄语 - 俄语(语音助记)" +Language=ru +Label="ru (phonetic)" + +[keyboard-ru-phonetic_winkeys] +Description="键盘 - 俄语 - 俄语(语音助记,Windows)" +Language=ru +Label="ru (phonetic_winkeys)" + +[keyboard-ru-phonetic_YAZHERTY] +Description="键盘 - 俄语 - 俄语(语音助记,YAZHERTY)" +Language=ru +Label="ru (phonetic_YAZHERTY)" + +[keyboard-ru-phonetic_azerty] +Description="键盘 - 俄语 - 俄语(语音助记,AZERTY)" +Language=ru +Label="ru (phonetic_azerty)" + +[keyboard-ru-phonetic_dvorak] +Description="键盘 - 俄语 - 俄语(语音助记,Dvorak)" +Language=ru +Label="ru (phonetic_dvorak)" + +[keyboard-ru-typewriter] +Description="键盘 - 俄语 - 俄语(打字机)" +Language=ru +Label="ru (typewriter)" + +[keyboard-ru-ruchey_ru] +Description="键盘 - 俄语 - 俄语(工程,RU)" +Language=ru +Label="ru (ruchey_ru)" + +[keyboard-ru-ruchey_en] +Description="键盘 - 俄语 - 俄语(工程,EN)" +Language=ru +Label="en (ruchey_en)" + +[keyboard-ru-legacy] +Description="键盘 - 俄语 - 俄语(传统)" +Language=ru +Label="ru (legacy)" + +[keyboard-ru-typewriter-legacy] +Description="键盘 - 俄语 - 俄语(打字机,传统)" +Language=ru +Label="ru (typewriter-legacy)" + +[keyboard-ru-dos] +Description="键盘 - 俄语 - 俄语(DOS)" +Language=ru +Label="ru (dos)" + +[keyboard-ru-mac] +Description="键盘 - 俄语 - 俄语(Macintosh)" +Language=ru +Label="ru (mac)" + +[keyboard-ru-ab] +Description="键盘 - 俄语 - 阿布哈兹语(俄罗斯)" +Language=ab +Label="ru (ab)" + +[keyboard-ru-bak] +Description="键盘 - 俄语 - 巴什基尔语" +Language=ba +Label="ru (bak)" + +[keyboard-ru-cv] +Description="键盘 - 俄语 - 楚瓦什语" +Language=cv +Label="ru (cv)" + +[keyboard-ru-cv_latin] +Description="键盘 - 俄语 - 楚瓦什语(拉丁)" +Language=cv +Label="ru (cv_latin)" + +[keyboard-ru-xal] +Description="键盘 - 俄语 - 卡尔梅克卫拉特语" +Language=xal +Label="ru (xal)" + +[keyboard-ru-kom] +Description="键盘 - 俄语 - 科米语" +Language=kv +Label="ru (kom)" + +[keyboard-ru-chm] +Description="键盘 - 俄语 - Mari" +Language=chm +Label="ru (chm)" + +[keyboard-ru-os_legacy] +Description="键盘 - 俄语 - 奥塞梯语(传统)" +Language=os +Label="ru (os_legacy)" + +[keyboard-ru-os_winkeys] +Description="键盘 - 俄语 - 奥塞梯语(Windows)" +Language=os +Label="ru (os_winkeys)" + +[keyboard-ru-srp] +Description="键盘 - 俄语 - 塞尔维亚语(俄罗斯)" +Language=ru +Label="ru (srp)" + +[keyboard-ru-tt] +Description="键盘 - 俄语 - 鞑靼语" +Language=tt +Label="ru (tt)" + +[keyboard-ru-udm] +Description="键盘 - 俄语 - 乌德穆尔特语" +Language=udm +Label="ru (udm)" + +[keyboard-ru-sah] +Description="键盘 - 俄语 - 雅库特语" +Language=sah +Label="ru (sah)" + +[keyboard-ru-chu] +Description="键盘 - 俄语 - 教会斯拉夫语" +Language=cu +Label="ru (chu)" + +[keyboard-ru-ruu] +Description="键盘 - 俄语 - 俄语(带乌克兰语和白俄罗斯语字母)" +Language=ru +Label="ru (ruu)" + +[keyboard-ru-rulemak] +Description="键盘 - 俄语 - 俄语(Rulemak,语音助记 Colemak)" +Language=ru +Label="ru (rulemak)" + +[keyboard-ru-phonetic_mac] +Description="键盘 - 俄语 - 俄语(语音助记,Macintosh)" +Language=ru +Label="ru (phonetic_mac)" + +[keyboard-ru-sun_type6] +Description="键盘 - 俄语 - 俄语(Sun Type 6/7)" +Language=ru +Label="ru (sun_type6)" + +[keyboard-ru-unipunct] +Description="键盘 - 俄语 - 俄语(带美式标点)" +Language=ru +Label="ru (unipunct)" + +[keyboard-ru-gost-6431-75-48] +Description="键盘 - 俄语 - 俄语(GOST 6431-75)" +Language=ru +Label="ru (gost-6431-75-48)" + +[keyboard-ru-gost-14289-88] +Description="键盘 - 俄语 - 俄语(GOST 14289-88)" +Language=ru +Label="ru (gost-14289-88)" + +[keyboard-ru-prxn] +Description="键盘 - 俄语 - 俄语(Polyglot and Reactionary)" +Language=ru +Label="ru (prxn)" + +[keyboard-ru-winkeys-p] +Description="键盘 - 俄语 - 俄语(适合程序员的)" +Language=ru +Label=winkeys-p + +[keyboard-ru-typo] +Description="键盘 - 俄语 - 俄语(带印刷符号)" +Language=ru +Label="ru (typo)" + +[keyboard-ru-rtu] +Description="键盘 - 俄语 - 俄语(带鞑靼字母)" +Language=ru +Label="ru (rtu)" + +[keyboard-ru-diktor] +Description="键盘 - 俄语 - 俄语(Diktor)" +Language=ru +Label=diktor + +[keyboard-ru-ruintl_ru] +Description="键盘 - 俄语 - 俄语(国际,RU)" +Language=ru +Label="ru (ruintl_ru)" + +[keyboard-ru-ruintl_en] +Description="键盘 - 俄语 - 俄语(国际,EN)" +Language=en +Label="en (ruintl_en)" + +[keyboard-br] +Description="键盘 - 葡萄牙语(巴西)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,无死键)" +Language=pt +Label="br (nodeadkeys)" + +[keyboard-br-dvorak] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Dvorak)" +Language=pt +Label="br (dvorak)" + +[keyboard-br-nativo] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Nativo)" +Language=pt +Label="br (nativo)" + +[keyboard-br-nativo-us] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,用于美式键盘的 Nativo)" +Language=pt +Label="br (nativo-us)" + +[keyboard-br-thinkpad] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,IBM/联想 ThinkPad)" +Language=pt +Label="br (thinkpad)" + +[keyboard-br-nativo-epo] +Description="键盘 - 葡萄牙语(巴西) - 世界语(巴西,Nativo)" +Language=eo +Label="br (nativo-epo)" + +[keyboard-br-rus] +Description="键盘 - 葡萄牙语(巴西) - 俄语(巴西,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-br-sun_type6] +Description="键盘 - 葡萄牙语(巴西) - 葡萄牙语(巴西,Sun Type 6/7)" +Language=pt +Label="br (sun_type6)" + +[keyboard-ro] +Description="键盘 - 罗马尼亚语" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(标准)" +Language=ro +Label="ro (std)" + +[keyboard-ro-winkeys] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Windows)" +Language=ro +Label="ro (winkeys)" + +[keyboard-ro-crh_dobruja] +Description="键盘 - 罗马尼亚语 - 克里米亚鞑靼语(Dobruja Q)" +Language=crh +Label="crh (crh_dobruja)" + +[keyboard-ro-ergonomic] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(人体工学盲打)" +Language=ro +Label="ro (ergonomic)" + +[keyboard-ro-sun_type6] +Description="键盘 - 罗马尼亚语 - 罗马尼亚语(Sun Type 6/7)" +Language=ro +Label="ro (sun_type6)" + +[keyboard-pl] +Description="键盘 - 波兰语" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="键盘 - 波兰语 - 瑞士语(传统)" +Language=pl +Label="pl (legacy)" + +[keyboard-pl-qwertz] +Description="键盘 - 波兰语 - 波兰语(QWERTZ)" +Language=pl +Label="pl (qwertz)" + +[keyboard-pl-dvorak] +Description="键盘 - 波兰语 - 波兰语(Dvorak)" +Language=pl +Label="pl (dvorak)" + +[keyboard-pl-dvorak_quotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在引号键上)" +Language=pl +Label="pl (dvorak_quotes)" + +[keyboard-pl-dvorak_altquotes] +Description="键盘 - 波兰语 - 波兰语(Dvorak,波兰语引号在 1 键上)" +Language=pl +Label="pl (dvorak_altquotes)" + +[keyboard-pl-dvp] +Description="键盘 - 波兰语 - 波兰语(适合程序员的 Dvorak)" +Language=pl +Label="pl (dvp)" + +[keyboard-pl-csb] +Description="键盘 - 波兰语 - 卡舒比语" +Language=csb +Label="pl (csb)" + +[keyboard-pl-szl] +Description="键盘 - 波兰语 - 西里西亚语" +Language=szl +Label="pl (szl)" + +[keyboard-pl-ru_phonetic_dvorak] +Description="键盘 - 波兰语 - 俄语(波兰,语音助记 Dvorak)" +Language=ru +Label="ru (ru_phonetic_dvorak)" + +[keyboard-pl-intl] +Description="键盘 - 波兰语 - 波兰语(国际,带死键)" +Language=pl +Label="pl (intl)" + +[keyboard-pl-colemak] +Description="键盘 - 波兰语 - 波兰语(Colemak)" +Language=pl +Label="pl (colemak)" + +[keyboard-pl-colemak_dh_ansi] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH)" +Language=pl +Label="pl (colemak_dh_ansi)" + +[keyboard-pl-colemak_dh] +Description="键盘 - 波兰语 - 波兰语(Colemak-DH ISO)" +Language=pl +Label="pl (colemak_dh)" + +[keyboard-pl-sun_type6] +Description="键盘 - 波兰语 - 波兰语(Sun Type 6/7)" +Language=pl +Label="pl (sun_type6)" + +[keyboard-pl-glagolica] +Description="键盘 - 波兰语 - 波兰语(Glagolica)" +Language=pl +Label="pl (glagolica)" + +[keyboard-pl-lefty] +Description="键盘 - 波兰语 - 波兰语(Lefty)" +Language=pl +Label="pl (lefty)" + +[keyboard-trans] +Description="键盘 - 国际音标" +Language= +Label=ipa + +[keyboard-trans-qwerty] +Description="键盘 - 国际音标 - 国际音标(QWERTY)" +Language= +Label="trans (qwerty)" + +[keyboard-ir] +Description="键盘 - 波斯语" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="键盘 - 波斯语 - 波斯语(带波斯语小键盘)" +Language=fa +Label="ir (pes_keypad)" + +[keyboard-ir-winkeys] +Description="键盘 - 波斯语 - 波斯语(Windows)" +Language=fa +Label="ir (winkeys)" + +[keyboard-ir-azb] +Description="键盘 - 波斯语 - 阿塞拜疆语(伊朗)" +Language=azb +Label=azb + +[keyboard-ir-ku] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="键盘 - 波斯语 - 库尔德语(伊朗,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-ir-ku_f] +Description="键盘 - 波斯语 - 库尔德语(伊朗,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-ir-ku_ara] +Description="键盘 - 波斯语 - 库尔德语(伊朗,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-custom] +Description="键盘 - 用户自定义布局" +Language=und +Label=custom + +[keyboard-no] +Description="键盘 - 挪威语" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(无死键)" +Language=no +Label="no (nodeadkeys)" + +[keyboard-no-winkeys] +Description="键盘 - 挪威语 - 挪威语(Windows)" +Language=no +Label="no (winkeys)" + +[keyboard-no-mac] +Description="键盘 - 挪威语 - 挪威语(Macintosh)" +Language=no +Label="no (mac)" + +[keyboard-no-mac_nodeadkeys] +Description="键盘 - 挪威语 - 挪威语(Macintosh,无死键)" +Language=no +Label="no (mac_nodeadkeys)" + +[keyboard-no-colemak] +Description="键盘 - 挪威语 - 挪威语(Colemak)" +Language=no +Label="no (colemak)" + +[keyboard-no-colemak_dh] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH)" +Language=no +Label="no (colemak_dh)" + +[keyboard-no-colemak_dh_wide] +Description="键盘 - 挪威语 - 挪威语(Colemak-DH 宽版)" +Language=no +Label="no (colemak_dh_wide)" + +[keyboard-no-dvorak] +Description="键盘 - 挪威语 - 挪威语(Dvorak)" +Language=no +Label="no (dvorak)" + +[keyboard-no-smi] +Description="键盘 - 挪威语 - 北萨米语(挪威)" +Language=se +Label="no (smi)" + +[keyboard-no-smi_nodeadkeys] +Description="键盘 - 挪威语 - 北萨米语(挪威,无死键)" +Language=se +Label="no (smi_nodeadkeys)" + +[keyboard-no-sun_type6] +Description="键盘 - 挪威语 - 挪威语(Sun Type 6/7)" +Language=no +Label="no (sun_type6)" + +[keyboard-gn] +Description="键盘 - 西非书面字母(AZERTY)" +Language=nqo +Label=nqo + +[keyboard-tm] +Description="键盘 - 土库曼语" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="键盘 - 土库曼语 - 土库曼语(Alt-Q)" +Language=tk +Label="tm (alt)" + +[keyboard-np] +Description="键盘 - 尼泊尔语" +Language=ne +Label=ne + +[keyboard-ancient] +Description="键盘 - 古代语言" +Language=got +Label=xx + +[keyboard-ancient-got] +Description="键盘 - 古代语言 - 哥特语" +Language=got +Label="ancient (got)" + +[keyboard-ancient-uga] +Description="键盘 - 古代语言 - 乌加里特语" +Language=uga +Label="ancient (uga)" + +[keyboard-ancient-ave] +Description="键盘 - 古代语言 - 阿维斯陀语" +Language=ae +Label="ancient (ave)" + +[keyboard-ancient-got-alt] +Description="键盘 - 古代语言 - 哥特语(替代)" +Language=got +Label="ancient (got-alt)" + +[keyboard-mt] +Description="键盘 - 马耳他语" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国)" +Language=mt +Label="mt (us)" + +[keyboard-mt-alt-us] +Description="键盘 - 马耳他语 - 马耳他语(美国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-us)" + +[keyboard-mt-alt-gb] +Description="键盘 - 马耳他语 - 马耳他语(英国,带 AltGr 覆盖)" +Language=mt +Label="mt (alt-gb)" + +[keyboard-pt] +Description="键盘 - 葡萄牙语" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(无死键)" +Language=pt +Label="pt (nodeadkeys)" + +[keyboard-pt-mac] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh)" +Language=pt +Label="pt (mac)" + +[keyboard-pt-mac_nodeadkeys] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Macintosh,无死键)" +Language=pt +Label="pt (mac_nodeadkeys)" + +[keyboard-pt-nativo] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Nativo)" +Language=pt +Label="pt (nativo)" + +[keyboard-pt-nativo-us] +Description="键盘 - 葡萄牙语 - 葡萄牙语(用于美式键盘的 Nativo)" +Language=pt +Label="pt (nativo-us)" + +[keyboard-pt-nativo-epo] +Description="键盘 - 葡萄牙语 - 世界语(葡萄牙,Nativo)" +Language=eo +Label="pt (nativo-epo)" + +[keyboard-pt-sun_type6] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Sun Type 6/7)" +Language=pt +Label="pt (sun_type6)" + +[keyboard-pt-colemak] +Description="键盘 - 葡萄牙语 - 葡萄牙语(Colemak)" +Language=pt +Label="pt (colemak)" + +[keyboard-my] +Description="键盘 - 马来语(爪夷,阿拉伯键盘)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="键盘 - 马来语(爪夷,阿拉伯键盘) - 马来语(爪夷,语音助记)" +Language=id +Label="my (phonetic)" + +[keyboard-mk] +Description="键盘 - 马其顿语" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="键盘 - 马其顿语 - 马其顿语(无死键)" +Language=mk +Label="mk (nodeadkeys)" + +[keyboard-kg] +Description="键盘 - 柯尔克孜语(吉尔吉斯语)" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="键盘 - 柯尔克孜语(吉尔吉斯语) - 柯尔克孜语(吉尔吉斯语,语音助记)" +Language=ky +Label="kg (phonetic)" + +[keyboard-tj] +Description="键盘 - 塔吉克语" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="键盘 - 塔吉克语 - 塔吉克语(传统)" +Language=tg +Label="tj (legacy)" + +[keyboard-mv] +Description="键盘 - 迪维希语" +Language=dv +Label=dv + +[keyboard-lk] +Description="键盘 - 僧伽罗语(语音助记)" +Language=si +Label=si + +[keyboard-lk-us] +Description="键盘 - 僧伽罗语(语音助记) - 僧伽罗语(美国)" +Language=si +Label="si (us)" + +[keyboard-lk-tam_unicode] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99)" +Language=ta +Label="ta (tam_unicode)" + +[keyboard-lk-tam_TAB] +Description="键盘 - 僧伽罗语(语音助记) - 泰米尔语(斯里兰卡,TamilNet '99,TAB 编码)" +Language=ta +Label="lk (tam_TAB)" + +[keyboard-al] +Description="键盘 - 阿尔巴尼亚语" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Plisi)" +Language=sq +Label="al (plisi)" + +[keyboard-al-veqilharxhi] +Description="键盘 - 阿尔巴尼亚语 - 阿尔巴尼亚语(Veqilharxhi)" +Language=sq +Label="al (veqilharxhi)" + +[keyboard-cz] +Description="键盘 - 捷克语" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="键盘 - 捷克语 - 捷克语(额外的反斜杠)" +Language=cs +Label="cz (bksl)" + +[keyboard-cz-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY)" +Language=cs +Label="cz (qwerty)" + +[keyboard-cz-qwerty_bksl] +Description="键盘 - 捷克语 - 捷克语(QWERTY,额外的反斜杠)" +Language=cs +Label="cz (qwerty_bksl)" + +[keyboard-cz-winkeys] +Description="键盘 - 捷克语 - 捷克语(QWERTZ,Windows)" +Language=cs +Label="cz (winkeys)" + +[keyboard-cz-winkeys-qwerty] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Windows)" +Language=cs +Label="cz (winkeys-qwerty)" + +[keyboard-cz-qwerty-mac] +Description="键盘 - 捷克语 - 捷克语(QWERTY,Macintosh)" +Language=cs +Label="cz (qwerty-mac)" + +[keyboard-cz-ucw] +Description="键盘 - 捷克语 - 捷克语(UCW,只有重音字母)" +Language=cs +Label="cz (ucw)" + +[keyboard-cz-dvorak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Dvorak,支持 UCW)" +Language=cs +Label="cz (dvorak-ucw)" + +[keyboard-cz-rus] +Description="键盘 - 捷克语 - 俄语(捷克语,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-cz-sun_type6] +Description="键盘 - 捷克语 - 捷克语(Sun Type 6/7)" +Language=cs +Label="cz (sun_type6)" + +[keyboard-cz-prog] +Description="键盘 - 捷克语 - 捷克语(programming)" +Language=cs +Label="cz (prog)" + +[keyboard-cz-prog_typo] +Description="键盘 - 捷克语 - 捷克语(programming,typographic)" +Language=cs +Label="cz (prog_typo)" + +[keyboard-cz-coder] +Description="键盘 - 捷克语 - 捷克语(coder)" +Language=cs +Label="cz (coder)" + +[keyboard-cz-colemak-ucw] +Description="键盘 - 捷克语 - 捷克语(美国,Colemak,支持 UCW)" +Language=cs +Label="cz (colemak-ucw)" + +[keyboard-brai] +Description="键盘 - 盲文" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="键盘 - 盲文 - 盲文(单手,左手)" +Language= +Label="brai (left_hand)" + +[keyboard-brai-left_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,左手,大拇指反转)" +Language= +Label="brai (left_hand_invert)" + +[keyboard-brai-right_hand] +Description="键盘 - 盲文 - 盲文(单手,右手)" +Language= +Label="brai (right_hand)" + +[keyboard-brai-right_hand_invert] +Description="键盘 - 盲文 - 盲文(单手,右手,大拇指反转)" +Language= +Label="brai (right_hand_invert)" + +[keyboard-se] +Description="键盘 - 瑞典语" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="键盘 - 瑞典语 - 瑞典语(无死键)" +Language=sv +Label="se (nodeadkeys)" + +[keyboard-se-dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak)" +Language=sv +Label="se (dvorak)" + +[keyboard-se-us_dvorak] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak,国际)" +Language=sv +Label="se (us_dvorak)" + +[keyboard-se-svdvorak] +Description="键盘 - 瑞典语 - 瑞典语(Svdvorak)" +Language=sv +Label="se (svdvorak)" + +[keyboard-se-colemak] +Description="键盘 - 瑞典语 - 瑞典语(Colemak)" +Language=sv +Label="se (colemak)" + +[keyboard-se-mac] +Description="键盘 - 瑞典语 - 瑞典语(Macintosh)" +Language=sv +Label="se (mac)" + +[keyboard-se-us] +Description="键盘 - 瑞典语 - 瑞典语(美国)" +Language=sv +Label="se (us)" + +[keyboard-se-swl] +Description="键盘 - 瑞典语 - 瑞典手语" +Language=swl +Label="se (swl)" + +[keyboard-se-smi] +Description="键盘 - 瑞典语 - 北萨米语(瑞典)" +Language=se +Label="se (smi)" + +[keyboard-se-rus] +Description="键盘 - 瑞典语 - 俄语(瑞典,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-se-dvorak_a5] +Description="键盘 - 瑞典语 - 瑞典语(Dvorak A5)" +Language=sv +Label="se (dvorak_a5)" + +[keyboard-se-sun_type6] +Description="键盘 - 瑞典语 - 瑞典语(Sun Type 6/7)" +Language=sv +Label="se (sun_type6)" + +[keyboard-se-ovd] +Description="键盘 - 瑞典语 - Elfdalian 语(瑞典,带组合 ogonek)" +Language=ovd +Label="se (ovd)" + +[keyboard-bg] +Description="键盘 - 保加利亚语" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,传统)" +Language=bg +Label="bg (phonetic)" + +[keyboard-bg-bas_phonetic] +Description="键盘 - 保加利亚语 - 保加利亚语(语音助记,新)" +Language=bg +Label="bg (bas_phonetic)" + +[keyboard-bg-bekl] +Description="键盘 - 保加利亚语 - 保加利亚语(改进)" +Language=bg +Label="bg (bekl)" + +[keyboard-pk] +Description="键盘 - 乌尔都语(巴基斯坦)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,CRULP)" +Language=ur +Label="pk (urd-crulp)" + +[keyboard-pk-urd-nla] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,NLA)" +Language=ur +Label="pk (urd-nla)" + +[keyboard-pk-pak_urdu_phonetic] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(Pak Urdu 语音助记)" +Language=ur +Label="pk (pak_urdu_phonetic)" + +[keyboard-pk-ara] +Description="键盘 - 乌尔都语(巴基斯坦) - 阿拉伯语(巴基斯坦)" +Language=ar +Label="ar (ara)" + +[keyboard-pk-snd] +Description="键盘 - 乌尔都语(巴基斯坦) - 信德语" +Language=sd +Label="sd (snd)" + +[keyboard-pk-urd-navees] +Description="键盘 - 乌尔都语(巴基斯坦) - 乌尔都语(巴基斯坦,Navees)" +Language=ur +Label="pk (urd-navees)" + +[keyboard-au] +Description="键盘 - 英语(澳大利亚)" +Language=en +Label=en + +[keyboard-mn] +Description="键盘 - 蒙古语" +Language=mn +Label=mn + +[keyboard-dz] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁)" +Language=tzm +Label=kab + +[keyboard-dz-ber] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 柏柏尔语(阿尔及利亚,提非纳)" +Language=kab +Label="kab (ber)" + +[keyboard-dz-azerty-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(AZERTY,带死键)" +Language=kab +Label="kab (azerty-deadkeys)" + +[keyboard-dz-qwerty-gb-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,英国,带死键)" +Language=kab +Label="kab (qwerty-gb-deadkeys)" + +[keyboard-dz-qwerty-us-deadkeys] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 卡拜尔语(QWERTY,美国,带死键)" +Language=kab +Label="kab (qwerty-us-deadkeys)" + +[keyboard-dz-ar] +Description="键盘 - 柏柏尔语(阿尔及利亚,拉丁) - 阿拉伯语(阿尔及利亚)" +Language=ar +Label=ar + +[keyboard-me] +Description="键盘 - 黑山语" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="键盘 - 黑山语 - 黑山语(西里尔)" +Language=sr +Label="me (cyrillic)" + +[keyboard-me-cyrillicyz] +Description="键盘 - 黑山语 - 黑山语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="me (cyrillicyz)" + +[keyboard-me-cyrillicalternatequotes] +Description="键盘 - 黑山语 - 黑山语(西里尔,带书名号引号)" +Language=sr +Label="me (cyrillicalternatequotes)" + +[keyboard-me-latinunicode] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode)" +Language=sr +Label="me (latinunicode)" + +[keyboard-me-latinyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,QWERTY)" +Language=sr +Label="me (latinyz)" + +[keyboard-me-latinunicodeyz] +Description="键盘 - 黑山语 - 黑山语(拉丁,Unicode,QWERTY)" +Language=sr +Label="me (latinunicodeyz)" + +[keyboard-me-latinalternatequotes] +Description="键盘 - 黑山语 - 黑山语(拉丁,带书名号引号)" +Language=sr +Label="me (latinalternatequotes)" + +[keyboard-lv] +Description="键盘 - 拉脱维亚语" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(撇号)" +Language=lv +Label="lv (apostrophe)" + +[keyboard-lv-tilde] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(波浪号)" +Language=lv +Label="lv (tilde)" + +[keyboard-lv-fkey] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(F)" +Language=lv +Label="lv (fkey)" + +[keyboard-lv-modern] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代拉丁)" +Language=lv +Label="lv (modern)" + +[keyboard-lv-modern-cyr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(现代西里尔)" +Language=lv +Label="lv (modern-cyr)" + +[keyboard-lv-ergonomic] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(人体工学,ŪGJRMV)" +Language=lv +Label="lv (ergonomic)" + +[keyboard-lv-adapted] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(改良)" +Language=lv +Label="lv (adapted)" + +[keyboard-lv-dvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak)" +Language=lv +Label="lv (dvorak)" + +[keyboard-lv-ykeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorak)" + +[keyboard-lv-minuskeydvorak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorak)" + +[keyboard-lv-dvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak)" +Language=lv +Label="lv (dvorakprogr)" + +[keyboard-lv-ykeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带 Y)" +Language=lv +Label="lv (ykeydvorakprogr)" + +[keyboard-lv-minuskeydvorakprogr] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(适合程序员的 Dvorak,带减号)" +Language=lv +Label="lv (minuskeydvorakprogr)" + +[keyboard-lv-colemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak)" +Language=lv +Label="lv (colemak)" + +[keyboard-lv-apostrophecolemak] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Colemak,带撇号)" +Language=lv +Label="lv (apostrophecolemak)" + +[keyboard-lv-sun_type6] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(Sun Type 6/7)" +Language=lv +Label="lv (sun_type6)" + +[keyboard-lv-apostrophe-deadquotes] +Description="键盘 - 拉脱维亚语 - 拉脱维亚语(带撇号,引号为死键)" +Language=lv +Label="lv (apostrophe-deadquotes)" + +[keyboard-ba] +Description="键盘 - 波斯尼亚语" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带书名号引号)" +Language=bs +Label="ba (alternatequotes)" + +[keyboard-ba-unicode] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(带波斯尼亚二重字)" +Language=bs +Label="ba (unicode)" + +[keyboard-ba-unicodeus] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国,带罗马尼亚二重字)" +Language=bs +Label="ba (unicodeus)" + +[keyboard-ba-us] +Description="键盘 - 波斯尼亚语 - 波斯尼亚语(美国)" +Language=bs +Label="ba (us)" + +[keyboard-tw] +Description="键盘 - 台语" +Language=fox +Label=zh + +[keyboard-tw-indigenous] +Description="键盘 - 台语 - 台语(原住民)" +Language=ami +Label="tw (indigenous)" + +[keyboard-tw-saisiyat] +Description="键盘 - 台语 - 赛夏语(台湾)" +Language=xsy +Label="xsy (saisiyat)" + +[keyboard-rs] +Description="键盘 - 塞尔维亚语" +Language=sr +Label=sr + +[keyboard-rs-alternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,带书名号引号)" +Language=sr +Label="rs (alternatequotes)" + +[keyboard-rs-yz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(西里尔,交换 ZE 和 ZHE)" +Language=sr +Label="rs (yz)" + +[keyboard-rs-latin] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁)" +Language=sr +Label="rs (latin)" + +[keyboard-rs-latinalternatequotes] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,带书名号引号)" +Language=sr +Label="rs (latinalternatequotes)" + +[keyboard-rs-latinunicode] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(拉丁,Unicode)" +Language=sr +Label="rs (latinunicode)" + +[keyboard-rs-latinyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,QWERTY)" +Language=sr +Label="rs (latinyz)" + +[keyboard-rs-latinunicodeyz] +Description="键盘 - 塞尔维亚语 - 塞尔维亚(拉丁,Unicode,QWERTY)" +Language=sr +Label="rs (latinunicodeyz)" + +[keyboard-rs-rue] +Description="键盘 - 塞尔维亚语 - 潘诺尼亚卢森尼亚语" +Language=rue +Label="rs (rue)" + +[keyboard-rs-combiningkeys] +Description="键盘 - 塞尔维亚语 - 塞尔维亚语(组合重音而不使用死键)" +Language=sr +Label="rs (combiningkeys)" + +[keyboard-dk] +Description="键盘 - 丹麦语" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(无死键)" +Language=da +Label="dk (nodeadkeys)" + +[keyboard-dk-winkeys] +Description="键盘 - 丹麦语 - 丹麦语(Windows)" +Language=da +Label="dk (winkeys)" + +[keyboard-dk-mac] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh)" +Language=da +Label="dk (mac)" + +[keyboard-dk-mac_nodeadkeys] +Description="键盘 - 丹麦语 - 丹麦语(Macintosh,无死键)" +Language=da +Label="dk (mac_nodeadkeys)" + +[keyboard-dk-dvorak] +Description="键盘 - 丹麦语 - 丹麦语(Dvorak)" +Language=da +Label="dk (dvorak)" + +[keyboard-dk-sun_type6] +Description="键盘 - 丹麦语 - 丹麦语(Sun Type 6/7)" +Language=da +Label="dk (sun_type6)" + +[keyboard-bw] +Description="键盘 - 茨瓦纳语" +Language=tn +Label=tn + +[keyboard-kr] +Description="键盘 - 朝鲜语" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="键盘 - 朝鲜语 - 朝鲜语(兼容 101/104 键)" +Language=ko +Label="kr (kr104)" + +[keyboard-kr-sun_type6] +Description="键盘 - 朝鲜语 - 朝鲜语(Sun Type 6/7)" +Language=ko +Label="kr (sun_type6)" + +[keyboard-nl] +Description="键盘 - 荷兰语" +Language=nl +Label=nl + +[keyboard-nl-us] +Description="键盘 - 荷兰语 - 荷兰语(美国)" +Language=nl +Label="nl (us)" + +[keyboard-nl-mac] +Description="键盘 - 荷兰语 - 荷兰语(Macintosh)" +Language=nl +Label="nl (mac)" + +[keyboard-nl-std] +Description="键盘 - 荷兰语 - 荷兰语(标准)" +Language=nl +Label="nl (std)" + +[keyboard-nl-sun_type6] +Description="键盘 - 荷兰语 - 荷兰语(Sun Type 6/7)" +Language=nl +Label="nl (sun_type6)" + +[keyboard-et] +Description="键盘 - 阿姆哈拉语" +Language=am +Label=am + +[keyboard-be] +Description="键盘 - 比利时语" +Language=de +Label=be + +[keyboard-be-oss] +Description="键盘 - 比利时语 - 比利时语(替代)" +Language=de +Label="be (oss)" + +[keyboard-be-oss_latin9] +Description="键盘 - 比利时语 - 比利时语(只包含拉丁-9 字符,替代)" +Language=de +Label="be (oss_latin9)" + +[keyboard-be-iso-alternate] +Description="键盘 - 比利时语 - 比利时语(ISO,替代)" +Language=de +Label="be (iso-alternate)" + +[keyboard-be-nodeadkeys] +Description="键盘 - 比利时语 - 比利时语(无死键)" +Language=de +Label="be (nodeadkeys)" + +[keyboard-be-wang] +Description="键盘 - 比利时语 - 比利时语(王安 724 型 AZERTY)" +Language=de +Label="be (wang)" + +[keyboard-be-sun_type6] +Description="键盘 - 比利时语 - 比利时语(Sun Type 6/7)" +Language=de +Label="be (sun_type6)" + +[keyboard-la] +Description="键盘 - 老挝语" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="键盘 - 老挝语 - 老挝语(STEA)" +Language=lo +Label="la (stea)" + +[keyboard-bt] +Description="键盘 - 不丹语" +Language=dz +Label=dz + +[keyboard-mm] +Description="键盘 - 缅甸语" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="键盘 - 缅甸语 - 缅甸语(Zawgyi)" +Language=my +Label="my-zwg (zawgyi)" + +[keyboard-mm-mnw] +Description="键盘 - 缅甸语 - 孟语" +Language=mnw +Label=mnw + +[keyboard-mm-mnw-a1] +Description="键盘 - 缅甸语 - 孟语(A1)" +Language=mnw +Label="mnw (mnw-a1)" + +[keyboard-mm-shn] +Description="键盘 - 缅甸语 - 掸语" +Language=shn +Label=shn + +[keyboard-mm-zgt] +Description="键盘 - 缅甸语 - 掸语(Zawgyi)" +Language=shn +Label="shn-zwg (zgt)" + +[keyboard-si] +Description="键盘 - 斯洛文尼亚语" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(带书名号引号)" +Language=sl +Label="si (alternatequotes)" + +[keyboard-si-us] +Description="键盘 - 斯洛文尼亚语 - 斯洛文尼亚语(美国)" +Language=sl +Label="si (us)" + +[keyboard-am] +Description="键盘 - 亚美尼亚语" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(语音助记)" +Language=hy +Label="am (phonetic)" + +[keyboard-am-phonetic-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,语音助记)" +Language=hy +Label="am (phonetic-alt)" + +[keyboard-am-eastern] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(东部)" +Language=hy +Label="am (eastern)" + +[keyboard-am-eastern-alt] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(替代,东部)" +Language=hy +Label="am (eastern-alt)" + +[keyboard-am-western] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(西部)" +Language=hy +Label="am (western)" + +[keyboard-am-olpc-phonetic] +Description="键盘 - 亚美尼亚语 - 亚美尼亚语(OLPC,语音助记)" +Language=hy +Label="am (olpc-phonetic)" + +[keyboard-by] +Description="键盘 - 白俄罗斯语" +Language=be +Label=by + +[keyboard-by-legacy] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(传统)" +Language=be +Label="by (legacy)" + +[keyboard-by-latin] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(拉丁)" +Language=be +Label="by (latin)" + +[keyboard-by-intl] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(国际)" +Language=be +Label="by (intl)" + +[keyboard-by-phonetic] +Description="键盘 - 白俄罗斯语 - 白俄罗斯语(语音助记)" +Language=be +Label="by (phonetic)" + +[keyboard-by-ru] +Description="键盘 - 白俄罗斯语 - 俄语(白俄罗斯)" +Language=ru +Label="by (ru)" + +[keyboard-vn] +Description="键盘 - 越南语" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="键盘 - 越南语 - 越南语(美国)" +Language=vi +Label="vn (us)" + +[keyboard-vn-fr] +Description="键盘 - 越南语 - 越南语(法国)" +Language=vi +Label="vn (fr)" + +[keyboard-vn-aderty] +Description="键盘 - 越南语 - 越南语(AÐERTY)" +Language=vi +Label="vn (aderty)" + +[keyboard-vn-qderty] +Description="键盘 - 越南语 - 越南语(QĐERTY)" +Language=vi +Label="vn (qderty)" + +[keyboard-ml] +Description="键盘 - 班巴拉语" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="键盘 - 班巴拉语 - 法语(马里,替代)" +Language=fr +Label="fr (fr-oss)" + +[keyboard-ml-us-mac] +Description="键盘 - 班巴拉语 - 英语(马里,美国,Macintosh)" +Language=en +Label="en (us-mac)" + +[keyboard-ml-us-intl] +Description="键盘 - 班巴拉语 - 英语(马里,美国,国际)" +Language=en +Label="en (us-intl)" + +[keyboard-ara] +Description="键盘 - 阿拉伯语" +Language=ar +Label=ar + +[keyboard-ara-digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯语数字)" +Language=ar +Label="ara (digits)" + +[keyboard-ara-azerty] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY)" +Language=ar +Label="ara (azerty)" + +[keyboard-ara-azerty_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(AZERTY,东阿拉伯语数字)" +Language=ar +Label="ara (azerty_digits)" + +[keyboard-ara-buckwalter] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Buckwalter)" +Language=ar +Label="ara (buckwalter)" + +[keyboard-ara-mac] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh)" +Language=ar +Label="ara (mac)" + +[keyboard-ara-mac-phonetic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Macintosh,语音助记)" +Language=ar +Label="ara (mac-phonetic)" + +[keyboard-ara-olpc] +Description="键盘 - 阿拉伯语 - 阿拉伯语(OLPC)" +Language=ar +Label="ara (olpc)" + +[keyboard-ara-sun_type6] +Description="键盘 - 阿拉伯语 - 阿拉伯语(Sun Type 6/7)" +Language=ar +Label="ara (sun_type6)" + +[keyboard-ara-basic_ext] +Description="键盘 - 阿拉伯语 - 阿拉伯语(阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext)" + +[keyboard-ara-basic_ext_digits] +Description="键盘 - 阿拉伯语 - 阿拉伯语(东阿拉伯数字,第 4 层带扩展)" +Language=ar +Label="ara (basic_ext_digits)" + +[keyboard-ara-ergoarabic] +Description="键盘 - 阿拉伯语 - 阿拉伯语(ErgoArabic)" +Language=ar +Label="ara (ergoarabic)" + +[keyboard-ie] +Description="键盘 - 爱尔兰语" +Language=en +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="键盘 - 爱尔兰语 - 爱尔兰语(UnicodeExpert)" +Language=en +Label="ie (UnicodeExpert)" + +[keyboard-ie-CloGaelach] +Description="键盘 - 爱尔兰语 - CloGaelach" +Language=ga +Label="ie (CloGaelach)" + +[keyboard-ie-ogam] +Description="键盘 - 爱尔兰语 - 欧甘语" +Language=sga +Label="ie (ogam)" + +[keyboard-ie-ogam_is434] +Description="键盘 - 爱尔兰语 - 欧甘语(IS434)" +Language=sga +Label="ie (ogam_is434)" + +[keyboard-cm] +Description="键盘 - 英语(喀麦隆)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="键盘 - 英语(喀麦隆) - 法语(喀麦隆)" +Language=fr +Label="fr (french)" + +[keyboard-cm-qwerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆多语言(QWERTY,国际)" +Language=en +Label="cm (qwerty)" + +[keyboard-cm-azerty] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(AZERTY,国际)" +Language=fr +Label="cm (azerty)" + +[keyboard-cm-dvorak] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Dvorak,国际)" +Language=en +Label="cm (dvorak)" + +[keyboard-cm-mmuock] +Description="键盘 - 英语(喀麦隆) - 喀麦隆(Mmuock)" +Language=en +Label="cm (mmuock)" + +[keyboard-iq] +Description="键盘 - 阿拉伯语(伊拉克)" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-iq-ku_f] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-iq-ku_ara] +Description="键盘 - 阿拉伯语(伊拉克) - 库尔德语(伊拉克,阿拉伯-拉丁)" +Language=ku +Label="ku (ku_ara)" + +[keyboard-af] +Description="键盘 - 达里语" +Language=prs +Label=fa + +[keyboard-af-ps] +Description="键盘 - 达里语 - 普什图语" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗)" +Language=uz +Label=uz + +[keyboard-af-fa-olpc] +Description="键盘 - 达里语 - 达里语(阿富汗,OLPC)" +Language=prs +Label="fa (fa-olpc)" + +[keyboard-af-ps-olpc] +Description="键盘 - 达里语 - 普什图语(阿富汗,OLPC)" +Language=ps +Label="ps (ps-olpc)" + +[keyboard-af-uz-olpc] +Description="键盘 - 达里语 - 乌兹别克语(阿富汗,OLPC)" +Language=uz +Label="uz (uz-olpc)" + +[keyboard-hr] +Description="键盘 - 克罗地亚语" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带书名号引号)" +Language=hr +Label="hr (alternatequotes)" + +[keyboard-hr-unicode] +Description="键盘 - 克罗地亚语 - 克罗地亚语(带克罗地亚语二重字)" +Language=hr +Label="hr (unicode)" + +[keyboard-hr-unicodeus] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国,带克罗地亚语二重字)" +Language=hr +Label="hr (unicodeus)" + +[keyboard-hr-us] +Description="键盘 - 克罗地亚语 - 克罗地亚语(美国)" +Language=hr +Label="hr (us)" + +[keyboard-ma] +Description="键盘 - 阿拉伯语(摩洛哥)" +Language=ary +Label=ar + +[keyboard-ma-tifinagh] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳)" +Language=ber +Label="ber (tifinagh)" + +[keyboard-ma-tifinagh-alt] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳,替代)" +Language=ber +Label="ber (tifinagh-alt)" + +[keyboard-ma-tifinagh-alt-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记,替代)" +Language=ber +Label="ber (tifinagh-alt-phonetic)" + +[keyboard-ma-tifinagh-extended] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展)" +Language=ber +Label="ber (tifinagh-extended)" + +[keyboard-ma-tifinagh-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳语音助记)" +Language=ber +Label="ber (tifinagh-phonetic)" + +[keyboard-ma-tifinagh-extended-phonetic] +Description="键盘 - 阿拉伯语(摩洛哥) - 柏柏尔语(摩洛哥,提非纳扩展语音助记)" +Language=ber +Label="ber (tifinagh-extended-phonetic)" + +[keyboard-ma-french] +Description="键盘 - 阿拉伯语(摩洛哥) - 法语(摩洛哥)" +Language=fr +Label="fr (french)" + +[keyboard-ma-rif] +Description="键盘 - 阿拉伯语(摩洛哥) - 里夫语" +Language=rif +Label=rif + +[keyboard-sy] +Description="键盘 - 阿拉伯语(叙利亚)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="键盘 - 阿拉伯语(叙利亚) - 叙利亚语(语音助记)" +Language=syr +Label="syc (syc_phonetic)" + +[keyboard-sy-ku] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-sy-ku_f] +Description="键盘 - 阿拉伯语(叙利亚) - 库尔德语(叙利亚,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-at] +Description="键盘 - 德语(奥地利)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="键盘 - 德语(奥地利) - 德语(奥地利,无死键)" +Language=de +Label="at (nodeadkeys)" + +[keyboard-at-mac] +Description="键盘 - 德语(奥地利) - 德语(奥地利,Macintosh)" +Language=de +Label="at (mac)" + +[keyboard-nz] +Description="键盘 - 英语(新西兰)" +Language=en +Label=en + +[keyboard-nz-mao] +Description="键盘 - 英语(新西兰) - 毛利语" +Language=mi +Label="mi (mao)" + +[keyboard-epo] +Description="键盘 - 世界语" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="键盘 - 世界语 - 世界语(传统)" +Language=eo +Label="epo (legacy)" + +[keyboard-eu] +Description="键盘 - EurKEY(美国)" +Language=ca +Label=eu + +[keyboard-za] +Description="键盘 - 英语(南非)" +Language=en +Label=en + +[keyboard-fo] +Description="键盘 - 法罗语" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="键盘 - 法罗语 - 法罗语(无死键)" +Language=fo +Label="fo (nodeadkeys)" + +[keyboard-gb] +Description="键盘 - 英语(英国)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="键盘 - 英语(英国) - 英语(英国,扩展,Windows)" +Language=en +Label="gb (extd)" + +[keyboard-gb-intl] +Description="键盘 - 英语(英国) - 英语(英国,国际,带死键)" +Language=en +Label="gb (intl)" + +[keyboard-gb-dvorak] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak)" +Language=en +Label="gb (dvorak)" + +[keyboard-gb-dvorakukp] +Description="键盘 - 英语(英国) - 英语(英国,Dvorak,带英国标点)" +Language=en +Label="gb (dvorakukp)" + +[keyboard-gb-mac] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh)" +Language=en +Label="gb (mac)" + +[keyboard-gb-mac_intl] +Description="键盘 - 英语(英国) - 英语(英国,Macintosh,国际)" +Language=en +Label="gb (mac_intl)" + +[keyboard-gb-colemak] +Description="键盘 - 英语(英国) - 英语(英国,Colemak)" +Language=en +Label="gb (colemak)" + +[keyboard-gb-colemak_dh] +Description="键盘 - 英语(英国) - 英语(英国,Colemak-DH)" +Language=en +Label="gb (colemak_dh)" + +[keyboard-gb-gla] +Description="键盘 - 英语(英国) - 苏格兰盖尔语" +Language=en +Label="gd (gla)" + +[keyboard-gb-pl] +Description="键盘 - 英语(英国) - 波兰语(英式键盘)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="键盘 - 英语(英国) - 英语(英国,Sun Type 6/7)" +Language=en +Label="gb (sun_type6)" + +[keyboard-ke] +Description="键盘 - 斯瓦希里语(肯尼亚)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="键盘 - 斯瓦希里语(肯尼亚) - 基库尤语" +Language=ki +Label="ki (kik)" + +[keyboard-md] +Description="键盘 - 摩尔多瓦语" +Language=ro +Label=ro + +[keyboard-md-gag] +Description="键盘 - 摩尔多瓦语 - 加告兹语(摩尔多瓦)" +Language=gag +Label=gag + +[keyboard-us] +Description="键盘 - 英语(美国)" +Language=en +Label=en + +[keyboard-us-euro] +Description="键盘 - 英语(美国) - 英语(美国,5 键上是欧元符号)" +Language=en +Label="us (euro)" + +[keyboard-us-intl] +Description="键盘 - 英语(美国) - 英语(美国,国际,带死键)" +Language=en +Label="us (intl)" + +[keyboard-us-alt-intl] +Description="键盘 - 英语(美国) - 英语(美国,替代,国际)" +Language=en +Label="us (alt-intl)" + +[keyboard-us-altgr-intl] +Description="键盘 - 英语(美国) - 英语(国际,带 AltGr 死键)" +Language=en +Label="us (altgr-intl)" + +[keyboard-us-mac] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ANSI)" +Language=en +Label="us (mac)" + +[keyboard-us-mac-iso] +Description="键盘 - 英语(美国) - 英语(Macintosh,ABC,ISO)" +Language=en +Label="us (mac-iso)" + +[keyboard-us-colemak] +Description="键盘 - 英语(美国) - 英语(Colemak)" +Language=en +Label="us (colemak)" + +[keyboard-us-colemak_dh] +Description="键盘 - 英语(美国) - 英语(Colemak-DH)" +Language=en +Label="us (colemak_dh)" + +[keyboard-us-colemak_dh_wide] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版)" +Language=en +Label="us (colemak_dh_wide)" + +[keyboard-us-colemak_dh_ortho] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 正交)" +Language=en +Label="us (colemak_dh_ortho)" + +[keyboard-us-colemak_dh_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH ISO)" +Language=en +Label="us (colemak_dh_iso)" + +[keyboard-us-colemak_dh_wide_iso] +Description="键盘 - 英语(美国) - 英语(Colemak-DH 宽版 ISO)" +Language=en +Label="us (colemak_dh_wide_iso)" + +[keyboard-us-dvorak] +Description="键盘 - 英语(美国) - 英语(Dvorak)" +Language=en +Label="us (dvorak)" + +[keyboard-us-dvorak-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,国际,带死键)" +Language=en +Label="us (dvorak-intl)" + +[keyboard-us-dvorak-alt-intl] +Description="键盘 - 英语(美国) - 英语(Dvorak,替代,国际)" +Language=en +Label="us (dvorak-alt-intl)" + +[keyboard-us-dvorak-l] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,左手)" +Language=en +Label="us (dvorak-l)" + +[keyboard-us-dvorak-r] +Description="键盘 - 英语(美国) - 英语(Dvorak,单手,右手)" +Language=en +Label="us (dvorak-r)" + +[keyboard-us-dvorak-classic] +Description="键盘 - 英语(美国) - 英语(经典 Dvorak)" +Language=en +Label="us (dvorak-classic)" + +[keyboard-us-dvp] +Description="键盘 - 英语(美国) - 英语(适合程序员的 Dvorak)" +Language=en +Label="us (dvp)" + +[keyboard-us-dvorak-mac] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ANSI)" +Language=en +Label="us (dvorak-mac)" + +[keyboard-us-dvorak-mac-iso] +Description="键盘 - 英语(美国) - 英语(Dvorak,Macintosh,ISO)" +Language=en +Label="us (dvorak-mac-iso)" + +[keyboard-us-norman] +Description="键盘 - 英语(美国) - 英语(Norman)" +Language=en +Label="us (norman)" + +[keyboard-us-symbolic] +Description="键盘 - 英语(美国) - 英语(美国,符号)" +Language=en +Label="us (symbolic)" + +[keyboard-us-workman] +Description="键盘 - 英语(美国) - 英语(Workman)" +Language=en +Label="us (workman)" + +[keyboard-us-workman-intl] +Description="键盘 - 英语(美国) - 英语(Workman,国际,带死键)" +Language=en +Label="us (workman-intl)" + +[keyboard-us-olpc2] +Description="键盘 - 英语(美国) - 英语(除/乘键切换布局)" +Language=en +Label="us (olpc2)" + +[keyboard-us-chr] +Description="键盘 - 英语(美国) - 切罗基语" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="键盘 - 英语(美国) - 夏威夷语" +Language=haw +Label=haw + +[keyboard-us-rus] +Description="键盘 - 英语(美国) - 俄语(美国,语音助记)" +Language=ru +Label="ru (rus)" + +[keyboard-us-hbs] +Description="键盘 - 英语(美国) - 塞尔维亚-克罗地亚语(美国)" +Language=en +Label="us (hbs)" + +[keyboard-us-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符)" +Language=en +Label="us (intl-unicode)" + +[keyboard-us-alt-intl-unicode] +Description="键盘 - 英语(美国) - 英语(美国,国际,AltGr Unicode 组合字符,替代)" +Language=en +Label="us (alt-intl-unicode)" + +[keyboard-us-ats] +Description="键盘 - 英语(美国) - 阿特塞纳语" +Language=en +Label="us (ats)" + +[keyboard-us-crd] +Description="键盘 - 英语(美国) - 科达莲萨利希语" +Language=crd +Label="us (crd)" + +[keyboard-us-cz_sk_de] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语和德语(美国)" +Language=en +Label="us (cz_sk_de)" + +[keyboard-us-cz_sk_pl_de_es_fi_sv] +Description="键盘 - 英语(美国) - 捷克语、斯洛伐克语、波兰语、西班牙语、芬兰语、瑞典语和德语(美国)" +Language=en +Label="us (cz_sk_pl_de_es_fi_sv)" + +[keyboard-us-drix] +Description="键盘 - 英语(美国) - 英语(Drix)" +Language=en +Label="us (drix)" + +[keyboard-us-de_se_fi] +Description="键盘 - 英语(美国) - 德语,瑞典语和芬兰语(美国)" +Language=en +Label="us (de_se_fi)" + +[keyboard-us-ibm238l] +Description="键盘 - 英语(美国) - 英语(美国,IBM Arabic 238_L)" +Language=en +Label="us (ibm238l)" + +[keyboard-us-sun_type6] +Description="键盘 - 英语(美国) - 英语(美国,Sun Type 6/7)" +Language=en +Label="us (sun_type6)" + +[keyboard-us-carpalx] +Description="键盘 - 英语(美国) - 英语(Carpalx)" +Language=en +Label="us (carpalx)" + +[keyboard-us-carpalx-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带死键)" +Language=en +Label="us (carpalx-intl)" + +[keyboard-us-carpalx-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-altgr-intl)" + +[keyboard-us-carpalx-full] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化)" +Language=en +Label="us (carpalx-full)" + +[keyboard-us-carpalx-full-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带死键)" +Language=en +Label="us (carpalx-full-intl)" + +[keyboard-us-carpalx-full-altgr-intl] +Description="键盘 - 英语(美国) - 英语(Carpalx,完全优化,国际,带 AltGr 死键)" +Language=en +Label="us (carpalx-full-altgr-intl)" + +[keyboard-us-3l] +Description="键盘 - 英语(美国) - 英语(3l)" +Language=en +Label="us (3l)" + +[keyboard-us-3l-cros] +Description="键盘 - 英语(美国) - 英语(3l,Chromebook)" +Language=en +Label="us (3l-cros)" + +[keyboard-us-3l-emacs] +Description="键盘 - 英语(美国) - 英语(3l,emacs)" +Language=en +Label="us (3l-emacs)" + +[keyboard-us-workman-p] +Description="键盘 - 英语(美国) - 英语(Workman-P)" +Language=en +Label=workman-p + +[keyboard-us-scn] +Description="键盘 - 英语(美国) - 西西里语(美式键盘)" +Language=en +Label="us (scn)" + +[keyboard-us-altgr-weur] +Description="键盘 - 英语(美国) - 英语(西欧 AltGr 死键)" +Language=en +Label="us (altgr-weur)" + +[keyboard-ge] +Description="键盘 - 格鲁吉亚语" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(人体工学)" +Language=ka +Label="ge (ergonomic)" + +[keyboard-ge-mess] +Description="键盘 - 格鲁吉亚语 - 格鲁吉亚语(MESS)" +Language=ka +Label="ge (mess)" + +[keyboard-ge-os] +Description="键盘 - 格鲁吉亚语 - 奥塞梯语(格鲁吉亚)" +Language=os +Label="ge (os)" + +[keyboard-ge-ru] +Description="键盘 - 格鲁吉亚语 - 俄语(格鲁吉亚)" +Language=ru +Label=ru + +[keyboard-es] +Description="键盘 - 西班牙语" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="键盘 - 西班牙语 - 西班牙语(无死键)" +Language=es +Label="es (nodeadkeys)" + +[keyboard-es-deadtilde] +Description="键盘 - 西班牙语 - 西班牙语(波浪号为死键)" +Language=es +Label="es (deadtilde)" + +[keyboard-es-winkeys] +Description="键盘 - 西班牙语 - 西班牙语(Windows)" +Language=es +Label="es (winkeys)" + +[keyboard-es-dvorak] +Description="键盘 - 西班牙语 - 西班牙语(Dvorak)" +Language=es +Label="es (dvorak)" + +[keyboard-es-ast] +Description="键盘 - 西班牙语 - 阿斯图里亚斯语(西班牙,带底部加点的 H 和 L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="键盘 - 西班牙语 - 加泰罗尼亚语(西班牙,带中间加点的 L)" +Language=ca +Label="ca (cat)" + +[keyboard-es-sun_type6] +Description="键盘 - 西班牙语 - 西班牙语(Sun Type 6/7)" +Language=es +Label="es (sun_type6)" + +[keyboard-ee] +Description="键盘 - 爱沙尼亚语" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(无死键)" +Language=et +Label="ee (nodeadkeys)" + +[keyboard-ee-dvorak] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Dvorak)" +Language=et +Label="ee (dvorak)" + +[keyboard-ee-us] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(美国)" +Language=et +Label="ee (us)" + +[keyboard-ee-sun_type6] +Description="键盘 - 爱沙尼亚语 - 爱沙尼亚语(Sun Type 6/7)" +Language=et +Label="ee (sun_type6)" + +[keyboard-bd] +Description="键盘 - 孟加拉语" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="键盘 - 孟加拉语 - 孟加拉语(Probhat)" +Language=bn +Label="bd (probhat)" + +[keyboard-ph] +Description="键盘 - 菲律宾语" +Language=en +Label=ph + +[keyboard-ph-qwerty-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(QWERTY,Baybayin)" +Language=bik +Label="ph (qwerty-bay)" + +[keyboard-ph-capewell-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,拉丁)" +Language=en +Label="ph (capewell-dvorak)" + +[keyboard-ph-capewell-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-Dvorak,Baybayin)" +Language=bik +Label="ph (capewell-dvorak-bay)" + +[keyboard-ph-capewell-qwerf2k6] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,拉丁)" +Language=en +Label="ph (capewell-qwerf2k6)" + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Capewell-QWERF 2006,Baybayin)" +Language=bik +Label="ph (capewell-qwerf2k6-bay)" + +[keyboard-ph-colemak] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,拉丁)" +Language=en +Label="ph (colemak)" + +[keyboard-ph-colemak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Colemak,Baybayin)" +Language=bik +Label="ph (colemak-bay)" + +[keyboard-ph-dvorak] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,拉丁)" +Language=en +Label="ph (dvorak)" + +[keyboard-ph-dvorak-bay] +Description="键盘 - 菲律宾语 - 菲律宾语(Dvorak,Baybayin)" +Language=bik +Label="ph (dvorak-bay)" + +[keyboard-uz] +Description="键盘 - 乌兹别克语" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="键盘 - 乌兹别克语 - 乌兹别克语(拉丁)" +Language=uz +Label="uz (latin)" + +[keyboard-lt] +Description="键盘 - 立陶宛语" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="键盘 - 立陶宛语 - 立陶宛语(标准)" +Language=lt +Label="lt (std)" + +[keyboard-lt-us] +Description="键盘 - 立陶宛语 - 立陶宛语(美国)" +Language=lt +Label="lt (us)" + +[keyboard-lt-ibm] +Description="键盘 - 立陶宛语 - 立陶宛语(IBM)" +Language=lt +Label="lt (ibm)" + +[keyboard-lt-lekp] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKP)" +Language=lt +Label="lt (lekp)" + +[keyboard-lt-lekpa] +Description="键盘 - 立陶宛语 - 立陶宛语(LEKPa)" +Language=lt +Label="lt (lekpa)" + +[keyboard-lt-ratise] +Description="键盘 - 立陶宛语 - 立陶宛语(Ratise)" +Language=lt +Label="lt (ratise)" + +[keyboard-lt-sgs] +Description="键盘 - 立陶宛语 - 萨莫吉提亚语" +Language=sgs +Label="lt (sgs)" + +[keyboard-lt-us_dvorak] +Description="键盘 - 立陶宛语 - 立陶宛语(Dvorak)" +Language=lt +Label="lt (us_dvorak)" + +[keyboard-lt-sun_type6] +Description="键盘 - 立陶宛语 - 立陶宛语(Sun Type 6/7)" +Language=lt +Label="lt (sun_type6)" + +[keyboard-fi] +Description="键盘 - 芬兰语" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="键盘 - 芬兰语 - 芬兰语(Windows)" +Language=fi +Label="fi (winkeys)" + +[keyboard-fi-classic] +Description="键盘 - 芬兰语 - 芬兰语(经典)" +Language=fi +Label="fi (classic)" + +[keyboard-fi-nodeadkeys] +Description="键盘 - 芬兰语 - 芬兰语(经典,无死键)" +Language=fi +Label="fi (nodeadkeys)" + +[keyboard-fi-mac] +Description="键盘 - 芬兰语 - 芬兰语(Macintosh)" +Language=fi +Label="fi (mac)" + +[keyboard-fi-smi] +Description="键盘 - 芬兰语 - 北萨米语(芬兰)" +Language=se +Label="fi (smi)" + +[keyboard-fi-sun_type6] +Description="键盘 - 芬兰语 - 芬兰语(Sun Type 6/7)" +Language=fi +Label="fi (sun_type6)" + +[keyboard-fi-das] +Description="键盘 - 芬兰语 - 芬兰语(DAS)" +Language=fi +Label="fi (das)" + +[keyboard-fi-fidvorak] +Description="键盘 - 芬兰语 - 芬兰语(Dvorak)" +Language=fi +Label="fi (fidvorak)" + +[keyboard-cn] +Description="键盘 - 汉语" +Language=zh +Label=zh + +[keyboard-cn-altgr-pinyin] +Description="键盘 - 汉语 - 汉语拼音字母(带 AltGr 死键)" +Language=zh +Label="cn (altgr-pinyin)" + +[keyboard-cn-mon_trad] +Description="键盘 - 汉语 - 蒙古语(Bichig)" +Language=mvf +Label="cn (mon_trad)" + +[keyboard-cn-mon_trad_todo] +Description="键盘 - 汉语 - 蒙古语(Todo)" +Language=mvf +Label="cn (mon_trad_todo)" + +[keyboard-cn-mon_trad_xibe] +Description="键盘 - 汉语 - 蒙古语(Xibe)" +Language=sjo +Label="cn (mon_trad_xibe)" + +[keyboard-cn-mon_trad_manchu] +Description="键盘 - 汉语 - 蒙古语(Manchu)" +Language=mnc +Label="cn (mon_trad_manchu)" + +[keyboard-cn-mon_trad_galik] +Description="键盘 - 汉语 - 蒙古语(Galik)" +Language=mvf +Label="cn (mon_trad_galik)" + +[keyboard-cn-mon_todo_galik] +Description="键盘 - 汉语 - 蒙古语(Todo Galik)" +Language=mvf +Label="cn (mon_todo_galik)" + +[keyboard-cn-mon_manchu_galik] +Description="键盘 - 汉语 - 蒙古语(Manchu Galik)" +Language=mnc +Label="cn (mon_manchu_galik)" + +[keyboard-cn-tib] +Description="键盘 - 汉语 - 藏语" +Language=bo +Label="cn (tib)" + +[keyboard-cn-tib_asciinum] +Description="键盘 - 汉语 - 藏语(带 ASCII 数字)" +Language=bo +Label="cn (tib_asciinum)" + +[keyboard-cn-ug] +Description="键盘 - 汉语 - 维吾尔语" +Language=ug +Label=ug + +[keyboard-ca] +Description="键盘 - 法语(加拿大)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="键盘 - 法语(加拿大) - 法语(加拿大,Dvorak)" +Language=fr +Label="fr (fr-dvorak)" + +[keyboard-ca-fr-legacy] +Description="键盘 - 法语(加拿大) - 法语(加拿大,传统)" +Language=fr +Label="fr (fr-legacy)" + +[keyboard-ca-multix] +Description="键盘 - 法语(加拿大) - 加拿大(CSA)" +Language=fr +Label="ca (multix)" + +[keyboard-ca-eng] +Description="键盘 - 法语(加拿大) - 英语(加拿大)" +Language=en +Label="en (eng)" + +[keyboard-ca-ike] +Description="键盘 - 法语(加拿大) - 因纽特语" +Language=iu +Label=ike + +[keyboard-ca-kut] +Description="键盘 - 法语(加拿大) - Kutenai 语" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="键盘 - 法语(加拿大) - 苏斯瓦语" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="键盘 - 法语(加拿大) - 多语言(加拿大,Sun Type 6/7)" +Language=fr +Label="ca (sun_type6)" + +[keyboard-gh] +Description="键盘 - 英语(加纳)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="键盘 - 英语(加纳) - 英语(加纳,多语言)" +Language=en +Label="gh (generic)" + +[keyboard-gh-gillbt] +Description="键盘 - 英语(加纳) - 英语(加纳,GILLBT)" +Language=en +Label="gh (gillbt)" + +[keyboard-gh-akan] +Description="键盘 - 英语(加纳) - 阿肯语" +Language=ak +Label="ak (akan)" + +[keyboard-gh-avn] +Description="键盘 - 英语(加纳) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-ewe] +Description="键盘 - 英语(加纳) - 埃维语" +Language=ee +Label="ee (ewe)" + +[keyboard-gh-fula] +Description="键盘 - 英语(加纳) - 富拉语" +Language=ff +Label="ff (fula)" + +[keyboard-gh-ga] +Description="键盘 - 英语(加纳) - Ga 语" +Language=gaa +Label="gaa (ga)" + +[keyboard-gh-hausa] +Description="键盘 - 英语(加纳) - 豪萨语(加纳)" +Language=ha +Label="ha (hausa)" + +[keyboard-fr] +Description="键盘 - 法语" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="键盘 - 法语 - 法语(无死键)" +Language=fr +Label="fr (nodeadkeys)" + +[keyboard-fr-oss] +Description="键盘 - 法语 - 法语(替代)" +Language=fr +Label="fr (oss)" + +[keyboard-fr-oss_nodeadkeys] +Description="键盘 - 法语 - 法语(替代,无死键)" +Language=fr +Label="fr (oss_nodeadkeys)" + +[keyboard-fr-oss_latin9] +Description="键盘 - 法语 - 法语(替代,只包含拉丁-9 字符)" +Language=fr +Label="fr (oss_latin9)" + +[keyboard-fr-latin9] +Description="键盘 - 法语 - 法语(传统,替代)" +Language=fr +Label="fr (latin9)" + +[keyboard-fr-latin9_nodeadkeys] +Description="键盘 - 法语 - 法语(传统,替代,无死键)" +Language=fr +Label="fr (latin9_nodeadkeys)" + +[keyboard-fr-azerty] +Description="键盘 - 法语 - 法语(AZERTY)" +Language=fr +Label="fr (azerty)" + +[keyboard-fr-afnor] +Description="键盘 - 法语 - 法语(AZERTY,AFNOR)" +Language=fr +Label="fr (afnor)" + +[keyboard-fr-bepo] +Description="键盘 - 法语 - 法语(BEPO)" +Language=fr +Label="fr (bepo)" + +[keyboard-fr-bepo_latin9] +Description="键盘 - 法语 - 法语(BEPO,只包含拉丁-9 字符)" +Language=fr +Label="fr (bepo_latin9)" + +[keyboard-fr-bepo_afnor] +Description="键盘 - 法语 - 法语(BEPO,AFNOR)" +Language=fr +Label="fr (bepo_afnor)" + +[keyboard-fr-dvorak] +Description="键盘 - 法语 - 法语(Dvorak)" +Language=fr +Label="fr (dvorak)" + +[keyboard-fr-ergol] +Description="键盘 - 法语 - 法语(Ergo-L)" +Language=fr +Label="fr (ergol)" + +[keyboard-fr-ergol_iso] +Description="键盘 - 法语 - 法语(Ergo-L,ISO 变种)" +Language=fr +Label="fr (ergol_iso)" + +[keyboard-fr-mac] +Description="键盘 - 法语 - 法语(Macintosh)" +Language=fr +Label="fr (mac)" + +[keyboard-fr-us] +Description="键盘 - 法语 - 法语(美国)" +Language=fr +Label="fr (us)" + +[keyboard-fr-bre] +Description="键盘 - 法语 - 布列塔尼语(法国)" +Language=br +Label="fr (bre)" + +[keyboard-fr-oci] +Description="键盘 - 法语 - 奥克语" +Language=oc +Label="fr (oci)" + +[keyboard-fr-geo] +Description="键盘 - 法语 - 格鲁吉亚语(法国,AZERTY Tskapo)" +Language=ka +Label="fr (geo)" + +[keyboard-fr-sun_type6] +Description="键盘 - 法语 - 法语(Sun Type 6/7)" +Language=fr +Label="fr (sun_type6)" + +[keyboard-fr-us-alt] +Description="键盘 - 法语 - 法语(美国,带死键,替代)" +Language=fr +Label="fr (us-alt)" + +[keyboard-fr-us-azerty] +Description="键盘 - 法语 - 法语(美国,AZERTY)" +Language=fr +Label="fr (us-azerty)" + +[keyboard-eg] +Description="键盘 - 阿拉伯语(埃及)" +Language=ar +Label=ar + +[keyboard-eg-cop] +Description="键盘 - 阿拉伯语(埃及) - 科普特语" +Language=cop +Label=cop + +[keyboard-cd] +Description="键盘 - 法语(刚果民主共和国)" +Language=fr +Label=fr + +[keyboard-tg] +Description="键盘 - 法语(多哥)" +Language=fr +Label=fr + +[keyboard-kz] +Description="键盘 - 哈萨克语" +Language=kk +Label=kk + +[keyboard-kz-kazrus] +Description="键盘 - 哈萨克语 - 哈萨克语(带俄语)" +Language=kk +Label="kz (kazrus)" + +[keyboard-kz-ext] +Description="键盘 - 哈萨克语 - 哈萨克语(扩展)" +Language=kk +Label="kz (ext)" + +[keyboard-kz-latin] +Description="键盘 - 哈萨克语 - 哈萨克语(拉丁)" +Language=kk +Label="kz (latin)" + +[keyboard-kz-ruskaz] +Description="键盘 - 哈萨克语 - 俄语(哈萨克斯坦,带哈萨克语)" +Language=kk +Label="ru (ruskaz)" + +[keyboard-ch] +Description="键盘 - 德语(瑞士)" +Language=de +Label=de + +[keyboard-ch-de_nodeadkeys] +Description="键盘 - 德语(瑞士) - 德语(瑞士,无死键)" +Language=de +Label="de (de_nodeadkeys)" + +[keyboard-ch-de_mac] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Macintosh)" +Language=de +Label="de (de_mac)" + +[keyboard-ch-legacy] +Description="键盘 - 德语(瑞士) - 德语(瑞士,传统)" +Language=de +Label="ch (legacy)" + +[keyboard-ch-fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="键盘 - 德语(瑞士) - 法语(瑞士,无死键)" +Language=fr +Label="fr (fr_nodeadkeys)" + +[keyboard-ch-fr_mac] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Macintosh)" +Language=fr +Label="fr (fr_mac)" + +[keyboard-ch-sun_type6_de] +Description="键盘 - 德语(瑞士) - 德语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_de)" + +[keyboard-ch-sun_type6_fr] +Description="键盘 - 德语(瑞士) - 法语(瑞士,Sun Type 6/7)" +Language=de +Label="ch (sun_type6_fr)" + +[keyboard-gr] +Description="键盘 - 希腊语" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="键盘 - 希腊语 - 希腊语(简易)" +Language=el +Label="gr (simple)" + +[keyboard-gr-nodeadkeys] +Description="键盘 - 希腊语 - 希腊语(无死键)" +Language=el +Label="gr (nodeadkeys)" + +[keyboard-gr-polytonic] +Description="键盘 - 希腊语 - 希腊语(变音符号)" +Language=el +Label="gr (polytonic)" + +[keyboard-gr-sun_type6] +Description="键盘 - 希腊语 - 希腊语(Sun Type 6/7)" +Language=el +Label="gr (sun_type6)" + +[keyboard-gr-colemak] +Description="键盘 - 希腊语 - 希腊语(Colemak)" +Language=el +Label="gr (colemak)" + +[keyboard-tr] +Description="键盘 - 土耳其语" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="键盘 - 土耳其语 - 土耳其语(F)" +Language=tr +Label="tr (f)" + +[keyboard-tr-e] +Description="键盘 - 土耳其语 - 土耳其语(E)" +Language=tr +Label="tr (e)" + +[keyboard-tr-alt] +Description="键盘 - 土耳其语 - 土耳其语(Alt-Q)" +Language=tr +Label="tr (alt)" + +[keyboard-tr-intl] +Description="键盘 - 土耳其语 - 土耳其语(国际,带死键)" +Language=tr +Label="tr (intl)" + +[keyboard-tr-ku] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,F)" +Language=ku +Label="ku (ku_f)" + +[keyboard-tr-ku_alt] +Description="键盘 - 土耳其语 - 库尔德语(土耳其,拉丁 Alt-Q)" +Language=ku +Label="ku (ku_alt)" + +[keyboard-tr-sun_type6] +Description="键盘 - 土耳其语 - 土耳其语(Sun Type 6/7)" +Language=tr +Label="tr (sun_type6)" + +[keyboard-tr-us] +Description="键盘 - 土耳其语 - 土耳其语(交换 i 和 ı)" +Language=tr +Label="tr (us)" + +[keyboard-tr-otk] +Description="键盘 - 土耳其语 - 古代突厥语" +Language=tr +Label="tr (otk)" + +[keyboard-tr-otkf] +Description="键盘 - 土耳其语 - 古代突厥语(F)" +Language=tr +Label="tr (otkf)" + +[keyboard-tr-ot] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(Q)" +Language=tr +Label="tr (ot)" + +[keyboard-tr-otf] +Description="键盘 - 土耳其语 - 奥斯曼土耳其语(F)" +Language=tr +Label="tr (otf)" + +[keyboard-il] +Description="键盘 - 希伯来语" +Language=he +Label=he + +[keyboard-il-si2] +Description="键盘 - 希伯来语 - 希伯来语(SI-1452-2)" +Language=he +Label="il (si2)" + +[keyboard-il-lyx] +Description="键盘 - 希伯来语 - 希伯来语(lyx)" +Language=he +Label="il (lyx)" + +[keyboard-il-phonetic] +Description="键盘 - 希伯来语 - 希伯来语(语音助记)" +Language=he +Label="il (phonetic)" + +[keyboard-il-biblical] +Description="键盘 - 希伯来语 - 希伯来语(圣经,Tiro)" +Language=he +Label="il (biblical)" + +[keyboard-il-biblicalSIL] +Description="键盘 - 希伯来语 - 希伯来语(Biblical,SIL 语音助记)" +Language=he +Label="il (biblicalSIL)" + +[keyboard-de] +Description="键盘 - 德语" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="键盘 - 德语 - 德语(尖音符号为死键)" +Language=de +Label="de (deadacute)" + +[keyboard-de-deadgraveacute] +Description="键盘 - 德语 - 德语(重音符号和尖音符号为死键)" +Language=de +Label="de (deadgraveacute)" + +[keyboard-de-deadtilde] +Description="键盘 - 德语 - 德语(波浪号为死键)" +Language=de +Label="de (deadtilde)" + +[keyboard-de-nodeadkeys] +Description="键盘 - 德语 - 德语(无死键)" +Language=de +Label="de (nodeadkeys)" + +[keyboard-de-e1] +Description="键盘 - 德语 - 德语(E1)" +Language=de +Label="de (e1)" + +[keyboard-de-e2] +Description="键盘 - 德语 - 德语(E2)" +Language=de +Label="de (e2)" + +[keyboard-de-T3] +Description="键盘 - 德语 - 德语(T3)" +Language=de +Label="de (T3)" + +[keyboard-de-us] +Description="键盘 - 德语 - 德语(美国)" +Language=de +Label="de (us)" + +[keyboard-de-dvorak] +Description="键盘 - 德语 - 德语(Dvorak)" +Language=de +Label="de (dvorak)" + +[keyboard-de-mac] +Description="键盘 - 德语 - 德语(Macintosh)" +Language=de +Label="de (mac)" + +[keyboard-de-mac_nodeadkeys] +Description="键盘 - 德语 - 德语(Macintosh,无死键)" +Language=de +Label="de (mac_nodeadkeys)" + +[keyboard-de-neo] +Description="键盘 - 德语 - 德语(Neo 2)" +Language=de +Label="de (neo)" + +[keyboard-de-qwerty] +Description="键盘 - 德语 - 德语(QWERTY)" +Language=de +Label="de (qwerty)" + +[keyboard-de-dsb] +Description="键盘 - 德语 - 下索布语" +Language=dsb +Label="de (dsb)" + +[keyboard-de-dsb_qwertz] +Description="键盘 - 德语 - 下索布语(QWERTZ)" +Language=dsb +Label="de (dsb_qwertz)" + +[keyboard-de-ro] +Description="键盘 - 德语 - 罗马尼亚语(德国)" +Language=ro +Label="de (ro)" + +[keyboard-de-ro_nodeadkeys] +Description="键盘 - 德语 - 罗马尼亚语(德国,无死键)" +Language=ro +Label="de (ro_nodeadkeys)" + +[keyboard-de-ru] +Description="键盘 - 德语 - 俄语(德国,语音助记)" +Language=ru +Label=ru + +[keyboard-de-tr] +Description="键盘 - 德语 - 土耳其语(德国)" +Language=tr +Label="de (tr)" + +[keyboard-de-hu] +Description="键盘 - 德语 - 德语(带匈牙利字母,无死键)" +Language=de +Label="de (hu)" + +[keyboard-de-pl] +Description="键盘 - 德语 - 波兰语(德国,无死键)" +Language=de +Label="de (pl)" + +[keyboard-de-sun_type6] +Description="键盘 - 德语 - 德语(Sun Type 6/7)" +Language=de +Label="de (sun_type6)" + +[keyboard-de-adnw] +Description="键盘 - 德语 - 德语(Aus der Neo-Welt)" +Language=de +Label="de (adnw)" + +[keyboard-de-koy] +Description="键盘 - 德语 - 德语(KOY)" +Language=de +Label="de (koy)" + +[keyboard-de-bone] +Description="键盘 - 德语 - 德语(Bone)" +Language=de +Label="de (bone)" + +[keyboard-de-bone_eszett_home] +Description="键盘 - 德语 - 德语(Bone,eszett 在中间行)" +Language=de +Label="de (bone_eszett_home)" + +[keyboard-de-neo_qwertz] +Description="键盘 - 德语 - 德语(Neo,QWERTZ)" +Language=de +Label="de (neo_qwertz)" + +[keyboard-de-neo_qwerty] +Description="键盘 - 德语 - 德语(Neo,QWERTY)" +Language=de +Label="de (neo_qwerty)" + +[keyboard-de-noted] +Description="键盘 - 德语 - 德语(Noted)" +Language=de +Label="de (noted)" + +[keyboard-de-ru-recom] +Description="键盘 - 德语 - 俄语(德国,推荐)" +Language=ru +Label="ru (ru-recom)" + +[keyboard-de-ru-translit] +Description="键盘 - 德语 - 俄语(德国,转写)" +Language=ru +Label="ru (ru-translit)" + +[keyboard-id] +Description="键盘 - 印尼语(拉丁)" +Language=id +Label=id + +[keyboard-id-melayu-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,语音助记)" +Language=id +Label="id (melayu-phonetic)" + +[keyboard-id-melayu-phoneticx] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Melayu,扩展语音助记)" +Language=id +Label="id (melayu-phoneticx)" + +[keyboard-id-pegon-phonetic] +Description="键盘 - 印尼语(拉丁) - 印尼语(Arab Pegon,语音助记)" +Language=id +Label="id (pegon-phonetic)" + +[keyboard-id-javanese] +Description="键盘 - 印尼语(拉丁) - 爪哇语" +Language=id +Label="id (javanese)" + +[keyboard-sn] +Description="键盘 - 沃洛夫语" +Language=wo +Label=wo + +[keyboard-az] +Description="键盘 - 阿塞拜疆语" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="键盘 - 阿塞拜疆语 - 阿塞拜疆语(西里尔)" +Language=az +Label="az (cyrillic)" + +[keyboard-kh] +Description="键盘 - 高棉语(柬埔寨)" +Language=km +Label=km + +[keyboard-hu] +Description="键盘 - 匈牙利语" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="键盘 - 匈牙利语 - 匈牙利语(标准)" +Language=hu +Label="hu (standard)" + +[keyboard-hu-nodeadkeys] +Description="键盘 - 匈牙利语 - 匈牙利语(无死键)" +Language=hu +Label="hu (nodeadkeys)" + +[keyboard-hu-qwerty] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY)" +Language=hu +Label="hu (qwerty)" + +[keyboard-hu-101_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwertz_comma_dead)" + +[keyboard-hu-101_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwertz_comma_nodead)" + +[keyboard-hu-101_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,死键)" +Language=hu +Label="hu (101_qwertz_dot_dead)" + +[keyboard-hu-101_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,101 键,点,无死键)" +Language=hu +Label="hu (101_qwertz_dot_nodead)" + +[keyboard-hu-101_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,死键)" +Language=hu +Label="hu (101_qwerty_comma_dead)" + +[keyboard-hu-101_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,逗号,无死键)" +Language=hu +Label="hu (101_qwerty_comma_nodead)" + +[keyboard-hu-101_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,死键)" +Language=hu +Label="hu (101_qwerty_dot_dead)" + +[keyboard-hu-101_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,101 键,点,无死键)" +Language=hu +Label="hu (101_qwerty_dot_nodead)" + +[keyboard-hu-102_qwertz_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwertz_comma_dead)" + +[keyboard-hu-102_qwertz_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwertz_comma_nodead)" + +[keyboard-hu-102_qwertz_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,死键)" +Language=hu +Label="hu (102_qwertz_dot_dead)" + +[keyboard-hu-102_qwertz_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTZ,102 键,点,无死键)" +Language=hu +Label="hu (102_qwertz_dot_nodead)" + +[keyboard-hu-102_qwerty_comma_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,死键)" +Language=hu +Label="hu (102_qwerty_comma_dead)" + +[keyboard-hu-102_qwerty_comma_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,逗号,无死键)" +Language=hu +Label="hu (102_qwerty_comma_nodead)" + +[keyboard-hu-102_qwerty_dot_dead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,死键)" +Language=hu +Label="hu (102_qwerty_dot_dead)" + +[keyboard-hu-102_qwerty_dot_nodead] +Description="键盘 - 匈牙利语 - 匈牙利语(QWERTY,102 键,点,无死键)" +Language=hu +Label="hu (102_qwerty_dot_nodead)" + +[keyboard-hu-oldhunlig] +Description="键盘 - 匈牙利语 - 古匈牙利语(含连字)" +Language=hu +Label="oldhun(lig) (oldhunlig)" + +[keyboard-hu-oldhun_sk_sh] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sh)" +Language=hu +Label="oldhun(SK,Sh) (oldhun_sk_sh)" + +[keyboard-hu-oldhun_sk_sz] +Description="键盘 - 匈牙利语 - 古匈牙利语(喀尔巴阡高地,S 作为 Sz)" +Language=hu +Label="oldhun(SK,Sz) (oldhun_sk_sz)" + +[keyboard-hu-us] +Description="键盘 - 匈牙利语 - 匈牙利语(美国)" +Language=hu +Label=us + +[keyboard-ng] +Description="键盘 - 英语(尼日利亚)" +Language=en +Label=en + +[keyboard-ng-hausa] +Description="键盘 - 英语(尼日利亚) - 豪萨语(尼日利亚)" +Language=ha +Label="ha (hausa)" + +[keyboard-ng-igbo] +Description="键盘 - 英语(尼日利亚) - 伊博语" +Language=ig +Label="ig (igbo)" + +[keyboard-ng-yoruba] +Description="键盘 - 英语(尼日利亚) - 约鲁巴语" +Language=yo +Label="yo (yoruba)" + +[keyboard-is] +Description="键盘 - 冰岛语" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh,传统)" +Language=is +Label="is (mac_legacy)" + +[keyboard-is-mac] +Description="键盘 - 冰岛语 - 冰岛语(Macintosh)" +Language=is +Label="is (mac)" + +[keyboard-is-dvorak] +Description="键盘 - 冰岛语 - 冰岛语(Dvorak)" +Language=is +Label="is (dvorak)" + +[keyboard-in] +Description="键盘 - 印度语言" +Language=hi +Label=in + +[keyboard-in-asm-kagapa] +Description="键盘 - 印度语言 - 阿萨姆语(KaGaPa,语音助记)" +Language=as +Label="as (asm-kagapa)" + +[keyboard-in-ben] +Description="键盘 - 印度语言 - 孟加拉语(印度)" +Language=bn +Label="bn (ben)" + +[keyboard-in-ben_probhat] +Description="键盘 - 印度语言 - 孟加拉语(印度,Probhat)" +Language=bn +Label="bn (ben_probhat)" + +[keyboard-in-ben_baishakhi] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi)" +Language=bn +Label="in (ben_baishakhi)" + +[keyboard-in-ben_bornona] +Description="键盘 - 印度语言 - 孟加拉语(印度,Bornona)" +Language=bn +Label="in (ben_bornona)" + +[keyboard-in-ben-kagapa] +Description="键盘 - 印度语言 - 孟加拉语(印度,KaGaPa,语音助记)" +Language=bn +Label="in (ben-kagapa)" + +[keyboard-in-ben_gitanjali] +Description="键盘 - 印度语言 - 孟加拉语(印度,Gitanjali)" +Language=bn +Label="in (ben_gitanjali)" + +[keyboard-in-ben_inscript] +Description="键盘 - 印度语言 - 孟加拉语(印度,Baishakhi InScript)" +Language=bn +Label="in (ben_inscript)" + +[keyboard-in-eng] +Description="键盘 - 印度语言 - 英语(印度,带卢比符号)" +Language=en +Label="en (eng)" + +[keyboard-in-guj] +Description="键盘 - 印度语言 - 古吉拉特语" +Language=gu +Label="gu (guj)" + +[keyboard-in-guj-kagapa] +Description="键盘 - 印度语言 - 古吉拉特语(KaGaPa,语音助记)" +Language=gu +Label="gu (guj-kagapa)" + +[keyboard-in-bolnagri] +Description="键盘 - 印度语言 - 印地语(Bolnagri)" +Language=hi +Label="hi (bolnagri)" + +[keyboard-in-hin-wx] +Description="键盘 - 印度语言 - 印地语(Wx)" +Language=hi +Label="hi (hin-wx)" + +[keyboard-in-hin-kagapa] +Description="键盘 - 印度语言 - 印地语(KaGaPa,语音助记)" +Language=hi +Label="hi (hin-kagapa)" + +[keyboard-in-kan] +Description="键盘 - 印度语言 - 卡纳达语" +Language=kn +Label="kn (kan)" + +[keyboard-in-kan-kagapa] +Description="键盘 - 印度语言 - 卡纳达语(KaGaPa,语音助记)" +Language=kn +Label="kn (kan-kagapa)" + +[keyboard-in-mal] +Description="键盘 - 印度语言 - 马拉雅拉姆语" +Language=ml +Label="ml (mal)" + +[keyboard-in-mal_lalitha] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Lalitha)" +Language=ml +Label="ml (mal_lalitha)" + +[keyboard-in-mal_enhanced] +Description="键盘 - 印度语言 - 马拉雅拉姆语(改进的 InScript,带卢比符号)" +Language=ml +Label="ml (mal_enhanced)" + +[keyboard-in-mal_poorna] +Description="键盘 - 印度语言 - 马拉雅拉姆语(Poorna,扩展 InScript)" +Language=ml +Label="ml (mal_poorna)" + +[keyboard-in-mni] +Description="键盘 - 印度语言 - 曼尼普尔语(梅泰)" +Language=mni +Label="in (mni)" + +[keyboard-in-mar-kagapa] +Description="键盘 - 印度语言 - 马拉地语(KaGaPa,语音助记)" +Language=mr +Label="mr (mar-kagapa)" + +[keyboard-in-marathi] +Description="键盘 - 印度语言 - 马拉地语(改进的 InScript)" +Language=mr +Label="in (marathi)" + +[keyboard-in-ori] +Description="键盘 - 印度语言 - 奥里亚语" +Language=or +Label="or (ori)" + +[keyboard-in-ori-bolnagri] +Description="键盘 - 印度语言 - 奥里亚语(Bolnagri)" +Language=or +Label="or (ori-bolnagri)" + +[keyboard-in-ori-wx] +Description="键盘 - 印度语言 - 奥里亚语(Wx)" +Language=or +Label="or (ori-wx)" + +[keyboard-in-guru] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi)" +Language=pa +Label="pa (guru)" + +[keyboard-in-jhelum] +Description="键盘 - 印度语言 - 旁遮普语(Gurmukhi Jhelum)" +Language=pa +Label="pa (jhelum)" + +[keyboard-in-san-kagapa] +Description="键盘 - 印度语言 - 梵语(KaGaPa,语音助记)" +Language=sa +Label="sa (san-kagapa)" + +[keyboard-in-sat] +Description="键盘 - 印度语言 - 桑塔利语(桑塔利文)" +Language=sat +Label=sat + +[keyboard-in-tamilnet] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99)" +Language=ta +Label="ta (tamilnet)" + +[keyboard-in-tamilnet_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,带泰米尔数字)" +Language=ta +Label="ta (tamilnet_tamilnumbers)" + +[keyboard-in-tamilnet_TAB] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TAB 编码)" +Language=ta +Label="ta (tamilnet_TAB)" + +[keyboard-in-tamilnet_TSCII] +Description="键盘 - 印度语言 - 泰米尔语(TamilNet '99,TSCII 编码)" +Language=ta +Label="ta (tamilnet_TSCII)" + +[keyboard-in-tam] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带阿拉伯数字)" +Language=ta +Label="ta (tam)" + +[keyboard-in-tam_tamilnumbers] +Description="键盘 - 印度语言 - 泰米尔语(InScript,带泰米尔数字)" +Language=ta +Label="ta (tam_tamilnumbers)" + +[keyboard-in-tel] +Description="键盘 - 印度语言 - 泰卢固语" +Language=te +Label="te (tel)" + +[keyboard-in-tel-kagapa] +Description="键盘 - 印度语言 - 泰卢固语(KaGaPa,语音助记)" +Language=te +Label="te (tel-kagapa)" + +[keyboard-in-tel-sarala] +Description="键盘 - 印度语言 - 泰卢固语(Sarala)" +Language=te +Label="te (tel-sarala)" + +[keyboard-in-urd-phonetic] +Description="键盘 - 印度语言 - 乌尔都语(语音助记)" +Language=ur +Label="ur (urd-phonetic)" + +[keyboard-in-urd-phonetic3] +Description="键盘 - 印度语言 - 乌尔都语(替代,语音助记)" +Language=ur +Label="ur (urd-phonetic3)" + +[keyboard-in-urd-winkeys] +Description="键盘 - 印度语言 - 乌尔都语(Windows)" +Language=ur +Label="ur (urd-winkeys)" + +[keyboard-in-iipa] +Description="键盘 - 印度语言 - 印度语支 IPA" +Language=en +Label="in (iipa)" + +[keyboard-in-modi-kagapa] +Description="键盘 - 印度语言 - Modi(KaGaPa,语音助记)" +Language=mr +Label="mr (modi-kagapa)" + +[keyboard-in-san-misc] +Description="键盘 - 印度语言 - 梵文符号" +Language=sa +Label="sas (san-misc)" + +[keyboard-in-urd-navees] +Description="键盘 - 印度语言 - 乌尔都语(Navees)" +Language=ur +Label="ur (urd-navees)" + +[keyboard-it] +Description="键盘 - 意大利语" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="键盘 - 意大利语 - 意大利语(无死键)" +Language=it +Label="it (nodeadkeys)" + +[keyboard-it-winkeys] +Description="键盘 - 意大利语 - 意大利语(Windows)" +Language=it +Label="it (winkeys)" + +[keyboard-it-mac] +Description="键盘 - 意大利语 - 意大利语(Macintosh)" +Language=it +Label="it (mac)" + +[keyboard-it-us] +Description="键盘 - 意大利语 - 意大利语(美国)" +Language=it +Label="it (us)" + +[keyboard-it-ibm] +Description="键盘 - 意大利语 - 意大利语(IBM 142)" +Language=it +Label="it (ibm)" + +[keyboard-it-fur] +Description="键盘 - 意大利语 - 弗留利语(意大利)" +Language=fur +Label="it (fur)" + +[keyboard-it-scn] +Description="键盘 - 意大利语 - 西西里语" +Language=it +Label="it (scn)" + +[keyboard-it-geo] +Description="键盘 - 意大利语 - 格鲁吉亚语(意大利)" +Language=ka +Label="it (geo)" + +[keyboard-it-sun_type6] +Description="键盘 - 意大利语 - 意大利语(Sun Type 6/7)" +Language=it +Label="it (sun_type6)" + +[keyboard-it-lld] +Description="键盘 - 意大利语 - 拉丁语(意大利语键盘)" +Language=it +Label="it_lld (lld)" + +[keyboard-it-lldde] +Description="键盘 - 意大利语 - 拉丁语(德语键盘)" +Language=de +Label="de_lld (lldde)" + +[keyboard-it-dvorak] +Description="键盘 - 意大利语 - 意大利语(Dvorak)" +Language=it +Label="it (dvorak)" + +[keyboard-jp] +Description="键盘 - 日语" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="键盘 - 日语 - 日语(Kana)" +Language=ja +Label="jp (kana)" + +[keyboard-jp-OADG109A] +Description="键盘 - 日语 - 日语(OADG 109A)" +Language=ja +Label="jp (OADG109A)" + +[keyboard-jp-mac] +Description="键盘 - 日语 - 日语(Macintosh)" +Language=ja +Label="jp (mac)" + +[keyboard-jp-dvorak] +Description="键盘 - 日语 - 日语(Dvorak)" +Language=ja +Label="jp (dvorak)" + +[keyboard-jp-sun_type6] +Description="键盘 - 日语 - 日语(Sun Type 6)" +Language=ja +Label="jp (sun_type6)" + +[keyboard-jp-sun_type7] +Description="键盘 - 日语 - 日语(Sun Type 7,PC 兼容)" +Language=ja +Label="jp (sun_type7)" + +[keyboard-jp-sun_type7_suncompat] +Description="键盘 - 日语 - 日语(Sun Type 7,Sun 兼容)" +Language=ja +Label="jp (sun_type7_suncompat)" + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/chttrans.conf b/quickshell-dotfiles/.config/fcitx5/conf/chttrans.conf new file mode 100644 index 0000000..04476ad --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/chttrans.conf @@ -0,0 +1,12 @@ +# 转换引擎 +Engine=OpenCC +# 启用的输入法 +EnabledIM= +# 简转繁的 OpenCC 配置 +OpenCCS2TProfile=default +# 繁转简的 OpenCC 配置 +OpenCCT2SProfile=default + +[Hotkey] +0=Control+Shift+F + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/classicui.conf b/quickshell-dotfiles/.config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..ea8a561 --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/classicui.conf @@ -0,0 +1,35 @@ +# Vertical Candidate List +Vertical Candidate List=True +# Use mouse wheel to go to prev or next page +WheelForPaging=True +# Font +Font="Sans Serif 11" +# Menu Font +MenuFont="Sans Serif 10" +# Tray Font +TrayFont="Sans Serif 10" +# Tray Label Outline Color +TrayOutlineColor=#000000 +# Tray Label Text Color +TrayTextColor=#ffffff +# Prefer Text Icon +PreferTextIcon=False +# Show Layout Name In Icon +ShowLayoutNameInIcon=True +# Use input method language to display text +UseInputMethodLanguageToDisplayText=True +# Theme +Theme=default +# Dark Theme +DarkTheme=default-dark +# Follow system light/dark color scheme +UseDarkTheme=False +# Follow system accent color if it is supported by theme and desktop +UseAccentColor=True +# Use Per Screen DPI on X11 +PerScreenDPI=False +# Force font DPI on Wayland +ForceWaylandDPI=0 +# Enable fractional scale under Wayland +EnableFractionalScale=True + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/notifications.conf b/quickshell-dotfiles/.config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..04957ce --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +# 隐藏通知 +HiddenNotifications= + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/pinyin.conf b/quickshell-dotfiles/.config/fcitx5/conf/pinyin.conf new file mode 100644 index 0000000..df28dca --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/pinyin.conf @@ -0,0 +1,150 @@ +# 双拼方案 +ShuangpinProfile=Ziranma +# 显示当前双拼模式 +ShowShuangpinMode=True +# 每页候选词 +PageSize=5 +# 显示英文候选词 +SpellEnabled=True +# 显示符号候选词 +SymbolsEnabled=True +# 显示拆字候选词 +ChaiziEnabled=True +# 启用 Unicode CJK 拓展区 B 之后的更多字符 +ExtBEnabled=True +# 输入 h(横),s(竖),p(撇),n(捺),z(折) 时显示笔画候选词 +StrokeCandidateEnabled=True +# 启用云拼音 +CloudPinyinEnabled=True +# 云拼音候选词顺序 +CloudPinyinIndex=2 +# 加载云拼音的时候显示动画 +CloudPinyinAnimation=True +# 总是显示云拼音的占位符 +KeepCloudPinyinPlaceHolder=False +# 预编辑模式 +PreeditMode="Composing pinyin" +# 将嵌入预编辑文本的光标固定在开头 +PreeditCursorPositionAtBeginning=True +# 在预编辑中显示完整拼音 +PinyinInPreedit=False +# 启用预测 +Prediction=False +# Keep the current typed text for next input prediction +KeepCurrentContext=True +# 预测数量 +PredictionSize=49 +# 预测时退格键的行为 +BackspaceBehaviorOnPrediction="Backspace when not using on-screen keyboard" +# 切换输入法时的行为 +SwitchInputMethodBehavior="Commit current preedit" +# 选择第二个候选词 +SecondCandidate= +# 选择第三个候选词 +ThirdCandidate= +# 使用数字键盘选词 +UseKeypadAsSelection=False +# 使用退格键取消选词 +BackSpaceToUnselect=True +# 句子数量 +Number of sentence=2 +# 词组候选词数 +WordCandidateLimit=15 +# 输入长于...时提示长词 (设置为 0 时禁用) +LongWordLengthLimit=4 +# 快速输入的触发键 +QuickPhraseKey=semicolon +# 使用 V 来触发快速输入 +VAsQuickphrase=True +# FirstRun +FirstRun=False + +[ForgetWord] +0=Control+7 + +[PrevPage] +0=minus +1=Up +2=KP_Up +3=Page_Up + +[NextPage] +0=equal +1=Down +2=KP_Down +3=Next + +[PrevCandidate] +0=Shift+Tab + +[NextCandidate] +0=Tab + +[CurrentCandidate] +0=space +1=KP_Space + +[CommitRawInput] +0=Return +1=KP_Enter +2=Control+Return +3=Control+KP_Enter +4=Shift+Return +5=Shift+KP_Enter +6=Control+Shift+Return +7=Control+Shift+KP_Enter + +[ChooseCharFromPhrase] +0=bracketleft +1=bracketright + +[FilterByStroke] +0=grave + +[QuickPhraseTriggerRegex] +0=.(/|@)$ +1=^(www|bbs|forum|mail|bbs)\\. +2=^(http|https|ftp|telnet|mailto): + +[Fuzzy] +# ue -> ve +VE_UE=True +# 常见错误 +NG_GN=True +# 内模糊音节 (xian -> xi'an) +Inner=True +# 短拼音的内模糊音节 (qie -> qi'e) +InnerShort=True +# 匹配不完整的元音 (e -> en, eng, ei) +PartialFinal=True +# 输入长度大于 4 时进行部分双拼匹配 +PartialSp=False +# u <-> v +V_U=False +# an <-> ang +AN_ANG=False +# en <-> eng +EN_ENG=False +# ian <-> iang +IAN_IANG=False +# in <-> ing +IN_ING=False +# u <-> ou +U_OU=False +# uan <-> uang +UAN_UANG=False +# c <-> ch +C_CH=False +# f <-> h +F_H=False +# l <-> n +L_N=False +# l <-> r +L_R=False +# s <-> sh +S_SH=False +# z <-> zh +Z_ZH=False +# 纠错布局 +Correction=None + diff --git a/quickshell-dotfiles/.config/fcitx5/conf/punctuation.conf b/quickshell-dotfiles/.config/fcitx5/conf/punctuation.conf new file mode 100644 index 0000000..3da1c4c --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/conf/punctuation.conf @@ -0,0 +1,10 @@ +# 字母或者数字之后输入半角标点 +HalfWidthPuncAfterLetterOrNumber=True +# 同时输入成对标点 (例如引号) +TypePairedPunctuationsTogether=False +# Enabled +Enabled=True + +[Hotkey] +0=Control+period + diff --git a/quickshell-dotfiles/.config/fcitx5/config b/quickshell-dotfiles/.config/fcitx5/config new file mode 100644 index 0000000..1874f1a --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/config @@ -0,0 +1,83 @@ +[Hotkey] +# 按住切换键的修饰键时进行轮换切换 +EnumerateWithTriggerKeys=True +# 向前切换输入法 +EnumerateForwardKeys= +# 向后切换输入法 +EnumerateBackwardKeys= +# 轮换输入法时跳过第一个输入法 +EnumerateSkipFirst=False +# 触发修饰键快捷键的时限 (毫秒) +ModifierOnlyKeyTimeout=250 + +[Hotkey/TriggerKeys] +0=Control+space +1=Zenkaku_Hankaku +2=Hangul + +[Hotkey/ActivateKeys] +0=Hangul_Hanja + +[Hotkey/DeactivateKeys] +0=Hangul_Romaja + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# 默认状态为激活 +ActiveByDefault=False +# 重新聚焦时重置状态 +resetStateWhenFocusIn=No +# 共享输入状态 +ShareInputState=No +# 在程序中显示预编辑文本 +PreeditEnabledByDefault=True +# 切换输入法时显示输入法信息 +ShowInputMethodInformation=True +# 在焦点更改时显示输入法信息 +showInputMethodInformationWhenFocusIn=False +# 显示紧凑的输入法信息 +CompactInputMethodInformation=True +# 显示第一个输入法的信息 +ShowFirstInputMethodInformation=True +# 默认页大小 +DefaultPageSize=5 +# 覆盖 XKB 选项 +OverrideXkbOption=False +# 自定义 XKB 选项 +CustomXkbOption= +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True +# 允许在密码框中使用输入法 +AllowInputMethodForPassword=False +# 输入密码时显示预编辑文本 +ShowPreeditForPassword=False +# 保存用户数据的时间间隔(以分钟为单位) +AutoSavePeriod=30 + diff --git a/quickshell-dotfiles/.config/fcitx5/profile b/quickshell-dotfiles/.config/fcitx5/profile new file mode 100644 index 0000000..d264f5e --- /dev/null +++ b/quickshell-dotfiles/.config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=默认 +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=默认 + diff --git a/quickshell-dotfiles/.local/share/fcitx5/rime/default.custom.yaml b/quickshell-dotfiles/.local/share/fcitx5/rime/default.custom.yaml new file mode 100644 index 0000000..67c652e --- /dev/null +++ b/quickshell-dotfiles/.local/share/fcitx5/rime/default.custom.yaml @@ -0,0 +1,10 @@ +patch: + ascii_composer: + good_old_caps_lock: true + schema_list: + - schema: rime_ice + - schema: luna_pinyin_simp + - schema: double_pinyin_flypy + - schema: wubi86 + - schema: bopomofo + "menu/page_size": 6 diff --git a/resources/MangoHud/MangoHud.conf b/resources/MangoHud/MangoHud.conf new file mode 100644 index 0000000..e3c586f --- /dev/null +++ b/resources/MangoHud/MangoHud.conf @@ -0,0 +1,42 @@ +# Config Generated by MangoJuice # +legacy_layout=false +gpu_stats +gpu_temp +gpu_power +gpu_voltage +cpu_stats +cpu_temp +cpu_power +ram +fps +fps_metrics=avg,0.01 +frame_timing +frame_timing_detailed +wine +toggle_logging=Shift_L+F2 +toggle_hud_position=Shift_R+F11 +fps_limit_method=late +toggle_fps_limit=Shift_L+F1 +background_alpha=0.5 +position=top-left +table_columns=4 +toggle_hud=Shift_R+F12 +gpu_color=2e9762 +cpu_color=2e97cb +fps_value=30,60 +fps_color=cc0000,ffaa7f,92e79a +gpu_load_value=60,90 +gpu_load_color=92e79a,ffaa7f,cc0000 +cpu_load_value=60,90 +cpu_load_color=92e79a,ffaa7f,cc0000 +background_color=000000 +frametime_color=00ff00 +vram_color=ad64c1 +ram_color=c26693 +wine_color=eb5b5b +engine_color=eb5b5b +text_color=ffffff +media_player_color=ffffff +network_color=e07b85 +battery_color=92e79a +media_player_format={title};{artist};{album} diff --git a/resources/Minimal-Niri使用方法.txt b/resources/Minimal-Niri使用方法.txt new file mode 100644 index 0000000..13eb3b0 --- /dev/null +++ b/resources/Minimal-Niri使用方法.txt @@ -0,0 +1,69 @@ + +【可以查阅的文档】 +ArchWiki: https://wiki.archlinux.org/title/Main_page +ShorinArch: https://shorin.xyz/wiki +Shorin一键配置脚本: https://shorin.xyz/wiki/archsetup + +【重要按键】 +super+shift+/ 打开按键教程 +super+T 打开终端 +super+E 打开文档管理器 +super+Z 开始菜单 +super+Q 关闭窗口 +super+R 按预设切换 宽度 +super+F 最大化 +Super+alt+F 全屏 +super+alt+V 开关剪贴板 +super+alt+A 截图 +super+右键 调整窗口大小 +super+左键 移动窗口 +super+V 切换浮动窗口 +super+F10 随机更换壁纸(壁纸存放在~/Pictures/Wallpapers目录) +super+shift+F10 下载随机动漫壁纸 +super+alt+L 锁屏 +super+alt+P 关闭屏幕休眠 +所有按键看~/.config/niri/binds.kdl。 + + +如果出现网络问题可以进行以下操作更换wifi后端: +sudo rm /etc/NetworkManager/conf.d/iwd.conf +sudo systemctl restart NetworkManager + +【实用命令】 +pac 安装软件 (安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 +运行shorin命令可以看到所有可用的便利命令 + +reboot 重启 +poweroff 关机 +suspend 挂起 + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +nmtui:网络配置工具 +impala:wifi连接工具,tab键切换,上下左右选择,回车确认(需要iwd后端) +btop:任务管理器 +yazi:文档管理器 +fastfetch:系统信息显示工具 +pulsemixer:tui音量调整工具 + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先快速存档(Mod+F5),我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/resources/Wallpapers/FCD2D539E2FA1A71D3E156BE3D2E4DE1.png b/resources/Wallpapers/FCD2D539E2FA1A71D3E156BE3D2E4DE1.png new file mode 100644 index 0000000..1303c18 Binary files /dev/null and b/resources/Wallpapers/FCD2D539E2FA1A71D3E156BE3D2E4DE1.png differ diff --git a/resources/Wallpapers/wallhaven-d88d53.png b/resources/Wallpapers/wallhaven-d88d53.png new file mode 100644 index 0000000..1793ecc Binary files /dev/null and b/resources/Wallpapers/wallhaven-d88d53.png differ diff --git a/resources/Wallpapers/wallhaven-vpq7m8.png b/resources/Wallpapers/wallhaven-vpq7m8.png new file mode 100644 index 0000000..b5c1023 Binary files /dev/null and b/resources/Wallpapers/wallhaven-vpq7m8.png differ diff --git a/resources/Wallpapers/wallhaven-yq8w67.jpg b/resources/Wallpapers/wallhaven-yq8w67.jpg new file mode 100644 index 0000000..574f874 Binary files /dev/null and b/resources/Wallpapers/wallhaven-yq8w67.jpg differ diff --git a/resources/firefox/2l3lhbzb.default-release/prefs.js b/resources/firefox/2l3lhbzb.default-release/prefs.js new file mode 100644 index 0000000..88ad2ce --- /dev/null +++ b/resources/firefox/2l3lhbzb.default-release/prefs.js @@ -0,0 +1,23 @@ +user_pref("sidebar.revamp", true); +user_pref("sidebar.verticalTabs", true); +user_pref("sidebar.visibility", "expand-on-hover"); +user_pref("sidebar.main.tools", "aichat"); +user_pref("browser.toolbars.bookmarks.visibility", "never"); +user_pref("browser.uiCustomization.state", "{\"placements\":{\"widget-overflow-fixed-list\":[],\"unified-extensions-area\":[\"ublock0_raymondhill_net-browser-action\",\"pywalfox_frewacom_org-browser-action\",\"firefox_tampermonkey_net-browser-action\",\"_9c37f9a3-ea04-4a2b-9fcc-c7a814c14311_-browser-action\",\"_5efceaa7-f3a2-4e59-a54b-85319448e305_-browser-action\",\"plasma-browser-integration_kde_org-browser-action\"],\"nav-bar\":[\"sidebar-button\",\"customizableui-special-spring1\",\"customizableui-special-spring8\",\"customizableui-special-spring7\",\"vertical-spacer\",\"customizableui-special-spring13\",\"customizableui-special-spring14\",\"customizableui-special-spring21\",\"back-button\",\"forward-button\",\"urlbar-container\",\"customizableui-special-spring20\",\"customizableui-special-spring18\",\"customizableui-special-spring16\",\"customizableui-special-spring11\",\"customizableui-special-spring10\",\"customizableui-special-spring9\",\"customizableui-special-spring2\",\"downloads-button\",\"unified-extensions-button\"],\"toolbar-menubar\":[\"menubar-items\"],\"TabsToolbar\":[],\"vertical-tabs\":[\"tabbrowser-tabs\"],\"PersonalToolbar\":[]},\"seen\":[\"developer-button\",\"screenshot-button\",\"pywalfox_frewacom_org-browser-action\",\"ublock0_raymondhill_net-browser-action\",\"firefox_tampermonkey_net-browser-action\",\"_9c37f9a3-ea04-4a2b-9fcc-c7a814c14311_-browser-action\",\"_5efceaa7-f3a2-4e59-a54b-85319448e305_-browser-action\",\"plasma-browser-integration_kde_org-browser-action\"],\"dirtyAreaCache\":[\"nav-bar\",\"vertical-tabs\",\"unified-extensions-area\",\"toolbar-menubar\",\"TabsToolbar\",\"PersonalToolbar\",\"widget-overflow-fixed-list\"],\"currentVersion\":23,\"newElementCount\":23}"); +user_pref("intl.accept_languages", "zh-cn"); +user_pref("browser.startup.homepage", "chrome://browser/content/blanktab.html"); +user_pref("browser.newtabpage.enabled", false); +user_pref("browser.tabs.warnOnOpen", false); +user_pref("browser.ctrlTab.sortByRecentlyUsed", true); +user_pref("findbar.highlightAll", true); +user_pref("browser.contentblocking.category", "standard"); +user_pref("browser.sessionstore.resume_from_crash", true); +user_pref("toolkit.telemetry.reportingpolicy.firstRun", true); +user_pref("trailhead.firstrun.didSeeAboutWelcome", false); +user_pref("browser.shell.checkDefaultBrowser", true); +user_pref("extensions.activeThemeID", "default-theme@mozilla.org"); +user_pref("extensions.autoDisableScopes", 0); +user_pref("extensions.postDownloadThirdPartyPrompt", false); +user_pref("media.eme.enabled", true); +user_pref("browser.tabs.splitView.enabled", true); + diff --git a/resources/firefox/2l3lhbzb.default-release/xulstore.json b/resources/firefox/2l3lhbzb.default-release/xulstore.json new file mode 100644 index 0000000..2d28c50 --- /dev/null +++ b/resources/firefox/2l3lhbzb.default-release/xulstore.json @@ -0,0 +1,7 @@ +{ + "chrome://browser/content/browser.xhtml": { + "main-window": { + "sizemode": "normal" + } + } +} diff --git a/resources/firefox/profiles.ini b/resources/firefox/profiles.ini new file mode 100644 index 0000000..e2bd84f --- /dev/null +++ b/resources/firefox/profiles.ini @@ -0,0 +1,10 @@ +[Install4F96D1932A9F858E] +Default=2l3lhbzb.default-release + +[Profile0] +Name=default-release +IsRelative=1 +Path=2l3lhbzb.default-release + + + diff --git a/resources/windows-sim-fonts/simfang.ttf b/resources/windows-sim-fonts/simfang.ttf new file mode 100644 index 0000000..68334e2 Binary files /dev/null and b/resources/windows-sim-fonts/simfang.ttf differ diff --git a/resources/windows-sim-fonts/simhei.ttf b/resources/windows-sim-fonts/simhei.ttf new file mode 100644 index 0000000..5bd4687 Binary files /dev/null and b/resources/windows-sim-fonts/simhei.ttf differ diff --git a/resources/windows-sim-fonts/simkai.ttf b/resources/windows-sim-fonts/simkai.ttf new file mode 100644 index 0000000..d7c3b90 Binary files /dev/null and b/resources/windows-sim-fonts/simkai.ttf differ diff --git a/resources/windows-sim-fonts/simsun.ttc b/resources/windows-sim-fonts/simsun.ttc new file mode 100644 index 0000000..5f22ce3 Binary files /dev/null and b/resources/windows-sim-fonts/simsun.ttc differ diff --git a/resources/必看-KDE使用方法.txt b/resources/必看-KDE使用方法.txt new file mode 100644 index 0000000..b9f7697 --- /dev/null +++ b/resources/必看-KDE使用方法.txt @@ -0,0 +1,83 @@ +################## +#####按键教程###### +################## + +[ 设置路径 ] +系统设置 > 输入和输出 > 键盘 > 快捷键 + +[ 应用程序 ] +KRunner (搜索/启动) : Meta + Z +应用程序启动器 (菜单) : Alt (单独按下) +终端 (Konsole) : Meta + T +浏览器 : Meta + B +系统设置 : Ctrl + Alt + S +任务中心 (Mission Center) : Meta + Esc + +[ 窗口管理 ] +关闭窗口 : Meta + Q +强制终止窗口 : Meta + Ctrl + Q +最大化窗口 : Meta + F +最小化窗口 : Meta + H +全屏显示 : Meta + Alt + F +移动窗口到中央 : Meta + C +暂时显示桌面 : Meta + M + +[ 磁贴窗口管理 ] +磁贴编辑模式开关 : Meta + F9 +快速铺放 (上下左右) : Meta + W / A / S / D +* 提示: 按下 Meta+F9 后可编辑自己喜欢的平铺布局 + +[ 工作空间 ] +显示/隐藏桌面总览 : Meta (单独按下) +切换活动 : Meta + Tab + + +一些使用技巧: + +meta+左键移动窗口 +meta+右键调整窗口大小 +meta+alt+滚轮切换工作区 +meta+ctrl+滚轮 缩放屏幕 + +################## +#######配置####### ################# + +konsole终端右键的设置菜单里可以对工具栏显示、外观之类的进行配置 + +如果你不喜欢我的kde外观配置,可以在设置中心的主题部分进行更改 + +如果你想要调整圆角,可以找到设置里的窗口管理 > 桌面特效部分修改rounded corner(大概是这个名,新版本有点bug所以可能已经移除了这个) + +【实用命令】 +运行shorin命令可以看到所有可用的便利命令 +pac 安装软件(安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +btop:任务管理器 +fastfetch:系统信息显示工具 + +【Ai助手】 +如果你没有跳过常用软件安装步骤的话,会安装一个叫作opencode的开源ai助手,有免费模型可以用,你有api的话也可以自己导入。如果你有查找文件之类的需求直接询问这个Ai助手会很方便。想修改配置的话请谨慎辨别ai信息是否准确,谨慎使用ai修改文件。不喜欢的话可以删除:pacr opencode + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先存档,我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/resources/必看-Shorin-DMS-Niri使用方法.txt b/resources/必看-Shorin-DMS-Niri使用方法.txt new file mode 100644 index 0000000..3e1d812 --- /dev/null +++ b/resources/必看-Shorin-DMS-Niri使用方法.txt @@ -0,0 +1,100 @@ + +【可以查阅的文档】 +ArchWiki: https://wiki.archlinux.org/title/Main_page +DMSWiki: https://danklinux.com/ +NiriWiki: https://github.com/niri-wm/niri/wiki +ShorinArch: https://shorin.xyz/wiki +Shorin一键配置脚本: https://shorin.xyz/wiki/archsetup + +如果出现了两个任务栏可以运行以下命令关掉: +systemctl --user disable --now dms + +如果出现网络问题可以进行以下操作更换wifi后端: +sudo rm /etc/NetworkManager/conf.d/iwd.conf +sudo systemctl restart NetworkManager + + +【重要按键】 +super+shift+/ 打开按键教程 +super+T 打开终端 +super+E 打开文档管理器 +super+Z 开始菜单 +super+Q 关闭窗口 +super+R 按预设切换 宽度 +super+F 最大化 +Super+alt+F 全屏 +super+G/O 切换overview(在overview的时候可以左键移动窗口,滚轮上下切换工作区) +super+alt+A 截图(或者用printscreen键) +super+alt+V 开关剪贴板 +super+V 切换浮动窗口 +suepr+N 切换浮动窗口聚焦 + +super+H/L 左右切换聚焦 +super+U/i 上下切换工作区 +super+右键 调整窗口大小 +super+左键 移动窗口 +super+滚轮 左右切换聚焦 +super+Shift+滚轮 上下切换工作区 +super+A/D 左右移动窗口(合并列) +super+shift+F10 下载随机动漫壁纸 + +有一些必要设置需要手动完成 +1.【overview壁纸】 +super+Z打开程序菜单,打开dms设置。进入“个性化-->壁纸”,设置一张壁纸。我在Wallpapers里存放了一张,可以直接使用。然后开启“带模糊效果的壁纸复本”,这是overview的模糊壁纸,super+G或者super+O打开overview就可以看到。 + +2.【颜色更随壁纸变化】【gtk主题和qt主题】 +选择“主题与配色”,点击auto,然后选择一个自己喜欢的配色方案。然后到该页面底端,点击“应用GTK配色”。然后打开GTK Setting软件,选择使用adw-gte3-dark。 + +3.【Firefox颜色同步】 +打开firefox之后进入扩展页面,我预装好了pywalfox扩展,点进pywalfox扩展的页面点击右上角的fetch。 + +4.【vscode颜色同步】 +在vscode里安装DMS主题扩展,然后把主题改成DankShell,再重新更换一次壁纸。 + +【关于文档管理器】 +有两个,一个是nautius(图标是蓝色柜子的那个)一个是thunar,主要用thunar。装两个是因为Niri的录屏依赖xdg-desktop-portal-gnome,而这个portal会依赖nautilus,装都装了,我就把nautius的功能都补全了,也不占什么硬盘资源。 + + +【输入法配置】 +super+空格切换输入法。第一次使用输入法有可能无法使用,重启一下输入法可以解决。 +f4可以打开菜单。如果出现卡A的情况可以试试按右shift解决。 + +【实用命令】 +运行shorin命令可以看到所有可用的便利命令 +pac 安装软件(安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 + +【Ai助手】 +如果你没有跳过常用软件安装步骤的话,会安装一个叫作opencode的开源ai助手,有免费模型可以用,你有api的话也可以自己导入。如果你有查找文件之类的需求直接询问这个Ai助手会很方便。想修改配置的话请谨慎辨别ai信息是否准确,谨慎使用ai修改文件。不喜欢的话可以删除:pacr opencode + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +nmtui:网络配置工具 +impala:wifi连接工具,tab键切换,上下左右选择,回车确认(需要iwd后端) +btop:任务管理器 +yazi:文档管理器 +fastfetch:系统信息显示工具 + +【详细按键教程】 +所有的键位都可以在.config/niri/dms/binds.kdl里找到 + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先快速存档(Mod+F5),我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/resources/必看-Shorin-Noctalia-Niri使用方法.txt b/resources/必看-Shorin-Noctalia-Niri使用方法.txt new file mode 100644 index 0000000..25a3564 --- /dev/null +++ b/resources/必看-Shorin-Noctalia-Niri使用方法.txt @@ -0,0 +1,95 @@ +可以查阅的文档: +ArchWiki: https://wiki.archlinux.org/title/Main_page +NoctaliaWiki: https://noctalia.dev/ +NiriWiki: https://github.com/niri-wm/niri/wiki +ShorinArch: https://shorin.xyz/wiki +Shorin一键配置脚本: https://shorin.xyz/wiki/archsetup + + +如果出现网络问题可以进行以下操作更换wifi后端: +sudo rm /etc/NetworkManager/conf.d/iwd.conf +sudo systemctl restart NetworkManager + + +【重要按键】 +super+shift+/ 打开按键教程 +super+T 打开终端 +super+E 打开文档管理器 +super+Z 开始菜单 +super+Q 关闭窗口 +super+R 按预设切换 宽度 +super+F 最大化 +Super+alt+F 全屏 +super+G/O 切换overview(在overview的时候可以左键移动窗口,滚轮上下切换工作区) +super+alt+A 截图(或者用printscreen键) +super+alt+V 开关剪贴板 +super+V 切换浮动窗口 +super+H/L 左右切换聚焦 +super+U/i 上下切换工作区 +super+右键 调整窗口大小 +super+左键 移动窗口 +super+滚轮 左右切换聚焦 +super+Shift+滚轮 上下切换工作区 +super+A/D 左右移动窗口(合并列) + + +【必要设置】 +1.更换壁纸 +Mod+Alt+W打开壁纸切换器,切换一次壁纸,此时会自动生成所有的主题颜色。 +如果要取消开启时随机更换壁纸的功能可以编辑~/.config/niri/config.kdl,删除自动切换壁纸的spawn-sh-at-stratup。 + +2.Firefox颜色同步 +打开firefox之后进入扩展页面,我预装好了pywalfox扩展,点进pywalfox扩展的页面点击右上角的fetch。 + +【关于文档管理器】 +有两个,一个是nautilus(图标是蓝色柜子的那个)一个是thunar,主要用thunar。装两个是因为Niri的录屏依赖xdg-desktop-portal-gnome,而这个portal会依赖nautilus,装都装了,我就把nautius的功能都补全了,也不占什么硬盘资源。 + +【显示器设置】 +需要编辑~/.config/niri/outputs.kdl。 + +【输入法】 +super+空格切换输入法。第一次使用输入法有可能无法使用,重启一下输入法可以解决。 +f4可以打开菜单。如果出现卡A的情况可以试试按右shift解决。 +使用fcitx5配置可以对输入法进行细节配置 + +【实用命令】 +运行shorin命令可以看到所有可用的便利命令 +pac 安装软件(安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 + +【Ai助手】 +如果你没有跳过常用软件安装步骤的话,会安装一个叫作opencode的开源ai助手,有免费模型可以用,你有api的话也可以自己导入。如果你有查找文件之类的需求直接询问这个Ai助手会很方便。想修改配置的话请谨慎辨别ai信息是否准确,谨慎使用ai修改文件。不喜欢的话可以删除:pacr opencode + + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +nmtui:网络配置工具 +impala:wifi连接工具,tab键切换,上下左右选择,回车确认(需要iwd后端) +btop:任务管理器 +yazi:文档管理器 +fastfetch:系统信息显示工具 +更多软件信息可以看一键配置脚本的文档。 + +【详细按键教程】 +所有的键位都可以在.config/niri/binds.kdl里找到 + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先快速存档(Mod+F5),我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/resources/必看-shoirn-Niri使用方法.txt b/resources/必看-shoirn-Niri使用方法.txt new file mode 100644 index 0000000..41aee43 --- /dev/null +++ b/resources/必看-shoirn-Niri使用方法.txt @@ -0,0 +1,74 @@ + +【可以查阅的文档】 +ArchWiki: https://wiki.archlinux.org/title/Main_page +NiriWiki: https://github.com/niri-wm/niri/wiki +ShorinArch: https://shorin.xyz/wiki +Shorin一键配置脚本: https://shorin.xyz/wiki/archsetup + +【重要按键】 +super+shift+/ 打开按键教程 +super+T 打开终端 +super+E 打开文档管理器 +super+Z 开始菜单 +super+Q 关闭窗口 +super+R 按预设切换 宽度 +super+F 最大化 +super+H/L 左右切换聚焦 +Super+alt+F 全屏 +super+alt+V 开关剪贴板 +super+alt+A 截图 +super+右键 调整窗口大小 +super+左键 移动窗口 +super+V 切换浮动窗口 +super+F10 随机更换壁纸(壁纸存放在~/Pictures/Wallpapers目录) +super+shift+F10 下载随机动漫壁纸 +详细的按键注释看~/.config/niri里的.kdl文件。 + + +如果出现网络问题可以进行以下操作更换wifi后端: +sudo rm /etc/NetworkManager/conf.d/iwd.conf +sudo systemctl restart NetworkManager + +【输入法】 +super+空格切换输入法。第一次使用输入法有可能无法使用,重启一下输入法可以解决。 +f4可以打开菜单。如果出现卡A的情况可以试试按右shift解决。 +使用fcitx5配置可以对输入法进行细节配置 + +【实用命令】 +pac 安装软件 (安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 +运行shorin命令可以看到所有可用的便利命令 + +【Ai助手】 +如果你没有跳过常用软件安装步骤的话,会安装一个叫作opencode的开源ai助手,有免费模型可以用,你有api的话也可以自己导入。如果你有查找文件之类的需求直接询问这个Ai助手会很方便。想修改配置的话请谨慎辨别ai信息是否准确,谨慎使用ai修改文件。不喜欢的话可以删除:pacr opencode + + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +nmtui:网络配置工具 +impala:wifi连接工具,tab键切换,上下左右选择,回车确认(需要iwd后端) +btop:任务管理器 +yazi:文档管理器 +fastfetch:系统信息显示工具 +更多软件信息可以看一键配置脚本的文档。 + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先快速存档(Mod+F5),我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/resources/必看-shoirn-hyprniri使用方法.txt b/resources/必看-shoirn-hyprniri使用方法.txt new file mode 100644 index 0000000..92caa51 --- /dev/null +++ b/resources/必看-shoirn-hyprniri使用方法.txt @@ -0,0 +1,83 @@ + +【可以查阅的文档】 +ArchWiki: https://wiki.archlinux.org/title/Main_page +DMSWiki: https://danklinux.com/ +HyprlandWiki: https://wiki.hypr.land/ +ShorinWiki: https://shorin.xyz/wiki +Shorin一键配置脚本: https://shorin.xyz/wiki/archsetup + +如果出现了两个任务栏可以运行以下命令关掉: +systemctl --user disable --now dms + +一些必要的手动设置 +【主题同步】super+z打开程序菜单选择dms设置。选择一张喜欢的壁纸(壁纸存放在~/Pictures/Wallpapers),然后在“主题与配色”界面选择“自动”,在页面底端点击应用gtk主题。打开GTK Settings,设置使用adw-gtk3-dark主题。 + +【Firefox颜色同步】 +打开firefox之后进入扩展页面,我预装好了pywalfox扩展,点进pywalfox扩展的页面点击右上角的fetch。 + +【vscode颜色同步】 +在vscode里安装DMS主题扩展,然后把主题改成DankShell,再重新更换一次壁纸。 + + +【重要按键】 +super+T 打开终端 +super+E 打开文档管理器 +super+Z 开始菜单 +super+Q 关闭窗口 +super+R 按预设切换 宽度 +super+F 最大化 +Super+alt+F 全屏 +super+alt+V 开关剪贴板 +super+alt+A 截图 +super+右键 调整窗口大小 +super+左键 移动窗口 +super+V 切换浮动窗口 +super+shift+F10 下载随机动漫壁纸 +具体按键可以看~/.config/hypr/hyprland.conf中的bind相关内容,重要键位有中文注释。 + +如果出现网络问题可以进行以下操作更换wifi后端: +sudo rm /etc/NetworkManager/conf.d/iwd.conf +sudo systemctl restart NetworkManager + +【输入法】 +super+空格切换输入法。第一次使用输入法有可能无法使用,重启一下输入法可以解决。 +f4可以打开菜单。如果出现卡A的情况可以试试按右shift解决。 +使用fcitx5配置可以对输入法进行细节配置 + +【实用命令】 +运行shorin命令可以看到所有可用的便利命令 +pac 安装软件(安装软件还可以用bazaar,这是flatpak软件商城) +pacr 卸载软件 +mirror-update 更新镜像源 +sysup 更新系统 +clean 系统清理 +quicksave 快速存档 + +【Ai助手】 +如果你没有跳过常用软件安装步骤的话,会安装一个叫作opencode的开源ai助手,有免费模型可以用,你有api的话也可以自己导入。如果你有查找文件之类的需求直接询问这个Ai助手会很方便。想修改配置的话请谨慎辨别ai信息是否准确,谨慎使用ai修改文件。不喜欢的话可以删除:pacr opencode + +【有趣实用的TUI软件(基于终端的用户交互程序)】 +命令:作用 +gdu:磁盘空间管理 +nmtui:网络配置工具 +impala:wifi连接工具,tab键切换,上下左右选择,回车确认(需要iwd后端) +btop:任务管理器 +yazi:文档管理器 +fastfetch:系统信息显示工具 +更多软件信息可以看一键配置脚本的文档。 + +【如果不想要了或者安装失败了可以回档】 +/usr/local/bin下有两个脚本可以用来回档到运行脚本之前的状态。 +回到安装桌面前:shorin-de-undochange +回到运行脚本前:shorin-undochange + +【关于系统维护】 +1. 系统更新 +请一定使用sysup命令更新系统,不要直接pacman -Syu。更新时要注意是否有重要新闻,sysup命令会在更新前自动创建quicksave-sysup快照,如果更新后出现问题可以从任意快照启动项进入系统运行quickload命令回档。 + +2. 系统清理 +clean命令可以清理软件包缓存、回收站、截图、录屏、超数量上限的快照、btrfs备份子卷等内容。clean all命令可以更进一步,清理所有软件包缓存和所有快照。home目录下的.cache文件内的文件也都是可以安全删除的缓存,不过一股脑删除可能会少用户登录什么的,可以使用gdu寻找大文件删除。 + +3. 快速存档 +活用btrfs快照存档,我的quicksave命令可以快速创建描述为quicksave的快照,做不了解的事情记得先快速存档(Mod+F5),我设置了合理的快照数量限制,不用担心快照占用磁盘空间,放心存。 + diff --git a/scripts/00-btrfs-init.sh b/scripts/00-btrfs-init.sh new file mode 100644 index 0000000..66bd02b --- /dev/null +++ b/scripts/00-btrfs-init.sh @@ -0,0 +1,150 @@ +#!/bin/bash + +# ============================================================================== +# 00-btrfs-init.sh - Pre-install Snapshot Safety Net (Root & Home) +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +source "$SCRIPT_DIR/00-utils.sh" + +check_root + +section "Phase 0" "System Snapshot Initialization" + +# ------------------------------------------------------------------------------ +# 0. Early Exit Check +# ------------------------------------------------------------------------------ +log "Checking Root filesystem..." +ROOT_FSTYPE=$(findmnt -n -o FSTYPE /) + +if [ "$ROOT_FSTYPE" != "btrfs" ]; then + warn "Root filesystem is not Btrfs ($ROOT_FSTYPE detected)." + log "Skipping Btrfs snapshot initialization entirely." + exit 0 +fi + +log "Root is Btrfs. Proceeding with pristine Snapshot Safety Net setup..." + +# ------------------------------------------------------------------------------ +# 1. Configure Root (/) & Home (/home) +# ------------------------------------------------------------------------------ +# 【极致纯净】这里只装 snapper!不装任何多余工具 +log "Installing Snapper..." +exe pacman -Syu --noconfirm --needed snapper + +log "Configuring Snapper for Root..." +if ! snapper list-configs | grep -q "^root "; then + if [ -d "/.snapshots" ]; then + exe_silent umount /.snapshots + exe_silent rm -rf /.snapshots + fi + if exe snapper -c root create-config /; then + success "Config 'root' created." + exe snapper -c root set-config ALLOW_GROUPS="wheel" TIMELINE_CREATE="yes" TIMELINE_CLEANUP="yes" NUMBER_LIMIT="10" NUMBER_MIN_AGE="0" NUMBER_LIMIT_IMPORTANT="5" TIMELINE_LIMIT_HOURLY="3" TIMELINE_LIMIT_DAILY="0" TIMELINE_LIMIT_WEEKLY="0" TIMELINE_LIMIT_MONTHLY="0" TIMELINE_LIMIT_YEARLY="0" + exe systemctl enable snapper-cleanup.timer + exe systemctl enable snapper-timeline.timer + fi +fi + +if findmnt -n -o FSTYPE /home | grep -q "btrfs"; then + log "Configuring Snapper for Home..." + if ! snapper list-configs | grep -q "^home "; then + if [ -d "/home/.snapshots" ]; then + exe_silent umount /home/.snapshots + exe_silent rm -rf /home/.snapshots + fi + if exe snapper -c home create-config /home; then + success "Config 'home' created." + exe snapper -c home set-config ALLOW_GROUPS="wheel" TIMELINE_CREATE="yes" TIMELINE_CLEANUP="yes" NUMBER_MIN_AGE="0" NUMBER_LIMIT="10" NUMBER_LIMIT_IMPORTANT="5" TIMELINE_LIMIT_HOURLY="3" TIMELINE_LIMIT_DAILY="0" TIMELINE_LIMIT_WEEKLY="0" TIMELINE_LIMIT_MONTHLY="0" TIMELINE_LIMIT_YEARLY="0" + fi + fi +fi + +# ------------------------------------------------------------------------------ +# 2. Advanced Btrfs-GRUB Decoupling (Pure Base) +# ------------------------------------------------------------------------------ +section "Safety Net" "GRUB-Btrfs Decoupling" + +if [ -f "/etc/default/grub" ] && command -v grub-mkconfig >/dev/null 2>&1; then + FOUND_ESP_GRUB="" + VFAT_MOUNTS=$(findmnt -n -l -o TARGET -t vfat | grep -v "^/boot$") + + if [ -n "$VFAT_MOUNTS" ]; then + while read -r mountpoint; do + if [ -d "$mountpoint/grub" ]; then + FOUND_ESP_GRUB="$mountpoint/grub" + break + fi + done <<< "$VFAT_MOUNTS" + fi + + if [ -n "$FOUND_ESP_GRUB" ]; then + log "Applying GRUB Decoupling Stub..." + + if [ -L "/boot/grub" ]; then exe rm -f /boot/grub; fi + if [ ! -d "/boot/grub" ]; then exe mkdir -p /boot/grub; fi + + BTRFS_UUID=$(findmnt -n -o UUID /) + SUBVOL_NAME=$(findmnt -n -o OPTIONS / | tr ',' '\n' | grep '^subvol=' | cut -d= -f2) + + if [ "$SUBVOL_NAME" == "/" ] || [ -z "$SUBVOL_NAME" ]; then + BTRFS_BOOT_PATH="/boot/grub" + else + [[ "$SUBVOL_NAME" != /* ]] && SUBVOL_NAME="/${SUBVOL_NAME}" + BTRFS_BOOT_PATH="${SUBVOL_NAME}/boot/grub" + fi + + cat < /dev/null +search --no-floppy --fs-uuid --set=root $BTRFS_UUID +configfile ${BTRFS_BOOT_PATH}/grub.cfg +EOF + + sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=saved/' /etc/default/grub + if grep -q "^#*GRUB_SAVEDEFAULT=" /etc/default/grub; then + sed -i 's/^#*GRUB_SAVEDEFAULT=.*/GRUB_SAVEDEFAULT=true/' /etc/default/grub + else + echo "GRUB_SAVEDEFAULT=true" >> /etc/default/grub + fi + fi + + # 【关键】这里生成的是最干净的、没有快照菜单的 grub.cfg + log "Regenerating Pristine GRUB Config..." + exe grub-mkconfig -o /boot/grub/grub.cfg +fi + +# ------------------------------------------------------------------------------ +# 3. Create Initial Pristine Snapshot +# ------------------------------------------------------------------------------ +section "Safety Net" "Creating Pristine Initial Snapshots" + +if snapper list-configs | grep -q "root "; then + if ! snapper -c root list --columns description | grep -q "Before Shorin Setup"; then + if exe snapper -c root create --description "Before Shorin Setup"; then + success "Pristine Root snapshot created." + else + error "Failed to create Root snapshot."; exit 1 + fi + fi +fi + +if snapper list-configs | grep -q "home "; then + if ! snapper -c home list --columns description | grep -q "Before Shorin Setup"; then + if exe snapper -c home create --description "Before Shorin Setup"; then + success "Pristine Home snapshot created." + fi + fi +fi + +# ------------------------------------------------------------------------------ +# 4. Deploy Rollback Scripts +# ------------------------------------------------------------------------------ +BIN_DIR="/usr/local/bin" +UNDO_SRC="$PARENT_DIR/undochange.sh" +DE_UNDO_SRC="$SCRIPT_DIR/de-undochange.sh" + +exe mkdir -p "$BIN_DIR" +if [ -f "$UNDO_SRC" ]; then exe cp -f "$UNDO_SRC" "$BIN_DIR/shorin-undochange" && exe chmod +x "$BIN_DIR/shorin-undochange"; fi +if [ -f "$DE_UNDO_SRC" ]; then exe cp -f "$DE_UNDO_SRC" "$BIN_DIR/shorin-de-undochange" && exe chmod +x "$BIN_DIR/shorin-de-undochange"; fi + +log "Module 00 completed. Pure base system secured." \ No newline at end of file diff --git a/scripts/00-utils.sh b/scripts/00-utils.sh new file mode 100644 index 0000000..1c60d2c --- /dev/null +++ b/scripts/00-utils.sh @@ -0,0 +1,612 @@ +#!/bin/bash + +# ============================================================================== +# 00-utils.sh - The "TUI" Visual Engine (v4.0) +# ============================================================================== + +# --- 1. 颜色与样式定义 (ANSI) --- +# 注意:这里定义的是字面量字符串,需要 echo -e 来解析 +export NC='\033[0m' +export BOLD='\033[1m' +export DIM='\033[2m' +export ITALIC='\033[3m' +export UNDER='\033[4m' +export H_MAGENTA='\033[1;35m' +# 常用高亮色 +export H_RED='\033[1;31m' +export H_GREEN='\033[1;32m' +export H_YELLOW='\033[1;33m' +export H_BLUE='\033[1;34m' +export H_PURPLE='\033[1;35m' +export H_CYAN='\033[1;36m' +export H_WHITE='\033[1;37m' +export H_GRAY='\033[1;90m' + +# 背景色 (用于标题栏) +export BG_BLUE='\033[44m' +export BG_PURPLE='\033[45m' + +# 符号定义 +export TICK="${H_GREEN}✔${NC}" +export CROSS="${H_RED}✘${NC}" +export INFO="${H_BLUE}ℹ${NC}" +export WARN="${H_YELLOW}⚠${NC}" +export ARROW="${H_CYAN}➜${NC}" + + +check_root() { + if [ "$EUID" -ne 0 ]; then + echo -e "${H_RED} $CROSS CRITICAL ERROR: Script must be run as root.${NC}" + exit 1 + fi +} +check_root + +# ============================================================================== +# detect_target_user - 识别目标用户 (支持 1-based 序号与回车默认选择) +# ============================================================================== +detect_target_user() { + # 1. 缓存检查 + if [[ -f "/tmp/shorin_install_user" ]]; then + TARGET_USER=$(cat "/tmp/shorin_install_user") + HOME_DIR="/home/$TARGET_USER" + export TARGET_USER HOME_DIR + return 0 + fi + + log "Detecting system users..." + + # 2. 提取系统中所有普通用户 (UID 1000-60000) + mapfile -t HUMAN_USERS < <(awk -F: '$3 >= 1000 && $3 < 60000 {print $1}' /etc/passwd) + + # 3. 核心决策逻辑 + if [[ ${#HUMAN_USERS[@]} -gt 1 ]]; then + echo -e " ${H_YELLOW}>>> Multiple users detected. Who is the target?${NC}" + + local default_user="" + local default_idx="" + + # 遍历用户,生成 1 开始的序号,并捕获当前 Sudo 用户作为默认值 + for i in "${!HUMAN_USERS[@]}"; do + local mark="" + local display_idx=$((i + 1)) + + if [[ "${HUMAN_USERS[$i]}" == "${SUDO_USER:-}" ]]; then + mark="${H_CYAN}*${NC}" + default_user="${HUMAN_USERS[$i]}" + default_idx="$display_idx" + fi + + echo -e " [${display_idx}] ${mark}${HUMAN_USERS[$i]}" + done + + while true; do + # 动态生成提示词 + if [[ -n "$default_user" ]]; then + echo -ne " ${H_CYAN}Select user ID [1-${#HUMAN_USERS[@]}] (Default ${default_idx}): ${NC}" + else + echo -ne " ${H_CYAN}Select user ID [1-${#HUMAN_USERS[@]}]: ${NC}" + fi + + read -r idx + + # 处理直接回车:如果有默认用户,直接采纳 + if [[ -z "$idx" && -n "$default_user" ]]; then + TARGET_USER="$default_user" + log "Defaulting to current user: ${H_CYAN}${TARGET_USER}${NC}" + break + fi + + # 验证输入是否为合法数字 (1 到 数组长度) + if [[ "$idx" =~ ^[0-9]+$ ]] && [ "$idx" -ge 1 ] && [ "$idx" -le "${#HUMAN_USERS[@]}" ]; then + # 数组索引需要减 1 还原 + TARGET_USER="${HUMAN_USERS[$((idx - 1))]}" + break + else + warn "Invalid selection. Please enter a valid number or press Enter for default." + fi + done + + elif [[ ${#HUMAN_USERS[@]} -eq 1 ]]; then + TARGET_USER="${HUMAN_USERS[0]}" + log "Single user detected: ${H_CYAN}${TARGET_USER}${NC}" + + else + if [[ -n "${SUDO_USER:-}" && "$SUDO_USER" != "root" ]]; then + TARGET_USER="$SUDO_USER" + else + echo -ne " ${H_YELLOW}No standard user found. Enter intended username:${NC} " + read -r TARGET_USER + fi + fi + + # 4. 最终验证与持久化 + if [[ -z "$TARGET_USER" ]]; then + error "Target user cannot be empty." + exit 1 + fi + + echo "$TARGET_USER" > "/tmp/shorin_install_user" + HOME_DIR="/home/$TARGET_USER" + export TARGET_USER HOME_DIR + +} + +# 日志文件 +export TEMP_LOG_FILE="/tmp/log-shorin-arch-setup.txt" +[ ! -f "$TEMP_LOG_FILE" ] && touch "$TEMP_LOG_FILE" && chmod 666 "$TEMP_LOG_FILE" + +# --- 2. 基础工具 --- +write_log() { + # Strip ANSI colors for log file + local clean_msg=$(echo -e "$2" | sed 's/\x1b\[[0-9;]*m//g') + echo "[$(date '+%H:%M:%S')] [$1] $clean_msg" >> "$TEMP_LOG_FILE" +} + +# --- 3. 视觉组件 (TUI Style) --- + +# 绘制分割线 +hr() { + printf "${H_GRAY}%*s${NC}\n" "${COLUMNS:-80}" '' | tr ' ' '─' +} + +# 绘制大标题 (Section) +section() { + local title="$1" + local subtitle="$2" + echo "" + echo -e "${H_PURPLE}╭──────────────────────────────────────────────────────────────────────────────╮${NC}" + echo -e "${H_PURPLE}│${NC} ${BOLD}${H_WHITE}$title${NC}" + echo -e "${H_PURPLE}│${NC} ${H_CYAN}$subtitle${NC}" + echo -e "${H_PURPLE}╰──────────────────────────────────────────────────────────────────────────────╯${NC}" + write_log "SECTION" "$title - $subtitle" +} + +# 绘制键值对信息 +info_kv() { + local key="$1" + local val="$2" + local extra="$3" + printf " ${H_BLUE}●${NC} %-15s : ${BOLD}%s${NC} ${DIM}%s${NC}\n" "$key" "$val" "$extra" + write_log "INFO" "$key=$val" +} + +# 普通日志 +log() { + echo -e " $ARROW $1" + write_log "LOG" "$1" +} + +# 成功日志 +success() { + echo -e " $TICK ${H_GREEN}$1${NC}" + write_log "SUCCESS" "$1" +} + +# 警告日志 (突出显示) +warn() { + echo -e " $WARN ${H_YELLOW}${BOLD}WARNING:${NC} ${H_YELLOW}$1${NC}" + write_log "WARN" "$1" +} + +# 错误日志 (非常突出) +error() { + echo -e "" + echo -e "${H_RED} ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓${NC}" + echo -e "${H_RED} ┃ ERROR: $1${NC}" + echo -e "${H_RED} ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛${NC}" + echo -e "" + write_log "ERROR" "$1" +} + +# --- 4. 核心:命令执行器 (Command Exec) --- +exe() { + local full_command="$*" + + # Visual: 显示正在运行的命令 + echo -e " ${H_GRAY}┌──[ ${H_MAGENTA}EXEC${H_GRAY} ]────────────────────────────────────────────────────${NC}" + echo -e " ${H_GRAY}│${NC} ${H_CYAN}$ ${NC}${BOLD}$full_command${NC}" + + write_log "EXEC" "$full_command" + + # Run the command + "$@" + local status=$? + + if [ $status -eq 0 ]; then + echo -e " ${H_GRAY}└──────────────────────────────────────────────────────── ${H_GREEN}OK${H_GRAY} ─┘${NC}" + else + echo -e " ${H_GRAY}└────────────────────────────────────────────────────── ${H_RED}FAIL${H_GRAY} ─┘${NC}" + write_log "FAIL" "Exit Code: $status" + return $status + fi +} + +# 静默执行 +exe_silent() { + "$@" > /dev/null 2>&1 +} + +# --- 5. 可复用逻辑块 --- + +# 动态选择 Flathub 镜像源 (修复版:使用 echo -e 处理颜色变量) +select_flathub_mirror() { + # 1. 索引数组保证顺序 + local names=( + "SJTU (Shanghai Jiao Tong)" + "USTC (Univ of Sci & Tech of China)" + "FlatHub Offical" + ) + + local urls=( + "https://mirror.sjtu.edu.cn/flathub" + "https://mirrors.ustc.edu.cn/flathub" + "https://dl.flathub.org/repo/" + ) + + # 2. 动态计算菜单宽度 (基于无颜色的纯文本) + local max_len=0 + local title_text="Select Flathub Mirror (60s Timeout)" + + max_len=${#title_text} + + for name in "${names[@]}"; do + # 预估显示长度:"[x] Name - Recommended" + local item_len=$((${#name} + 4 + 14)) + if (( item_len > max_len )); then + max_len=$item_len + fi + done + + # 菜单总宽度 + local menu_width=$((max_len + 4)) + + # --- 3. 渲染菜单 (使用 echo -e 确保颜色变量被解析) --- + echo "" + + # 生成横线 + local line_str="" + printf -v line_str "%*s" "$menu_width" "" + line_str=${line_str// /─} + + # 打印顶部边框 + echo -e "${H_PURPLE}╭${line_str}╮${NC}" + + # 打印标题 (计算居中填充) + local title_padding_len=$(( (menu_width - ${#title_text}) / 2 )) + local right_padding_len=$((menu_width - ${#title_text} - title_padding_len)) + + # 生成填充空格 + local t_pad_l=""; printf -v t_pad_l "%*s" "$title_padding_len" "" + local t_pad_r=""; printf -v t_pad_r "%*s" "$right_padding_len" "" + + echo -e "${H_PURPLE}│${NC}${t_pad_l}${BOLD}${title_text}${NC}${t_pad_r}${H_PURPLE}│${NC}" + + # 打印中间分隔线 + echo -e "${H_PURPLE}├${line_str}┤${NC}" + + # 打印选项 + for i in "${!names[@]}"; do + local name="${names[$i]}" + local display_idx=$((i+1)) + + # 1. 构造用于显示的带颜色字符串 + local color_str="" + # 2. 构造用于计算长度的无颜色字符串 + local raw_str="" + + if [ "$i" -eq 0 ]; then + raw_str=" [$display_idx] $name - Recommended" + color_str=" ${H_CYAN}[$display_idx]${NC} ${name} - ${H_GREEN}Recommended${NC}" + else + raw_str=" [$display_idx] $name" + color_str=" ${H_CYAN}[$display_idx]${NC} ${name}" + fi + + # 计算右侧填充空格 + local padding=$((menu_width - ${#raw_str})) + local pad_str=""; + if [ "$padding" -gt 0 ]; then + printf -v pad_str "%*s" "$padding" "" + fi + + # 打印:边框 + 内容 + 填充 + 边框 + echo -e "${H_PURPLE}│${NC}${color_str}${pad_str}${H_PURPLE}│${NC}" + done + + # 打印底部边框 + echo -e "${H_PURPLE}╰${line_str}╯${NC}" + echo "" + + # --- 4. 用户交互 --- + local choice + # 提示符 + read -t 60 -p "$(echo -e " ${H_YELLOW}Enter choice [1-${#names[@]}]: ${NC}")" choice + if [ $? -ne 0 ]; then echo ""; fi + choice=${choice:-1} + + if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 1 ] || [ "$choice" -gt "${#names[@]}" ]; then + log "Invalid choice or timeout. Defaulting to SJTU..." + choice=1 + fi + + local index=$((choice-1)) + local selected_name="${names[$index]}" + local selected_url="${urls[$index]}" + + log "Setting Flathub mirror to: ${H_GREEN}$selected_name${NC}" + + # 执行修改 (仅修改 flathub,不涉及 github) + if exe flatpak remote-modify flathub --url="$selected_url"; then + success "Mirror updated." + else + error "Failed to update mirror." + fi +} + +as_user() { + runuser -u "$TARGET_USER" -- "$@" +} + + +hide_desktop_file() { + local source_file="$1" + local filename=$(basename "$source_file") + local user_dir="$HOME_DIR/.local/share/applications" + local target_file="$user_dir/$filename" + + mkdir -p "$user_dir" + + if [[ -f "$source_file" ]]; then + cp -fv "$source_file" "$target_file" + if grep -q "^NoDisplay=" "$target_file"; then + sed -i 's/^NoDisplay=.*/NoDisplay=true/' "$target_file" + else + echo "NoDisplay=true" >> "$target_file" + fi + chown "$TARGET_USER:" "$target_file" + fi +} + +# 批量执行 +run_hide_desktop_file() { + + local apps_to_hide=( + "avahi-discover.desktop" + "qv4l2.desktop" + "qvidcap.desktop" + "bssh.desktop" + "org.fcitx.Fcitx5.desktop" + "org.fcitx.fcitx5-migrator.desktop" + "xgps.desktop" + "xgpsspeed.desktop" + "gvim.desktop" + "kbd-layout-viewer5.desktop" + "bvnc.desktop" + "yazi.desktop" + "btop.desktop" + "vim.desktop" + "nvim.desktop" + "nvtop.desktop" + "mpv.desktop" + "org.gnome.Settings.desktop" + "thunar-settings.desktop" + "thunar-bulk-rename.desktop" + "thunar-volman-settings.desktop" + "clipse-gui.desktop" + "waypaper.desktop" + "xfce4-about.desktop" + "cmake-gui.desktop" + "assistant.desktop" + "qdbusviewer.desktop" + "linguist.desktop" + "designer.desktop" + "org.kde.drkonqi.coredump.gui.desktop" + "org.kde.kwrite.desktop" + "org.freedesktop.MalcontentControl.desktop" + "org.gnome.Nautilus.desktop" + ) + + echo "正在隐藏不需要的桌面图标..." + + # 用一个 for 循环搞定所有调用 + for app in "${apps_to_hide[@]}"; do + hide_desktop_file "/usr/share/applications/$app" + done + chown -R "$TARGET_USER:" "$HOME_DIR/.local/share/applications" + + echo "图标隐藏完成!" +} + +configure_nautilus_user() { + local sys_file="/usr/share/applications/org.gnome.Nautilus.desktop" + local user_dir="$HOME_DIR/.local/share/applications" + local user_file="$user_dir/org.gnome.Nautilus.desktop" + + # 1. 检查系统文件是否存在 + if [ -f "$sys_file" ]; then + + local need_modify=0 + local env_vars="env" + + # --- 逻辑 1: Niri 检测 (输入法修复) --- + if command -v niri >/dev/null 2>&1; then + # 只要有 niri,就强制使用 fcitx 模块 + env_vars="$env_vars GTK_IM_MODULE=fcitx" + need_modify=1 + log "检测到 Niri 环境,准备注入 GTK_IM_MODULE=fcitx" + fi + + # --- 逻辑 2: 双显卡 NVIDIA 检测 (GSK 渲染修复) --- + local gpu_count=$(lspci | grep -E -i "vga|3d" | wc -l) + local has_nvidia=$(lspci | grep -E -i "nvidia" | wc -l) + + if [ "$gpu_count" -gt 1 ] && [ "$has_nvidia" -gt 0 ]; then + # 叠加 GSK 渲染变量 + env_vars="$env_vars GSK_RENDERER=gl" + need_modify=1 + log "检测到双显卡 NVIDIA,准备注入 GSK_RENDERER=gl" + + # 额外操作: 创建 gsk.conf + local env_conf_dir="$HOME_DIR/.config/environment.d" + if [ ! -f "$env_conf_dir/gsk.conf" ]; then + mkdir -p "$env_conf_dir" + echo "GSK_RENDERER=gl" > "$env_conf_dir/gsk.conf" + # 修复权限 + if [ -n "$TARGET_USER" ]; then + chown -R "$TARGET_USER" "$env_conf_dir" + fi + log "已添加用户级环境变量配置: $env_conf_dir/gsk.conf" + fi + fi + + # --- 3. 执行修改 (如果命中了任意一个逻辑) --- + if [ "$need_modify" -eq 1 ]; then + + # 准备目录并复制 + mkdir -p "$user_dir" + cp "$sys_file" "$user_file" + + # 修复所有者 + if [ -n "$TARGET_USER" ]; then + chown "$TARGET_USER" "$user_file" + fi + + # 修改 Desktop 文件 + # env_vars 此时可能是: + # - "env GTK_IM_MODULE=fcitx" (仅Niri) + # - "env GSK_RENDERER=gl" (仅双显卡) + # - "env GTK_IM_MODULE=fcitx GSK_RENDERER=gl" (两者都有) + sed -i "s|^Exec=|Exec=$env_vars |" "$user_file" + + log "已生成 Nautilus 用户配置: $user_file (参数: $env_vars)" + + fi + fi +} + +force_copy() { + local src="$1" + local target_dir="$2" + + if [[ -z "$src" || -z "$target_dir" ]]; then + warn "force_copy: Missing arguments" + return 1 + fi + + if [[ -d "${src%/}" ]]; then + (cd "$src" && find . -type d) | while read -r d; do + as_user rm -f "$target_dir/$d" 2>/dev/null + done + fi + + exe as_user cp -rf "$src" "$target_dir" +} + + +# ============================================================================== +# check_dm_conflict - 检测现有的显示管理器冲突,并让用户选择是否启用新 DM +# ============================================================================== +# 使用方法: check_dm_conflict +# 结果: 设置全局变量 $SKIP_DM (true/false) +check_dm_conflict() { + local KNOWN_DMS=( + "cdm" "console-tdm" "emptty" "lemurs" "lidm" "loginx" "ly" "nodm" "tbsm" + "entrance-git" "gdm" "lightdm" "lxdm" "plasma-login-manager" "sddm" + "slim" "xorg-xdm" "greetd" + ) + SKIP_DM=false + local DM_FOUND="" + + for dm in "${KNOWN_DMS[@]}"; do + if pacman -Q "$dm" &>/dev/null; then + DM_FOUND="$dm" + break + fi + done + + if [ -n "$DM_FOUND" ]; then + info_kv "Conflict" "${H_RED}$DM_FOUND${NC}" + SKIP_DM=true + else + # read -t 20 等待 20 秒,超时默认 Y + read -t 20 -p "$(echo -e " ${H_CYAN}Enable Display Manager ? [Y/n] (Default Y): ${NC}")" choice || true + if [[ "${choice:-Y}" =~ ^[Yy]$ ]]; then + SKIP_DM=false + else + SKIP_DM=true + fi + fi +} + +# ============================================================================== +# setup_greetd_tuigreet - 安装并配置 greetd + tuigreet +# ============================================================================== +# 使用方法: setup_greetd_tuigreet +setup_greetd_tuigreet() { + log "Installing greetd and tuigreet..." + exe pacman -S --noconfirm --needed greetd greetd-tuigreet + + # 禁用可能存在的默认 getty@tty1,把 TTY1 彻底让给 greetd + systemctl disable getty@tty1.service 2>/dev/null + + # 配置 greetd (覆盖写入 config.toml) + log "Configuring /etc/greetd/config.toml..." + local GREETD_CONF="/etc/greetd/config.toml" + + cat < "$GREETD_CONF" +[terminal] +# 绑定到 TTY1 +vt = 1 + +[default_session] +# 使用 tuigreet 作为前端 +# 自动扫描 /usr/share/wayland-sessions/,支持时间显示、密码星号、记住上次选择 +command = "tuigreet --time --user-menu --remember --remember-user-session --asterisks" +user = "greeter" +EOF + + # 修复 tuigreet 的 --remember 缓存目录权限 + log "Ensuring cache directory permissions for tuigreet..." + mkdir -p /var/cache/tuigreet + chown -R greeter:greeter /var/cache/tuigreet + chmod 755 /var/cache/tuigreet + + # 启用服务 + log "Enabling greetd service..." + systemctl enable greetd.service + + success "greetd with tuigreet frontend has been successfully configured!" +} + +# ============================================================================== +# setup_ly - 安装并配置 ly 显示管理器 +# ============================================================================== +# 功能列表: +# 1. 安装 ly 软件包 +# 2. 禁用其他可能冲突的 TTY 登录服务 (getty/greetd) +# 3. 编辑 /etc/ly/config.ini,开启 Matrix (代码雨) 背景动画 +# 4. 启用 ly.service 开机自启 +# 使用方法: setup_ly +setup_ly() { + log "Installing ly display manager..." + exe pacman -S --noconfirm --needed ly + + # # 配置 ly (非破坏性修改 config.ini) + # log "Configuring /etc/ly/config.ini for Matrix animation..." + # local LY_CONF="/etc/ly/config.ini" + + # if [[ -f "$LY_CONF" ]]; then + # # 使用 sed 精准替换: + # # 1. 将注释掉的或现有的 animation = none 替换为 animation = matrix + # sed -i 's/^[#[:space:]]*animation[[:space:]]*=.*/animation = matrix/' "$LY_CONF" + # else + # log "Warning: $LY_CONF not found! Please check ly installation." + # fi + + # 启用服务 + log "Enabling ly service..." + systemctl enable ly@tty1 + + success "ly display manager with Matrix animation has been successfully configured!" +} \ No newline at end of file diff --git a/scripts/01-base.sh b/scripts/01-base.sh new file mode 100644 index 0000000..e0c7361 --- /dev/null +++ b/scripts/01-base.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# ============================================================================== +# 01-base.sh - Base System Configuration +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/00-utils.sh" + +check_root + +log "Starting Phase 1: Base System Configuration..." + +# ------------------------------------------------------------------------------ +# 1. Set Global Default Editor +# ------------------------------------------------------------------------------ +section "Step 1/6" "Global Default Editor" + +TARGET_EDITOR="vim" + +if command -v nvim &> /dev/null; then + TARGET_EDITOR="nvim" + log "Neovim detected." + elif command -v nano &> /dev/null; then + TARGET_EDITOR="nano" + log "Nano detected." +else + log "Neovim or Nano not found. Installing Vim..." + if ! command -v vim &> /dev/null; then + exe pacman -Syu --noconfirm gvim + fi +fi + +log "Setting EDITOR=$TARGET_EDITOR in /etc/environment..." + +if grep -q "^EDITOR=" /etc/environment; then + exe sed -i "s/^EDITOR=.*/EDITOR=${TARGET_EDITOR}/" /etc/environment +else + # exe handles simple commands, for redirection we wrap in bash -c or just run it + # For simplicity in logging, we just run it and log success + echo "EDITOR=${TARGET_EDITOR}" >> /etc/environment +fi +success "Global EDITOR set to: ${TARGET_EDITOR}" + +# ------------------------------------------------------------------------------ +# 2. Enable 32-bit (multilib) Repository +# ------------------------------------------------------------------------------ +section "Step 2/6" "Multilib Repository" + +if grep -q "^\[multilib\]" /etc/pacman.conf; then + success "[multilib] is already enabled." +else + log "Uncommenting [multilib]..." + # Uncomment [multilib] and the following Include line + exe sed -i "/\[multilib\]/,/Include/"'s/^#//' /etc/pacman.conf + + log "Refreshing database..." + exe pacman -Syu + success "[multilib] enabled." +fi + +# ------------------------------------------------------------------------------ +# 3. Install Base Fonts +# ------------------------------------------------------------------------------ +section "Step 3/6" "Base Fonts" + +log "Installing adobe-source-han-serif-cn-fonts adobe-source-han-sans-cn-fonts , ttf-liberation, emoji..." +exe pacman -S --noconfirm --needed ttf-liberation noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-jetbrains-mono-nerd otf-font-awesome +log "Base fonts installed." + +log "Installing terminus-font..." +# 安装 terminus-font 包 +exe pacman -S --noconfirm --needed terminus-font + +log "Setting font for current session..." +exe setfont ter-v28n + +log "Configuring permanent vconsole font..." +if [ -f /etc/vconsole.conf ] && grep -q "^FONT=" /etc/vconsole.conf; then + exe sed -i 's/^FONT=.*/FONT=ter-v28n/' /etc/vconsole.conf +else + echo "FONT=ter-v28n" >> /etc/vconsole.conf +fi + +log "Restarting systemd-vconsole-setup..." +exe systemctl restart systemd-vconsole-setup + +success "TTY font configured (ter-v28n)." +# ------------------------------------------------------------------------------ +# 4. Configure archlinuxcn Repository +# ------------------------------------------------------------------------------ +section "Step 4/6" "ArchLinuxCN Repository" + +if grep -q "\[archlinuxcn\]" /etc/pacman.conf; then + success "archlinuxcn repository already exists." +else + log "Adding archlinuxcn mirrors to pacman.conf..." + + # Timezone check: KISS approach, works reliably inside arch-chroot and host system + LOCAL_TZ="" + if [ -L /etc/localtime ]; then + LOCAL_TZ=$(readlink -f /etc/localtime) + fi + + echo "" >> /etc/pacman.conf + echo "[archlinuxcn]" >> /etc/pacman.conf + + if [[ "$LOCAL_TZ" == *"Asia/Shanghai"* ]]; then + log "Timezone is Asia/Shanghai. Applying mainland mirrors..." + cat <> /etc/pacman.conf +Server = https://mirrors.ustc.edu.cn/archlinuxcn/\$arch +Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/\$arch +Server = https://mirrors.hit.edu.cn/archlinuxcn/\$arch +Server = https://repo.huaweicloud.com/archlinuxcn/\$arch +EOT + else + log "Non-Shanghai timezone detected. Prepending global repo.archlinuxcn.org mirror..." + cat <> /etc/pacman.conf +Server = https://repo.archlinuxcn.org/\$arch +Server = https://mirrors.ustc.edu.cn/archlinuxcn/\$arch +Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/\$arch +Server = https://mirrors.hit.edu.cn/archlinuxcn/\$arch +Server = https://repo.huaweicloud.com/archlinuxcn/\$arch +EOT + fi + success "Mirrors added based on timezone." +fi + +log "Installing archlinuxcn-keyring..." +# Keyring installation often needs -Sy specifically, but -Syu is safe too +exe pacman -Syu --noconfirm archlinuxcn-keyring +success "ArchLinuxCN configured." +# ------------------------------------------------------------------------------ +# 5. Install AUR Helpers +# ------------------------------------------------------------------------------ +section "Step 5/6" "AUR Helpers" + +log "Installing yay and paru..." +exe pacman -S --noconfirm --needed base-devel yay paru +success "Helpers installed." + +# ------------------------------------------------------------------------------ +# 6. Configure NetworkManager Backend (iwd) +# ------------------------------------------------------------------------------ +section "Step 6/6" "Network Backend (iwd)" + +# Check if NetworkManager is installed before attempting configuration +if pacman -Qi networkmanager &> /dev/null; then + log "NetworkManager detected. Proceeding with iwd backend configuration..." + + log "Configuring NetworkManager to use iwd backend..." + exe pacman -S --noconfirm --needed iwd impala + exe systemctl enable iwd + # Ensure directory exists + if [ ! -d /etc/NetworkManager/conf.d ]; then + mkdir -p /etc/NetworkManager/conf.d + fi + if [ -f /etc/NetworkManager/conf.d/wifi_backend.conf ];then + rm /etc/NetworkManager/conf.d/wifi_backend.conf + fi + if [ ! -f /etc/NetworkManager/conf.d/iwd.conf ];then + echo -e "[device]\nwifi.backend=iwd" >> /etc/NetworkManager/conf.d/iwd.conf + rm -rfv /etc/NetworkManager/system-connections/* + fi + log "Notice: NetworkManager restart deferred. Changes will apply after reboot." + success "Network backend configured (iwd)." +else + log "NetworkManager not found. Skipping iwd configuration." +fi + +# ------------------------------------------------------------------------------ + +log "Module 01 completed." \ No newline at end of file diff --git a/scripts/02-musthave.sh b/scripts/02-musthave.sh new file mode 100644 index 0000000..dcc8bad --- /dev/null +++ b/scripts/02-musthave.sh @@ -0,0 +1,186 @@ +#!/bin/bash + +# ============================================================================== +# 02-musthave.sh - Essential Software, Drivers & Locale +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/00-utils.sh" + +check_root + +log ">>> Starting Phase 2: Essential (Must-have) Software & Drivers" + +# ------------------------------------------------------------------------------ +# 1. Btrfs Assistants & GRUB Snapshot Integration +# ------------------------------------------------------------------------------ +section "Step 1/8" "Btrfs Snapshot Integration" + +ROOT_FSTYPE=$(findmnt -n -o FSTYPE /) +if [ "$ROOT_FSTYPE" == "btrfs" ]; then + log "Btrfs detected. Installing advanced snapshot management tools..." + + exe pacman -S --noconfirm --needed btrfs-assistant xorg-xhost grub-btrfs inotify-tools less + success "Btrfs helper tools installed." + + if [ -f "/etc/default/grub" ] && command -v grub-mkconfig >/dev/null 2>&1; then + log "Integrating snapshots into GRUB menu..." + + # 重新计算 Btrfs 内部的 boot 路径 + SUBVOL_NAME=$(findmnt -n -o OPTIONS / | tr ',' '\n' | grep '^subvol=' | cut -d= -f2) + if [ "$SUBVOL_NAME" == "/" ] || [ -z "$SUBVOL_NAME" ]; then + BTRFS_BOOT_PATH="/boot/grub" + else + [[ "$SUBVOL_NAME" != /* ]] && SUBVOL_NAME="/${SUBVOL_NAME}" + BTRFS_BOOT_PATH="${SUBVOL_NAME}/boot/grub" + fi + + # 修改 grub-btrfs 的跨区搜索路径 + if [ -f "/etc/default/grub-btrfs/config" ]; then + log "Patching grub-btrfs config for Btrfs search path..." + sed -i "s|^#*GRUB_BTRFS_GBTRFS_SEARCH_DIRNAME=.*|GRUB_BTRFS_GBTRFS_SEARCH_DIRNAME=\"${BTRFS_BOOT_PATH}\"|" /etc/default/grub-btrfs/config + fi + + # 开启监听服务并重新生成菜单(这次菜单里就会多出 Snapshots 选项了!) + exe systemctl enable --now grub-btrfsd + log "Regenerating GRUB Config with Snapshot entries..." + exe grub-mkconfig -o /boot/grub/grub.cfg + success "GRUB snapshot menu integration completed." + fi +else + log "Root is not Btrfs. Skipping Btrfs tool installation." +fi + +# ------------------------------------------------------------------------------ +# 2. Audio & Video +# ------------------------------------------------------------------------------ +section "Step 2/8" "Audio & Video" + +log "Installing firmware..." +exe pacman -S --noconfirm --needed sof-firmware alsa-ucm-conf alsa-firmware + +log "Installing Pipewire stack..." +exe pacman -S --noconfirm --needed pipewire lib32-pipewire wireplumber pipewire-pulse pipewire-alsa pipewire-jack + +exe systemctl --global enable pipewire pipewire-pulse wireplumber +success "Audio setup complete." + +# ------------------------------------------------------------------------------ +# 3. Locale +# ------------------------------------------------------------------------------ +section "Step 3/8" "Locale Configuration" + +# 标记是否需要重新生成 +NEED_GENERATE=false + +# --- 1. 检测 en_US.UTF-8 --- +if locale -a | grep -iq "en_US.utf8"; then + success "English locale (en_US.UTF-8) is active." +else + log "Enabling en_US.UTF-8..." + # 使用 sed 取消注释 + sed -i 's/^#\s*en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen + NEED_GENERATE=true +fi + +# --- 2. 检测 zh_CN.UTF-8 --- +if locale -a | grep -iq "zh_CN.utf8"; then + success "Chinese locale (zh_CN.UTF-8) is active." +else + log "Enabling zh_CN.UTF-8..." + # 使用 sed 取消注释 + sed -i 's/^#\s*zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen + NEED_GENERATE=true +fi + +# --- 3. 如果有修改,统一执行生成 --- +if [ "$NEED_GENERATE" = true ]; then + log "Generating locales (this may take a moment)..." + if exe locale-gen; then + success "Locales generated successfully." + else + error "Locale generation failed." + fi +else + success "All locales are already up to date." +fi + +# ------------------------------------------------------------------------------ +# 4. Input Method +# ------------------------------------------------------------------------------ +section "Step 4/8" "Input Method (Fcitx5)" + +# chinese-addons备用,ice为主 +exe pacman -S --noconfirm --needed fcitx5-im fcitx5-rime rime-ice-git + +success "Fcitx5 installed." + +# ------------------------------------------------------------------------------ +# 5. Bluetooth (Smart Detection) +# ------------------------------------------------------------------------------ +section "Step 5/8" "Bluetooth" + +# Ensure detection tools are present +log "Detecting Bluetooth hardware..." +exe pacman -S --noconfirm --needed usbutils pciutils + +BT_FOUND=false + +# 1. Check USB +if lsusb | grep -qi "bluetooth"; then BT_FOUND=true; fi +# 2. Check PCI +if lspci | grep -qi "bluetooth"; then BT_FOUND=true; fi +# 3. Check RFKill +if rfkill list bluetooth >/dev/null 2>&1; then BT_FOUND=true; fi + +if [ "$BT_FOUND" = true ]; then + info_kv "Hardware" "Detected" + + log "Installing Bluez " + exe pacman -S --noconfirm --needed bluez bluetui + + exe systemctl enable --now bluetooth + success "Bluetooth service enabled." +else + info_kv "Hardware" "Not Found" + warn "No Bluetooth device detected. Skipping installation." +fi + +# ------------------------------------------------------------------------------ +# 6. Power +# ------------------------------------------------------------------------------ +section "Step 6/8" "Power Management" + +exe pacman -S --noconfirm --needed power-profiles-daemon +exe systemctl enable --now power-profiles-daemon +success "Power profiles daemon enabled." + +# ------------------------------------------------------------------------------ +# 7. Fastfetch +# ------------------------------------------------------------------------------ +section "Step 7/8" "Fastfetch" + +exe pacman -S --noconfirm --needed fastfetch gdu btop cmatrix lolcat sl +success "Fastfetch installed." + +log "Module 02 completed." + +# ------------------------------------------------------------------------------ +# 9. flatpak +# ------------------------------------------------------------------------------ + +exe pacman -S --noconfirm --needed flatpak +exe flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo + +CURRENT_TZ=$(readlink -f /etc/localtime) +IS_CN_ENV=false +if [[ "$CURRENT_TZ" == *"Shanghai"* ]] || [ "$CN_MIRROR" == "1" ] || [ "$DEBUG" == "1" ]; then + IS_CN_ENV=true + info_kv "Region" "China Optimization Active" +fi + +if [ "$IS_CN_ENV" = true ]; then + select_flathub_mirror +else + log "Using Global Sources." +fi diff --git a/scripts/02a-dualboot-fix.sh b/scripts/02a-dualboot-fix.sh new file mode 100644 index 0000000..de247a3 --- /dev/null +++ b/scripts/02a-dualboot-fix.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# ============================================================================== +# Script: 02a-dualboot-fix.sh +# Purpose: Auto-configure for Windows dual-boot (OS-Prober only). +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/00-utils.sh" + +check_root + +# --- GRUB Installation Check --- +if ! command -v grub-mkconfig &>/dev/null || [ ! -f "/etc/default/grub" ]; then + warn "GRUB is not detected. Skipping dual-boot configuration." + exit 0 +fi + +# --- Helper Functions --- + +# Sets a GRUB key-value pair. +set_grub_value() { + local key="$1" + local value="$2" + local conf_file="/etc/default/grub" + + local escaped_value + escaped_value=$(printf '%s\n' "$value" | sed 's,[\/&],\\&,g') + + if grep -q -E "^#\s*$key=" "$conf_file"; then + exe sed -i -E "s,^#\s*$key=.*,$key=\"$escaped_value\"," "$conf_file" + elif grep -q -E "^$key=" "$conf_file"; then + exe sed -i -E "s,^$key=.*,$key=\"$escaped_value\"," "$conf_file" + else + log "Appending new key: $key" + echo "$key=\"$escaped_value\"" >> "$conf_file" + fi +} + +# --- Main Script --- + +section "Phase 2A" "Dual-Boot Configuration (Windows)" + +# ------------------------------------------------------------------------------ +# 1. Detect Windows +# ------------------------------------------------------------------------------ +section "Step 1/2" "System Analysis" + +log "Installing dual-boot detection tools (os-prober, exfat-utils)..." +exe pacman -S --noconfirm --needed os-prober exfat-utils + +log "Scanning for Windows installation..." +WINDOWS_DETECTED=$(os-prober | grep -qi "windows" && echo "true" || echo "false") + +if [ "$WINDOWS_DETECTED" != "true" ]; then + log "No Windows installation detected by os-prober." + log "Skipping dual-boot specific configurations." + log "Module 02a completed (Skipped)." + exit 0 +fi + +success "Windows installation detected." + +# --- Check if already configured --- +OS_PROBER_CONFIGURED=$(grep -q -E '^\s*GRUB_DISABLE_OS_PROBER\s*=\s*(false|"false")' /etc/default/grub && echo "true" || echo "false") + +if [ "$OS_PROBER_CONFIGURED" == "true" ]; then + log "Dual-boot settings seem to be already configured." + echo "" + echo -e " ${H_YELLOW}>>> It looks like your dual-boot is already set up.${NC}" + echo "" +fi + +# ------------------------------------------------------------------------------ +# 2. Configure GRUB for Dual-Boot +# ------------------------------------------------------------------------------ +section "Step 2/2" "Enabling OS Prober" + +log "Enabling OS prober to detect Windows..." +set_grub_value "GRUB_DISABLE_OS_PROBER" "false" + +success "Dual-boot settings updated." + +log "Regenerating GRUB configuration..." +if exe grub-mkconfig -o /boot/grub/grub.cfg; then + success "GRUB configuration regenerated successfully." +else + error "Failed to regenerate GRUB configuration." +fi + +log "Module 02a completed." \ No newline at end of file diff --git a/scripts/03-user.sh b/scripts/03-user.sh new file mode 100644 index 0000000..b6081c7 --- /dev/null +++ b/scripts/03-user.sh @@ -0,0 +1,153 @@ +#!/bin/bash + +# ============================================================================== +# 03-user.sh - User Account & Environment Setup (Compatible with detect_target_user) +# ============================================================================== + +# 1. 加载工具集 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +source "$SCRIPT_DIR/00-utils.sh" + +# 2. 检查 Root 权限 +check_root + +# ============================================================================== +# Phase 1: 用户识别与账户同步 +# ============================================================================== +section "Phase 3" "User Account Setup" + + +# 清理缓存 +if [ -f "/tmp/shorin_install_user" ]; then + rm "/tmp/shorin_install_user" +fi +# 调用全局函数,确定目标用户 +detect_target_user + +# 检查系统是否已经真的创建了这个账户 +if id "$TARGET_USER" &>/dev/null; then + success "User '${TARGET_USER}' already exists in the system." + SKIP_CREATION=true +else + log "User '${TARGET_USER}' does not exist. Preparing for creation..." + SKIP_CREATION=false +fi + +# ============================================================================== +# Phase 2: 账户创建、权限与密码配置 +# ============================================================================== +section "Step 2/4" "Account & Privileges" + +if [ "$SKIP_CREATION" = true ]; then + log "Ensuring $TARGET_USER belongs to 'wheel' group..." + if groups "$TARGET_USER" | grep -q "\bwheel\b"; then + success "User is already in 'wheel' group." + else + log "Adding user to 'wheel' group..." + exe usermod -aG wheel "$TARGET_USER" + fi +else + log "Creating new user '${TARGET_USER}'..." + # 使用 -m 创建家目录,-g wheel 加入特权组 + exe useradd -m -G wheel -s /bin/bash "$TARGET_USER" + + log "Setting password for ${TARGET_USER}..." + echo -e " ${H_GRAY}--------------------------------------------------${NC}" + # passwd 必须交互运行 + passwd "$TARGET_USER" + PASSWORD_STATUS=$? + echo -e " ${H_GRAY}--------------------------------------------------${NC}" + + if [ $PASSWORD_STATUS -eq 0 ]; then + success "Password set successfully." + else + error "Failed to set password. Script aborted." + exit 1 + fi +fi + +# 1. 配置 Sudoers +log "Configuring sudoers access..." + +# A. 确保 wheel 组具备基础 sudo 权限 (需要密码) +if grep -q "^# %wheel ALL=(ALL:ALL) ALL" /etc/sudoers; then + exe sed -i 's/^# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers + success "Uncommented %wheel in /etc/sudoers." +elif grep -q "^%wheel ALL=(ALL:ALL) ALL" /etc/sudoers; then + success "Sudo access already enabled." +else + log "Appending %wheel rule to /etc/sudoers..." + echo "%wheel ALL=(ALL:ALL) ALL" >> /etc/sudoers + success "Sudo access configured." +fi + +# B. 配置免密规则 (pacman, systemctl, sudoedit) +SUDO_CONF_FILE="/etc/sudoers.d/10-shorin-nopasswd" +log "Installing specialized NOPASSWD rules..." + +cat << EOF > "$SUDO_CONF_FILE" +# Shorin Setup: Essential tools NOPASSWD for wheel group +%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman, /usr/bin/systemctl, /usr/bin/sudoedit +EOF + +exe chmod 440 "$SUDO_CONF_FILE" +success "Rules installed to $SUDO_CONF_FILE" + +# 2. 配置 Faillock (防止输错密码锁定) +log "Configuring password lockout policy (faillock)..." +FAILLOCK_CONF="/etc/security/faillock.conf" +if [ -f "$FAILLOCK_CONF" ]; then + exe sed -i 's/^#\?\s*deny\s*=.*/deny = 0/' "$FAILLOCK_CONF" + success "Account lockout disabled (deny=0)." +fi + +# ============================================================================== +# Phase 3: 生成 XDG 用户目录 +# ============================================================================== +section "Step 3/4" "User Directories" + +exe pacman -S --noconfirm --needed xdg-user-dirs + +log "Generating XDG user directories..." +# 获取目标用户最新的家目录路径 +REAL_HOME=$(getent passwd "$TARGET_USER" | cut -d: -f6) + +# 强制以该用户身份运行更新 +if exe runuser -u "$TARGET_USER" -- env LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 HOME="$REAL_HOME" xdg-user-dirs-update --force; then + success "Directories created in $REAL_HOME." +else + warn "Failed to generate standard directories." +fi + +# ============================================================================== +# Phase 4: 环境配置 (PATH 与 .local/bin) +# ============================================================================== +section "Step 4/4" "Environment Setup" + +LOCAL_BIN_PATH="$REAL_HOME/.local/bin" +log "Setting up user executable path: $LOCAL_BIN_PATH" + +if exe runuser -u "$TARGET_USER" -- mkdir -p "$LOCAL_BIN_PATH"; then + success "Directory ready." +else + error "Failed to create ~/.local/bin" +fi + +# 配置全局 PATH +PROFILE_SCRIPT="/etc/profile.d/user_local_bin.sh" +cat << 'EOF' > "$PROFILE_SCRIPT" +# Automatically add ~/.local/bin to PATH if it exists +if [ -d "$HOME/.local/bin" ]; then + export PATH="$HOME/.local/bin:$PATH" +fi +EOF +exe chmod 644 "$PROFILE_SCRIPT" +success "PATH optimization script installed." + +# ============================================================================== +# 完成 +# ============================================================================== +hr +success "User setup module for '${TARGET_USER}' completed." +echo "" \ No newline at end of file diff --git a/scripts/03b-gpu-driver.sh b/scripts/03b-gpu-driver.sh new file mode 100644 index 0000000..0e29aa7 --- /dev/null +++ b/scripts/03b-gpu-driver.sh @@ -0,0 +1,211 @@ +#!/bin/bash + +# ============================================================================== +# 03b-gpu-driver.sh GPU Driver Installer 参考了cachyos的chwd脚本 +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# 引用工具库 +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +check_root + +section "Phase 2b" "GPU Driver Setup" + +# ============================================================================== +# 1. 变量声明与基础信息获取 +# ============================================================================== +log "Detecting GPU Hardware..." + +# 核心变量:存放 lspci 信息 +GPU_INFO=$(lspci -mm | grep -E -i "VGA|3D|Display") +log "GPU Info Detected:\n$GPU_INFO" + +# 状态变量初始化 +HAS_AMD=false +HAS_INTEL=false +HAS_NVIDIA=false +GPU_NUMBER=0 +# 待安装包数组 +PKGS=("libva-utils") +# ============================================================================== +# 2. 状态变更 & 基础包追加 (Base Packages) +# ============================================================================== + +# --- AMD 检测 --- -q 静默,-i忽略大小写 +if echo "$GPU_INFO" | grep -q -i "AMD\|ATI"; then + HAS_AMD=true + info_kv "Vendor" "AMD Detected" + # 追加 AMD 基础包 + PKGS+=("mesa" "lib32-mesa" "xf86-video-amdgpu" "vulkan-radeon" "lib32-vulkan-radeon" "linux-firmware-amdgpu" "gst-plugin-va" "opencl-mesa" "lib32-opencl-mesa" "opencl-icd-loader" "lib32-opencl-icd-loader" ) +fi + +# --- Intel 检测 --- +if echo "$GPU_INFO" | grep -q -i "Intel"; then + HAS_INTEL=true + info_kv "Vendor" "Intel Detected" + # 追加 Intel 基础包 (保证能亮机,能跑基础桌面) + PKGS+=("mesa" "vulkan-intel" "lib32-mesa" "lib32-vulkan-intel" "gst-plugin-va" "linux-firmware-intel" "opencl-mesa" "lib32-opencl-mesa" "opencl-icd-loader" "lib32-opencl-icd-loader" ) +fi + +# --- NVIDIA 检测 --- +if echo "$GPU_INFO" | grep -q -i "NVIDIA"; then + HAS_NVIDIA=true + info_kv "Vendor" "NVIDIA Detected" + # 追加 NVIDIA 基础工具包 +fi + +# --- 多显卡检测 --- +GPU_COUNT=$(echo "$GPU_INFO" | grep -c .) + +if [ "$GPU_COUNT" -ge 2 ]; then + info_kv "GPU Layout" "Dual/Multi-GPU Detected (Count: $GPU_COUNT)" + # 安装 vulkan-mesa-layers 以支持 vk-device-select + PKGS+=("vulkan-mesa-layers" "lib32-vulkan-mesa-layers") + + if [[ $HAS_NVIDIA == true ]]; then + PKGS+=("nvidia-prime" "switcheroo-control") + # fix gtk4 issue with nvidia dual gpu + if grep -q "GSK_RENDERER" "/etc/environment"; then + echo 'GSK_RENDERER=gl' >> /etc/environment + fi + fi +fi +# ============================================================================== +# 3. Conditional 包判断 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 3.1 Intel 硬件编解码判断 +# ------------------------------------------------------------------------------ +if [ "$HAS_INTEL" = true ]; then + if echo "$GPU_INFO" | grep -q -E -i "Arc|Xe|UHD|Iris|Raptor|Alder|Tiger|Rocket|Ice|Comet|Coffee|Kaby|Skylake|Broadwell|Gemini|Jasper|Elkhart|HD Graphics 6|HD Graphics 5[0-9][0-9]\b"; then + log " -> Intel: Modern architecture matched (iHD path)..." + PKGS+=("intel-media-driver") + else + warn " -> Intel: Legacy or Unknown model. Skipping intel-media-driver." + fi +fi + +# ------------------------------------------------------------------------------ +# 3.2 NVIDIA 驱动版本与内核 Headers 判断 +# ------------------------------------------------------------------------------ +if [ "$HAS_NVIDIA" = true ]; then + NV_MODEL=$(echo "$GPU_INFO" | grep -i "NVIDIA" | head -n 1) + + # 初始化一个标志位,只有匹配到支持的显卡才设为 true + DRIVER_SELECTED=false + + # ========================================================================== + # nvidia-open + # ========================================================================== + if echo "$NV_MODEL" | grep -q -E -i "RTX|GTX 16"; then + log " -> NVIDIA: Modern GPU detected (Turing+). Using Open Kernel Modules." + + # 核心驱动包 + PKGS+=("nvidia-open-dkms" "nvidia-utils" "lib32-nvidia-utils" "opencl-nvidia" "lib32-opencl-nvidia" "libva-nvidia-driver" "vulkan-icd-loader" "lib32-vulkan-icd-loader" "opencl-icd-loader" "lib32-opencl-icd-loader") + DRIVER_SELECTED=true + + # ========================================================================== + # nvidia-580xx-dkms + # ========================================================================== + elif echo "$NV_MODEL" | grep -q -E -i "GTX 10|GTX 950|GTX 960|GTX 970|GTX 980|GTX 745|GTX 750|GTX 750 Ti|GTX 840M|GTX 845M|GTX 850M|GTX 860M|GTX 950M|GTX 960M|GeForce 830M|GeForce 840M|GeForce 930M|GeForce 940M|GeForce GTX Titan X|Tegra X1|NVIDIA Titan X|NVIDIA Titan Xp|NVIDIA Titan V|NVIDIA Quadro GV100"; then + log " -> NVIDIA: Pascal/Maxwell GPU detected. Using Proprietary DKMS." + PKGS+=("nvidia-580xx-dkms" "nvidia-580xx-utils" "opencl-nvidia-580xx" "lib32-opencl-nvidia-580xx" "lib32-nvidia-580xx-utils" "libva-nvidia-driver" "vulkan-icd-loader" "lib32-vulkan-icd-loader" "opencl-icd-loader" "lib32-opencl-icd-loader" ) + DRIVER_SELECTED=true + + # ========================================================================== + # nvidia-470xx-dkms + # ========================================================================== + elif echo "$NV_MODEL" | grep -q -E -i "GTX 6[0-9][0-9]|GTX 760|GTX 765|GTX 770|GTX 775|GTX 780|GTX 860M|GT 6[0-9][0-9]|GT 710M|GT 720|GT 730M|GT 735M|GT 740|GT 745M|GT 750M|GT 755M|GT 920M|Quadro 410|Quadro K500|Quadro K510|Quadro K600|Quadro K610|Quadro K1000|Quadro K1100|Quadro K2000|Quadro K2100|Quadro K3000|Quadro K3100|Quadro K4000|Quadro K4100|Quadro K5000|Quadro K5100|Quadro K6000|Tesla K10|Tesla K20|Tesla K40|Tesla K80|NVS 510|NVS 1000|Tegra K1|Titan|Titan Z"; then + + log " -> NVIDIA: Kepler GPU detected. Using nvidia-470xx-dkms." + PKGS+=("nvidia-470xx-dkms" "nvidia-470xx-utils" "opencl-nvidia-470xx" "vulkan-icd-loader" "lib32-nvidia-470xx-utils" "lib32-opencl-nvidia-470xx" "lib32-vulkan-icd-loader" "libva-nvidia-driver" "opencl-icd-loader" "lib32-opencl-icd-loader") + DRIVER_SELECTED=true + + # ========================================================================== + # others + # ========================================================================== + else + warn " -> NVIDIA: Legacy GPU detected ($NV_MODEL)." + warn " -> Please manually install GPU driver." + fi + + # ========================================================================== + # headers + # ========================================================================== + if [ "$DRIVER_SELECTED" = true ]; then + log " -> NVIDIA: Scanning installed kernels for headers..." + + # 1. 获取所有以 linux 开头的候选包 + CANDIDATES=$(pacman -Qq | grep "^linux" | grep -vE "headers|firmware|api|docs|tools|utils|qq") + + for kernel in $CANDIDATES; do + # 2. 验证:只有在 /boot 下存在对应 vmlinuz 文件的才算是真内核 + if [ -f "/boot/vmlinuz-${kernel}" ]; then + HEADER_PKG="${kernel}-headers" + log " + Kernel found: $kernel -> Adding $HEADER_PKG" + PKGS+=("$HEADER_PKG") + fi + done + fi +fi + +if systemd-detect-virt -q; then + + log "virtualmachine detected" + PKGS+=("spice-vdagent") +fi + +# ============================================================================== +# 4. 执行 +# ============================================================================== + + + +DETECTED_USER=$(awk -F: '$3 == 1000 {print $1}' /etc/passwd) +TARGET_USER="${DETECTED_USER:-$(read -p "Target user: " u && echo $u)}" + +#--------------sudo temp file--------------------# +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" +log "Temp sudo file created..." + +# 定义清理函数:无论脚本是成功结束还是意外中断(Ctrl+C),都确保删除免密文件 +cleanup_sudo() { + if [ -f "$SUDO_TEMP_FILE" ]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +# 注册陷阱:在脚本退出(EXIT)或被中断(INT/TERM)时触发清理 +trap cleanup_sudo EXIT INT TERM + +if [ ${#PKGS[@]} -gt 0 ]; then + # 数组去重 + UNIQUE_PKGS=($(printf "%s\n" "${PKGS[@]}" | sort -u)) + + section "Installation" "Installing Packages" + log "Target Packages: ${UNIQUE_PKGS[*]}" + + # 执行安装 + exe runuser -u "$TARGET_USER" -- yay -S --noconfirm --needed --answerdiff=None --answerclean=None "${UNIQUE_PKGS[@]}" + + log "Enabling services (if supported)..." + systemctl enable --now nvidia-powerd &>/dev/null || true + systemctl enable switcheroo-control.service &>/dev/null || true + systemctl enable nvidia-suspend.service &>/dev/null || true + systemctl enable nvidia-hibernate.service &>/dev/null || true + systemctl enable nvidia-resume.service &>/dev/null || true + success "GPU Drivers processed successfully." +else + warn "No GPU drivers matched or needed." +fi + +log "Module 02b completed." \ No newline at end of file diff --git a/scripts/03c-snapshot-before-desktop.sh b/scripts/03c-snapshot-before-desktop.sh new file mode 100644 index 0000000..221d844 --- /dev/null +++ b/scripts/03c-snapshot-before-desktop.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# ============================================================================== +# 03c-snapshot-before-desktop.sh +# Creates a system snapshot before installing major Desktop Environments. +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 1. 引用工具库 +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +# 2. 权限检查 +check_root + +section "Phase 3c" "System Snapshot" + +# ============================================================================== + +create_checkpoint() { + local MARKER="Before Desktop Environments" + + # 0. 检查 snapper 是否安装 + if ! command -v snapper &>/dev/null; then + warn "Snapper tool not found. Skipping snapshot creation." + return + fi + + # 1. Root 分区快照 + # 检查 root 配置是否存在 + if snapper -c root get-config &>/dev/null; then + # 检查是否已存在同名快照 (避免重复创建) + if snapper -c root list --columns description | grep -Fqx "$MARKER"; then + log "Snapshot '$MARKER' already exists on [root]." + else + log "Creating safety checkpoint on [root]..." + # 使用 --type single 表示这是一个独立的存档点 + snapper -c root create --description "$MARKER" + success "Root snapshot created." + fi + else + warn "Snapper 'root' config not configured. Skipping root snapshot." + fi + + # 2. Home 分区快照 (如果存在 home 配置) + if snapper -c home get-config &>/dev/null; then + if snapper -c home list --columns description | grep -Fqx "$MARKER"; then + log "Snapshot '$MARKER' already exists on [home]." + else + log "Creating safety checkpoint on [home]..." + snapper -c home create --description "$MARKER" + success "Home snapshot created." + fi + fi +} + +# ============================================================================== +# 执行 +# ============================================================================== +# --- Identify User & DM Check --- +log "Identifying target user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +log "Preparing to create restore point..." +create_checkpoint + +HYRPLAND_AUTOSTART="$HOME_DIR/.config/systemd/user/hyprland-autostart.service" +NIRI_AUTOSTART="$HOME_DIR/.config/systemd/user/niri-autostart.service" +if [ -f "$HYPRLAND_AUTOSTART" ]; then + log "Removing existing Hyprland autostart service..." + rm -f "$HYPRLAND_AUTOSTART" +fi +if [ -f "$NIRI_AUTOSTART" ]; then + log "Removing existing Niri autostart service..." + rm -f "$NIRI_AUTOSTART" +fi +log "Module 03c completed." \ No newline at end of file diff --git a/scripts/04-niri-setup.sh b/scripts/04-niri-setup.sh new file mode 100644 index 0000000..b24c67e --- /dev/null +++ b/scripts/04-niri-setup.sh @@ -0,0 +1,617 @@ +#!/bin/bash + +# ============================================================================== +# 04-niri-setup.sh - Niri Desktop (Restored FZF & Robust AUR) +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +source "$SCRIPT_DIR/00-utils.sh" +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" +DEBUG=${DEBUG:-0} +CN_MIRROR=${CN_MIRROR:-0} +UNDO_SCRIPT="$SCRIPT_DIR/de-undochange.sh" + +check_root + +# --- [HELPER FUNCTIONS] --- + + +# 2. Critical Failure Handler (The "Big Red Box") +# 2. Critical Failure Handler (The "Big Red Box") +critical_failure_handler() { + local failed_reason="$1" + trap - ERR + + echo "" + echo -e "\033[0;31m################################################################\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m# CRITICAL INSTALLATION FAILURE DETECTED #\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m# Reason: $failed_reason\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m# OPTIONS: #\033[0m" + echo -e "\033[0;31m# 1. Restore snapshot (Undo changes & Exit) #\033[0m" + echo -e "\033[0;31m# 2. Retry / Re-run script #\033[0m" + echo -e "\033[0;31m# 3. Abort (Exit immediately) #\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m################################################################\033[0m" + echo "" + + while true; do + read -p "Select an option [1-3]: " -r choice + case "$choice" in + 1) + # Option 1: Restore Snapshot + if [ -f "$UNDO_SCRIPT" ]; then + warn "Executing recovery script..." + bash "$UNDO_SCRIPT" + exit 1 + else + error "Recovery script missing! You are on your own." + exit 1 + fi + ;; + 2) + # Option 2: Re-run Script + warn "Restarting installation script..." + echo "-----------------------------------------------------" + sleep 1 + exec "$0" "$@" + ;; + 3) + # Option 3: Exit + warn "User chose to abort." + warn "Please fix the issue manually before re-running." + error "Installation aborted." + exit 1 + ;; + *) + echo "Invalid input. Please enter 1, 2, or 3." + ;; + esac + done +} + +# 3. Robust Package Installation with Retry Loop +ensure_package_installed() { + local pkg="$1" + local context="$2" # e.g., "Repo" or "AUR" + local max_attempts=3 + local attempt=1 + local install_success=false + + # 1. Check if already installed + if pacman -Q "$pkg" &>/dev/null; then + return 0 + fi + + # 2. Retry Loop + while [ $attempt -le $max_attempts ]; do + if [ $attempt -gt 1 ]; then + warn "Retrying '$pkg' ($context)... (Attempt $attempt/$max_attempts)" + sleep 3 # Cooldown + else + log "Installing '$pkg' ($context)..." + fi + + # Try installation + if as_user yay -S --noconfirm --needed --answerdiff=None --answerclean=None "$pkg"; then + install_success=true + break + else + warn "Attempt $attempt/$max_attempts failed for '$pkg'." + fi + + ((attempt++)) + done + + # 3. Final Verification + if [ "$install_success" = true ] && pacman -Q "$pkg" &>/dev/null; then + success "Installed '$pkg'." + else + critical_failure_handler "Failed to install '$pkg' after $max_attempts attempts." + fi +} + +section "Phase 4" "Niri Desktop Environment" + +# ============================================================================== +# STEP 0: Safety Checkpoint +# ============================================================================== + +# Enable Trap +trap 'critical_failure_handler "Script Error at Line $LINENO"' ERR + +# ============================================================================== +# STEP 1: Identify User & DM Check +# ============================================================================== +detect_target_user +info_kv "Target" "$TARGET_USER" + +# DM Check +check_dm_conflict +# ============================================================================== +# STEP 2: Core Components +# ============================================================================== +section "Step 1/9" "Core Components" +PKGS="niri xdg-desktop-portal-gnome fuzzel kitty firefox libnotify mako polkit-gnome" +# 記錄到清單 +echo "$PKGS" >> "$VERIFY_LIST" +exe pacman -S --noconfirm --needed $PKGS + +log "Configuring Firefox Policies..." +POL_DIR="/etc/firefox/policies" +exe mkdir -p "$POL_DIR" +cat << 'EOF' > "$POL_DIR/policies.json" +{ + "policies": { + "Extensions": { + "Install": [ + "https://addons.mozilla.org/firefox/downloads/latest/pywalfox/latest.xpi", + "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi" + ] + } + } +} +EOF +exe chmod 755 "$POL_DIR" && exe chmod 644 "$POL_DIR/policies.json" + +# ============================================================================== +# STEP 3: File Manager +# ============================================================================== +section "Step 2/9" "File Manager" +FM_PKGS1="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" +FM_PKGS2="xdg-desktop-portal-gtk thunar tumbler ffmpegthumbnailer poppler-glib gvfs-smb file-roller thunar-archive-plugin gnome-keyring thunar-volman gvfs-mtp gvfs-gphoto2 webp-pixbuf-loader libgsf" + +# 記錄到清單 +echo "$FM_PKGS1" >> "$VERIFY_LIST" +echo "$FM_PKGS2" >> "$VERIFY_LIST" + +exe pacman -S --noconfirm --needed $FM_PKGS1 +exe pacman -S --noconfirm --needed $FM_PKGS2 + + +# 默认终端处理 +echo "xdg-terminal-exec" >> "$VERIFY_LIST" +exe as_user paru -S --noconfirm --needed xdg-terminal-exec +if ! grep -q "kitty" "$HOME_DIR/.config/xdg-terminals.list"; then + echo 'kitty.desktop' >> "$HOME_DIR/.config/xdg-terminals.list" +fi + +# if [ ! -f /usr/local/bin/gnome-terminal ] || [ -L /usr/local/bin/gnome-terminal ]; then +# exe ln -sf /usr/bin/kitty /usr/local/bin/gnome-terminal +# fi +sudo -u "$TARGET_USER" dbus-run-session gsettings set com.github.stunkymonkey.nautilus-open-any-terminal terminal kitty + +# Nautilus Nvidia/Input Fix +configure_nautilus_user + +section "Step 3/9" "Temp sudo file" + +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" +log "Temp sudo file created..." +# ============================================================================== +# STEP 5: Dependencies (RESTORED FZF) +# ============================================================================== +section "Step 4/9" "Dependencies" +LIST_FILE="$PARENT_DIR/niri-applist.txt" + +# Ensure tools +command -v fzf &>/dev/null || pacman -S --noconfirm fzf >/dev/null 2>&1 + +if [ -f "$LIST_FILE" ]; then + mapfile -t DEFAULT_LIST < <(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | sed 's/#.*//; s/AUR://g' | xargs -n1) + + if [ ${#DEFAULT_LIST[@]} -eq 0 ]; then + warn "App list is empty. Skipping." + PACKAGE_ARRAY=() + else + echo -e "\n ${H_YELLOW}>>> Default installation in 60s. Press ANY KEY to customize...${NC}" + + if read -t 60 -n 1 -s -r; then + # --- [RESTORED] Original FZF Selection Logic --- + clear + log "Loading package list..." + + SELECTED_LINES=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | + sed -E 's/[[:space:]]+#/\t#/' | + fzf --multi \ + --layout=reverse \ + --border \ + --margin=1,2 \ + --prompt="Search Pkg > " \ + --pointer=">>" \ + --marker="* " \ + --delimiter=$'\t' \ + --with-nth=1 \ + --bind 'load:select-all' \ + --bind 'ctrl-a:select-all,ctrl-d:deselect-all' \ + --info=inline \ + --header="[TAB] TOGGLE | [ENTER] INSTALL | [CTRL-D] DE-ALL | [CTRL-A] SE-ALL" \ + --preview "echo {} | cut -f2 -d$'\t' | sed 's/^# //'" \ + --preview-window=down:50%:wrap \ + --color=dark \ + --color=fg+:white,bg+:black \ + --color=hl:blue,hl+:blue:bold \ + --color=header:yellow:bold \ + --color=info:magenta \ + --color=prompt:cyan,pointer:cyan:bold,marker:green:bold \ + --color=spinner:yellow) + + clear + + if [ -z "$SELECTED_LINES" ]; then + warn "User cancelled selection. Installing NOTHING." + PACKAGE_ARRAY=() + else + PACKAGE_ARRAY=() + while IFS= read -r line; do + raw_pkg=$(echo "$line" | cut -f1 -d$'\t' | xargs) + clean_pkg="${raw_pkg#AUR:}" + [ -n "$clean_pkg" ] && PACKAGE_ARRAY+=("$clean_pkg") + done <<<"$SELECTED_LINES" + fi + # ----------------------------------------------- + else + log "Auto-confirming ALL packages." + PACKAGE_ARRAY=("${DEFAULT_LIST[@]}") + fi + fi + + # --- Installation Loop --- + if [ ${#PACKAGE_ARRAY[@]} -gt 0 ]; then + BATCH_LIST=() + AUR_LIST=() + info_kv "Target" "${#PACKAGE_ARRAY[@]} packages scheduled." + # 記錄到清單 (將陣列展開並寫入) + echo "${PACKAGE_ARRAY[@]}" >> "$VERIFY_LIST" + for pkg in "${PACKAGE_ARRAY[@]}"; do + [ "$pkg" == "imagemagic" ] && pkg="imagemagick" + [[ "$pkg" == "AUR:"* ]] && AUR_LIST+=("${pkg#AUR:}") || BATCH_LIST+=("$pkg") + done + + # 1. Batch Install Repo Packages + if [ ${#BATCH_LIST[@]} -gt 0 ]; then + log "Phase 1: Batch Installing Repo Packages..." + as_user yay -Syu --noconfirm --needed --answerdiff=None --answerclean=None "${BATCH_LIST[@]}" || true + + # Verify Each + for pkg in "${BATCH_LIST[@]}"; do + ensure_package_installed "$pkg" "Repo" + done + fi + + # 2. Sequential AUR Install + if [ ${#AUR_LIST[@]} -gt 0 ]; then + log "Phase 2: Installing AUR Packages (Sequential)..." + for pkg in "${AUR_LIST[@]}"; do + ensure_package_installed "$pkg" "AUR" + done + fi + + # Waybar fallback + if ! command -v waybar &>/dev/null; then + warn "Waybar missing. Installing stock..." + exe pacman -S --noconfirm --needed waybar + fi + else + warn "No packages selected." + fi +else + warn "niri-applist.txt not found." +fi + +# ============================================================================== +# STEP 6: Dotfiles (Smart Recursive Symlink) +# ============================================================================== +section "Step 5/9" "Deploying Dotfiles" + +REPO_GITHUB="https://github.com/SHORiN-KiWATA/Shorin-ArchLinux-Guide.git" + +# 1. 仓库位置:放在 .local/share 下,不污染 home 根目录 +DOTFILES_REPO="$HOME_DIR/.local/share/shorin-niri" + +# --- Smart Linking Function --- +# 核心逻辑:只链接“叶子”节点,对于“容器”目录(.config, .local, share)则递归进入 +link_recursive() { + local src_dir="$1" + local dest_dir="$2" + local exclude_list="$3" + + as_user mkdir -p "$dest_dir" + + find "$src_dir" -mindepth 1 -maxdepth 1 -not -path '*/.git*' | while read -r src_path; do + local item_name + item_name=$(basename "$src_path") + + # 0. 排除检查 + if echo "$exclude_list" | grep -qw "$item_name"; then + log "Skipping excluded: $item_name" + continue + fi + + # 1. 判断是否是需要“穿透”的系统目录 + local need_recurse=false + + if [ "$item_name" == ".config" ]; then + need_recurse=true + elif [ "$item_name" == ".local" ]; then + need_recurse=true + # 只有当父目录名字是以 .local 结尾时,才穿透 share (bin 被移除了) + elif [[ "$src_dir" == *".local" ]] && [ "$item_name" == "share" ]; then + need_recurse=true + fi + + if [ "$need_recurse" = true ]; then + # 递归进入:传入当前路径作为新的源和目标 + log " Entering container: $item_name" + link_recursive "$src_path" "$dest_dir/$item_name" "$exclude_list" + else + # 2. 具体的配置文件夹/文件(如 fcitx5, niri, .zshrc, .local/bin) -> 执行链接 + local target_path="$dest_dir/$item_name" + + # 先清理旧的目标(无论是文件、文件夹还是死链) + if [ -e "$target_path" ] || [ -L "$target_path" ]; then + log " Overwriting: $item_name" + as_user rm -rf "$target_path" + fi + + # 创建软链接 + info_kv "Linking" "$item_name -> $dest_dir" + as_user ln -sf "$src_path" "$target_path" + fi + done +} + +# --- Execution --- + +# 1. 准备仓库 +prepare_repository() { + local TARGET_DIRS=("dotfiles" "wallpapers") + local BRANCH_NAME="main" + + # --- 1. 检查是否存在旧仓库 --- + if [ -d "$DOTFILES_REPO" ]; then + if ! as_user git -C "$DOTFILES_REPO" rev-parse --is-inside-work-tree &>/dev/null; then + warn "Found incomplete or broken repository folder. Cleaning up..." + rm -rf "$DOTFILES_REPO" + else + log "Repository already exists. Checking for updates..." + if ! as_user git -C "$DOTFILES_REPO" pull origin "$BRANCH_NAME"; then + warn "Update failed (network issue?), cleaning up..." + rm -rf "$DOTFILES_REPO" + fi + fi + fi + + # --- 2. 初始化新仓库 --- + if [ ! -d "$DOTFILES_REPO" ]; then + log "Initializing Sparse & Shallow Checkout to $DOTFILES_REPO..." + cd "$HOME_DIR" + + # ================= [修改开始:智能安全创建目录] ================= + # 逻辑: + # 1. 优先尝试用 as_user (sudo -u) 创建,这是最干净的。 + # 2. 如果失败,通常是因为父目录 (.local 或 .local/share) 被 Root 占用了。 + # 3. 此时只修正父目录的 Owner (不递归),然后再试。 + + if ! as_user mkdir -p "$DOTFILES_REPO" 2>/dev/null; then + local parent_dir=$(dirname "$DOTFILES_REPO") + log "User creation failed. Fixing parent permissions: $parent_dir" + + # 确保父目录存在,并修正父目录权限 (非递归,瞬间完成) + if [ ! -d "$parent_dir" ]; then + mkdir -p "$parent_dir" + fi + chown "$TARGET_USER:" "$parent_dir" + + # 再次尝试以用户身份创建 + if ! as_user mkdir -p "$DOTFILES_REPO"; then + # 最后的兜底:实在不行就用 Root 创建,然后只修这个新目录的权限 + warn "Fallback to root creation..." + mkdir -p "$DOTFILES_REPO" + chown -R "$TARGET_USER:" "$DOTFILES_REPO" + fi + fi + # ================= [修改结束] ================= + + as_user git -C "$DOTFILES_REPO" init + # 强制将本地分支名设为 main + as_user git -C "$DOTFILES_REPO" branch -m "$BRANCH_NAME" + + as_user git -C "$DOTFILES_REPO" config core.sparseCheckout true + local sparse_file="$DOTFILES_REPO/.git/info/sparse-checkout" + for item in "${TARGET_DIRS[@]}"; do + log " Configuring sparse-checkout: $item" + echo "$item" | as_user tee -a "$sparse_file" >/dev/null + done + + log " Adding remote origin: $REPO_GITHUB" + as_user git -C "$DOTFILES_REPO" remote add origin "$REPO_GITHUB" + + log "Downloading latest snapshot (Github)..." + if ! as_user git -C "$DOTFILES_REPO" pull origin "$BRANCH_NAME" --depth 1 ; then + error "Failed to download dotfiles." + warn "Cleaning up empty directory to prevent errors on retry..." + rm -rf "$DOTFILES_REPO" + critical_failure_handler "Failed to download dotfiles (Sparse+Shallow failed)." + else + # 这里可以保留作为双重保险,或者因为上面已经处理好了权限,这行其实是可选的 + chown -R "$TARGET_USER:" "$DOTFILES_REPO" + + as_user git -C "$DOTFILES_REPO" branch --set-upstream-to=origin/main main + # 这是一个常见痛点:因为 git 也是 sudo -u 运行的,这步是为了防止 git 报错 "dubious ownership" + as_user git config --global --add safe.directory "$DOTFILES_REPO" + success "Repository prepared." + fi + else + log "Dotfiles repo already exists. Skipping clone." + fi +} + +prepare_repository + +# 2. 执行链接 +if [ -d "$DOTFILES_REPO/dotfiles" ]; then + EXCLUDE_LIST="" + if [ "$TARGET_USER" != "shorin" ]; then + EXCLUDE_FILE="$PARENT_DIR/exclude-dotfiles.txt" + if [ -f "$EXCLUDE_FILE" ]; then + log "Loading exclusions..." + EXCLUDE_LIST=$(grep -vE "^\s*#|^\s*$" "$EXCLUDE_FILE" | tr '\n' ' ') + fi + fi + + log "Backing up existing configs..." + as_user tar -czf "$HOME_DIR/config_backup_$(date +%s).tar.gz" -C "$HOME_DIR" .config + + # 调用递归函数:从 dotfiles 根目录开始,目标是 HOME + link_recursive "$DOTFILES_REPO/dotfiles" "$HOME_DIR" "$EXCLUDE_LIST" + + as_user chmod -R +x $HOME_DIR/.local/bin + + # 创建shorin工具的链接 + as_user shorin link + + # --- Post-Process (防止污染 git 的修正) --- + OUTPUT_EXAMPLE_KDL="$HOME_DIR/.config/niri/output-example.kdl" + OUTPUT_KDL="$HOME_DIR/.config/niri/output.kdl" + if [ "$TARGET_USER" != "shorin" ]; then + + as_user touch $OUTPUT_KDL + + # 修复 Bookmarks (转为实体文件并修改) + BOOKMARKS_FILE="$HOME_DIR/.config/gtk-3.0/bookmarks" + REPO_BOOKMARKS="$DOTFILES_REPO/dotfiles/.config/gtk-3.0/bookmarks" + if [ -f "$REPO_BOOKMARKS" ]; then + as_user sed -i "s/shorin/$TARGET_USER/g" "$REPO_BOOKMARKS" + log "Updated GTK bookmarks." + fi + + else + as_user cp "$DOTFILES_REPO/dotfiles/.config/niri/output-example.kdl" "$OUTPUT_KDL" + fi + + # GTK Theme Symlinks (Fix internal links) + GTK4="$HOME_DIR/.config/gtk-4.0" + THEME="$HOME_DIR/.local/share/themes/adw-gtk3-dark/gtk-4.0" + if [ -d "$GTK4" ]; then + as_user rm -f "$GTK4/gtk.css" "$GTK4/gtk-dark.css" + as_user ln -sf "$THEME/gtk-dark.css" "$GTK4/gtk-dark.css" + as_user ln -sf "$THEME/gtk.css" "$GTK4/gtk.css" + fi + + # Flatpak overrides + if command -v flatpak &>/dev/null; then + as_user flatpak override --user --filesystem=xdg-data/themes + as_user flatpak override --user --filesystem="$HOME_DIR/.themes" + as_user flatpak override --user --filesystem=xdg-config/gtk-4.0 + as_user flatpak override --user --filesystem=xdg-config/gtk-3.0 + as_user flatpak override --user --env=GTK_THEME=adw-gtk3-dark + as_user flatpak override --user --filesystem=xdg-config/fontconfig + fi + success "Dotfiles Linked." +else + warn "Dotfiles missing in repo directory." +fi + +# === niri blur ==== +curl -L shorin.xyz/niri-blur-toggle | as_user bash + +# ============================================================================== +# STEP 7: Wallpapers +# ============================================================================== +section "Step 6/9" "Wallpapers" +# 更新引用路径 +if [ -d "$DOTFILES_REPO/wallpapers" ]; then + as_user ln -sf "$DOTFILES_REPO/wallpapers" "$HOME_DIR/Pictures/Wallpapers" + + as_user mkdir -p "$HOME_DIR/Templates" + as_user touch "$HOME_DIR/Templates/new" + echo "#!/bin/bash" | as_user tee "$HOME_DIR/Templates/new.sh" >/dev/null + as_user chmod +x "$HOME_DIR/Templates/new.sh" + success "Installed." +fi + +# === remove gtk bottom ======= +as_user gsettings set org.gnome.desktop.wm.preferences button-layout ":close" +# ============================================================================== +# STEP 8: Hardware Tools +# ============================================================================== +section "Step 7/9" "Hardware" +if pacman -Q ddcutil &>/dev/null; then + gpasswd -a "$TARGET_USER" i2c + lsmod | grep -q i2c_dev || echo "i2c-dev" >/etc/modules-load.d/i2c-dev.conf +fi +if pacman -Q swayosd &>/dev/null; then + systemctl enable --now swayosd-libinput-backend.service >/dev/null 2>&1 +fi +success "Tools configured." + +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file + +rm -f "$SUDO_TEMP_FILE" + + +# === 教程文件 === +log "Copying tutorial file on desktop..." +as_user cp "$PARENT_DIR/resources/必看-shoirn-Niri使用方法.txt" "$HOME_DIR/必看-Shoirn-Niri使用方法.txt" +# ============================================================================== +# STEP 9: Cleanup & Auto-Login +# ============================================================================== +# section "Final" "Cleanup & Boot" +# SVC_DIR="$HOME_DIR/.config/systemd/user" +# SVC_FILE="$SVC_DIR/niri-autostart.service" +# LINK="$SVC_DIR/default.target.wants/niri-autostart.service" + +# if [ "$SKIP_DM" = true ]; then +# log "Auto-login skipped." +# as_user rm -f "$LINK" "$SVC_FILE" +# else +# log "Configuring TTY Auto-login..." +# mkdir -p "/etc/systemd/system/getty@tty1.service.d" +# echo -e "[Service]\nExecStart=\nExecStart=-/sbin/agetty --noreset --noclear --autologin $TARGET_USER - \${TERM}" >"/etc/systemd/system/getty@tty1.service.d/autologin.conf" + +# as_user mkdir -p "$(dirname "$LINK")" +# cat <"$SVC_FILE" +# [Unit] +# Description=Niri Session Autostart +# After=graphical-session-pre.target +# [Service] +# ExecStart=/usr/bin/niri-session +# Restart=on-failure +# [Install] +# WantedBy=default.target +# EOT +# as_user ln -sf "../niri-autostart.service" "$LINK" +# chown -R "$TARGET_USER" "$SVC_DIR" +# success "Enabled." +# fi + + +# ============================================================================== +# STEP 9: Display Manager (greetd + tuigreet) & Cleanup +# ============================================================================== +section "Final" "Cleanup & Boot Configuration" + +# 1. 清理旧的 TTY 自动登录残留(无论是否启用 greetd,旧版残留都应清除) +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi + +trap - ERR +log "Module 04 completed." \ No newline at end of file diff --git a/scripts/04b-kdeplasma-setup.sh b/scripts/04b-kdeplasma-setup.sh new file mode 100644 index 0000000..bed039c --- /dev/null +++ b/scripts/04b-kdeplasma-setup.sh @@ -0,0 +1,435 @@ +#!/bin/bash + +# ============================================================================== +# 06-kdeplasma-setup.sh - KDE Plasma Setup (FZF Menu + Robust Installation) +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +source "$SCRIPT_DIR/00-utils.sh" + +DEBUG=${DEBUG:-0} +CN_MIRROR=${CN_MIRROR:-0} + +check_root + +# 初始化 Verify 列表 +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +# Ensure FZF is installed +if ! command -v fzf &> /dev/null; then + log "Installing dependency: fzf..." + pacman -S --noconfirm fzf >/dev/null 2>&1 +fi + +trap 'echo -e "\n ${H_YELLOW}>>> Operation cancelled by user (Ctrl+C). Skipping...${NC}"' INT + +section "Phase 6" "KDE Plasma Environment" + +# ------------------------------------------------------------------------------ +# 0. Identify Target User & DM Check +# ------------------------------------------------------------------------------ +detect_target_user +info_kv "Target" "$TARGET_USER" + +# 调用 Utils 函数进行冲突检测 (会自动设置 $SKIP_DM 变量) +check_dm_conflict + +# ------------------------------------------------------------------------------ +# 1. Install KDE Plasma Base +# ------------------------------------------------------------------------------ +section "Step 1/5" "Plasma Core" + +log "Installing KDE Plasma Meta & Apps..." +KDE_PKGS="plasma-meta konsole dolphin kate firefox qt6-multimedia-ffmpeg pipewire-jack plasma-login-manager" + +# 注入 Verify 列表 +echo "$KDE_PKGS" >> "$VERIFY_LIST" +exe pacman -S --noconfirm --needed $KDE_PKGS +success "KDE Plasma installed." + +# ------------------------------------------------------------------------------ +# 2. Software Store & Network (Smart Mirror Selection) +# ------------------------------------------------------------------------------ +section "Step 2/5" "Software Store & Network" + +log "Configuring Discover & Flatpak..." + +FLATPAK_PKGS="flatpak flatpak-kcm" +echo "$FLATPAK_PKGS" >> "$VERIFY_LIST" +exe pacman -S --noconfirm --needed $FLATPAK_PKGS + +exe flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo + +# --- Network Detection Logic --- +CURRENT_TZ=$(readlink -f /etc/localtime) +IS_CN_ENV=false + +if [[ "$CURRENT_TZ" == *"Shanghai"* ]]; then + IS_CN_ENV=true + info_kv "Region" "China (Timezone)" +elif [ "$CN_MIRROR" == "1" ]; then + IS_CN_ENV=true + info_kv "Region" "China (Manual Env)" +elif [ "$DEBUG" == "1" ]; then + IS_CN_ENV=true + warn "DEBUG MODE: Forcing China Environment" +fi + +# --- Mirror Configuration --- +if [ "$IS_CN_ENV" = true ]; then + log "Enabling China Optimizations..." + select_flathub_mirror + success "Optimizations Enabled." +else + log "Using Global Official Sources." +fi + +# NOPASSWD for yay +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" + +# ------------------------------------------------------------------------------ +# 3. Install Dependencies (FZF Selection + Retry Logic) +# ------------------------------------------------------------------------------ +section "Step 3/5" "KDE Dependencies" + +LIST_FILE="$PARENT_DIR/kde-applist.txt" +UNDO_SCRIPT="$PARENT_DIR/undochange.sh" + +# --- Critical Failure Handler --- +critical_failure_handler() { + local failed_pkg="$1" + + # Disable trap to prevent loops + trap - ERR + + echo "" + echo -e "\033[0;31m################################################################\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m# CRITICAL INSTALLATION FAILURE DETECTED #\033[0m" + echo -e "\033[0;31m# Package: $failed_pkg #\033[0m" + echo -e "\033[0;31m# Status: Package not found after install attempt. #\033[0m" + echo -e "\033[0;31m# #\033[0m" + echo -e "\033[0;31m# Would you like to restore snapshot (undo changes)? #\033[0m" + echo -e "\033[0;31m################################################################\033[0m" + echo "" + + while true; do + read -p "Execute System Recovery? [y/n]: " -r choice + case "$choice" in + [yY][eE][sS]|[yY]) + if [ -f "$UNDO_SCRIPT" ]; then + warn "Executing recovery script: $UNDO_SCRIPT" + bash "$UNDO_SCRIPT" + exit 1 + else + error "Recovery script not found at: $UNDO_SCRIPT" + exit 1 + fi + ;; + [nN][oO]|[nN]) + warn "User chose NOT to recover. System might be in a broken state." + error "Installation aborted due to failure in: $failed_pkg" + exit 1 + ;; + *) + echo -e "\033[1;33mInvalid input. Please enter 'y' to recover or 'n' to abort.\033[0m" + ;; + esac + done +} + +# --- Verification Function --- +verify_installation() { + local pkg="$1" + if pacman -Q "$pkg" &>/dev/null; then return 0; else return 1; fi +} + +if [ -f "$LIST_FILE" ]; then + + REPO_APPS=() + AUR_APPS=() + + # --------------------------------------------------------- + # 3.1 Countdown Logic + # --------------------------------------------------------- + if ! grep -q -vE "^\s*#|^\s*$" "$LIST_FILE"; then + warn "App list is empty. Skipping." + else + echo "" + echo -e " Selected List: ${BOLD}$LIST_FILE${NC}" + echo -e " ${H_YELLOW}>>> Default installation will start in 60 seconds.${NC}" + echo -e " ${H_CYAN}>>> Press ANY KEY to customize selection...${NC}" + + if read -t 60 -n 1 -s -r; then + USER_INTERVENTION=true + else + USER_INTERVENTION=false + fi + + # --------------------------------------------------------- + # 3.2 FZF Selection Logic + # --------------------------------------------------------- + SELECTED_RAW="" + + if [ "$USER_INTERVENTION" = true ]; then + clear + echo -e "\n Loading package list..." + + # Visual: Name # Description + SELECTED_RAW=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | \ + sed -E 's/[[:space:]]+#/\t#/' | \ + fzf --multi \ + --layout=reverse \ + --border \ + --margin=1,2 \ + --prompt="Search Pkg > " \ + --pointer=">>" \ + --marker="* " \ + --delimiter=$'\t' \ + --with-nth=1 \ + --bind 'load:select-all' \ + --bind 'ctrl-a:select-all,ctrl-d:deselect-all' \ + --info=inline \ + --header="[TAB] TOGGLE | [ENTER] INSTALL | [CTRL-D] DE-ALL | [CTRL-A] SE-ALL" \ + --preview "echo {} | cut -f2 -d$'\t' | sed 's/^# //'" \ + --preview-window=right:45%:wrap:border-left \ + --color=dark \ + --color=fg+:white,bg+:black \ + --color=hl:blue,hl+:blue:bold \ + --color=header:yellow:bold \ + --color=info:magenta \ + --color=prompt:cyan,pointer:cyan:bold,marker:green:bold \ + --color=spinner:yellow) + + clear + + if [ -z "$SELECTED_RAW" ]; then + warn "User cancelled selection. Skipping Step 3." + # Empty arrays + fi + else + log "Timeout reached (60s). Auto-confirming ALL packages." + # Simulate FZF output for consistent processing + SELECTED_RAW=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | sed -E 's/[[:space:]]+#/\t#/') + fi + + # --------------------------------------------------------- + # 3.3 Categorize Selection + # --------------------------------------------------------- + if [ -n "$SELECTED_RAW" ]; then + log "Processing selection..." + while IFS= read -r line; do + # Extract Name (Before TAB) + raw_pkg=$(echo "$line" | cut -f1 -d$'\t' | xargs) + [[ -z "$raw_pkg" ]] && continue + + # Legacy compatibility (imagemagick) + [ "$raw_pkg" == "imagemagic" ] && raw_pkg="imagemagick" + + # Identify AUR vs Repo + if [[ "$raw_pkg" == AUR:* ]]; then + clean_name="${raw_pkg#AUR:}" + AUR_APPS+=("$clean_name") + elif [[ "$raw_pkg" == *"-git" ]]; then + # Implicit AUR if ending in -git (Legacy logic support) + AUR_APPS+=("$raw_pkg") + else + REPO_APPS+=("$raw_pkg") + fi + done <<< "$SELECTED_RAW" + fi + fi + + info_kv "Scheduled" "Repo: ${#REPO_APPS[@]}" "AUR: ${#AUR_APPS[@]}" + + # 注入 FZF 选中的包到 Verify 列表 + echo "${REPO_APPS[@]}" >> "$VERIFY_LIST" + echo "${AUR_APPS[@]}" >> "$VERIFY_LIST" + + # --------------------------------------------------------- + # 3.4 Install Applications + # --------------------------------------------------------- + + # --- A. Install Repo Apps (BATCH MODE) --- + if [ ${#REPO_APPS[@]} -gt 0 ]; then + log "Phase 1: Batch Installing Repository Packages..." + + # Filter installed + REPO_QUEUE=() + for pkg in "${REPO_APPS[@]}"; do + if ! pacman -Qi "$pkg" &>/dev/null; then + REPO_QUEUE+=("$pkg") + fi + done + + if [ ${#REPO_QUEUE[@]} -gt 0 ]; then + # Batch Install + exe runuser -u "$TARGET_USER" -- yay -S --noconfirm --needed --answerdiff=None --answerclean=None "${REPO_QUEUE[@]}" + + # Verify Loop + log "Verifying batch installation..." + for pkg in "${REPO_QUEUE[@]}"; do + if ! verify_installation "$pkg"; then + warn "Verification failed for '$pkg'. Retrying individually..." + exe runuser -u "$TARGET_USER" -- yay -S --noconfirm --needed "$pkg" + + if ! verify_installation "$pkg"; then + critical_failure_handler "$pkg (Repo)" + else + success "Verified: $pkg" + fi + fi + done + success "Batch phase verified." + else + log "All selected repo packages are already installed." + fi + fi + + # --- B. Install AUR Apps (SEQUENTIAL + RETRY) --- + if [ ${#AUR_APPS[@]} -gt 0 ]; then + log "Phase 2: Installing AUR Packages (Sequential)..." + log "Hint: Use Ctrl+C to skip a specific package download step." + + for aur_pkg in "${AUR_APPS[@]}"; do + if pacman -Qi "$aur_pkg" &>/dev/null; then + log "Skipping '$aur_pkg' (Already installed)." + continue + fi + + log "Installing AUR: $aur_pkg ..." + install_success=false + max_retries=2 + + for (( i=0; i<=max_retries; i++ )); do + if [ $i -gt 0 ]; then + warn "Retry $i/$max_retries for '$aur_pkg' in 3 seconds..." + sleep 3 + fi + + runuser -u "$TARGET_USER" -- yay -S --noconfirm --needed --answerdiff=None --answerclean=None "$aur_pkg" + EXIT_CODE=$? + + # Handle Ctrl+C skip + if [ $EXIT_CODE -eq 130 ]; then + warn "Skipped '$aur_pkg' by user request (Ctrl+C)." + break # Skip retries for this package + fi + + if verify_installation "$aur_pkg"; then + install_success=true + success "Installed $aur_pkg" + break + else + warn "Attempt $((i+1)) failed for $aur_pkg" + fi + done + + if [ "$install_success" = false ] && [ $EXIT_CODE -ne 130 ]; then + # Trigger critical failure if not skipped by user + critical_failure_handler "$aur_pkg (AUR)" + fi + done + fi + +else + warn "kde-applist.txt not found." +fi + +# ------------------------------------------------------------------------------ +# 4. Dotfiles Deployment +# ------------------------------------------------------------------------------ +section "Step 4/5" "KDE Config Deployment" + +DOTFILES_SOURCE="$PARENT_DIR/kde-dotfiles" + +if [ -d "$DOTFILES_SOURCE" ]; then + log "Deploying KDE configurations..." + + # 1. Backup Existing .config + BACKUP_NAME="config_backup_kde_$(date +%s).tar.gz" + if [ -d "$HOME_DIR/.config" ]; then + log "Backing up ~/.config to $BACKUP_NAME..." + exe runuser -u "$TARGET_USER" -- tar -czf "$HOME_DIR/$BACKUP_NAME" -C "$HOME_DIR" .config + fi + + # 2. Explicitly Copy .config and .local + + # --- Process .config --- + if [ -d "$DOTFILES_SOURCE/.config" ]; then + log "Merging .config..." + if [ ! -d "$HOME_DIR/.config" ]; then mkdir -p "$HOME_DIR/.config"; fi + + exe cp -rf "$DOTFILES_SOURCE/.config/"* "$HOME_DIR/.config/" 2>/dev/null || true + exe cp -rf "$DOTFILES_SOURCE/.config/." "$HOME_DIR/.config/" 2>/dev/null || true + + log "Fixing permissions for .config..." + exe chown -R "$TARGET_USER" "$HOME_DIR/.config" + fi + + # --- Process .local --- + if [ -d "$DOTFILES_SOURCE/.local" ]; then + log "Merging .local..." + if [ ! -d "$HOME_DIR/.local" ]; then mkdir -p "$HOME_DIR/.local"; fi + + exe cp -rf "$DOTFILES_SOURCE/.local/"* "$HOME_DIR/.local/" 2>/dev/null || true + exe cp -rf "$DOTFILES_SOURCE/.local/." "$HOME_DIR/.local/" 2>/dev/null || true + + log "Fixing permissions for .local..." + exe chown -R "$TARGET_USER" "$HOME_DIR/.local" + fi + + success "KDE Dotfiles applied and permissions fixed." +else + warn "Folder 'kde-dotfiles' not found in repo. Skipping config." +fi + +# ------------------------------------------------------------------------------ +# 4.5 Deploy Resource Files (README) +# ------------------------------------------------------------------------------ +log "Deploying desktop resources..." + +SOURCE_README="$PARENT_DIR/resources/KDE-README.txt" +DESKTOP_DIR="$HOME_DIR/Desktop" + +if [ ! -d "$DESKTOP_DIR" ]; then + exe runuser -u "$TARGET_USER" -- mkdir -p "$DESKTOP_DIR" +fi + +if [ -f "$SOURCE_README" ]; then + log "Copying KDE-README.txt..." + exe cp "$SOURCE_README" "$DESKTOP_DIR/" + exe chown "$TARGET_USER" "$DESKTOP_DIR/KDE-README.txt" + success "Readme deployed." +else + warn "resources/KDE-README.txt not found." +fi + +# ------------------------------------------------------------------------------ +# 5. Enable Display Manager (SDDM) +# ------------------------------------------------------------------------------ +section "Step 5/5" "Enable Display Manager" + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." +else + systemctl enable plasmalogin +fi + +# === 隐藏多余的 Desktop 图标 === +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file +as_user shorin link +# ------------------------------------------------------------------------------ +# Cleanup +# ------------------------------------------------------------------------------ +section "Cleanup" "Restoring State" +rm -f "$SUDO_TEMP_FILE" +success "Done." + +log "Module 06 completed." \ No newline at end of file diff --git a/scripts/04c-dms-quickshell.sh b/scripts/04c-dms-quickshell.sh new file mode 100644 index 0000000..1dcf993 --- /dev/null +++ b/scripts/04c-dms-quickshell.sh @@ -0,0 +1,361 @@ +#!/bin/bash +# 04c-quickshell-setup.sh + +# 1. 引用工具库 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +if [[ -f "$SCRIPT_DIR/00-utils.sh" ]]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found in $SCRIPT_DIR." + exit 1 +fi + +# ============================================================================== +# 核心辅助函数定义 +# ============================================================================== + +# --- 函数:强制安全拷贝(解决覆盖冲突) --- +force_copy() { + local src="$1" + local target_dir="$2" + + if [[ -z "$src" || -z "$target_dir" ]]; then + warn "force_copy: Missing arguments" + return 1 + fi + + local item_name + item_name=$(basename "$src") + + # 只有当拷贝的不是 "目录下的所有内容" (即路径不以 /. 结尾) 时,才执行精确删除 + if [[ "$src" != */. ]]; then + # 清理 target_dir 结尾多余的斜杠或 /. + local clean_target="${target_dir%/}" + clean_target="${clean_target%/.}" + + # 先安全删除目标路径的同名内容,防止目录覆盖文件的冲突 + as_user rm -rf "${clean_target}/${item_name}" + fi + + # 执行安全拷贝 + exe as_user cp -rf "$src" "$target_dir" +} + +# --- 函数:静默删除 niri 绑定 --- +niri_remove_bind() { + local target_key="$1" + local config_file="$HOME_DIR/.config/niri/dms/binds.kdl" + + if [[ ! -f "$config_file" ]]; then + return 1 + fi + + # 使用 Python 处理,无日志,无备份 + python3 -c " +import sys, re + +file_path = '$config_file' +target_key = sys.argv[1] + +try: + with open(file_path, 'r') as f: + content = f.read() + + pattern = re.compile(r'(?m)^\s*(?!//).*?' + re.escape(target_key) + r'(?=\s|\{)') + + while True: + match = pattern.search(content) + if not match: + break + + start_idx = match.start() + open_brace_idx = content.find('{', start_idx) + if open_brace_idx == -1: + break + + balance = 0 + end_idx = -1 + for i in range(open_brace_idx, len(content)): + char = content[i] + if char == '{': + balance += 1 + elif char == '}': + balance -= 1 + if balance == 0: + end_idx = i + 1 + break + + if end_idx != -1: + if end_idx < len(content) and content[end_idx] == '\n': + end_idx += 1 + content = content[:start_idx] + content[end_idx:] + else: + break + + with open(file_path, 'w') as f: + f.write(content) + +except Exception: + pass + " "$target_key" +} + +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +log "Installing DMS..." +# ============================================================================== +# Identify User & DM Check +# ============================================================================== +log "Identifying user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +info_kv "Target" "$TARGET_USER" + +# DM Check +check_dm_conflict + +log "Target user for DMS installation: $TARGET_USER" + +# 下载并执行安装脚本 +INSTALLER_SCRIPT="/tmp/dms_install.sh" +DMS_URL="https://install.danklinux.com" + +log "Downloading DMS installer wrapper..." +if curl -fsSL "$DMS_URL" -o "$INSTALLER_SCRIPT"; then + chmod +x "$INSTALLER_SCRIPT" + chown "$TARGET_USER" "$INSTALLER_SCRIPT" + + log "Executing DMS installer as user ($TARGET_USER)..." + log "NOTE: If the installer asks for input, this script might hang." + pacman -S --noconfirm vulkan-headers + if runuser -u "$TARGET_USER" -- bash -c "cd ~ && $INSTALLER_SCRIPT"; then + success "DankMaterialShell installed successfully." + else + warn "DMS installer returned an error code. You may need to install it manually." + exit 1 + fi + rm -f "$INSTALLER_SCRIPT" +else + warn "Failed to download DMS installer script from $DMS_URL." +fi + + +# ============================================================================== +# dms 随图形化环境自动启动 +# ============================================================================== +section "Config" "dms autostart" + +DMS_AUTOSTART_LINK="$HOME_DIR/.config/systemd/user/niri.service.wants/dms.service" +DMS_NIRI_CONFIG_FILE="$HOME_DIR/.config/niri/config.kdl" +DMS_HYPR_CONFIG_FILE="$HOME_DIR/.config/hypr/hyprland.conf" + +if [[ -L "$DMS_AUTOSTART_LINK" ]]; then + log "Detect DMS systemd service enabled, disabling ...." + rm -f "$DMS_AUTOSTART_LINK" +fi + +DMS_NIRI_INSTALLED="false" +DMS_HYPR_INSTALLED="false" + +if command -v niri &>/dev/null; then + DMS_NIRI_INSTALLED="true" + elif command -v hyprland &>/dev/null; then + DMS_HYPR_INSTALLED="true" +fi + +if [[ "$DMS_NIRI_INSTALLED" == "true" ]]; then + if ! grep -E -q "^[[:space:]]*spawn-at-startup.*dms.*run" "$DMS_NIRI_CONFIG_FILE"; then + log "Enabling DMS autostart in niri config.kdl..." + echo 'spawn-at-startup "dms" "run"' >> "$DMS_NIRI_CONFIG_FILE" + echo 'spawn-at-startup "xhost" "+si:localuser:root"' >> "$DMS_NIRI_CONFIG_FILE" + else + log "DMS autostart already exists in niri config.kdl, skipping." + fi + + elif [[ "$DMS_HYPR_INSTALLED" == "true" ]]; then + log "Configuring Hyprland autostart..." + if ! grep -q "exec-once.*dms run" "$DMS_HYPR_CONFIG_FILE"; then + log "Adding DMS autostart to hyprland.conf" + echo 'exec-once = dms run' >> "$DMS_HYPR_CONFIG_FILE" + echo 'exec-once = xhost +si:localuser:root'>> "$DMS_HYPR_CONFIG_FILE" + else + log "DMS autostart already exists in Hyprland config, skipping." + fi +fi + +# ============================================================================== +# fcitx5 configuration and locale +# ============================================================================== +section "Config" "input method" + +if [[ "$DMS_NIRI_INSTALLED" == "true" ]]; then + if ! grep -q "fcitx5" "$DMS_NIRI_CONFIG_FILE"; then + log "Enabling fcitx5 autostart in niri config.kdl..." + echo 'spawn-at-startup "fcitx5" "-d"' >> "$DMS_NIRI_CONFIG_FILE" + else + log "Fcitx5 autostart already exists, skipping." + fi + + if grep -q "^[[:space:]]*environment[[:space:]]*{" "$DMS_NIRI_CONFIG_FILE"; then + log "Existing environment block found. Injecting fcitx variables..." + if ! grep -q 'XMODIFIERS "@im=fcitx"' "$DMS_NIRI_CONFIG_FILE"; then + sed -i '/^[[:space:]]*environment[[:space:]]*{/a \ LC_CTYPE "en_US.UTF-8"\n XMODIFIERS "@im=fcitx"\n LANG "zh_CN.UTF-8"' "$DMS_NIRI_CONFIG_FILE" + else + log "Environment variables for fcitx already exist, skipping." + fi + else + log "No environment block found. Appending new block..." + cat << EOT >> "$DMS_NIRI_CONFIG_FILE" + +environment { + LC_CTYPE "en_US.UTF-8" + XMODIFIERS "@im=fcitx" + LANGUAGE "zh_CN.UTF-8" + LANG "zh_CN.UTF-8" +} +EOT + fi + + chown -R "$TARGET_USER:" "$PARENT_DIR/quickshell-dotfiles" + + # === [ 核心修复点 ] === + # 精准清除目标路径中会导致冲突的非目录文件(软链接) + as_user rm -rf "$HOME_DIR/.local/share/fcitx5" + as_user rm -rf "$HOME_DIR/.config/fcitx5" + # ======================= + + force_copy "$PARENT_DIR/quickshell-dotfiles/." "$HOME_DIR/" + + elif [[ "$DMS_HYPR_INSTALLED" == "true" ]]; then + if ! grep -q "fcitx5" "$DMS_HYPR_CONFIG_FILE"; then + log "Adding fcitx5 autostart to hyprland.conf" + echo 'exec-once = fcitx5 -d' >> "$DMS_HYPR_CONFIG_FILE" + + cat << EOT >> "$DMS_HYPR_CONFIG_FILE" + +# --- Added by Shorin-Setup Script --- +# Fcitx5 Input Method Variables +env = XMODIFIERS,@im=fcitx +env = LC_CTYPE,en_US.UTF-8 +# Locale Settings +env = LANG,zh_CN.UTF-8 +# ---------------------------------- +EOT + else + log "Fcitx5 configuration already exists in Hyprland config, skipping." + fi + + chown -R "$TARGET_USER:" "$PARENT_DIR/quickshell-dotfiles" + + # === [ 核心修复点 ] === + as_user rm -rf "$HOME_DIR/.local/share/fcitx5" + as_user rm -rf "$HOME_DIR/.config/fcitx5" + # 这里我顺手修正了原本脚本的一个小 Bug: + # 如果 quickshell-dotfiles 包含 .config 和 .local,应复制到 ~ 下,而不是 ~/.config/ 下,否则会变成 ~/.config/.config + force_copy "$PARENT_DIR/quickshell-dotfiles/." "$HOME_DIR/" +fi +# ============================================================================== +# filemanager +# ============================================================================== +section "Config" "file manager" + +if [[ "$DMS_NIRI_INSTALLED" == "true" ]]; then + log "DMS niri detected, configuring nautilus" + FM_PKGS="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal xdg-terminal-exec file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" + echo "$FM_PKGS" >> "$VERIFY_LIST" + exe as_user paru -S --noconfirm --needed $FM_PKGS + # 默认终端处理 + if ! grep -q "kitty" "$HOME_DIR/.config/xdg-terminals.list"; then + echo 'kitty.desktop' >> "$HOME_DIR/.config/xdg-terminals.list" + fi + + # if [ ! -f /usr/local/bin/gnome-terminal ] || [ -L /usr/local/bin/gnome-terminal ]; then + # exe ln -sf /usr/bin/kitty /usr/local/bin/gnome-terminal + # fi + sudo -u "$TARGET_USER" dbus-run-session gsettings set com.github.stunkymonkey.nautilus-open-any-terminal terminal kitty + + as_user mkdir -p "$HOME_DIR/Templates" + as_user touch "$HOME_DIR/Templates/new" + as_user touch "$HOME_DIR/Templates/new.sh" + as_user bash -c "echo '#!/bin/bash' >> '$HOME_DIR/Templates/new.sh'" + chown -R "$TARGET_USER:" "$HOME_DIR/Templates" + + configure_nautilus_user + + + elif [[ "$DMS_HYPR_INSTALLED" == "true" ]]; then + log "DMS hyprland detected, skipping file manager." +fi + +# ============================================================================== +# screenshare +# ============================================================================== +section "Config" "screenshare" + +if [[ "$DMS_NIRI_INSTALLED" == "true" ]]; then + log "DMS niri detected, configuring xdg-desktop-portal" + echo "xdg-desktop-portal-gnome" >> "$VERIFY_LIST" + exe pacman -S --noconfirm --needed xdg-desktop-portal-gnome + if ! grep -q '/usr/lib/xdg-desktop-portal-gnome' "$DMS_NIRI_CONFIG_FILE"; then + log "Configuring environment in niri config.kdl" + echo 'spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri & /usr/lib/xdg-desktop-portal-gnome"' >> "$DMS_NIRI_CONFIG_FILE" + fi + + elif [[ "$DMS_HYPR_INSTALLED" == "true" ]]; then + log "DMS hyprland detected, configuring xdg-desktop-portal" + echo "xdg-desktop-portal-hyprland" >> "$VERIFY_LIST" + exe pacman -S --noconfirm --needed xdg-desktop-portal-hyprland + if ! grep -q '/usr/lib/xdg-desktop-portal-hyprland' "$DMS_HYPR_CONFIG_FILE"; then + log "Configuring environment in hyprland.conf" + echo 'exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=hyprland & /usr/lib/xdg-desktop-portal-hyprland' >> "$DMS_HYPR_CONFIG_FILE" + fi +fi + +# ============================================================================== +# Validation Check: DMS & Core Components (Blackbox Audit) +# ============================================================================== +section "Config" "components validation" +log "Verifying DMS and core components installation..." + +MISSING_COMPONENTS=() + +if ! command -v dms &>/dev/null ; then + MISSING_COMPONENTS+=("dms") +fi +if ! command -v quickshell &>/dev/null; then + MISSING_COMPONENTS+=("quickshell") +fi + +if [[ ${#MISSING_COMPONENTS[@]} -gt 0 ]]; then + error "FATAL: Official DMS installer failed to provide core binaries!" + warn "Missing core commands: ${MISSING_COMPONENTS[*]}" + write_log "FATAL" "DMS Blackbox installation failed. Missing: ${MISSING_COMPONENTS[*]}" + echo -e " ${H_YELLOW}>>> Exiting installer. Please check upstream DankLinux repo or network. ${NC}" + exit 1 +else + success "Blackbox components validated successfully." +fi + +# ============================================================================== +# Dispaly Manager +# ============================================================================== +section "Config" "Dispaly Manager" + +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + setup_ly +fi + +log "Module 04c completed." \ No newline at end of file diff --git a/scripts/04d-gnome.sh b/scripts/04d-gnome.sh new file mode 100644 index 0000000..aab31e5 --- /dev/null +++ b/scripts/04d-gnome.sh @@ -0,0 +1,388 @@ +#!/bin/bash + +# ============================================================================== +# GNOME Setup Script (04d-gnome.sh) - Fixed D-Bus & Extensions & Verify & DMCheck +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +# 检查 utils 脚本 +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +log "Initializing installation..." + +check_root + +# 初始化 Verify 列表 +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +# ============================================================================== +# Identify User & DM Check +# ============================================================================== +detect_target_user +TARGET_UID=$(id -u "$TARGET_USER") + +info_kv "Target User" "$TARGET_USER" +info_kv "Home Dir" "$HOME_DIR" + +# 调用 Utils 函数进行冲突检测 (会自动设置 $SKIP_DM 变量) +check_dm_conflict + +# ================================== +# temp sudo without passwd +# ================================== +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" +log "Temp sudo file created..." + +cleanup_sudo() { + if [ -f "$SUDO_TEMP_FILE" ]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} + +trap cleanup_sudo EXIT INT TERM + +#================================================= +# Step 1: Install base pkgs +#================================================= +section "Step 1" "Install base pkgs" +log "Installing GNOME and base tools..." + +GNOME_BASE_PKGS="gnome-desktop gnome-backgrounds gnome-tweaks gdm ghostty celluloid loupe gnome-control-center bazaar flatpak file-roller nautilus-python firefox nm-connection-editor pacman-contrib dnsmasq ttf-jetbrains-mono-nerd" +echo "$GNOME_BASE_PKGS" >> "$VERIFY_LIST" + +if exe as_user yay -S --noconfirm --needed --answerdiff=None --answerclean=None $GNOME_BASE_PKGS; then + + GNOME_FM_PKGS="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" + echo "$GNOME_FM_PKGS" >> "$VERIFY_LIST" + exe pacman -S --noconfirm --needed $GNOME_FM_PKGS + + log "Packages installed successfully." +else + log "Installation failed." + return 1 +fi + +# Enable Display Manager (GDM) +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." +else + log "Enabling GDM..." + exe systemctl enable gdm.service + success "GDM enabled." +fi + +#================================================= +# Step 2: Set default terminal (修复:加入 D-Bus) +#================================================= +section "Step 2" "Set default terminal" +log "Setting GNOME default terminal to Ghostty..." + +# 使用 sudo -u 切换用户,并启动临时 dbus-launch 以确保 gsettings 生效 +sudo -u "$TARGET_USER" bash < "$ACCOUNT_FILE" < Starting temporary D-Bus session for shortcuts..." + eval \$(dbus-launch --sh-syntax) + trap "kill \$DBUS_SESSION_BUS_PID" EXIT + fi + # ============================================= + + echo " ➜ Applying shortcuts for user: $(whoami)..." + + # 1. 窗口管理 + SCHEMA="org.gnome.desktop.wm.keybindings" + gsettings set \$SCHEMA close "['q']" + gsettings set \$SCHEMA show-desktop "['h']" + gsettings set \$SCHEMA toggle-fullscreen "['f']" + gsettings set \$SCHEMA toggle-maximized "['f']" + + gsettings set \$SCHEMA maximize "[]" + gsettings set \$SCHEMA minimize "[]" + gsettings set \$SCHEMA unmaximize "[]" + + gsettings set \$SCHEMA switch-to-workspace-left "['q']" + gsettings set \$SCHEMA switch-to-workspace-right "['e']" + gsettings set \$SCHEMA move-to-workspace-left "['q']" + gsettings set \$SCHEMA move-to-workspace-right "['e']" + + gsettings set \$SCHEMA switch-applications "['Tab']" + gsettings set \$SCHEMA switch-applications-backward "['Tab']" + gsettings set \$SCHEMA switch-group "['grave']" + gsettings set \$SCHEMA switch-group-backward "['grave']" + + gsettings set \$SCHEMA switch-input-source "[]" + gsettings set \$SCHEMA switch-input-source-backward "[]" + + # 2. Shell 全局 + SCHEMA="org.gnome.shell.keybindings" + gsettings set \$SCHEMA screenshot "['a']" + gsettings set \$SCHEMA screenshot-window "['a']" + gsettings set \$SCHEMA show-screenshot-ui "['a']" + + gsettings set \$SCHEMA toggle-application-view "['g']" + gsettings set \$SCHEMA toggle-quick-settings "['s']" + gsettings set \$SCHEMA toggle-message-tray "[]" + + # 3. 自定义快捷键 + SCHEMA="org.gnome.settings-daemon.plugins.media-keys" + gsettings set \$SCHEMA magnifier "['0']" + gsettings set \$SCHEMA screenreader "[]" + + add_custom() { + local index="\$1" + local name="\$2" + local cmd="\$3" + local bind="\$4" + + local path="/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom\$index/" + local key_schema="org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:\$path" + + gsettings set "\$key_schema" name "\$name" + gsettings set "\$key_schema" command "\$cmd" + gsettings set "\$key_schema" binding "\$bind" + echo "\$path" + } + + # 重置列表以避免冲突 + gsettings set \$SCHEMA custom-keybindings "[]" + + P0=\$(add_custom 0 "openbrowser" "firefox" "b") + P1=\$(add_custom 1 "openterminal" "ghostty" "t") + P2=\$(add_custom 2 "missioncenter" "missioncenter" "grave") + P3=\$(add_custom 3 "opennautilus" "nautilus" "e") + P4=\$(add_custom 4 "editscreenshot" "gradia --screenshot" "s") + P5=\$(add_custom 5 "gnome-control-center" "gnome-control-center" "s") + + CUSTOM_LIST="['\$P0', '\$P1', '\$P2', '\$P3', '\$P4', '\$P5']" + gsettings set \$SCHEMA custom-keybindings "\$CUSTOM_LIST" + + echo " ➜ Shortcuts synced successfully." +EOF + +#================================================= +# Step 5: Extensions +#================================================= +section "Step 5" "Install Extensions" +log "Installing Extensions CLI..." + +EXT_CLI_PKGS="gnome-extensions-cli ttf-jetbrains-maple-mono-nf-xx-xx" +echo "$EXT_CLI_PKGS" >> "$VERIFY_LIST" +sudo -u $TARGET_USER yay -S --noconfirm --needed --answerdiff=None --answerclean=None $EXT_CLI_PKGS + +EXTENSION_LIST=( + "arch-update@RaphaelRochet" + "aztaskbar@aztaskbar.gitlab.com" + "blur-my-shell@aunetx" + "caffeine@patapon.info" + "clipboard-indicator@tudmotu.com" + "color-picker@tuberry" + "desktop-cube@schneegans.github.com" + "fuzzy-application-search@mkhl.codeberg.page" + "lockkeys@vaina.lt" + "middleclickclose@paolo.tranquilli.gmail.com" + "steal-my-focus-window@steal-my-focus-window" + "tilingshell@ferrarodomenico.com" + "user-theme@gnome-shell-extensions.gcampax.github.com" + "kimpanel@kde.org" + "rounded-window-corners@fxgn" + "appindicatorsupport@rgcjonas.gmail.com" +) +log "Downloading extensions..." +sudo -u $TARGET_USER gnome-extensions-cli install "${EXTENSION_LIST[@]}" 2>/dev/null + +section "Step 5.2" "Enable GNOME Extensions" +# 【核心修复】:为启用扩展添加 D-Bus 支持 +sudo -u "$TARGET_USER" bash < Extension \$uuid already enabled." + else + echo " -> Enabling extension: \$uuid" + if [ "\$current_list" = "@as []" ]; then + gsettings set org.gnome.shell enabled-extensions "['\$uuid']" + else + new_list="\${current_list%]}, '\$uuid']" + gsettings set org.gnome.shell enabled-extensions "\$new_list" + fi + fi + } + + # 数组遍历,更整洁 + declare -a ext_array=( + "user-theme@gnome-shell-extensions.gcampax.github.com" + "arch-update@RaphaelRochet" + "aztaskbar@aztaskbar.gitlab.com" + "blur-my-shell@aunetx" + "caffeine@patapon.info" + "clipboard-indicator@tudmotu.com" + "color-picker@tuberry" + "desktop-cube@schneegans.github.com" + "fuzzy-application-search@mkhl.codeberg.page" + "lockkeys@vaina.lt" + "middleclickclose@paolo.tranquilli.gmail.com" + "steal-my-focus-window@steal-my-focus-window" + "tilingshell@ferrarodomenico.com" + "kimpanel@kde.org" + "rounded-window-corners@fxgn" + "appindicatorsupport@rgcjonas.gmail.com" + ) + + for ext in "\${ext_array[@]}"; do + enable_extension "\$ext" + done +EOF + +# 编译扩展 Schema +log "Compiling extension schemas..." +chown -R $TARGET_USER:$TARGET_USER $HOME_DIR/.local/share/gnome-shell/extensions + +sudo -u "$TARGET_USER" bash <> "$VERIFY_LIST" +exe sudo -u $TARGET_USER yay -S --noconfirm --needed --answerdiff=None --answerclean=None $FF_GNOME_PKGS + +POL_DIR="/etc/firefox/policies" +exe mkdir -p "$POL_DIR" +echo '{ + "policies": { + "Extensions": { + "Install": [ + "https://addons.mozilla.org/firefox/downloads/latest/gnome-shell-integration/latest.xpi" + ] + } + } +}' > "$POL_DIR/policies.json" +exe chmod 755 "$POL_DIR" && exe chmod 644 "$POL_DIR/policies.json" +log "Firefox policies updated." + +#================================================= +# Nautilus Fix & Input Method +#================================================= +configure_nautilus_user + +section "Step 6" "Input method" +log "Configure input method environment..." +if ! grep -q "fcitx" "/etc/environment" 2>/dev/null; then + cat << EOT >> /etc/environment +XIM="fcitx" +GTK_IM_MODULE=fcitx +QT_IM_MODULE=fcitx +XMODIFIERS=@im=fcitx +XDG_CURRENT_DESKTOP=GNOME +EOT +fi + +#================================================= +# Dotfiles +#================================================= +section "Dotfiles" "Deploying dotfiles" +GNOME_DOTFILES_DIR=$PARENT_DIR/gnome-dotfiles + +log "Ensuring .config exists..." +sudo -u $TARGET_USER mkdir -p $HOME_DIR/.config + +log "Copying dotfiles..." +if [ -d "$GNOME_DOTFILES_DIR" ]; then + cp -rf "$GNOME_DOTFILES_DIR/." "$HOME_DIR/" +else + warn "Dotfiles directory not found: $GNOME_DOTFILES_DIR" +fi + +as_user mkdir -p "$HOME_DIR/Templates" +as_user touch "$HOME_DIR/Templates/new" +# 修复:确保 new.sh 是用户所有,且内容正确 +sudo -u "$TARGET_USER" bash -c "echo '#!/usr/bin/env bash' > $HOME_DIR/Templates/new.sh" +sudo -u "$TARGET_USER" chmod +x "$HOME_DIR/Templates/new.sh" + +log "Fixing permissions..." +chown -R $TARGET_USER: $HOME_DIR/.config +chown -R $TARGET_USER: $HOME_DIR/.local + +if command -v flatpak &>/dev/null; then + sudo -u "$TARGET_USER" flatpak override --user --filesystem=xdg-config/fontconfig +fi + +log "Installing shell tools..." +SHELL_TOOLS_PKGS="thefuck starship eza fish zoxide jq timg imagemagick shorin-contrib-git bat" +echo "$SHELL_TOOLS_PKGS" >> "$VERIFY_LIST" +exe as_user paru -S --noconfirm --needed $SHELL_TOOLS_PKGS + +as_user shorin link + +# === 隐藏多余的 Desktop 图标 === +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file + + +log "Installation Complete! Please reboot." +cleanup_sudo \ No newline at end of file diff --git a/scripts/04e-illogical-impulse-end4-quickshell.sh b/scripts/04e-illogical-impulse-end4-quickshell.sh new file mode 100644 index 0000000..b4184c2 --- /dev/null +++ b/scripts/04e-illogical-impulse-end4-quickshell.sh @@ -0,0 +1,148 @@ +#!/bin/bash +# 04e-illogical-impulse-end4-quickshell.sh + +# 1. 引用工具库 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi +log "installing Illogical Impulse End4 (Quickshell)..." + +# ============================================================================== +# Identify User & DM Check +# ============================================================================== +log "Identifying user..." +detect_target_user +info_kv "Target" "$TARGET_USER" + +# DM Check +check_dm_conflict + +log "Target user for End4 installation: $TARGET_USER" +# ============================================================================== +# install +# ============================================================================== +section "Desktop" "illogical-impulse" +# 下载并执行安装脚本 +INSTALLER_SCRIPT="/tmp/end4_install.sh" +II_URL="https://ii.clsty.link/get" + +log "Downloading Illogical Impulse installer wrapper..." +if curl -fsSL "$II_URL" -o "$INSTALLER_SCRIPT"; then + + chmod +x "$INSTALLER_SCRIPT" + chown "$TARGET_USER" "$INSTALLER_SCRIPT" + + log "Executing End4 installer as user ($TARGET_USER)..." + log "NOTE: If the installer asks for input, this script might hang." + + if runuser -u "$TARGET_USER" -- bash -c "cd ~ && $INSTALLER_SCRIPT"; then + success "Illogical Impulse End4 installed successfully." + else + # 安装失败不应该导致整个系统安装退出,所以只警告 + warn "End4 installer returned an error code. You may need to install it manually." + fi + rm -f "$INSTALLER_SCRIPT" +else + warn "Failed to download installer script from $II_URL." +fi +# ============================================================================== +# Input Method & Environment (End4 Config) +# ============================================================================== +section "end4" "Input Method and Environment Configuration" + +# 1. 定义变量与路径 +END4_HYPR_DOT_DIR="$HOME_DIR/.config/hypr" +CUSTOM_DIR="$END4_HYPR_DOT_DIR/custom" +END4_HYPR_CUS_ENV="$CUSTOM_DIR/env.conf" +END4_HYPR_CUS_EXEC="$CUSTOM_DIR/execs.conf" +SOURCE_DOTFILES="$PARENT_DIR/quickshell-dotfiles" + +# 2. 部署配置文件 +if [ -d "$SOURCE_DOTFILES" ]; then + log "Deploying Quickshell dotfiles to $HOME_DIR/.config/..." + chown -R "$TARGET_USER:" "$SOURCE_DOTFILES" + as_user cp -rf "$SOURCE_DOTFILES/." "$HOME_DIR/" +else + warn "Source directory not found: $SOURCE_DOTFILES" + warn "Skipping dotfiles copy." +fi + +# 确保 custom 目录存在 (防止因拷贝未发生而导致后续报错) +if [ ! -d "$CUSTOM_DIR" ]; then + mkdir -p "$CUSTOM_DIR" + log "Created missing directory: $CUSTOM_DIR" +fi + +# 3. 配置环境变量 (env.conf) +# 使用 grep 检查是否已经存在 fcitx 配置,防止重复追加 +if ! grep -q "XMODIFIERS,@im=fcitx" "$END4_HYPR_CUS_ENV" 2>/dev/null; then + log "Injecting Fcitx5 environment variables into env.conf..." + + # 补充了 QT, GTK, SDL 的输入法变量,确保在各种应用中都能唤起输入法 + cat << EOT >> "$END4_HYPR_CUS_ENV" + +# --- Added by Shorin-Setup Script --- +# Fcitx5 Input Method Variables +env = XMODIFIERS,@im=fcitx +env = LC_CTYPE,en_US.UTF-8 +# Locale Settings +env = LANG,zh_CN.UTF-8 +# ---------------------------------- +EOT +else + log "Fcitx5 environment variables already exist in env.conf, skipping." +fi + +# 4. 配置自动启动 (execs.conf) +# 同样检查防止重复添加 +if ! grep -q "^[[:space:]]*exec-once = fcitx5 -d" "$END4_HYPR_CUS_EXEC" 2>/dev/null; then + log "Adding Fcitx5 autostart command to execs.conf..." + + echo "exec-once = fcitx5 -d" >> "$END4_HYPR_CUS_EXEC" + +else + log "Fcitx5 autostart already exists in execs.conf, skipping." +fi + +# 5. 统一修复权限 (Critical Step) +# 必须在所有写入操作完成后执行,确保新追加的内容也属于目标用户 +log "Applying permission fixes for user: $TARGET_USER..." +chown -R "$TARGET_USER" "$HOME_DIR/.config" + +success "End4 input method and environment configured." +# ============================================================================== +# screenshare +# ============================================================================== +section "end4" "Screenshare" +pacman -S --noconfirm --needed xdg-desktop-portal-hyprland + + + +# === 隐藏多余的 Desktop 图标 === +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file + +# ============================================================================== +# autologin +# ============================================================================== +section "Config" "Display Manager" + +# 1. 清理旧的 TTY 自动登录残留(无论是否启用 greetd,旧版残留都应清除) +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi + +log "Module 04e (End4) completed." \ No newline at end of file diff --git a/scripts/04f-ambxst-quickshell.sh b/scripts/04f-ambxst-quickshell.sh new file mode 100644 index 0000000..aa748cb --- /dev/null +++ b/scripts/04f-ambxst-quickshell.sh @@ -0,0 +1,137 @@ +#!/bin/bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +check_root + +# ============================================================================== +# Identify User & DM Check +# ============================================================================== +log "Identifying user..." +DETECTED_USER=$(awk -F: '$3 == 1000 {print $1}' /etc/passwd) +TARGET_USER="${DETECTED_USER:-$(read -p "Target user: " u && echo $u)}" +HOME_DIR="/home/$TARGET_USER" +info_kv "Target" "$TARGET_USER" + +# DM Check +KNOWN_DMS=("gdm" "sddm" "lightdm" "lxdm" "slim" "xorg-xdm" "ly" "greetd" "plasma-login-manager") +SKIP_AUTOLOGIN=false +DM_FOUND="" +for dm in "${KNOWN_DMS[@]}"; do + if pacman -Q "$dm" &>/dev/null; then + DM_FOUND="$dm" + break + fi +done + +if [ -n "$DM_FOUND" ]; then + info_kv "Conflict" "${H_RED}$DM_FOUND${NC}" + SKIP_AUTOLOGIN=true +else + read -t 20 -p "$(echo -e " ${H_CYAN}Enable TTY auto-login? [Y/n] (Default Y): ${NC}")" choice || true + [[ "${choice:-Y}" =~ ^[Yy]$ ]] && SKIP_AUTOLOGIN=false || SKIP_AUTOLOGIN=true +fi + +log "Target user for Noctalia installation: $TARGET_USER" + +# ================================== +# temp sudo without passwd +# ================================== +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" +log "Temp sudo file created..." + +cleanup_sudo() { + if [ -f "$SUDO_TEMP_FILE" ]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM +# ============================================================================== +# install core pkgs +# ============================================================================== +CORE_PKGS=( + "niri" + "xdg-desktop-portal-gnome" + "kitty" + "firefox" + "noctalia-shell" + "qt6-multimedia-ffmpeg" + "polkit-gnome" + "matugen" +) + +exe as_user yay -S --noconfirm --needed --answerdiff=None --answerclean=None "${CORE_PKGS[@]}" + + +# ============================================================================== +# File Manager +# ============================================================================== + +# ============================================================================== +# Dotfiles +# ============================================================================== + +# ============================================================================== +# fcitx5 configuration and locale +# ============================================================================== + +# ============================================================================== +# screenshare +# ============================================================================== + +# ============================================================================== +# tty autologin +# ============================================================================== +section "Config" "tty autostart" + +SVC_DIR="$HOME_DIR/.config/systemd/user" + +# 确保目录存在 +as_user mkdir -p "$SVC_DIR/default.target.wants" +# tty自动登录 +if [ "$SKIP_AUTOLOGIN" = false ]; then + log "Configuring Niri Auto-start (TTY)..." + mkdir -p "/etc/systemd/system/getty@tty1.service.d" + echo -e "[Service]\nExecStart=\nExecStart=-/sbin/agetty --noreset --noclear --autologin $TARGET_USER - \${TERM}" >"/etc/systemd/system/getty@tty1.service.d/autologin.conf" +fi +# =================================================== +# window manager autostart (if don't have any of dm) +# =================================================== +section "Config" "WM autostart" +# 如果安装了niri +if [ "$SKIP_AUTOLOGIN" = false ] && command -v niri &>/dev/null; then + SVC_FILE="$SVC_DIR/niri-autostart.service" + LINK="$SVC_DIR/default.target.wants/niri-autostart.service" + # 创建niri自动登录服务 + cat <"$SVC_FILE" +[Unit] +Description=Niri Session Autostart +After=graphical-session-pre.target +StartLimitIntervalSec=60 +StartLimitBurst=3 +[Service] +ExecStart=/usr/bin/niri-session +Restart=on-failure +RestartSec=2 + +[Install] +WantedBy=default.target + +EOT + # 启用服务 + as_user ln -sf "$SVC_FILE" "$LINK" + # 确保权限 + chown -R "$TARGET_USER" "$SVC_DIR" + success "Niri auto-start enabled" +fi diff --git a/scripts/04g-caelestia-quickshell.sh b/scripts/04g-caelestia-quickshell.sh new file mode 100644 index 0000000..15ee1b9 --- /dev/null +++ b/scripts/04g-caelestia-quickshell.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# ============================================================================== +# 1. Load Utilities +# ============================================================================== +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found." + exit 1 +fi + +section "Start" "Installing Caelestia (Quickshell)..." + +# ============================================================================== +# 2. Identify User & Display Manager Check +# ============================================================================== +log "Identifying target user..." + +# Detect user ID 1000 or prompt manually +detect_target_user + +info_kv "Target User" "$TARGET_USER" +info_kv "Home Dir" "$HOME_DIR" + +check_dm_conflict + +# ============================================================================== +# 3. Temporary Sudo Access +# ============================================================================== +# Grant passwordless sudo temporarily for the installer to run smoothly +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" +log "Privilege escalation: Temporary passwordless sudo enabled." + +cleanup_sudo() { + if [ -f "$SUDO_TEMP_FILE" ]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM + +# ============================================================================== +# 4. Installation (Caelestia) +# ============================================================================== +section "Repo" "Cloning Caelestia Repository" + +CAELESTIA_REPO="https://github.com/caelestia-dots/caelestia.git" +CAELESTIA_DIR="$HOME_DIR/.local/share/caelestia" + +# Clone to .local (Caelestia uses symlinks, not direct copies) +log "Cloning repository to $CAELESTIA_DIR ..." +if [ -d $CAELESTIA_DIR ]; then + warn "Repository clone failed or already exists. Deleting..." + rm -rf "$CAELESTIA_DIR" +fi + +if exe as_user git clone "$CAELESTIA_REPO" "$CAELESTIA_DIR"; then + chown -R $TARGET_USER $CAELESTIA_DIR + log "repo cloned." +fi + +log "Ensuring fish shell is installed..." +exe pacman -Syu --needed --noconfirm fish + +section "Install" "Running Caelestia Installer" + +# Switch to user, go home, and run the installer +if as_user sh -c "cd && fish $CAELESTIA_DIR/install.fish --noconfirm"; then + chown -R $TARGET_USER $HOME_DIR/.config + success "Caelestia installation script completed." +fi + +# ============================================================================== +# 5. Post-Configuration +# ============================================================================== +section "Config" "Locale and Input Method" + +HYPR_CONFIG="$CAELESTIA_DIR/hypr/hyprland.conf" + +# 5.1 Fcitx5 Configuration +if [ -f "$HYPR_CONFIG" ]; then + if ! grep -q "fcitx5" "$HYPR_CONFIG"; then + log "Injecting Fcitx5 config into Hyprland..." + echo "exec-once = fcitx5 -d" >> "$HYPR_CONFIG" + echo "env = LC_CTYPE, en_US.UTF-8" >> "$HYPR_CONFIG" + chown -R "$TARGET_USER:" "$PARENT_DIR/quickshell-dotfiles" + as_user cp -rf "$PARENT_DIR/quickshell-dotfiles/." "$HOME_DIR/" + fi + + # 5.2 Chinese Locale Check + # Fix: Ensure grep reads from input correctly + LOCALE_AVAILABLE=$(locale -a) + if echo "$LOCALE_AVAILABLE" | grep -q "zh_CN.utf8" && ! grep -q "zh_CN" "$HYPR_CONFIG"; then + log "Chinese locale detected. Configuring Hyprland environment..." + echo "env = LANG, zh_CN.UTF-8" >> "$HYPR_CONFIG" + fi +else + warn "Hyprland config file not found: $HYPR_CONFIG" +fi + +success "Post-configuration completed." + +# ============================================================================== +# file manager +# ============================================================================== +section "config" "file manager" + +if ! command -v thunar; then + + exe pacman -S --needed --noconfirm thunar tumbler ffmpegthumbnailer poppler-glib gvfs-smb file-roller thunar-archive-plugin gnome-keyring polkit-gnome + +fi + +# === 隐藏多余的 Desktop 图标 === +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file + +# ============================================================================== +# 6. dispaly manager +# ============================================================================== +section "Config" "Display Manager" + +# 1. 清理旧的 TTY 自动登录残留(无论是否启用 greetd,旧版残留都应清除) +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi + +section "End" "Module 04e (Caelestia) Completed" \ No newline at end of file diff --git a/scripts/04h-shorindms-quickshell.sh b/scripts/04h-shorindms-quickshell.sh new file mode 100644 index 0000000..0f33fcf --- /dev/null +++ b/scripts/04h-shorindms-quickshell.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash + +# --- Import Utilities --- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [[ -f "$SCRIPT_DIR/00-utils.sh" ]]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found in $SCRIPT_DIR." + exit 1 +fi + +check_root +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" # 确保每次运行生成全新的订单 + +# --- Identify User & DM Check --- +log "Identifying target user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +info_kv "Target User" "$TARGET_USER" + +check_dm_conflict + +# --- Temporary Sudo Privileges --- +log "Granting temporary sudo privileges..." +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" + +cleanup_sudo() { + if [[ -f "$SUDO_TEMP_FILE" ]]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM + +# --- Installation: Core Components --- +AUR_HELPER="paru" +section "Shorin DMS" "Core Components" +log "Installing core shell components..." +CORE_PKGS="quickshell-git dms-shell-bin niri xwayland-satellite kitty xdg-desktop-portal-gnome niri-sidebar-git nwg-look cava cliphist wl-clipboard dgop dsearch-bin qt5-multimedia satty mpv cups-pk-helper kimageformats" + +echo "$CORE_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $CORE_PKGS + +# --- Dotfiles & Wallpapers --- +section "Shorin DMS" "Dotfiles & Wallpapers" +log "Deploying user dotfiles..." +DOTFILES_SRC="$PARENT_DIR/dms-dotfiles" +chown -R "$TARGET_USER:" "$DOTFILES_SRC" +force_copy "$DOTFILES_SRC/." "$HOME_DIR" + +log "Deploying wallpapers..." +WALLPAPER_SOURCE_DIR="$PARENT_DIR/resources/Wallpapers" +WALLPAPER_DIR="$HOME_DIR/Pictures/Wallpapers" +chown -R "$TARGET_USER:" "$WALLPAPER_SOURCE_DIR" +as_user mkdir -p "$WALLPAPER_DIR" +force_copy "$WALLPAPER_SOURCE_DIR/." "$WALLPAPER_DIR/" + +# --- File Manager & Terminal Setup --- +section "Shorin DMS" "File Manager & Terminal" + +log "Installing Nautilus, Thunar and dependencies..." +FM_PKGS1="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" +FM_PKGS2="xdg-desktop-portal-gtk thunar tumbler ffmpegthumbnailer poppler-glib gvfs-smb file-roller thunar-archive-plugin gnome-keyring thunar-volman gvfs-mtp gvfs-gphoto2 webp-pixbuf-loader libgsf" + +echo "$FM_PKGS1" >> "$VERIFY_LIST" +echo "$FM_PKGS2" >> "$VERIFY_LIST" + +exe pacman -S --noconfirm --needed $FM_PKGS1 +exe as_user "$AUR_HELPER" -S --noconfirm --needed $FM_PKGS2 + +log "Installing terminal utilities..." +TERM_PKGS="xdg-terminal-exec bat fuzzel wf-recorder wl-screenrec-git ttf-jetbrains-maple-mono-nf-xx-xx eza zoxide starship jq fish libnotify timg imv cava imagemagick wl-clipboard cliphist shorin-contrib-git slurp" + +echo "$TERM_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $TERM_PKGS + +# shorin-contrib +as_user shorin link + +log "Configuring default terminal and templates..." +# 默认终端处理 +if ! grep -q "kitty" "$HOME_DIR/.config/xdg-terminals.list"; then + echo 'kitty.desktop' >> "$HOME_DIR/.config/xdg-terminals.list" +fi + +# if [ ! -f /usr/local/bin/gnome-terminal ] || [ -L /usr/local/bin/gnome-terminal ]; then +# exe ln -sf /usr/bin/kitty /usr/local/bin/gnome-terminal +# fi +sudo -u "$TARGET_USER" dbus-run-session gsettings set com.github.stunkymonkey.nautilus-open-any-terminal terminal kitty + +as_user mkdir -p "$HOME_DIR/Templates" +as_user touch "$HOME_DIR/Templates/new" "$HOME_DIR/Templates/new.sh" +as_user bash -c "echo '#!/usr/bin/env bash' >> '$HOME_DIR/Templates/new.sh'" +chown -R "$TARGET_USER:" "$HOME_DIR/Templates" + +log "Applying Nautilus bugfixes and bookmarks..." +configure_nautilus_user +as_user sed -i "s/shorin/$TARGET_USER/g" "$HOME_DIR/.config/gtk-3.0/bookmarks" + +# --- Flatpak & Theme Integration --- +section "Shorin DMS" "Flatpak & Theme Integration" + +if command -v flatpak &>/dev/null; then + log "Configuring Flatpak overrides and themes..." + echo "bazaar" >> "$VERIFY_LIST" + exe as_user "$AUR_HELPER" -S --noconfirm --needed bazaar + as_user flatpak override --user --filesystem=xdg-data/themes + as_user flatpak override --user --filesystem="$HOME_DIR/.themes" + as_user flatpak override --user --filesystem=xdg-config/gtk-4.0 + as_user flatpak override --user --filesystem=xdg-config/gtk-3.0 + as_user flatpak override --user --env=GTK_THEME=adw-gtk3-dark + as_user flatpak override --user --filesystem=xdg-config/fontconfig + as_user ln -sf /usr/share/themes "$HOME_DIR/.local/share/themes" +fi + +# === update module === +if command -v kitty &>/dev/null; then + exe ln -sf /usr/bin/kitty /usr/local/bin/xterm +fi + +log "Installing theme components and browser..." +THEME_PKGS="matugen adw-gtk-theme python-pywalfox firefox nwg-look" +echo "$THEME_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $THEME_PKGS + +log "Configuring Firefox Pywalfox policy..." +POL_DIR="/etc/firefox/policies" +exe mkdir -p "$POL_DIR" +cat << 'EOF' > "$POL_DIR/policies.json" +{ + "policies": { + "Extensions": { + "Install": [ + "https://addons.mozilla.org/firefox/downloads/latest/pywalfox/latest.xpi", + "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi" + ] + } + } +} +EOF +exe chmod 755 "$POL_DIR" +exe chmod 644 "$POL_DIR/policies.json" + +# --- Desktop Cleanup & Tutorials --- +section "Config" "Desktop Cleanup" +log "Hiding unnecessary .desktop icons..." +run_hide_desktop_file + +log "Copying tutorial files..." +force_copy "$PARENT_DIR/resources/必看-Shorin-DMS-Niri使用方法.txt" "$HOME_DIR" + +# niri blur toggle 脚本 +curl -L shorin.xyz/niri-blur-toggle | as_user bash + +# --- Finalization & Auto-Login --- +section "Final" "Auto-Login & Cleanup" +rm -f "$SUDO_TEMP_FILE" + +# 1. 清理旧的 TTY 自动登录残留(无论是否启用 greetd,旧版残留都应清除) +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi \ No newline at end of file diff --git a/scripts/04i-shorin-hyprniri-quickshell.sh b/scripts/04i-shorin-hyprniri-quickshell.sh new file mode 100644 index 0000000..be3720c --- /dev/null +++ b/scripts/04i-shorin-hyprniri-quickshell.sh @@ -0,0 +1,219 @@ +#!/usr/bin/env bash + +# --- Import Utilities --- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [[ -f "$SCRIPT_DIR/00-utils.sh" ]]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found in $SCRIPT_DIR." + exit 1 +fi + +check_root + +# ======================================================================== +# 初始化验证清单 +# ======================================================================== +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +# --- Identify User & DM Check --- +log "Identifying target user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +info_kv "Target User" "$TARGET_USER" +check_dm_conflict + +# --- Temporary Sudo Privileges --- +log "Granting temporary sudo privileges..." +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" + +cleanup_sudo() { + if [[ -f "$SUDO_TEMP_FILE" ]]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM + +# ======================================================================== +# exec +# ======================================================================== + +AUR_HELPER="paru" + +# --- Installation: Core Components --- +section "Shorin Hyprniri" "Core Components & Utilities" + +# 清理可能冲突的依赖 +declare -a target_pkgs=( + "hyprcursor-git" + "hyprgraphics-git" + "hyprland-git" + "hyprland-guiutils-git" + "hyprlang-git" + "hyprlock-git" + "hyprpicker-git" + "hyprtoolkit-git" + "hyprutils-git" + "xdg-desktop-portal-hyprland-git" +) +# 2. 过滤出系统中实际已安装的包 +declare -a installed_pkgs=() +for pkg in "${target_pkgs[@]}"; do + # 使用 pacman -Qq 检查是否安装,抑制输出以保持终端干净 + if pacman -Qq "$pkg" >/dev/null 2>&1; then + installed_pkgs+=("$pkg") + fi +done +# 3. 只有当存在已安装的包时,才执行卸载命令 +if [[ ${#installed_pkgs[@]} -gt 0 ]]; then + exe as_user "$AUR_HELPER" -Rns --noconfirm "${installed_pkgs[@]}" +fi + +log "Installing Hyprland core components..." +CORE_PKGS="vulkan-headers hyprland quickshell-git dms-shell-bin matugen cava cups-pk-helper kimageformats kitty adw-gtk-theme nwg-look breeze-cursors wl-clipboard cliphist dsearch" +echo "$CORE_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $CORE_PKGS + +log "Installing terminal utilities..." +TERM_PKGS="fish jq zoxide socat imagemagick imv starship eza ttf-jetbrains-maple-mono-nf-xx-xx fuzzel shorin-contrib-git timg wl-screenrec-git wf-recorder " +echo "$TERM_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $TERM_PKGS + +log "Installing file manager and dependencies..." +FM_PKGS="xdg-terminal-exec xdg-desktop-portal-gtk thunar tumbler ffmpegthumbnailer poppler-glib gvfs-smb file-roller thunar-archive-plugin gnome-keyring thunar-volman gvfs-mtp gvfs-gphoto2 webp-pixbuf-loader " +echo "$FM_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $FM_PKGS + +log "Installing screenshot and screencast tools..." +SCREEN_PKGS="satty grim slurp xdg-desktop-portal-hyprland" +echo "$SCREEN_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $SCREEN_PKGS + +# --- Environment Configurations --- +section "Shorin Hyprniri" "Environment Configuration" + +log "Configuring default terminal and templates..." +# 默认终端处理 +if ! grep -q "kitty" "$HOME_DIR/.config/xdg-terminals.list"; then + echo 'kitty.desktop' >> "$HOME_DIR/.config/xdg-terminals.list" +fi + +as_user mkdir -p "$HOME_DIR/Templates" +as_user touch "$HOME_DIR/Templates/new" "$HOME_DIR/Templates/new.sh" +if [[ -f "$HOME_DIR/Templates/new.sh" ]] && grep -q "#!" "$HOME_DIR/Templates/new.sh"; then + log "Template new.sh already initialized." +else + as_user bash -c "echo '#!/usr/bin/env bash' >> '$HOME_DIR/Templates/new.sh'" +fi +chown -R "$TARGET_USER:" "$HOME_DIR/Templates" + + + +# --- Dotfiles & Wallpapers --- +section "Shorin Hyprniri" "Dotfiles & Wallpapers" + +log "Deploying user dotfiles from repository..." +DOTFILES_REPO_LINK="https://github.com/SHORiN-KiWATA/shorin-dms-hyprniri.git" +exe git clone --depth 1 "$DOTFILES_REPO_LINK" "$PARENT_DIR/shorin-dms-hyprniri-dotfiles" +chown -R "$TARGET_USER:" "$PARENT_DIR/shorin-dms-hyprniri-dotfiles" +force_copy "$PARENT_DIR/shorin-dms-hyprniri-dotfiles/dotfiles/." "$HOME_DIR" +as_user shorin link + +log "Deploying wallpapers..." +WALLPAPER_SOURCE_DIR="$PARENT_DIR/resources/Wallpapers" +WALLPAPER_DIR="$HOME_DIR/Pictures/Wallpapers" +chown -R "$TARGET_USER:" "$WALLPAPER_SOURCE_DIR" +as_user mkdir -p "$WALLPAPER_DIR" +force_copy "$WALLPAPER_SOURCE_DIR/." "$WALLPAPER_DIR/" + +# --- Browser Setup --- +section "Shorin Hyprniri" "Browser Setup" + +log "Installing Firefox and Pywalfox..." +BROWSER_PKGS="firefox python-pywalfox" +echo "$BROWSER_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $BROWSER_PKGS + +log "Configuring Firefox Pywalfox extension policy..." +POL_DIR="/etc/firefox/policies" +exe mkdir -p "$POL_DIR" +cat << 'EOF' > "$POL_DIR/policies.json" +{ + "policies": { + "Extensions": { + "Install": [ + "https://addons.mozilla.org/firefox/downloads/latest/pywalfox/latest.xpi", + "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi" + ] + } + } +} +EOF +exe chmod 755 "$POL_DIR" +exe chmod 644 "$POL_DIR/policies.json" + +# --- Flatpak & Theme Integration --- +section "Shorin Hyprniri" "Flatpak & Theme Integration" + +if command -v flatpak &>/dev/null; then + log "Configuring Flatpak overrides and theme integrations..." + echo "bazaar" >> "$VERIFY_LIST" + exe as_user "$AUR_HELPER" -S --noconfirm --needed bazaar + as_user flatpak override --user --filesystem=xdg-data/themes + as_user flatpak override --user --filesystem="$HOME_DIR/.themes" + as_user flatpak override --user --filesystem=xdg-config/gtk-4.0 + as_user flatpak override --user --filesystem=xdg-config/gtk-3.0 + as_user flatpak override --user --env=GTK_THEME=adw-gtk3-dark + as_user flatpak override --user --filesystem=xdg-config/fontconfig + as_user ln -sf /usr/share/themes "$HOME_DIR/.local/share/themes" +else + warn "Flatpak is not installed. Skipping overrides." +fi + +log "Applying file manager bookmarks..." +as_user sed -i "s/shorin/$TARGET_USER/g" "$HOME_DIR/.config/gtk-3.0/bookmarks" + +# === update module === +if command -v kitty &>/dev/null; then + exe ln -sf /usr/bin/kitty /usr/local/bin/xterm +fi + +# --- Desktop Cleanup & Tutorials --- +section "Config" "Desktop Cleanup" +log "Hiding unnecessary .desktop icons..." +run_hide_desktop_file +chown -R "$TARGET_USER:" "$HOME_DIR/.local/share" + +log "Copying tutorial files..." +force_copy "$PARENT_DIR/resources/必看-shoirn-hyprniri使用方法.txt" "$HOME_DIR" + +# ======================================================================== +# exec-end +# ======================================================================== + +# --- Finalization & Auto-Login --- +section "Final" "Auto-Login & Cleanup" +rm -f "$SUDO_TEMP_FILE" + +# 1. 清理旧的 TTY 自动登录残留(无论是否启用 greetd,旧版残留都应清除) +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi \ No newline at end of file diff --git a/scripts/04j-minimal-niri.sh b/scripts/04j-minimal-niri.sh new file mode 100644 index 0000000..02aad87 --- /dev/null +++ b/scripts/04j-minimal-niri.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash + +# ======================================================================= +# Initialization & Utilities +# ======================================================================= + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [[ -f "$SCRIPT_DIR/00-utils.sh" ]]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found in $SCRIPT_DIR." + exit 1 +fi + +check_root + +# 初始化安装验证文件 +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" + +# ======================================================================= +# Identify User & DM Check +# ======================================================================= + +log "Identifying target user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +info_kv "Target User" "$TARGET_USER" +check_dm_conflict + +# ======================================================================= +# Temporary Sudo Privileges +# ======================================================================= + +log "Granting temporary sudo privileges..." +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" + +cleanup_sudo() { + if [[ -f "$SUDO_TEMP_FILE" ]]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM + +# ======================================================================= +# Execution Phase +# ======================================================================= + +AUR_HELPER="paru" + +# --- 1. Dotfiles --- +section "Minimal Niri" "Dotfiles" +force_copy "$PARENT_DIR/minimal-niri-dotfiles/." "$HOME_DIR" + +# --- 2. Bookmarks --- +BOOKMARKS_FILE="$HOME_DIR/.config/gtk-3.0/bookmarks" +if [[ -f "$BOOKMARKS_FILE" ]]; then + as_user sed -i "s/shorin/$TARGET_USER/g" "$BOOKMARKS_FILE" +fi + +# --- 3. Niri output.kdl --- +OUTPUT_KDL="$HOME_DIR/.config/niri/output.kdl" +# 注意: DOTFILES_REPO 需确保在 00-utils.sh 或外部已定义 +if [[ "$TARGET_USER" != "shorin" ]]; then + as_user touch "$OUTPUT_KDL" +else + as_user cp "$PARENT_DIR/minimal-niri-dotfiles/.config/niri/output-example.kdl" "$OUTPUT_KDL" +fi + +# --- 4. Core Components --- +section "Minimal Niri" "Core Components" +NIRI_PKGS=(niri xwayland-satellite xdg-desktop-portal-gnome fuzzel waybar polkit-gnome mako) +echo "${NIRI_PKGS[*]}" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed "${NIRI_PKGS[@]}" + +# --- 5. Terminal --- +section "Minimal Niri" "Terminal" +TERMINAL_PKGS=(zsh foot ttf-jetbrains-maple-mono-nf-xx-xx starship eza zoxide zsh-syntax-highlighting zsh-autosuggestions zsh-completions imagemagick jq bat) +echo "${TERMINAL_PKGS[*]}" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed "${TERMINAL_PKGS[@]}" + +# --- 6. File Manager --- +section "Minimal Niri" "File Manager" +FM_PKGS1=(ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus) +FM_PKGS2=(xdg-desktop-portal-gtk thunar tumbler poppler-glib thunar-archive-plugin thunar-volman gvfs-mtp gvfs-gphoto2 webp-pixbuf-loader libgsf) +echo "${FM_PKGS1[*]}" >> "$VERIFY_LIST" +echo "${FM_PKGS2[*]}" >> "$VERIFY_LIST" + +exe pacman -S --noconfirm --needed "${FM_PKGS1[@]}" +exe pacman -S --noconfirm --needed "${FM_PKGS2[@]}" + +echo "xdg-terminal-exec" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed xdg-terminal-exec + +# 修复:如果不包含 foot,则追加 +XDG_TERMS_LIST="$HOME_DIR/.config/xdg-terminals.list" +if ! grep -qs "foot" "$XDG_TERMS_LIST"; then + # 确保目录存在 + mkdir -p "$(dirname "$XDG_TERMS_LIST")" + echo 'foot.desktop' >> "$XDG_TERMS_LIST" + chown "$TARGET_USER:" "$XDG_TERMS_LIST" 2>/dev/null || true +fi + +sudo -u "$TARGET_USER" dbus-run-session gsettings set com.github.stunkymonkey.nautilus-open-any-terminal terminal foot +# 注意: 确保 configure_nautilus_user 在 00-utils.sh 中已定义 +configure_nautilus_user + +# --- 7. Tools --- +section "Minimal Niri" "Tools" +TOOLS_PKGS=(imv cliphist wl-clipboard shorinclip-git shorin-contrib-git hyprlock breeze-cursors nwg-look adw-gtk-theme pavucontrol pulsemixer satty) +echo "${TOOLS_PKGS[*]}" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed "${TOOLS_PKGS[@]}" + +as_user shorin link + +# --- 8. Flatpak Overrides --- +if command -v flatpak &>/dev/null; then + section "Minimal Niri" "Flatpak Config" + as_user flatpak override --user --filesystem=xdg-data/themes + as_user flatpak override --user --filesystem="$HOME_DIR/.themes" + as_user flatpak override --user --filesystem=xdg-config/gtk-4.0 + as_user flatpak override --user --filesystem=xdg-config/gtk-3.0 + as_user flatpak override --user --env=GTK_THEME=adw-gtk3-dark + as_user flatpak override --user --filesystem=xdg-config/fontconfig +fi +run_hide_desktop_file + +force_copy "$PARENT_DIR/resources/Minimal-Niri使用方法.txt" "$HOME_DIR" + +section "Final" "Cleanup & Boot Configuration" + +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + setup_ly +fi diff --git a/scripts/04k-shorin-noctalia-quickshell.sh b/scripts/04k-shorin-noctalia-quickshell.sh new file mode 100644 index 0000000..6f39a3f --- /dev/null +++ b/scripts/04k-shorin-noctalia-quickshell.sh @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +# --- Import Utilities --- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" + +if [[ -f "$SCRIPT_DIR/00-utils.sh" ]]; then + source "$SCRIPT_DIR/00-utils.sh" +else + echo "Error: 00-utils.sh not found in $SCRIPT_DIR." + exit 1 +fi + +check_root +VERIFY_LIST="/tmp/shorin_install_verify.list" +rm -f "$VERIFY_LIST" # 确保每次运行生成全新的订单 + +# --- Identify User & DM Check --- +log "Identifying target user..." +detect_target_user + +if [[ -z "$TARGET_USER" || ! -d "$HOME_DIR" ]]; then + error "Target user invalid or home directory does not exist." + exit 1 +fi + +info_kv "Target User" "$TARGET_USER" + +check_dm_conflict + +# --- Temporary Sudo Privileges --- +log "Granting temporary sudo privileges..." +SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" +echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" +chmod 440 "$SUDO_TEMP_FILE" + +cleanup_sudo() { + if [[ -f "$SUDO_TEMP_FILE" ]]; then + rm -f "$SUDO_TEMP_FILE" + log "Security: Temporary sudo privileges revoked." + fi +} +trap cleanup_sudo EXIT INT TERM + +# --- Installation: Core Components --- +AUR_HELPER="paru" +section "Shorin Noctalia" "Core Components" +log "Installing core shell components..." + +CORE_PKGS="noctalia-shell niri xwayland-satellite kitty xdg-desktop-portal-gnome niri-sidebar-git satty mpv polkit-gnome " + +echo "$CORE_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $CORE_PKGS + +# --- Dotfiles & Wallpapers --- +section "Shorin Noctalia" "Dotfiles & Wallpapers" +log "Deploying user dotfiles..." +DOTFILES_SRC="$PARENT_DIR/noctalia-dotfiles" +chown -R "$TARGET_USER:" "$DOTFILES_SRC" +force_copy "$DOTFILES_SRC/." "$HOME_DIR" + +log "Deploying wallpapers..." +WALLPAPER_SOURCE_DIR="$PARENT_DIR/resources/Wallpapers" +WALLPAPER_DIR="$HOME_DIR/Pictures/Wallpapers" +chown -R "$TARGET_USER:" "$WALLPAPER_SOURCE_DIR" +as_user mkdir -p "$WALLPAPER_DIR" +force_copy "$WALLPAPER_SOURCE_DIR/." "$WALLPAPER_DIR/" + + +# --- File Manager & Terminal Setup --- +section "Shorin Noctalia" "File Manager & Terminal" +log "Installing Nautilus, Thunar and dependencies..." +FM_PKGS1="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" +FM_PKGS2="xdg-desktop-portal-gtk thunar tumbler ffmpegthumbnailer poppler-glib gvfs-smb file-roller thunar-archive-plugin gnome-keyring thunar-volman gvfs-mtp gvfs-gphoto2 webp-pixbuf-loader libgsf" + +echo "$FM_PKGS1" >> "$VERIFY_LIST" +echo "$FM_PKGS2" >> "$VERIFY_LIST" + +exe pacman -S --noconfirm --needed $FM_PKGS1 +exe as_user "$AUR_HELPER" -S --noconfirm --needed $FM_PKGS2 +# 创建模板文件 +as_user mkdir -p "$HOME_DIR/Templates" +as_user touch "$HOME_DIR/Templates/new" "$HOME_DIR/Templates/new.sh" +as_user bash -c "echo '#!/usr/bin/env bash' >> '$HOME_DIR/Templates/new.sh'" +chown -R "$TARGET_USER:" "$HOME_DIR/Templates" +# Nautilus 配置 +log "Applying Nautilus bugfixes and bookmarks..." +configure_nautilus_user +# bookmarks修复 +as_user sed -i "s/shorin/$TARGET_USER/g" "$HOME_DIR/.config/gtk-3.0/bookmarks" + + +# --- Terminal Utilities --- +section "Shorin Noctalia" "Terminal Utilities" +log "Installing terminal utilities..." +TERM_PKGS="xdg-terminal-exec bat fuzzel wf-recorder wl-screenrec-git ttf-jetbrains-maple-mono-nf-xx-xx eza zoxide starship jq fish libnotify timg imv cava imagemagick wl-clipboard cliphist shorin-contrib-git slurp" + +echo "$TERM_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $TERM_PKGS +# shorin-contrib +log "Linking shorin-contrib..." +as_user shorin link +# 默认终端处理 +log "Configuring default terminal and templates..." +if ! grep -q "kitty" "$HOME_DIR/.config/xdg-terminals.list"; then + echo 'kitty.desktop' >> "$HOME_DIR/.config/xdg-terminals.list" +fi +sudo -u "$TARGET_USER" dbus-run-session gsettings set com.github.stunkymonkey.nautilus-open-any-terminal terminal kitty +# xterm链接 +if command -v kitty &>/dev/null; then + exe ln -sf /usr/bin/kitty /usr/local/bin/xterm +fi + +# --- Flatpak & Theme Integration --- +section "Shorin Noctalia" "Flatpak & Theme Integration" + +if command -v flatpak &>/dev/null; then + log "Configuring Flatpak overrides and themes..." + echo "bazaar" >> "$VERIFY_LIST" + exe as_user "$AUR_HELPER" -S --noconfirm --needed bazaar + as_user flatpak override --user --filesystem=xdg-data/themes + as_user flatpak override --user --filesystem="$HOME_DIR/.themes" + as_user flatpak override --user --filesystem=xdg-config/gtk-4.0 + as_user flatpak override --user --filesystem=xdg-config/gtk-3.0 + as_user flatpak override --user --env=GTK_THEME=adw-gtk3-dark + as_user flatpak override --user --filesystem=xdg-config/fontconfig + as_user ln -sf /usr/share/themes "$HOME_DIR/.local/share/themes" +fi + +# === Theme Components & Browser === +log "Installing theme components and browser..." +THEME_PKGS="matugen adw-gtk-theme python-pywalfox firefox nwg-look breeze-cursors" +echo "$THEME_PKGS" >> "$VERIFY_LIST" +exe as_user "$AUR_HELPER" -S --noconfirm --needed $THEME_PKGS + +# 配置 Firefox Pywalfox 与 uBlock Origin 插件安装政策 +log "Configuring Firefox extensions policy..." +POL_DIR="/etc/firefox/policies" +exe mkdir -p "$POL_DIR" +cat << 'EOF' > "$POL_DIR/policies.json" +{ + "policies": { + "Extensions": { + "Install": [ + "https://addons.mozilla.org/firefox/downloads/latest/pywalfox/latest.xpi", + "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi" + ] + } + } +} +EOF +exe chmod 755 "$POL_DIR" +exe chmod 644 "$POL_DIR/policies.json" + + +# --- Desktop Cleanup & Tutorials --- +section "Config" "Desktop Cleanup" +log "Hiding unnecessary .desktop icons..." +run_hide_desktop_file +log "Copying tutorial files..." +force_copy "$PARENT_DIR/resources/必看-Shorin-Noctalia-Niri使用方法.txt" "$HOME_DIR" + +# niri blur toggle 脚本 +curl -L shorin.xyz/niri-blur-toggle | as_user bash + +# --- Finalization & Auto-Login --- +section "Final" "Auto-Login & Cleanup" +rm -f "$SUDO_TEMP_FILE" + +# --- display manager setup --- +log "Cleaning up legacy TTY autologin configs..." +rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf 2>/dev/null + +if [ "$SKIP_DM" = true ]; then + log "Display Manager setup skipped (Conflict found or user opted out)." + warn "You will need to start your session manually from the TTY." +else + + setup_ly +fi \ No newline at end of file diff --git a/scripts/05-verify-desktop.sh b/scripts/05-verify-desktop.sh new file mode 100644 index 0000000..5590c1c --- /dev/null +++ b/scripts/05-verify-desktop.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +# ============================================================================== +# Script: 05-verify-desktop.sh +# Description: +# 1. 黑盒环境启发式验证 (dms / quickshell)。 +# 2. 显式包发货单对账 (pacman -T)。 +# 3. 用户配置文件/软链接部署完整性验证。 +# 一旦任何一环发现缺失,立即中断并退出 (exit 1)。 +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/00-utils.sh" + +VERIFY_LIST="/tmp/shorin_install_verify.list" + +section "Verification" "Auditing System State" + +# ============================================================================== +# 1. 特殊环境启发式验证 (仅针对 Shorin DMS 系列) +# ============================================================================== + +# if [[ "$DESKTOP_ENV" == "shorindms" || "$DESKTOP_ENV" == "shorindmsgit" ]]; then +# log "Performing specialized heuristic checks for DMS blackbox..." +# DMS_ERRORS=0 + +# if ! command -v quickshell &>/dev/null && ! pacman -Qq | grep -q "quickshell"; then +# echo -e " \033[1;31m->\033[0m \033[1;33mquickshell (or related package)\033[0m is MISSING!" +# DMS_ERRORS=1 +# fi + +# if ! command -v dms &>/dev/null && ! pacman -Qq | grep -q "dms-shell"; then +# echo -e " \033[1;31m->\033[0m \033[1;33mdms-shell (or related package)\033[0m is MISSING!" +# DMS_ERRORS=1 +# fi + +# if [ "$DMS_ERRORS" -ne 0 ]; then +# echo "" +# error "DMS CORE VALIDATION FAILED!" +# write_log "FATAL" "DMS heuristic validation failed. quickshell or dms-shell is missing." +# echo -e " ${H_YELLOW}>>> Exiting installer. The official DMS script might have failed. ${NC}" +# exit 1 +# else +# success "DMS core components verified." +# fi +# fi + +# ============================================================================== +# 2. 清单统实验证 (发货单对账) +# ============================================================================== +if [ -f "$VERIFY_LIST" ]; then + mapfile -t CHECK_PKGS < <(cat "$VERIFY_LIST" | tr ' ' '\n' | sed '/^[[:space:]]*$/d' | sort -u) + + if [ ${#CHECK_PKGS[@]} -gt 0 ]; then + log "Verifying ${#CHECK_PKGS[@]} explicit packages..." + MISSING_PKGS=$(pacman -T "${CHECK_PKGS[@]}" 2>/dev/null) + + if [ -n "$MISSING_PKGS" ]; then + echo "" + error "SOFTWARE INSTALLATION INCOMPLETE!" + echo -e " ${DIM}The following packages failed to install:${NC}" + echo "$MISSING_PKGS" | awk '{print " \033[1;31m->\033[0m \033[1;33m" $0 "\033[0m"}' + echo "" + if declare -f write_log >/dev/null; then + write_log "FATAL" "Missing packages: $(echo "$MISSING_PKGS" | tr '\n' ' ')" + fi + error "Cannot proceed with a broken desktop environment." + echo -e " ${H_YELLOW}>>> Exiting installer. Please check your network or AUR helpers. ${NC}" + exit 1 + else + success "All explicit packages successfully verified." + rm -f "$VERIFY_LIST" + fi + fi +fi + +# ============================================================================== +# 3. 配置文件部署验证 (Dotfiles Audit) +# ============================================================================== +log "Identifying target user for config audit..." +detect_target_user + +if [ -z "$TARGET_USER" ]; then + warn "Could not reliably detect user 1000. Skipping dotfiles audit." +else + HOME_DIR="/home/$TARGET_USER" + CONFIG_ERRORS=0 + + # KISS 的检查小函数 + check_config_exists() { + local path="$1" + # -e 可以完美识别常规目录、文件,以及目标有效的软链接 + if [ ! -e "$path" ]; then + echo -e " \033[1;31m->\033[0m \033[1;33m$path\033[0m is MISSING or BROKEN!" + CONFIG_ERRORS=$((CONFIG_ERRORS + 1)) + else + log " [OK] $path" + fi + } + + log "Auditing dotfiles for ${DESKTOP_ENV^^}..." + + case "$DESKTOP_ENV" in + shorinniri) + check_config_exists "$HOME_DIR/.config/niri" + check_config_exists "$HOME_DIR/.config/waybar" + check_config_exists "$HOME_DIR/.config/matugen" + check_config_exists "$HOME_DIR/.config/waypaper" + ;; + shorindms|shorindmsgit) + check_config_exists "$HOME_DIR/.config/niri/dms" + ;; + hyprniri) + check_config_exists "$HOME_DIR/.config/hypr" + ;; + *) + log "No specific config checks mapped for $DESKTOP_ENV. Skipping." + ;; + esac + + if [ "$CONFIG_ERRORS" -gt 0 ]; then + echo "" + error "DOTFILES DEPLOYMENT FAILED!" + if declare -f write_log >/dev/null; then + write_log "FATAL" "Dotfiles audit failed. $CONFIG_ERRORS paths missing or broken." + fi + echo -e " ${H_YELLOW}>>> Exiting installer. The repository clone or symlink step might have failed. ${NC}" + exit 1 + else + success "Configuration files and symlinks deployed correctly." + fi +fi + +# 全部通关! +exit 0 \ No newline at end of file diff --git a/scripts/07-grub-theme.sh b/scripts/07-grub-theme.sh new file mode 100644 index 0000000..ff4c49c --- /dev/null +++ b/scripts/07-grub-theme.sh @@ -0,0 +1,346 @@ +#!/bin/bash + +# ============================================================================== +# 07-grub-theme.sh - GRUB Theming & Advanced Configuration +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +source "$SCRIPT_DIR/00-utils.sh" + +check_root + +# ------------------------------------------------------------------------------ +# 0. Pre-check: Is GRUB installed? +# ------------------------------------------------------------------------------ +if ! command -v grub-mkconfig >/dev/null 2>&1; then + echo "" + warn "GRUB (grub-mkconfig) not found on this system." + log "Skipping GRUB theme installation." + exit 0 +fi + +section "Phase 7" "GRUB Customization & Theming" + +# --- Helper Functions --- + +set_grub_value() { + local key="$1" + local value="$2" + local conf_file="/etc/default/grub" + local escaped_value + escaped_value=$(printf '%s\n' "$value" | sed 's,[\/&],\\&,g') + + if grep -q -E "^#\s*$key=" "$conf_file"; then + exe sed -i -E "s,^#\s*$key=.*,$key=\"$escaped_value\"," "$conf_file" + elif grep -q -E "^$key=" "$conf_file"; then + exe sed -i -E "s,^$key=.*,$key=\"$escaped_value\"," "$conf_file" + else + log "Appending new key: $key" + echo "$key=\"$escaped_value\"" >> "$conf_file" + fi +} + +manage_kernel_param() { + local action="$1" + local param="$2" + local conf_file="/etc/default/grub" + local line + + line=$(grep "^GRUB_CMDLINE_LINUX_DEFAULT=" "$conf_file" || true) + + local params + params=$(echo "$line" | sed -e 's/GRUB_CMDLINE_LINUX_DEFAULT=//' -e 's/"//g') + local param_key + if [[ "$param" == *"="* ]]; then param_key="${param%%=*}"; else param_key="$param"; fi + params=$(echo "$params" | sed -E "s/\b${param_key}(=[^ ]*)?\b//g") + + if [ "$action" == "add" ]; then params="$params $param"; fi + + params=$(echo "$params" | tr -s ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + exe sed -i "s,^GRUB_CMDLINE_LINUX_DEFAULT=.*,GRUB_CMDLINE_LINUX_DEFAULT=\"$params\"," "$conf_file" +} + +cleanup_minegrub() { + local minegrub_found=false + + if [ -f "/etc/grub.d/05_twomenus" ] || [ -f "/boot/grub/mainmenu.cfg" ]; then + minegrub_found=true + log "Found Minegrub artifacts. Cleaning up..." + [ -f "/etc/grub.d/05_twomenus" ] && exe rm -f /etc/grub.d/05_twomenus + [ -f "/boot/grub/mainmenu.cfg" ] && exe rm -f /boot/grub/mainmenu.cfg + fi + + if command -v grub-editenv >/dev/null 2>&1; then + if grub-editenv - list 2>/dev/null | grep -q "^config_file="; then + minegrub_found=true + log "Unsetting Minegrub GRUB environment variable..." + exe grub-editenv - unset config_file + fi + fi + + if [ "$minegrub_found" == "true" ]; then + success "Minegrub double-menu configuration completely removed." + fi +} + +# ------------------------------------------------------------------------------ +# 1. Advanced GRUB Configuration +# ------------------------------------------------------------------------------ +section "Step 1/7" "General GRUB Settings" + +if [ -L "/boot/grub" ]; then + LINK_TARGET=$(readlink -f "/boot/grub" || true) + + if [[ "$LINK_TARGET" == "/efi/grub" ]] || [[ "$LINK_TARGET" == "/boot/efi/grub" ]]; then + log "Detected /boot/grub linked to ESP ($LINK_TARGET). Enabling GRUB savedefault..." + set_grub_value "GRUB_DEFAULT" "saved" + set_grub_value "GRUB_SAVEDEFAULT" "true" + else + log "Skipping savedefault: /boot/grub links to $LINK_TARGET (not /efi/grub or /boot/efi/grub)." + fi +else + log "Skipping savedefault: /boot/grub is not a symbolic link." +fi + +log "Configuring kernel boot parameters for detailed logs and performance..." +manage_kernel_param "remove" "quiet" +manage_kernel_param "remove" "splash" +manage_kernel_param "add" "loglevel=5" +manage_kernel_param "add" "nowatchdog" + +CPU_VENDOR=$(LC_ALL=C lscpu 2>/dev/null | awk '/Vendor ID:/ {print $3}' || true) +if [ "${CPU_VENDOR:-}" == "GenuineIntel" ]; then + log "Intel CPU detected. Disabling iTCO_wdt watchdog." + manage_kernel_param "add" "modprobe.blacklist=iTCO_wdt" + elif [ "${CPU_VENDOR:-}" == "AuthenticAMD" ]; then + log "AMD CPU detected. Disabling sp5100_tco watchdog." + manage_kernel_param "add" "modprobe.blacklist=sp5100_tco" +fi + +success "Kernel parameters updated." + +# ------------------------------------------------------------------------------ +# 2. Sync Themes to System +# ------------------------------------------------------------------------------ +section "Step 2/7" "Sync Themes to System Directory" + +SOURCE_BASE="$PARENT_DIR/grub-themes" +# 【核心改变】使用 Arch Linux 官方标准的主题存放目录 +DEST_DIR="/usr/share/grub/themes" + +# 确保目标目录存在 +if [ ! -d "$DEST_DIR" ]; then + exe mkdir -p "$DEST_DIR" +fi + +if [ -d "$SOURCE_BASE" ]; then + log "Syncing repository themes to $DEST_DIR..." + for dir in "$SOURCE_BASE"/*; do + if [ -d "$dir" ] && [ -f "$dir/theme.txt" ]; then + THEME_BASENAME=$(basename "$dir") + if [ ! -d "$DEST_DIR/$THEME_BASENAME" ]; then + log "Installing $THEME_BASENAME to system..." + exe cp -r "$dir" "$DEST_DIR/" + fi + fi + done + success "Local themes installed to $DEST_DIR." +else + warn "Directory 'grub-themes' not found in repo. Only online/existing themes available." +fi + +log "Scanning $DEST_DIR for available themes..." +THEME_PATHS=() +THEME_NAMES=() + +# 直接扫描这个干净的系统级目录,无需任何额外处理 +mapfile -t FOUND_DIRS < <(find "$DEST_DIR" -mindepth 1 -maxdepth 1 -type d | sort 2>/dev/null || true) + +for dir in "${FOUND_DIRS[@]:-}"; do + if [ -n "$dir" ] && [ -f "$dir/theme.txt" ]; then + DIR_NAME=$(basename "$dir") + if [[ "$DIR_NAME" != "minegrub" && "$DIR_NAME" != "minegrub-world-selection" ]]; then + THEME_PATHS+=("$dir") + THEME_NAMES+=("$DIR_NAME") + fi + fi +done + +if [ ${#THEME_NAMES[@]} -eq 0 ]; then + log "No valid local theme folders found. Proceeding to online menu." +fi + + +# ------------------------------------------------------------------------------ +# 3. Select Theme (TUI Menu) +# ------------------------------------------------------------------------------ +section "Step 3/7" "Theme Selection" + +INSTALL_MINEGRUB=false +SKIP_THEME=false + +MINEGRUB_OPTION_NAME="Minegrub" +SKIP_OPTION_NAME="No theme (Skip/Clear)" + +MINEGRUB_IDX=$((${#THEME_NAMES[@]} + 1)) +SKIP_IDX=$((${#THEME_NAMES[@]} + 2)) + +TITLE_TEXT="Select GRUB Theme (60s Timeout)" +LINE_STR="───────────────────────────────────────────────────────" + +echo -e "\n${H_PURPLE}╭${LINE_STR}${NC}" +echo -e "${H_PURPLE}│${NC} ${BOLD}${TITLE_TEXT}${NC}" +echo -e "${H_PURPLE}├${LINE_STR}${NC}" + +for i in "${!THEME_NAMES[@]}"; do + NAME="${THEME_NAMES[$i]}" + DISPLAY_NAME=$(echo "$NAME" | sed -E 's/^[0-9]+//') + DISPLAY_IDX=$((i+1)) + + if [ "$i" -eq 0 ]; then + COLOR_STR=" ${H_CYAN}[$DISPLAY_IDX]${NC} ${DISPLAY_NAME} - ${H_GREEN}Default${NC}" + else + COLOR_STR=" ${H_CYAN}[$DISPLAY_IDX]${NC} ${DISPLAY_NAME}" + fi + echo -e "${H_PURPLE}│${NC} ${COLOR_STR}" +done + +MG_COLOR_STR=" ${H_CYAN}[$MINEGRUB_IDX]${NC} ${MINEGRUB_OPTION_NAME}" +echo -e "${H_PURPLE}│${NC} ${MG_COLOR_STR}" + +SKIP_COLOR_STR=" ${H_CYAN}[$SKIP_IDX]${NC} ${H_YELLOW}${SKIP_OPTION_NAME}${NC}" +echo -e "${H_PURPLE}│${NC} ${SKIP_COLOR_STR}" + +echo -e "${H_PURPLE}╰${LINE_STR}${NC}\n" + +echo -ne " ${H_YELLOW}Enter choice [1-$SKIP_IDX]: ${NC}" +read -t 60 USER_CHOICE || true +if [ -z "${USER_CHOICE:-}" ]; then echo ""; fi +USER_CHOICE=${USER_CHOICE:-1} + +if ! [[ "$USER_CHOICE" =~ ^[0-9]+$ ]] || [ "$USER_CHOICE" -lt 1 ] || [ "$USER_CHOICE" -gt "$SKIP_IDX" ]; then + log "Invalid choice or timeout. Defaulting to first option..." + USER_CHOICE=1 +fi + +if [ "$USER_CHOICE" -eq "$SKIP_IDX" ]; then + SKIP_THEME=true + info_kv "Selected" "None (Clear Theme)" + elif [ "$USER_CHOICE" -eq "$MINEGRUB_IDX" ]; then + INSTALL_MINEGRUB=true + info_kv "Selected" "Minegrub (Online Repository)" +else + SELECTED_INDEX=$((USER_CHOICE-1)) + if [ -n "${THEME_NAMES[$SELECTED_INDEX]:-}" ]; then + THEME_PATH="${THEME_PATHS[$SELECTED_INDEX]}/theme.txt" + THEME_NAME="${THEME_NAMES[$SELECTED_INDEX]}" + info_kv "Selected" "Local: $THEME_NAME" + else + warn "Local theme array empty but selected. Defaulting to Minegrub." + INSTALL_MINEGRUB=true + fi +fi + +# ------------------------------------------------------------------------------ +# 4. Install & Configure Theme +# ------------------------------------------------------------------------------ +section "Step 4/7" "Theme Configuration" + +GRUB_CONF="/etc/default/grub" + +if [ "$SKIP_THEME" == "true" ]; then + log "Clearing GRUB theme configuration..." + cleanup_minegrub + + if [ -f "$GRUB_CONF" ]; then + if grep -q "^GRUB_THEME=" "$GRUB_CONF"; then + exe sed -i 's|^GRUB_THEME=|#GRUB_THEME=|' "$GRUB_CONF" + success "Disabled existing GRUB_THEME in configuration." + else + log "No active GRUB_THEME found to disable." + fi + fi + + elif [ "$INSTALL_MINEGRUB" == "true" ]; then + log "Preparing to install Minegrub theme..." + + if ! command -v git >/dev/null 2>&1; then + error "'git' is required to clone Minegrub but was not found. Skipping." + else + TEMP_MG_DIR=$(mktemp -d -t minegrub_install_XXXXXX) + log "Cloning Lxtharia/double-minegrub-menu..." + if exe git clone --depth 1 "https://github.com/Lxtharia/double-minegrub-menu.git" "$TEMP_MG_DIR"; then + if [ -f "$TEMP_MG_DIR/install.sh" ]; then + log "Executing Minegrub install.sh..." + ( + cd "$TEMP_MG_DIR" || exit 1 + exe chmod +x install.sh + exe ./install.sh + ) + if [ $? -eq 0 ]; then + success "Minegrub theme successfully installed via its script." + else + error "Minegrub install.sh exited with an error." + fi + else + error "install.sh not found in the cloned repository!" + fi + else + error "Failed to clone Minegrub repository." + fi + [ -n "$TEMP_MG_DIR" ] && rm -rf "$TEMP_MG_DIR" + fi + +else + cleanup_minegrub + + if [ -f "$GRUB_CONF" ]; then + if grep -q "^GRUB_THEME=" "$GRUB_CONF"; then + exe sed -i "s|^GRUB_THEME=.*|GRUB_THEME=\"$THEME_PATH\"|" "$GRUB_CONF" + elif grep -q "^#GRUB_THEME=" "$GRUB_CONF"; then + exe sed -i "s|^#GRUB_THEME=.*|GRUB_THEME=\"$THEME_PATH\"|" "$GRUB_CONF" + else + echo "GRUB_THEME=\"$THEME_PATH\"" >> "$GRUB_CONF" + fi + + if grep -q "^GRUB_TERMINAL_OUTPUT=\"console\"" "$GRUB_CONF"; then + exe sed -i 's/^GRUB_TERMINAL_OUTPUT="console"/#GRUB_TERMINAL_OUTPUT="console"/' "$GRUB_CONF" + fi + + if ! grep -q "^GRUB_GFXMODE=" "$GRUB_CONF"; then + echo 'GRUB_GFXMODE=auto' >> "$GRUB_CONF" + fi + success "Configured GRUB to use theme: $THEME_NAME" + else + error "$GRUB_CONF not found." + exit 1 + fi +fi + +# ------------------------------------------------------------------------------ +# 5. Add Shutdown/Reboot Menu Entries +# ------------------------------------------------------------------------------ +section "Step 5/7" "Menu Entries" +log "Adding Power Options to GRUB menu..." + +cp /etc/grub.d/40_custom /etc/grub.d/99_custom +echo 'menuentry "Reboot" --class restart {reboot}' >> /etc/grub.d/99_custom +echo 'menuentry "Shutdown" --class shutdown {halt}' >> /etc/grub.d/99_custom + +success "Added grub menuentry 99-shutdown" + +# ------------------------------------------------------------------------------ +# 7. Apply Changes +# ------------------------------------------------------------------------------ +section "Step 7/7" "Apply Changes" +log "Generating new GRUB configuration..." + +if exe grub-mkconfig -o /boot/grub/grub.cfg; then + success "GRUB updated successfully." +else + error "Failed to update GRUB." + warn "You may need to run 'grub-mkconfig' manually." +fi + +log "Module 07 completed." \ No newline at end of file diff --git a/scripts/99-apps.sh b/scripts/99-apps.sh new file mode 100644 index 0000000..9ae4b9c --- /dev/null +++ b/scripts/99-apps.sh @@ -0,0 +1,496 @@ +#!/bin/bash + +# ============================================================================== +# 99-apps.sh - Common Applications (FZF Menu + Split Repo/AUR + Retry Logic) +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PARENT_DIR="$(dirname "$SCRIPT_DIR")" +source "$SCRIPT_DIR/00-utils.sh" + +# --- [CONFIGURATION] --- +# LazyVim 硬性依赖列表 (Moved from niri-setup) +LAZYVIM_DEPS=("neovim" "ripgrep" "fd" "ttf-jetbrains-mono-nerd" "git") + +check_root + +# Ensure FZF is installed +if ! command -v fzf &> /dev/null; then + log "Installing dependency: fzf..." + pacman -S --noconfirm fzf >/dev/null 2>&1 +fi + +trap 'echo -e "\n ${H_YELLOW}>>> Operation cancelled by user (Ctrl+C). Skipping...${NC}"' INT + +# ------------------------------------------------------------------------------ +# 0. Identify Target User & Helper +# ------------------------------------------------------------------------------ +section "Phase 5" "Common Applications" + +log "Identifying target user..." +DETECTED_USER=$(awk -F: '$3 == 1000 {print $1}' /etc/passwd) + +if [ -n "$DETECTED_USER" ]; then + TARGET_USER="$DETECTED_USER" +else + read -p " Please enter the target username: " TARGET_USER +fi +HOME_DIR="/home/$TARGET_USER" +info_kv "Target" "$TARGET_USER" + +# Helper function for user commands +as_user() { + runuser -u "$TARGET_USER" -- "$@" +} + +# ------------------------------------------------------------------------------ +# 1. List Selection & User Prompt +# ------------------------------------------------------------------------------ +if [ "$DESKTOP_ENV" == "kde" ]; then + LIST_FILENAME="kde-common-applist.txt" +else + LIST_FILENAME="common-applist.txt" +fi +LIST_FILE="$PARENT_DIR/$LIST_FILENAME" + +REPO_APPS=() +AUR_APPS=() +FLATPAK_APPS=() +FAILED_PACKAGES=() +INSTALL_LAZYVIM=false + +if [ ! -f "$LIST_FILE" ]; then + warn "File $LIST_FILENAME not found. Skipping." + trap - INT + exit 0 +fi + +if ! grep -q -vE "^\s*#|^\s*$" "$LIST_FILE"; then + warn "App list is empty. Skipping." + trap - INT + exit 0 +fi + +echo "" +echo -e " Selected List: ${BOLD}$LIST_FILENAME${NC}" +echo -e " ${H_YELLOW}>>> Do you want to CUSTOMIZE the application installation?${NC}" +echo "" + +read -t 60 -p " Please select[Y/n]: " choice +READ_STATUS=$? + +SELECTED_RAW="" + +# Case 1: Timeout (Auto Install ALL - Default to N) +if [ $READ_STATUS -ne 0 ]; then + echo "" + warn "Timeout reached (60s). Auto-installing ALL applications from list..." + SELECTED_RAW=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | sed -E 's/[[:space:]]+#/\t#/') + +# Case 2: User Input +else + # Enter defaults to Y + choice=${choice:-Y} + if [[ "$choice" =~ ^[nN]$ ]]; then + log "User chose to auto-install ALL applications without customization." + SELECTED_RAW=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | sed -E 's/[[:space:]]+#/\t#/') + else + clear + echo -e "\n Loading application list..." + + SELECTED_RAW=$(grep -vE "^\s*#|^\s*$" "$LIST_FILE" | \ + sed -E 's/[[:space:]]+#/\t#/' | \ + fzf --multi \ + --layout=reverse \ + --border \ + --margin=1,2 \ + --prompt="Search App > " \ + --pointer=">>" \ + --marker="* " \ + --delimiter=$'\t' \ + --with-nth=1 \ + --bind 'load:select-all' \ + --bind 'ctrl-a:select-all,ctrl-d:deselect-all,j:down,k:up' \ + --info=inline \ + --header="[TAB] TOGGLE | [ENTER] INSTALL | [CTRL-D] DE-ALL | [CTRL-A] SE-ALL" \ + --preview "echo {} | cut -f2 -d$'\t' | sed 's/^# //'" \ + --preview-window=down:45%:wrap:border-up \ + --color=dark \ + --color=fg+:white,bg+:black \ + --color=hl:blue,hl+:blue:bold \ + --color=header:yellow:bold \ + --color=info:magenta \ + --color=prompt:cyan,pointer:cyan:bold,marker:green:bold \ + --color=spinner:yellow) + + clear + + if [ -z "$SELECTED_RAW" ]; then + log "Skipping application installation (User cancelled selection in FZF)." + trap - INT + exit 0 + fi + fi +fi + +# ------------------------------------------------------------------------------ +# 2. Categorize Selection & Strip Prefixes (Includes LazyVim Check) +# ------------------------------------------------------------------------------ +log "Processing selection..." + +while IFS= read -r line; do + raw_pkg=$(echo "$line" | cut -f1 -d$'\t' | xargs) + [[ -z "$raw_pkg" ]] && continue + + # Check for LazyVim explicitly (Case insensitive check) + if [[ "${raw_pkg,,}" == "lazyvim" ]]; then + INSTALL_LAZYVIM=true + REPO_APPS+=("${LAZYVIM_DEPS[@]}") + info_kv "Config" "LazyVim detected" "Setup deferred to Post-Install" + continue + fi + + if [[ "$raw_pkg" == flatpak:* ]]; then + clean_name="${raw_pkg#flatpak:}" + FLATPAK_APPS+=("$clean_name") + elif [[ "$raw_pkg" == AUR:* ]]; then + clean_name="${raw_pkg#AUR:}" + AUR_APPS+=("$clean_name") + else + REPO_APPS+=("$raw_pkg") + fi +done <<< "$SELECTED_RAW" + +info_kv "Scheduled" "Repo: ${#REPO_APPS[@]}" "AUR: ${#AUR_APPS[@]}" "Flatpak: ${#FLATPAK_APPS[@]}" + +# ------------------------------------------------------------------------------ +#[SETUP] GLOBAL SUDO CONFIGURATION +# ------------------------------------------------------------------------------ +if [ ${#REPO_APPS[@]} -gt 0 ] || [ ${#AUR_APPS[@]} -gt 0 ]; then + log "Configuring temporary NOPASSWD for installation..." + SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_apps" + echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" > "$SUDO_TEMP_FILE" + chmod 440 "$SUDO_TEMP_FILE" +fi + +# ------------------------------------------------------------------------------ +# 3. Install Applications +# ------------------------------------------------------------------------------ + +# --- A. Install Repo Apps (BATCH MODE) --- +if [ ${#REPO_APPS[@]} -gt 0 ]; then + section "Step 1/3" "Official Repository Packages (Batch)" + + REPO_QUEUE=() + for pkg in "${REPO_APPS[@]}"; do + if pacman -Qi "$pkg" &>/dev/null; then + log "Skipping '$pkg' (Already installed)." + else + REPO_QUEUE+=("$pkg") + fi + done + + if [ ${#REPO_QUEUE[@]} -gt 0 ]; then + BATCH_LIST="${REPO_QUEUE[*]}" + info_kv "Installing" "${#REPO_QUEUE[@]} packages via Pacman/Yay" + + if ! exe as_user yay -Syu --noconfirm --needed --answerdiff=None --answerclean=None $BATCH_LIST; then + error "Batch installation failed. Some repo packages might be missing." + for pkg in "${REPO_QUEUE[@]}"; do + FAILED_PACKAGES+=("repo:$pkg") + done + else + success "Repo batch installation completed." + fi + else + log "All Repo packages are already installed." + fi +fi + +# --- B. Install AUR Apps (INDIVIDUAL MODE + RETRY) --- +if [ ${#AUR_APPS[@]} -gt 0 ]; then + section "Step 2/3" "AUR Packages " + + for app in "${AUR_APPS[@]}"; do + if pacman -Qi "$app" &>/dev/null; then + log "Skipping '$app' (Already installed)." + continue + fi + + + log "Installing AUR: $app ..." + install_success=false + max_retries=1 + + for (( i=0; i<=max_retries; i++ )); do + if [ $i -gt 0 ]; then + warn "Retry $i/$max_retries for '$app' ..." + fi + + if as_user yay -Syu --noconfirm --needed --answerdiff=None --answerclean=None "$app"; then + install_success=true + success "Installed $app" + break + else + warn "Attempt $((i+1)) failed for $app" + fi + done + + if [ "$install_success" = false ]; then + error "Failed to install $app after $((max_retries+1)) attempts." + FAILED_PACKAGES+=("aur:$app") + fi + done +fi + +# --- C. Install Flatpak Apps (INDIVIDUAL MODE) --- +if [ ${#FLATPAK_APPS[@]} -gt 0 ]; then + section "Step 3/3" "Flatpak Packages (Individual)" + + for app in "${FLATPAK_APPS[@]}"; do + if flatpak info "$app" &>/dev/null; then + log "Skipping '$app' (Already installed)." + continue + fi + + log "Installing Flatpak: $app ..." + if ! exe flatpak install -y flathub "$app"; then + error "Failed to install: $app" + FAILED_PACKAGES+=("flatpak:$app") + else + success "Installed $app" + fi + done +fi + +# ------------------------------------------------------------------------------ +# 4. Environment & Additional Configs (Virt/Wine/Steam/LazyVim) +# ------------------------------------------------------------------------------ +section "Post-Install" "System & App Tweaks" + +# --- [NEW] Virtualization Configuration (Virt-Manager) --- +if pacman -Qi virt-manager &>/dev/null && ! systemd-detect-virt -q; then + info_kv "Config" "Virt-Manager detected" + + # 1. 安装完整依赖 + # iptables-nft 和 dnsmasq 是默认 NAT 网络必须的 + log "Installing QEMU/KVM dependencies..." + pacman -S --noconfirm --needed qemu-full virt-manager swtpm dnsmasq virt-viewer + + # 2. 添加用户组 (需要重新登录生效) + log "Adding $TARGET_USER to libvirt group..." + usermod -a -G libvirt "$TARGET_USER" + # 同时添加 kvm 和 input 组以防万一 + usermod -a -G kvm,input "$TARGET_USER" + + # 3. 开启服务 + log "Enabling libvirtd service..." + systemctl enable --now libvirtd + + # 4. [修复] 强制设置 virt-manager 默认连接为 QEMU/KVM + # 解决第一次打开显示 LXC 或无法连接的问题 + log "Setting default URI to qemu:///system..." + + # 编译 glib schemas (防止 gsettings 报错) + glib-compile-schemas /usr/share/glib-2.0/schemas/ + + # 强制写入 Dconf 配置 + # uris: 连接列表 + # autoconnect: 自动连接的列表 + as_user gsettings set org.virt-manager.virt-manager.connections uris "['qemu:///system']" + as_user gsettings set org.virt-manager.virt-manager.connections autoconnect "['qemu:///system']" + + # 5. 配置网络 (Default NAT) + log "Starting default network..." + sleep 3 + virsh net-start default >/dev/null 2>&1 || warn "Default network might be already active." + virsh net-autostart default >/dev/null 2>&1 || true + + success "Virtualization (KVM) configured." +fi + +# --- [NEW] Wine Configuration & Fonts --- +if command -v wine &>/dev/null; then + info_kv "Config" "Wine detected" + + # 1. 安装 Gecko 和 Mono + log "Ensuring Wine Gecko/Mono are installed..." + pacman -S --noconfirm --needed wine wine-gecko wine-mono + + # 2. 初始化 Wine (使用 wineboot -u 在后台运行,不弹窗) + WINE_PREFIX="$HOME_DIR/.wine" + if [ ! -d "$WINE_PREFIX" ]; then + log "Initializing wine prefix (This may take a minute)..." + # WINEDLLOVERRIDES prohibits popups + as_user env WINEDLLOVERRIDES="mscoree,mshtml=" wineboot -u + # Wait for completion + as_user wineserver -w + else + log "Wine prefix already exists." + fi + + # 3. 复制字体 + FONT_SRC="$PARENT_DIR/resources/windows-sim-fonts" + FONT_DEST="$WINE_PREFIX/drive_c/windows/Fonts" + + if [ -d "$FONT_SRC" ]; then + log "Copying Windows fonts from resources..." + + # 1. 确保目标目录存在 (以用户身份创建) + if [ ! -d "$FONT_DEST" ]; then + as_user mkdir -p "$FONT_DEST" + fi + + # 2. 执行复制 (关键修改:直接以目标用户身份复制,而不是 Root 复制后再 Chown) + # 使用 cp -rT 确保目录内容合并,而不是把源目录本身拷进去 + # 注意:这里假设 as_user 能够接受命令参数。如果 as_user 只是简单的 su/sudo 封装: + if sudo -u "$TARGET_USER" cp -rf "$FONT_SRC"/. "$FONT_DEST/"; then + success "Fonts copied successfully." + else + error "Failed to copy fonts." + fi + + # 3. 强制刷新 Wine 字体缓存 (非常重要!) + # 字体文件放进去了,但 Wine 不一定会立刻重修构建 fntdata.dat + # 杀死 wineserver 会强制 Wine 下次启动时重新扫描系统和本地配置 + log "Refreshing Wine font cache..." + if command -v wineserver &> /dev/null; then + # 必须以目标用户身份执行 wineserver -k + as_user env WINEPREFIX="$WINE_PREFIX" wineserver -k + fi + + success "Wine fonts installed and cache refresh triggered." + else + warn "Resources font directory not found at: $FONT_SRC" + fi +fi + +if command -v lutris &> /dev/null; then + log "Lutris detected. Installing 32-bit gaming dependencies..." + pacman -S --noconfirm --needed alsa-plugins giflib glfw gst-plugins-base-libs lib32-alsa-plugins lib32-giflib lib32-gst-plugins-base-libs lib32-gtk3 lib32-libjpeg-turbo lib32-libva lib32-mpg123 lib32-openal libjpeg-turbo libva libxslt mpg123 openal ttf-liberation +fi +# --- Steam Locale Fix --- +STEAM_desktop_modified=false +NATIVE_DESKTOP="/usr/share/applications/steam.desktop" +if [ -f "$NATIVE_DESKTOP" ]; then + log "Checking Native Steam..." + if ! grep -q "env LC_CTYPE=zh_CN.UTF-8" "$NATIVE_DESKTOP"; then + exe sed -i 's|^Exec=/usr/bin/steam|Exec=env LC_CTYPE=zh_CN.UTF-8 /usr/bin/steam|' "$NATIVE_DESKTOP" + exe sed -i 's|^Exec=steam|Exec=env LC_CTYPE=zh_CN.UTF-8 steam|' "$NATIVE_DESKTOP" + success "Patched Native Steam .desktop." + STEAM_desktop_modified=true + else + log "Native Steam already patched." + fi +fi + +if flatpak list | grep -q "com.valvesoftware.Steam"; then + log "Checking Flatpak Steam..." + exe flatpak override --env=LANG=zh_CN.UTF-8 com.valvesoftware.Steam + success "Applied Flatpak Steam override." + STEAM_desktop_modified=true +fi + +# --- [MOVED] LazyVim Configuration --- +if [ "$INSTALL_LAZYVIM" = true ]; then + section "Config" "Applying LazyVim Overrides" + NVIM_CFG="$HOME_DIR/.config/nvim" + + if [ -d "$NVIM_CFG" ]; then + BACKUP_PATH="$HOME_DIR/.config/nvim.old.apps.$(date +%s)" + warn "Collision detected. Moving existing nvim config to $BACKUP_PATH" + mv "$NVIM_CFG" "$BACKUP_PATH" + fi + + log "Cloning LazyVim starter..." + if as_user git clone https://github.com/LazyVim/starter "$NVIM_CFG"; then + rm -rf "$NVIM_CFG/.git" + success "LazyVim installed (Override)." + else + error "Failed to clone LazyVim." + fi +fi + +# --- hide desktop --- +# --- hide desktop (User Level Override) --- + +section "Config" "Hiding useless .desktop files" +log "Hiding useless .desktop files" +run_hide_desktop_file + +# --- Post-Dotfiles Configuration: Firefox --- +section "Config" "Firefox UI Customization" +MOZILLA_DIR="$HOME_DIR/.config/mozilla" + +if [ -d "$MOZILLA_DIR" ]; then + log "Backing up existing mozilla directory..." + mv "$MOZILLA_DIR" "$MOZILLA_DIR.bak.$(date +%s)" +fi + +if mkdir -p "$MOZILLA_DIR"; then + log "directory created." +fi +if cp -rf "$PARENT_DIR/resources/firefox" "$MOZILLA_DIR/"; then + chown -R "$TARGET_USER" "$MOZILLA_DIR" + log "firefox dotfiles doployed." +fi +section "Config" "clash tun" + +if command -v clash-verge; then + /usr/bin/clash-verge-service & + sleep 3 + clash-verge-service-uninstall || true + sleep 3 + clash-verge-service-install || true +fi + +# --- mangohud --- +section "Config" "MangoHud Configuration" +if command -v mangohud &>/dev/null; then + + if [ -d "$HOME_DIR/.config/MangoHud" ]; then + log "MangoHud config already exists." + else + log "Deploying MangoHud config..." + force_copy "$PARENT_DIR/resources/MangoHud" "$HOME_DIR/.config/MangoHud" + fi + +fi + + +# ------------------------------------------------------------------------------ +# [FIX] CLEANUP GLOBAL SUDO CONFIGURATION +# ------------------------------------------------------------------------------ +if [ -f "$SUDO_TEMP_FILE" ]; then + log "Revoking temporary NOPASSWD..." + rm -f "$SUDO_TEMP_FILE" +fi + +# ------------------------------------------------------------------------------ +# 5. Generate Failure Report +# ------------------------------------------------------------------------------ +if [ ${#FAILED_PACKAGES[@]} -gt 0 ]; then + DOCS_DIR="$HOME_DIR/Documents" + REPORT_FILE="$DOCS_DIR/安装失败的软件.txt" + + if [ ! -d "$DOCS_DIR" ]; then as_user mkdir -p "$DOCS_DIR"; fi + + echo -e "\n========================================================" >> "$REPORT_FILE" + echo -e " Installation Failure Report - $(date)" >> "$REPORT_FILE" + echo -e "========================================================" >> "$REPORT_FILE" + printf "%s\n" "${FAILED_PACKAGES[@]}" >> "$REPORT_FILE" + + chown "$TARGET_USER:$TARGET_USER" "$REPORT_FILE" + + echo "" + warn "Some applications failed to install." + warn "A report has been saved to:" + echo -e " ${BOLD}$REPORT_FILE${NC}" +else + success "All scheduled applications processed successfully." +fi + +# Reset Trap +trap - INT + +log "Module 99-apps completed." \ No newline at end of file diff --git a/scripts/de-undochange.sh b/scripts/de-undochange.sh new file mode 100644 index 0000000..6011b2d --- /dev/null +++ b/scripts/de-undochange.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +# ============================================================================== +# undochange.sh - Emergency System Rollback Tool (Btrfs Assistant Edition) +# ============================================================================== +# Usage: sudo ./undochange.sh +# Description: Reverts system to "Before Shorin Setup" using btrfs-assistant +# This performs a Subvolume Rollback, not just a file diff undo. +# ============================================================================== + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +TARGET_DESC="Before Desktop Environments" + +# 1. Check Root +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}Error: Please run as root (sudo ./undochange.sh)${NC}" + exit 1 +fi + +# 2. Check Dependencies +if ! command -v snapper &> /dev/null; then + echo -e "${RED}Error: Snapper is not installed.${NC}" + exit 1 +fi + +if ! command -v btrfs-assistant &> /dev/null; then + echo -e "${RED}Error: btrfs-assistant is not installed.${NC}" + echo "Cannot perform subvolume rollback." + exit 1 +fi + +echo -e "${YELLOW}>>> Initializing Emergency Rollback (Target: '$TARGET_DESC')...${NC}" + +# --- Helper Function: Rollback Logic from quickload --- +# Args: $1 = Subvolume Name (e.g., @ or @home), $2 = Snapper Config (e.g., root or home) +perform_rollback() { + local subvol="$1" + local snap_conf="$2" + + echo -e "Checking config: ${YELLOW}$snap_conf${NC} for subvolume: ${YELLOW}$subvol${NC}..." + + # 1. Get Snapper ID + # logic: list snapshots -> filter by description -> take the last one -> get ID + local snap_id=$(snapper -c "$snap_conf" list --columns number,description | grep "$TARGET_DESC" | tail -n 1 | awk '{print $1}') + + if [ -z "$snap_id" ]; then + echo -e "${RED} [SKIP] Snapshot '$TARGET_DESC' not found in config '$snap_conf'.${NC}" + return 1 + fi + + echo -e " Found Snapshot ID: ${GREEN}$snap_id${NC}" + + # 2. Map to Btrfs-Assistant Index + # Logic from quickload: Match Subvolume Name ($2) and Snapper ID ($3) to get Index ($1) + local ba_index=$(btrfs-assistant -l | awk -v v="$subvol" -v s="$snap_id" '$2==v && $3==s {print $1}') + + if [ -z "$ba_index" ]; then + echo -e "${RED} [FAIL] Could not map Snapper ID $snap_id to Btrfs-Assistant index.${NC}" + return 1 + fi + + # 3. Execute Restore + echo -e " Executing rollback (Index: $ba_index)..." + if btrfs-assistant -r "$ba_index"; then + echo -e " ${GREEN}Success.${NC}" + return 0 + else + echo -e " ${RED}Restore command failed.${NC}" + return 1 + fi +} + +# --- Main Execution --- + +# 3. Rollback Root (Critical) +# Arch layout usually maps config 'root' to subvolume '@' +echo -e "${YELLOW}>>> Restoring Root Filesystem...${NC}" +if ! perform_rollback "@" "root"; then + echo -e "${RED}CRITICAL FAILURE: Failed to restore root partition.${NC}" + echo "Aborting operation to prevent partial system state." + exit 1 +fi + +# 4. Rollback Home (Optional) +# Only attempt if 'home' config exists +if snapper list-configs | grep -q "^home "; then + echo -e "${YELLOW}>>> Restoring Home Filesystem...${NC}" + # Arch layout usually maps config 'home' to subvolume '@home' + perform_rollback "@home" "home" +else + echo -e "No 'home' snapper config found, skipping home restore." +fi + +# 5. Reboot +echo -e "${GREEN}System rollback successful.${NC}" +echo -e "${YELLOW}Rebooting in 3 seconds...${NC}" +sleep 3 +reboot \ No newline at end of file diff --git a/shorin-arch-setup-main.zip b/shorin-arch-setup-main.zip deleted file mode 100644 index f1cb25e..0000000 Binary files a/shorin-arch-setup-main.zip and /dev/null differ diff --git a/strap.sh b/strap.sh new file mode 100644 index 0000000..61f19f9 --- /dev/null +++ b/strap.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +# ============================================================================== +# 脚本功能说明 (Bootstrap Script for Shorin Arch Setup - Ninja PV Edition) +# 1. 环境防御:严格检测操作系统(仅限Linux)与系统架构(仅限x86_64)。 +# 2. 权限自适应:智能识别 root/普通用户,防止 Live CD 环境下缺少 sudo 导致崩溃。 +# 3. 依赖隐身:静默准备 curl/tar/git/pv。其中 pv 仅作临时数据流监控。 +# 4. 流式处理:通过 curl 拉取源码,pv 提供带有预估总量的真实进度条与网速监控。 +# 5. 用完即焚:解压完成后,静默卸载临时依赖 pv (若它是被本脚本安装的),保持系统洁净。 +# 6. 一键引导:无缝切换目录并接管标准输入,提权执行核心安装脚本。 +# ============================================================================== + +# 启用严格模式:遇到错误、未定义变量或管道错误时立即退出 +set -euo pipefail + +# --- [颜色配置] --- +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# --- [环境检测与准备] --- + +# 1. 检查是否为 Linux 内核 +if [ "$(uname -s)" != "Linux" ]; then + printf "%bError: This installer only supports Linux systems.%b\n" "$RED" "$NC" + exit 1 +fi + +# 2. 检查架构是否匹配 (仅允许 x86_64) +ARCH=$(uname -m) +if [ "$ARCH" != "x86_64" ]; then + printf "%bError: Unsupported architecture: %s%b\n" "$RED" "$ARCH" "$NC" + printf "This installer is strictly designed for x86_64 (amd64) systems only.\n" + exit 1 +fi +ARCH_NAME="amd64" + +# 3. 极简提权封装 (KISS 原则:是 root 直接跑,不是 root 才加 sudo) +run_as_root() { + if [ "$(id -u)" -eq 0 ]; then + "$@" + else + if ! command -v sudo >/dev/null 2>&1; then + printf "%bError: 'sudo' command not found. Please run this script as root.%b\n" "$RED" "$NC" + exit 1 + fi + sudo "$@" + fi +} + +# --- [配置区域] --- +TARGET_BRANCH="${BRANCH:-main}" +TARBALL_URL="https://github.com/SHORiN-KiWATA/shorin-arch-setup/archive/refs/heads/${TARGET_BRANCH}.tar.gz" +TARGET_DIR="/tmp/shorin-arch-setup" + +# 【极客魔法】预估源码压缩包体积。实际测得约为 60MB,这里预留一点余量设定为 65M,确保进度条平滑且不卡顿。 +EXPECTED_SIZE="80M" + +printf "%b>>> Preparing to install from branch: %s on %s%b\n" "$BLUE" "$TARGET_BRANCH" "$ARCH_NAME" "$NC" + +# --- [执行流程] --- + +# 1. 依赖检查与静默安装 +MISSING_PKGS=() +INSTALLED_PV_FLAG=0 + +for cmd in curl tar git pv; do + if ! command -v "$cmd" >/dev/null 2>&1; then + MISSING_PKGS+=("$cmd") + if [ "$cmd" = "pv" ]; then + INSTALLED_PV_FLAG=1 + fi + fi +done + +if [ ${#MISSING_PKGS[@]} -gt 0 ]; then + run_as_root pacman -Sy --noconfirm --needed "${MISSING_PKGS[@]}" >/dev/null 2>&1 +fi + +# 2. 清理旧目录并重新创建 +if [ -d "$TARGET_DIR" ]; then + run_as_root rm -rf "$TARGET_DIR" +fi +mkdir -p "$TARGET_DIR" + +# 3. 流式下载与解压 (引入基于预估体积的真实进度条) +printf "Downloading and extracting repository to %s...\n" "$TARGET_DIR" + +for attempt in 1 2 3; do + # 核心变动:加入了 -s "$EXPECTED_SIZE" 让 pv 以为自己知道了终点。 + # -ptrb: p=真实的进度条, t=时间, r=网速, b=字节 + if curl -sSLf "$TARBALL_URL" | pv -ptrb -s "$EXPECTED_SIZE" | tar -xz -C "$TARGET_DIR" --strip-components=1; then + run_as_root chmod 755 "$TARGET_DIR" + printf "%b\nDownload and extraction successful.%b\n" "$GREEN" "$NC" + break + fi + + if [ "$attempt" -eq 3 ]; then + printf "%bError: Failed to download branch '%s' after 3 attempts. Network issue suspected.%b\n" "$RED" "$TARGET_BRANCH" "$NC" + exit 1 + fi + + printf "%bWarning: Download failed (attempt %d/3). Retrying in 3 seconds...%b\n" "$RED" "$attempt" "$NC" + sleep 3 + run_as_root rm -rf "$TARGET_DIR" + mkdir -p "$TARGET_DIR" +done + +# 4. 毁尸灭迹:如果 pv 是我们刚装的,悄悄卸载掉 +if [ "$INSTALLED_PV_FLAG" -eq 1 ]; then + run_as_root pacman -Rns --noconfirm pv >/dev/null 2>&1 +fi + +# 5. 运行安装 +cd "$TARGET_DIR" +printf "Starting installer...\n" +run_as_root bash install.sh < /dev/tty diff --git a/undochange.sh b/undochange.sh new file mode 100644 index 0000000..c51cdfb --- /dev/null +++ b/undochange.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +# ============================================================================== +# undochange.sh - Emergency System Rollback Tool (Btrfs Assistant Edition) +# ============================================================================== +# Usage: sudo ./undochange.sh +# Description: Reverts system to "Before Shorin Setup" using btrfs-assistant +# This performs a Subvolume Rollback, not just a file diff undo. +# ============================================================================== + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +TARGET_DESC="Before Shorin Setup" + +# 1. Check Root +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}Error: Please run as root (sudo ./undochange.sh)${NC}" + exit 1 +fi + +# 2. Check Dependencies +if ! command -v snapper &> /dev/null; then + echo -e "${RED}Error: Snapper is not installed.${NC}" + exit 1 +fi + +if ! command -v btrfs-assistant &> /dev/null; then + echo -e "${RED}Error: btrfs-assistant is not installed.${NC}" + echo "Cannot perform subvolume rollback." + exit 1 +fi + +echo -e "${YELLOW}>>> Initializing Emergency Rollback (Target: '$TARGET_DESC')...${NC}" + +# --- Helper Function: Rollback Logic from quickload --- +# Args: $1 = Subvolume Name (e.g., @ or @home), $2 = Snapper Config (e.g., root or home) +perform_rollback() { + local subvol="$1" + local snap_conf="$2" + + echo -e "Checking config: ${YELLOW}$snap_conf${NC} for subvolume: ${YELLOW}$subvol${NC}..." + + # 1. Get Snapper ID + # logic: list snapshots -> filter by description -> take the last one -> get ID + local snap_id=$(snapper -c "$snap_conf" list --columns number,description | grep "$TARGET_DESC" | tail -n 1 | awk '{print $1}') + + if [ -z "$snap_id" ]; then + echo -e "${RED} [SKIP] Snapshot '$TARGET_DESC' not found in config '$snap_conf'.${NC}" + return 1 + fi + + echo -e " Found Snapshot ID: ${GREEN}$snap_id${NC}" + + # 2. Map to Btrfs-Assistant Index + # Logic from quickload: Match Subvolume Name ($2) and Snapper ID ($3) to get Index ($1) + local ba_index=$(btrfs-assistant -l | awk -v v="$subvol" -v s="$snap_id" '$2==v && $3==s {print $1}') + + if [ -z "$ba_index" ]; then + echo -e "${RED} [FAIL] Could not map Snapper ID $snap_id to Btrfs-Assistant index.${NC}" + return 1 + fi + + # 3. Execute Restore + echo -e " Executing rollback (Index: $ba_index)..." + if btrfs-assistant -r "$ba_index"; then + echo -e " ${GREEN}Success.${NC}" + return 0 + else + echo -e " ${RED}Restore command failed.${NC}" + return 1 + fi +} + +# --- Main Execution --- + +# 3. Rollback Root (Critical) +# Arch layout usually maps config 'root' to subvolume '@' +echo -e "${YELLOW}>>> Restoring Root Filesystem...${NC}" +if ! perform_rollback "@" "root"; then + echo -e "${RED}CRITICAL FAILURE: Failed to restore root partition.${NC}" + echo "Aborting operation to prevent partial system state." + exit 1 +fi + +# 4. Rollback Home (Optional) +# Only attempt if 'home' config exists +if snapper list-configs | grep -q "^home "; then + echo -e "${YELLOW}>>> Restoring Home Filesystem...${NC}" + # Arch layout usually maps config 'home' to subvolume '@home' + perform_rollback "@home" "home" +else + echo -e "No 'home' snapper config found, skipping home restore." +fi + + +# 5. Reboot +echo -e "${GREEN}System rollback successful.${NC}" +echo -e "${YELLOW}Rebooting in 3 seconds...${NC}" +sleep 3 +reboot \ No newline at end of file