Git Product home page Git Product logo

fish-shell's Introduction

fish - the friendly interactive shell Build Status Cirrus CI Build Status =================================================================================

fish is a smart and user-friendly command line shell for macOS, Linux, and the rest of the family. fish includes features like syntax highlighting, autosuggest-as-you-type, and fancy tab completions that just work, with no configuration required.

For downloads, screenshots and more, go to https://fishshell.com/.

Quick Start

fish generally works like other shells, like bash or zsh. A few important differences can be found at https://fishshell.com/docs/current/tutorial.html by searching for the magic phrase “unlike other shells”.

Detailed user documentation is available by running help within fish, and also at https://fishshell.com/docs/current/index.html

Getting fish

macOS

fish can be installed:

Note: The minimum supported macOS version is 10.10 "Yosemite".

Packages for Linux

Packages for Debian, Fedora, openSUSE, and Red Hat Enterprise Linux/CentOS are available from the openSUSE Build Service.

Packages for Ubuntu are available from the fish PPA, and can be installed using the following commands:

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish

Instructions for other distributions may be found at fishshell.com.

Windows

  • On Windows 10/11, fish can be installed under the WSL Windows Subsystem for Linux with the instructions for the appropriate distribution listed above under “Packages for Linux”, or from source with the instructions below.
  • Fish can also be installed on all versions of Windows using Cygwin (from the Shells category).

Building from source

If packages are not available for your platform, GPG-signed tarballs are available from fishshell.com and fish-shell on GitHub. See the Building section for instructions.

Running fish

Once installed, run fish from your current shell to try fish out!

Dependencies

Running fish requires:

  • A terminfo database, typically from curses or ncurses (preinstalled on most *nix systems) - this needs to be the directory tree format, not the "hashed" database. If this is unavailable, fish uses an included xterm-256color definition.
  • some common *nix system utilities (currently mktemp), in addition to the basic POSIX utilities (cat, cut, dirname, file, ls, mkdir, mkfifo, rm, sort, tee, tr, uname and sed at least, but the full coreutils plus find and awk is preferred)
  • The gettext library, if compiled with translation support

The following optional features also have specific requirements:

  • builtin commands that have the --help option or print usage messages require nroff or mandoc for display
  • automated completion generation from manual pages requires Python 3.5+
  • the fish_config web configuration tool requires Python 3.5+ and a web browser
  • system clipboard integration (with the default Ctrl-V and Ctrl-X bindings) require either the xsel, xclip, wl-copy/wl-paste or pbcopy/pbpaste utilities
  • full completions for yarn and npm require the all-the-package-names NPM module
  • colorls is used, if installed, to add color when running ls on platforms that do not have color support (such as OpenBSD)

Building

Dependencies

Compiling fish from a tarball requires:

  • a C++11 compiler (g++ 4.8 or later, or clang 3.3 or later)
  • CMake (version 3.5 or later)
  • PCRE2 (headers and libraries) - optional, this will be downloaded if missing
  • gettext (headers and libraries) - optional, for translation support

Sphinx is also optionally required to build the documentation from a cloned git repository.

Additionally, running the test suite requires Python 3.5+ and the pexpect package.

Dependencies, git master

Building from git master currently requires, in addition to the dependencies for a tarball:

  • Rust (version 1.67 or later)
  • CMake (version 3.19 or later)
  • libclang, even if you are compiling with GCC
  • an Internet connection

fish is in the process of being ported to Rust, replacing all C++ code, and as such these dependencies are a bit awkward and in flux.

In general, we would currently not recommend running from git master if you just want to use fish. Given the nature of the port, what is currently there is mostly a slower and buggier version of the last C++-based release.

Building from source (all platforms) - Makefile generator

To install into /usr/local, run:

mkdir build; cd build
cmake ..
make
sudo make install

The install directory can be changed using the -DCMAKE_INSTALL_PREFIX parameter for cmake.

Build options

