FocusPlex.com

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:

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"
            ]
        }
    },