From 621f927cf3b9f236df332717338ef6cfa64b6ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E7=8C=AB=E5=88=AB=E7=86=AC=E5=A4=9C?= <11595443+qiu-tenghuang@user.noreply.gitee.com> Date: Thu, 26 Dec 2024 13:42:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4tasks=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\206(Checkout)\346\240\267\345\274\217.md" | 290 +++ ...43\347\240\201\347\211\207\346\256\265.md" | 5 +- ...06\345\217\212\345\221\250\346\212\245.md" | 362 ++++ ...55\346\263\225\346\211\213\345\206\214.md" | 1865 +++++++++++++++++ .../Tasks/obsidian-tasks-plugin.md" | 17 +- 5 files changed, 2535 insertions(+), 4 deletions(-) create mode 100644 "10-Obsidian/Obsidian\345\244\226\350\247\202/CSS \347\211\207\346\256\265/Obsidian\346\240\267\345\274\217-Minimal\344\270\273\351\242\230\345\244\215\351\200\211\346\241\206(Checkout)\346\240\267\345\274\217.md" create mode 100644 "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/DataViewJS+Tasks-\346\234\200\344\275\263\347\232\204\346\257\217\345\221\250\344\273\273\345\212\241\347\256\241\347\220\206\345\217\212\345\221\250\346\212\245.md" create mode 100644 "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" rename "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/obsidian-tasks-plugin.md" => "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/obsidian-tasks-plugin.md" (95%) diff --git "a/10-Obsidian/Obsidian\345\244\226\350\247\202/CSS \347\211\207\346\256\265/Obsidian\346\240\267\345\274\217-Minimal\344\270\273\351\242\230\345\244\215\351\200\211\346\241\206(Checkout)\346\240\267\345\274\217.md" "b/10-Obsidian/Obsidian\345\244\226\350\247\202/CSS \347\211\207\346\256\265/Obsidian\346\240\267\345\274\217-Minimal\344\270\273\351\242\230\345\244\215\351\200\211\346\241\206(Checkout)\346\240\267\345\274\217.md" new file mode 100644 index 00000000..71353a76 --- /dev/null +++ "b/10-Obsidian/Obsidian\345\244\226\350\247\202/CSS \347\211\207\346\256\265/Obsidian\346\240\267\345\274\217-Minimal\344\270\273\351\242\230\345\244\215\351\200\211\346\241\206(Checkout)\346\240\267\345\274\217.md" @@ -0,0 +1,290 @@ +--- +uid: 20241226133515 +title: Obsidian 样式 -Minimal 主题复选框 (Checkout) 样式 +tags: [复选框, Checkout, CSS美化] +description: Minimal 主题复选框 (Checkout) 样式 +author: 熊猫别熬夜 +type: other +draft: false +editable: false +modified: 20241226133613 +--- + +# Obsidian 样式 -Minimal 主题复选框 (Checkout) 样式 + +## 效果 + +![240415_Obsidian样式:Minimal主题复选框(Checkout)样式.md](https://cdn.pkmer.cn/images/202412261335154.jpg!pkmer) + +## CSS + +```css +/* task选择器样式 来自Minimal v7.5.4 by 熊猫别熬夜*/ + +input[data-task="!"]:checked, +input[data-task="*"]:checked, +input[data-task="-"]:checked, +input[data-task="<"]:checked, +input[data-task=">"]:checked, +input[data-task=I]:checked, +input[data-task=b]:checked, +input[data-task=c]:checked, +input[data-task=d]:checked, +input[data-task=f]:checked, +input[data-task=k]:checked, +input[data-task=l]:checked, +input[data-task=p]:checked, +input[data-task=u]:checked, +input[data-task=w]:checked, +li[data-task="!"]>input:checked, +li[data-task="!"]>p>input:checked, +li[data-task="*"]>input:checked, +li[data-task="*"]>p>input:checked, +li[data-task="-"]>input:checked, +li[data-task="-"]>p>input:checked, +li[data-task="<"]>input:checked, +li[data-task="<"]>p>input:checked, +li[data-task=">"]>input:checked, +li[data-task=">"]>p>input:checked, +li[data-task=I]>input:checked, +li[data-task=I]>p>input:checked, +li[data-task=b]>input:checked, +li[data-task=b]>p>input:checked, +li[data-task=c]>input:checked, +li[data-task=c]>p>input:checked, +li[data-task=d]>input:checked, +li[data-task=d]>p>input:checked, +li[data-task=f]>input:checked, +li[data-task=f]>p>input:checked, +li[data-task=k]>input:checked, +li[data-task=k]>p>input:checked, +li[data-task=l]>input:checked, +li[data-task=l]>p>input:checked, +li[data-task=p]>input:checked, +li[data-task=p]>p>input:checked, +li[data-task=u]>input:checked, +li[data-task=u]>p>input:checked, +li[data-task=w]>input:checked, +li[data-task=w]>p>input:checked { + --checkbox-marker-color: transparent; + border: none; + border-radius: 0; + background-image: none; + background-color: currentColor; + -webkit-mask-size: var(--checkbox-icon); + -webkit-mask-position: 50% 50% +} + +input[data-task=">"]:checked, +li[data-task=">"]>input:checked, +li[data-task=">"]>p>input:checked { + color: var(--text-faint); + transform: rotate(90deg); + -webkit-mask-position: 50% 100%; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M10.894 2.553a1 1 0 00-1.788 0l-7 14a1 1 0 001.169 1.409l5-1.429A1 1 0 009 15.571V11a1 1 0 112 0v4.571a1 1 0 00.725.962l5 1.428a1 1 0 001.17-1.408l-7-14z' /%3E%3C/svg%3E") +} + +input[data-task="<"]:checked, +li[data-task="<"]>input:checked, +li[data-task="<"]>p>input:checked { + color: var(--text-faint); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z' clip-rule='evenodd' /%3E%3C/svg%3E"); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task="?"]:checked, +li[data-task="?"]>input:checked, +li[data-task="?"]>p>input:checked { + --checkbox-marker-color: transparent; + background-color: var(--color-yellow); + border-color: var(--color-yellow); + background-position: 50% 50%; + background-size: 200% 90%; + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"%3E%3Cpath fill="white" fill-rule="evenodd" d="M4.475 5.458c-.284 0-.514-.237-.47-.517C4.28 3.24 5.576 2 7.825 2c2.25 0 3.767 1.36 3.767 3.215c0 1.344-.665 2.288-1.79 2.973c-1.1.659-1.414 1.118-1.414 2.01v.03a.5.5 0 0 1-.5.5h-.77a.5.5 0 0 1-.5-.495l-.003-.2c-.043-1.221.477-2.001 1.645-2.712c1.03-.632 1.397-1.135 1.397-2.028c0-.979-.758-1.698-1.926-1.698c-1.009 0-1.71.529-1.938 1.402c-.066.254-.278.461-.54.461h-.777ZM7.496 14c.622 0 1.095-.474 1.095-1.09c0-.618-.473-1.092-1.095-1.092c-.606 0-1.087.474-1.087 1.091S6.89 14 7.496 14Z"%2F%3E%3C%2Fsvg%3E') +} + +.theme-dark input[data-task="?"]:checked, +.theme-dark li[data-task="?"]>input:checked, +.theme-dark li[data-task="?"]>p>input:checked { + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"%3E%3Cpath fill="black" fill-opacity="0.8" fill-rule="evenodd" d="M4.475 5.458c-.284 0-.514-.237-.47-.517C4.28 3.24 5.576 2 7.825 2c2.25 0 3.767 1.36 3.767 3.215c0 1.344-.665 2.288-1.79 2.973c-1.1.659-1.414 1.118-1.414 2.01v.03a.5.5 0 0 1-.5.5h-.77a.5.5 0 0 1-.5-.495l-.003-.2c-.043-1.221.477-2.001 1.645-2.712c1.03-.632 1.397-1.135 1.397-2.028c0-.979-.758-1.698-1.926-1.698c-1.009 0-1.71.529-1.938 1.402c-.066.254-.278.461-.54.461h-.777ZM7.496 14c.622 0 1.095-.474 1.095-1.09c0-.618-.473-1.092-1.095-1.092c-.606 0-1.087.474-1.087 1.091S6.89 14 7.496 14Z"%2F%3E%3C%2Fsvg%3E') +} + +input[data-task="/"]:checked, +li[data-task="/"]>input:checked, +li[data-task="/"]>p>input:checked { + background-image: none; + background-color: rgba(0, 0, 0, 0); + position: relative; + overflow: hidden +} + +input[data-task="/"]:checked:after, +li[data-task="/"]>input:checked:after, +li[data-task="/"]>p>input:checked:after { + top: 0; + left: 0; + content: " "; + display: block; + position: absolute; + background-color: var(--background-modifier-accent); + width: calc(50% - .5px); + height: 100%; + -webkit-mask-image: none +} + +input[data-task="!"]:checked, +li[data-task="!"]>input:checked, +li[data-task="!"]>p>input:checked { + color: var(--color-orange); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task='"']:checked, +input[data-task=“]:checked, +li[data-task='"']>input:checked, +li[data-task='"']>p>input:checked, +li[data-task=“]>input:checked, +li[data-task=“]>p>input:checked { + --checkbox-marker-color: transparent; + background-position: 50% 50%; + background-color: var(--color-cyan); + border-color: var(--color-cyan); + background-size: 75%; + background-repeat: no-repeat; + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"%3E%3Cpath fill="white" d="M6.5 10c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.318.142-.686.238-1.028.466c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.945c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 6.5 10zm11 0c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.317.143-.686.238-1.028.467c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.944c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 17.5 10z"%2F%3E%3C%2Fsvg%3E') +} + +.theme-dark input[data-task='"']:checked, +.theme-dark input[data-task=“]:checked, +.theme-dark li[data-task='"']>input:checked, +.theme-dark li[data-task='"']>p>input:checked, +.theme-dark li[data-task=“]>input:checked, +.theme-dark li[data-task=“]>p>input:checked { + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"%3E%3Cpath fill="black" fill-opacity="0.7" d="M6.5 10c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.318.142-.686.238-1.028.466c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.945c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 6.5 10zm11 0c-.223 0-.437.034-.65.065c.069-.232.14-.468.254-.68c.114-.308.292-.575.469-.844c.148-.291.409-.488.601-.737c.201-.242.475-.403.692-.604c.213-.21.492-.315.714-.463c.232-.133.434-.28.65-.35l.539-.222l.474-.197l-.485-1.938l-.597.144c-.191.048-.424.104-.689.171c-.271.05-.56.187-.882.312c-.317.143-.686.238-1.028.467c-.344.218-.741.4-1.091.692c-.339.301-.748.562-1.05.944c-.33.358-.656.734-.909 1.162c-.293.408-.492.856-.702 1.299c-.19.443-.343.896-.468 1.336c-.237.882-.343 1.72-.384 2.437c-.034.718-.014 1.315.028 1.747c.015.204.043.402.063.539l.025.168l.026-.006A4.5 4.5 0 1 0 17.5 10z"%2F%3E%3C%2Fsvg%3E') +} + +input[data-task="-"]:checked, +li[data-task="-"]>input:checked, +li[data-task="-"]>p>input:checked { + color: var(--text-faint); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +body:not(.tasks) .markdown-preview-view ul li[data-task="-"].task-list-item.is-checked, +body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="-"]), +body:not(.tasks) li[data-task="-"].task-list-item.is-checked { + color: var(--text-faint); + text-decoration: line-through solid var(--text-faint) 1px +} + +input[data-task="*"]:checked, +li[data-task="*"]>input:checked, +li[data-task="*"]>p>input:checked { + color: var(--color-yellow); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z' /%3E%3C/svg%3E") +} + +input[data-task=l]:checked, +li[data-task=l]>input:checked, +li[data-task=l]>p>input:checked { + color: var(--color-red); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=i]:checked, +li[data-task=i]>input:checked, +li[data-task=i]>p>input:checked { + --checkbox-marker-color: transparent; + background-color: var(--color-blue); + border-color: var(--color-blue); + background-position: 50%; + background-size: 100%; + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"%3E%3Cpath fill="none" stroke="white" stroke-linecap="round" stroke-linejoin="round" stroke-width="40" d="M196 220h64v172"%2F%3E%3Cpath fill="none" stroke="white" stroke-linecap="round" stroke-miterlimit="10" stroke-width="40" d="M187 396h138"%2F%3E%3Cpath fill="white" d="M256 160a32 32 0 1 1 32-32a32 32 0 0 1-32 32Z"%2F%3E%3C%2Fsvg%3E') +} + +.theme-dark input[data-task=i]:checked, +.theme-dark li[data-task=i]>input:checked, +.theme-dark li[data-task=i]>p>input:checked { + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"%3E%3Cpath fill="none" stroke="black" stroke-opacity="0.8" stroke-linecap="round" stroke-linejoin="round" stroke-width="40" d="M196 220h64v172"%2F%3E%3Cpath fill="none" stroke="black" stroke-opacity="0.8" stroke-linecap="round" stroke-miterlimit="10" stroke-width="40" d="M187 396h138"%2F%3E%3Cpath fill="black" fill-opacity="0.8" d="M256 160a32 32 0 1 1 32-32a32 32 0 0 1-32 32Z"%2F%3E%3C%2Fsvg%3E') +} + +input[data-task=S]:checked, +li[data-task=S]>input:checked, +li[data-task=S]>p>input:checked { + --checkbox-marker-color: transparent; + border-color: var(--color-green); + background-color: var(--color-green); + background-size: 100%; + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48"%3E%3Cpath fill="white" fill-rule="evenodd" d="M26 8a2 2 0 1 0-4 0v2a8 8 0 1 0 0 16v8a4.002 4.002 0 0 1-3.773-2.666a2 2 0 0 0-3.771 1.332A8.003 8.003 0 0 0 22 38v2a2 2 0 1 0 4 0v-2a8 8 0 1 0 0-16v-8a4.002 4.002 0 0 1 3.773 2.666a2 2 0 0 0 3.771-1.332A8.003 8.003 0 0 0 26 10V8Zm-4 6a4 4 0 0 0 0 8v-8Zm4 12v8a4 4 0 0 0 0-8Z" clip-rule="evenodd"%2F%3E%3C%2Fsvg%3E') +} + +.theme-dark input[data-task=S]:checked, +.theme-dark li[data-task=S]>input:checked, +.theme-dark li[data-task=S]>p>input:checked { + background-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 48 48"%3E%3Cpath fill-opacity="0.8" fill="black" fill-rule="evenodd" d="M26 8a2 2 0 1 0-4 0v2a8 8 0 1 0 0 16v8a4.002 4.002 0 0 1-3.773-2.666a2 2 0 0 0-3.771 1.332A8.003 8.003 0 0 0 22 38v2a2 2 0 1 0 4 0v-2a8 8 0 1 0 0-16v-8a4.002 4.002 0 0 1 3.773 2.666a2 2 0 0 0 3.771-1.332A8.003 8.003 0 0 0 26 10V8Zm-4 6a4 4 0 0 0 0 8v-8Zm4 12v8a4 4 0 0 0 0-8Z" clip-rule="evenodd"%2F%3E%3C%2Fsvg%3E') +} + +input[data-task=I]:checked, +li[data-task=I]>input:checked, +li[data-task=I]>p>input:checked { + color: var(--color-yellow); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M11 3a1 1 0 10-2 0v1a1 1 0 102 0V3zM15.657 5.757a1 1 0 00-1.414-1.414l-.707.707a1 1 0 001.414 1.414l.707-.707zM18 10a1 1 0 01-1 1h-1a1 1 0 110-2h1a1 1 0 011 1zM5.05 6.464A1 1 0 106.464 5.05l-.707-.707a1 1 0 00-1.414 1.414l.707.707zM5 10a1 1 0 01-1 1H3a1 1 0 110-2h1a1 1 0 011 1zM8 16v-1h4v1a2 2 0 11-4 0zM12 14c.015-.34.208-.646.477-.859a4 4 0 10-4.954 0c.27.213.462.519.476.859h4.002z' /%3E%3C/svg%3E") +} + +input[data-task=f]:checked, +li[data-task=f]>input:checked, +li[data-task=f]>p>input:checked { + color: var(--color-red); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12.395 2.553a1 1 0 00-1.45-.385c-.345.23-.614.558-.822.88-.214.33-.403.713-.57 1.116-.334.804-.614 1.768-.84 2.734a31.365 31.365 0 00-.613 3.58 2.64 2.64 0 01-.945-1.067c-.328-.68-.398-1.534-.398-2.654A1 1 0 005.05 6.05 6.981 6.981 0 003 11a7 7 0 1011.95-4.95c-.592-.591-.98-.985-1.348-1.467-.363-.476-.724-1.063-1.207-2.03zM12.12 15.12A3 3 0 017 13s.879.5 2.5.5c0-1 .5-4 1.25-4.5.5 1 .786 1.293 1.371 1.879A2.99 2.99 0 0113 13a2.99 2.99 0 01-.879 2.121z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=k]:checked, +li[data-task=k]>input:checked, +li[data-task=k]>p>input:checked { + color: var(--color-yellow); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M18 8a6 6 0 01-7.743 5.743L10 14l-1 1-1 1H6v2H2v-4l4.257-4.257A6 6 0 1118 8zm-6-4a1 1 0 100 2 2 2 0 012 2 1 1 0 102 0 4 4 0 00-4-4z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=u]:checked, +li[data-task=u]>input:checked, +li[data-task=u]>p>input:checked { + color: var(--color-green); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12 7a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0V8.414l-4.293 4.293a1 1 0 01-1.414 0L8 10.414l-4.293 4.293a1 1 0 01-1.414-1.414l5-5a1 1 0 011.414 0L11 10.586 14.586 7H12z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=d]:checked, +li[data-task=d]>input:checked, +li[data-task=d]>p>input:checked { + color: var(--color-red); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M12 13a1 1 0 100 2h5a1 1 0 001-1V9a1 1 0 10-2 0v2.586l-4.293-4.293a1 1 0 00-1.414 0L8 9.586 3.707 5.293a1 1 0 00-1.414 1.414l5 5a1 1 0 001.414 0L11 9.414 14.586 13H12z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=w]:checked, +li[data-task=w]>input:checked, +li[data-task=w]>p>input:checked { + color: var(--color-purple); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M6 3a1 1 0 011-1h.01a1 1 0 010 2H7a1 1 0 01-1-1zm2 3a1 1 0 00-2 0v1a2 2 0 00-2 2v1a2 2 0 00-2 2v.683a3.7 3.7 0 011.055.485 1.704 1.704 0 001.89 0 3.704 3.704 0 014.11 0 1.704 1.704 0 001.89 0 3.704 3.704 0 014.11 0 1.704 1.704 0 001.89 0A3.7 3.7 0 0118 12.683V12a2 2 0 00-2-2V9a2 2 0 00-2-2V6a1 1 0 10-2 0v1h-1V6a1 1 0 10-2 0v1H8V6zm10 8.868a3.704 3.704 0 01-4.055-.036 1.704 1.704 0 00-1.89 0 3.704 3.704 0 01-4.11 0 1.704 1.704 0 00-1.89 0A3.704 3.704 0 012 14.868V17a1 1 0 001 1h14a1 1 0 001-1v-2.132zM9 3a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1zm3 0a1 1 0 011-1h.01a1 1 0 110 2H13a1 1 0 01-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E") +} + +input[data-task=p]:checked, +li[data-task=p]>input:checked, +li[data-task=p]>p>input:checked { + color: var(--color-green); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z' /%3E%3C/svg%3E") +} + +input[data-task=c]:checked, +li[data-task=c]>input:checked, +li[data-task=c]>p>input:checked { + color: var(--color-orange); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M18 9.5a1.5 1.5 0 11-3 0v-6a1.5 1.5 0 013 0v6zM14 9.667v-5.43a2 2 0 00-1.105-1.79l-.05-.025A4 4 0 0011.055 2H5.64a2 2 0 00-1.962 1.608l-1.2 6A2 2 0 004.44 12H8v4a2 2 0 002 2 1 1 0 001-1v-.667a4 4 0 01.8-2.4l1.4-1.866a4 4 0 00.8-2.4z' /%3E%3C/svg%3E") +} + +input[data-task=b]:checked, +li[data-task=b]>input:checked, +li[data-task=b]>p>input:checked { + color: var(--color-orange); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M5 4a2 2 0 012-2h6a2 2 0 012 2v14l-5-2.5L5 18V4z' /%3E%3C/svg%3E") +} + +``` diff --git "a/10-Obsidian/Obsidian\345\244\226\350\247\202/Obsidian\347\232\204CSS\344\273\243\347\240\201\347\211\207\346\256\265.md" "b/10-Obsidian/Obsidian\345\244\226\350\247\202/Obsidian\347\232\204CSS\344\273\243\347\240\201\347\211\207\346\256\265.md" index 9543b676..c9fd6ce6 100644 --- "a/10-Obsidian/Obsidian\345\244\226\350\247\202/Obsidian\347\232\204CSS\344\273\243\347\240\201\347\211\207\346\256\265.md" +++ "b/10-Obsidian/Obsidian\345\244\226\350\247\202/Obsidian\347\232\204CSS\344\273\243\347\240\201\347\211\207\346\256\265.md" @@ -7,7 +7,7 @@ author: OS,PKMer type: awesome draft: false editable: false -modified: 20241224232938 +modified: 20241226133711 --- # Obsidian 的 CSS 代码片段 @@ -173,11 +173,12 @@ Obsidian 还支持一种外部样式代码引用的方式。 - [[Obsidian样式-特殊标签-让Markdown的文本多彩多色]] - [[Obsidian样式-段落首行增加缩进]] -### 待办 +### 待办 (Checkout) - [[Obsidian样式-待办完成样式]] - [[Obsidian样式-自定义待办图标]] - [[Obsidian样式-待办事项美化复选框]] +- [[Obsidian样式-Minimal主题复选框(Checkout)样式]] ### 引用 diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/DataViewJS+Tasks-\346\234\200\344\275\263\347\232\204\346\257\217\345\221\250\344\273\273\345\212\241\347\256\241\347\220\206\345\217\212\345\221\250\346\212\245.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/DataViewJS+Tasks-\346\234\200\344\275\263\347\232\204\346\257\217\345\221\250\344\273\273\345\212\241\347\256\241\347\220\206\345\217\212\345\221\250\346\212\245.md" new file mode 100644 index 00000000..05a0c222 --- /dev/null +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/DataViewJS+Tasks-\346\234\200\344\275\263\347\232\204\346\257\217\345\221\250\344\273\273\345\212\241\347\256\241\347\220\206\345\217\212\345\221\250\346\212\245.md" @@ -0,0 +1,362 @@ +--- +uid: 20241226133741 +title: DataViewJS+Tasks- 最佳的每周任务管理及周报 +tags: [任务管理, Tasks, Dataviewjs] +description: DataViewJS+Tasks- 最佳的每周任务管理及周报 +author: 熊猫别熬夜 +type: other +draft: false +editable: false +modified: 20241226134042 +--- + +# DataViewJS+Tasks- 最佳的每周任务管理及周报 + +![241221_DataViewJS+Tasks:最佳的每周任务管理及周报.md](https://cdn.pkmer.cn/images/202412261337631.gif) + +## Tasks 查询语法 + +基本的 Tasks 查询语法来列出本周今日的完成或未完成的任务 (包含今日日记为规划的任务),按任务状态分组。 + +````md +```tasks +{(done on today) OR (happens on today)} OR {(happens on or before today) AND (not done) AND (happens on this week)} \ +OR {filter by function \ + const filename = task.file.filenameWithoutExtension; \ + const date1 = window.moment(filename).format('YYYY-MM-DD');\ + const date2 = window.moment().format('YYYY-MM-DD');\ + return date1 === date2;} +# show tree +# group by recurring reverse +group by status.name reverse +limit groups 4 +short mode +``` +```` + +## 基于 DataviewJS 的改造 + +结合 dvjs 控件的 tasks 查询。 + +- 参考案例:[How to get tasks in current file - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/How+To/How+to+get+tasks+in+current+file#Using+Dataview+to+generate+Tasks+blocks+-+the+old+way) + +````md +```dataviewjs +// 获取当前日期 +const today = window.moment(); +let selectedDate = today.clone(); +let currentWeekOffset = 0; + +// showTree 状态 +let showTree = false; +let showWeekTasks = false; + +// 创建一个用于显示当前周次的标签 +const weekControlsContainer = document.createElement("div"); +weekControlsContainer.style.textAlign = "center"; +weekControlsContainer.style.marginBottom = "10px"; + +// 创建 week input +const weekInput = document.createElement("input"); +weekInput.type = "week"; + +// 为 week input 设置样式 +Object.assign(weekInput.style, { + fontSize: "1.2rem", + color: "var(--text-normal)", + backgroundColor: "var(--background-primary)", + border: "1px solid var(--background-modifier-border)", + borderRadius: "4px", + padding: "0.2rem", + outline: "none" +}); + +// 设置初始值为当前周 +function getFormattedWeekString(date) { + const year = date.format("YYYY"); + const week = date.format("WW"); + return `${year}-W${week}`; +} +weekInput.value = getFormattedWeekString(today); + +// 设置 week input 的事件监听 +weekInput.addEventListener("change", () => { + const [year, week] = weekInput.value.split('-W').map(str => parseInt(str)); + const firstWeek = today.clone().year(year).startOf('year').week(1); + const targetWeekStart = firstWeek.add(week - 1, 'weeks'); + currentWeekOffset = targetWeekStart.week() - today.week(); + dayButtonsContainer.children[0].click(); +}); + +// 创建操作按钮 +const leftButtonWeek = document.createElement("button"); +const rightButtonWeek = document.createElement("button"); +const toggleShowTreeButton = document.createElement("button"); +const toggleShowWeekTasksButton = document.createElement("button"); +const todayButton = document.createElement("button"); + +[leftButtonWeek, rightButtonWeek, todayButton, toggleShowTreeButton,toggleShowWeekTasksButton].forEach(button => { + button.style.border = "none"; + button.style.margin = "0 5px"; + button.style.padding = "5px 10px"; + button.style.backgroundColor = "var(--interactive-accent)"; + button.style.fontSize = "large"; + button.style.color = "var(--text-on-accent)"; + button.style.cursor = "pointer"; +}); +leftButtonWeek.textContent = "←"; +rightButtonWeek.textContent = "→"; +toggleShowTreeButton.textContent = "↳"; +toggleShowWeekTasksButton.textContent = "周报"; +todayButton.textContent = "今日"; + +// 添加按钮逻辑 +leftButtonWeek.addEventListener("click", () => { + currentWeekOffset -= 1; + updateWeekInput(); + dayButtonsContainer.children[0].click(); +}); + +rightButtonWeek.addEventListener("click", () => { + currentWeekOffset += 1; + updateWeekInput(); + dayButtonsContainer.children[0].click(); +}); + +todayButton.addEventListener("click", () => { + currentWeekOffset = 0; + updateWeekInput(); + const todayIndex = today.day() === 0 ? 6 : today.day() - 1; + dayButtonsContainer.children[todayIndex].click(); +}); + +// 初始化 可选按钮 +function initButtonTheme(button, active) { + if (active) { + button.style.color = "var(--text-on-accent)"; + button.style.backgroundColor = "var(--interactive-accent)"; + } else { + button.style.color = "var(--text-normal)"; + button.style.backgroundColor = "transparent"; + } +} + +toggleShowTreeButton.addEventListener("click", () => { + showTree = !showTree; + initButtonTheme(toggleShowTreeButton, showTree); + dayButtonsContainer.querySelector("button[style*='interactive-accent']").click(); +}); + +toggleShowWeekTasksButton.addEventListener("click", () => { + showWeekTasks = !showWeekTasks; + initButtonTheme(toggleShowWeekTasksButton, showWeekTasks); + dayButtonsContainer.querySelector("button[style*='interactive-accent']").click(); +}); + +// 初始化按钮主题色 +initButtonTheme(toggleShowTreeButton, showTree); +initButtonTheme(toggleShowWeekTasksButton, showWeekTasks); + + +// 更新周次选择框 +function updateWeekInput() { + const startDate = today.clone().startOf('week').add(currentWeekOffset, 'weeks'); + weekInput.value = getFormattedWeekString(startDate); +} + +// 插入控件 +weekControlsContainer.appendChild(toggleShowWeekTasksButton); +weekControlsContainer.appendChild(leftButtonWeek); +weekControlsContainer.appendChild(weekInput); +weekControlsContainer.appendChild(rightButtonWeek); +weekControlsContainer.appendChild(toggleShowTreeButton); +weekControlsContainer.appendChild(todayButton); +// 添加到页面中 +document.body.appendChild(weekControlsContainer); +dv.container.appendChild(weekControlsContainer); + +// 创建星期按钮 +const daysOfWeek = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"]; +const dayButtonsContainer = document.createElement("div"); +dayButtonsContainer.style.display = "flex"; +dayButtonsContainer.style.justifyContent = "center"; +dayButtonsContainer.style.width = "100%"; + +// 存储当前选中的按钮 +let selectedButton; +// 添加样式的默认值 +const defaultButtonStyle = { + border: "none", + borderRadius: "0px", + cursor: "pointer", + fontSize: "large", + flex: "1 1 auto", + color: "var(--text-normal)", + backgroundColor: "transparent", +}; + +daysOfWeek.forEach((day, index) => { + const button = document.createElement("button"); + Object.assign(button.style, defaultButtonStyle); + button.textContent = day; + + button.addEventListener("click", () => { + // 设置选中的日期 + selectedDate = today.clone().startOf("week").add(currentWeekOffset, "weeks").add(index, "days"); + updateTasksView(); + + // 更新先前选中按钮的样式 + if (selectedButton) { + Object.assign(selectedButton.style, defaultButtonStyle); + } + + // 更新选中按钮的样式 + button.style.backgroundColor = "var(--interactive-accent)"; + button.style.color = "var(--text-on-accent)"; + selectedButton = button; + }); + + dayButtonsContainer.appendChild(button); +}); +// 插入星期按钮容器 +dv.container.appendChild(dayButtonsContainer); + +function updateTasksView() { + dv.container.innerHTML = ""; + dv.container.appendChild(weekControlsContainer); + dv.container.appendChild(dayButtonsContainer); + + const dateStr = selectedDate.format("YYYY-MM-DD"); + const weekStr = selectedDate.format("YYYY-[W]WW"); + const showTreeOption = showTree ? "show tree" : ""; + const queryDayOfWeek = ` + {(done on ${dateStr}) OR (happens on ${dateStr}) }\\ + OR {(happens before ${dateStr}) AND (not done) AND (happens on ${weekStr}) }\\ + OR {filter by function \\ + const filename = task.file.filenameWithoutExtension;\\ + const date1 = window.moment(filename).format('YYYY-MM-DD');\\ + return date1 === '${dateStr}';} + ${showTreeOption} + group by status.name reverse + short mode + is not recurring + # limit groups 5 + `; + const queryWeek = ` + group by function task.description.includes("http") ? "🌐阅读记录" : "📅任务记录" + {(done on ${weekStr}) OR (happens on ${weekStr})} + ${showTreeOption} + is not recurring + # group by status.name + group by done reverse + short mode + limit 100 + `; + const query = !showWeekTasks ? queryDayOfWeek : queryWeek; + + dv.paragraph("```tasks\n" + query + "\n```"); +} + +// 初始化:选择今天 +todayButton.click() + +// 监听今日按钮的双击事件 +todayButton.addEventListener("dblclick", () => { + app.commands.executeCommandById("daily-notes"); +}); +``` +```` + +- [[241226_修改版本记录]] + +## Tip:固定到侧边 + +可以将该查询笔记放到侧边栏,固定住就行,可以用 CSS 隐藏固定按钮: + +```css +/* !在左右侧边栏中不显示固定按钮 */ +.workspace-split.mod-horizontal.mod-right-split, +.workspace-split.mod-horizontal.mod-left-split { + .workspace-tab-header-status-container { + display: none; + } + /* 缩减底部空白 不然可能加载成空白页 */ + .markdown-preview-section { + padding-bottom: 0px !important; + min-height: unset !important; + } + + .embedded-backlinks { + display: none; + } +} +``` + +## 关于如何规划任务 + +### 任务状态 + +首先得了解下 Tasks 插件定义的任务状态 (task.status.type),任务状态类型只有 4 种:TODO、DONE、IN_PROGRESS、CANCELLED。 + +| 状态符号 | 下一个状态符号 | 状态名称 | 状态类型 | +| ---- | ------- | ---- | ------------- | +| `空格` | `x` | 待办 | `TODO` | +| `x` | `空格` | 已完成 | `DONE` | +| `/` | `x` | 进行中 | `IN_PROGRESS` | +| `-` | `空格` | 取消 | `CANCELLED` | + +```mermaid +flowchart LR + +classDef TODO stroke:#f33,stroke-width:3px; +classDef DONE stroke:#0c0,stroke-width:3px; +classDef IN_PROGRESS stroke:#fa0,stroke-width:3px; +classDef CANCELLED stroke:#ddd,stroke-width:3px; +classDef NON_TASK stroke:#99e,stroke-width:3px; + +1["'Todo'
[ ] -> [x]
(TODO)"]:::TODO +2["'Done'
[x] -> [ ]
(DONE)"]:::DONE +3["'In Progress'
[/] -> [x]
(IN_PROGRESS)"]:::IN_PROGRESS +4["'Cancelled'
[-] -> [ ]
(CANCELLED)"]:::CANCELLED +1 --> 2 +2 --> 1 +3 --> 2 +4 --> 1 + +linkStyle default stroke:gray +``` + + + +### 任务名称 + +可能这些状态对于任务管理的分类来说有点简单了,Tasks 插件还支持自定义的任务样式以及设置不同的任务状态名称 (task.status.name),你可以通过在 tasks 插件设置中进行添加自定义任务名称以及设置对应的任务类型。 + +![241221_DataViewJS+Tasks:最佳的每周任务管理及周报.md](https://cdn.pkmer.cn/images/202412261337155.png!pkmer) + +### 拓展:导入其他主题定义的任务样式 + +幸运的是,Tasks 插件支持一键导入个别主题定义的复选框样式,只需要点击你需要主题定义的样式既可。 + +![241221_DataViewJS+Tasks:最佳的每周任务管理及周报.md](https://cdn.pkmer.cn/images/202412261337531.png!pkmer) + +如果你不想专门为了一个复选框样式去更改主题,可以使用如下的 Minimal 主题的复选框样式的片段:[[Obsidian样式-Minimal主题复选框(Checkout)样式]] + +导入后也可以二次编辑,比如修改一些任务名称的任务类型,或者删除一些你需要的状态。 + +![241221_DataViewJS+Tasks:最佳的每周任务管理及周报.md](https://cdn.pkmer.cn/images/202412261337903.png!pkmer) + +## Reference + +- [Introduction - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Introduction) +- [[基于 QuickAdd+Modal Form的任务 (Task) 编辑器]] +- [[Obsidian样式-Kanban魔改之四象限模式和康奈尔笔记模式]] +- [How to get tasks in current file - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/How+To/How+to+get+tasks+in+current+file#Using+Dataview+to+generate+Tasks+blocks+-+the+old+way) +- [今日任务面板(附实用美化技巧) - 经验分享 - Obsidian 中文论坛](https://forum-zh.obsidian.md/t/topic/38641) + +## 存在问题 + +- [基于DataviewJS的Tasks查询每周的任务#6,来自 benx - 经验分享 - Obsidian 中文论坛](https://forum-zh.obsidian.md/t/topic/44304/6?u=熊猫别熬夜) +- momentJS 可以用 ISOWeek 来替代,因为它默认也是周日 day1 + - ![241221_DataViewJS+Tasks:最佳的每周任务管理及周报.md](https://cdn.pkmer.cn/images/202412261337403.png!pkmer) + diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" new file mode 100644 index 00000000..3ab6780f --- /dev/null +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" @@ -0,0 +1,1865 @@ +--- +uid: 20241226133215 +title: 关于查询 +tags: [任务管理] +description: Tasks查询语法的介绍 +author: 熊猫别熬夜 +type: other +draft: false +editable: false +modified: 20241226133323 +--- + + + +> [!tip]+ 参考资料 +> [Tasks用户指南](https://publish.obsidian.md/tasks/Introduction) + +# 关于查询 + +> [About Queries - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/About+Queries) + +可以通过使用 `tasks` 代码块查询来列出整个保管库中的 Task。您可以通过单击 Task 旁边的小铅笔图标来编辑查询结果中的 Task。默认情况下,Task 按状态、截止日期和路径排序。您可以更改排序(请参阅下面的查询选项)。 + + + +查询 Task 最简单的方法是这样的: + +````md +```tasks + +``` +```` + +在实时预览和阅读模式下,这将列出您保管库中的**所有 Task**,无论其状态等属性如何。 + +这可能不是您想要的。因此,Task 允许您设置查询选项来过滤要显示的 Task。例如,您可以仅显示今天到期的 Task(来自保管库中的任何位置): + +````md +## Due today + +```tasks +due today +not done +``` +```` + + + +> [!note]+ Tasks 查询语法的执行循序 +> +> 1. 所有过滤器指令均已运行 +> 2. 然后运行任何排序指令 +> 3. 然后运行任何 `limit` 指令 +> 4. 然后运行任何 `groups` 指令 +> 5. 然后运行任何 `limit groups` 指令 + + + +# 过滤器 (Filters) + +> [Filters - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Filters) + +- Custom Filters:自定义过滤器 +- Searching for dates:搜索日期 +- Text filters:文本过滤器 +- Matching multiple filters:匹配多个过滤器 +- Filters for Task Statuses:任务状态过滤器 +- Filters for Task Dependencies:任务依赖性过滤器 +- Filters for Dates in Tasks:过滤任务中的日期 +- Filters for Other Task Properties:其他任务属性的过滤器 +- Filters for File Properties:文件属性过滤器 + + + +## 自定义过滤器 Custom Filters + +> [!tip]+ +> `filter by function` was introduced in Tasks 4.2.0. +> `filter by function` 在 Tasks 4.2.0 中引入。 + +Task 提供了许多内置的过滤选项,但有时它们并不能完全满足所有用户的需求。 + +现在,Tasks 拥有强大的机制,让您创建自己的自定义过滤器,提供无与伦比的灵活性。 + +以下文档中提供了许多自定义过滤指令 `filter by function` 的示例,包括解释,用于当内置到 Task 中的指令不能满足您的偏好时。 + +您可以在自定义过滤器 ( [Custom Filters](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)) 中了解更多关于这个非常强大的功能的信息。 + + + +## 搜索日期 + +任务在查询块内的日期方面提供了很大的灵活性。 + +基本上有两种主要的日期搜索类型: + +- 特定日期搜索 +- 日期范围搜索 + + + +### 特定日期搜索 + +````md +```tasks +starts before 2023-04-20 +due on or before today +``` +```` + + + +#### 日期搜索选项 + +| option 选项 | all earlier dates | search date | all later dates | +| -------------- | :---------------: | :---------: | :-------------: | +| `before` | ✔ | | | +| `on or before` | ✔ | ✔ | | +| `on` | | ✔ | | +| `on or after` | | ✔ | ✔ | +| `after` | | | ✔ | + +> [!tip]+ +> `on or before` 和 `on or after` 在 Task 4.6.0 中被引入。 + + + +#### 绝对日期 + +`` 过滤器可以使用“绝对”日期,其首选格式为 `YYYY-MM-DD` 。绝对日期指定日历中的特定日期。它们代表同一天,无论今天的日期如何。 + +Examples: 示例: + +- `2021-05-25` + + + +#### 相对日期 + +`` 过滤器可以与 `relative` 相对日期一起提供。相对日期是根据今天的日期计算的。 + +当天变化时,相对日期如 `due today` 将被重新评估,以确保列表保持最新。 + +基本示例: + +- `yesterday` +- `today` +- `tomorrow` +- `next monday` +- `last friday` +- `14 days ago` +- `in two weeks` +- `14 October` (将使用当前年份) +- `May` (本年度 5 月 1 日将被使用) + +请注意,如果是星期三并且你写 `tuesday` ,任务假定你指的是“昨天”,因为那是最近的星期二。如果你想指“下个星期二”,请使用 `next tuesday` 。 + + + +### 日期范围搜索 + +Task 允许指定一对日期进行日期搜索, `` 。 + +本节描述日期范围搜索,例如: + +````md hl:2 +```tasks +due 2023-11-25 2023-11-30 +happens this week +``` +```` + + + +#### 绝对日期范围 + +| option 选项 | all earlier dates | `start date` | all dates inside the range | `end date` | all later dates | +| -------------- | ----------------- | ------------ | -------------------------- | ---------- | --------------- | +| `before` | ✔ | | | | | +| `in or before` | ✔ | ✔ | ✔ | ✔ | | +| `in` | | ✔ | ✔ | ✔ | | +| `in or after` | | ✔ | ✔ | ✔ | ✔ | +| `after` | | | | | ✔ | + + + +#### 相对日期范围 + +Tasks 支持一组非常特定的相对 `` 值: `last|this|next week|month|quarter|year` 。管道( `|` )字符表示“或”。 + +任务将根据今天的日期处理这些范围,并将其内部转换为绝对日期范围( `YYYY-MM-DD YYYY-MM-DD` )。 + +示例相对日期范围: + +- `in this week` 本周一至周日(含) +- `after this month` +- `next quarter` +- `on or before next year` + + + +#### 编号日期范围 + +也可以使用独立于当前日期的编号日期范围的能力。这些编号日期范围类型得到支持: + +- Week 周 + - Format: `YYYY-Www` ( `ww` 为周数,总是两位数字) + - Example: `2022-W14` 示例: `2022-W14` +- Month 月份 + - Format: `YYYY-mm` ( `mm` 为月份数字,总是两位数) + - Example: `2023-10` 示例: `2023-10` +- Quarter 季度 + - Format: `YYYY-Qq` ( `q` 是季度编号,总是 1 位数) + - Example: `2021-Q4` +- Year 年份 + - Format: `YYYY` + - Example: `2023` ` + +> [!tip]+ +> 编号日期范围在任务 3.1.0 中引入。 + + + +## Text filters 文本过滤器 + +文本搜索过滤器有 2 种类型: + +1. `heading (includes|does not include) ` +2. `heading (regex matches|regex does not match) //` + +> [[#Heading 标题过滤器]] + + + +## 匹配多个过滤器 + +每行查询都必须匹配,任务才能列出。换句话说,行之间被视为存在一个 'AND' 运算符。在每行中,您可以使用布尔运算符 `NOT` 、 `AND` 、 `OR` 、 `AND NOT` 、 `OR NOT` 和 `XOR` ,只要将单个过滤器用括号括起来即可: + +````md +```tasks +(no due date) OR (due after 2021-04-04) +path includes GitHub +``` + +```tasks +due after 2021-04-04 +(path includes GitHub) AND NOT (tags include #todo) +``` +```` + + + +## 任务状态过滤器 + +- Status 状态 +- Status Name 状态名称 +- Status Type 状态类型 +- Status Symbol 状态符号 +- Next Status Symbol 下一个状态符号 + +示例,查找具有尚未添加到任务设置中的状态符号的任何任务: + +```` +```tasks +status.name includes unknown +group by path +``` +```` + + + +### Status + +- `done` - 匹配状态类型为 `DONE` 、 `CANCELLED` 和 `NON_TASK` 任务 +- `not done` - 匹配状态类型为 `TODO` 和 `IN_PROGRESS` 任务 + +> [!tip]+ 在 Tasks 1.23.0 之前,没有任务状态类型的概念,因此仅使用状态符号: +> +> - 带有 `[ ]` 任务被视为 `not done` +> - 除空格外的任何其他字符均视为已 `done` + + + +自 4.2.0 任务以来,现在可以使用 `task.isDone` 进行按状态的自定义过滤。 + +```js +filter by function task.isDone +``` + +- 与 `done` 过滤器相同,但与其他行上的表达式结合使用可能很有用。 + +```js +filter by function ! task.isDone +``` + +- 与 `not done` 过滤器相同,但与其他行上的表达式结合使用可能很有用。 + +> [!caution]+ +> `task.status.type` (see [Status Type](https://publish.obsidian.md/tasks/Queries/Filters#Status%20Type)) 在自定义过滤器中比 `task.isDone` 提供更多精度。 + + + +### Status Name + +自定义的状态名称,例如,也许您将 `[!]` 命名为 `Important` ,因此该字段将搜索具有该状态符号的所有任务的文本 `Important` 。 + +- `status.name (includes|does not include) ` + - 不区分大小写(忽略大小写)。 +- 正则表达式匹配(默认区分大小写)。 + - 必备阅读: [正则表达式搜索](https://publish.obsidian.md/tasks/Queries/Regular+Expressions)。 + +> [!tip]+ +> `status.name` 文本搜索是在任务 1.23.0 中引入的。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.status.name`**按状态名称进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.status.name === 'Unknown' +``` + +- 查找尚未添加到任务设置中的具有自定义状态的所有任务。 + + + +### Status Type + +- `status.type (is|is not) (TODO|DONE|IN_PROGRESS|CANCELLED|NON_TASK)` + - `TODO` 等值不区分大小写:例如,您可以使用 `in_progress` +- 这将搜索您为自定义状态指定的类型。 +- 如果您希望找到所有处于 `IN_PROGRESS` 的任务,并且您已将状态设置为 `[/]` 、 `[d]` 以及可能还有其他几个 `IN_PROGRESS` ,则此搜索非常有效。 +- 要搜索多种可能的状态类型: + - 要排除多个值,可以使用多个 `status.type is not` 行。 + - 要允许多个值,请使用布尔组合,例如: `( status.type is TODO ) OR ( status.type is IN_PROGRESS )` 。 + - 或者参见下面的“自定义过滤”示例。 + +> [!tip]+ +> `status.type` 文本搜索是在任务 1.23.0 中引入的。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.status.type`**按状态类型进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.status.type === 'NON_TASK' +``` + +- 查找 `NON_TASK` 类型的任务。 + +--- + +```javascript +filter by function 'TODO,IN_PROGRESS'.includes(task.status.type) +``` + +- 查找类型为 `TODO` 或类型 `IN_PROGRESS` 的任务。 +- 这比执行布尔 `OR` 搜索更方便。 + +--- + +```javascript +filter by function ! 'NON_TASK,CANCELLED'.includes(task.status.type) +``` + +- 查找类型不是 `NON_TASK` 且不是类型 `CANCELLED` 的任务。 + + + +### Status Symbol + +没有内置的指令来按状态符号进行过滤。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.status.symbol`**按状态符号进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.status.symbol === '-' +``` + +- 查找带有复选框 `[-]` 的任务,该复选框通常用于表示“已取消”。 + +```javascript +filter by function task.status.symbol !== ' ' +``` + +- 查找除空格字符以外的任何内容作为状态符号的任务,即不带复选框 `[ ]` 任务。 + +```javascript +filter by function \ + const symbol = task.status.symbol; \ + return symbol === 'P' || symbol === 'C' || symbol === 'Q' || symbol === 'A'; +``` + +- 注意,因为我们使用变量来避免重复,所以我们需要添加 `return` +- 查找带有状态符号 `P` 、 `C` 、 `Q` 或 `A` 的任务。 +- 您想要搜索的符号越多,这可能会变得非常冗长。 + +```javascript +filter by function 'PCQA'.includes(task.status.symbol) +``` + +- 查找带有状态符号 `P` 、 `C` 、 `Q` 或 `A` 的任务。 +- 这是独立测试每个允许值的较长语句的便捷捷径。 + +```javascript +filter by function !' -x/'.includes(task.status.symbol) +``` + +- 查找带有默认设置中的任务不支持的任何状态符号的任务。 + + + +### Next Status Symbol + +没有内置指令可以按下一个状态符号进行过滤。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.status.nextSymbol`**按下一个状态符号进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.status.symbol === task.status.nextSymbol +``` + +- 查找切换到自身的任务,因为下一个符号与当前符号相同。 + + + +## 其他任务属性的筛选器 + +> [Filters - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Filters#Filters+for+Other+Task+Properties) + +- Description 描述 +- Description without tags 没有标签的描述 +- Priority 优先事项 +- Urgency 紧迫性 +- Recurrence 复发 +- Sub-Items 子项目 +- Tags 标签 +- Markdown + + + +### Description + +- `description (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 匹配时忽略全局过滤器。 +- `description (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + +> [!tip]+ +> - `regex matches` 和 `regex does not match` 是在任务 1.12.0 中引入的。 + + + +对于精确搜索,了解该 `description` 可能会有所帮助: + +- 首先删除每个任务的所有能指表情符号及其值, +- 然后删除所有全局过滤器, +- 然后删除尾随空格 +- 然后搜索剩余的文本 + + 例如: + +|全局过滤器|任务线|按 `description` 搜索文本| +|---|---|---| +|没有全局过滤器|`'- [ ] Do stuff ⏫ #tag1 ✅ 2022-08-12 #tag2/sub-tag '`|`'Do stuff #tag1 #tag2/sub-tag'`| +|`#task`|`'- [ ] #task Do stuff ⏫ #tag1 ✅ 2022-08-12 #tag2/sub-tag '`|`'Do stuff #tag1 #tag2/sub-tag'`| +|`global-filter`|`'- [ ] global-filter Do stuff ⏫ #tag1 ✅ 2022-08-12 #tag2/sub-tag '`|`'Do stuff #tag1 #tag2/sub-tag'`| + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.description`**按描述进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.description.length > 100 +``` + +- 查找具有长描述的任务。 + + + +### Description without tags + +从 Tasks 4.2.0 开始,可以使用 `task.descriptionWithoutTags` 从自定义过滤器的描述中删除标签,以便在**[自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**中使用。 + + + +### Priority + +- `priority is (above|below|not)? (lowest|low|none|medium|high|highest)` + +可用的优先级为(从高到低): + +1. 🔺 最高优先级 +2. ⏫ 高优先级 +3. 🔼 中等优先级 +4. 不使用指示符来表示没有优先级(使用“none”进行搜索) +5. 🔽 低优先级 +6. ⏬️ 最低优先级 + +> [!tip]+ +> - 任务 3.9.0 中引入了“最低”和“最高”优先级。 + + + +#### 示例 + +```` +```tasks +not done +priority is above none +``` + +```tasks +priority is high +``` + +```tasks +not done +priority is not none +``` +```` + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.priorityName` 和 `task.priorityNumber`**按优先级名称和编号进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + + 使用优先级名称: + +```javascript +filter by function task.priorityName !== 'Normal' +``` + +- 与 `priority is not none` 。 + +使用优先级编号: + +```javascript +filter by function task.priorityNumber % 2 === 0 +``` + +- 使用任务的优先级编号进行过滤,其中最高为 0,最低为 5。 +- 这个人工示例找到所有具有偶数优先级编号的任务,即最高、中和低优先级。 + + + +### Urgency + +没有内置的指令来按紧急程度进行过滤。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.urgency`**按紧急程度进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +> [!caution]+ +> 请仔细阅读以下示例。要成功将 `task.urgency` 与 `filter by function` 结合使用,了解如何处理非整数搜索非常重要。 + +```javascript +filter by function task.urgency > 8.9999 +``` + +- 查找紧急度分数高于 `9.0` 的任务。 +- 请注意,使用的限制值为 `8.9999` 。 +- 比较两个紧急度值“小于”或“大于”(使用 `>` 、 `>=` 、 `<` 或 `<=` 之一)的搜索**必须稍微调整其值以允许舍入**。 + +```javascript +filter by function task.urgency > 7.9999 && task.urgency < 11.0001 +``` + +- 查找紧急度得分在 `8.0` 到 `11.0` 之间(含)的任务。 + +```javascript +filter by function task.urgency.toFixed(2) === 1.95.toFixed(2) +``` + +- 查找为 `1.95` 的任务。 +- 这是对任何数值进行相等或不等搜索的正确方法。 +- `===` 两侧的 `.toFixed(2)` 确保要比较的两个数字都四舍五入到相同的小数位数 (2)。 +- 这很重要,可以防止在比较非整数时发现 `10.29` 不完全相同。 + +```javascript +filter by function task.urgency.toFixed(2) !== 1.95.toFixed(2) +``` + +- 查找除默认分数 `1.95` 之外的任何紧急任务。 + +```javascript +filter by function task.urgency === 10.29 +``` + +- **这样就不会发现任何任务了**。 +- 不要使用原始数字来搜索任何数字的相等或不相等,无论是看似整数还是浮点数。 +- 通过使用 `group by urgency` 并查看标题,我们可以得出结论,具有以下值的任务具有紧急程度 `10.19` : + - 明天到期, + - 没有优先权符号。 +- 由此,可以自然地假设我们可以搜索 `task.urgency === 10.29` 。 +- 但是,我们的函数正在检查以下值是否相等: + - `task.urgency` 大约是: + - `10.292857142857140928526860079728` + - `10.29` 大约为: + - `10.289999999999999147348717087880` +- 这些值**并不完全相等**,因此测试无法找到任何匹配的任务。没有内置的指令来按紧急程度进行过滤。 + + + +### Recurrence + +- `is recurring` +- `is not recurring` +- `recurrence (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 请注意,搜索的文本是以编程方式生成的并且是标准化的,因此可能与任何手动键入的任务中的文本不完全匹配。例如,带有 `🔁 every Sunday` 任务将按 `every week on Sunday` 进行搜索。 + - 查看任务的标准化重复规则的最简单方法是使用 `group by recurrence` ,并查看生成的组标题。 +- `recurrence (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.isRecurring` 和 `task.recurrenceRule`**按重复进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +使用 `task.isRecurring` : + +```javascript +filter by function task.isRecurring +``` + +- 这与 `is recurring` 相同。 +- 它可以与 `&&` (布尔 AND)或 `||` 一起使用(布尔或)与其他条件结合。 + +```javascript +filter by function !task.isRecurring +``` + +- 这与 `is not recurring` 相同。 +- 它可以与 `&&` (布尔 AND)或 `||` 一起使用(布尔或)与其他条件结合。 + +```javascript +filter by function (!task.isRecurring) && task.originalMarkdown.includes('🔁') +``` + +- 查找**重复规则已损坏/无效**的任务。 +- 这假设使用任务表情符号格式,如果使用其他格式,当然应该更新。 +- 这使用了任务实现细节的知识,即重复规则被读取并从描述中删除,即使它们是无效的。 +- 所以我们必须在 `task.originalMarkdown` 中搜索重复标记,看看当 `task.isRecurring` 为 false 时,原始任务是否包含重复指示符。 + + + +使用 `task.recurrenceRule` - 使用前请阅读有关 `task.recurrenceRule`[任务属性> 其他任务属性值](https://publish.obsidian.md/tasks/Scripting/Task+Properties#Values%20for%20Other%20Task%20Properties) 说明: + +```javascript +filter by function task.recurrenceRule.includes("every week") +``` + +- 类似于 `recurrence includes every week` ,但区分大小写。 + +```javascript +filter by function !task.recurrenceRule.includes("every week") +``` + +- 类似于 `recurrence does not include every week` ,但区分大小写。 + +```javascript +filter by function task.recurrenceRule.includes("every week") && task.recurrenceRule.includes("when done") +``` + +- 查找每周到期的任务,并且在其重复规则中**包含**`when done` 。 + +```javascript +filter by function task.recurrenceRule.includes("every week") && !task.recurrenceRule.includes("when done") +``` + +- 查找每周到期**且不**包含重复规则中 `when done` 任务。 + + + +### Sub-Items + +- `exclude sub-items` + - 设置此选项后,结果列表将仅包含文件中未缩进的任务。它只会显示列表中顶级列表项的任务。 + + + +### Tags 标签 + +> [Introduced in Tasks 1.6.0.](https://publish.obsidian.md/tasks/Queries/Filters#Tags) + +有关 [标签](https://publish.obsidian.md/tasks/Getting+Started/Tags) 在任务插件中的行为方式的重要信息,请参阅标签。 + +- `no tags` +- `has tags` +- `tags (include|do not include) ` _或者_ +- `tag (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 匹配时忽略全局过滤器。 + - 标签上的 `#` 是可选的,因此 `#home` 和 `home` 将匹配 `#home` 。 + - 如果给出了 `#` ,则它必须存在,因此搜索 `#home` 将匹配 `#home` 但不匹配 `#location/home` 。 + - 匹配是部分的,因此 `tags include foo` 将匹配 `#foo/bar` 和 `#foo-bar` 。 +- `tags (regex matches|regex does not match) //` _或者_ +- `tag (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + - 必读:[正则表达式搜索](https://publish.obsidian.md/tasks/Queries/Regular+Expressions)。 + - 通过在正则表达式末尾放置 `$` 字符,可以实现避免子标签的标签搜索。请参阅下面的示例。 + - 如果搜索子标签,请记住转义正则表达式中的斜杠: `\/` + +> [!tip]+ Release +> +> - `regex matches` 和 `regex does not match` 是在任务 1.13.0 中引入的。 +> - Tasks 2.0.0 中引入了 `no tags` 和 `has tags` 。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.tags`**按标签进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +```javascript +filter by function task.tags.length === 1 +``` + +- 查找恰好具有 1 个标签的任务(任何全局过滤器除外)。 + +```javascript +filter by function task.tags.length > 1 +``` + +- 查找具有多个标签的任务(任何全局过滤器除外)。 + +这些是更复杂的示例,如果您使用带有 [嵌套标签的](https://help.obsidian.md/Editing+and+formatting/Tags#Nested+tags) 任务,您可能需要复制这些示例。 + +```javascript +filter by function task.tags.find( (tag) => tag.includes('/') ) && true || false +``` + +- 查找至少具有一个嵌套标签的所有任务。 + +```javascript +filter by function task.tags.find( (tag) => tag.split('/').length >= 3 ) && true || false +``` + +- 查找至少具有一个双层嵌套标签的所有任务,例如 `#context/home/ground-floor` 。 +- 这会在 `/` 字符处分割每个标签,如果至少有 3 个单词,则算作匹配。 + + + +#### 标签查询示例 + +- `tags include #todo` +- `tags do not include #todo` +- `tag regex matches /#t$/` + - 搜索单字符标签 `#t` ,不带子标签,因为 `$` 匹配标签文本的结尾。 +- `tag regex matches /#book$/i` + - 尾随 `i` 表示不区分大小写。 + - 搜索 `#book` 、 `#Book` 、 `#BOOK` 等标签,而 `$` 会阻止匹配 `#books` 、 `#book/literature` 等。 + + + +### Markdown + +从 Tasks 4.2.0 开始,现在可以使用 `task.originalMarkdown`**按原始 Markdown 行进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +例如,这可用于从 Tasks 未解析的 `task.originalMarkdown` 中提取信息,以用于过滤任务。 + + + +## 文件属性的过滤器 + +> [Filters - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Filters#Filters+for+File+Properties) + +这些过滤器允许搜索特定文件和文件部分中的任务。 + +- File Path 文件路径 +- Root 根路径 +- Folder 文件夹 +- File Name 文件名 +- Heading 标题 + + + +### File Path 文件路径 + +请注意,该路径包含 `.md` 扩展名。 + +- `path (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 使用 `{{query.file.path}}` 或 `{{query.file.pathWithoutExtension}}` 作为包含当前查询的文件路径的占位符。 + - 例如, `path includes {{query.file.path}}` + - 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties) 和 [占位符](https://publish.obsidian.md/tasks/Scripting/Placeholders) +- `path (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + - 必读:[正则表达式搜索](https://publish.obsidian.md/tasks/Queries/Regular+Expressions)。 + +> [!caution]+ +> +> - `regex matches` 和 `regex does not match` 是在任务 1.12.0 中引入的。 +> - 占位符在任务 4.7.0 中发布。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.file.path`**按文件路径进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +在任务 4.8.0 中 `task.file.pathWithoutExtension` 已添加。 + +从 Tasks 5.1.0 开始,可以在自定义过滤器中方便地使用查询的文件路径: + +- `query.file.path` 或 +- `query.file.pathWithoutExtension` +- 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties)。 + +```javascript +filter by function task.file.path.includes('tasks releases/4.1.0 Release.md') +``` + +- 与“路径包含”类似,但它**区分大小写**:大小写很重要。 + +```javascript +filter by function task.file.path === 'tasks releases/4.1.0 Release.md' +``` + +- 精确、**区分大小写的**相等搜索。 +- 请注意,还需要包含文件扩展名。 +- 对于内置搜索,这只能使用正则表达式来完成,使用特殊字符 `^` 和 `$` ,并转义任何具有特殊含义的字符,例如 `/` 。 + +```javascript +filter by function task.file.path.toLocaleLowerCase() === 'TASKS RELEASES/4.1.0 RELEASE.MD'.toLocaleLowerCase() +``` + +- 精确的、**不**区分大小写的相等搜索。 +- 通过将这两个值都小写,我们不必担心在查询中手动将它们小写。 + + + +### Root 根路径 + +> [!caution]- +> +> - 在任务 3.4.0 中引入。 +> - 占位符在任务 4.7.0 中发布。 + +`root` 是包含任务的文件的顶级文件夹,即路径中的第一个目录,对于 Vault 根目录中的文件,该目录将为 `/` 。 + +- `root (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 使用 `{{query.file.root}}` 作为包含当前查询的文件根的占位符。 + - 例如, `root includes {{query.file.root}}` + - 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties) 和 [占位符](https://publish.obsidian.md/tasks/Scripting/Placeholders) +- `root (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + - 必读:[正则表达式搜索](https://publish.obsidian.md/tasks/Queries/Regular+Expressions)。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.file.root`**按根文件夹进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +从 Tasks 5.1.0 开始,可以在自定义过滤器中方便地使用查询的文件根: + +- `query.file.root` +- 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties)。 + +```javascript +filter by function task.file.root === '/' +``` + +- 在 Vault 根目录的文件中查找任务。 +- 请注意,这是**区分大小写的**:大小写很重要。 + +```javascript +filter by function task.file.root === 'Work/' +``` + +- 在 Vault 根目录下的 `Work` 文件夹内的文件中查找任务。 +- 请注意,这是**区分大小写的**:大小写很重要。 + + + +### Folder 文件夹 + +> + +这是包含任务的文件的文件夹,对于 Vault 根目录中的文件,该 `文件夹` 将为 `/`。 + +- `folder (includes|does not include) ` + - 匹配不区分大小写(不考虑大小写)。 + - 使用 `{{query.file.folder}}` 作为包含当前查询的文件文件夹的占位符。 + - 例如, `folder includes {{query.file.folder}}` 它将匹配包含查询的文件夹**和所有子文件夹中**的任务。 + - 有用的阅读材料:[Query Properties](https://publish.obsidian.md/tasks/Scripting/Query+Properties) 和 [Placeholders](https://publish.obsidian.md/tasks/Scripting/Placeholders) +- `folder (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + - 必读:[正则表达式搜索](https://publish.obsidian.md/tasks/Queries/Regular+Expressions)。 + +从 Tasks 4.2.0 开始,现在可以使用 `task.file.folder` **按文件夹 [进行自定义筛选](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + + + +### File Name 文件名 + +> [!tip]+ +> +> - 在任务 3.4.0 中引入。 +> - 占位符在任务 4.7.0 中发布。 + +请注意,文件名包含 `.md` 扩展名。 + +- `filename (includes|does not include) ` + - 匹配不区分大小写(忽略大小写)。 + - 使用 `{{query.file.filename}}` 或 `{{query.file.filenameWithoutExtension}}` 作为包含当前查询的文件的文件名的占位符。 + - 例如, `filename includes {{query.file.filename}}` + - 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties) 和 [占位符](https://publish.obsidian.md/tasks/Scripting/Placeholders) +- `filename (regex matches|regex does not match) //` + - 正则表达式是否匹配(默认区分大小写)。 + + + +从 Tasks 4.2.0 开始,现在可以使用 `task.file.filename`**按文件名进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 + +在任务 4.8.0 中 `task.file.filenameWithoutExtension` 已添加。 + +从 Tasks 5.1.0 开始,可以在自定义过滤器中方便地使用查询的文件名: + +- `query.file.filename` 或 +- `query.file.filenameWithoutExtension` +- 有用的阅读:[查询属性](https://publish.obsidian.md/tasks/Scripting/Query+Properties)。 + +```javascript +filter by function task.file.filename === "4.1.0 Release.md" +``` + +- 在任何文件夹中具有确切文件名的文件中查找任务。 +- 相等性测试 `===` 要求包含文件扩展名 `.md` 。 + +```javascript +filter by function task.file.filename.includes("4.1.0 Release") +``` + +- 在名称包含给定文本的文件中查找任务。 +- 通过使用 `.includes()` 并省略文件扩展名,这还将找到诸如 `14.1.0 Release.md` 和 `4.1.0 Release Notes.md` 之类的文件。 + + + +### Heading 标题过滤器 + +1. `heading (includes|does not include) ` + - 它至少包含字符串 `` 的一次,匹配该部分中所有任务。 + - 这是,它是一个子串搜索。 + - 所以 `heading includes Day Planner` 将匹配第 `## Monday Day Planner` 和第 `## Day Planner for typical day` 节的任务。 + - 它忽略大小写。搜索不区分大小写。 + - 所以 `heading includes Day Planner` 将匹配第 `## Day Planner` 和第 `## DAY PLANNER` 节的任务。 + - 任何引号字符( `'` 和 `"` )都包含在搜索文本中。 + - 所以 `heading includes "Day Planner"` 将匹配一个部分 `## "Day Planner"` 。 + - 但是不会匹配带有标题如 `## Day Planner` 的任务。 +2. `heading (regex matches|regex does not match) //` + - 正则表达式匹配(默认区分大小写)。 + - 正则表达式(或“regex”)搜索是一个强大但高级的功能。 + - 它需要深入的知识才能成功使用,不会错过预期的搜索结果。 + - 它很容易编写一个看起来正确的正则表达式,但它包含一个具有非明显意义的特殊字符。 + - 必备阅读: [Regular Expression Searches](https://publish.obsidian.md/tasks/Queries/Regular+Expressions). + +**案例** + +```` +```tasks +heading includes pkmerdocs +done last week +``` +```` + + + +# 解释查询 (Explaining Queries) + +> [Explaining Queries - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Explaining+Queries) + +> [!tip]+ +> - 在任务 1.19.0 中引入。 + +当在实时预览和阅读模式下查看任务块时, `explain` 指令会在搜索结果的开头添加一些额外的输出。 + +这样做有很多好处: + +- 基于日期的过滤器很容易理解: + - 过滤器中的所有日期都会展开,以显示搜索中使用的实际日期。 +- 布尔查询逻辑更清晰。 + - 查询的组合(通过 `AND` 、 `OR` 、 `NOT` 等)可以更清楚地看到。 +- 如果启用了 [全局过滤器](https://publish.obsidian.md/tasks/Getting+Started/Global+Filter),它会包含在说明中。 + - 这通常可以解释为什么结果中缺少任务。 +- 如果启用了 [全局查询](https://publish.obsidian.md/tasks/Queries/Global+Query),它也会包含在说明中。 +- 列出所有 [“分组依据”](https://publish.obsidian.md/tasks/Queries/Grouping) 指令(自任务 5.4.0 起) +- 列出所有 [“排序依据”](https://publish.obsidian.md/tasks/Queries/Sorting) 指令(自任务 5.4.0 起) + + + +## 示例:过滤器中的日期已扩展 + +例如,当以下文本放置在任务查询块中时: + +```text +starts after 2 years ago +scheduled after 1 week ago +due before tomorrow +explain +``` + +`2022-10-21` ,结果如下: + +```text +Explanation of this Tasks code block query: + + starts after 2 years ago => + start date is after 2020-10-21 (Wednesday 21st October 2020) OR no start date + + scheduled after 1 week ago => + scheduled date is after 2022-10-14 (Friday 14th October 2022) + + due before tomorrow => + due date is before 2022-10-22 (Saturday 22nd October 2022) + + No grouping instructions supplied. + + No sorting instructions supplied. +``` + +请注意它如何非常清楚地显示正在搜索的日期,包括星期几。 + +它还表明 `starts` 搜索也匹配没有开始日期的任务。 + + + +# 排序 (Sorting) + +> [Sorting - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Sorting) + +- Sort by Task Statuses +- Sort by Task Dependencies +- Sort by File Properties +- Sort by Dates in Tasks +- Sort by Other Task Properties + + + +示例: + +```` +```tasks +not done +due today +sort by due +``` + +```tasks +done +sort by done reverse +``` + +```tasks +not done +due before next monday +sort by status +sort by description reverse +sort by path +``` +```` + + + +> [!tip]+ +> 如果您希望任务按照引入**紧急性**之前的排序方式进行排序,请将以下 `sort` 表达式添加到您的查询中: + +```` +```tasks +sort by status +sort by due +sort by path +``` +```` + + + +基本大纲: + +- Sort by Task Statuses + - Status + - Status Name + - Status Type + - Status Symbol + - Next Status Symbol +- Sort by Task Dependencies + - Id + - Depends On +- Sort by Dates in Tasks + - How dates are sorted + - Done Date + - Due Date + - Scheduled Date + - Start Date + - Created Date + - Cancelled Date + - Happens +- Sort by Other Task Properties + - Description + - Description without tags + - Priority + - Urgency + - Recurrence + - Tags + - Original Markdown + - Random sorting +- Sort by File Properties + - File Path + - Root + - Folder + - File Name + - Heading + + + +# 分组 (Grouping) + +> [Grouping - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Grouping) + +> [!note]+ Tasks 查询语法的执行循序 +> +> 1. 所有过滤器指令均已运行 +> 2. 然后运行任何排序指令 +> 3. 然后运行任何 `limit` 指令 +> 4. 然后运行任何 `groups` 指令 +> 5. 然后运行任何 `limit groups` 指令 + + + +![【Obsidian-Task】Task查询语法.md](https://cdn.pkmer.cn/images/202412261301770.png!pkmer) + + + +## 基础 (Basic) + +> [!tip]+ +> 在任务 1.6.0 中引入。 + +默认情况下,任务在单个列表中显示任务。 + +要按标题划分匹配任务,您可以向查询添加 `group by` 。 + + + +### 示例 + +````md +```tasks +not done +group by filename +``` +```` + + + +## 分组的类型 + +- 按任务状态分组:Group by Task Statuses + - 同 [[#过滤器 (Filters)#任务状态过滤器]],详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+Task+Statuses) +- 按任务依赖性分组:Group by Task Dependencies + - 详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+Task+Dependencies) +- 按任务中的日期分组:Group by Dates in Tasks + - 同 [[#过滤器 (Filters)#Searching for dates 搜索日期]],详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+Task+Dependencies) +- 按其他任务属性分组:Group by Other Task Properties + - 同 [[#过滤器 (Filters)#其他任务属性的筛选器]],详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+Other+Task+Properties) +- 按文件属性分组:Group by File Properties + - 同 [[#过滤器 (Filters)#文件属性的过滤器]],详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+File+Properties) + + + +## 拓展:自定义分组 + +> [!tip]+ +> Tasks 4.0.0 中引入了 `group by function` 。 + +任务提供了许多内置的分组选项,但有时它们并不能完全满足所有用户的需求。现在,任务有一个强大的机制供您创建自己的**自定义组**,提供令人难以置信的灵活性。 + +自定义分组指令 `group by function`,您可以在 [自定义分组](https://publish.obsidian.md/tasks/Scripting/Custom+Grouping) 中找到有关此非常强大的功能的更多信息。 + + + +## 多个分组 (Multiple groups) + +您可以添加多个 `group by` 查询选项,每个选项占一行。这将创建嵌套分组。第一个分组优先级最高。 + +每个后续的 `group by` 将在现有分组内生成新的标题层次: + +- 第一个 `group by` 显示为 h4 标题 +- 第二个 `group by` 显示为 h5 标题 +- 第三和后续的 `group by` 显示为 h6 标题 + + + +示例,多个分组按顺序嵌套: + +````md +```tasks +not done +group by folder +group by filename +group by heading +``` +```` + + + +## 细化分组 (Refining groups) + +可以设置分组的几个参数: + +1. Reverse:控制分组的排列顺序。 +2. Limiting group size:限制每组中的任务数量。 + + + +### Reverse + +在要分组的属性名称后面,可以添加 `reverse` 关键字。如果指定,则该属性的组标题将相反。 + + 例如: + +- `group by due` 将对组标题进行排序: + - 从**最早的**预定期开始... + - 到**最后的**截止日期 +- `group by due reverse` 将对组标题进行排序: + - 从**最新的**预定期开始... + - 到**最早的**预定期最后 + + + +### Limiting group size + +您可以限制每个组中的任务数量,也许首先处理最重要的事情。 + +使用查询字符串 `limit groups to tasks` 。这将仅列出查询结果中每组中的前 `` 任务。 + +简写是 `limit groups ` 。 + +> 如果任务查询中没有 `group by` 指令,则将忽略 `limit groups` 指令。 + +> [!tip]+ +> `limit groups to tasks` 在任务 3.8.0 中引入。 + + + +# 限制 (Limiting) + +> [Limiting - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Limiting) + +- 限制任务总数 +- 限制每组中的任务数量 +- 查看找到的任务总数 + + + +## 限制任务总数 + +您可以限制显示为查询结果的任务总数。 + +使用查询字符串 `limit to tasks` 。这只会列出查询的前 `` 结果(排序后)。 + +简写是 `limit ` 。 + + + +## 限制每组中的任务数量 + +使用查询字符串 `limit groups to tasks` 可以限制每个组中允许的任务数量。 + +简写是 `limit groups ` 。 + +> [[#分组(Grouping)#Limiting group size]] + + + +> [!tip]+ +> `limit groups to tasks` 在任务 3.8.0 中引入。 + + + +## 查看找到的任务总数 + +如果任一 `limit` 选项阻止任何任务显示在结果中,则会显示总数,例如: + +```text +50 of 686 tasks +``` + +> [!tip]+ +> Tasks 4.8.0 中添加了任务总数的显示。 + + + +# 布局 (Layout) + +> [Layout - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Layout) + +- Task Elements +- Query Elements +- Hiding/Showing Elements +- Full Mode +- Short Mode + + + +## Task Elements + +以下任务元素存在: + +- id(标识) +- depends on(依赖于) +- priority(优先级) +- cancelled date(取消日期) +- created date(创建日期) +- start date(开始日期) +- scheduled date(计划日期) +- due date(截止日期) +- done date(完成日期) +- recurrence rule(重复规则) +- on completion (完成时) +- tags (标签) + +所有这些任务元素默认情况下都会显示,因此如果您不想显示其中任何一个,可以使用命令“hide”。 + + + +## Query Elements + +存在以下查询元素: + +- `tree` +- `edit button` +- `postpone button` +- `backlink` +- `urgency` +- `task count` + + + +## Hiding/Showing Elements + +每个 [[#Task Elements|Task元素(Task Elements)]] 可以都设置隐藏 (hide) 或显示 (show),且查询中可以使用多个 show 和 hide 指令,每个指令位于单独的行上。 + +例如: + +````md +```tasks +no due date +path includes GitHub + +hide recurrence rule +hide task count +hide backlink +show urgency +``` +```` + + + +### Hide OR Show Tree + +> [!tip] +> 新的指令 `show tree` 是教 Tasks 插件完全处理 [嵌套任务和列表项](https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax#Nesting+lists) 的一系列步骤中的第一个。 + + + +**Show Tree** + +`show tree` 指令使我们能够查看任务中的父/子关系,以及它们的嵌套任务和列表项: + +![【Obsidian-Task】Task查询语法.md](https://cdn.pkmer.cn/images/202412261301353.png!pkmer) + +````md +```tasks +not done +filename includes Party Planner + +show tree +hide backlink +``` +```` + + + +### Hide OR Show Tags + +[Layout - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Layout#Hide+and+Show+Tags) + +只有 Obsidian 识别的标签才会被 `hide tags` 隐藏。 + +``` +hide tags +``` + +![【Obsidian-Task】Task查询语法.md](https://cdn.pkmer.cn/images/202412261301724.png!pkmer) + + + +## Full Mode + +在**完整模式 (Full Mode)**下,查询结果将显示表情符号和具体的重复规则或日期。 + +这是默认模式,该命令为 `full mode`。 + +Example: + +```` +```tasks +not done +full mode +``` +```` + +--- + +- 关联:[[241217_如何隐藏Tasks的反向链接(Backlinks)]] + + + +## Short Mode + +在**短模式 (Short Mode)**下,查询结果只会显示表情符号,而不显示具体的重复规则或日期。您可以将鼠标悬停在任务上以查看工具提示中的规则和日期。 + +该命令是 `short mode` 。 + +Example: + +```` +```tasks +not done +short mode +``` +```` + + + +# 注释 (Comments) + +> [Comments - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Comments) + +所有以 `#` 字符开头的查询行都会被视为注释并被忽略。 + +Example: + +```` +```tasks +not done +# Uncomment the following line to enable short mode: +# short mode +``` +```` + + + +## Inline comments 行内注释 + +> 行内注释在 Tasks 4.7.0 中引入。 + +一行中的 `{{! 和 }}` 之间的任何文本都将被忽略。不支持多行注释。 + +```` +```tasks +not done +short mode {{! 这条注释将被忽略 }} +``` +```` + +当 Tasks 处理查询中的占位符时,这样的注释将被移除。 + + + +# 全局查询 (Global Query) + +> [Global Query - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Global+Query) + +> [!tip]- Global Query 设置是在 Tasks 3.5.0 版本中添加的。 +> ![【Obsidian-Task】Task查询语法.md](https://cdn.pkmer.cn/images/202412261301107.png!pkmer) + +您可以在设置中设置全局查询,任务将添加到保管库中所有查询的开头。 + + + +## 忽略全局查询 (Ignore global query) + +如果您需要忽略给定任务块中的全局查询,您可以将 `ignore global query` 指令添加到块的任何位置。 + +例如,这允许您让任务搜索默认忽略某些文件夹。然后,在少数搜索中,您可以启用在这些文件夹中搜索任务。 + + 例子 + +```text +tags include work +ignore global query +``` + +> [!tip]+ Tasks 4.6.0 中添加了 ignore global query 指令。 + + + +# 组合过滤器 (Combining+Filters) + +> [Combining Filters - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Combining+Filters) + +任务提供的各个 [[#过滤器 (Filters)]] 可以通过以下方式以强大的方式组合在一起: + +1. 将它们中的每一个包裹在分隔符中,例如 `(` 和 `)` , +2. 然后用布尔运算符(例如 `AND` 、 `OR` 和 `NOT` 将它们连接起来。 + + 例如: + +````text +```tasks +not done +(due after yesterday) AND (due before in two weeks) +[tags include #inbox] OR [path includes Inbox] OR [heading includes Inbox] +``` +```` + +上述任务块中的每 3 行代表一个单独的过滤器,并且仅显示与\_ 所有\_3 行过滤器匹配的任务。 + + + +## 语法 (Syntax) + +一个或多个过滤器可以通过布尔运算符组合在一行中,以创建一个新的、强大的、灵活的过滤器。 + +下面是简单布尔指令的组件图: + +```text ++--------------------------+ +--------------------------+ +| ( tag includes #XX ) | OR | ( tag includes #YY ) | ++--------------------------+ +--------------------------+ + ^ ^ ^ ^ + | | | | + +- delimiters: () -+ +- delimiters: () -+ + for left sub-expression for right sub-expression + | | + +--------- Operator: OR -----------+ + Connects both sub-expressions +``` + + + +以下规则适用: + +- 每个单独的过滤器必须由一对**分隔符**包围: + - 本指南中最常用的分隔符是 `(` 和 `)` 。 + - 可用分隔符的完整列表是: + - `(....)` + - `[....]` + - `{....}` + - `"...."` + - 布尔指令中不能混合使用分隔符类型:您必须为行上的过滤器选择适当的分隔符。 +- 支持的**运算符**有: `AND` 、 `OR` 、 `NOT` 、 `AND NOT` 、 `OR NOT` 和 `XOR` 。 + - 运算符区分大小写:它们必须大写。 + - 请参阅下面的 [布尔运算符](https://publish.obsidian.md/tasks/Queries/Combining+Filters#Boolean%20Operators)。 +- 您可以使用更多分隔符将更多过滤器嵌套在一起。 +- **尾部反斜杠**( `\` ) 可用于将长过滤器分解为多行,如 [行延续](https://publish.obsidian.md/tasks/Queries/Line+Continuations) 中所述。 +- 每行组合的过滤器数量以及括号的嵌套级别没有实际限制。 + + 建议: + +- 组合两个以上过滤器时,请随意使用 `(` 和 `)` (或任何其他分隔符对)以确保获得预期的逻辑。请参阅下面的 [执行优先级](https://publish.obsidian.md/tasks/Queries/Combining+Filters#Execution%20Priority)。 +- 请参阅 [布尔过滤器故障排除](https://publish.obsidian.md/tasks/Queries/Combining+Filters#Troubleshooting%20Boolean%20Filters) 以获取选择分隔符的帮助,特别是在 `filter by function` 时。 + +从技术上讲,行仍然具有隐式 `AND` 关系(因此完全保留了向后兼容性),但一行现在可以具有由 `AND` 、 `OR` 、 `NOT` 、 `AND NOT` 、 `OR NOT` 和 `XOR` 以及括号组成的多个过滤器。 + + + +## 执行优先级 (Execution Priority) + +运算符按以下顺序评估: + +1. `NOT` +2. `XOR` +3. `AND` +4. `OR` + + + +所以这两个过滤器是完全等价的 - 请注意第二个过滤器中的额外括号: + +```text +(tag includes #XX) OR (tag includes #YY) AND (tag includes #ZZ) +``` + +```text +(tag includes #XX) OR ( (tag includes #YY) AND (tag includes #ZZ) ) +``` + +这两者也完全等价: + +```text +(tag includes #XX) AND (tag includes #YY) OR (tag includes #ZZ) +``` + +```text +( (tag includes #XX) AND (tag includes #YY) ) OR (tag includes #ZZ) +``` + +在构建复杂的过滤器组合时,自由使用 `(` 和 `)` 是最安全的,这样您就可以确信自己得到了预期的行为。 + + + +## 布尔运算 (Boolean Operators) + +| 符号 | 含义 | +| ------- | ---- | +| AND | 并 | +| OR | 或 | +| NOT | 非 | +| AND NOT | | +| OR NOT | | +| XOR | 异或 | + + + +### AND + +> 要求**每个**过滤器都匹配 + +当您使用 `AND` 将过滤器组合在一起时,只会显示与 _ 每个 _ 过滤器匹配的任务。 + +例如,这将显示包含单词 `some` 并具有开始日期的任务: + +```text +(has start date) AND (description includes some) +``` + +任务要求每个过滤器行都匹配,因此上面的示例相当于: + +```text +has start date +description includes some +``` + +当与 `OR` 和 `NOT` 结合使用时, `AND` 变得特别有价值。 + +> **注意**:在 Task 中,诸如以下的请求: +> 显示路径中带有 `inbox` 文件中的任务 _ 以及 _ 带有标签 `#inbox` 任务 +> ...通常意味着显示满足 _ 任一 _ 条件的任务,因此必须用 `OR` 表示为布尔逻辑。 + + + +### OR + +> 需要**任何**过滤器来匹配 + +当您使用 `OR` 将过滤器组合在一起时,将显示 _ 至少与其中一个 _ 过滤器匹配的任务。 + +例如,要显示路径中带有 `inbox` 文件中的任务以及任务行上带有 `#inbox` 标签的文件: + +````text +```tasks +not done +(path includes inbox) OR (description includes #inbox) +``` +```` + + + +### NOT + +> 要求过滤器**不**匹配 + +对于一个简单的例子,这两个是等效的: + +```text +path does not include inbox +``` + +```text +NOT (path includes inbox) +``` + + + +`NOT` 对于否定更复杂的表达式更有用。 + +举一个更现实的例子,与此相反: + +```text +(path includes x) OR (description includes #x) +``` + +...可以在不检查新逻辑的情况下表达,如下所示: + +```text +NOT ( (path includes x) OR (description includes #x) ) +``` + +另一种表达方式需要更多的细心和思考: + +```text +(path does not include x) AND (description does not include #x) +``` + + + +### AND NOT + +> 要求第一个过滤器匹配,并且第二个过滤器不匹配 + +例如: + +```text +(has start date) AND NOT (description includes some) +``` + + + +### OR NOT + +> 要求第一个过滤器匹配,或第二个过滤器不匹配。 + + 例如: + +```text +(has start date) OR NOT (description includes special) +``` + + + +### 异或 + +> **只需要两个过滤器之一**进行匹配 + +`XOR` 或 `exclusive or` 显示 _ 仅匹配所提供条件之一 _ 的任务。 + +例如,显示任务: + +- 在其路径中带有 `inbox` 文件中 +- 或者标签 `#inbox` 位于任务行的位置 +- 但不是两者都: + +````text +```tasks +not done +(path includes inbox) XOR (description includes #inbox) +``` +```` + +它不会显示路径中同时带有 `inbox` 和任务行中带有 `#inbox` 标签的任务。 + + 警告 + +不要将两个以上的过滤器与 `XOR` 组合在一起,只要求其中一个为真。它不会给出您期望的结果。 + +`(filter a) XOR (filter b) XOR (filter c)` 匹配仅匹配其中一个过滤器的任务,**以及匹配所有三个过滤器的任务**。 + + + +# 反向链接 (BackLinks) + +> [Backlinks - Tasks用户指](https://publish.obsidian.md/tasks/Queries/Backlinks) + +在“Task 查询结果”中,默认情况下,每个任务都显示其文件名和上一个标题的名称,例如 `(ACME > Steps to world domination)` 。这称为反向链接 (BackLink)。 + +![【Obsidian-Task】Task查询语法.md](https://cdn.pkmer.cn/images/202412261301547.png!pkmer) + + +- [[241217_如何隐藏Tasks的反向链接(Backlinks)]] + + + +您可以单击反向链接 (BackLink) 直接导航到 Task 的源代码行。 + +这遵循单击内部链接时使用的 [标准Obsidian键盘修饰符,](https://obsidian.md/changelog/2022-10-13-desktop-v1.0.0/) 以控制打开方式(导航、新选项卡、新选项卡组、新窗口)。 + +[[【Obsidian】窗口管理#链接操作]] + + + +# 行延续 (Line Continuations) + +> [Line Continuations - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Line+Continuations) + +> [!tip]+ +> - 在任务 5.0.0 中引入。 +> - **重要提示**:此功能更改了查询行上最后一个反斜杠 ( `\` ) 字符的含义。请参阅下面的 [附录“使用尾部反斜杠更新 5.0.0 之前的搜索”](https://publish.obsidian.md/tasks/Queries/Line+Continuations#Appendix%20Updating%20pre-5.0.0%20searches%20with%20trailing%20backslashes) 来更新查询。 + + + +## 在查询中换行长行 + +在任务代码块中,**反斜杠 ( `\` )**是“行继续字符”。如果反斜杠位于行尾,则该行被视为在下一行继续。 + +这对于将长查询划分为多行非常有用,以获得更好的可读性。 + + 例如这个查询: + +```text +(priority is highest) OR \ + (priority is lowest) +explain +``` + + ...运行此搜索: + +```text +Explanation of this Tasks code block query: + + (priority is highest) OR \ + (priority is lowest) + => + (priority is highest) OR (priority is lowest) => + OR (At least one of): + priority is highest + priority is lowest + + No grouping instructions supplied. + + No sorting instructions supplied. +``` + +此功能对于较长的 [Combining Filters](https://publish.obsidian.md/tasks/Queries/Combining+Filters) 、 [Custom Sorting](https://publish.obsidian.md/tasks/Scripting/Custom+Sorting) 和 [Custom Grouping](https://publish.obsidian.md/tasks/Scripting/Custom+Grouping) 行以及其他可能难以在一行中阅读的查询很有帮助。 + + + +注意事项: + +- 要成为连续字符, `\` 必须是该行的**最后一个字符**。 +- 所有 `\` 及其周围的所有空格都被压缩为一个空格。 +- 考虑缩进第二行和后续行,以便查询的结构立即清晰。 +- 考虑对齐 `\` 字符以提高可读性。 +- 如果有疑问,请添加 `explain` 指令以检查代码块的解释方式。 + + + +## 需要尾部反斜杠的搜索 + +在任务代码块中,**行末的两个反斜杠 ( `\\` )**被视为**单个反斜杠**。 + +这使得在查询需要尾部反斜杠的极少数情况下可以进行搜索。 + + 例如这个查询: + +```text +## Search for a single backslash: +description includes \\ +explain +``` + + ...运行此搜索: + +```text +Explanation of this Tasks code block query: + + description includes \\ => + description includes \ + + No grouping instructions supplied. + + No sorting instructions supplied. +``` + + + +注意事项: + +- 或者,您可以在尾随 `\` 之后添加一个或多个空格,以防止它成为连续字符。 + - 但这是有风险的,因为一些编辑器和 linter 会删除不必要的尾随空格。 + - 所以**两个反斜杠选项更安全**。 +- 如果有疑问,请添加 `explain` 指令以检查代码块的解释方式。 diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/obsidian-tasks-plugin.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/obsidian-tasks-plugin.md" similarity index 95% rename from "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/obsidian-tasks-plugin.md" rename to "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/obsidian-tasks-plugin.md" index 1260609c..1e2e5958 100644 --- "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/obsidian-tasks-plugin.md" +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/obsidian-tasks-plugin.md" @@ -7,7 +7,7 @@ author: cuman type: other draft: false editable: false -modified: 20230809120132 +modified: 20241226134100 --- # Obsidian 插件:Tasks 更方便的任务管理 @@ -196,4 +196,17 @@ done on {{date:YYYY-MM-DD}} > - [[obsidian-day-planner]]:用于从 Markdown 笔记中的任务列表中规划和管理番茄钟计时器 > - [[obsidian-task-archiver]]:帮你快速归类待办任务 > - [[obsidian-last-modified-timestamp-in-status-bar]]:在状态栏可视化你的最后编辑时间 -> - [[tasks-calendar-wrapper]]:完美的时间线/日历视图的任务面板展示 \ No newline at end of file +> - [[tasks-calendar-wrapper]]:完美的时间线/日历视图的任务面板展示 + +## 语法 + +- [[Task查询语法手册]] + +## 案例 + +- [[DataViewJS+Tasks-最佳的每周任务管理及周报]] +- [[基于 QuickAdd+Modal Form的任务 (Task) 编辑器]] + +## 样式 + +- [[Obsidian样式-Minimal主题复选框(Checkout)样式]] \ No newline at end of file From 8eb3a14847dc2a3dfc02ce0851a51891cc09cb03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E7=8C=AB=E5=88=AB=E7=86=AC=E5=A4=9C?= <11595443+qiu-tenghuang@user.noreply.gitee.com> Date: Fri, 27 Dec 2024 18:23:09 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\346\263\225\346\211\213\345\206\214.md" | 176 +++++++++--------- 1 file changed, 89 insertions(+), 87 deletions(-) diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" index 3ab6780f..d7480bec 100644 --- "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Tasks/Task\346\237\245\350\257\242\350\257\255\346\263\225\346\211\213\345\206\214.md" @@ -1,21 +1,23 @@ --- uid: 20241226133215 -title: 关于查询 +title: Task 查询语法手册 tags: [任务管理] description: Tasks查询语法的介绍 author: 熊猫别熬夜 type: other draft: false editable: false -modified: 20241226133323 +modified: 20241227182235 --- +# Task 查询语法手册 + -> [!tip]+ 参考资料 +> [!tip] 参考资料 > [Tasks用户指南](https://publish.obsidian.md/tasks/Introduction) -# 关于查询 +## 关于查询 > [About Queries - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/About+Queries) @@ -46,7 +48,7 @@ not done -> [!note]+ Tasks 查询语法的执行循序 +> [!note] Tasks 查询语法的执行循序 > > 1. 所有过滤器指令均已运行 > 2. 然后运行任何排序指令 @@ -56,7 +58,7 @@ not done -# 过滤器 (Filters) +## 过滤器 (Filters) > [Filters - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Filters) @@ -72,7 +74,7 @@ not done -## 自定义过滤器 Custom Filters +### 自定义过滤器 Custom Filters > [!tip]+ > `filter by function` was introduced in Tasks 4.2.0. @@ -88,7 +90,7 @@ Task 提供了许多内置的过滤选项,但有时它们并不能完全满足 -## 搜索日期 +### 搜索日期 任务在查询块内的日期方面提供了很大的灵活性。 @@ -99,7 +101,7 @@ Task 提供了许多内置的过滤选项,但有时它们并不能完全满足 -### 特定日期搜索 +#### 特定日期搜索 ````md ```tasks @@ -110,7 +112,7 @@ due on or before today -#### 日期搜索选项 +##### 日期搜索选项 | option 选项 | all earlier dates | search date | all later dates | | -------------- | :---------------: | :---------: | :-------------: | @@ -125,7 +127,7 @@ due on or before today -#### 绝对日期 +##### 绝对日期 `` 过滤器可以使用“绝对”日期,其首选格式为 `YYYY-MM-DD` 。绝对日期指定日历中的特定日期。它们代表同一天,无论今天的日期如何。 @@ -135,7 +137,7 @@ Examples: 示例: -#### 相对日期 +##### 相对日期 `` 过滤器可以与 `relative` 相对日期一起提供。相对日期是根据今天的日期计算的。 @@ -157,7 +159,7 @@ Examples: 示例: -### 日期范围搜索 +#### 日期范围搜索 Task 允许指定一对日期进行日期搜索, `` 。 @@ -172,7 +174,7 @@ happens this week -#### 绝对日期范围 +##### 绝对日期范围 | option 选项 | all earlier dates | `start date` | all dates inside the range | `end date` | all later dates | | -------------- | ----------------- | ------------ | -------------------------- | ---------- | --------------- | @@ -184,7 +186,7 @@ happens this week -#### 相对日期范围 +##### 相对日期范围 Tasks 支持一组非常特定的相对 `` 值: `last|this|next week|month|quarter|year` 。管道( `|` )字符表示“或”。 @@ -199,7 +201,7 @@ Tasks 支持一组非常特定的相对 `` 值: `last|this|next we -#### 编号日期范围 +##### 编号日期范围 也可以使用独立于当前日期的编号日期范围的能力。这些编号日期范围类型得到支持: @@ -221,7 +223,7 @@ Tasks 支持一组非常特定的相对 `` 值: `last|this|next we -## Text filters 文本过滤器 +### Text filters 文本过滤器 文本搜索过滤器有 2 种类型: @@ -232,7 +234,7 @@ Tasks 支持一组非常特定的相对 `` 值: `last|this|next we -## 匹配多个过滤器 +### 匹配多个过滤器 每行查询都必须匹配,任务才能列出。换句话说,行之间被视为存在一个 'AND' 运算符。在每行中,您可以使用布尔运算符 `NOT` 、 `AND` 、 `OR` 、 `AND NOT` 、 `OR NOT` 和 `XOR` ,只要将单个过滤器用括号括起来即可: @@ -250,7 +252,7 @@ due after 2021-04-04 -## 任务状态过滤器 +### 任务状态过滤器 - Status 状态 - Status Name 状态名称 @@ -269,12 +271,12 @@ group by path -### Status +#### Status - `done` - 匹配状态类型为 `DONE` 、 `CANCELLED` 和 `NON_TASK` 任务 - `not done` - 匹配状态类型为 `TODO` 和 `IN_PROGRESS` 任务 -> [!tip]+ 在 Tasks 1.23.0 之前,没有任务状态类型的概念,因此仅使用状态符号: +> [!tip] 在 Tasks 1.23.0 之前,没有任务状态类型的概念,因此仅使用状态符号: > > - 带有 `[ ]` 任务被视为 `not done` > - 除空格外的任何其他字符均视为已 `done` @@ -300,7 +302,7 @@ filter by function ! task.isDone -### Status Name +#### Status Name 自定义的状态名称,例如,也许您将 `[!]` 命名为 `Important` ,因此该字段将搜索具有该状态符号的所有任务的文本 `Important` 。 @@ -324,7 +326,7 @@ filter by function task.status.name === 'Unknown' -### Status Type +#### Status Type - `status.type (is|is not) (TODO|DONE|IN_PROGRESS|CANCELLED|NON_TASK)` - `TODO` 等值不区分大小写:例如,您可以使用 `in_progress` @@ -367,7 +369,7 @@ filter by function ! 'NON_TASK,CANCELLED'.includes(task.status.type) -### Status Symbol +#### Status Symbol 没有内置的指令来按状态符号进行过滤。 @@ -412,7 +414,7 @@ filter by function !' -x/'.includes(task.status.symbol) -### Next Status Symbol +#### Next Status Symbol 没有内置指令可以按下一个状态符号进行过滤。 @@ -428,7 +430,7 @@ filter by function task.status.symbol === task.status.nextSymbol -## 其他任务属性的筛选器 +### 其他任务属性的筛选器 > [Filters - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Filters#Filters+for+Other+Task+Properties) @@ -443,7 +445,7 @@ filter by function task.status.symbol === task.status.nextSymbol -### Description +#### Description - `description (includes|does not include) ` - 匹配不区分大小写(忽略大小写)。 @@ -483,13 +485,13 @@ filter by function task.description.length > 100 -### Description without tags +#### Description without tags 从 Tasks 4.2.0 开始,可以使用 `task.descriptionWithoutTags` 从自定义过滤器的描述中删除标签,以便在**[自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**中使用。 -### Priority +#### Priority - `priority is (above|below|not)? (lowest|low|none|medium|high|highest)` @@ -507,7 +509,7 @@ filter by function task.description.length > 100 -#### 示例 +##### 示例 ```` ```tasks @@ -548,7 +550,7 @@ filter by function task.priorityNumber % 2 === 0 -### Urgency +#### Urgency 没有内置的指令来按紧急程度进行过滤。 @@ -607,7 +609,7 @@ filter by function task.urgency === 10.29 -### Recurrence +#### Recurrence - `is recurring` - `is not recurring` @@ -677,14 +679,14 @@ filter by function task.recurrenceRule.includes("every week") && !task.recurrenc -### Sub-Items +#### Sub-Items - `exclude sub-items` - 设置此选项后,结果列表将仅包含文件中未缩进的任务。它只会显示列表中顶级列表项的任务。 -### Tags 标签 +#### Tags 标签 > [Introduced in Tasks 1.6.0.](https://publish.obsidian.md/tasks/Queries/Filters#Tags) @@ -706,7 +708,7 @@ filter by function task.recurrenceRule.includes("every week") && !task.recurrenc - 通过在正则表达式末尾放置 `$` 字符,可以实现避免子标签的标签搜索。请参阅下面的示例。 - 如果搜索子标签,请记住转义正则表达式中的斜杠: `\/` -> [!tip]+ Release +> [!tip] Release > > - `regex matches` 和 `regex does not match` 是在任务 1.13.0 中引入的。 > - Tasks 2.0.0 中引入了 `no tags` 和 `has tags` 。 @@ -744,7 +746,7 @@ filter by function task.tags.find( (tag) => tag.split('/').length >= 3 ) && true -#### 标签查询示例 +##### 标签查询示例 - `tags include #todo` - `tags do not include #todo` @@ -756,7 +758,7 @@ filter by function task.tags.find( (tag) => tag.split('/').length >= 3 ) && true -### Markdown +#### Markdown 从 Tasks 4.2.0 开始,现在可以使用 `task.originalMarkdown`**按原始 Markdown 行进行 [自定义过滤](https://publish.obsidian.md/tasks/Scripting/Custom+Filters)**。 @@ -764,7 +766,7 @@ filter by function task.tags.find( (tag) => tag.split('/').length >= 3 ) && true -## 文件属性的过滤器 +### 文件属性的过滤器 > [Filters - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Filters#Filters+for+File+Properties) @@ -778,7 +780,7 @@ filter by function task.tags.find( (tag) => tag.split('/').length >= 3 ) && true -### File Path 文件路径 +#### File Path 文件路径 请注意,该路径包含 `.md` 扩展名。 @@ -831,7 +833,7 @@ filter by function task.file.path.toLocaleLowerCase() === 'TASKS RELEASES/4.1.0 -### Root 根路径 +#### Root 根路径 > [!caution]- > @@ -874,7 +876,7 @@ filter by function task.file.root === 'Work/' -### Folder 文件夹 +#### Folder 文件夹 > @@ -893,7 +895,7 @@ filter by function task.file.root === 'Work/' -### File Name 文件名 +#### File Name 文件名 > [!tip]+ > @@ -938,7 +940,7 @@ filter by function task.file.filename.includes("4.1.0 Release") -### Heading 标题过滤器 +#### Heading 标题过滤器 1. `heading (includes|does not include) ` - 它至少包含字符串 `` 的一次,匹配该部分中所有任务。 @@ -967,7 +969,7 @@ done last week -# 解释查询 (Explaining Queries) +## 解释查询 (Explaining Queries) > [Explaining Queries - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Explaining+Queries) @@ -990,7 +992,7 @@ done last week -## 示例:过滤器中的日期已扩展 +### 示例:过滤器中的日期已扩展 例如,当以下文本放置在任务查询块中时: @@ -1026,7 +1028,7 @@ Explanation of this Tasks code block query: -# 排序 (Sorting) +## 排序 (Sorting) > [Sorting - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Sorting) @@ -1114,11 +1116,11 @@ sort by path -# 分组 (Grouping) +## 分组 (Grouping) > [Grouping - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Grouping) -> [!note]+ Tasks 查询语法的执行循序 +> [!note] Tasks 查询语法的执行循序 > > 1. 所有过滤器指令均已运行 > 2. 然后运行任何排序指令 @@ -1132,7 +1134,7 @@ sort by path -## 基础 (Basic) +### 基础 (Basic) > [!tip]+ > 在任务 1.6.0 中引入。 @@ -1143,7 +1145,7 @@ sort by path -### 示例 +#### 示例 ````md ```tasks @@ -1154,7 +1156,7 @@ group by filename -## 分组的类型 +### 分组的类型 - 按任务状态分组:Group by Task Statuses - 同 [[#过滤器 (Filters)#任务状态过滤器]],详见 [📍官方文档](https://publish.obsidian.md/tasks/Queries/Grouping#Group+by+Task+Statuses) @@ -1169,7 +1171,7 @@ group by filename -## 拓展:自定义分组 +### 拓展:自定义分组 > [!tip]+ > Tasks 4.0.0 中引入了 `group by function` 。 @@ -1180,7 +1182,7 @@ group by filename -## 多个分组 (Multiple groups) +### 多个分组 (Multiple groups) 您可以添加多个 `group by` 查询选项,每个选项占一行。这将创建嵌套分组。第一个分组优先级最高。 @@ -1205,7 +1207,7 @@ group by heading -## 细化分组 (Refining groups) +### 细化分组 (Refining groups) 可以设置分组的几个参数: @@ -1214,7 +1216,7 @@ group by heading -### Reverse +#### Reverse 在要分组的属性名称后面,可以添加 `reverse` 关键字。如果指定,则该属性的组标题将相反。 @@ -1229,7 +1231,7 @@ group by heading -### Limiting group size +#### Limiting group size 您可以限制每个组中的任务数量,也许首先处理最重要的事情。 @@ -1244,7 +1246,7 @@ group by heading -# 限制 (Limiting) +## 限制 (Limiting) > [Limiting - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Limiting) @@ -1254,7 +1256,7 @@ group by heading -## 限制任务总数 +### 限制任务总数 您可以限制显示为查询结果的任务总数。 @@ -1264,7 +1266,7 @@ group by heading -## 限制每组中的任务数量 +### 限制每组中的任务数量 使用查询字符串 `limit groups to tasks` 可以限制每个组中允许的任务数量。 @@ -1279,7 +1281,7 @@ group by heading -## 查看找到的任务总数 +### 查看找到的任务总数 如果任一 `limit` 选项阻止任何任务显示在结果中,则会显示总数,例如: @@ -1292,7 +1294,7 @@ group by heading -# 布局 (Layout) +## 布局 (Layout) > [Layout - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Layout) @@ -1304,7 +1306,7 @@ group by heading -## Task Elements +### Task Elements 以下任务元素存在: @@ -1325,7 +1327,7 @@ group by heading -## Query Elements +### Query Elements 存在以下查询元素: @@ -1338,7 +1340,7 @@ group by heading -## Hiding/Showing Elements +### Hiding/Showing Elements 每个 [[#Task Elements|Task元素(Task Elements)]] 可以都设置隐藏 (hide) 或显示 (show),且查询中可以使用多个 show 和 hide 指令,每个指令位于单独的行上。 @@ -1358,7 +1360,7 @@ show urgency -### Hide OR Show Tree +#### Hide OR Show Tree > [!tip] > 新的指令 `show tree` 是教 Tasks 插件完全处理 [嵌套任务和列表项](https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax#Nesting+lists) 的一系列步骤中的第一个。 @@ -1383,7 +1385,7 @@ hide backlink -### Hide OR Show Tags +#### Hide OR Show Tags [Layout - Tasks User Guide - Obsidian Publish](https://publish.obsidian.md/tasks/Queries/Layout#Hide+and+Show+Tags) @@ -1397,7 +1399,7 @@ hide tags -## Full Mode +### Full Mode 在**完整模式 (Full Mode)**下,查询结果将显示表情符号和具体的重复规则或日期。 @@ -1418,7 +1420,7 @@ full mode -## Short Mode +### Short Mode 在**短模式 (Short Mode)**下,查询结果只会显示表情符号,而不显示具体的重复规则或日期。您可以将鼠标悬停在任务上以查看工具提示中的规则和日期。 @@ -1435,7 +1437,7 @@ short mode -# 注释 (Comments) +## 注释 (Comments) > [Comments - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Comments) @@ -1453,7 +1455,7 @@ not done -## Inline comments 行内注释 +### Inline comments 行内注释 > 行内注释在 Tasks 4.7.0 中引入。 @@ -1470,7 +1472,7 @@ short mode {{! 这条注释将被忽略 }} -# 全局查询 (Global Query) +## 全局查询 (Global Query) > [Global Query - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Global+Query) @@ -1481,7 +1483,7 @@ short mode {{! 这条注释将被忽略 }} -## 忽略全局查询 (Ignore global query) +### 忽略全局查询 (Ignore global query) 如果您需要忽略给定任务块中的全局查询,您可以将 `ignore global query` 指令添加到块的任何位置。 @@ -1494,11 +1496,11 @@ tags include work ignore global query ``` -> [!tip]+ Tasks 4.6.0 中添加了 ignore global query 指令。 +> [!tip] Tasks 4.6.0 中添加了 ignore global query 指令。 -# 组合过滤器 (Combining+Filters) +## 组合过滤器 (Combining+Filters) > [Combining Filters - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Combining+Filters) @@ -1521,7 +1523,7 @@ not done -## 语法 (Syntax) +### 语法 (Syntax) 一个或多个过滤器可以通过布尔运算符组合在一行中,以创建一个新的、强大的、灵活的过滤器。 @@ -1568,7 +1570,7 @@ not done -## 执行优先级 (Execution Priority) +### 执行优先级 (Execution Priority) 运算符按以下顺序评估: @@ -1603,7 +1605,7 @@ not done -## 布尔运算 (Boolean Operators) +### 布尔运算 (Boolean Operators) | 符号 | 含义 | | ------- | ---- | @@ -1616,7 +1618,7 @@ not done -### AND +#### AND > 要求**每个**过滤器都匹配 @@ -1643,7 +1645,7 @@ description includes some -### OR +#### OR > 需要**任何**过滤器来匹配 @@ -1660,7 +1662,7 @@ not done -### NOT +#### NOT > 要求过滤器**不**匹配 @@ -1698,7 +1700,7 @@ NOT ( (path includes x) OR (description includes #x) ) -### AND NOT +#### AND NOT > 要求第一个过滤器匹配,并且第二个过滤器不匹配 @@ -1710,7 +1712,7 @@ NOT ( (path includes x) OR (description includes #x) ) -### OR NOT +#### OR NOT > 要求第一个过滤器匹配,或第二个过滤器不匹配。 @@ -1722,7 +1724,7 @@ NOT ( (path includes x) OR (description includes #x) ) -### 异或 +#### 异或 > **只需要两个过滤器之一**进行匹配 @@ -1751,7 +1753,7 @@ not done -# 反向链接 (BackLinks) +## 反向链接 (BackLinks) > [Backlinks - Tasks用户指](https://publish.obsidian.md/tasks/Queries/Backlinks) @@ -1772,7 +1774,7 @@ not done -# 行延续 (Line Continuations) +## 行延续 (Line Continuations) > [Line Continuations - Tasks用户指南](https://publish.obsidian.md/tasks/Queries/Line+Continuations) @@ -1782,7 +1784,7 @@ not done -## 在查询中换行长行 +### 在查询中换行长行 在任务代码块中,**反斜杠 ( `\` )**是“行继续字符”。如果反斜杠位于行尾,则该行被视为在下一行继续。 @@ -1828,7 +1830,7 @@ Explanation of this Tasks code block query: -## 需要尾部反斜杠的搜索 +### 需要尾部反斜杠的搜索 在任务代码块中,**行末的两个反斜杠 ( `\\` )**被视为**单个反斜杠**。 From 2d0158058bf6f6e7613b0665fc734ff0fdcfe1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E7=8C=AB=E5=88=AB=E7=86=AC=E5=A4=9C?= <11595443+qiu-tenghuang@user.noreply.gitee.com> Date: Fri, 27 Dec 2024 18:23:25 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=B0=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AAquickadd=E8=84=9A=E6=9C=AC=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\344\270\255\346\211\223\345\274\200.md" | 68 +++++++++++++++++++ .../Quickadd/quickadd.md" | 1 + 2 files changed, 69 insertions(+) create mode 100644 "10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/QuickAdd\350\204\232\346\234\254-\345\234\250\344\276\247\350\276\271\344\270\255\346\211\223\345\274\200.md" diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/QuickAdd\350\204\232\346\234\254-\345\234\250\344\276\247\350\276\271\344\270\255\346\211\223\345\274\200.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/QuickAdd\350\204\232\346\234\254-\345\234\250\344\276\247\350\276\271\344\270\255\346\211\223\345\274\200.md" new file mode 100644 index 00000000..aefc875d --- /dev/null +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/QuickAdd\350\204\232\346\234\254-\345\234\250\344\276\247\350\276\271\344\270\255\346\211\223\345\274\200.md" @@ -0,0 +1,68 @@ +--- +uid: 20241227181944 +title: QuickAdd 脚本 - 在侧边中打开 +tags: [quickadd脚本, 窗口管理] +description: 模仿浏览器的“在边栏中打开”的选项,是笔记在侧边栏中打开并固定。 +author: 熊猫别熬夜 +type: other +draft: false +editable: false +modified: 20241227182041 +--- + +# QuickAdd 脚本 - 在侧边中打开 + +模仿浏览器的“在边栏中打开”的选项,是笔记在侧边栏中打开并固定。 + +![241227_QuickAdd脚本:在侧边打开.md](https://cdn.pkmer.cn/images/202412271819910.png!pkmer) + +![241227_QuickAdd脚本:在侧边打开.md](https://cdn.pkmer.cn/images/202412271819700.gif) + +## QuickAdd Capture + +### 侧边打开 + +```` +```js quickadd +const activefile = app.workspace.getActiveFile(); +const filePath = app.vault.getAbstractFileByPath(activefile.path) +app.workspace.getLeaf('split', 'vertical').openFile(filePath); + +const comm = str => app.commands.executeCommandById(str); + +const setPanel = percent => { + let right = document.querySelector('.workspace-split.mod-vertical.mod-root').lastElementChild; + right.previousSibling.style.flexGrow = percent; + right.style.flexGrow = 100 - percent; +}; + +setTimeout(() => { + setPanel(75); // 50、80 + comm('editor:focus-right'); + comm("workspace:toggle-pin"); +}, 50); + +``` +```` + +### 侧边栏打开 + +```` +```js quickadd +const activefile = app.workspace.getActiveFile(); +const filePath = app.vault.getAbstractFileByPath(activefile.path) +const rightSidebar = app.workspace.rightSplit; +const leaf = rightSidebar.getLeaf(true); +leaf.openFile(filePath); + +const comm = str => app.commands.executeCommandById(str); + +setTimeout(() => { + comm("workspace:toggle-pin"); +}, 50); +``` +```` + +## Reference + +- [【已解决】Obsidian 左右筆記並列佈局快捷調整左右 layout 比例 (不用滑鼠拖曳) - 3,来自 PlayerMiller - 疑问解答 - Obsidian 中文论坛](https://forum-zh.obsidian.md/t/topic/31477/3) diff --git "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/quickadd.md" "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/quickadd.md" index 59cc28f1..e5bc4d4c 100644 --- "a/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/quickadd.md" +++ "b/10-Obsidian/Obsidian\347\244\276\345\214\272\346\217\222\344\273\266/Quickadd/quickadd.md" @@ -28,6 +28,7 @@ modified: 20241224232926 2. [[Quickadd脚本-一键在系统应用中打开图片编辑]] 3. [[QuickAdd脚本-一键切换VimMode]] 4. [[QuickAdd脚本-随机漫游笔记]] +5. [[QuickAdd脚本-在侧边中打开]] ### 文档编辑 From db36803e4036385792e53d198b5ebf4c0abefa70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E7=8C=AB=E5=88=AB=E7=86=AC=E5=A4=9C?= <11595443+qiu-tenghuang@user.noreply.gitee.com> Date: Fri, 27 Dec 2024 22:32:43 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=95=99=E7=A8=8B=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\347\264\242\345\212\237\350\203\275.md" | 171 ++++++++++++++++++ ...72\346\234\254\344\275\277\347\224\250.md" | 3 +- 2 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 "10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidan\345\205\250\345\261\200\346\220\234\347\264\242\345\212\237\350\203\275.md" diff --git "a/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidan\345\205\250\345\261\200\346\220\234\347\264\242\345\212\237\350\203\275.md" "b/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidan\345\205\250\345\261\200\346\220\234\347\264\242\345\212\237\350\203\275.md" new file mode 100644 index 00000000..b8bd3428 --- /dev/null +++ "b/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidan\345\205\250\345\261\200\346\220\234\347\264\242\345\212\237\350\203\275.md" @@ -0,0 +1,171 @@ +--- +uid: 20241227222717 +title: Obsidan 全局搜索功能 +tags: [快速搜索] +description: Obsidian 核心插件——搜索,可以通过使用高级搜索词和运算符缩小结果范围,帮助您快速查找 Obsidian 库中的关键数据。 +author: 熊猫别熬夜 +type: other +draft: false +editable: false +modified: 20241227223114 +--- + +# Obsidan 全局搜索功能 + +> [!cite] 原文来自 [Search - Obsidian Help](https://help.obsidian.md/Plugins/Search) + +Obsidian 核心插件——**搜索**,可以通过使用高级搜索词和运算符缩小结果范围,帮助您快速查找 Obsidian 库中的关键数据。 + +默认情况下,您可以在左侧边栏中找到搜索(🔍)。您还可以通过按 `Ctrl+Shift+F` (或 macOS 上的 `Cmd+Shift+F` )打开搜索。 + +- **搜索所选文本**:如果您在编辑器中选择文本并使用键盘快捷键打开“搜索”,“搜索”将显示所选文本的搜索结果。 +- **搜索最近的搜索词**:使用空搜索词打开搜索以列出最近的搜索词。单击其中任意一个即可再次使用搜索词。 + +## 搜索词 (Search terms) + +搜索词是您在搜索字段中输入的单词或短语。学习如何有效地编写搜索词可以帮助您快速找到所需的内容,即使在大型金库中也是如此。 **Obsidian 只搜索笔记和画布的内容。** + +默认情况下,您只能搜索笔记和画布的路径和文件名。要搜索 Vault 中任何文件的路径或文件名,请使用 `path` 或 `file` 运算符。 + +### 转义反斜杠 + +搜索词中的每个单词在每个文件中都是独立匹配的。要搜索确切的短语,请用引号括起来,例如 `"star wars"` 。要搜索精确短语中引用的文本,您可以通过在引号前面添加反斜杠 ( `\` ) 来转义引号,例如 `"they said \"hello\" to each other"` 。 + +### 组合运算 (空格 与 AND 或 OR) + +您可以控制是否返回包含搜索词中的*所有*单词或*任何*单词的文件: + +- `meeting work` 返回包含 `meeting` 和 `work` 文件。 +- `meeting OR work` 返回包含 `meeting` 或 `work` 文件。 + +您甚至可以将两者组合在同一个搜索词中。 + +- `meeting work OR meetup personal` 返回“ work meetings”和“meetup personal”的文件。 + +您可以使用括号来控制每个表达式的优先级。 + +- `meeting (work OR meetup) personal` 返回包含 `meeting` 、 `personal` 以及 `work` 或 `meetup` 的文件。 + +### 非运算 ( - ) + +要从搜索结果中排除或否定某个单词,请在其前面添加连字符 ( `-` ): + +- `meeting -work` 返回包含 `meeting` 但不包含 `work` 文件。 + +您可以排除多个表达式: + +- `meeting -work -meetup` 返回包含 `meeting` 但不包含 `work` 或 `meetup` 的文件。 + +### 括号组合表达式 + +您可以使用括号排除表达式组合: + +- `meeting -(work meetup)` 返回包含 `meeting` 但不*同时*包含 `work` 和 `meetup` 的文件。 + +如果您需要对复杂的搜索词进行故障排除,可以单击“搜索”中的**“解释搜索词”**以获取搜索词的解释。 + +## 搜索运算符 (Search operators) + +搜索运算符支持更细粒度的搜索词,以进一步过滤您的结果。 + +有些运算符甚至允许您在括号内添加嵌套搜索词,例如: `task:(call OR email)` 。 + +| 搜索运算符 | 描述 | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `file:` | 查找文件名中的文本。匹配 Vault 中的任何文件。
示例: `file:.jpg` 或 `file:202209` 。 | +| `path:` | 在文件路径中查找文本。匹配 Vault 中的任何文件。
示例: `path:"Daily notes/2022-07"` 。 | +| `content:` | 在文件内容中查找文本。
示例: `content:"happy cat"` 。 | +| `match-case:` | 区分大小写的匹配。
示例: `match-case:HappyCat` 。 | +| `ignore-case:` | 不区分大小写的匹配。
示例: `ignore-case:ikea` 。 | +| `tag:` | 在文件中查找标签。
示例: `tag:#work` 。
请记住,搜索 `tag:#work` 不会返回 `#myjob/work` 的结果。
**注意**:由于 `tag:` 忽略代码块和非 Markdown 内容中的匹配,因此它通常比 `#work` 的普通全文搜索更快、更准确。 | +| `line:` | 在同一行查找匹配项。
示例: `line:(mix flour)` 。 | +| `block:` | 在同一块中查找匹配项。
示例: `block:(dog cat)` 。
**注意**:由于 `block:` 需要搜索来解析每个文件中的 Markdown 内容,因此可能会导致您的搜索词需要更长的时间才能完成。 | +| `section:` | 在同一部分(两个标题之间的文本)中查找匹配项。
示例: `section:(dog cat)` 。 | +| `task:` | 按照块的方式在任务中查找匹配项。
示例: `task:call` 。 | +| `task-todo:` | 按照区块的方式在*未完成*的任务中找到匹配项。
示例: `task-todo:call` 。 | +| `task-done:` | 按照区块的方式在*已完成*的任务中找到匹配项。
示例: `task-done:call` 。 | + +## 搜索属性 (Search properties) + +您可以在搜索词中使用 属性 中存储的数据。 + +使用括号将属性名称 `[property]` 括起来以返回具有该属性的文件: + +- `[aliases]` 返回包含 `aliases` 属性的文件 + +使用方括号和冒号 `[property:value]` 返回具有该属性和值的文件: + +- `[aliases:Name]` 返回 `aliases` 属性值为 `Name` 文件 + +属性和值都允许子查询,例如用于分组的括号、 `OR` 运算符、用于精确匹配的双引号和正则表达式。 + +- 示例: `[status:Draft OR Published]` 查找返回 `status` 属性值为 `Draft` 或 `Published` 文件 + +## 更改区分大小写 + +默认情况下,搜索词不区分大小写。如果您想搜索搜索词的确切大小写,请单击**匹配大小写**(![obsidian-upper-lowercase.svg](https://publish-01.obsidian.md/access/f786db9fac45774fa4f0d8112e232d67/Attachments/icons/obsidian-upper-lowercase.svg))在搜索栏中。 + +![【Obsidian】查询语法(Query Syntax).md](https://cdn.pkmer.cn/images/202412272229491.png!pkmer) + +此设置可以切换。如果**“匹配大小写”**图标突出显示,则意味着您当前正在进行区分大小写的搜索。 + +## 更改结果排序顺序 + +1. 输入**搜索词 (Search term)**。 +2. 在搜索字段下,单击右侧的下拉菜单。 +3. 选择您想要的排序顺序。默认为“文件名(A 到 Z)”。 + +![【Obsidian】查询语法(Query Syntax).md](https://cdn.pkmer.cn/images/202412272229150.png!pkmer) + +可以使用以下选项: + +- 文件名(A 到 Z) +- 文件名(Z 到 A) +- 修改时间(从新到旧) +- 修改时间(从旧到新) +- 创建时间(从新到旧) +- 创建时间(从旧到新) + +## 复制搜索结果 + +![【Obsidian】查询语法(Query Syntax).md](https://cdn.pkmer.cn/images/202412272229610.png!pkmer) + +1. 输入**搜索词 (Search term)**。 +2. 在搜索字段下,选择结果数量旁边的三个点图标。 +3. 选择**复制搜索结果**,弹出的对话框,可以设置搜索结果的格式。 + +![【Obsidian】查询语法(Query Syntax).md](https://cdn.pkmer.cn/images/202412272229061.png!pkmer) + +## 使用正则表达式 + +正则表达式是描述文本模式的一组字符。要在搜索词中使用正则表达式,请用正斜杠 ( `/` ) 将表达式括起来。 + +- `/\d{4}-\d{2}-\d{2}/` 匹配 ISO 8601 日期,例如 2022-01-01。 + +您甚至可以将正则表达式与搜索运算符结合起来: + +- `path:/\d{4}-\d{2}-\d{2}/` 返回文件路径中带有日期的文件。 + +正则表达式有不同的风格,可能看起来彼此不同。 Obsidian 使用 JavaScript 风格的正则表达式。 + +## 配置搜索设置 + +要配置搜索,请单击**搜索设置**在搜索栏右侧查看切换。 + +![【Obsidian】查询语法(Query Syntax).md](https://cdn.pkmer.cn/images/202412272229564.png!pkmer) + +| 环境 | 描述 | +| ----------- | -------------------- | +| **折叠结果** | 切换是否显示搜索上下文。 | +| **显示更多上下文** | 扩展搜索结果以显示匹配项周围的更多文本。 | +| **说明搜索词** | 分解搜索词并以纯文本进行解释。 | + +## Query 代码块 + +要将搜索结果嵌入到注释中,请添加 `query` 代码块: + +```` +```query +embed OR search +``` +```` \ No newline at end of file diff --git "a/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250.md" "b/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250.md" index d42f69a6..1e780d53 100644 --- "a/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250.md" +++ "b/10-Obsidian/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250/Obsidian\345\237\272\346\234\254\344\275\277\347\224\250.md" @@ -35,4 +35,5 @@ modified: 20241214125753 - [[Obsidian设置]] - [[脑图和流程图]] - [[Obsidian_URI]] -- [[块链接与块引用]] \ No newline at end of file +- [[块链接与块引用]] +- [[Obsidan全局搜索功能]] \ No newline at end of file