From e97b3d6a0ff0715b18ac1f0195a064759002975d Mon Sep 17 00:00:00 2001 From: kaernyk Date: Fri, 5 Sep 2014 22:06:10 -0400 Subject: Update and rename learntmux.html.markdown to tmux.html.markdown Fixed some spelling, grammar, and punctuation issues Line 48: Added additional items to the list of keybinds for power users Line 104: Created section on configuring ~/.tmux.conf & added additional comments Line 203: Added section including external resources --- learntmux.html.markdown | 71 ---------------- tmux.html.markdown | 209 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 71 deletions(-) delete mode 100644 learntmux.html.markdown create mode 100644 tmux.html.markdown diff --git a/learntmux.html.markdown b/learntmux.html.markdown deleted file mode 100644 index eaf3fd25..00000000 --- a/learntmux.html.markdown +++ /dev/null @@ -1,71 +0,0 @@ ---- -category: tool -tool: tmux -contributors: - - ["kaernyk", "http://github.com/kaernyk"] -filename: LearnTmux.txt ---- - - - tmux is a terminal multiplexer: it enables a number of terminals to be -created, accessed, and controlled from a single screen. tmux may be detached -from a screen and continue running in the background, then later reattached. - - Once you feel comfortable manipulating tmux to suit your needs, I strongly -suggest you read the man pages. - - - -``` -# Session Management - - tmux new Create new session - -s "Session" Create named session - -n "Window" Create named Window - -c "/dir" Start in target directory - - C^b $ Rename current session - C^b d Detach current session - C^b D Select session to detach - - tmux attach Attach last/available session - -t "#" Attach target session - -d Detach the session from other instances - - tmux ls List open sessions - C^b s Select new session for attached client interactively - - kill-session Kill current session - -t "#" Kill target session - -a Kill all sessions - -a -t "#" Kill all sessions but the target - - -# Window Management - - C^b c Create another window - C^b " Split Horizontally - C^b % Split Vertically - C^b M-(1-5) 1) Tile vertically - 2) Tile horizontally - 3) Tile Vertically /w large horizontal - 4) Tile horizontally /w large vertical - 5) Tile all windows evenly - - C^b q Briefly display pane indexes - C^# Choose current window by # - C^b w Choose current window interactively - C^b n Change to next window - C^b p Change to previous window - C^b Up, Right Change to pane in selected direction - Down, left - C^b { Swap current/previous window - C^b } Swap current/next window - - C^b C-Up, Right Resize in steps of one cell - Down, left - C^b M-Up, Right resize in steps of five cells - Down, left - - exit or C^b x Kill the current window -``` diff --git a/tmux.html.markdown b/tmux.html.markdown new file mode 100644 index 00000000..53606bbe --- /dev/null +++ b/tmux.html.markdown @@ -0,0 +1,209 @@ +--- +category: tool +tool: tmux +contributors: + - ["kaernyk", "http://github.com/kaernyk"] +filename: LearnTmux.txt +--- + + + +tmux is a terminal multiplexer: it enables a number of terminals to be +created, accessed, and controlled from a single screen. tmux may be detached +from a screen and continue running in the background, then later reattached. + +```bash +# We’ll start off with managing tmux from a terminal: + + tmux | tmux new # Create an unamed session + -s "Session" # Create named session + -n "Window" # Create named Window + -c "/dir" # Start in target directory + + tmux attach # Attach last/available session + -t "#" # Attach target session + -d # Detach the session from other instances + + tmux ls # List open sessions + + kill-session # Kill current session + -t "#" # Kill target session + -a # Kill all sessions + -a -t "#" # Kill all sessions but the target + + + +## Key Bindings + +# The method of controlling an attached tmux session is fairly simple, but +# there are two keys we will see repeated throughout this write-up (as well as +# the man pages). + + (C-b) == Ctrl + b + +# This combination is the default prefix key that is to be used in conjunction +# with a keybind to produce the stated effect. + + +# The default keybinds are as follows: + + C-b # Send the prefix key (C-b) through to the application. + C-o # Rotate the panes in the current window forwards. + C-z # Suspend the tmux client. + ? # List all key bindings. + : # Enter the tmux command prompt. + r # Force redraw of the attached client. + + c # Create a new window. + $ # Rename the current session. + , # Rename the current window. + + ! # Break the current pane out of the window. + % # Split the current pane into two, left and right. + " # Split the current pane into two, top and bottom. + + n # Change to the next window. + p # Change to the previous window. + { # Swap the current pane with the previous pane. + } # Swap the current pane with the next pane. + + s # Select a new session for the attached client interactively. + w # Choose the current window interactively. + 0 to 9 # Select windows 0 to 9. + + d # Detach the current client. + D # Choose a client to detach. + + & # Kill the current window. + x # Kill the current pane. + + Up, Down # Change to the pane above, below, left, or right. + Left, Right + + M-1 to M-5 # Arrange panes: + # 1) even-horizontal + # 2) even-vertical + # 3) main-horizontal + # 4) main-vertical + # 5) tiled. + + C-Up, C-Down # Resize the current pane in steps of one cell. + C-Left, C-Right + + M-Up, M-Down # Resize the current pane in steps of five cells. + M-Left, M-Right +``` + + +### Configuring ~/.tmux.conf + + tmux.conf can be used to set options automatically on start up, much +like how .vimrc or init.el are used. + +```bash +# Example tmux.conf +# 2014.9 + +### Keybinds +########################################################################### + +## Prefix Adjustment + +# Unbind C-b as the default prefix +unbind-key C-b + +# Set ` as the default prefix +set-option -g prefix ` +#set option -g prefix C-a + +# Return to previous window when prefix is pressed twice +bind-key C-a last-window +bind-key ` last-window +bind-key a send-prefix + +# Allow swapping C-a and ` using F11/F12 +bind-key F11 set-option -g prefix C-a +bind-key F12 set-option -g prefix ` + +## Index Start +set -g base-index 1 + +## Window Cycle/Swap +bind e previous-window +bind f next-window +bind E swap-window -t -1 +bind F swap-window -t +1 + + +### Theme +########################################################################### + +## Statusbar Color Palatte +#set-option -g status-justify centre +set-option -g status-justify left +set-option -g status-bg black +set-option -g status-fg white +set-option -g status-left-length 40 +set-option -g status-right-length 80 + +## Pane Border Color Palette +set-option -g pane-active-border-fg green +set-option -g pane-active-border-bg black +set-option -g pane-border-fg white +set-option -g pane-border-bg black + +## Message Color Palette +set-option -g message-fg black +set-option -g message-bg green + +#setw -g mode-bg black + +## Window Status Color Palette +setw -g window-status-bg black +setw -g window-status-current-fg green +setw -g window-status-bell-attr default +setw -g window-status-bell-fg red +setw -g window-status-content-attr default +setw -g window-status-content-fg yellow +setw -g window-status-activity-attr default +setw -g window-status-activity-fg yellow + + +### UI +########################################################################### + +## Window Interface Adjustments +set-option -g status-utf8 on +setw -g mode-keys vi +setw -g mode-mouse on +setw -g monitor-activity on + +set-option -g mouse-select-pane on +set-option -g status-keys vi +set-option -g bell-action any +set-option -g set-titles on +set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) +set-option -g visual-bell off + +## Statusbar Adjustments +set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' +set -g status-interval 5 +#set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' + +## Show performance counters in statusbar +#set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' + + +### Misc +########################################################################### +set -g history-limit 4096 +bind r source-file ~/.tmux.conf +``` + +### External Resources + +Tmux | Home
+Manual page
+Display CPU/MEM % in statusbar
+Archlinux Wiki
+Gentoo Wiki
-- cgit v1.2.3 From 29581e5c1307e43f752e08b6fdd66cde54448424 Mon Sep 17 00:00:00 2001 From: kaernyk Date: Fri, 5 Sep 2014 23:11:58 -0400 Subject: Update tmux.html.markdown Corrected page structure/style to conform to other tutorials ``` Line 18: Removed "tmux" as it has other purposes as well as quickly starting a blank session that will not be covered Line 45: Added Meta/Alt explanation Line 126: Moved 'bind-key C-a send-prefix" to the group that requires it Line 184: Added comment Line 186: Added comment pointing to resource required (if enabled) - Removed 'set-option -g status-justify centre' ``` --- tmux.html.markdown | 200 ++++++++++++++++++++++++++--------------------------- 1 file changed, 97 insertions(+), 103 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index 53606bbe..7127d3b9 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -12,10 +12,11 @@ tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. + ```bash # We’ll start off with managing tmux from a terminal: - tmux | tmux new # Create an unamed session + tmux new # Create a new session -s "Session" # Create named session -n "Window" # Create named Window -c "/dir" # Start in target directory @@ -40,9 +41,10 @@ from a screen and continue running in the background, then later reattached. # the man pages). (C-b) == Ctrl + b - -# This combination is the default prefix key that is to be used in conjunction -# with a keybind to produce the stated effect. + + (M-1) == Alt + b + -or- + Meta + b # The default keybinds are as follows: @@ -92,7 +94,6 @@ from a screen and continue running in the background, then later reattached. M-Up, M-Down # Resize the current pane in steps of five cells. M-Left, M-Right -``` ### Configuring ~/.tmux.conf @@ -100,104 +101,97 @@ from a screen and continue running in the background, then later reattached. tmux.conf can be used to set options automatically on start up, much like how .vimrc or init.el are used. -```bash -# Example tmux.conf -# 2014.9 - -### Keybinds -########################################################################### - -## Prefix Adjustment - -# Unbind C-b as the default prefix -unbind-key C-b - -# Set ` as the default prefix -set-option -g prefix ` -#set option -g prefix C-a - -# Return to previous window when prefix is pressed twice -bind-key C-a last-window -bind-key ` last-window -bind-key a send-prefix - -# Allow swapping C-a and ` using F11/F12 -bind-key F11 set-option -g prefix C-a -bind-key F12 set-option -g prefix ` - -## Index Start -set -g base-index 1 - -## Window Cycle/Swap -bind e previous-window -bind f next-window -bind E swap-window -t -1 -bind F swap-window -t +1 - - -### Theme -########################################################################### - -## Statusbar Color Palatte -#set-option -g status-justify centre -set-option -g status-justify left -set-option -g status-bg black -set-option -g status-fg white -set-option -g status-left-length 40 -set-option -g status-right-length 80 - -## Pane Border Color Palette -set-option -g pane-active-border-fg green -set-option -g pane-active-border-bg black -set-option -g pane-border-fg white -set-option -g pane-border-bg black - -## Message Color Palette -set-option -g message-fg black -set-option -g message-bg green - -#setw -g mode-bg black - -## Window Status Color Palette -setw -g window-status-bg black -setw -g window-status-current-fg green -setw -g window-status-bell-attr default -setw -g window-status-bell-fg red -setw -g window-status-content-attr default -setw -g window-status-content-fg yellow -setw -g window-status-activity-attr default -setw -g window-status-activity-fg yellow - - -### UI -########################################################################### - -## Window Interface Adjustments -set-option -g status-utf8 on -setw -g mode-keys vi -setw -g mode-mouse on -setw -g monitor-activity on - -set-option -g mouse-select-pane on -set-option -g status-keys vi -set-option -g bell-action any -set-option -g set-titles on -set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) -set-option -g visual-bell off - -## Statusbar Adjustments -set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' -set -g status-interval 5 -#set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' - -## Show performance counters in statusbar -#set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' - - -### Misc -########################################################################### -set -g history-limit 4096 -bind r source-file ~/.tmux.conf +``` + # Example tmux.conf + # 2014.9 + + ## Prefix Adjustment + + # Unbind C-b as the default prefix + unbind-key C-b + + # Set ` as the default prefix + set-option -g prefix ` + + # Set C-a as the default prefix + #set option -g prefix C-a + + # Return to previous window when prefix is pressed twice + bind-key C-a last-window + bind-key ` last-window + + # Allow swapping C-a and ` using F11/F12 + bind-key F11 set-option -g prefix C-a + bind-key F12 set-option -g prefix ` + bind-key C-a send-prefix + + ## Index Start + set -g base-index 1 + + ## Window Cycle/Swap + bind e previous-window + bind f next-window + bind E swap-window -t -1 + bind F swap-window -t +1 + + ## Statusbar Color Palatte + set-option -g status-justify left + set-option -g status-bg black + set-option -g status-fg white + set-option -g status-left-length 40 + set-option -g status-right-length 80 + + ## Pane Border Color Palette + set-option -g pane-active-border-fg green + set-option -g pane-active-border-bg black + set-option -g pane-border-fg white + set-option -g pane-border-bg black + + ## Message Color Palette + set-option -g message-fg black + set-option -g message-bg green + + #setw -g mode-bg black + + ## Window Status Color Palette + setw -g window-status-bg black + setw -g window-status-current-fg green + setw -g window-status-bell-attr default + setw -g window-status-bell-fg red + setw -g window-status-content-attr default + setw -g window-status-content-fg yellow + setw -g window-status-activity-attr default + setw -g window-status-activity-fg yellow + + ## Window Interface Adjustments + set-option -g status-utf8 on + setw -g mode-keys vi + setw -g mode-mouse on + setw -g monitor-activity on + + set-option -g mouse-select-pane on + set-option -g status-keys vi + set-option -g bell-action any + set-option -g set-titles on + set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) + set-option -g visual-bell off + + ## Statusbar Adjustments + set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' + set -g status-interval 5 + + # Statusbar with right-aligned Date / Time + set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' + + ## Show performance counters in statusbar + # Requires https://github.com/thewtex/tmux-mem-cpu-load/ + #set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' + + ## Scrollback/History limit + set -g history-limit 4096 + + bind r source-file ~/.tmux.conf +``` ``` ### External Resources -- cgit v1.2.3 From 408a4689f240e15d2b7e7517949d7c5682da6e8a Mon Sep 17 00:00:00 2001 From: kaernyk Date: Fri, 5 Sep 2014 23:20:51 -0400 Subject: fix code block example tmux.conf was not nested as I previously thought. I combined the blocks and fixed the issue --- tmux.html.markdown | 183 +++++++++++++++++++++++++++-------------------------- 1 file changed, 92 insertions(+), 91 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index 7127d3b9..b9257edc 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -96,102 +96,103 @@ from a screen and continue running in the background, then later reattached. M-Left, M-Right + + ### Configuring ~/.tmux.conf tmux.conf can be used to set options automatically on start up, much like how .vimrc or init.el are used. -``` - # Example tmux.conf - # 2014.9 - - ## Prefix Adjustment - - # Unbind C-b as the default prefix - unbind-key C-b - - # Set ` as the default prefix - set-option -g prefix ` - - # Set C-a as the default prefix - #set option -g prefix C-a - - # Return to previous window when prefix is pressed twice - bind-key C-a last-window - bind-key ` last-window - - # Allow swapping C-a and ` using F11/F12 - bind-key F11 set-option -g prefix C-a - bind-key F12 set-option -g prefix ` - bind-key C-a send-prefix - - ## Index Start - set -g base-index 1 - - ## Window Cycle/Swap - bind e previous-window - bind f next-window - bind E swap-window -t -1 - bind F swap-window -t +1 - - ## Statusbar Color Palatte - set-option -g status-justify left - set-option -g status-bg black - set-option -g status-fg white - set-option -g status-left-length 40 - set-option -g status-right-length 80 - - ## Pane Border Color Palette - set-option -g pane-active-border-fg green - set-option -g pane-active-border-bg black - set-option -g pane-border-fg white - set-option -g pane-border-bg black - - ## Message Color Palette - set-option -g message-fg black - set-option -g message-bg green - - #setw -g mode-bg black - - ## Window Status Color Palette - setw -g window-status-bg black - setw -g window-status-current-fg green - setw -g window-status-bell-attr default - setw -g window-status-bell-fg red - setw -g window-status-content-attr default - setw -g window-status-content-fg yellow - setw -g window-status-activity-attr default - setw -g window-status-activity-fg yellow - - ## Window Interface Adjustments - set-option -g status-utf8 on - setw -g mode-keys vi - setw -g mode-mouse on - setw -g monitor-activity on - - set-option -g mouse-select-pane on - set-option -g status-keys vi - set-option -g bell-action any - set-option -g set-titles on - set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) - set-option -g visual-bell off - - ## Statusbar Adjustments - set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' - set -g status-interval 5 - - # Statusbar with right-aligned Date / Time - set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' - - ## Show performance counters in statusbar - # Requires https://github.com/thewtex/tmux-mem-cpu-load/ - #set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' - - ## Scrollback/History limit - set -g history-limit 4096 - - bind r source-file ~/.tmux.conf -``` + +# Example tmux.conf +# 2014.9 + +## Prefix Adjustment + +# Unbind C-b as the default prefix +unbind-key C-b + +# Set ` as the default prefix +set-option -g prefix ` + +# Set C-a as the default prefix +#set option -g prefix C-a + +# Return to previous window when prefix is pressed twice +bind-key C-a last-window +bind-key ` last-window + +# Allow swapping C-a and ` using F11/F12 +bind-key F11 set-option -g prefix C-a +bind-key F12 set-option -g prefix ` +bind-key C-a send-prefix + +## Index Start +set -g base-index 1 + +## Window Cycle/Swap +bind e previous-window +bind f next-window +bind E swap-window -t -1 +bind F swap-window -t +1 + +## Statusbar Color Palatte +set-option -g status-justify left +set-option -g status-bg black +set-option -g status-fg white +set-option -g status-left-length 40 +set-option -g status-right-length 80 + +## Pane Border Color Palette +set-option -g pane-active-border-fg green +set-option -g pane-active-border-bg black +set-option -g pane-border-fg white +set-option -g pane-border-bg black + +## Message Color Palette +set-option -g message-fg black +set-option -g message-bg green + +#setw -g mode-bg black + +## Window Status Color Palette +setw -g window-status-bg black +setw -g window-status-current-fg green +setw -g window-status-bell-attr default +setw -g window-status-bell-fg red +setw -g window-status-content-attr default +setw -g window-status-content-fg yellow +setw -g window-status-activity-attr default +setw -g window-status-activity-fg yellow + +## Window Interface Adjustments +set-option -g status-utf8 on +setw -g mode-keys vi +setw -g mode-mouse on +setw -g monitor-activity on + +set-option -g mouse-select-pane on +set-option -g status-keys vi +set-option -g bell-action any +set-option -g set-titles on +set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) +set-option -g visual-bell off + +## Statusbar Adjustments +set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' +set -g status-interval 5 + +# Statusbar with right-aligned Date / Time +set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' + +## Show performance counters in statusbar +# Requires https://github.com/thewtex/tmux-mem-cpu-load/ +#set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' + +## Scrollback/History limit +set -g history-limit 4096 + +bind r source-file ~/.tmux.conf ``` ### External Resources -- cgit v1.2.3 From 0f00fb2b7ae0118bd52bfc675f0e8561c083d241 Mon Sep 17 00:00:00 2001 From: kaernyk Date: Mon, 8 Sep 2014 09:02:45 -0400 Subject: Edit tmux.conf - Added additional content to terminal management - Sectioned each category, and restructured how they were grouped - Removed 'set -g mode-bg' as users can read the manual page if this becomes something they want to customize --- tmux.html.markdown | 154 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 103 insertions(+), 51 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index b9257edc..2850a64b 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -16,16 +16,33 @@ from a screen and continue running in the background, then later reattached. ```bash # We’ll start off with managing tmux from a terminal: - tmux new # Create a new session + tmux + + new # Create a new session -s "Session" # Create named session -n "Window" # Create named Window -c "/dir" # Start in target directory - tmux attach # Attach last/available session + attach # Attach last/available session -t "#" # Attach target session -d # Detach the session from other instances - tmux ls # List open sessions + ls # List open sessions + -a # List all open sessions + + lsw # List windows + -a # List all windows + -s # List all windows in session + + lsp # List panes + -a # List all panes + -s # List all panes in session + -t # List app panes in target + + kill-window # Kill current window + -t "#" # Kill target window + -a # Kill all windows + -a -t "#" # Kill all windows but the target kill-session # Kill current session -t "#" # Kill target session @@ -104,58 +121,75 @@ from a screen and continue running in the background, then later reattached. like how .vimrc or init.el are used. -# Example tmux.conf -# 2014.9 - -## Prefix Adjustment - -# Unbind C-b as the default prefix -unbind-key C-b - -# Set ` as the default prefix -set-option -g prefix ` - -# Set C-a as the default prefix -#set option -g prefix C-a - -# Return to previous window when prefix is pressed twice +# Example tmux.conf +# 2014.9 + + +### Keybinds +########################################################################### + +# Unbind C-b as the default prefix +unbind-key C-b + +# Set new default prefix +set-option -g prefix ` +#set-option -g prefix C-a + +# Return to previous window when prefix is pressed twice bind-key C-a last-window -bind-key ` last-window - -# Allow swapping C-a and ` using F11/F12 +bind-key ` last-window + +# Allow swapping C-a and ` using F11/F12 bind-key F11 set-option -g prefix C-a bind-key F12 set-option -g prefix ` -bind-key C-a send-prefix -## Index Start +# Activate inner-most session (when nesting tmux) +# to send commands +bind-key a send-prefix + +# Index Start set -g base-index 1 -## Window Cycle/Swap +# Window Cycle/Swap bind e previous-window bind f next-window bind E swap-window -t -1 bind F swap-window -t +1 - -## Statusbar Color Palatte + +# easy-to-remember split pane commands +bind | split-window -h +bind - split-window -v +unbind '"' +unbind % + +# moving between panes with vim movement keys +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + + +### Theme +########################################################################### + +# Statusbar Color Palatte set-option -g status-justify left set-option -g status-bg black set-option -g status-fg white set-option -g status-left-length 40 set-option -g status-right-length 80 -## Pane Border Color Palette +# Pane Border Color Palette set-option -g pane-active-border-fg green set-option -g pane-active-border-bg black set-option -g pane-border-fg white set-option -g pane-border-bg black -## Message Color Palette +# Message Color Palette set-option -g message-fg black set-option -g message-bg green -#setw -g mode-bg black - -## Window Status Color Palette +# Window Status Color Palette setw -g window-status-bg black setw -g window-status-current-fg green setw -g window-status-bell-attr default @@ -164,34 +198,52 @@ setw -g window-status-content-attr default setw -g window-status-content-fg yellow setw -g window-status-activity-attr default setw -g window-status-activity-fg yellow - -## Window Interface Adjustments + + +### UI +########################################################################### + +# Statusbar set-option -g status-utf8 on + +# Keybind preference setw -g mode-keys vi -setw -g mode-mouse on +set-option -g status-keys vi + +# Notification setw -g monitor-activity on +set -g visual-activity on +set-option -g bell-action any +set-option -g visual-bell off +# Mouse +setw -g mode-mouse on set-option -g mouse-select-pane on -set-option -g status-keys vi -set-option -g bell-action any +set -g mouse-resize-pane on +set -g mouse-select-window on + +# Automatically set window titles set-option -g set-titles on set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) -set-option -g visual-bell off - -## Statusbar Adjustments -set -g status-left ' #[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' -set -g status-interval 5 - -# Statusbar with right-aligned Date / Time -set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' - -## Show performance counters in statusbar -# Requires https://github.com/thewtex/tmux-mem-cpu-load/ + +# Statusbar Adjustments +set -g status-left '#[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' +set -g status-interval 3 + +# Statusbar with right-aligned Date / Time +#set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' + +# Show performance counters in statusbar +# Requires https://github.com/thewtex/tmux-mem-cpu-load/ #set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' - -## Scrollback/History limit -set -g history-limit 4096 - + + +### Misc +########################################################################### + +# Scrollback/History limit +set -g history-limit 4096 + bind r source-file ~/.tmux.conf ``` -- cgit v1.2.3 From e8e9f08c540123eec124afd3a2666b52a48d0a4a Mon Sep 17 00:00:00 2001 From: kaernyk Date: Mon, 8 Sep 2014 09:12:30 -0400 Subject: Fix terminal commands Header syntax has been corrected --- tmux.html.markdown | 68 +++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index 2850a64b..ae68ed75 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -14,40 +14,40 @@ from a screen and continue running in the background, then later reattached. ```bash -# We’ll start off with managing tmux from a terminal: - - tmux - - new # Create a new session - -s "Session" # Create named session - -n "Window" # Create named Window - -c "/dir" # Start in target directory - - attach # Attach last/available session - -t "#" # Attach target session - -d # Detach the session from other instances - - ls # List open sessions - -a # List all open sessions - - lsw # List windows - -a # List all windows - -s # List all windows in session - - lsp # List panes - -a # List all panes - -s # List all panes in session - -t # List app panes in target - - kill-window # Kill current window - -t "#" # Kill target window - -a # Kill all windows - -a -t "#" # Kill all windows but the target - - kill-session # Kill current session - -t "#" # Kill target session - -a # Kill all sessions - -a -t "#" # Kill all sessions but the target + + tmux [command] # Run a command + # 'tmux' with no commands will create a new session + + new # Create a new session + -s "Session" # Create named session + -n "Window" # Create named Window + -c "/dir" # Start in target directory + + attach # Attach last/available session + -t "#" # Attach target session + -d # Detach the session from other instances + + ls # List open sessions + -a # List all open sessions + + lsw # List windows + -a # List all windows + -s # List all windows in session + + lsp # List panes + -a # List all panes + -s # List all panes in session + -t # List app panes in target + + kill-window # Kill current window + -t "#" # Kill target window + -a # Kill all windows + -a -t "#" # Kill all windows but the target + + kill-session # Kill current session + -t "#" # Kill target session + -a # Kill all sessions + -a -t "#" # Kill all sessions but the target -- cgit v1.2.3 From eff9acfdde8a40bcdd6c6bcec96381064c1060b4 Mon Sep 17 00:00:00 2001 From: kaernyk Date: Mon, 8 Sep 2014 09:21:59 -0400 Subject: Remove syntax highlighting bash syntax highlighting created issues with an open " originating in Keybinds. I have disabled syntax highlighting so the display is consistent --- tmux.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index ae68ed75..b4a9fde9 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -13,7 +13,7 @@ created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. -```bash +``` tmux [command] # Run a command # 'tmux' with no commands will create a new session -- cgit v1.2.3 From b71c8fb2f69cc009fd89ba17ed222bcd10e3166a Mon Sep 17 00:00:00 2001 From: kaernyk Date: Tue, 9 Sep 2014 19:52:28 -0400 Subject: Remove tmux.conf The linked resources have a few examples for users to build their own, and example configurations can be shared as links. This makes including it not too vital at the moment. - Removed a handful of terminal commands & keybinds from the list - Trimmed some overly-verbose paragraphs --- tmux.html.markdown | 236 +++++++++++------------------------------------------ 1 file changed, 48 insertions(+), 188 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index b4a9fde9..ed606998 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -8,74 +8,67 @@ filename: LearnTmux.txt -tmux is a terminal multiplexer: it enables a number of terminals to be -created, accessed, and controlled from a single screen. tmux may be detached +tmux is a terminal multiplexer: it enables a number of terminals to be +created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. ``` + tmux [command] # Run a command + # 'tmux' with no commands will create a new session - tmux [command] # Run a command - # 'tmux' with no commands will create a new session - - new # Create a new session - -s "Session" # Create named session - -n "Window" # Create named Window - -c "/dir" # Start in target directory - - attach # Attach last/available session - -t "#" # Attach target session - -d # Detach the session from other instances - - ls # List open sessions - -a # List all open sessions - - lsw # List windows - -a # List all windows - -s # List all windows in session - - lsp # List panes - -a # List all panes - -s # List all panes in session - -t # List app panes in target - - kill-window # Kill current window - -t "#" # Kill target window - -a # Kill all windows - -a -t "#" # Kill all windows but the target - - kill-session # Kill current session - -t "#" # Kill target session - -a # Kill all sessions - -a -t "#" # Kill all sessions but the target + new # Create a new session + -s "Session" # Create named session + -n "Window" # Create named Window + -c "/dir" # Start in target directory + + attach # Attach last/available session + -t "#" # Attach target session + -d # Detach the session from other instances + + ls # List open sessions + -a # List all open sessions + + lsw # List windows + -a # List all windows + -s # List all windows in session + + lsp # List panes + -a # List all panes + -s # List all panes in session + -t # List app panes in target + + kill-window # Kill current window + -t "#" # Kill target window + -a # Kill all windows + -a -t "#" # Kill all windows but the target + + kill-session # Kill current session + -t "#" # Kill target session + -a # Kill all sessions + -a -t "#" # Kill all sessions but the target ## Key Bindings -# The method of controlling an attached tmux session is fairly simple, but -# there are two keys we will see repeated throughout this write-up (as well as -# the man pages). - - (C-b) == Ctrl + b +# The method of controlling an attached tmux session is via key combinations +# called 'Prefix' keys. - (M-1) == Alt + b - -or- - Meta + b +------------------------------------------------------------------------------ + (C-b) = Ctrl + b # 'Prefix' combination required to use keybinds -# The default keybinds are as follows: + (M-1) = Alt + 1 + -or- + Meta + 1 + +------------------------------------------------------------------------------ - C-b # Send the prefix key (C-b) through to the application. - C-o # Rotate the panes in the current window forwards. - C-z # Suspend the tmux client. ? # List all key bindings. : # Enter the tmux command prompt. r # Force redraw of the attached client. - c # Create a new window. - $ # Rename the current session. - , # Rename the current window. ! # Break the current pane out of the window. % # Split the current pane into two, left and right. @@ -92,14 +85,14 @@ from a screen and continue running in the background, then later reattached. d # Detach the current client. D # Choose a client to detach. - + & # Kill the current window. x # Kill the current pane. Up, Down # Change to the pane above, below, left, or right. Left, Right - M-1 to M-5 # Arrange panes: + M-1 to M-5 # Arrange panes: # 1) even-horizontal # 2) even-vertical # 3) main-horizontal @@ -108,149 +101,16 @@ from a screen and continue running in the background, then later reattached. C-Up, C-Down # Resize the current pane in steps of one cell. C-Left, C-Right - + M-Up, M-Down # Resize the current pane in steps of five cells. M-Left, M-Right - - - -### Configuring ~/.tmux.conf - - tmux.conf can be used to set options automatically on start up, much -like how .vimrc or init.el are used. - - -# Example tmux.conf -# 2014.9 - - -### Keybinds -########################################################################### - -# Unbind C-b as the default prefix -unbind-key C-b - -# Set new default prefix -set-option -g prefix ` -#set-option -g prefix C-a - -# Return to previous window when prefix is pressed twice -bind-key C-a last-window -bind-key ` last-window - -# Allow swapping C-a and ` using F11/F12 -bind-key F11 set-option -g prefix C-a -bind-key F12 set-option -g prefix ` - -# Activate inner-most session (when nesting tmux) -# to send commands -bind-key a send-prefix - -# Index Start -set -g base-index 1 - -# Window Cycle/Swap -bind e previous-window -bind f next-window -bind E swap-window -t -1 -bind F swap-window -t +1 - -# easy-to-remember split pane commands -bind | split-window -h -bind - split-window -v -unbind '"' -unbind % - -# moving between panes with vim movement keys -bind h select-pane -L -bind j select-pane -D -bind k select-pane -U -bind l select-pane -R - - -### Theme -########################################################################### - -# Statusbar Color Palatte -set-option -g status-justify left -set-option -g status-bg black -set-option -g status-fg white -set-option -g status-left-length 40 -set-option -g status-right-length 80 - -# Pane Border Color Palette -set-option -g pane-active-border-fg green -set-option -g pane-active-border-bg black -set-option -g pane-border-fg white -set-option -g pane-border-bg black - -# Message Color Palette -set-option -g message-fg black -set-option -g message-bg green - -# Window Status Color Palette -setw -g window-status-bg black -setw -g window-status-current-fg green -setw -g window-status-bell-attr default -setw -g window-status-bell-fg red -setw -g window-status-content-attr default -setw -g window-status-content-fg yellow -setw -g window-status-activity-attr default -setw -g window-status-activity-fg yellow - - -### UI -########################################################################### - -# Statusbar -set-option -g status-utf8 on - -# Keybind preference -setw -g mode-keys vi -set-option -g status-keys vi - -# Notification -setw -g monitor-activity on -set -g visual-activity on -set-option -g bell-action any -set-option -g visual-bell off - -# Mouse -setw -g mode-mouse on -set-option -g mouse-select-pane on -set -g mouse-resize-pane on -set -g mouse-select-window on - -# Automatically set window titles -set-option -g set-titles on -set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) - -# Statusbar Adjustments -set -g status-left '#[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' -set -g status-interval 3 - -# Statusbar with right-aligned Date / Time -#set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' - -# Show performance counters in statusbar -# Requires https://github.com/thewtex/tmux-mem-cpu-load/ -#set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' - - -### Misc -########################################################################### - -# Scrollback/History limit -set -g history-limit 4096 - -bind r source-file ~/.tmux.conf ``` ### External Resources Tmux | Home
-Manual page
-Display CPU/MEM % in statusbar
+Tmux Manual page
Archlinux Wiki
Gentoo Wiki
+Display CPU/MEM % in statusbar
-- cgit v1.2.3 From b492bf6f379d9b8ff9d29872b970f2c0f7e5fa41 Mon Sep 17 00:00:00 2001 From: kaernyk Date: Tue, 9 Sep 2014 21:19:53 -0400 Subject: Add tmux.conf Re-add example ~/.tmux.conf --- tmux.html.markdown | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index ed606998..516bee4d 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -59,9 +59,7 @@ from a screen and continue running in the background, then later reattached. (C-b) = Ctrl + b # 'Prefix' combination required to use keybinds - (M-1) = Alt + 1 - -or- - Meta + 1 + (M-1) = Meta + 1 -or- Alt + 1 ------------------------------------------------------------------------------ @@ -105,6 +103,133 @@ from a screen and continue running in the background, then later reattached. M-Up, M-Down # Resize the current pane in steps of five cells. M-Left, M-Right + + +### Configuring ~/.tmux.conf + + tmux.conf can be used to set options automatically on start up, much +like how .vimrc or init.el are used. + +# Example tmux.conf +# 2014.9 + + +### Keybinds +########################################################################### + +# Unbind C-b as the default prefix +unbind-key C-befix C-a + +# Return to previous window when prefix is pressed twice +bind-key C-a last-window +bind-key ` last-window + +# Allow swapping C-a and ` using F11/F12 +bind-key F11 set-option -g prefix C-a +bind-key F12 set-option -g prefix ` + +# Activate inner-most session (when nesting tmux) +# to send commands +bind-key a send-prefix + +# Index Start +set -g base-index 1 + +# Window Cycle/Swap +bind e previous-window +bind f next-window +bind E swap-window -t -1 +bind F swap-window -t +1 + +# easy-to-remember split pane commands +bind | split-window -h +bind - split-window -v +unbind '"' +unbind % + +# moving between panes with vim movement keys +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + + +### Theme +########################################################################### + +# Statusbar Color Palette +set-option -g status-justify left +set-option -g status-bg black +set-option -g status-fg white +set-option -g status-left-length 40 +set-option -g status-right-length 80 + +# Pane Border Color Palette +set-option -g pane-active-border-fg green +set-option -g pane-active-border-bg black +set-option -g pane-border-fg white +set-option -g pane-border-bg black + +# Message Color Palette +set-option -g message-fg black +set-option -g message-bg green + +# Window Status Color Palette +setw -g window-status-bg black +setw -g window-status-current-fg green +setw -g window-status-bell-attr default +setw -g window-status-bell-fg red +setw -g window-status-content-attr default +setw -g window-status-content-fg yellow +setw -g window-status-activity-attr default +setw -g window-status-activity-fg yellow + + +### UI +########################################################################### + +# Statusbar +set-option -g status-utf8 on + +# Keybind preference +setw -g mode-keys vi +set-option -g status-keys vi + +# Notification +setw -g monitor-activity on +set -g visual-activity on +set-option -g bell-action any +set-option -g visual-bell off + +# Mouse +setw -g mode-mouse on +set-option -g mouse-select-pane on +set -g mouse-resize-pane on +set -g mouse-select-window on + +# Automatically set window titles +set-option -g set-titles on +set-option -g set-titles-string '#H:#S.#I.#P #W #T' # window number,program name,active (or not) + +# Statusbar Adjustments +set -g status-left '#[fg=red]#H#[fg=green]:#[fg=white]#S #[fg=green]][#[default] ' +set -g status-interval 3 + +# Statusbar with right-aligned Date / Time +#set -g status-right ' #[fg=green]][#[fg=white] #T #[fg=green]][ #[fg=blue]%Y-%m-%d #[fg=white]%H:%M#[default] ' + +# Show performance counters in statusbar +# Requires https://github.com/thewtex/tmux-mem-cpu-load/ +#set -g status-right ' #[fg=green]][#[fg=white] #(tmux-mem-cpu-load 5 4) #[fg=green]][ #[fg=yellow]%H:%M#[default] ' + + +### Misc +########################################################################### + +# Scrollback/History limit +set -g history-limit 4096 + +bind r source-file ~/.tmux.conf ``` ### External Resources -- cgit v1.2.3 From 870289faa8083b496ad539d531529a64b66bf434 Mon Sep 17 00:00:00 2001 From: Daniil Baturin Date: Wed, 10 Sep 2014 20:17:03 +0700 Subject: Add OCaml tutorial. --- ocaml.html.markdown | 309 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 ocaml.html.markdown diff --git a/ocaml.html.markdown b/ocaml.html.markdown new file mode 100644 index 00000000..ae862f08 --- /dev/null +++ b/ocaml.html.markdown @@ -0,0 +1,309 @@ +--- +language: "OCaml" +contributors: + - ["Daniil Baturin", "http://baturin.org/"] +--- + +OCaml is a strictly evaluated functional language with some imperative +features. + +Along with StandardML and its dialects it belongs to ML language family. +Just like StandardML, there are both a compiler and an interpreter +for OCaml. The interpreter binary is normally called "ocaml" and +the compiler is "ocamlc.opt". There is also a bytecode compiler, "ocamlc", +but there are few reasons to use it. + +It is strongly and statically typed, but instead of using manually written +type annotations it infers types of expressions using Hindley-Milner algorithm. +It makes type annotations unnecessary in most cases, but can be a major +source of confusion for beginners. + +When you are in the top level loop, OCaml will print the inferred type +after you enter an expression. +``` +# let inc x = x + 1 ;; +val inc : int -> int = +# let a = 99 ;; +val a : int = 99 +``` + +For a source file you can use "ocamlc -i /path/to/file.ml" command +to print all names and signatures. + +``` +$ cat sigtest.ml +let inc x = x + 1 +let add x y = x + y + +let a = 1 + +$ ocamlc -i ./sigtest.ml +val inc : int -> int +val add : int -> int -> int +val a : int +``` +Note that type signatures of functions of multiple arguments are +written in curried form. + +```ocaml +(* Comments are enclosed in (* and *). It's fine to nest comments. *) + +(* There are no single-line comments *) + + +(** Variables and functions *) + +(* Statements can be separated by double + semicolon symbol, ";;". + In many cases it's redundant, but in this tutorial we use it after + every expression for easy pasting into the interpreter shell. *) + +(* Variable and function declarations use "let" keyword. *) +let x = 10 ;; + +(* Since OCaml uses type inference, you normally don't need to + specify argument types explicitly. However, you can do it + if you want or need to. *) +let inc_int (x: int) = x + 1 ;; + +(* You need to mark recursive function definitions as such with "rec" keyword. *) +let rec factorial n = + if n = 0 then 1 + else factorial n * factorial (n-1) +;; + +(* Function application usually doesn't need parantheses around arguments *) +let fact_5 = factorial 5 ;; + +(* ...unless the argument is an expression *) +let fact_4 = factorial (5-1) ;; +let sqr2 = sqr (-2) ;; + +(* You can use multiple statements separated by semicolon in function body, + but the last expression becomes its return value. This is useful when + writing in imperative style. The simplest form of it is inserting a + debug print. *) +let print_and_return x = + print_endline (string_of_int x); + x +;; + +(* Every function must have at least one argument. + Since some funcions naturally don't take any arguments, there's + "unit" type for it that has the only one value written as "()" *) +let print_hello () = print_endline "hello world" ;; + +(* Note that you must specify "()" as argument when calling it. *) +print_hello () ;; + +(* Calling a function with insufficient number of arguments + does not cause an error, it produces a new function. *) +let make_inc x y = x + y ;; (* make_inc is int -> int -> int *) +let inc_2 = make_inc 2 ;; (* inc_2 is int -> int *) +inc_2 3 ;; (* Evaluates to 5 *) + + +(* Since OCaml is a functional language, it lacks "procedures". + Every function must return something. So functions that + do not really return anything and are called solely for their + side effects, like print_endline, return value of "unit" type. *) + + +(* Definitions can be chained with "let ... in" construct. + This is roughly the same to assigning values to multiple + variables before using them in expressions in imperative + languages. *) +let x = 10 in +let y = 20 in +x + y ;; + +(* Alternatively you can use "let ... in and ..." construct. + This is especially useful for mutually recursive functions, + with ordinary "let .. in" the compiler will complain about + unbound values. + It's hard to come up with a meaningful but self-contained + example of mutually recursive functions, but that syntax + works for non-recursive definitions too. *) +let a = 3 and b = 4 in a * b ;; + + +(** Operators **) + +(* There is little distintion between operators and functions. + Every operator can be called as a function. *) + +(+) 3 4 (* Same as 3 + 4 *) + +(* There's a number of built-in operators. One of unusual features is + that OCaml doesn't just refrain from any implicit conversions + between integers and floats, it also uses different operators + for floats. *) +12 + 3 ;; (* Integer addition *) +12.0 +. 3.0 ;; (* Floating point addition *) + +12 / 3 ;; (* Integer division *) +12.0 /. 3.0 ;; (* Floating point division *) +5 mod 2 ;; (* Remainder *) + +(* Unary minus is a notable exception, it's polymorphic. + However, it also has "pure" integer and float forms. *) +- 3 ;; (* Polymorphic, integer *) +- 4.5 ;; (* Polymorphicm float *) +~- 3 (* Integer only *) +~- 3.4 (* Type error *) +~-. 3.4 (* Float only *) + +(* You can define your own operators or redefine existing ones. + Unlike SML or Haskell, only selected symbols can be used + for operator names and first symbol defines associativity + and precedence rules. *) +let (+) a b = a - b ;; (* Surprise maintenance programmers *) + +(* More useful: a reciprocal operator for floats. + Unary operators must start with "~" *) +let (~/) x = 1.0 /. x ;; +~/4.0 (* = 0.25 *) + + +(** Built-in datastructures *) + +(* Lists are enclosed in square brackets, items are separated by + semicolons. *) +let my_list = [1; 2; 3] ;; + +(* Tuples are (optionally) enclosed in parantheses, items are separated + by commas *) +let first_tuple = 3, 4 ;; +let second_tuple = (4, 5) ;; + +(* Corollary: if you try to separate list items by commas, you get a list + with a tuple inside, probably not what you want. *) +let bad_list = [1, 2] ;; (* Becomes [(1, 2)] *) + +(* You can access individual list items with List.nth function *) +List.nth my_list 1 ;; + +(* You can add an item to the beginning of a list with "::" constructor + often referred to as "cons". *) +1 :: [2; 3] ;; (* Gives [1; 2; 3] *) + +(* Arrays are enclosed in [| |] *) +let my_array = [| 1; 2; 3 |] ;; + +(* You can access array items like this: *) +my_array.(0) ;; + + + +(** Data types *) + +(* You can define types with "type some_type =" construct. Like in this + useless type alias: *) +type my_int = int ;; + +(* More interesting types include so called type constructors. + Constructors must start with a capital letter. *) +type ml = OCaml | StandardML ;; +let lang = OCaml ;; (* Has type "ml" *) + +(* Type constructors don't need to be empty. *) +type my_number = PlusInfinity | MinusInfinity | Real of float ;; +let r0 = Real -3.4 ;; (* Has type "my_number" *) + +(* Can be used to implement polymorphic arithmetics. *) +type number = Int of int | Float of float ;; + +(* Point on a plane, essentially a type-constrained tuple *) +type point2d = Point of float * float ;; +let my_point = Point (2.0, 3.0) ;; + +(* Types can be parametrized, like in this type for "list of lists + of anything". 'a can be substituted with any type. *) +type 'a list_of_lists = 'a list list ;; +type int_list_list = int list_of_lists ;; + +(* Types also can be recursive. Like in this type analogous to + built-in list of integers. *) +type my_int_list = EmptyList | IntList of int * my_int_list ;; +let l = Cons (1, EmptyList) ;; + + +(** Pattern matching *) + +(* Pattern matching is somewhat similar to switch statement in imperative + languages, but offers a lot more expressive power. + + Even though it may look complicated, it really boils down to matching + an argument against an exact value, a predicate, or a type constructor. The type system + is what makes it so powerful. *) + +(* Matching exact values. "_" means "anything" *) +let is_zero x = + match x with + | 0 -> true + | _ -> false +;; + +(* Alternatively, you can use "function" keyword *) +let is_one x = function +| 1 -> true +| _ -> false +;; + +(* Matching predicates, aka "guarded pattern matching" *) +let abs x = + match x with + | x when x < 0 -> -x + | _ -> x +;; + +abs 5 ;; (* 5 *) +abs (-5) (* 5 again *) + +(* Matching type constructors *) + +type animal = Dog of string | Cat of string ;; + +let say x = + match x with + | Dog x -> x ^ " says woof" + | Cat x -> x ^ " says meow" +;; + +say (Cat "Fluffy") ;; (* "Fluffy says meow" *) + +(* Traversing data structures *) + +(* Recursive types can be traversed with pattern matching easily. + The cons thing ("::") that is used with built-in lists is actually a + type constructor, except it can be used in infix form, unlike + user-defined constructors. So you can use it like this: *) + +let rec sum_list l = + match l with + | [] -> 0 + | head :: tail -> head + (sum_list tail) +;; + +sum_list [1; 2; 3] ;; + +(* Built-int syntax for cons obscures the structure a bit, so we'll make + our own list for demonstration. *) + +type int_list = Nil | Cons of int * int_list ;; +let rec sum_int_list l = + match l with + | Nil -> 0 + | Cons (head, tail) -> head + (sum_int_list tail) +;; + +let t = Cons (1, Cons (2, Cons (3, Nil))) ;; +sum_int_list t ;; + +``` + +## Further reading + +* Visit the official website to get the compiler and read the docs: http://ocaml.org/ +* Try interactive tutorials and a web-based interpreter by OCaml Pro: http://try.ocamlpro.com/ +* Read "OCaml for the skeptical" course: http://www2.lib.uchicago.edu/keith/ocaml-class/home.html -- cgit v1.2.3 From 9f3bff9ce85ea95073f8a90397195c841d9fce23 Mon Sep 17 00:00:00 2001 From: Daniil Baturin Date: Wed, 10 Sep 2014 21:33:41 +0700 Subject: Fix some typos/errors in the OCaml tutorial. --- ocaml.html.markdown | 112 ++++++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/ocaml.html.markdown b/ocaml.html.markdown index ae862f08..3c9593d4 100644 --- a/ocaml.html.markdown +++ b/ocaml.html.markdown @@ -14,7 +14,7 @@ the compiler is "ocamlc.opt". There is also a bytecode compiler, "ocamlc", but there are few reasons to use it. It is strongly and statically typed, but instead of using manually written -type annotations it infers types of expressions using Hindley-Milner algorithm. +type annotations, it infers types of expressions using Hindley-Milner algorithm. It makes type annotations unnecessary in most cases, but can be a major source of confusion for beginners. @@ -46,24 +46,24 @@ Note that type signatures of functions of multiple arguments are written in curried form. ```ocaml +(*** Comments ***) + (* Comments are enclosed in (* and *). It's fine to nest comments. *) -(* There are no single-line comments *) +(* There are no single-line comments. *) -(** Variables and functions *) +(*** Variables and functions ***) -(* Statements can be separated by double - semicolon symbol, ";;". +(* Expressions can be separated by a double semicolon symbol, ";;". In many cases it's redundant, but in this tutorial we use it after every expression for easy pasting into the interpreter shell. *) (* Variable and function declarations use "let" keyword. *) let x = 10 ;; -(* Since OCaml uses type inference, you normally don't need to - specify argument types explicitly. However, you can do it - if you want or need to. *) +(* Since OCaml compiler infers types automatically, you normally don't need to + specify argument types explicitly. However, you can do it if you want or need to. *) let inc_int (x: int) = x + 1 ;; (* You need to mark recursive function definitions as such with "rec" keyword. *) @@ -72,22 +72,13 @@ let rec factorial n = else factorial n * factorial (n-1) ;; -(* Function application usually doesn't need parantheses around arguments *) +(* Function application usually doesn't need parentheses around arguments *) let fact_5 = factorial 5 ;; -(* ...unless the argument is an expression *) +(* ...unless the argument is an expression. *) let fact_4 = factorial (5-1) ;; let sqr2 = sqr (-2) ;; -(* You can use multiple statements separated by semicolon in function body, - but the last expression becomes its return value. This is useful when - writing in imperative style. The simplest form of it is inserting a - debug print. *) -let print_and_return x = - print_endline (string_of_int x); - x -;; - (* Every function must have at least one argument. Since some funcions naturally don't take any arguments, there's "unit" type for it that has the only one value written as "()" *) @@ -102,6 +93,15 @@ let make_inc x y = x + y ;; (* make_inc is int -> int -> int *) let inc_2 = make_inc 2 ;; (* inc_2 is int -> int *) inc_2 3 ;; (* Evaluates to 5 *) +(* You can use multiple expressions in function body. + The last expression becomes the return value. All other + expressions must be of the "unit" type. + This is useful when writing in imperative style, the simplest + form of it is inserting a debug print. *) +let print_and_return x = + print_endline (string_of_int x); + x +;; (* Since OCaml is a functional language, it lacks "procedures". Every function must return something. So functions that @@ -117,7 +117,7 @@ let x = 10 in let y = 20 in x + y ;; -(* Alternatively you can use "let ... in and ..." construct. +(* Alternatively you can use "let ... and ... in" construct. This is especially useful for mutually recursive functions, with ordinary "let .. in" the compiler will complain about unbound values. @@ -127,28 +127,28 @@ x + y ;; let a = 3 and b = 4 in a * b ;; -(** Operators **) +(*** Operators ***) (* There is little distintion between operators and functions. Every operator can be called as a function. *) (+) 3 4 (* Same as 3 + 4 *) -(* There's a number of built-in operators. One of unusual features is +(* There's a number of built-in operators. One unusual feature is that OCaml doesn't just refrain from any implicit conversions between integers and floats, it also uses different operators for floats. *) -12 + 3 ;; (* Integer addition *) -12.0 +. 3.0 ;; (* Floating point addition *) +12 + 3 ;; (* Integer addition. *) +12.0 +. 3.0 ;; (* Floating point addition. *) -12 / 3 ;; (* Integer division *) -12.0 /. 3.0 ;; (* Floating point division *) -5 mod 2 ;; (* Remainder *) +12 / 3 ;; (* Integer division. *) +12.0 /. 3.0 ;; (* Floating point division. *) +5 mod 2 ;; (* Remainder. *) (* Unary minus is a notable exception, it's polymorphic. However, it also has "pure" integer and float forms. *) - 3 ;; (* Polymorphic, integer *) -- 4.5 ;; (* Polymorphicm float *) +- 4.5 ;; (* Polymorphic, float *) ~- 3 (* Integer only *) ~- 3.4 (* Type error *) ~-. 3.4 (* Float only *) @@ -156,34 +156,34 @@ let a = 3 and b = 4 in a * b ;; (* You can define your own operators or redefine existing ones. Unlike SML or Haskell, only selected symbols can be used for operator names and first symbol defines associativity - and precedence rules. *) -let (+) a b = a - b ;; (* Surprise maintenance programmers *) + and precedence rules. *) +let (+) a b = a - b ;; (* Surprise maintenance programmers. *) (* More useful: a reciprocal operator for floats. - Unary operators must start with "~" *) + Unary operators must start with "~". *) let (~/) x = 1.0 /. x ;; ~/4.0 (* = 0.25 *) -(** Built-in datastructures *) +(*** Built-in datastructures ***) (* Lists are enclosed in square brackets, items are separated by semicolons. *) let my_list = [1; 2; 3] ;; -(* Tuples are (optionally) enclosed in parantheses, items are separated - by commas *) -let first_tuple = 3, 4 ;; +(* Tuples are (optionally) enclosed in parentheses, items are separated + by commas. *) +let first_tuple = 3, 4 ;; (* Has type "int * int". *) let second_tuple = (4, 5) ;; (* Corollary: if you try to separate list items by commas, you get a list with a tuple inside, probably not what you want. *) let bad_list = [1, 2] ;; (* Becomes [(1, 2)] *) -(* You can access individual list items with List.nth function *) +(* You can access individual list items with the List.nth function. *) List.nth my_list 1 ;; -(* You can add an item to the beginning of a list with "::" constructor +(* You can add an item to the beginning of a list with the "::" constructor often referred to as "cons". *) 1 :: [2; 3] ;; (* Gives [1; 2; 3] *) @@ -195,20 +195,20 @@ my_array.(0) ;; -(** Data types *) +(*** User-defined data types ***) -(* You can define types with "type some_type =" construct. Like in this +(* You can define types with the "type some_type =" construct. Like in this useless type alias: *) type my_int = int ;; (* More interesting types include so called type constructors. Constructors must start with a capital letter. *) type ml = OCaml | StandardML ;; -let lang = OCaml ;; (* Has type "ml" *) +let lang = OCaml ;; (* Has type "ml". *) (* Type constructors don't need to be empty. *) type my_number = PlusInfinity | MinusInfinity | Real of float ;; -let r0 = Real -3.4 ;; (* Has type "my_number" *) +let r0 = Real (-3.4) ;; (* Has type "my_number". *) (* Can be used to implement polymorphic arithmetics. *) type number = Int of int | Float of float ;; @@ -222,13 +222,13 @@ let my_point = Point (2.0, 3.0) ;; type 'a list_of_lists = 'a list list ;; type int_list_list = int list_of_lists ;; -(* Types also can be recursive. Like in this type analogous to +(* Types can also be recursive. Like in this type analogous to built-in list of integers. *) type my_int_list = EmptyList | IntList of int * my_int_list ;; let l = Cons (1, EmptyList) ;; -(** Pattern matching *) +(*** Pattern matching ***) (* Pattern matching is somewhat similar to switch statement in imperative languages, but offers a lot more expressive power. @@ -237,20 +237,21 @@ let l = Cons (1, EmptyList) ;; an argument against an exact value, a predicate, or a type constructor. The type system is what makes it so powerful. *) -(* Matching exact values. "_" means "anything" *) +(** Matching exact values. **) + let is_zero x = match x with | 0 -> true - | _ -> false + | _ -> false (* The "_" pattern means "anything else". *) ;; -(* Alternatively, you can use "function" keyword *) +(* Alternatively, you can use the "function" keyword. *) let is_one x = function | 1 -> true | _ -> false ;; -(* Matching predicates, aka "guarded pattern matching" *) +(* Matching predicates, aka "guarded pattern matching". *) let abs x = match x with | x when x < 0 -> -x @@ -260,7 +261,7 @@ let abs x = abs 5 ;; (* 5 *) abs (-5) (* 5 again *) -(* Matching type constructors *) +(** Matching type constructors **) type animal = Dog of string | Cat of string ;; @@ -270,24 +271,23 @@ let say x = | Cat x -> x ^ " says meow" ;; -say (Cat "Fluffy") ;; (* "Fluffy says meow" *) +say (Cat "Fluffy") ;; (* "Fluffy says meow". *) -(* Traversing data structures *) +(** Traversing datastructures with pattern matching **) (* Recursive types can be traversed with pattern matching easily. - The cons thing ("::") that is used with built-in lists is actually a - type constructor, except it can be used in infix form, unlike - user-defined constructors. So you can use it like this: *) - + Let's see how we can traverse a datastructure of the built-in list type. + Even though the built-in cons ("::") looks like an infix operator, it's actually + a type constructor and can be matched like any other. *) let rec sum_list l = match l with | [] -> 0 | head :: tail -> head + (sum_list tail) ;; -sum_list [1; 2; 3] ;; +sum_list [1; 2; 3] ;; (* Evaluates to 6 *) -(* Built-int syntax for cons obscures the structure a bit, so we'll make +(* Built-in syntax for cons obscures the structure a bit, so we'll make our own list for demonstration. *) type int_list = Nil | Cons of int * int_list ;; -- cgit v1.2.3 From b2cf2228b3843a2015b3badbb550faf47fcb0404 Mon Sep 17 00:00:00 2001 From: Daniil Baturin Date: Wed, 10 Sep 2014 21:40:47 +0700 Subject: One more fix in the OCaml tutorial. --- ocaml.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocaml.html.markdown b/ocaml.html.markdown index 3c9593d4..fd7ca36e 100644 --- a/ocaml.html.markdown +++ b/ocaml.html.markdown @@ -217,7 +217,7 @@ type number = Int of int | Float of float ;; type point2d = Point of float * float ;; let my_point = Point (2.0, 3.0) ;; -(* Types can be parametrized, like in this type for "list of lists +(* Types can be parameterized, like in this type for "list of lists of anything". 'a can be substituted with any type. *) type 'a list_of_lists = 'a list list ;; type int_list_list = int list_of_lists ;; -- cgit v1.2.3 From 146e6a4ac13f0ff6353879e7b42dfaa2a6725011 Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Wed, 10 Sep 2014 17:35:30 +0200 Subject: Update ocaml.html.markdown --- ocaml.html.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ocaml.html.markdown b/ocaml.html.markdown index fd7ca36e..3dbf5a10 100644 --- a/ocaml.html.markdown +++ b/ocaml.html.markdown @@ -1,5 +1,5 @@ --- -language: "OCaml" +language: OCaml contributors: - ["Daniil Baturin", "http://baturin.org/"] --- @@ -20,6 +20,7 @@ source of confusion for beginners. When you are in the top level loop, OCaml will print the inferred type after you enter an expression. + ``` # let inc x = x + 1 ;; val inc : int -> int = @@ -42,6 +43,7 @@ val inc : int -> int val add : int -> int -> int val a : int ``` + Note that type signatures of functions of multiple arguments are written in curried form. -- cgit v1.2.3 From 1d5533f45b4b123920e633064b23332039335f7e Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Wed, 10 Sep 2014 17:37:17 +0200 Subject: Fix up links. --- ocaml.html.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ocaml.html.markdown b/ocaml.html.markdown index 3dbf5a10..c104823a 100644 --- a/ocaml.html.markdown +++ b/ocaml.html.markdown @@ -306,6 +306,6 @@ sum_int_list t ;; ## Further reading -* Visit the official website to get the compiler and read the docs: http://ocaml.org/ -* Try interactive tutorials and a web-based interpreter by OCaml Pro: http://try.ocamlpro.com/ -* Read "OCaml for the skeptical" course: http://www2.lib.uchicago.edu/keith/ocaml-class/home.html +* Visit the official website to get the compiler and read the docs: +* Try interactive tutorials and a web-based interpreter by OCaml Pro: +* Read "OCaml for the skeptical" course: -- cgit v1.2.3