What are the n-word and t-word in the danish language

According to the danish language’s grammar, the noun words (Substantiver/Navneord) can be either n-word or t-word. For example


i.) et apotek. ii.) et glass iii.) et år


i.) en bil ii.) en fisk ii.) en pige

So we can see that a prefix (en/et) of an indefinite singular word defines the type of the noun word.

The most used danish t-words(nouns) || De mest brugte t-ord-liste (substantiver)

In the danish language, most noun words are the so-called n-word, so it’s better if we can memorize t-words instead!

The bellow’s table contains most of all t-words, but you are welcome to add any missing one.

Ental ubestemtEntal bestemtFlertal ubestemtFlertal bestemt
Et apotekapoteketapotekerapotekerne
Et alternativalternativetalternativeralternativerne
Et amtamtetamteramterne
Et ansigtansigtetansigteransigterne
Et ansvaransvaret
Et arbejdearbejdetarbejderarbejderne
Et argumentargumentetargumenterargumenterne
Et arkarketarkene
Et askebægeraskebægretaskebægreaskebægrene
Et badbadetbadebadene
Et badeværelsebadeværelsetbadeværelserbadeværelserne
Et bageribagerietbagerierbagerierne
Et barnbarnetbørnbørnene
Et batteribatterietbatterierbatterierne
Et behovbehovetbehovene
Et beløbbeløbetbeløbene
Et benbenetbenbenene
Et besøgbesøgetbesøgbesøgene
Et bibliotekbiblioteketbibliotekerbibliotekerne
Et billedebilledetbillederbillederne
Et bjergbjergetbjergebjergene
Et bogstavbogstavetbogstaverbogstaverne
Et bordbordetbordebordene
Et bladbladetbladebladene
Et brevbrevetbrevebrevene
Et brudbruddetbrudebrudene
Et bryllupbrylluppetbryllupperbryllupperne
Et brystbrystetbrysterbrysterne
Et brødbrødetbrødbrødene
Et brætbrættetbrædderbrædderne
Et bæltebæltetbælterbælterne
Et bærbærretbærrene
Et båndbåndetbåndene
Et cafeteriacafeterietcafeteriercafeterierne
Et chokchokketchokkene
Et daggrydaggryet
Et demokratidemokratietdemokratierdemokratierne
Et diskotekdiskoteketdiskotekerdiskotekerne
Et dusindusinetdusinene
Et dyrdyretdyrene
Et dækdækketdækkene
Et efternavnefternavnetefternavneefternavnene
Et efterårefteråretefterårene
Et egernegernetegernerne
Et eksamensbeviseksamensbeviseteksamensbevisereksamensbeviserne
Et eksempeleksempleteksemplereksemplerne
Et fagfagetfagene
Et firmafirmaetfirmaerfirmaerne
Et faktumfaktummetfaktafaktaene
Et fjernsynfjernsynetfjernsynene
Et fjolsfjolsetfjolserfjolserne
Et flagflagetflagene
Et flyflyetflyene
Et folkfolketfolkene
Et forholdforholdetforholdene
Et forrådforrådetforrådene
Et forslagforslagetforslagene
Et fortovfortovetfortovefortovene
Et forårforåretforårene
Et fraværfraværetfraværene
Et frimærkefrimærketfrimærkerfrimærkerne
Et frøfrøetfrøene
Et fængselfængsletfængslerfængslerne
Et fårfåretfårene
Et gallerigallerietgalleriergallerierne
Et gardingardinetgardinergardinerne
Et genigenietgeniergenierne
Et glasglassetglassene
Et gymnasiumgymnasietgymnasiergymnasierne
Et gulvgulvetgulvegulvene
Et hadhadethaderne
Et halstørklædehalstørklædethalstørklæderhalstørklæderne
Et havhavethavehavene
Et hegnhegnethegnene
Et hjemhjemmethjemmene
Et helbredhelbredethelbrederne
Et heldheldetn/an/a
Et hjertehjertethjerterhjerterne
Et hjulhjulethjulene
Et hjørnehjørnethjørnerhjørnerne
Et holdholdetholdene
Et hospitalhospitalethospitalerhospitalerne
Et hophoppethoppene
Et hotelhotellethotellerhotellerne
Et hovedhovedethovederhovederne
Et hulhullethullerhullerne
Et hushusethusehusene
Et hvidløghvidløgethvidløgene
Et hæftehæftethæfterhæfterne
Et håndklædehåndklædethåndklæderhåndklæderne
Et håndtaghåndtagethåndtagene
Et indholdindholdetindholdene
Et insektinsektetinsekterinsekterne
Et instrumentinstrumentetinstrumenterinstrumenterne
Et jakkesætjakkesættetjakkesættene
Et jobjobbetjobsjobbene
Et jordbærjordbærretjordbærrene
Et jubilæumjubilæetjubilæerjubilæerne
Et julelysjulelysetjulelysene
Et kamerakameraetkameraerkameraerne
Et kammerkammeretkamrekamrene
Et klaverklaveretklavererklavererne
Et klimaklimaetklimaerklimaerne
Et klædeklædetklæderklæderne
Et knusknusetknusene
Et knæknæetknæene
Et kollegiumkollegietkollegierkollegierne
Et komfurkomfuretkomfurerkomfurerne
Et kontinentkontinentetkontinenterkontinenterne
Et kontorkontoretkontorerkontorerne
Et kortkortetkortene
Et kravkravetkravene
Et kruskrusetkrusene
Et krydderikrydderietkrydderierkrydderierne
Et kursuskursetkurserkurserne
Et kyskyssetkyssene
Et køkkenkøkkenetkøkkenerkøkkenerne
Et køleskabkøleskabetkøleskabekøleskabene
Et laglagetlagene
Et lagenlagenetlagenerlagenerne
Et lamlammetlammene
Et landlandetlandelandene
Et livlivetlivene
Et loftloftetlofterlofterne
Et lokalelokaletlokalerlokalerne
Et loppemarkedloppemarkedetloppemarkederloppemarkederne
Et lyslysetlysene
Et lægemiddellægemidletlægemidlerlægemidlerne
Et lærredlærredetlærrederlærrederne
Et løbløbetløbene
Et løgløgetløgene
Et låglågetlågene
Et malerimalerietmaleriermalerierne
Et markedmarkedetmarkedermarkederne
Et menneskemennesketmenneskermenneskerne
Et metalmetalletmetallermetallerne
Et miljømiljøetmiljøermiljøerne
Et middelmidletmidlermidlerne
Et minutminuttetminutterminutterne
Et museummuseetmuseermuseerne
Et møbelmøbletmøblermøblerne
Et mødemødetmødermøderne
Et mønstermønsteretmønstremønstrene
Et målmåletmålene
Et navnnavnetnavnenavnene
Et nummernummeretnumrenumrene
Et næsebornæseboretnæseborene
Et næsehornnæsehornetnæsehornene
Et offerofferetofreofrene
Et områdeområdetområderområderne
Et ordordetordene
Et organorganetorganerorganerne
Et papirpapiretpapirerpapirerne
Et parparretparrene
Et partipartietpartierpartierne
Et paspassetpassene
Et perspektivperspektivetperspektiverperspektiverne
Et pindsvinpindsvinetpindsvinene
Et postbudpostbuddetpostbudepostbudene
Et posthusposthusetposthuseposthusene
Et problemproblemetproblemerproblemerne
Et produktproduktetprodukterprodukterne
Et programprogrammetprogrammerprogrammerne
Et pulverpulveretpulverepulverne
Et pundpundetpundene
Et rebrebetrebene
Et resultatresultatresultaterresultaterne
Et ryryet
Et råbråbetråbene
Et rådrådetrådene
Et rådhusrådhusetrådhuserådhusene
Et salgsalgetsalgene
Et samfundsamfundetsamfundene
Et sekundsekundetsekundersekunderne
Et selskabselskabetselskaberselskaberne
Et signalsignaletsignalersignalerne
Et skabskabetskabeskabene
Et skibskibetskibeskibene
Et skrivebordskrivebordetskrivebordeskrivebordene
Et skægskægetskæggetskæggene
Et slipsslipsetslipsene
Et slotslottetslotteslottene
Et smykkesmykketsmykkersmykkerne
Et sodavandsodavandet
Et soveværelsesoveværelsetsoveværelsersoveværelserne
Et spejlspejletspejlespejlene
Et spilspilletspillene
Et sprogsprogetsprogene
Et spørgsmålspørgsmåletspørgsmålene
Et stativstativetstativerstativerne
Et stedstedetstederstederne
Et stereoanlægstereoanlæggetstereoanlæggene
Et stykkestykketstykkerstykkerne
Et supermarkedsupermarkedetsupermarkedersupermarkederne
Et svarsvaretsvarene
Et svinsvinetsvinene
Et symbolsymboletsymbolersymbolerne
Et systemsystemetsystemersystemerne
Et sædesædetsædersæderne
Et sømsømmetsømmene
Et sårsåretsårene
Et tagtagettagetagene
Et taltallettallene
Et talenttalentettalentertalenterne
Et teaterteateretteatreteatrene
Et tegntegnettegnene
Et teltteltettelteteltene
Et togtogettogene
Et toilettoilettettoilettertoiletterne
Et torvtorvettorvetorvene
Et trætræettræertræerne
Et tæppetæppettæppertæpperne
Et tårntårnettårnetårnene
Et universitetuniversitetetuniversiteteruniversiteterne
Et ururetureurene
Et ugebladugebladetugebladeugebladene
Et vaskerivaskerietvaskeriervaskerierne
Et venskabvenskabetvenskabervenskaberne
Et verbumverbetverberverberne
Et vinduevinduetvinduervinduerne
Et viskelæderviskelæderetviskelædereviskelæderne
Et vækkeurvækkeuretvækkeurevækkeurene
Et værktøjværktøjetværktøjerværktøjerne
Et værelseværelsetværelserværelserne
Et værtshusværtshusetværtshuseværtshusene
Et våbenvåbnetvåbnervåbnerne
Et wcwc’etwc’erwc’erne
Et æbleæbletæbleræblerne
Et ægæggetæggene
Et ægteskabægteskabetægteskaberægteskaberne
Et æselæsletæsleræslerne
Et øjeøjetøjneøjnene
Et øjeblikøjeblikketøjeblikkeøjeblikkene
Et øreøretørerørerne
Et åråretårene
Et årtiårtietårtierårtierne

