FocusPlex on FocusPlex.com is about focus in complexities through the use of markdown and other file formats in folder hierarchies in a codified manner with a ubiquitous synchronization mechanism.
My implementations of FocusPlex are file-and-folder hierarchies in synchronized folders that are accessible through web renditions. I use each one of them to manage my reference documents, my task documents and my configuration information. I have separate implementations for my personal life, my professional life and my different projects.
Implementations
I personally use concurrently implement FocusPlex on a Fossil-SCM open-source project-management multi-person system, SeaFile, Vimwiki and ReplaceRules or Find-and-Transform. The following servers would also be able to use the same exact file-and-folder structure: Gollum, GitIt, GitHub, GitHub. I assume there would be a markdown plugin for cloud-drive providers such as Google Drive, OneDrive, etc. The key to using both a version-control system and a cloud drive is in excluding the version-control data fiels and folder from the cloud-drive synchronization.
I use FocusPlex to implement WhoWhatEtc/WhoWhatEtc.com, TaskWhy/TaskWhy.com and ConfigMagic/ConfigMagic.com. You may also apply and codify your FocusPlex to uses such as 43folders or others. FocusPlex is a way of organizing information and codifying that organization.
I use focus.mann.cool for my personal life, focus.mann.city for my professional life, focus.lesgrandsvoisins.com for LesGrandsVoisins, and I also have one FocusPlex per client project.
Use of A-Z Folders
To simplify, I will often place one-letter folders form a to z at the penultimate level of subject identification. If the subject is, for example, Frogs, I will put the thing in category/f/frogs.
Decision of Always 4-Levels Deep
My implementations of FocusPlex always have a four-level-deep folder structure as follows ./domain/category/a-z/subject.
- ./domain/ This is the type / namespace / realm of contained subjects (reference, actionable, www, media, etc)
- category/ This is the category of information contained (persons, places, things, etc)
- a-z/ This is the first letter of the subject. Using a level of folders from a-to-z somehow works better for me, but requires and extra step sometimes.
- subject/ This is the folders that denotes the subject. I don't use mixed-case nor dashes.
This four-level filing system allows me to write relative links that are always preceded by ../../../../
. My links are usually ../../../../domain/category/s/subject/un.md
.
Decision for a Two-Letter Language Index .md File
The index files for any folder are the two-letter language code. Untranslated files are un
. Since I use markdown as my formatting, the index files become un.md
.
Integration with Other Concepts
Codification comes from WhoWhatEtc for reference in a etc
folder, TaskWhy for actionable items in a task
folder and ConfigMagic for configurations inn a figma
folder. Links are relative and always exactly four levels deep. The default fil foreany folder is un.md
. Translations are identified by a two-letter language code (e.g. en.md ou fr.md).
All concepts are exactly four levels deep in the filesystem. I use the following modules:
- whoshatetc/ WhoWhatEtc
- configmagic/ ConfigMagic
- taskwhy/ TaskWhy
- media/ Média (shared)
- www/ Website (shared)
Fossil-SCM or GITHub as Web-Search-Link Enabled Implementations
I use Fossil-SCM as my main implementation and I use SeaFile as an alternate and concurrent implementation. Fossil has two main disadavantages over GitHub: the editing is asynchronous and the editing is on a computer (and not through-the-web). Happily, SeaFile provides through-the-web and synchronous editing.
Be careful if you are to mix a cloud-synched drive and Git repository. Mixing the .git
file in a cloud synchronization may break things (too many files).
Related Articles
Related articles are:
Text-Editor Helper Scripts
Here are different helper scripts I use in two text editors. These use regular expressions.
Configuration of VimWiki
Here is my configuration of vimwiki in _vimrc for 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
Find and Transform VSCode Extension
Here is my Find-and-Transform VSCode extension for FocusPlex. It allows for capitals in the label. The configuration is applied here: %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
}
Configuration of RegexReplace in Visual Studio Code
Here is my configuration for teh RegexReplace Extension of Visual Studio Code for FocusPlex in 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"
]
}
},