{"id":916,"date":"2018-01-11T01:01:29","date_gmt":"2018-01-11T01:01:29","guid":{"rendered":"http:\/\/blog.datentraeger.li\/?p=916"},"modified":"2018-05-01T22:47:23","modified_gmt":"2018-05-01T22:47:23","slug":"taskwarrior","status":"publish","type":"post","link":"https:\/\/blog.datentraeger.li\/?p=916","title":{"rendered":"taskwarrior"},"content":{"rendered":"<p>Bin beim &#8220;RSS-Feeds&#8221; r\u00e4umen grad auf diesen <a href=\"https:\/\/noqqe.de\/blog\/2016\/05\/08\/taskwarrior-review\/\" target=\"_blank\" rel=\"noopener\">Blogeintrag<\/a> gestossen und hab mir gedacht, dass ich Taskwarrior auch mal anschauen werde&#8230; (ja ich weiss, ist schon \u00e4lter, hab ihn immer &#8220;ungelesen&#8221; gelassen, da ich es eben genauer anschauen wollte&#8230;)<\/p>\n<h3>Task anlegen<\/h3>\n<p>Ich mach jetzt grad ein Beispiel, bei dem m\u00f6glichst viele Angaben enthalten sind. Diese m\u00fcssen nat\u00fcrlich nicht immer angegeben werden<\/p>\n<pre class=\"lang:default decode:true\">task add \"\u00fcber taskwarrior schreiben\" project:work +blog (+tag2) (+tag3...) due:1w priority:M depends 2,4<\/pre>\n<p>Das legt dem Tasl &#8220;\u00fcber taskwarroir schreiben&#8221; unter dem Projekt &#8220;work&#8221; mit den tags &#8220;blog&#8221;, dem F\u00e4lligkeitsdatum in einer Woche, der Priorit\u00e4t Medium an. Zudem ist er abh\u00e4ngig vom Task mit der ID 2 + 4.<\/p>\n<p>Oder einen monatlichen Task erstellen, aber nur f\u00fcr ein Jahr<\/p>\n<pre class=\"\">task add Pay rent due:28th recur:monthly until:now+1yr<\/pre>\n<pre class=\"\">task add Pay the rent due:eom (End-Of-Month)<\/pre>\n<p>Auch ganz cool: Monatlich jeweils am 25-ten<\/p>\n<pre class=\"lang:default decode:true\">task add Monatslohn \u00fcberweisen due:25th recur:monthly<\/pre>\n<p>und dann andere Zahlungen abh\u00e4ngig machen davon<\/p>\n<pre class=\"lang:default decode:true \">task add Krankenkasse zahlen due:eom project:private depends:113 (id vom anderen Task, das w\u00e4re hier \"Monatslohn \u00fcberweisen\")<\/pre>\n<h3>\u00c4ndern<\/h3>\n<p>Mit modify k\u00f6nnen Tasks ge\u00e4ndert werden (man kann aber auch &#8220;edit&#8221; verwenden und via vi anpassen)<\/p>\n<pre class=\"lang:default decode:true\">task 1 modify depends:2-4<\/pre>\n<h3>Notizen<\/h3>\n<p>um eine Notiz bei einem Task hinzuzuf\u00fcgen:<\/p>\n<pre class=\"lang:default decode:true \">task annotate 117 Notiz f\u00fcr Task 117<\/pre>\n<p>Dies kann man beliebig oft wiederholen. In der Auflistung wird mit der Anzahl Notizen in [] hingewiesen, bspw.:<\/p>\n<pre class=\"lang:default decode:true\">ID  Project Tags Description                       \r\n117 private irgendein Task [3]<\/pre>\n<h3>Filterung<\/h3>\n<p>Wenn man nur die Tasks mit gewissen Tags oder von gewissen Projekten angezeit haben m\u00f6chte, kann man das einfach bei den Parametern mitgeben, z.B.:<\/p>\n<pre class=\"lang:default decode:true\">task ghistory project:work\r\ntask burndown.daily +blog\r\ntask list project:private\r\ntask +OVERDUE list\r\ntask +WEEK list\r\ntask +DUE -DUETODAY list (alle \u00fcberf\u00e4lligen, aber nicht die heute \u00fcberf\u00e4lligen)<\/pre>\n<p>Das ganze geht nat\u00fcrlich auch ohne Tags \/ Projekt, aber ich finde diese Optionen schon ziemlich cool&#8230;<\/p>\n<p>Wenn man einen Task starten, teilt man das einfach taskwarrior mit (ich glaube, damit wird auch einfach die Priosisierung in tw aktualisiert). Zudem kann man bspw. mit &#8220;task active&#8221; checken, woran man grad arbeitet&#8230;<\/p>\n<pre class=\"lang:default decode:true\">task 12 start<\/pre>\n<p>wenn er erledigt ist einfach &#8220;done&#8221; setzen&#8230;<\/p>\n<pre class=\"lang:default decode:true \">task 12 done<\/pre>\n<h3>Doku<\/h3>\n<p>Das ganze geht nat\u00fcrlich ins &#8220;Endlose&#8221;, also schaut man sich am Besten mal die <a href=\"https:\/\/taskwarrior.org\/docs\/examples.html\" target=\"_blank\" rel=\"noopener\">Doku mit etlichen Beispielen<\/a> und Erkl\u00e4rungen an (hab ja auch das meiste nur daraus kopiert&#8230;)<\/p>\n<h3>Suche<\/h3>\n<p>mit task ls \/suchbegriff\/ kann man recht simpel suchen<\/p>\n<pre class=\"lang:default decode:true\">task ls \/zahlen\/\r\n\r\nID Project Tags R Description\r\n111 private home R Krankenkasse zahlen\r\n113 work R Monatslohn zahlen<\/pre>\n<p>Viele weitere Beispiele findet man in der <a href=\"https:\/\/taskwarrior.org\/docs\/searching.html\" target=\"_blank\" rel=\"noopener\">Doku<\/a>&#8230; darum geh ich auch nicht weiter darauf ein&#8230;<\/p>\n<h3>Integration in Mutt<\/h3>\n<p>Um Mails zu Tasks zu machen, erstellt man ein Keybinding. Ich habe C-a gew\u00e4hlt (t ist bei mir schon f\u00fcr&#8217;s Taggen reserviert)<\/p>\n<pre class=\"lang:default decode:true \">#taskwarrior, add task with ctrl-a\r\nmacro index,pager \\Ca \"&lt;pipe-message&gt;~\/.mutt\/mutt2task\/mutt2task.sh&lt;enter&gt;\"<\/pre>\n<p>Dass mutt2task-Script ist ziemlich simpel gestrickt:<\/p>\n<pre class=\"lang:default decode:true\">\/usr\/bin\/task add +email E-mail: $(grep 'Subject' $* | awk -F: '{print $2}')<\/pre>\n<p>Damit wird ein Task mit dem Mailsubject und dem Tag &#8220;email&#8221; erstellt.<\/p>\n<h3>Sync mit Bugtracker<\/h3>\n<p>Mit <a href=\"https:\/\/github.com\/ralphbean\/bugwarrior\" target=\"_blank\" rel=\"noopener\">bugwarrior<\/a> k\u00f6nnen Tickets aus Redmine, Github, Jira und etlichen anderen Bugtrackern synchronisiert werden. Wird dort ein Ticket geschlossen, wird dies auch beim n\u00e4chsten Syncdurchgang ber\u00fccksichtigt. Die <a href=\"https:\/\/bugwarrior.readthedocs.io\/en\/latest\/\" target=\"_blank\" rel=\"noopener\">Dokumentation<\/a> hat zu allen Services Beispiele. Das ganze schaut dann in etwa so aus (hier mit Redmine):<\/p>\n<pre class=\"lang:default decode:true \">[foo_redmine]\r\nservice = redmine\r\nredmine.url = https:\/\/redmine.foo.bar\/\r\nredmine.key = API-KEY\r\nredmine.user_id = USER-ID \r\nredmine.project_name = work\r\nredmine.issue_limit = 100 \r\nredmine.add_tags = redmine\r\n<\/pre>\n<p>Somit werden Tickets mit dem Tag &#8220;redmine&#8221; zum Projekt &#8220;work&#8221; synchronisiert, auf 100 limitiert. Wird ein Ticket geschlossen, wird dies nat\u00fcrlich auch im Sync ber\u00fccksichtigt&#8230;<\/p>\n<h3>Server<\/h3>\n<p>Verwendet man Taskwarrior auf mehreren Endger\u00e4ten, ist nat\u00fcrlich eine Serverinstanz gar nicht uninteressant. Auch hierzu gibt es eine <a href=\"https:\/\/taskwarrior.org\/docs\/taskserver\/setup.html\" target=\"_blank\" rel=\"noopener\">L\u00f6sung<\/a>: den Taskserver (unter Debian ist er als taskd paketiert).<\/p>\n<p>Es gibt auch etliche <a href=\"https:\/\/taskwarrior.org\/tools\/\" target=\"_blank\" rel=\"noopener\">Tools \/ Erweiterungen<\/a> f\u00fcr Taskwarrior, bspw. Weboberfl\u00e4chen etc. Ziemlich cool, das ganze. Und so kann man auch Leute dazu bewegen, Taskwarrior einzusetzen, die nichts mit einem cli-Interface zu tun haben m\u00f6chten&#8230;<\/p>\n<p><em>EDIT 01.05.2018:<\/em> Habe nun auch den Serverteil von <a href=\"https:\/\/blog.datentraeger.li\/?p=1494\" target=\"_blank\" rel=\"noopener\">taskwarrior (taskd) montiert und dokumentiert<\/a>.<\/p>\n<h4>\u00dcbersicht<\/h4>\n<p>so schaut in etwa ein &#8220;task next&#8221; Output aus&#8230;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-956\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/2018-01-11-020406_1096x247_scrot.png\" alt=\"\" width=\"1096\" height=\"247\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/2018-01-11-020406_1096x247_scrot.png 1096w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/2018-01-11-020406_1096x247_scrot-300x68.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/2018-01-11-020406_1096x247_scrot-768x173.png 768w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/2018-01-11-020406_1096x247_scrot-1024x231.png 1024w\" sizes=\"auto, (max-width: 1096px) 100vw, 1096px\" \/><\/p>\n<h4>mein Fazit<\/h4>\n<p>also ich setze das ganze jetzt seit etwa einer Woche ein &#8211; und ich bin verdammt begeistert. Vorallem der <a href=\"https:\/\/github.com\/ralphbean\/bugwarrior\" target=\"_blank\" rel=\"noopener\">Sync mit Redmine<\/a>, einfach Hammer. Ich habe das Gef\u00fchl, dass ich meine &#8220;Tasks&#8221; wesentlich besser im Griff habe, seitdem ich taskwarrior verwende. Ich kann jedem nur empfehlen, taskwarrior mal anzuschauen. F\u00fcr mich ist es generell eine sehr grosse Bereicherung, jetzt habe ich Mail (mutt), Kalender (<a href=\"http:\/\/blog.datentraeger.li\/?p=615\">khal<\/a>), Kontakte (<a href=\"http:\/\/blog.datentraeger.li\/?p=615\">khard<\/a>) und IM (<a href=\"http:\/\/blog.datentraeger.li\/?p=631\">profanity\/weechat<\/a>) im &#8220;TUI&#8221; (terminal user interface). Das macht mich schon sehr happy&#8230;<\/p>\n<p>Eigentlich dachte ich, dass Redmine schon mehr als genug ist f\u00fcr mich (w\u00fcrde ich auch nicht me\u0125r weggeben), aber taskwarrior setzt noch eins drauf&#8230;<\/p>\n<p><em>EDIT [30.01.2018]<\/em><\/p>\n<p>Nach bald einem Monat mit taskwarrior bin ich immer noch voll begeistert, hab mich jedoch noch nicht dazu bewegt, eine Serverinstanz aufzusetzen (taskd).<\/p>\n<p>Gerade eben kam mir noch <a href=\"https:\/\/github.com\/pimutils\/todoman\" target=\"_blank\" rel=\"noopener\">todoman<\/a> in die Quere. Es ist zwar wesentlich weniger umfangreich, was ich bei todoman aber sehr sch\u00f6n finde, ist die out-of-the-box Integration mit CalDAV. Das scheint bei taskwarrior <a href=\"https:\/\/bug.tasktools.org\/browse\/TW-167\" target=\"_blank\" rel=\"noopener\">leider nicht so ein Thema<\/a> zu sein.<\/p>\n<p><em>EDIT [15.03.2018]<\/em><\/p>\n<p>Und immer noch bin ich voll begeistert (das CalDAV-Problem mal \u00fcberschaut), aber ich habe meine Task wirklich wesentlich besser &#8220;im Griff&#8221;, seitdem ich taskwarrior einsetze..<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1263\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tw_burndown.png\" alt=\"\" width=\"869\" height=\"645\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tw_burndown.png 869w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tw_burndown-300x223.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tw_burndown-768x570.png 768w\" sizes=\"auto, (max-width: 869px) 100vw, 869px\" \/><\/p>\n<p>(die Pending bleiben immer gleich, da ich via bugwarrior immer die letzten Tickets aus Redmine wieder importiere&#8230;)<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"Bin beim &#8220;RSS-Feeds&#8221; r\u00e4umen grad auf diesen Blogeintrag gestossen und hab mir gedacht, dass ich Taskwarrior auch mal anschauen werde&#8230; (ja ich weiss, ist schon \u00e4lter, hab ihn immer &#8220;ungelesen&#8221; gelassen, da ich es eben genauer anschauen wollte&#8230;) Task anlegen Ich mach jetzt grad ein Beispiel, bei dem m\u00f6glichst viele&hellip;\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,4],"tags":[],"class_list":["post-916","post","type-post","status-publish","format-standard","hentry","category-cli","category-debiangnu-linux"],"_links":{"self":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=916"}],"version-history":[{"count":36,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/916\/revisions"}],"predecessor-version":[{"id":1536,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/916\/revisions\/1536"}],"wp:attachment":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}