Forti Client VPN download previous releases

How to find previous releases of FortiClient VPN

From my experiences, I got stuck to find appropriate link to download version 6.4.0 through google search (may be my bad to do appropriate search).

But finally I found one solution that is interesting for me, and also want to share with you if you face same problem like me!

https://filestore.fortinet.com/forticlient/ there you should find list of available files to be downloaded, just use related path of your desired file with current url. For my case, it was https://filestore.fortinet.com/forticlient/downloads/FortiClientVPNOnlineInstaller_6.4.dmg

SSH agent forward into docker container on macOS


I am used to git ssh remote URL, in case of public and private repositories either from GitHub or gitlab (those projects are either contributed or authored by me). Beside in my current company (Zitelab ApS), we have our gitlab enterprise edition server which is hosted into our own cloud and most of the repositories are internally accessible by our team exclusively. The main reason for using ssh remote URL is to avoid entering username and password at each time of push, pull (required over https remote URL)

Why SSH agent for docker container

For me as a new macOS user, for the first time, I faced problem while trying to clone some of the repositories from the inside docker container. My idea was to copy my local ssh key pair into container´s .ssh directory (not secure huh!) and help from the great teacher Google found many solutions for me like Pass local machine’s SSH key to docker container, Using SSH keys inside docker container and so on, however honestly speaking I was not able to implement the ssh key pair copying idea (may not be tried so hard, because I found a better and safe idea later?)

