     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82

    // The following was taken and adapated from exa source
    // repo: https://github.com/ogham/exa
    // commit: b9eb364823d0d4f9085eb220233c704a13d0f611
    // license: MIT - Copyright (c) 2014 Benjamin Sago

    //! System calls for getting the terminal size.
    //!
    //! Getting the terminal size is performed using an ioctl command that takes
    //! the file handle to the terminal -- which in this case, is stdout -- and
    //! populates a structure containing the values.
    //!
    //! The size is needed when the user wants the output formatted into columns:
    //! the default grid view, or the hybrid grid-details view.

    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
    use std::mem::zeroed;
    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
    use libc::{c_int, c_ushort, c_ulong, STDOUT_FILENO};

    /// The number of rows and columns of a terminal.
    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
    struct Winsize {
        ws_row: c_ushort,
        ws_col: c_ushort,
    }

    // Unfortunately the actual command is not standardised...

    #[cfg(any(target_os = "linux", target_os = "android"))]
    #[cfg(feature = "wrap_help")]
    static TIOCGWINSZ: c_ulong = 0x5413;

    #[cfg(any(target_os = "macos",
              target_os = "ios",
              target_os = "bitrig",
              target_os = "dragonfly",
              target_os = "freebsd",
              target_os = "netbsd",
              target_os = "openbsd"))]
    #[cfg(feature = "wrap_help")]
    static TIOCGWINSZ: c_ulong = 0x40087468;

    extern {
    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
        pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
    }

    /// Runs the ioctl command. Returns (0, 0) if output is not to a terminal, or
    /// there is an error. (0, 0) is an invalid size to have anyway, which is why
    /// it can be used as a nil value.
    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
    unsafe fn get_dimensions() -> Winsize {
        let mut window: Winsize = zeroed();
        let result = ioctl(STDOUT_FILENO, TIOCGWINSZ, &mut window);

        if result == -1 {
            zeroed()
        }
        else {
            window
        }
    }

    /// Query the current processes's output, returning its width and height as a
    /// number of characters. Returns `None` if the output isn't to a terminal.
    #[cfg(all(feature = "wrap_help", not(target_os = "windows")))]
    pub fn dimensions() -> Option<(usize, usize)> {
        let w = unsafe { get_dimensions() };

        if w.ws_col == 0 || w.ws_row == 0 {
            None
        }
        else {
            Some((w.ws_col as usize, w.ws_row as usize))
        }
    }

    #[cfg(any(not(feature = "wrap_help"), target_os = "windows"))]
    pub fn dimensions() -> Option<(usize, usize)> {
        None
    }

# Help

## Keyboard Shortcuts

?
  Show this help dialog
S
  Focus the search field
⇤
  Move up in search results
⇥
  Move down in search results
⏎
  Go to active search result

## Search Tricks

Prefix searches with a type followed by a colon (e.g. `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g. `vec -> usize` or `* -> vec`)