#+title: Neofetch configuration (WIP)
#+setupfile: headers
#+OPTIONS: auto-id:t
#+HTML_HEAD_EXTRA: <meta name="description" content="Phundrak's Neofetch config" />
#+HTML_HEAD_EXTRA: <meta property="og:title" content="Phundrak's Neofetch config" />
#+HTML_HEAD_EXTRA: <meta property="og:description" content="Description of the Neofetch config file of Phundrak" />
#+PROPERTY: header-args :noweb yes :exports code :tangle no :exports none
#+PROPERTY: header-args:sh :tangle ~/.config/neofetch/config.conf :exports code :noweb yes :padline no :mkdir yes :shebang "#!/usr/bin/env sh"

* Introduction
  :PROPERTIES:
  :CUSTOM_ID: Introduction-5942aea3
  :END:
  [[https://github.com/dylanaraps/neofetch][Neofetch]] is a  CLI utility used to display system  information. It was written
  in Bash, and thus its configuration file is written as a Bash script too. This
  document was written with org-mode, and  my configuration file is tangled from
  the  source blocks  you  will see  below to  ~~/.config/neofetch/config.conf~.
  This configuration will only contain what I need. For any further information,
  please refer to the [[https://github.com/dylanaraps/neofetch][original repository]] and [[https://github.com/dylanaraps/neofetch/wiki/Customizing-Info][its documentation]].

* The ~print_info~ functions
  :PROPERTIES:
  :CUSTOM_ID: The_print_info_functions-bb30763f
  :END:
  The ~print_info~ function is the function called by Neofetch in order to print
  the system information it could fetch.  In this function, we’ll choose what to
  display, and how. This function looks like this:
  #+BEGIN_SRC sh :tangle no
    print_info() {
        # Print information here…
    }
  #+END_SRC

  Generally, what  we will display  will be  shown through the  ~info~ function,
  redefined  inside  Neofetch (this  is  not  ~info(1)~). This  ~info~  function
  accepts one or  two arguments. With one argument, such  as with ~info memory~,
  we can  get a result  that looks  like ~5136MiB / 15873MiB~, while  calling it
  with two arguments will treat the first one  as a prefix and the second one as
  the   interesting   information;   ~info "Memory" memory~   will   look   like
  ~Memory: 5136MiB / 15873MiB~. Here is what we want to display:
  #+NAME: info-elements-table
  | Prefix   | Information | What it does                      |
  |----------+-------------+-----------------------------------|
  |          | title       | Username and hostname             |
  |          | line_break  | Insert a blank line               |
  |          | cols        | System theme                      |
  |          | line_break  | Insert a blank line               |
  | OS       | distro      | Distribution name                 |
  | Kernel   | kernel      | Kernel version                    |
  | Uptime   | uptime      | Machine uptime                    |
  | Packages | packages    | Number of installed packages      |
  | Shell    | shell       | User’s default shell              |
  | WM       | wm          | User’s Window Manager             |
  | Terminal | term        | Default terminal                  |
  | CPU      | cpu         | CPU information                   |
  | GPU      | gpu         | GPU information                   |
  | Memory   | memory      | RAM information                   |

  #+NAME: info-elements-gen
  #+BEGIN_SRC emacs-lisp :var table=info-elements-table :cache yes
    (mapconcat (lambda (x)
                 (format "info %s%s"
                         (if (not (string= (car x) ""))
                             (format "\"%s\" " (car x))
                           "")
                         (cadr x)))
               table
               "\n")
  #+END_SRC

  #+RESULTS[1e66bf48472ad24006f0cb9dc9c86078764ba84e]: info-elements-gen
  #+begin_example
  info line_break
  info title
  info line_break
  info cols
  info line_break
  info "OS" distro
  info "Kernel" kernel
  info "Uptime" uptime
  info "Packages" packages
  info "Shell" shell
  info "WM" wm
  info "Terminal" term
  info "CPU" cpu
  info "GPU" gpu
  info "Memory" memory
  info "Disks" disks
  #+end_example

  Hence, the function looks like so:
  #+BEGIN_SRC sh
    print_info() {
        <<info-elements-gen()>>
    }
  #+END_SRC

  Each of these modules can be tuned with the variables presented below.

* Information settings
  :PROPERTIES:
  :CUSTOM_ID: Information_settings-9d4cfe88
  :END:
  Each  of  the following  variable  tunes  a function  that  can  be called  in
  ~print_info~ described  above. It is possible  to tune them by  modifying this
  document or the  configuration file itself, and they can  be overridden by the
  command line with flags passed to ~neofetch~. I will divide these variables in
  two main categories: hardware and software-related properties.

** Software
   :PROPERTIES:
   :CUSTOM_ID: Information_settings-Software-59f4cb0f
   :END:
*** OS
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Software-OS-67908fc4
    :END:
**** Distro
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-OS-Distro-cd12bc4f
     :END:
     This variable can shorten the output of the ~distro~ function.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--distro_shorthand~
     - Supports :: Everything except Windows and Haiku
     - Examples ::
       - on :: ~Arch Linux~
       - off :: ~Arch~
     #+begin_src sh
       distro_shorthand="off"
     #+end_src

     It is possible to display when the distro has been installed on the computer.

**** Kernel
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-OS-Kernel-658cedce
     :END:
     The variable below can shorten the output ofh the ~kernel~ function.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--kernel_shorthand~
     - Supports :: Everything except *BSDs (except PacBSD and PC-BSD)
     - Examples ::
       - on :: ~4.8.9-1-ARCH~
       - off :: ~Linux 4.8.9-1-ARCH~
     #+begin_src sh
       kernel_shorthand="off"
     #+end_src

**** OS Architecture
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-OS-OS_Architecture-2f60c93c
     :END:
     This variable can show or hide the OS architecture in the ~distro~ output.
     - Default value :: ~"off"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--os_arch~
     - Examples ::
       - on :: ~Arch Linux x86_64~
       - off :: ~Arch Linux~
     #+begin_src sh
       os_arch="off"
     #+end_src

**** Packages
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-OS-Packages-f836a58d
     :END:
     It is possible to show or hide Package Manager names.

     - Default :: ~'tiny'~
     - Values :: ~'on'~ / ~'tiny'~ / ~'off'~
     - Flag :: ~--package_managers~
     - Example ::
       - on :: ~'998 (pacman), 8 (flatpak), 4 (snap)'~
       - tiny :: ~'908 (pacman, flatpak, snap)'~
       - off :: ~'908'~
     #+BEGIN_SRC sh
       package_managers="on"
     #+END_SRC

**** Shell
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-Shell-76439406
     :END:
***** Shell path
      :PROPERTIES:
      :CUSTOM_ID: Information_settings-Software-Shell-Shell_path-9eda636d
      :END:
      This allows  to show  either the path  of the user’s  shell, or  simply its
      name.
      - Default value :: ~"off"~
      - Values ::
       - ~"on"~
       - ~"off"~
      - Flag :: ~--shell_path~
      - Examples ::
        - on :: ~/bin/bash~
        - off :: ~bash~
     #+begin_src sh
       shell_path="off"
     #+end_src

***** Shell version
      :PROPERTIES:
      :CUSTOM_ID: Information_settings-Software-Shell-Shell_version-03964bb3
      :END:
      This allows to show the shell’s version in the output of ~shell~.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--shell_version~
     - Examples ::
       - on :: ~bash 4.4.5~
       - off :: ~bash~
     #+begin_src sh
       shell_version="off"
     #+end_src

*** Uptime
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Software-Uptime-a7b5361a
    :END:
    This variable can shorten the output of the ~uptime~ function. ~on~ shortens
    it a bit, while ~tiny~ shortens it greatly.
    - Default value :: ~"on"~
    - Values ::
      - ~"on"~
      - ~"tiny"~
      - ~"off"~
    - Flag :: ~--uptime_shorthand~
    - Examples ::
      - on :: ~2 days, 10 hours, 3 mins~
      - off :: ~2 days, 10 hours, 3 minutes~
      - tiny :: ~2d 10h 3m~
    #+begin_src sh
      uptime_shorthand="on"
    #+end_src

*** IP address
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Software-IP_address-26df5e1d
    :END:
    It is possible to display the  machine’s public IP address with the function
    ~ip~. The value  below allows the user  to change the website  used to fetch
    it.
    - Default value :: ~"http://ident.me"~
    - Value :: ~"url"~
    - Flag :: ~--ip_host~
    #+begin_src sh
      public_ip_host="http://ident.me"
    #+end_src

    - Default value :: ~""~
    - Values ::
      - ~""~
      - ~""~
    - Flag :: ~""~
    - Supports ::
    - Examples ::
      - on :: ~~
      - off :: ~~
    #+begin_src sh
    #+end_src

*** Theming
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Software-Theming-ba7f1ccd
    :END:
    This section  will allow  the user  to modify what  Neofetch can  and cannot
    display about  the machine’s  theming —by  this, I mean  its GTK  theme, its
    icons and its default font.

**** Shorten output
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-Theming-Shorten_output-cbef1fa4
     :END:
     With this  value, it is  possible to shorten  the output of  the computer’s
     theming.
     - Default value :: ~"off"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--gtk_shorthand~
     - Examples ::
       - on :: ~Numix, Adwaita~
       - off :: ~Numix [GTK2], Adwaita [GTK3]~
     #+begin_src sh
       gtk_shorthand="on"
     #+end_src

**** Enable or disable theming display for GTK2
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-Theming-Enable_or_disable_theming_display_for_GTK2-f4398571
     :END:
     It is possible to explicitely show or hide the computer’s theming with GTK2
     with this variable.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--gtk2~
     - Examples ::
       - on ::  ~Numix [GTK2], Adwaita [GTK3]~
       - off :: ~Adwaita [GTK3]~
     #+begin_src sh
       gtk2="off"
     #+end_src

**** Enable or disable theming display for GTK3
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Software-Theming-Enable_or_disable_theming_display_for_GTK3-c4070e66
     :END:
     The same variable as above is also available for GTK3.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--gtk3~
     - Examples ::
       - on ::  ~Numix [GTK2], Adwaita [GTK3]~
       - off :: ~Numix [GTK2]~
     #+begin_src sh
     #+end_src

** Hardware
   :PROPERTIES:
   :CUSTOM_ID: Information_settings-Hardware-de7ed990
   :END:
*** CPU
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Hardware-CPU-eb0bcd7d
    :END:

**** CPU brand
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_brand-5b25776b
     :END:
     With this variables, it  is possible to show or hide the brand  of a CPU in
     the ~cpu~ output.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--cpu_brand~
     - Examples ::
       - on :: ~Intel i7-6500U~
       - off :: ~i7-6500U~
     #+begin_src sh
       cpu_brand="off"
     #+end_src

**** CPU speed
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_speed-2bf6e5f7
     :END:
     With this variable, it is possible to show or hide the speed of the CPU.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--cpu_speed~
     - Examples ::
       - on :: ~Intel i7-6500U (4) @ 3.1GHz~
       - off :: ~Intel i7-6500U (4)~
     #+begin_src sh
       cpu_speed="off"
     #+end_src

**** CPU speed type
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_speed_type-a24de48f
     :END:
     This allows Neofetch to  know what type of speed it  has to fetch regarding
     the machine’s  CPU. Any file in  ~/sys/devices/system/cpu/cpu0/cpufreq~ can
     be used as a value.
    - Default value :: ~"bios_limit"~
    - Values ::
      - ~"scaling_cur_freq"~
      - ~"scaling_min_freq"~
      - ~"scaling_max_freq"~
      - ~"bios_limit"~
    - Flag :: ~--speed_type~
    - Supports :: Linux with ~cpufreq~
    #+begin_src sh
      speed_type="bios_limit"
    #+end_src

**** CPU speed shorthand
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_speed_shorthand-0d15fe08
     :END:
     This value allows  to show sorter CPU  speed with less digits.  This flag is
     not supported in systems with CPU speed below 1GHz.
     - Default value :: ~"off"~
     - Values ::
       - ~"on"~
       - ~"on"~
     - Flag :: ~--speed_shorthand~
     - Examples ::
       - on :: ~i7-6500U (4) @ 3.1GHz~
       - off :: ~i7-6500U (4) @ 3.100GHz~
     #+begin_src sh
       speed_shorthand="on"
     #+end_src

**** CPU cores
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_cores-30177354
     :END:
     With this variable, it is possible to  display the number of cores that are
     available in the CPU.
     - Default value :: ~"logical"~
     - Values ::
       - ~"logical"~
       - ~"physical"~
       - ~"off"~
     - Flag :: ~--cpu_cores~
     - Supports :: ~physical~ does not work on BSD.
     - Examples ::
       - logical :: ~Intel i7-6500U (4) @ 3.1GHz~ (All virtual cores)
       - physical :: ~Intel i7-6500U (2) @ 3.1GHz~ (All physical cores)
       - off :: ~Intel i7-6500U @ 3.1GHz~
     #+begin_src sh
       cpu_cores="off"
     #+end_src

**** CPU temperature
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-CPU-CPU_temperature-a22e522c
     :END:
     This variable allows the user to hide or show the CPU’s temperature, and if
     shown, the user can display it in Celcius or Farenheit degrees. For FreeBSD
     and  NetBSD-based systems,  you’ll  need to  enable  the ~coretemp~  kernel
     module. This only supports newer Intel processors.
     - Default value :: ~"off"~
     - Values ::
       - ~"C"~
       - ~"F"~
       - ~"off"~
     - Flag :: ~--cpu_temp~
     - Supports :: Linux, BSD
     - Examples ::
       - C :: ~Intel i7-6500U (4) @ 3.1GHz [27.2°C]~
       - F :: ~Intel i7-6500U (4) @ 3.1GHz [82.0°F]~
       - off :: ~Intel i7-6500U (4) @ 3.1GHz~
     #+begin_src sh
       cpu_temp="off"
     #+end_src

*** GPU
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Hardware-GPU-2c842575
    :END:
    The function  responsible for displaying  information regarding the  GPUs is
    ~gpu~. It  will try  to list all  available GPUs and  display what  it knows
    about them.

**** GPU brand
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-GPU-GPU_brand-6e2da615
     :END:
     This value allows  the user to hide or  show the brand of their  GPU in the
     output of ~gpu~.
     - Default value :: ~"on"~
     - Values ::
       - ~"on"~
       - ~"off"~
     - Flag :: ~--gpu_brand~
     - Supports ::
     - Examples ::
       - on :: ~AMD HD 7950~
       - off :: ~HD 7950~
     #+begin_src sh
       gpu_brand="off"
     #+end_src

**** Which GPU to display
     :PROPERTIES:
     :CUSTOM_ID: Information_settings-Hardware-GPU-Which_GPU_to_display-f40d3aac
     :END:
     This allows  the user  to choose  which GPU  appears in  the output  of the
     function ~gpu~.
     - Default value :: ~"all"~
     - Values ::
       - ~"all"~
       - ~"dedicated"~
       - ~"integrated"~
     - Flag :: ~--gpu_type~
     - Supports :: Linux
     - Examples ::
       - all ::
         #+BEGIN_SRC text
           GPU1: AMD HD 7950
           GPU2: Intel Integrated Graphics
        #+END_SRC
       - dedicated :: ~GPU1: AMD HD 7950~
       - integrated :: ~GPU1: Intel Integrated Graphics~
     #+begin_src sh
       gpu_type="all"
     #+end_src

*** Resolution
    :PROPERTIES:
    :CUSTOM_ID: Information_settings-Hardware-Resolution-b768f865
    :END:
    This will try to list all the connected screens and display their resolution
    individually. It is possible to display the refresh rate or to hide it.
    - Default value :: ~"off"~
    - Values ::
      - ~"on"~
      - ~"off"~
    - Flag :: ~--refresh_rate~
    - Supports :: Does not work on Windows
    - Examples ::
      - on :: ~1920x1080 @ 60Hz~
      - off :: ~1920x1080~
    #+begin_src sh
      refresh_rate="off"
    #+end_src