In addition to the normal CMake build options (like CMAKE_INSTALL_PREFIX), fish has some other options available to customize it.

  • BUILD_DOCS=ON|OFF - whether to build the documentation. This is automatically set to OFF when Sphinx isn't installed.
  • INSTALL_DOCS=ON|OFF - whether to install the docs. This is automatically set to on when BUILD_DOCS is or prebuilt documentation is available (like when building in-tree from a tarball).
  • FISH_USE_SYSTEM_PCRE2=ON|OFF - whether to use an installed pcre2. This is normally autodetected.
  • MAC_CODESIGN_ID=String|OFF - the codesign ID to use on Mac, or "OFF" to disable codesigning.
  • WITH_GETTEXT=ON|OFF - whether to build with gettext support for translations.

Note that fish does not support static linking and will attempt to error out if it detects it.

Help, it didn’t build!

On Debian or Ubuntu you want these packages:

sudo apt install build-essential cmake libpcre2-dev gettext

On RedHat, CentOS, or Amazon EC2 everything should be preinstalled.

Contributing Changes to the Code

See the Guide for Developers.

Contact Us

Questions, comments, rants and raves can be posted to the official fish mailing list at https://lists.sourceforge.net/lists/listinfo/fish-users or join us on our matrix channel. Or use the fish tag on Unix & Linux Stackexchange. There is also a fish tag on Stackoverflow, but it is typically a poor fit.

Found a bug? Have an awesome idea? Please open an issue.

fish-shell's People

Contributors

ammgws avatar benabik avatar charego avatar cstyles avatar delapouite avatar drwilly avatar exploide avatar faho avatar floam avatar grissiom avatar henrikhorluck avatar jankanis avatar kamilaborowska avatar kidonng avatar krader1961 avatar krobelus avatar liljencrantz avatar lilyball avatar markgriffiths avatar maxfl avatar moverest avatar mqudsi avatar neheb avatar nextalone avatar ridiculousfish avatar siteshwar avatar sorairolake avatar xiaq avatar xiretza avatar zanchey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fish-shell's Issues

keyboard-interrupt issue

on OSX, and ubuntu 12.04, with the beta release, I ran:

$ while true
     echo hi
     sleep 2
  end

After a few iterations, I pressed ctrl+c to interrupt the loop, then pressed ctrl+c repeatedly, even holding it down

The child process was reliably terminated, but never the loop

Eventually, I had to kill the fish process from another terminal