Finally took the idea of ssh agent forwarding (which method I used already in the vagrant based machine). In my opinion, this approach is the best fit for fulfilling my purpose at least.

Configure SSH agent forward in Mac Machine

I refer ´host´ as my development machine it-self and ´guest´ is referred to the docker container. Ignore this the step if you have already.

Setup Host Machine´s ssh config (~/.ssh/config) (Optional)

Example wildcard(*) applicable for all host
Host *
     ForwardAgent yes
     IdentityFile ~/.ssh/id_rsa
Example Certain Host
Host gitlab.com
     ForwardAgent yes
     IdentityFile ~/.ssh/id_rsa_gitlab
Example Certain IP ranges
Host 192.168.*
ForwardAgent yes
IdentityFile ~/.ssh/id_rsa_gitlab

Setup in Docker-compose file


version: '3'
    build: .

Enable SSH Forwarding directly from docker command

docker run --rm -t -i  -v $SSH_AUTH_SOCK:${SSH_AUTH_SOCK} -e SSH_AUTH_SOCK=${SSH_AUTH_SOCK}  <your container tag>


My machine is MacBook pro 15 2109 and with Mojave OS (at the time of writing), However, I saw on the internet some complaints about not working properly but in my case, it is working perfectly.


  1. Can we re-use the OSX ssh-agent socket in a container?

