FocusPlex sur FocusPlex.com a pour but de mettre l'accent sur la complexité grâce à l'utilisation de markdown et d'autres formats de fichiers dans des hiérarchies de dossiers de manière codifiée avec un mécanisme de synchronisation omniprésent.
Mes implémentations de FocusPlex sont des hiérarchies de fichiers et de dossiers dans des dossiers synchronisés qui sont accessibles par des rendus web. J'utilise chacune d'entre elles pour gérer mes documents de référence, mes documents de tâches et mes informations de configuration. J'ai des implémentations distinctes pour ma vie personnelle, ma vie professionnelle et mes différents projets.
Mise en œuvre
J'utilise personnellement et simultanément FocusPlex sur un système de gestion de projet multi-personnes open-source Fossil-SCM, SeaFile, Vimwiki et ReplaceRulesou Find-and-Transform. Les serveurs suivants seraient également en mesure d'utiliser la même structure exacte de fichiers et de dossiers : Gollum, GitIt, GitHub, GitHub. Je suppose qu'il existe un plugin markdown pour les fournisseurs de disques en nuage tels que Google Drive, OneDrive, etc. La clé de l'utilisation à la fois d'un système de contrôle de version et d'un lecteur en nuage consiste à exclure les fichiers et dossiers de données de contrôle de version de la synchronisation avec le lecteur en nuage.
J'utilise FocusPlex pour mettre en œuvre WhoWhatEtc/WhoWhatEtc.com, TaskWhy/TaskWhy.com et ConfigMagic/ConfigMagic.com. Vous pouvez également appliquer et codifier votre FocusPlex à des utilisations telles que 43folders ou autres. FocusPlex est une façon d'organiser l'information et de codifier cette organisation.
J'utilise focus.mann.cool pour ma vie personnelle, focus.mann.city pour ma vie professionnelle, focus.lesgrandsvoisins.com pour LesGrandsVoisins, et j'ai aussi un FocusPlex par projet client.
Utilisation des dossiers de A à Z
Pour simplifier, je placerai souvent des dossiers d'une lettre de a à z à l'avant-dernier niveau d'identification du sujet. Si le sujet est, par exemple, Grenouilles, je mettrai la chose dans catégorie/grenouilles.
Décision de toujours avoir 4 niveaux de profondeur
Mes implémentations de FocusPlex ont toujours une structure de dossiers à quatre niveaux de profondeur comme suit : ./domaine/catégorie/a-z/sujet.
- ./domain/ | Il s'agit du type / espace de nom / domaine des sujets contenus (référence, actionnable, www, media, etc.)
- category/ | C'est la catégorie de l'information contenue (personnes, lieux, choses, etc.)
- a-z/ | C'est la première lettre du sujet. L'utilisation d'un niveau de dossiers de a à z fonctionne mieux pour moi, mais nécessite parfois une étape supplémentaire.
- subject/ | C'est le dossier qui désigne le sujet. Je n'utilise ni majuscules ni tirets.
Ce système de classement à quatre niveaux me permet d'écrire des liens relatifs qui sont toujours précédés de ../../../../
. Mes liens sont généralement ../../../../domaine/catégorie/sujet/un.md
.
Décision pour un fichier .md d'indexation d'une langue à deux lettres
Les fichiers d'index pour tout dossier sont le code de langue à deux lettres. Les fichiers non traduits sont un
. Comme j'utilise markdown comme formatage, les fichiers d'index deviennent un.md
.
Fossil-SCM ou GITHub comme implémentations webs avec liens et recherche
J'utilise Fossil-SCM comme implémentation principale et j'utilise SeaFile comme implémentation alternative et concurrente. Fossil présente deux inconvénients majeurs par rapport à GitHub : l'édition est asynchrone et l'édition se fait sur un ordinateur (et non via le Web). Heureusement, SeaFile permet l'édition synchrone et via le Web.
Faites attention si vous devez mélanger un lecteur synchronisé sur le cloud et un dépôt Git. Mélanger le fichier .git
dans une synchronisation en nuage peut casser les choses (trop de fichiers).
Intégration avec d'autres concepts connexes
La codification vient de WhoWhatEtc pour les références dans un dossier etc
, TaskWhy pour les éléments actionnables dans un dossier task
et ConfigMagic pour les configurations dans un dossier figma
. Les liens sont relatifs et ont toujours exactement quatre niveaux de profondeur. Le fichier par défaut pour tout dossier est un.md
. Les traductions sont identifiées par un code de langue à deux lettres (par exemple en.md ou fr.md).
Tous les concepts se trouvent exactement à quatre niveaux de profondeur dans le système de fichiers. J'utilise les modules suivants :
- whoshatetc/ WhoWhatEtc
- configmagic/ ConfigMagic
- taskwhy/ TaskWhy
- media/ Média (partagé)
- www/ Site Web (partagé)
Articles liés
Les articles liés sont:
Scripts d'aide pour l'éditeur de texte
Voici différents scripts d'aide que j'utilise dans deux éditeurs de texte. Ils utilisent des expressions régulières.
Configuration de VimWiki
Voici ma configuration de vimwiki dans _vimrc pour FocusPlex :
function! WhoWhatEtcLinks(langcode)
:execute '%s_\( \|^\)\(wiki\d\+:\):\(\d\d\d\d\)-\(\d\d\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2:\3-\4\5](\2/etc/when/\3-\4/\3-\4\5/' . a:langcode . '.md) _ge'
":execute '%s_\( \|^\)\(wiki\d\+:\)\?:\(\d\d\d\d\)-\(\d\d\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2:\3-\4\5](\2/etc/when/\3-\4/\3-\4\5/' . a:langcode . '.md) _ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)@\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2@\3\4](\2/etc/who/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)&\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2\&\3\4](\2/etc/whence/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)\^\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2^\3\4](\2/etc/where/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)\~\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2\~\3\4](\2/task/todo/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)\#\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2#\3\4](\2/etc/what/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)?\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2?\3\4](\2/etc/why/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)=\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2=\3\4](\2/etc/way/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)€\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2€\3\4](\2/etc/wealth/\3/\3\4/' . a:langcode . '.md)\5_ge'
:execute '%s_\( \|^\)\(wiki\d\+:\)+\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2+\3\4](\2/etc/wisdom/\3/\3\4/' . a:langcode . '.md)\5_ge'
"\(\[A-z]\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2+\3\4](\2/etc/wisdom/\3/\3\4/' . a:langcode . '.md)\5_ge'
:%s=(\(\.\./\)\+\(task\|etc\|www\|figma\)/=(/\2/=ge
" :%s=\](etc/w=](../../../../etc/w=ge
" :%s=\](task/=](../../../../task/=ge
endfunction
command! WhoWhatEtcLinks call WhoWhatEtcLinks('un')
" \ :%s=\( \|^\)\(wiki\d\+:\)\?:\(\d\d\d\d\)-\(\d\d\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2:\3-\4\5](\2etc/when/\3-\4/\3-\4\5/un.md) =ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?@\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2@\3\4](\2etc/who/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?&\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2\&\3\4](\2etc/whence/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\^\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2^\3\4](\2etc/where/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\~\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2\~\3\4](\2task/todo/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\#\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2#\3\4](\2etc/what/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\??\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2?\3\4](\2etc/why/\3/\3\4/un.md)\5=ge |
" \ :%s_\( \|^\)\(wiki\d\+:\)\?=\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2=\3\4](\2etc/way/\3/\3\4/un.md)\5_ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?€\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2€\3\4](\2etc/wealth/\3/\3\4/un.md)\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?+\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2+\3\4](\2etc/wisdom/\3/\3\4/un.md)\5=ge |
" \ :%s=\](etc/w=](../../../../etc/w=ge |
" \ :%s=\](task/=](../../../../task/=ge
command! WhoWhatEtcLinksfr call WhoWhatEtcLinks('fr')
command! WhoWhatEtcLinksen call WhoWhatEtcLinks('en')
"command! WhoWhatEtcLinksfr
" \ let lineNumber = line('.') |
" \ WhoWhatEtcLinks |
" \ exe lineNumber |
" \ UNfr
command! UNfr s=/un\.md)=/fr.md)=g
command! UNen s=/un\.md)=/en.md)=g
command! ENfr s=/en\.md)=/fr.md)=g
command! FRen s=/fr\.md)=/en.md)=g
command! FRun s=/fr\.md)=/un.md)=g
command! ENun s=/en\.md)=/un.md)=g
command! UPup s=(\.\./=(../../=g
command! UPupup s=(\.\./=(../../../=g
Configuratin de RegexReplace dans Visual Source Code
Voici ma configuration de RegexReplace dans settings.js:
"replacerules.rules": {
"Figma": {
"find":"(^|[\\* ]+)\\%(.+)/(\\w)(\\w+)",
"replace": "$1[%$2/$3$4](../../../../figma/$2/$3/$3$4/un.md)"
},
"FigmaToo": {
"find":"(^|[\\* ]+)\\%(\\w)(\\w+)",
"replace": "$1[%$2$3](../../../../figma/$2$3/un.md)"
},
"TaskWhy": {
"find":"(^|[\\* ]+)~(\\w+)/(\\w)(\\w+)",
"replace": "$1[~$2/$3$4](../../../../task/$2/$3/$3$4/un.md)"
},
"TaskWhyToo": {
"find":"(^|[\\* ]+)~(\\w)(\\w+)",
"replace": "$1[~$2$3](../../../../task/todo/$2/$2$3/un.md)"
},
"Who":{
"find":"(^|[\\* ]+)@(\\w)(\\w+)",
"replace": "$1[@$2$3](../../../../etc/who/$2/$2$3/un.md)"
},
"What":{
"find":"(^|[\\* ]+)#(\\w)(\\w+)",
"replace": "$1[#$2$3](../../../../etc/what/$2/$2$3/un.md)"
},
"Why":{
"find":"(^|[\\* ]+)\\?(\\w)(\\w+)",
"replace": "$1[?$2$3](../../../../etc/why/$2/$2$3/un.md)"
},
"Whence":{
"find":"(^|[\\* ]+)&(\\w)(\\w+)",
"replace": "$1[&$2$3](../../../../etc/whence/$2/$2$3/un.md)"
},
"Where":{
"find":"(^|[\\* ]+)\\^(\\w)(\\w+)",
"replace": "$1[^$2$3](../../../../etc/where/$2/$2$3/un.md)"
},
"Way":{
"find":"(^|[\\* ]+)=(\\w)(\\w+)",
"replace": "$1[=$2$3](../../../../etc/why/$2/$2$3/un.md)"
},
"Wealth":{
"find":"(^|[\\* ]+)€(\\w)(\\w+)",
"replace": "$1[€$2$3](../../../../etc/wealth/$2/$2$3/un.md)"
},
"WealthToo":{
"find":"(^|[\\* ]+)\\$(\\w)(\\w+)",
"replace": "$1[€$2$3](../../../../etc/wealth/$2/$2$3/un.md)"
},
"Wisdom":{
"find":"(^|[\\* ]+)\\+(\\w)(\\w+)",
"replace": "$1[+$2$3](../../../../etc/wisdom/$2/$2$3/un.md)"
},
"Journal":{
"find":"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})\\.md",
"replace": "$1[:$2-$3-$4.md](../../../../etc/when/$2-$3/$2-$3-00-journal/$2-$3-$4.md)"
},
"When":{
"find":"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})-([-\\w]+)",
"replace": "$1[:$2-$3-$4-$5](../../../../etc/when/$2-$3/$2-$3-$4-$5/un.md)"
},
},
"replacerules.rulesets": {
"WhoWhatEtc":{
"rules": [
"Figma",
"FigmaToo",
"TaskWhy",
"TaskWhyToo",
"Who",
"What",
"Where",
"Journal",
"When",
"Whence",
"Wealth",
"WealthToo",
"Wisdom",
"When",
"Why",
"Way"
]
}
},
Find and Transform VSCode Plugin
Voici mon script Find-and-Transform VSCode extension. Cela permet des majuscules dans les labels. Cette configuration est mis en place ici: %APPDATA%/Code/User/settings.json
https://github.com/ArturoDent/find-and-transform
"find-and-transform.enableWarningDialog":true,
"findInCurrentFile": {
"whoWhatEtc": {
"title": "Replace Who, What, etc.",
"find": ["(^|[\\* ]+)#(\\w)(\\w+)",
"(^|[\\* ]+)\\%(.+)/(\\w)(\\w+)",
"(^|[\\* ]+)\\%(\\w)(\\w+)",
"(^|[\\* ]+)~(\\w+)/(\\w)(\\w+)",
"(^|[\\* ]+)~(\\w)(\\w+)",
"(^|[\\* ]+)@(\\w)(\\w+)",
"(^|[\\* ]+)\\?(\\w)(\\w+)",
"(^|[\\* ]+)&(\\w)(\\w+)",
"(^|[\\* ]+)\\^(\\w)(\\w+)",
"(^|[\\* ]+)=(\\w)(\\w+)",
"(^|[\\* ]+)€(\\w)(\\w+)",
"(^|[\\* ]+)\\$(\\w)(\\w+)",
"(^|[\\* ]+)\\+(\\w)(\\w+)",
"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})\\.md",
"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})-([-\\w]+)"
],
"replace": ["$1[#$2$3](../../../../etc/what/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[%$2//\\L${3}\\L${4}](../../../../figma/\\L${2}/\\L${3}//\\L${3}\\L${4}/un.md)",
"$1[%$2$3](../../../../figma/\\L${2}\\L${3}/un.md)",
"$1[~$2//\\L${3}\\L${4}](../../../../task/\\L${2}/\\L${3}//\\L${3}\\L${4}/un.md)",
"$1[~$2$3](../../../../task/todo/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[@$2$3](../../../../etc/who/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[?$2$3](../../../../etc/why/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[&$2$3](../../../../etc/whence/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[^$2$3](../../../../etc/where/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[=$2$3](../../../../etc/why/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[€$2$3](../../../../etc/wealth/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[€$2$3](../../../../etc/wealth/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[+$2$3](../../../../etc/wisdom/\\L${2}/\\L${2}\\L${3}/un.md)",
"$1[:$2-$3-$4.md](../../../../etc/when/\\L${2}-\\L${3}/\\L${2}-\\L${3}-00-journal/\\L${2}-\\L${3}-\\L${4}.md)",
"$1[:$2-$3-$4-$5](../../../../etc/when/\\L${2}-\\L${3}/\\L${2}-\\L${3}-\\L${4}-\\L${5}/un.md)"
], // text, variables, conditionals, case modifiers, operations, etc.
"isRegex": true, // boolean, will apply to 'cursorMoveSelect' as well as the find query
"restrictFind": "document" // restrict find to document, selections, line, once on line or next
}