FocusPlex on 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.


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/, TaskWhy/ and ConfigMagic/ 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 for my personal life, for my professional life, 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/

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

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 Translations are identified by a two-letter language code (e.g. ou

All concepts are exactly four levels deep in the filesystem. I use the following modules:

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=\](etc/w=](../../../../etc/w=ge
" :%s=\](task/=](../../../../task/=ge

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/ =ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?@\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2@\3\4](\2etc/who/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?&\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2\&\3\4](\2etc/whence/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\^\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2^\3\4](\2etc/where/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\~\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2\~\3\4](\2task/todo/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?\#\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2#\3\4](\2etc/what/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\??\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2?\3\4](\2etc/why/\3/\3\4/\5=ge |
" \ :%s_\( \|^\)\(wiki\d\+:\)\?=\(\w\)\([A-z0-9./_-]*\)\(.\|$\)_\1[\2=\3\4](\2etc/way/\3/\3\4/\5_ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?€\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2€\3\4](\2etc/wealth/\3/\3\4/\5=ge |
" \ :%s=\( \|^\)\(wiki\d\+:\)\?+\(\w\)\([A-z0-9./_-]*\)\(.\|$\)=\1[\2+\3\4](\2etc/wisdom/\3/\3\4/\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)=/
command! UNen s=/un\.md)=/
command! ENfr s=/en\.md)=/
command! FRen s=/fr\.md)=/
command! FRun s=/fr\.md)=/
command! ENun s=/en\.md)=/
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

    "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}/",  
                          ],              // 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/"
        "FigmaToo": {
            "find":"(^|[\\* ]+)\\%(\\w)(\\w+)",
            "replace": "$1[%$2$3](../../../../figma/$2$3/"
        "TaskWhy": {
            "find":"(^|[\\* ]+)~(\\w+)/(\\w)(\\w+)",
            "replace": "$1[~$2/$3$4](../../../../task/$2/$3/$3$4/"
        "TaskWhyToo": {
            "find":"(^|[\\* ]+)~(\\w)(\\w+)",
            "replace": "$1[~$2$3](../../../../task/todo/$2/$2$3/"
            "find":"(^|[\\* ]+)@(\\w)(\\w+)",
            "replace": "$1[@$2$3](../../../../etc/who/$2/$2$3/"
            "find":"(^|[\\* ]+)#(\\w)(\\w+)",
            "replace": "$1[#$2$3](../../../../etc/what/$2/$2$3/"
            "find":"(^|[\\* ]+)\\?(\\w)(\\w+)",
            "replace": "$1[?$2$3](../../../../etc/why/$2/$2$3/"
            "find":"(^|[\\* ]+)&(\\w)(\\w+)",
            "replace": "$1[&$2$3](../../../../etc/whence/$2/$2$3/"
            "find":"(^|[\\* ]+)\\^(\\w)(\\w+)",
            "replace": "$1[^$2$3](../../../../etc/where/$2/$2$3/"
            "find":"(^|[\\* ]+)=(\\w)(\\w+)",
            "replace": "$1[=$2$3](../../../../etc/why/$2/$2$3/"
            "find":"(^|[\\* ]+)€(\\w)(\\w+)",
            "replace": "$1[€$2$3](../../../../etc/wealth/$2/$2$3/"
            "find":"(^|[\\* ]+)\\$(\\w)(\\w+)",
            "replace": "$1[€$2$3](../../../../etc/wealth/$2/$2$3/"
            "find":"(^|[\\* ]+)\\+(\\w)(\\w+)",
            "replace": "$1[+$2$3](../../../../etc/wisdom/$2/$2$3/"
            "find":"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})\\.md",
            "replace": "$1[:$2-$3-$](../../../../etc/when/$2-$3/$2-$3-00-journal/$2-$3-$"
            "find":"(^|[\\* ]+):(\\d{4})-(\\d{2})-(\\d{2})-([-\\w]+)",
            "replace": "$1[:$2-$3-$4-$5](../../../../etc/when/$2-$3/$2-$3-$4-$5/"
    "replacerules.rulesets": {
            "rules": [