The Ubuntu Templates Directory Hack

很多人安装了 Ubuntu 后都会发现默认存在一个 Templates 目录,但是大都没有或不知道该如何利用它。今天就来分享一下 Templates 目录是什么以及如何用它提升我们日常写作或工作的效率?

从 User Dirs 规范到 Templates

TempaltesDesktopDownloadPublicDocumentsMusic, PicturesVideos 目录是 Ubuntu (以及大多数 Linux 桌面环境)默认提供的用户目录(XDG User Directories)。

XDG(X Desktop Group 的缩写,后改名为 freedesktop.org),致力于开发与维护与桌面系统相关的规范和软件。其中 XDG 基础目录规范(XDG Base Directory Specification) 定义了一个或多个基目录及其存放位置。如:

$XDG_CONFIG_HOME    (~/.config)
$XDG_DATA_HOME      (~/.local/share)
$XDG_CACHE_HOME     (~/.cache)

而 XDG 用户目录则定义了如下默认目录变量(~/.config/user-dirs.dirs):

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
其中 `Desktop`,`Download`,`Public` 等目录较为常用,不作分析,只提示一下我们可以为其改名或者删除默认提供的目录项(如果你觉得多余的话)。

回到 Templates,顾名思义,它是模板集(中文很多情况下应该在复数后面加上“集/群/簇”)目录。Ubuntu 使用该目录来存放一些常用的文件模板,以便我们可以迅速创建特定格式文件。如左图所示,我们可以通过预先存放的 Application.desktop, README.md, Script.sh, Thoughts.md, Tutorial.md

当然,如果不爽 Templates 大摇大摆待在主目录下,还可以通过修改 ~/.config/user-dirs.dirs 中的 XDG_TEMPLATES_DIR="$HOME/.Templates" 将其设置为隐藏目录(记得使用命令行程序 xdg-user-dirs-update 完成更新)。

模板示例

这里是一些示例模板文件 (更多可见 GitHub ubuntu-templates) :

Application.desktop

[Desktop Entry]
Type=Application
Name=myAppName
Icon=~/myApp/icon.xpm
Exec=~/myApp/launcher
Comment=brief description
Categories=AudioVideo;Audio;Video;Development;Education;Game;Graphics;Network;Office;Science;Settings;System;Utility
Terminal=false

Thoughts.md - 应对灵光一闪

#### What's the Problem?


#### Thoughts


#### More...

Script.sh

#!/usr/bin/env bash

# Tool - Description of tool
#
# Usage:
#
# Author:
# Version:
# License:

set -euo pipefail   # strict mode
IFS=$'\n\t'

# --- Core path definition ---
readonly SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")

# --- Color definition ---
setup_colors() {
	if [[ -t 1 || -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then
		readonly RED='\033[0;31m'
		readonly GREEN='\033[0;32m'
		readonly YELLOW='\033[0;33m'
		readonly BLUE='\033[0;34m'
		readonly MAGENTA='\033[0;35m'
		readonly CYAN='\033[0;36m'
		readonly WHITE='\033[0;37m'
		readonly BOLD='\033[1m'
		readonly NC='\033[0m'
	else
		readonly RED='' GREEN='' YELLOW='' BLUE='' MAGENTA='' CYAN='' WHITE='' BOLD='' NC=''
	fi
}

# --- Logging function ---
log() { echo -e "${BLUE}[$(date +'%Y-%m-%dT%H:%M:%S%z')]${NC} $*"; }
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" >&2; }
error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }

# --- Helper function ---
show_help() {
	cat << EOF
Usage: ${SCRIPT_NAME} [OPTION] [ARGS]

Description:
	...

Options:
	-h, --help      show help message

Arguments:

Example:

EOF
}

# --- cleanup function ---
cleanup() {
	# 1. get exit status code
	local exit_code=$?

	# 2. disable trap
	trap - SIGINT SIGTERM EXIT

	# 3. clean temp files...


	# 4. give exit hint
	if [ "$exit_code" -ne 0 ]; then
		error "Script exit abnormally!"
	fi

	# 5. exit
	exit "$exit_code"
}
trap cleanup SIGINT SIGTERM EXIT

# --- Arguments parse ---
parse_params() {
	# flags
	# VERBOSE=false

	while [[ $# -gt 0 ]]; do
		case "$1" in
			-h|--help)
				show_help
				exit 0
				;;
			# ...
			# shift
			# ;;
			-?*)
				error "Unknown option: $1"
				show_help
				exit 1
				;;
		esac
	done
}

# --- main logic ---
main() {
	setup_colors
	parse_params "$@"

	info "${BOLD}Script started.${NC}"
	# ...

	info "${BOLD}Script completed successfully.${NC}"
}

# start script
main "$@"

AI 意味着什么?

Python Immutable Sequences Concatenation