In Bash on Linux:
`while true; do sleep 1; echo hi; done``
handles keyboard interrupts as expected

Smart auto suggestions with cd

cd command should auto suggest name of directory to be entered from arguments passed to it.
Right now cd command only shows completions from history.

fish_update_completions fails with man error message

fish_update_completions
man: unrecognized option '--path'
Try man --help' orman --usage' for more information.
No paths specified
man --version
man 2.5.7

This is on Ubuntu 10.04, 64 bits, with fishfish built from source.

Using which to detect command-not-found is suspect

In fish_config_interactive, we use 'which' to detect command-not-found.
The problem is, 'which' is not so portable, and in particular its exit status isn't always significant.
This could be changed to be 'command -v' to safer.
Also 'command' should support the -v flag.

A secondary problem is that the -s flag looks to be BSD specific.

ssh autocompletion of hosts not working

When typing "ssh " followed with a tab, it autocompletes to listing the current directory instead of available hosts in my ~/.ssh/known_hosts config.

when executing "__fish_print_hostnames" it does show hosts but they do not work in the autocompletion.

Keybindings busted

Axel reports:

"On my machine, most key bindings seem to be broken. ^K does not kill, ^W
does remove text, but it seems not to be added to the actual kill ring. No
searching with up-arrow and down-arrow. Left arrow and right arrow do not
move around in the CD history when used on an empty command line. The bind
builtin implies that the bindings are still there, and the code to handle
these these commands seem to still be there in input*.cpp, so I guess
something is broken? (built from a tarball on Ubuntu 12.04)"

Short-circuiting could be shorter-circuiter

Run this: false ; and sdlkfjsdklf
This shows an error: Unknown command 'sdlkfjsdklf'
The short-circuit could suppress this error message, and perhaps even discovering that the command does not exist.

Deadlock in complete_add

Call graph:
2903 Thread_2498 DispatchQueue_1: com.apple.main-thread (serial)
2903 start (in libdyld.dylib) + 1 [0x7fff8df5d7e1]
2903 main (in fish) + 1299 [0x104812eb3] fish.cpp:324
2903 reader_read(int, io_data_t_) (in fish) + 318 [0x1047e774e] reader.cpp:2570
2903 reader_readline() (in fish) + 1879 [0x1047e5287] reader.cpp:2840
2903 complete(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&, complete_type_t, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >) (in fish) + 1914 [0x1047bc7ca] complete.cpp:1880
2903 completer_t::complete_param(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, bool) (in fish) + 2271 [0x1047bb803] complete.cpp:1376
2903 completer_t::complete_from_args(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, int) (in fish) + 135 [0x1047b8547] complete.cpp:1139
2903 parser_t::eval_args(wchar_t const
, std::vector<completion_t, std::allocator<completion_t> >&) (in fish) + 393 [0x1047d9a2b] parser.cpp:802
2903 expand_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&, int) (in fish) + 674 [0x1047ccba2] expand.cpp:1451
2903 expand_cmdsubst(parser_t&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&) (in fish) + 444 [0x1047c8cec] expand.cpp:1178
2903 exec_subshell_internal(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >) (in fish) + 189 [0x1047c54ed] exec.cpp:1401
2903 parser_t::eval(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, io_data_t
, block_type_t) (in fish) + 496 [0x1047de67c] parser.cpp:2506
2903 parser_t::eval_job(tokenizer_) (in fish) + 1270 [0x1047de262] parser.cpp:2333
2903 exec(parser_t&, job_t_) (in fish) + 2480 [0x1047c7190] exec.cpp:830
2903 internal_exec_helper(parser_t&, wchar_t const_, block_type_t, io_data_t_) (in fish) + 142 [0x1047c5dae]
2903 parser_t::eval(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, io_data_t_, block_type_t) (in fish) + 496 [0x1047de67c] parser.cpp:2506
2903 parser_t::eval_job(tokenizer_) (in fish) + 1270 [0x1047de262] parser.cpp:2333
2903 exec(parser_t&, job_t_) (in fish) + 2480 [0x1047c7190] exec.cpp:830
2903 internal_exec_helper(parser_t&, wchar_t const_, block_type_t, io_data_t_) (in fish) + 142 [0x1047c5dae]
2903 parser_t::eval(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, io_data_t_, block_type_t) (in fish) + 496 [0x1047de67c] parser.cpp:2506
2903 parser_t::eval_job(tokenizer_) (in fish) + 738 [0x1047de04e] parser.cpp:2300
2903 parser_t::parse_job(process_t_, job_t_, tokenizer_) (in fish) + 4727 [0x1047dcdbb] parser.cpp:2159
2903 parser_t::parse_job_argument_list(process_t_, job_t_, tokenizer_, std::vector<completion_t, std::allocator<completion_t> >&) (in fish) + 1200 [0x1047dd5bc] parser.cpp:1398
2903 expand_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&, int) (in fish) + 674 [0x1047ccba2] expand.cpp:1451
2903 expand_cmdsubst(parser_t&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&) (in fish) + 444 [0x1047c8cec] expand.cpp:1178
2903 exec_subshell_internal(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >) (in fish) + 189 [0x1047c54ed] exec.cpp:1401
2903 parser_t::eval(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, io_data_t
, block_type_t) (in fish) + 496 [0x1047de67c] parser.cpp:2506
2903 parser_t::eval_job(tokenizer_) (in fish) + 1235 [0x1047de23f] parser.cpp:2333
2903 exec(parser_t&, job_t_) (in fish) + 3194 [0x1047c745a] exec.cpp:981
2903 builtin_run(parser_t&, wchar_t const* const_, io_data_t_) (in fish) + 542 [0x1047b4f7e] builtin.cpp:3708
2903 builtin_complete(parser_t&, wchar_t**) (in fish) + 2024 [0x1047ac9e8] builtin_complete.cpp:548
2903 complete(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<completion_t, std::allocator<completion_t> >&, complete_type_t, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >) (in fish) + 1914 [0x1047bc7ca] complete.cpp:1880
2903 completer_t::complete_param(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, bool) (in fish) + 248 [0x1047bb01c] complete.cpp:1237
2903 autoload_t::load(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, bool) (in fish) + 462 [0x10480d112] autoload.cpp:107
2903 autoload_t::locate_file_and_maybe_load_it(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, bool, bool, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (in fish) + 1709 [0x10480cccf] autoload.cpp:327
2903 exec_subshell_internal(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >
) (in fish) + 189 [0x1047c54ed] exec.cpp:1401
2903 parser_t::eval(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, io_data_t_, block_type_t) (in fish) + 496 [0x1047de67c] parser.cpp:2506
2903 parser_t::eval_job(tokenizer_) (in fish) + 1235 [0x1047de23f] parser.cpp:2333
2903 exec(parser_t&, job_t_) (in fish) + 3194 [0x1047c745a] exec.cpp:981
2903 builtin_run(parser_t&, wchar_t const_ const_, io_data_t_) (in fish) + 542 [0x1047b4f7e] builtin.cpp:3708
2903 builtin_complete(parser_t&, wchar_t**) (in fish) + 2726 [0x1047acca6] builtin_complete.cpp:129
2903 builtin_complete_add2(wchar_t const_, int, wchar_t const_, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, int, wchar_t const_, wchar_t const_, wchar_t const_, int) (in fish) + 122 [0x1047b46da]
2903 complete_add(wchar_t const_, bool, wchar_t, wchar_t const_, int, int, wchar_t const_, wchar_t const_, wchar_t const_, int) (in fish) + 113 [0x1047ba891] complete.cpp:436
2903 scoped_lock::lock() (in fish) + 72 [0x1048033f4] common.cpp:1988
2903 pthread_mutex_lock (in libsystem_c.dylib) + 536 [0x7fff94bfe9c9]
2903 __psynch_mutexwait (in libsystem_kernel.dylib) + 10 [0x7fff90bb2136]

`echo $?` prints bad character in error message

If I try to run echo $?, I get the error message

fish: The '$' character begins a variable name. The character '@', which
directly followed a '$', is not allowed as a part of a variable name, and
variable names may not be zero characters long. To learn more about variable
expansion in fish, type 'help expand-variable'.

Same thing if I use $*. That garbage character is U+F400 for ? and U+F401 for *. Other characters I've tried, including ,./@!, print a correct error message.

Consider integrate with cdargs

This issue tracks considering integrating with cdargs.

Pierre Baillet writes:

"Hello,

Fish looks nice and sweet. I hope it will succeed in changing the shell landscape for ever :).

I've just written a function file for cdargs the directory alias manager, aliases for cv and ca and supports completion for the cv command.

Available here:

https://gist.github.com/2881699

Cheers,
"

Here is the code:

function ca
command cdargs --add=":$argv:$PWD"
end
function cv
cdargs "$argv"; and cd (cat "$HOME/.cdargsresult")
end

function _cdargs_completion
cat ~/.cdargs | cut -d' ' -f1 | xargs echo
end

setting foreground and background color in the same time with output.cpp::set_color()

I've found a strange place in file output.cpp line 276:

if( ! c2.is_normal() &&
! c2.is_ignore())
{
/*
Background is set
*/
bg_set=1;
c = (c2==rgb_color_t::white())?rgb_color_t::black():rgb_color_t::white();
}

It means that it resets the foreground if background is set. Is there any particular reason of doing it? Or it's just a sort of typo?

Need a history built-in

fish needs a history built-in, for things like deleting unwanted history items. bash and zsh both have this.

fish_user_keybindings

I think it worth supporting fish_user_keybindings function, which should be loaded right after fish_default_keybindings to support user key bindings.

Make completions not block

From http://comments.gmane.org/gmane.comp.shells.fish.user/3081:

"Consider this foo.fish file:

complete --command foo --no-files --short-option a --long-option 'an_example' --description 'example A'
complete --command foo --no-files --arguments '(sleep 5s)' --description 'slept'

Type in the shell

foo -

and press tab. 5 seconds pass, before we get the result. If I delete the second line from foo.fish, the result is instantanious. AFAIK, the --arguments should not be executed when fish is completing options for a command."

It would be nice if completions were not blocking. Perhaps they could be executed in a cancelable subshell.

\uF400, \UF401, etc are treated as wildcard characters

If I try to run echo \uF400 this is treated identically to echo ?. Similarly \uF401 is treated as *. \uF402 is treated as some other character but I have no idea what; trying echo \uF402 hangs until I type ^C, at which point it says fish: Could not expand string '\uF402'.

Tabcompletion of cd in / makes you go home

This behaviour have been in fish too, and annoyed me from time to time, but not very often.

$ cd /
$ cd e<tab>
// plenty of errors (fish didn't get this output)

# This will appear, but "etc/" will be red as in "directory does not exist":
$ cd etc/

# If you run pwd instead of the cd you got, you will notice that you're in your home directory
$ pwd
/home/etu

I can also note that this only affect cd as far as I noticed.

Consider reinstating implicit cd in some form

This bug tracks reinstating implicit cd in some form. Implicit cd is where you can switch to a directory by just typing its path, without explicitly typing cd. It's as if you execute the directory.

In decreasing order of implicitness:

  1. Restore it to its state in fish trunk: implicit cd is active and respects CDPATH
  2. Implicit cd only works for the current directory. CDPATH would still be respected, but only when using cd explicitly.
  3. Implicit cd only works for paths starting with a dot, slash, or tilde
  4. Implicit cd only works for '..' (and perhaps ../.., etc.)
  5. No implicit cd.

There's also potential to make this configurable in some way.

Feel free to pile on with your desires / perspectives.

funced does not seem to make the function available

This works:

$ function etu
    echo "mooooo"
end
$ etu
mooooo
$

This does not work:

$ funced etu
etu> function etu
    echo "mooooo"
end
$ etu
fish: Unknown command "etu"
$

The function was never made available when using funced.

This also makes that you can't use funcsave for some function edited with funced -- because the functions doesn't exist.

Lion's 'open' man page misparsed

open -
--a\ (Specifies the application to use for opening ... [See Man Page])
--args (All remaining arguments are passed to the ope... [See Man Page])
--b\ (Specifies the bundle identifier for the appli... [See Man Page])
-F (Opens the application "fresh," that is, witho... [See Man Page])
-R (Reveals the file(s) in the Finder instead of ... [See Man Page])

fish_update_completions syntax error

OS: Arch Linux 64bit

python --version
Python 3.2.3

Running fish_update_completions leads to a syntax error

fish_update_completions
File "/usr/local/share/fish/tools/create_manpage_completions.py", line 633
except IOError as (err, strerror):
^
SyntaxError: invalid syntax

Internalized scripts is far too aggressive

The internalize scripts build phase internalizes far too much, including fish_prompt. We should measure to see what benefit, if any, is being derived from it, and restrict it to only those functions that really ought not to be changed (if any).

wgetopt() in wgetopt.cpp crashes

Method wgetopt() in wgetopt.cpp fails with segment violation. Here is a small snippet of code which may help in reproducing bug :

....
static const wchar_t short_options[] = L"cdanrwps";

int opt = 0;

while((opt = wgetopt( argc, argv, short_options )) != -1)
{

....

iTerm2 does not set fish_title correctly for tabs

fish_title applies correctly to the window title, but not the tab title. This is due to this code in reader.cpp:

writestr( L"\x1b]2;" );

2: Window title
1: Tab title
0: Both window and tab title

I think removing the 2 is equivalent to setting it to 0, so that's probably what we ought to do.

The web config page ought to integrate with a remote component

Imagine a server that stores color configurations.

  • Users could vote on popular ones (think Adobe Kuler)
  • Users could upload their own preferred scheme, and so have access to it on all their machines

This would be integrated into the web config page.

Don't autosuggest invalid commands

If you type a command that's not valid at all, maybe we can avoid autosuggesting it. This could be handled by a "special" handler in highlight.cpp

scp remote path completion

pants writes:

There doesn't seem to be one of these available in the archives, and
it's the thing I've missed most since moving from zsh, so I figured I'd
really get fishy and write it. Appending the following to your scp.fish
(or making an alternate scp.fish in .config/fish/completions) will allow
you to preform tab completion of remote paths for scp! Identical
completions could also provide identical functionality in rsync. It
would be nice to integrate fish's built-in description methods, but I
can't think of a way to do that without ensuring fish is installed on
the remote system (not a general fix) or mounting an sshfs (gross).

Code:
complete -c scp -d "Remote Path" -n "echo (commandline -ct)|sgrep -o '.*:';and true" -a "

(
#Prepend any user@host information supplied before the remote completion
echo (commandline -ct)|sgrep -o '.:'
)(
#Get the list of remote files from the specified ssh server
ssh -o "BatchMode yes" (echo (commandline -ct)|sed -ne 's/(.
):./\1/p') ls\ -d\ (echo (commandline -ct)|sed -ne 's/.://p')*
)

"

Enjoy!

Cheers,

pants.

Systemfunctions in ~/.config/fish/functions/ (example: fish_prompt)

I have my own custom defined ~/.config/fish/functions/fish_prompt.fish together with plenty of other functions. But my fish does not seem to care about the config in my homedirectory.

If I do funced fish_prompt I get the defaultprompt to edit, and since the bug #16, I can't use funcsave to save the edited prompt.

But it still does not matter if I take nano(or any editor) to edit the functionfile if theres a function existing on system-level in fish.

Build (on Ubuntu 12.04 x64_86) fails due to xsel

make[2]: Entering directory `/home/pas/build/fishfish/xsel-1.2.0'
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -fno-strict-aliasing -Wall -Werror -g -std=gnu99 -Wdeclaration-after-statement -Wno-unused -MT xsel.o -MD -MP -MF ".deps/xsel.Tpo" -c -o xsel.o xsel.c; \
    then mv -f ".deps/xsel.Tpo" ".deps/xsel.Po"; else rm -f ".deps/xsel.Tpo"; exit 1; fi