MySQL Connector C API (libmysqlclient) install and configure in MacOS


The latest version of mysql-connector-c++@1.1 you might don’t need to go Configure mysql_config section as I see that is already correctly configured.

But one file “my_config.h“ is missing, you will feel that when you are going to install “MySQL-Python“. Solve that issue I manually create a file named “my_config.h” at /usr/local/opt/mysql-client/include/mysql [that is my local machine location, you might have in different place] and put contents from here


I am the mad (maybe fool) guy who doesn’t prefer to install services (like MySQL, PostgreSQL and so on) into development machine, instead using docker containers, this way gives me a lot of flexibilities, for example, I could have multiple versions of MySQL servers (each version could be project-specific depends on requirements), besides no unnecessary processes are running in my development machine.

This writing for those concerns who don’t have MySQL server installed into MacOS powered development machine (like MacBook Pro) but need to work with MySQL connection through programming languages (i.e Python in my case). Bellows are focused on ´MySQL-Python´, ´mysqlclient´ installation problems and solutions. If you have MySQL server installed through Homebrew, we don’t expect you are facing any connection related problem.


As a requirement of my solution, I assume you already have Homebrew installed on your machine, other than going to the official site about to installl it, should be pretty easy.


Make sure you have OpenSSL installed and the path is added in bash and/or zsh profile. Try (which openssl) to check if already available. Other than installed and configure it.

brew install openssl

echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile 

echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc (if you are using zsh)

Install and Configure MySQL connector C API

Install through Homebrew

brew install mysql-connector-c

Configure mysql_config

  1. Find the file location by using the command ls -la `which mysql_config`
  2. Open the file with sudo privileges by any editor.
  3. Find #Create options and comment in libs="$libs -l "
  4. Add libs="$libs -lmysqlclient -lssl -lcrypto" and save

Update bash and/or zsh profile

echo 'export LDFLAGS="-L/usr/local/opt/openssl/lib"' >> ~/.bash_profile 

echo 'export CPPFLAGS="-I/usr/local/opt/openssl/include"' >> ~/.bash_profile 

# if you have zsh
echo 'export LDFLAGS="-L/usr/local/opt/openssl/lib"' >> ~/.zshrc 

echo 'export CPPFLAGS="-I/usr/local/opt/openssl/include"' >> ~/.zshrc

Some Common errors could be solved

