Setting Up a Shiny Development Environment Within Linux on Windows 10
Setting up a Shiny Development Environment within Linux on Windows 10

            
            While I was getting Ruby on Rails to work nicely under Ubuntu on Windows 10 I took the opportunity to set up my *nix bash environment, which was largely using defaults. Yes, I know I can use zsh or fish or other shells. Yes, I know I can use emacs and screen, but I am using Vim and tmux. Fight me. Anyway, once my post was done, I starting messing around with open source .NET Core on Linux (it runs on Windows, Mac, and Linux, but here I'm running on Linux on Windows. #Inception) and tweeted a pic of my desktop.  By the way, I feel totally vindicated by all the interest in "text mode" given my 2004 blog post "Windows is completely missing the TextMode boat." ;)' Also, for those of you who are DEEPLY NOT INTERESTED in the command line, that's cool. You can stop reading now. Totally OK. I also use Visual Studio AND Visual Studio Code. Sometimes I click and mouse and sometimes I tap and type. There is room for us all.  WHAT IS ALL THIS LINUX ON WINDOWS STUFF? Here's a FAQ on the Bash/Windows Subsystem for Linux/Ubuntu on Windows/Snowball in Hell and some detailed Release Notes. Yes, it's real, and it's spectacular. Can't read that much text? Here's a video I did on Ubuntu on Windows 10. A number of people asked me how they could set up their WSL (Windows Subsystem for Linux) installs to be something like this, so here's what I did. Note that will I've been using *nix on and off for 20+ years, I am by no means an expert. I am, and have been, Permanently Intermediate in my skills. I do not dream in RegEx, and I am offended that others can bust out an awk script without googling.  So there's a few things going on in this screenshot.  Running .NET Core on Linux (on Windows 10)  Cool VIM theme with >256 colors  Norton Midnight Commander in the corner (thanks Miguel)  Desqview-esque tmux splitter (with mouse support)  Some hotkey remapping, git prompt, completion  Ubuntu Mono font  Nice directory colors (DIRCOLORS/LS_COLORS) Let's break them down one at a time. And, again, your mileage may vary, no warranty express or implied, any of this may destroy your world, you read this on a blog. Linux is infinitely configurable and the only constant is that my configuration rocks and yours sucks. Until I see something in yours that I can steal. Running .NET Core on Linux (on Windows 10)  Since Linux on Windows 10 is (today) Ubuntu, you can install .NET Core within it just like any Linux. Here's the Ubuntu instructions for .NET Core's SDK. You may have Ubuntu 14.04 or 16.04 (you can upgrade your Linux on Windows if you like). Make sure you know what you're running by doing a:~ $ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription:    Ubuntu 16.04.2 LTSRelease:        16.04Codename:       xenial~ $
If you're not on 16.04 you can easily remove and reinstall the whole subsystem with these commands at cmd.exe (note the /full is serious and torches the Linux filesystem):> lxrun /uninstall /full> lxrun /install 
Or if you want you can run this within bash (will take longer but maintain settings). 

NOTE that you'll need Windows 10 Creators Edition build 16163 or greater to run Ubuntu 16.04. Type "winver" to check your build.sudo do-release-upgrade
Know what Ubuntu your Windows 10 has when you install .NET Core within it. The other thing to remember is that now you have two .NET Cores, one Windows and one Ubuntu, on the same (kinda) machine. Since the file systems are separated it's not a big deal. I do my development work within Ubuntu on /mnt/d/github (which is a Windows drive). It's OK for the Linux subsystem to edit files in Linux or Windows, but don't "reach into" the Linux file system from Windows.
Cool Vim theme with >256 colors 
That Vim theme is gruvbox and I installed it like this. Thanks to Rich Turner for turning me on to this theme.$ cd ~/$ mkdir .vim$ cd .vim$ mkdir colors$ cd colors$ curl -O https://raw.githubusercontent.com/morhetz/gruvbox/master/colors/gruvbox.vim$ cd ~/$ vim .vimrc
Paste the following (hit ‘i’ for insert and then right click/paste)set numbersyntax enableset background=darkcolorscheme gruvboxset mouse=aif &term =~ '256color'  " disable Background Color Erase (BCE) so that color schemes  " render properly when inside 256-color tmux and GNU screen.  " see also http://snk.tuxfamily.org/log/vim-256color-bce.html  set t_ut=endif
Then save and exit with Esc, :wq (write and quit). There's a ton of themes out there, so try some for yourself!
Norton Midnight Commander in the corner (thanks Miguel) 
Midnight Commander is a wonderful Norton Commander clone that Miguel de Icaza started, that's licensed as part of GNU. I installed it via apt, as I would any Ubuntu software.$ sudo apt-get install mc
There's mouse support within the Windows conhost (console host) that bash runs within, so you'll even get mouse support within Midnight Commander!

Great stuff.
Desqview-esque tmux splitter (with mouse support) 
Tmux is a terminal multiplexer. It's a text-mode windowing environment within which you can run multiple programs. Even better, you can "detach" from a running session and reattached from elsewhere. Because of this, folks love using tmux on servers where they can ssh in, set up an environment, detach, and reattach from elsewhere. 

NOTE: The Windows Subsystem for Linux shuts down all background processes when the last console exits. So you can detach and attach tmux sessions happily, but just make sure you don't close every console on your machine.
Here's a nice animated gif of me moving the splitter on tmux on Windows. YES I KNOW YOU CAN USE THE KEYBOARD BUT THIS GIF IS COOL.

Some hotkey remapping, git prompt, completion 
I am still learning tmux but here's my .tmux.conf. I've made a few common changes to make the hotkey creation of windows easier.#remap prefix from 'C-b' to 'C-a'unbind C-bset-option -g prefix C-abind-key C-a send-prefix# split panes using | and -bind | split-window -hbind _ split-window -vunbind '"'unbind %bind k confirm kill-windowbind K confirm kill-serverbind < resize-pane -L 1bind > resize-pane -R 1bind - resize-pane -D 1bind + resize-pane -U 1bind r source-file ~/.tmux.conf# switch panes using Alt-arrow without prefixbind -n M-Left select-pane -Lbind -n M-Right select-pane -Rbind -n M-Up select-pane -Ubind -n M-Down select-pane -D# Enable mouse control (clickable windows, panes, resizable panes)set -g mouse onset -g default-terminal "screen-256color"
I'm using the default Ubuntu .bashrc that includes a check for dircolors (more on this below) but I added this for git-completion.sh and a git prompt, as well as these two alias. I like being able to type "desktop" to jump to my Windows Desktop. And the -x on Midnight Commander helps the mouse support.alias desktop="cd /mnt/c/Users/scott/Desktop"alias mc="mc -x"
export CLICOLOR=1source ~/.git-completion.shPS1='\[\033[37m\]\W\[\033[0m\]$(__git_ps1 " (\[\033[35m\]%s\[\033[0m\])") \$ 'GIT_PS1_SHOWDIRTYSTATE=1GIT_PS1_SHOWSTASHSTATE=1GIT_PS1_SHOWUNTRACKEDFILES=1GIT_PS1_SHOWUPSTREAM="auto"
Git Completion can be installed with:sudo apt-get install git bash-completion
Ubuntu Mono font 
I really like the Ubuntu Mono font, and I like the way it looks when running Ubuntu under Windows. You can download the Ubuntu Font Family free. Right click the downloaded TTF files and right click and "Install," or drag them into C:\windows\fonts. Then click the upper left corner of any Bash console window and change your font to Ubuntu Mono.

Nice directory colors (DIRCOLORS/LS_COLORS)'
If you have a black command prompt background, then default colors for directories will be dark blue on black, which sucks. Fortunately you can get .dircolors files from all over the wep, or set the LS_COLORS (make sure to search for LS_COLORS for Linux, not the other, different LSCOLORS on Mac) environment variable.
I ended up with "dircolors-solarized" from here, downloaded it with wget or curl and put it in ~. Then confirm this is in your .bashrc (it likely is already)# enable color support of ls and also add handy aliasesif [ -x /usr/bin/dircolors ]; then    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"    alias ls='ls --color=auto'    alias dir='dir --color=auto'    #alias vdir='vdir --color=auto'    alias grep='grep --color=auto'    alias fgrep='fgrep --color=auto'    alias egrep='egrep --color=auto'fi
Download whatever .dircolors file makes you happy (make sure the filename ends up as ".dircolors," so you may need to cp yoursourcefile ~/.dircolors and then restart your console.
Make a big difference for me, and as I mention, it's totally, gloriously, maddeningly configurable.

Leave YOUR Linux on Windows tips in the comments!


Sponsor: Did you know VSTS can integrate closely with Octopus Deploy? Watch Damian Brady and Brian A. Randell as they show you how to automate deployments from VSTS to Octopus Deploy, and demo the new VSTS Octopus Deploy dashboard widget. Watch now



            
                
                    About Scott
                    
                        Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
                        
                        
                        
                        About   Newsletter
                    
                

                
                    Hosting By
                        
                    

                
            

            


            

            
        