xsel.c:32:28: fatal error: X11/StringDefs.h: No such file or directory
compilation terminated.
make[2]: *** [xsel.o] Error 1
make[2]: Leaving directory `/home/pas/build/fishfish/xsel-1.2.0'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/pas/build/fishfish/xsel-1.2.0'

Process Expansion (%) Warning on OS X Lion

Running OS X Lion 10.7.4, process expansions leads to the following warning message:

Warning: principal_parser called off of main thread. Break on debug_thread_error to debug.

This message will show up again with each additional keystroke until the the % character is deleted.

This is being run in the native Terminal.app with no special plugins or SIMBL tweaks or anything like that, and I have reproduced this bug on both a 2011 iMac and a 2011 MacBook Pro, both running 10.7.4

Idea: support ⌘→ and ⌘←

I just found out fishfish supports ⌥→ and ⌥← for jumping a word at a time (which is totally awesome!), would it make sense to support ⌘→ and ⌘← to jump to the beginning and end of the current line? I know you can use ^a and ^e but I use ⌘→ and ⌘← all the time and it feels a lot better to me.

make fails on DragonFly BSD

On DragonFly BSD, gnu make is 'gmake'. That's not the bug; I'm explaining why I typed what I did.

This error may apply to other non-OS X BSD systems too.

./internalize_scripts.py
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o function.o function.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o builtin.o builtin.cpp
In file included from builtin.cpp:385:
builtin_set.cpp: In function 'void erase_values(wcstring_list_t&, const std::vector<long int, std::allocator<long int> >&)':
builtin_set.cpp:288: warning: comparison between signed and unsigned integer expressions
builtin.cpp: In function 'int builtin_contains(parser_t&, wchar_t**)':
builtin.cpp:2736: warning: comparison between signed and unsigned integer expressions
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o complete.o complete.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o env.o env.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o exec.o exec.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o expand.o expand.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o highlight.o highlight.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o history.o history.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o kill.o kill.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o parser.o parser.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o proc.o proc.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o reader.o reader.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o sanity.o sanity.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o tokenizer.o tokenizer.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o wildcard.o wildcard.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o wgetopt.o wgetopt.cpp
wgetopt.cpp:184:1: warning: "_" redefined
In file included from wutil.h:18,
                 from wgetopt.cpp:94:
common.h:171:1: warning: this is the location of the previous definition
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o wutil.o wutil.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o input.o input.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o output.o output.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o intern.o intern.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o env_universal.o env_universal.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o env_universal_common.o env_universal_common.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o input_common.o input_common.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o event.o event.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o signal.o signal.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o io.o io.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o parse_util.o parse_util.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o common.o common.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o screen.o screen.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o path.o path.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o autoload.o autoload.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o parser_keywords.o parser_keywords.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o iothread.o iothread.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o builtin_scripts.o builtin_scripts.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o color.o color.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o postfork.o postfork.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o builtin_test.o builtin_test.cpp
g++ -I/usr/pkg/include/ -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-optimize-sibling-calls -Wall -DLOCALEDIR=\"/usr/local/share/locale\" -DPREFIX=L\"/usr/local\" -DDATADIR=L\"/usr/local/share\" -DSYSCONFDIR=L\"/usr/local/etc\"    -c -o fish.o fish.cpp
g++ function.o builtin.o complete.o env.o exec.o expand.o highlight.o history.o kill.o parser.o proc.o reader.o sanity.o tokenizer.o wildcard.o wgetopt.o wutil.o input.o output.o intern.o env_universal.o env_universal_common.o input_common.o event.o signal.o io.o parse_util.o common.o screen.o path.o autoload.o parser_keywords.o iothread.o builtin_scripts.o color.o postfork.o builtin_test.o fish.o -L/usr/pkg/lib/ -R/usr/pkg/lib/ -lintl -lm -lncurses -lpthread   -rdynamic -o fish
builtin.o: In function`builtin_source(parser_t&, wchar_t*_)':
builtin.cpp:(.text+0x9de4): undefined reference to `wrealpath(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, wchar_t_)'
fish.o: In function `main':
fish.cpp:(.text+0x972): undefined reference to`wrealpath(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, wchar_t_)'
gmake: *_\* [fish] Error 1

Command success or failure ought to feed back into history autosuggestions

If you mistype a command, we'll happily suggest it again, even if the command failed to run. We ought to feed command success or failure back into history so it won't autosuggest that. But we need a way to distinguish between commands that could not run and commands that ran successfully, yet indicated failure to communicate some other information (such as grep's "not found").

aliases busted with =

alias foo="cd ~/"
batman@batman ~/D/S/rails> alias foo="cd ~/"
fish: Could not expand string '$tmp[2]'
/usr/local/share/fish/functions/alias.fish (line 19): set body $tmp[2]

The sed expression looks busted.

Segfault on ~

Whenever the ~ character is typed:

niemeyer@gopher ~> fish
niemeyer@gopher ~> ~fish: Job 1, 'fish' terminated by signal SIGSEGV (Address boundary error)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.