Next uses Semantic Versioning. In short, given a version number MAJOR.MINOR.PATCH, we increment the:
- MAJOR version when we make incompatible API changes,
- MINOR version when we add functionality in a backwards-compatible manner, and
- PATCH version when we make backwards-compatible bug fixes.
- Add a jump to heading command that works across all open tabs
- There should be a package manager/repository where creators of packages can publish, and users can download
- This technology will probably be built ontop of Quicklisp
- Add support for per-tab Proxy and Tor support
- Add an integrated password manager
- Add simple built-in editor capabilities so that you can easily script Next without opening up an external editor
- Also use the editor for text-field input on the internet
- Rename project to Nyxt.
This name is more “searchable” on the Web. It’s also reasonably
“backward-compatible” with “Next”.
Note that the persisted files have changed location. You might have to move the configuration file and the local files according. By default:
- ~/.config/next -> ~/.config/nyxt
- ~/.local/share/next -> ~/.local/share/nyxt
- Improve macOS performance
The WebKitGTK+ port for macOS has been improved with complete
support for the Quartz backend. This significantly improves
start-up time and allows for native rendering (no need for XQuartz)
Fix some issues with strange keys emitted on macOS from the keyboard: this has been resolved through the usage of the “Unicode Hex Input” keyboard input option.
- Improve macOS distribution
It is now possible to create a standalone application bundle for
Nyxt using the
darwin-app.asd
. It is also possible to create pkg bundles for distribution via MacPorts. - Replace D-Bus-based architecture with an FFI architecture. As a result, there is only one exectuable needed to run Nyxt and no more need for D-Bus. This should simplify installation, remove many performance bottlenecks and fix the mouse and keyboard issues.
- New
auto-mode
to automatically load a configured set of modes for matching URLs. For instance, this can tell Nyxt to automatically enable proxy-mode when navigating to Wikipedia and disable it otherwise. The rules can be persisted for future use. - New
tutorial
andmanual
commands. - Keybindings bind to function symbols and not functions (i.e.
'foo
and not#'foo
). Make sure to usenyxt:make-keymap
if you want type-checking on binding creation. - Change key string specifications: all lowercase without underscore. For instance “Page_Up” becomes “pageup”.
- Keycode bindings: Use the “#N” syntax to bind the N keycode to a command.
Example:
(define-key *my-keymap* "C-#10" #'nyxt/web-mode::copy-url)
. - Keymaps must be named, e.g.
(keymap:make-keymap "my-map")
. - Modes
keymap-scheme
must now be set with eitherkeymap:make-scheme
ordefine-scheme
. Schemes are now first-class objects. Default schemescua
,emacs
,vi-normal
andvi-insert
are in thescheme
package. Thus it’s enough to complete overscheme:
to list them all. - Add status view and message view to display buffer status and messages
respectively.
The status view can be customized with the
status-formatter
window slot. Thestatus-buffer
slot has been removed. The status view has interactive buttons. - Report user configuration errors in a Nyxt web view. Users don’t have to check the shell output anymore.
- New
fill-input-from-external-editor
command. - New
set-url-from-current-url
command. - New
force-https-mode
to enforce HTTPS everywhere. Websites that don’t have a certificate will fail to load (this is by design, since those websites are deemed insecure). - New
lisp-repl
command to evaluate Lisp, introspect and modify Nyxt while it’s running, from the browser itself! This supersedes the removedevaluate-lisp
command. - New
list-buffers
command. - Rename
certificate-whitelist-mode
tocertificate-exception-mode
as well as thecertificate-whitelist
slot tocertificate-exceptions
and*default-certificate-whitelist*
to*default-certificate-exceptions*
. - Add
certificate-exception-mode
to the default modes. In case of certificate error, calladd-domain-to-certificate-exceptions
followed by a reload if you understand the risks and you want to bypass the error.The
certificate-exceptions
slot is now a list of strings. - Make current URL the first candidate in
set-url-*
commands. - New
reading-line-mode
. - New
scheme:cua
default binding scheme. You can still use the former defaultscheme:emacs
withemacs-mode
. - Most URLs are now of the
quri:uri
type instead of the string type. This allows for convenient URL manipulation, such as domain or scheme extraction. This also allows us to systematically print hex-encoded URLs properly. - Turn
resource-query-function
into a composable hook,request-resource-hook
, which supports changing the URI of the request. - Bindings like
control-button1
to open a link in a new buffer can be customized in the newrequest-resource-scheme
keymap scheme of thebuffer
class. - Sessions are now saved in XDG_DATA_HOME/nyxt/sessions/. Default session is
default.lisp
. The command line option--session
has been replaced by the more general--with-path
(e.g.--with-path session=/path/to/session
). - Sessions are restored lazily. This fixes the long hang on startup.
- Session buffer titles are also restored.
- Command line options: New
--load
option to load a Lisp file,--eval
and--load
can be specified multiple times, the--remote
option allows evaluating--eval
and--load
in a running instance (ifremote-execution-p
is non-nil). New--script
command line option that can be used in shabang to write “Nyxt scripts.” - New
autofill
command to insert predefined content in text fields. - Remove SQLite importers and dependency.
- Fix out-of-sync buffer title.
- New
current-window
function. - Rename the
*-inspect
documentation commands todescribe-*
. - New documentation commands:
describe-function
(works on macros),describe-slot
,describe-class
,describe-key
,describe-bindings
. - Documentation commands list only exported symbols from
:nyxt
, but all symbols from:nyxt-user
. - New
define-configuration
macro. See its documentation withdescribe-function
. - Remove the
get-default
kludge. Usedefine-configuration
instead. define-parenscript
now takes any lambda-list and does not take the implicit%callback
argument anymore.help-mode
is now part of its own package,nyxt/help-mode
, like any other mode.- Remove
total-window-count
andtotal-buffer-count
accessors (they are implementation details). - Improve performance and completeness of element hinting.
- Fix zooming issues.
- New
open-inspector
command to bring up the web inspector. - New
spell-check-*
commands. To be continued. - Add
base-mode
and move all base key bindings fromroot-mode
tobase-mode
. - Ensure that all commands belong to their appropriate namespace. In
particular, all webview-related commands now belong to
nyxt/web-mode
(zooming, searching, hinting, etc.) and minibuffer commands belong tonyxt/minibuffer-mode
. - Transparent GPG-encrypted file persistence when files have a
.gpg
extension. This makes it possible to keep bookmarks, history, session, etc. in encrypted files. - Change completion function for bookmark tags. Press
tab
to complete the tag at point. Re-bookmarking an existing entry allows for changing the existing tags. - Search engines can be
tab
-completed when there is only one word in theset-url
minibuffer input and the first suggestion is selected. - Search engines are now class objects constructed with
make-search=engine
. - Password manager commands default to current domain.
- Default package is
:nyxt-user
in configuration but also in command line evaluation and in scripts. - Support
data-profiles
. Adata-profile
can be used to specify a group of settings for data paths by specializing theexpand-data-path
method.Add
--data-profile
and--list-data-profiles
command line options.
- Add
certificate-whitelist-mode
. (Thanks to Alexander Egorenkov.)This mode temporarily authorizes invalid certificates for the current buffer (e.g. TLS certificates).
The mode can also be enabled for all buffers with a custom whitelist so that the whitelisting is remembered across sessions.
- Add
enable-hook-handler
anddisable-hook-handler
commands.This is particularly convenient to temporarily disable hooks that are set in the
init.lisp
file. - Overhaul buffer search to behave in a Helm/Ivy fashion.
- Add
search-buffers
command to search across the given buffers. (Thanks to Chris Bøg.) - Add
delete-other-buffers
command. (Thanks to Chris Bøg.) - Sort buffer by last-access time.
In particular, the latest buffer buffer will be popped when deleting the current buffer.
- Display log messages in
*Messages*
buffer. (Thanks to Bruno Cichon.) - Show source location with
command-inspect
. (Thanks to Bruno Cichon.) - Fix define-mode when there is no docstring. (Thanks to Chris Bøg.)
- Fix tab-insert on candidates.
- Rename “link-hint” to “element-hint”.
- Fix updating echo area on buffer change.
- CLOS-style configuration.
This simplifies setting the default slots of the various classes (buffer
,
window
, interface
, minibuffer
, etc.). In particular, the
user-specialized (or extension-specialized) classes can in turn be composed to
form a new specialized classes.
- Revamped hook system. (Backward incompatible.)
Hooks are now simpler to use but also more powerful. In particular, handlers can be typed and composed. See the manual for examples.
- Link hints: Add fuzzy-completion over titles and URLs.
- New
--eval
command line argument. - New delete-all-buffers command.
- Open directories, music and videos directly from Next.
- VCS: More checks and notifications.
- Deprecate video-mode and move it to its own repository (https://github.com/atlas-engineer/nx-video).
- Complete search-engine names with Tab.
- Display package in
execute-command
candidate list. - New
+platform-port-command+
global. - More minibuffer default bindings.
Bind
C-Right
,C-Left
,Home
,End
in the minibuffer. - Remove history duplicates.
- Scroll page with an offset by default.
Offset is configurable in the
page-scroll-ratio
buffer slot. - New command line parameter
--session
to skip loading the previous session. - Password manager fixes. (Thanks to Rune Juhl Jacobsen.)
- Bug fixes.
- Don’t reload page when there is no history change.
- Omit extra space in search engine queries.
- Show if new or current buffer in
set-url
prompt (Thanks to Rune Juhl Jacobsen). - Fix minibuffer performance hog.
- Fix element hint performance.
- Buttons hints can now be followed.
- Fix element hint rendered offscreen on a scaled display.
- Display number of (marked) candidates in minibuffer.
- Improve fuzzy search performance and relevance.
- Swap
C-x k
andC-x C-k
bindings to match Emacs’ behaviour. - Fix platform port lookup failure on startup when looked up in PATH.
- Fix default-hostlist path in pre-compiled binaries.
- Fix compound tags lookup for bookmarks.
- Fix history update on Javascript-loaded pages (e.g. GitHub).
- Select multiple candidates in minibuffer
The default bindings are:
C-SPACE
to toggle the mark of an entry,M-a
to mark all visible entries,M-u
to unmark all visible entries.
- Extend bookmark support.
- Bookmarks can have tags, a shortcut string, a search-url and a timestamp.
- Minibuffer usage:
wiki
: Open the Wikipedia main page.wiki elephant
: search Wikipedia for “elephant”.
- Switch from SQLite to an s-exp based text file.
A bookmark entry is stored as follwos:
(:url "https://en.wikipedia.org/wiki/Main_Page" :title "Wikipedia, the free encyclopedia" :shortcut "wiki" :search-url "http://en.wikipedia.org/wiki/Special:Search?search=%s" :date "Sat Jul 14 09:41:56 2018" :tags '("encyclopedia" "knowledge" "wiki"))
- Bookmark can have search engines.
interface
search engines and bookmark search engines are automatically merged. - Bookmarks can be stored and restored in a customizable format.
See the
bookmarks-store-function
andbookmarks-restore-function
ininterface
.
- Password manager. (Thanks to Solomon Bloch.)
See the commands
save-new-password
andcopy-password
.Support for multiple backends. Currently:
- Session persistence
The “user session”, that is, the list of buffers and their tree-histories, is now automatically persisted. Upon restarting Next, the previously open buffers will automatically be restored.
- New
quit-after-clearing-session
command. - New
download-video
command. It is a wrapper around the youtube-dl program. - New
vcs-clone
command to clone Git repositories to a prefered or queried location. - New
reopen-buffer
andreopen-last-buffers
commands. (Thanks to @4t0m.) - Faster and improved minibuffer fuzzy completion.
- New customizable
startup-function
. - New history tree commands:
buffer-history-tree
,history-forwards-maybe-query
,history-backwards-query
,history-all-query
. - New
delete-history-entry
command. - New
next-user
package, left for the user to use in their initialization file. - New
--no-init
,-Q
command line argument. - New
messages
command to show all the echoed messages. - Bind
M-:
tocommand-evaluate
. - Bind
s-button1
to open URL in background. - Fix clicking in text areas to stick to vi-insert-mode. (Thanks to @4t0m.)
- Downcase command name in
execute-command
. - Move the
search-engines
slot from thewindow
class to theinterface
class. - Rename
new-buffer
,new-window
andmake-visible-new-buffer
tomake-buffer
,make-window
andmake-buffer-focus
. - Rename
document-mode
toweb-mode
. - Rename
history-db-path
andbookmark-db-path
tohistory-path
andbookmarks-path
respectively. - Remove broken
:mode
argument fromdefine-key
. - Deprecate calling
define-key
without a keymap argument. - Rename buffer slot
title
tourl
, removebuffer-get-url
and deprecate%buffer-get-title
.
- Hooks for commands, modes and various UI or networking events.
Hooks are lists which the user can fill with handlers to perform arbitrary actions on specific events, such as after the creation of a buffer, on start/exit, when a download has finished, before/after the execution of any command, or when enabling/disabling a mode.
Note: Hooks are still experimental and their API is likely to change in the future.
- New
open-file
command (C-x C-f
).This new command allows to open a file from the file system.
The user is prompted with the minibuffer, files are browsable with the fuzzy completion.
The default directory is the one from the download manager.
Press
Enter
to visit a file,M-Left
orC-l
to go one directory up,M-Right
orC-j
to browse the directory at point.By default, it uses the
xdg-open
command. The user can override thenext:*open-file-function*
variable with a new function, which takes the filename (or directory name) as parameter. See the manual for an example.The default keybinding is
C-x C-f
.Note: This feature is experimental and is meant to grow in future versions of Next!
- New
paste-from-ring
command. (Thanks to Solomon Bloch.)All copied text snippets are saved in a clipboard “ring.” Any snippet can be fuzzy-searched and pasted later.
- New
minibuffer-history
command (M-p
).This allows to fuzzy-search the history of minibuffer inputs. Some minibuffers may use their own history, otherwise they use the default. For instance, the
set-url-*
history includes the current URL, so that pressingC-l M-p RET
brings up the current URL in the input, ready for editing. - Improve minibuffer performance when loading many candidates.
- Fix minibuffer scrolling to feel more natural.
- Reduce minibuffer height when there is no completion function (e.g. link hints).
- Add
next-init-time
command.
And the title is matched when fuzzy-searching a buffer!
This can be configured by setting (open-external-link-in-new-window-p
*interface*)
to the desired boolean.
When killing the last created buffer, we were brought back to the first one, so usually the help buffer. This is now fixed, we stay at the previous last created buffer, as expected.
- In the minibuffer, using
M-backspace
to delete a word didn’t respect whitespaces. It is fixed. - Its behaviour was also too different than other common tools, like
Firefox. Now:
- it deletes the trailing word delimiter;
- it removes all trailing delimiters plus one word.
- Keypad keys were added. The PyQt port requires an update.
The Next Guix channel can be safely removed from your
~/.config/guix/channels.scm
before running a guix pull
.
- Mouse
button2
(middle click) opens a URL in a new buffer/window.
It is now properly set to ~/.local/share/next/next-gtk-webkit.log
by default.
Yes, this is better for a daily usage :)
You can now write this to open pages in proxy-mode by default:
(setf (get-default 'proxy-mode 'server-address) "socks5://localhost:1080")
(add-to-default-list 'proxy-mode 'buffer 'default-modes)
Thanks to @MasterCsquare.
Next uses its own installation path for the Quicklisp dependencies, it
doesn’t mesh with your existing ~/quicklisp/local-projects
. Now you
can follow git master without the suprise of a library missing a
function.
Now we mostly rely on str and cl-ppcre.
QtWebengine is based off Blink (the renderer of Chrome). A PyQt platform port would have the benefits of being cross-platform while offering an alternative web renderer.
Because of WKWebKit library limitations, the cocoa-webkit platform port misses some features such as proxy support, per-buffer cookie file, network resource interception. To address these limitations, the PyQt platform port could become the default for macOS.
Only host-based for now and uses Easylist by default.
It now displays search hints properly and search within iframes too.
This makes it possible to use Next over Tor among others.
This increases security and should also improve performance, notably on *BSD systems.
define-parenscript
supersedes it.
Next will try harder to “do the right thing” when starting.
A simple (next:start)
from the REPL should be enough in most cases.
- C-w copies any candidate
- TAB inserts the candidate in the minibuffer.
- C-v and M-v scroll pages up and down.
- C-x C-k deletes the current buffer.
- C-left, C-right, C-Page_Up and C-Page_Down go to previous/next buffer.
It used to be hard-coded, now it’s found in ~/.config/next/init.lisp.
This does not require an Internet connection.
The WKWebKit library is too poor for our use in Next. Cocoa-webkit will be replaced with a QtWebengine platform port in a coming version.
In particular, removes a race condition that would often hang the browser on key presses.
Most globals are gone.
Everything is properly initialized just-in-time so that it won’t fail if the
user forgets to initialize something manually.
(next:start)
can safely be run multiple times in a row while producing the
same result.
Fall back to a search engine query if input is not a URI. Add support for multiple search engines.
Due to limitations in the WKWebview API, the Cocoa version lacks proxy support.
This makes it possible to implement, for instance, ad-blocking, fully from the Lisp side.
Due to limitations in the WKWebview API, the Cocoa version lacks the ability to do any processing on a per URI resource basis. The consequence of this means no Adblocking, no Downloads.
Catch SIGTERM (C-c in a shell), kill the interface on exit, etc.
Next will now try to find free ports automatically. It will find the platform ports automatically if run from source. Platform port polling is only done for a limited time to avoid hung processes.
In particular, some errors are reporting in the echo area.
Though it works on macOS, WebkitGTK+ is very slow since it does not utilize the native graphical frameworks/libraries. Users can see our Macports subtree to install WebkitGTK+ and compile Next manually.
Both macros are merged into define-parenscript
.
As per the specifications, -
is not a valid XML-RPC character in method names.
It reports the commit hash if it was not built on a tag version.
GTK implementation has per-buffer cookie support.
Due to limitations in the WKWebview API, the Cocoa version lacks the ability to specify a per-buffer or application-wide cookies directory.
For instance cursor-forwards-word
is bound to M-f
by default.
It now builds out of the box, with no need for external libraries.
See /tmp/next-webkit-gtk.log by default.
Debug message can be included by exporting the G_MESSAGES_DEBUG=all
environement variable.
- Create frontend that renders the new Next GUI
- Create frontend that renders the new Next GUI
- Create abstract interface for controlling frontends.
- Interface must be asynchronous
- Interface should be connection agnostic, should support BSD style sockets for first iteration, and Unix domain sockets for second iteration
- Implement functionality similar to the famous Hydra package by Oleh Krehel
- Model Hook system similar to the Emacs style hooks (https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html)
- Allow user to use a (input* ()) type binding in which they can prompt the user for input rather than the current style which involves setting the input handling as part of the lambda registered in the keybinding
- Convert existing functions to use continuation passing style input
- Implement define-command macro with overhaul for how keybindings are set/handled in functions
- Convert all user invokable functions to use define-command
- Based on the spec here: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
- Create GNU/Linux GTK Port
- Compilation loading of Quicklisp should check both ~/.quicklisp as well as ~/quicklisp and load whichever it finds first
- Create an example in the Documents directory that details the creation of a simple mode, and a way of customizing Next
- Implement something akin to ijump which allows you to jump to any heading on a given page represented by H1 H2 H3 tag etc
- Add ability to search within the buffer
- Minibuffer should allow searching via a search engine
- The buffer should contain a list of all of the modes that have been applied to it, so that no memory is lost when switching modes
- Add slime support to the compiled version of Next
- Allow function to reload init
- Add basic help system that can be extended
- Add the ability to look up global variables
- Allow user to manually enter the bookmark URL into the minibuffer directly
- Allow the user to create a bookmark from a link-hint anchor
- Should be able to move up and down through candidates using C-n and C-p
- Minibuffer should return actual object in question instead of doing strange magic with strings
- Allow the setting of the Minibuffer text
- Setup the automatic clearing of the Minibuffer previous text
- user should be able to navigate all links entirely by keyboard
- user should be able to open link hints in a new buffer with focus
- user should be able to open link hints in a new buffer without focus
- Allow keybinding invocation within repl overriding ccl cocoa IDE
- History will be stored in a DB (possibly sqlite)
- History has a query language that can be used to look for different things (e.g. date, include exclude regex, etc)
- Because history is stored in sqlite DB, user can create queries against their history
- History should be suggested by set-url
- Minibuffer input should be able to handle different use cases for different input methods
- Update manual with latest capabilities and changes to codebase
- Break apart QT code into separate file
- Remove all top-level side effects
- Modularize GUI backend
- Use CCL Cocoa Library to use native WebKit backend
- Bookmarks will be stored in a DB (possibly sqlite) with information about them, they’ll be navigable via a completion buffer
- Write basic information and configuration within the manual as a “users” guide
- Create much clearer picture of how everything functions together, make cleaner architecture diagrams showing how everything links together
- Document all functions
- Modify make.lisp script to create a binary that grabs all of the dependencies and creates a executable that can be deployed on OSX
- Use `macdeployqt` to copy the core qt libraries to `Next.app/Contents/Frameworks`
- Use `otool -L Next.app/Contents/MacOS/next` to find the linked frameworks that are not located in `Next.app/Contents/Frameworks`, manually copy them to `Next.app/Contents/Frameworks`
- Use install_name_tool to update the now copied frameworks in `Next.app/Contents/Frameworks`
- For more info please see: http://doc.qt.io/qt-5/osx-deployment.html
- Add function to kill buffer, bind to C-k
- Create a mode that allows traversal of the tree created in the history of a document-mode buffer
- forwards and backwards navigation creating new nodes and
traversals. This will allow for all points in history to be reachable, and a future expansion designed to recreate the functionality offered by undo-tree: https://www.emacswiki.org/emacs/UndoTree
- using the key binding M-f, and M-b for forward and backward respectively
- should only work if there is one child
- If a user tries to navigate forward but there is more than one possible destination available, show the possibilities as an auto-completable list in the minibuffer
- Convert struct usage to CLOS
- The ability to scroll up and down within a document
- using C-n to scroll down
- using C-p to scroll up
- Implementation of document-mode, the major-mode that all modes extend
- Ability to set key bindings for major modes
- Ability to browse and change buffers using C-x b
Buffer: All documents are contained in an object type called a buffer. As an example, a document on the web located at http://www.url.com can be contained in a buffer with a similar name. A buffer is composed of all elements (text, bitmaps, etc) necessary to render a single document.
Mode-map: A keyboard hot-key to function mapping.
Minibuffer: A special buffer dedicated to interacting with Next commands in progress. This buffer appears at the bottom of the screen and is collapsed when not in use.
Major-mode: A major mode is defined as the primary mode of interacting with a particular buffer. A mode defines a set of key bindings, hooks for actions, and presentation details for a given view. At any given time, there may only be one major mode for a buffer. All major modes are composed of entirely lower case alpha with dashes used as a separator. Every major mode has a keyboard mapping that follows this pattern: document-mode, will have a mode map called document-mode-map.
Minor-mode: A minor mode is a secondary mode of modifying a buffer’s behavior and content. There can be an infinite amount of minor modes applied to a given buffer. All minor modes are composed of entirely lower case alpha with dashes used as a separator.
All major modes inherit from document mode. Document mode provides the basic framework for mapping global commands and defining general behavior.Document-mode will be the basic major mode for opening documents on the web. document-mode will extend document-mode, and thus will inherit all of its key bindings. If there is a conflict of key bindings, the lowest scope key binding will be prioritized. As a concrete example, all bindings defined in a minor mode will override any defined in document-mode. In the first release, document-mode will support the following key bindings and features:
For the first release, document-mode must have:
Opening of new pages in the same buffer can be invoked by the key binding C-l. This key binding will open up the Minibuffer and prompt the user to enter the url which they would like to visit. Opening of new buffers by invoking M-l will open the Minibuffer. Within the Minibuffer, the user will be presented with a prompt in which they can enter in the url they would like to visit in a new buffer.- May possibly switch implementation to “hide” rather than “close” widgets, possibly using a widget pool as well for memory performance
(define-key x-mode-map (key “C-h”) ‘function)
Where x-mode-map is a keymap relating to a mode (major or minor).
Where ‘function is a function that is passed to define-key to trigger a function upon a key press.
(key “C-h”) defines that the keyboard sequence Control + h is represented. For the keyboard syntax, the following keys are described:
- S = super key (windows/command key)
- C = control key
- M = meta key (alt key)
A chain of key bindings may be set in the following manner:
(key “C-x C-s”) will denote the following key presses, Ctrl + x, followed by Ctrl + s immediately thereafter.
Upon the definition of a “chained” keyboard binding, any elements in the chain may not be used individually. For example, binding “C-x C-s”, will prohibit the binding of “C-x” by itself. This is because there would be ambiguity in regards to which key binding is intended to be invoked.
The user will be able to invoke the key binding C-x b to bring up a menu in the Minibuffer in which they will be able to select a new buffer to bring to focus. Switch buffer should demonstrate an example of minibuffer completion candidates- One “click” build system for deployment on OSX
- Organization of build systems into lisp files, no shell scripts