Collecting mysqlclient   Using cached 
     Complete output from command python setup.py egg_info:     
Traceback (most recent call last):       File "<string>", line 1, in <module>       
File "/private/var/folders/h3/sff7td1d6pg5v5qsm5xf31q80000gn/T/pip-install-ki9z7ln9/mysqlclient/setup.py", line 18, in <module>         metadata, options = get_config()       

File "/private/var/folders/h3/sff7td1d6pg5v5qsm5xf31q80000gn/T/pip-install-ki9z7ln9/mysqlclient/setup_posix.py", line 60, in get_config         libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]       
File "/private/var/folders/h3/sff7td1d6pg5v5qsm5xf31q80000gn/T/pip-install-ki9z7ln9/mysqlclient/setup_posix.py", line 60, in <listcomp>         libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]       
File "/private/var/folders/h3/sff7td1d6pg5v5qsm5xf31q80000gn/T/pip-install-ki9z7ln9/mysqlclient/setup_posix.py", line 13, in dequote         
raise Exception("Wrong MySQL configuration: maybe https://bugs.mysql.com/bug.php?id=86971 ?")     
Exception: Wrong MySQL configuration: maybe https://bugs.mysql.com/bug.php?id=86971 ?


  1. MySQLClient instal error: “raise Exception(”Wrong MySQL configuration: maybe https://bugs.mysql.com/bug.php?id”
  2. pip3 install mysqlclient fails on macOS
  3. MySQL Bug #86971 mysql_config –libs of mysql-connector/c 6.1.0 on macOS is wrong

Integration Test and Functional Test in plone testing explained


As a plone developer, I have to do writing lots of unittests for our projects, so I had concerned on plone testing documentation from plone’s official site. Usually I learnt from there about two types of testing, `Integration Testing` and `Functional Testing`. Also knew about Testing Layer and how layer fixture is used while making above kind of tests, in other words which layer fixture is appropriate for which testing, i.e for Functional Testing should be used Functional Testing Layer fixture.

Integration Testing Fixture is generally creating a transaction for each test and just abort the transaction after test being done. Single database(demo storage) is whole test layer lifecycle,  there is not possible to do any persistent activity (transaction commit) in side tests code. Beside Functional Testing Fixture provides database (demo storage) for each test and removed during test teardown (making a stack of database for each test and pop up during tear down process), full transaction lifecycle is happened here, even you could do manually commit and/or use of sub-transaction as well.

By naming (Integration Testing, Functional Testing ) and characteristics  of both, I got confused! my thinking was integration test means collection of components (could be some functions from a module or coming from other modules or api methods from different packages) whether working together perfectly, so here we need persistent features (transaction commit) as we might need to add fixture data and should be available outside of session. For functional test, i thought that this about single component (for example: test single function or method of class), so here we don’t need transaction features, but I was completely wrong (my thought was so stupid)

To get rid out of my confusion, I have planned to dig down into online resources. Very first  I am trying understand that what are meaning of Integration test and Functional test , so ask google and found out from stackoverflow what I was looking for! about Functional testing:

Functional testing is when you test the system against the functional requirements of the product. Product/Project management usually writes these up and QA formalizes the process of what a user should see and experience, and what the end result of those processes should be. Depending on the product this can be automated or not.

Now i have better about those terms and why need persistent feature for Functional Testing

When and where should use each testing type

Integration Testing Fixture

This is relatively faster, you should use it as much as possible, until your test needs (commit) persistent feature. Ideal for testing of methods/functions, where you want to test how those are working together.

Functional Testing Fixture

Primary use case is, when you need to test/monitor after commit reaction of each function/component and make sure data goes to database successfully. If you have SqlAlchemy’s transaction integration, this functional testing fixture is mandatory for you, as some exception/error is thrown by SqlAlchemy during data going to be committed. i.e Integrity violation. Another required case is, when your test will need to use test browser, there you must need completion of transaction lifecycle to avail saved data during assertion. Test browser to be working,  you have to use ZServer Layer Fixture (from plone.app.testing) that is making test server for you.

Naturally Functional testing is slower compared to Integration testing , even it will be getting more slower if you attach ZServer fixture. In my previous experiences, i made functional test fixture with integrating zserver fixture and use this fixture for all of tests (i didn’t care if persistent(transaction commit) is required or not, test browser is needed or not!. ), one of cause, there was my lack of knowledge as result small test took so much time. Now i am learning and have some opinion from me! You should make two functional testing fixture, one without zserver fixture and one with zserver. So if any test needs test browser you will go for with zserver fixture. Bellows are example

from plone.testing import z2
from plone.app.testing import FunctionalTesting
from plone.app.testing import IntegrationTesting

MY_FIXTURE = MyFixtureLayer()
MY_INTEGRATION_TESTING = IntegrationTesting(
MY_FUNCTIONAL_TESTING = FunctionalTesting(
 bases=(MY_FIXTURE, ),


Anaconda vs Sublimelinter with Jedi for SublimeText

SublimeText is undoubtedly one of the most popular editor right now over million of software / web developers. The developer is using SublimeText as IDE usually, rather than using as plain text editor,  by making  IDE like features with the help from some great packages  available in free of cost.  For python development environment, Anaconda is all-in-one package for transforming to be IDE, in the other hand Sublimtelinter with Jedi combination one of the best method for enabling sublimetext to provide IDE like features. Both two have pros and cons, i will discuss bellows about my experiences for both.



  1. Most importantly, this all-in-one kind package and with no dependency, that means you don’t have headache to install multiple packages and separate configurations.
  2. Easy configuration and well documented.
  3. Numbers of active contributors and continuous development, see details
  4. Very faster linting process after introducing json server.
  5. McCabe code complexity checker


  1. Some time I discovered old problem come again with latest version, that is hanging on my sublimetext (may be one of the cause could be for big file (more than ten thousands of line)).
  2. There is no support for flake8, see discussion here. Although  anaconda linting is working with pyflake and pep8 combinely means likely to be same as flake8, but more just pyflake and pep8, flake8 has lots of cool plugins, you will miss those.
  3. Working with json server might easy, depends on Operating System you are using.

Sublimelinter and Sublime-Jedi


  1. This combination approach is like that you gather all good packages and using it. Sublimelinter is the best linting framework for SublimeText, in the other hand Jedi is one the best autocomplete library that is welly ported to Sublime, thanks author of SublimeJedi
  2. Jedi provides nice (CTRL+SHIFT+G) explorer (Go Defination) feature, you could go to the reference import very quickly, beside you could easily add extra python package paths those will be auto included to Jedi’s sys path.
  3. Sublimelinter is framework for linting, there are lots of plugins available, for python I would like to use flake8 but you may keen to use pylint, that is also available.
  4. Sublimelinter is working very fast and also has lots of configuration options, so that you could customize as your wish.


  1. I don’t find so much negative side to using this combination. But I find there is not much development activity on Github.
  2. Some rare case, jedi might not working (not sure if it is caused by Sublimetext or jedi itself)


We saw the simple comparison between two approach. In my opinion for novice user, they could go with Anaconda as this is very easy to adapted and configure. But in contrast of beginner user of sublimetext, I would suggest, professional developer should definitely with go with Sublimelinter specially if he/she is a full stack developer as it (Sublimelinter) has variety of plugins for different language/markup i.e css, javascript, html, json, yml and more.

Make Anaconda powered SublimeText as powerful Python IDE for full stack development

Like so many SublimeText lovers, Me as a python developer, it is also one of the favorite editor, I am using but I would like to use  it as full featured IDE. You will find many articles, blogs about how SublimeText can be transformed as pure IDE, but here i will discussed about the most easy way to turn your sublimetext as IDE for full stack python development.

Anaconda  is the single package that is capable to make your editor (SublimeText) as IDE for python development. It has almost all IDE like features, i.e linting, autocomplete, etc. You could say this is all-in-one package, with no third party dependency like SublimeLinter . One of the positive things that it is in continuous development by involvement of many contributors, so you can report any bug/error and the highest possibility, we will get the solution. They have very good documentation as well.

Install and Configuration is easy enough, I would suggest you follow instruction  from their official site, for advanced configuration you could follow here. It is good practice that you make user specific settings those are common for all your projects. Follows are example user settings.

    "auto_formatting": true,
    "auto_python_builder_enabled": false,
    "anaconda_linting": true,
    "anaconda_linter_phantoms": false,
    "validate_imports": true,
    "enable_signatures_tooltip": false,
    "merge_signatures_and_doc": false,
    "pep8_max_line_length": 120

If you saw the example configuration above, I intentionally set the value of  `pep8_max_line_length` is 120 (default is 80), in the other hand you will see that i don’t mention the path of python interpreter because it should goes on project specific settings (*.sublime-project) if you use individual interpreter(i.e virtualenv) for each project.

			"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
			"name": "PRS:: Anaconda Python Builder",
			"selector": "source.python",
			"shell_cmd": "{virtualenv path}/bin/python -u \"$file\""
			"path": "."
		"python_interpreter": "{virtualenv path}/bin/python"

If you are using buildout for your project development, we have good news for you! There is a recipe plone.recipe.sublimetext for anaconda settings, this recipe will do for you to generate project specific settings. Followings are possible buildout settings for you (but you could do add  more custom option)

parts += 
recipe = plone.recipe.sublimetext
eggs = ${instance:eggs}
anaconda-enabled = True
anaconda-linting-enabled = True
anaconda-completion-enabled = True
anaconda-validate-imports = True


Make Sublime Text as the best IDE for full stack python development


Nothing says from me about Sublime Text 3, I assume you already  know about this nice editor. I can quote from realpython.com blog a very nice article about transforming editor to IDE, published there, I would recommend you look first at there.

Sublime Text 3 (ST3) is lightweight, cross-platform code editor known for its speed, ease of use, and strong community support. It’s an incredible editor right out of the box, but the real power comes from the ability to enhance its functionality using Package Control and creating custom settings.

Unlike above article (from realpython), this article is more specific tutorial like discussion, where you don’t need to more analysis about listed plugins, configurations (of course after starting you will do experiment with all, may find out something I did wrong or need improvement). The main target here, keep ST3 fast as it’s original but with sexy looking and featured with python based development tools and utilities. Bellows demonstration,  I got inspiration from that blog of course and also some of my real life experiences. In this writing, all settings, configurations are based on  Sublime Text 3  build 3126.

Install Sublime Text 3 (ST3)

Actually here nothing much to say about installation of ST3, because they have very good documentation and easy to install binary for all platform. If your OS is not Ubuntu, please ignore following step, because here discussion about install ST3 at Ubuntu in better way.

Good news that we have Ubuntu PPA for ST3, thanks to [@webupd8team] . I would recommend you to install ST3 from ppa, it will gives you lots of flexibility.  Steps are following:

  1. Open your terminal
  2. Add ppa : `~$ sudo add-apt-repository ppa:webupd8team/sublime-text-3`
  3. Install ST3: `~$ sudo apt-get update && sudo apt-get install sublime-text-installer`

Install Required ST3 Packages (Plugins)

First of all you have to install Package Control, please follow corresponding instruction and make sure it is installed. Followings are list of packages (some are required, some are optional and some are recommended)

  1. AdvancedNewFile
  2. AutoPEP8
  3. Git
  4. GitGutter
  5. Gitignore [optional]
  6. Solarized Color Scheme [optional but recommended for good looking]
  7. SideBarEnhancements
  8. SublimeJedi
  9. SublimeLinter
  10. SublimeLinter-annotations
  11. SublimeLinter-csslint
  12. SublimeLinter-flake8 [swipeable with pylint and should one of two]
  13. SublimeLinter-pylint [like no.10 should be choose one of two]
  14. SublimeLinter-html-tidy
  15. SublimeLinter-jshint [nice to have for web application, please follow it’s own documentation before active it]
  16. SublimeLinter-json
  17. SublimeLinter-pyyaml
  18. ProjectManager [optional]
  19. PackageResourceViewer [optional]
  20. Pandoc [optional]
  21. MarkdownEditing [optional]
  22. Markdown Preview [optional]
  23. Restructured​Text Improved [optional]

It is recommended that you install all packages using `Package Control` but you could also install manually, in that case please follow corresponding documentation.

Instruction for installing packages using Package Control

  1. Install Package Control if you haven’t yet.
  2. Use cmd+shift+P then Package Control: Install Package
  3. Search for  certain package, should be appeared in list and install it.
  4. You might need close ST3, to see all changes

Packages selection for `Sublime Text 3` has no restriction, I suggest you explore more packages as much as possible, but always keep in mind that many packages install at a time might enriched your Sublime Text‘s features but in the meantime will keep it busy too! as a result performance decreasing. Plugin/Package you should install and use, only if you know that why need it(package), how it is working, other than any unnecessary package you should avoid and also make sure different packages are not overlapping same feature.  Above listed packages are safe and necessary, but here also depends on development environment, you could add/remove packages from that list.

Note: some of packages need executable path is available at `PATH` variable to work, i.e flake8,  pylint, csslint, etc. Please follow each package documentation. 

Sublime Text 3 Settings

User Setting:

To find user settings, might vary from earlier version to new version. Example from `Sublime Text 3  build 3126` user settings is not directly available in menu, instead you will open default settings (`Preferences > Settings `),  two columns will be opened and one of this is user settings; beside earlier version you will find User Settings directly (`Preferences > Settings User`)

    "auto_complete_triggers": [{
        "characters": ".",
        "selector": "source.python"
    "color_scheme": "Packages/Solarized Color Scheme/Solarized (light).tmTheme",
    "font_size": 12,
    "ignored_packages": [
    "show_line_endings": true,
    "tab_size": 4,
    "translate_tabs_to_spaces": true,
    "trim_automatic_white_space": true,
    "trim_trailing_white_space_on_save": true

Above is the basic user settings, you could add more settings, documentation here

Sublime Jedi Settings

  1. Go to Preferences -> Package Settings -> Package Setting -> Jedi -> Settings User 
     "auto_complete_function_params": "required",
     "sublime_goto_layout": "single-panel"

More settings options could be found here

SublimeLinter Settings

  1. Go to Preferences -> Package Settings -> Package Setting -> SublimeLinter -> Settings User
    "user": {
        "debug": false,
        "delay": 0.25,
        "error_color": "D02000",
        "gutter_theme": "Packages/SublimeLinter/gutter-themes/Default/Default.gutter-theme",
        "gutter_theme_excludes": [],
        "lint_mode": "background",
        "linters": {
              "annotations": {
                   "@disable": false,
              "csslint": {
                "@disable": false
              "flake8": {
                   "@disable": false,
                   "max-complexity": 15,
                   "max-line-length": 120
              "htmltidy": {
                "@disable": false
              "jsl": {
                "@disable": false
              "json": {
                  "@disable": false
              "pyyaml": {
                 "@disable": false

More about settings, you could find it’s own documentation.

AutoPep8 Settings

  1. Go to Preferences -> Package Settings -> Package Setting -> AutoPep8 -> Settings User 
    "max-line-length": 120

Known Issues

  1. Sublimelinter-flake8
  2. //platform.twitter.com/widgets.js

Per project settings (sublime-project file)

One of the great feature of Sublime Text is that you could make project specific editor settings (may you already know about it.),  more details here . If you are developing buildout based python project, `plone.recipe.sublimetext` for you!  this is good tool that will manage your project file more effectively.